@hirosystems/chainhook-client
Version:
Chainhook TypeScript client
308 lines (307 loc) • 20.8 kB
TypeScript
import { Payload } from './schemas/payload';
import { Static } from '@fastify/type-provider-typebox';
declare const EventObserverOptionsSchema: import("@sinclair/typebox").TObject<{
/** Event observer host name (usually '0.0.0.0') */
hostname: import("@sinclair/typebox").TString;
/** Event observer port */
port: import("@sinclair/typebox").TInteger;
/** Authorization token for all Chainhook payloads */
auth_token: import("@sinclair/typebox").TString;
/** Base URL that will be used by Chainhook to send all payloads to this event observer */
external_base_url: import("@sinclair/typebox").TString;
/** Wait for the chainhook node to be available before submitting predicates */
wait_for_chainhook_node: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
/** Validate the JSON schema of received chainhook payloads and report errors when invalid */
validate_chainhook_payloads: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
/** Validate the authorization token sent by the server is correct. */
validate_token_authorization: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
/** Size limit for received chainhook payloads (default 40MB) */
body_limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
/** Node type: `chainhook` or `ordhook` */
node_type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"chainhook">, import("@sinclair/typebox").TLiteral<"ordhook">]>>;
/**
* Directory where registered predicates will be persisted to disk so they can be recalled on
* restarts.
*/
predicate_disk_file_path: import("@sinclair/typebox").TString;
/**
* How often we should check with the Chainhook server to make sure our predicates are active and
* up to date. If they become obsolete, we will attempt to re-register them.
*/
predicate_health_check_interval_ms: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
}>;
/** Chainhook event observer configuration options */
export type EventObserverOptions = Static<typeof EventObserverOptionsSchema>;
declare const ChainhookNodeOptionsSchema: import("@sinclair/typebox").TObject<{
/** Base URL where the Chainhook node is located */
base_url: import("@sinclair/typebox").TString;
}>;
/** Chainhook node connection options */
export type ChainhookNodeOptions = Static<typeof ChainhookNodeOptionsSchema>;
/**
* Callback that will receive every single payload sent by Chainhook as a result of any predicates
* that have been registered.
*/
export type OnPredicatePayloadCallback = (payload: Payload) => Promise<void>;
export declare const EventObserverPredicateSchema: import("@sinclair/typebox").TObject<{
name: import("@sinclair/typebox").TString;
version: import("@sinclair/typebox").TInteger;
chain: import("@sinclair/typebox").TString;
networks: import("@sinclair/typebox").TObject<{
mainnet: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
start_block: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
end_block: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
expire_after_occurrence: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
include_proof: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
include_inputs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
include_outputs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
include_witness: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
if_this: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"txid">;
equals: import("@sinclair/typebox").TString;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
op_return: import("@sinclair/typebox").TObject<{
starts_with: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
op_return: import("@sinclair/typebox").TObject<{
equals: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
op_return: import("@sinclair/typebox").TObject<{
ends_with: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
p2pkh: import("@sinclair/typebox").TObject<{
equals: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
p2sh: import("@sinclair/typebox").TObject<{
equals: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
p2wpkh: import("@sinclair/typebox").TObject<{
equals: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
p2wsh: import("@sinclair/typebox").TObject<{
equals: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"stacks_protocol">;
operation: import("@sinclair/typebox").TLiteral<"block_committed">;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"stacks_protocol">;
operation: import("@sinclair/typebox").TLiteral<"leader_registered">;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"stacks_protocol">;
operation: import("@sinclair/typebox").TLiteral<"stx_transfered">;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"stacks_protocol">;
operation: import("@sinclair/typebox").TLiteral<"stx_locked">;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"ordinals_protocol">;
operation: import("@sinclair/typebox").TLiteral<"inscription_feed">;
meta_protocols: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"all">, import("@sinclair/typebox").TLiteral<"brc-20">]>>>;
}>]>;
}>, import("@sinclair/typebox").TObject<{
start_block: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
end_block: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
expire_after_occurrence: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
if_this: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"txid">;
equals: import("@sinclair/typebox").TString;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"block_height">;
higher_than: import("@sinclair/typebox").TInteger;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"ft_event">;
asset_identifier: import("@sinclair/typebox").TString;
actions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"mint">, import("@sinclair/typebox").TLiteral<"transfer">, import("@sinclair/typebox").TLiteral<"burn">]>>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"nft_event">;
asset_identifier: import("@sinclair/typebox").TString;
actions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"mint">, import("@sinclair/typebox").TLiteral<"transfer">, import("@sinclair/typebox").TLiteral<"burn">]>>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"stx_event">;
actions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"mint">, import("@sinclair/typebox").TLiteral<"transfer">, import("@sinclair/typebox").TLiteral<"burn">, import("@sinclair/typebox").TLiteral<"lock">]>>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"print_event">;
contract_identifier: import("@sinclair/typebox").TString;
contains: import("@sinclair/typebox").TString;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"contract_call">;
contract_identifier: import("@sinclair/typebox").TString;
method: import("@sinclair/typebox").TString;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"contract_deployment">;
deployer: import("@sinclair/typebox").TString;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"contract_deployment">; /** Chainhook node connection options */
implement_trait: import("@sinclair/typebox").TString;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"signer_message">;
after_timestamp: import("@sinclair/typebox").TInteger;
}>]>;
decode_clarity_values: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
include_contract_abi: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
}>]>>;
testnet: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
start_block: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
end_block: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
expire_after_occurrence: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
include_proof: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
include_inputs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
include_outputs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
include_witness: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
if_this: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"txid">;
equals: import("@sinclair/typebox").TString;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
op_return: import("@sinclair/typebox").TObject<{
starts_with: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
op_return: import("@sinclair/typebox").TObject<{
equals: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
op_return: import("@sinclair/typebox").TObject<{
ends_with: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
p2pkh: import("@sinclair/typebox").TObject<{
equals: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
p2sh: import("@sinclair/typebox").TObject<{
equals: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
p2wpkh: import("@sinclair/typebox").TObject<{
equals: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"outputs">;
p2wsh: import("@sinclair/typebox").TObject<{
equals: import("@sinclair/typebox").TString;
}>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"stacks_protocol">;
operation: import("@sinclair/typebox").TLiteral<"block_committed">;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"stacks_protocol">;
operation: import("@sinclair/typebox").TLiteral<"leader_registered">;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"stacks_protocol">;
operation: import("@sinclair/typebox").TLiteral<"stx_transfered">;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"stacks_protocol">;
operation: import("@sinclair/typebox").TLiteral<"stx_locked">;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"ordinals_protocol">;
operation: import("@sinclair/typebox").TLiteral<"inscription_feed">;
meta_protocols: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"all">, import("@sinclair/typebox").TLiteral<"brc-20">]>>>;
}>]>;
}>, import("@sinclair/typebox").TObject<{
start_block: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
end_block: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
expire_after_occurrence: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
if_this: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"txid">;
equals: import("@sinclair/typebox").TString;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"block_height">;
higher_than: import("@sinclair/typebox").TInteger;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"ft_event">;
asset_identifier: import("@sinclair/typebox").TString;
actions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"mint">, import("@sinclair/typebox").TLiteral<"transfer">, import("@sinclair/typebox").TLiteral<"burn">]>>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"nft_event">;
asset_identifier: import("@sinclair/typebox").TString;
actions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"mint">, import("@sinclair/typebox").TLiteral<"transfer">, import("@sinclair/typebox").TLiteral<"burn">]>>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"stx_event">;
actions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"mint">, import("@sinclair/typebox").TLiteral<"transfer">, import("@sinclair/typebox").TLiteral<"burn">, import("@sinclair/typebox").TLiteral<"lock">]>>;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"print_event">;
contract_identifier: import("@sinclair/typebox").TString;
contains: import("@sinclair/typebox").TString;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"contract_call">;
contract_identifier: import("@sinclair/typebox").TString;
method: import("@sinclair/typebox").TString;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"contract_deployment">;
deployer: import("@sinclair/typebox").TString;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"contract_deployment">; /** Chainhook node connection options */
implement_trait: import("@sinclair/typebox").TString;
}>, import("@sinclair/typebox").TObject<{
scope: import("@sinclair/typebox").TLiteral<"signer_message">;
after_timestamp: import("@sinclair/typebox").TInteger;
}>]>;
decode_clarity_values: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
include_contract_abi: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
}>]>>;
}>;
}>;
/**
* Partial predicate definition that allows users to build the core parts of a predicate and let the
* event observer fill in the rest.
*/
export type EventObserverPredicate = Static<typeof EventObserverPredicateSchema>;
/**
* Local web server that registers predicates and receives events from a Chainhook node. It handles
* retry logic and node availability transparently and provides a callback for individual event
* processing.
*
* Predicates registered here do not accept a `then_that` entry as this will be configured
* automatically to redirect events to this server.
*
* Events relayed by this component will include the original predicate's UUID so actions can be
* taken for each relevant predicate.
*/
export declare class ChainhookEventObserver {
private fastify?;
private observer;
private chainhook;
private healthCheckTimer?;
constructor(observer: EventObserverOptions, chainhook: ChainhookNodeOptions);
/**
* Starts the Chainhook event observer.
* @param predicates - Predicates to register. If `predicates_disk_file_path` is enabled in the
* observer, predicates stored on disk will take precedent over those specified here.
* @param callback - Function to handle every Chainhook event payload sent by the node
*/
start(predicates: EventObserverPredicate[], callback: OnPredicatePayloadCallback): Promise<void>;
/**
* Stop the Chainhook event server gracefully.
*/
close(): Promise<void>;
}
export * from './schemas/bitcoin/if_this';
export * from './schemas/bitcoin/payload';
export * from './schemas/common';
export * from './schemas/payload';
export * from './schemas/predicate';
export * from './schemas/stacks/if_this';
export * from './schemas/stacks/payload';
export * from './schemas/stacks/signers';
export * from './schemas/stacks/tx_events';
export * from './schemas/stacks/tx_kind';
export * from './server';