Helpers
Functions you import from @secondlayer/sdk rather than call on the client: decoders and type guards, signature and proof checks, and consume-loop helpers.
@secondlayer/sdk@15.5.0 46 helpers from source with openpkg
buildDoctorReport ( input: { webhook : WebhookDetail; deliveries: DeliveryRow [] ; dead: DeadRow [] }) : DoctorReport
Copy The list page's own reduced detector: computed from WebhookSummary alone (no deliveries, no dead-letter rows — the list endpoint returns neither, and fetching per-row detail or deliveries here would fan out one request per row).
buildListIssue ( webhook: { status : WebhookStatus; circuitOpenedAt: string | null ; lastSuccessAt: string | null }) : DoctorIssue | null
Copy Checkpointed pull loop over a cursor-paginated Index feed — the Index port of consumeStreamsEvents, sharing its contract: at-least-once delivery, client-owned checkpoints (onBatch may return the cursor it committed), and automatic reorg rewind to the lowest fresh fork point.
consumeIndexFeed < TItem extends IndexFeedItem , TEnvelope extends IndexFeedEnvelope , TTx = never >( opts : IndexConsumeOptions < TItem , TEnvelope , TTx > & { fetchPage : IndexFeedFetcher < TEnvelope >; itemsOf : ( envelope : TEnvelope ) => TItem [] }): Promise <{ cursor : string | null ; pages : number ; emptyPolls : number }>
Copy Liveness for a consume loop.
consumerHealth ( options ?: { staleAfterMs? : number }) : ConsumerHealth
Copy Fold one read into a ContextField : the value, or null with the failure described.
contextField < T >( read: Promise < T >) : Promise < ContextField < T >>
Copy createArchiveClient ( options ?: CreateArchiveClientOptions ) : ArchiveClient
Copy createStreamsClient ( options: CreateStreamsClientOptions ) : StreamsClient
Copy Decode a raw Streams event into the SAME flat, event_type-discriminated row shape Index serves — so Streams consumption reads identically to Index consumption, with one call instead of eleven guard+decode pairs.
decode ( event: StreamsEvent ) : IndexEvent
Copy Decode + narrow a chain webhook delivery body into a typed ChainWebhookDelivery.
decodeChainWebhook ( rawBody: string ) : ChainWebhookDelivery
Copy Decode a hex-encoded Clarity value to JSON-safe JS (uints as strings, buffers as 0x… hex, tuples as objects).
decodeClarityValue ( hex: string ) : unknown
Copy decodeFtBurn ( event: StreamsEvent ) : DecodedFtBurn
Copy decodeFtMint ( event: StreamsEvent ) : DecodedFtMint
Copy decodeFtTransfer ( event: StreamsEvent ) : DecodedFtTransfer
Copy decodeNftBurn ( event: StreamsEvent ) : DecodedNftBurn
Copy decodeNftMint ( event: StreamsEvent ) : DecodedNftMint
Copy decodeNftTransfer ( event: StreamsEvent ) : DecodedNftTransfer
Copy decodePrint ( event: StreamsEvent ) : DecodedPrint
Copy decodeStxBurn ( event: StreamsEvent ) : DecodedStxBurn
Copy decodeStxLock ( event: StreamsEvent ) : DecodedStxLock
Copy decodeStxMint ( event: StreamsEvent ) : DecodedStxMint
Copy decodeStxTransfer ( event: StreamsEvent ) : DecodedStxTransfer
Copy Resolve a reward set directly from a stacks-node (/v3/stacker_set/{cycle}), so a caller can verify the consensus layer against a node IT trusts rather than the reward set Secondlayer embedded in the proof.
fetchRewardSet ( opts: { nodeUrl : string; cycle: number; fetchImpl ?: typeof fetch }) : Promise < RewardSet | null >
Copy Returns a typed client for a subgraph defined with defineSubgraph().
getSubgraph < T extends { name : string ; schema : Record < string , unknown > }>( def : T , options ?: Subgraphs | SecondLayer | { baseUrl ?: string ; apiKey ?: string ; accountKey ?: string ; fetchImpl ?: FetchLike ; dumpsBaseUrl ?: string ; archiveBaseUrl ?: string ; archiveOpsUrl ?: string ; origin ?: " cli " | " mcp " | " session "; verify ?: boolean | { publicKey : string ; }; verifyDumpsManifest ?: boolean ; requestTimeoutMs ?: number ; etagCache ?: false | EtagCache }): InferSubgraphClient < T >
Copy isFtBurn ( event: StreamsEvent ) : event is StreamsEventBase & { event_type : " stx_transfer "; payload : StxTransferPayload } & { event_type : " ft_burn " } | StreamsEventBase & { event_type : " stx_mint "; payload : StxMintPayload } & { event_type : " ft_burn " } | StreamsEventBase & { event_type : " stx_burn "; payload : StxBurnPayload } & { event_type : " ft_burn " } | StreamsEventBase & { event_type : " stx_lock "; payload : StxLockPayload } & { event_type : " ft_burn " } | StreamsEventBase & { event_type : " ft_transfer "; payload : FtTransferPayload } & { event_type : " ft_burn " } | StreamsEventBase & { event_type : " ft_mint "; payload : FtMintPayload } & { event_type : " ft_burn " } | StreamsEventBase & { event_type : " ft_burn "; payload : FtBurnPayload } & { event_type : " ft_burn " } | StreamsEventBase & { event_type : " nft_transfer "; payload : NftTransferPayload } & { event_type : " ft_burn " } | StreamsEventBase & { event_type : " nft_mint "; payload : NftMintPayload } & { event_type : " ft_burn " } | StreamsEventBase & { event_type : " nft_burn "; payload : NftBurnPayload } & { event_type : " ft_burn " } | StreamsEventBase & { event_type : " print "; payload : PrintPayload } & { event_type : " ft_burn " }
Copy isFtMint ( event: StreamsEvent ) : event is StreamsEventBase & { event_type : " stx_transfer "; payload : StxTransferPayload } & { event_type : " ft_mint " } | StreamsEventBase & { event_type : " stx_mint "; payload : StxMintPayload } & { event_type : " ft_mint " } | StreamsEventBase & { event_type : " stx_burn "; payload : StxBurnPayload } & { event_type : " ft_mint " } | StreamsEventBase & { event_type : " stx_lock "; payload : StxLockPayload } & { event_type : " ft_mint " } | StreamsEventBase & { event_type : " ft_transfer "; payload : FtTransferPayload } & { event_type : " ft_mint " } | StreamsEventBase & { event_type : " ft_mint "; payload : FtMintPayload } & { event_type : " ft_mint " } | StreamsEventBase & { event_type : " ft_burn "; payload : FtBurnPayload } & { event_type : " ft_mint " } | StreamsEventBase & { event_type : " nft_transfer "; payload : NftTransferPayload } & { event_type : " ft_mint " } | StreamsEventBase & { event_type : " nft_mint "; payload : NftMintPayload } & { event_type : " ft_mint " } | StreamsEventBase & { event_type : " nft_burn "; payload : NftBurnPayload } & { event_type : " ft_mint " } | StreamsEventBase & { event_type : " print "; payload : PrintPayload } & { event_type : " ft_mint " }
Copy isFtTransfer ( event: StreamsEvent ) : event is StreamsEventOf <" ft_transfer ", FtTransferPayload >
Copy True when url is the hosted Secondlayer API (api.secondlayer.tools).
isHostedApiUrl ( url: string ) : boolean
Copy isNftBurn ( event: StreamsEvent ) : event is StreamsEventBase & { event_type : " stx_transfer "; payload : StxTransferPayload } & { event_type : " nft_burn " } | StreamsEventBase & { event_type : " stx_mint "; payload : StxMintPayload } & { event_type : " nft_burn " } | StreamsEventBase & { event_type : " stx_burn "; payload : StxBurnPayload } & { event_type : " nft_burn " } | StreamsEventBase & { event_type : " stx_lock "; payload : StxLockPayload } & { event_type : " nft_burn " } | StreamsEventBase & { event_type : " ft_transfer "; payload : FtTransferPayload } & { event_type : " nft_burn " } | StreamsEventBase & { event_type : " ft_mint "; payload : FtMintPayload } & { event_type : " nft_burn " } | StreamsEventBase & { event_type : " ft_burn "; payload : FtBurnPayload } & { event_type : " nft_burn " } | StreamsEventBase & { event_type : " nft_transfer "; payload : NftTransferPayload } & { event_type : " nft_burn " } | StreamsEventBase & { event_type : " nft_mint "; payload : NftMintPayload } & { event_type : " nft_burn " } | StreamsEventBase & { event_type : " nft_burn "; payload : NftBurnPayload } & { event_type : " nft_burn " } | StreamsEventBase & { event_type : " print "; payload : PrintPayload } & { event_type : " nft_burn " }
Copy isNftMint ( event: StreamsEvent ) : event is StreamsEventBase & { event_type : " stx_transfer "; payload : StxTransferPayload } & { event_type : " nft_mint " } | StreamsEventBase & { event_type : " stx_mint "; payload : StxMintPayload } & { event_type : " nft_mint " } | StreamsEventBase & { event_type : " stx_burn "; payload : StxBurnPayload } & { event_type : " nft_mint " } | StreamsEventBase & { event_type : " stx_lock "; payload : StxLockPayload } & { event_type : " nft_mint " } | StreamsEventBase & { event_type : " ft_transfer "; payload : FtTransferPayload } & { event_type : " nft_mint " } | StreamsEventBase & { event_type : " ft_mint "; payload : FtMintPayload } & { event_type : " nft_mint " } | StreamsEventBase & { event_type : " ft_burn "; payload : FtBurnPayload } & { event_type : " nft_mint " } | StreamsEventBase & { event_type : " nft_transfer "; payload : NftTransferPayload } & { event_type : " nft_mint " } | StreamsEventBase & { event_type : " nft_mint "; payload : NftMintPayload } & { event_type : " nft_mint " } | StreamsEventBase & { event_type : " nft_burn "; payload : NftBurnPayload } & { event_type : " nft_mint " } | StreamsEventBase & { event_type : " print "; payload : PrintPayload } & { event_type : " nft_mint " }
Copy isNftTransfer ( event: StreamsEvent ) : event is StreamsEventOf <" nft_transfer ", NftTransferPayload >
Copy isPrint ( event: StreamsEvent ) : event is StreamsEventBase & { event_type : " stx_transfer "; payload : StxTransferPayload } & { event_type : " print " } | StreamsEventBase & { event_type : " stx_mint "; payload : StxMintPayload } & { event_type : " print " } | StreamsEventBase & { event_type : " stx_burn "; payload : StxBurnPayload } & { event_type : " print " } | StreamsEventBase & { event_type : " stx_lock "; payload : StxLockPayload } & { event_type : " print " } | StreamsEventBase & { event_type : " ft_transfer "; payload : FtTransferPayload } & { event_type : " print " } | StreamsEventBase & { event_type : " ft_mint "; payload : FtMintPayload } & { event_type : " print " } | StreamsEventBase & { event_type : " ft_burn "; payload : FtBurnPayload } & { event_type : " print " } | StreamsEventBase & { event_type : " nft_transfer "; payload : NftTransferPayload } & { event_type : " print " } | StreamsEventBase & { event_type : " nft_mint "; payload : NftMintPayload } & { event_type : " print " } | StreamsEventBase & { event_type : " nft_burn "; payload : NftBurnPayload } & { event_type : " print " } | StreamsEventBase & { event_type : " print "; payload : PrintPayload } & { event_type : " print " }
Copy isStxBurn ( event: StreamsEvent ) : event is StreamsEventBase & { event_type : " stx_transfer "; payload : StxTransferPayload } & { event_type : " stx_burn " } | StreamsEventBase & { event_type : " stx_mint "; payload : StxMintPayload } & { event_type : " stx_burn " } | StreamsEventBase & { event_type : " stx_burn "; payload : StxBurnPayload } & { event_type : " stx_burn " } | StreamsEventBase & { event_type : " stx_lock "; payload : StxLockPayload } & { event_type : " stx_burn " } | StreamsEventBase & { event_type : " ft_transfer "; payload : FtTransferPayload } & { event_type : " stx_burn " } | StreamsEventBase & { event_type : " ft_mint "; payload : FtMintPayload } & { event_type : " stx_burn " } | StreamsEventBase & { event_type : " ft_burn "; payload : FtBurnPayload } & { event_type : " stx_burn " } | StreamsEventBase & { event_type : " nft_transfer "; payload : NftTransferPayload } & { event_type : " stx_burn " } | StreamsEventBase & { event_type : " nft_mint "; payload : NftMintPayload } & { event_type : " stx_burn " } | StreamsEventBase & { event_type : " nft_burn "; payload : NftBurnPayload } & { event_type : " stx_burn " } | StreamsEventBase & { event_type : " print "; payload : PrintPayload } & { event_type : " stx_burn " }
Copy isStxLock ( event: StreamsEvent ) : event is StreamsEventBase & { event_type : " stx_transfer "; payload : StxTransferPayload } & { event_type : " stx_lock " } | StreamsEventBase & { event_type : " stx_mint "; payload : StxMintPayload } & { event_type : " stx_lock " } | StreamsEventBase & { event_type : " stx_burn "; payload : StxBurnPayload } & { event_type : " stx_lock " } | StreamsEventBase & { event_type : " stx_lock "; payload : StxLockPayload } & { event_type : " stx_lock " } | StreamsEventBase & { event_type : " ft_transfer "; payload : FtTransferPayload } & { event_type : " stx_lock " } | StreamsEventBase & { event_type : " ft_mint "; payload : FtMintPayload } & { event_type : " stx_lock " } | StreamsEventBase & { event_type : " ft_burn "; payload : FtBurnPayload } & { event_type : " stx_lock " } | StreamsEventBase & { event_type : " nft_transfer "; payload : NftTransferPayload } & { event_type : " stx_lock " } | StreamsEventBase & { event_type : " nft_mint "; payload : NftMintPayload } & { event_type : " stx_lock " } | StreamsEventBase & { event_type : " nft_burn "; payload : NftBurnPayload } & { event_type : " stx_lock " } | StreamsEventBase & { event_type : " print "; payload : PrintPayload } & { event_type : " stx_lock " }
Copy isStxMint ( event: StreamsEvent ) : event is StreamsEventBase & { event_type : " stx_transfer "; payload : StxTransferPayload } & { event_type : " stx_mint " } | StreamsEventBase & { event_type : " stx_mint "; payload : StxMintPayload } & { event_type : " stx_mint " } | StreamsEventBase & { event_type : " stx_burn "; payload : StxBurnPayload } & { event_type : " stx_mint " } | StreamsEventBase & { event_type : " stx_lock "; payload : StxLockPayload } & { event_type : " stx_mint " } | StreamsEventBase & { event_type : " ft_transfer "; payload : FtTransferPayload } & { event_type : " stx_mint " } | StreamsEventBase & { event_type : " ft_mint "; payload : FtMintPayload } & { event_type : " stx_mint " } | StreamsEventBase & { event_type : " ft_burn "; payload : FtBurnPayload } & { event_type : " stx_mint " } | StreamsEventBase & { event_type : " nft_transfer "; payload : NftTransferPayload } & { event_type : " stx_mint " } | StreamsEventBase & { event_type : " nft_mint "; payload : NftMintPayload } & { event_type : " stx_mint " } | StreamsEventBase & { event_type : " nft_burn "; payload : NftBurnPayload } & { event_type : " stx_mint " } | StreamsEventBase & { event_type : " print "; payload : PrintPayload } & { event_type : " stx_mint " }
Copy isStxTransfer ( event: StreamsEvent ) : event is StreamsEventBase & { event_type : " stx_transfer "; payload : StxTransferPayload } & { event_type : " stx_transfer " } | StreamsEventBase & { event_type : " stx_mint "; payload : StxMintPayload } & { event_type : " stx_transfer " } | StreamsEventBase & { event_type : " stx_burn "; payload : StxBurnPayload } & { event_type : " stx_transfer " } | StreamsEventBase & { event_type : " stx_lock "; payload : StxLockPayload } & { event_type : " stx_transfer " } | StreamsEventBase & { event_type : " ft_transfer "; payload : FtTransferPayload } & { event_type : " stx_transfer " } | StreamsEventBase & { event_type : " ft_mint "; payload : FtMintPayload } & { event_type : " stx_transfer " } | StreamsEventBase & { event_type : " ft_burn "; payload : FtBurnPayload } & { event_type : " stx_transfer " } | StreamsEventBase & { event_type : " nft_transfer "; payload : NftTransferPayload } & { event_type : " stx_transfer " } | StreamsEventBase & { event_type : " nft_mint "; payload : NftMintPayload } & { event_type : " stx_transfer " } | StreamsEventBase & { event_type : " nft_burn "; payload : NftBurnPayload } & { event_type : " stx_transfer " } | StreamsEventBase & { event_type : " print "; payload : PrintPayload } & { event_type : " stx_transfer " }
Copy Webhook diagnosis, shared by secondlayer webhooks doctor and the dashboard's webhook detail page.
isSuccessDelivery ( row: DeliveryRow ) : boolean
Copy Parse a Retry-After header: delta-seconds or an HTTP-date.
parseRetryAfter ( value ?: string | null ) : number | undefined
Copy Resolve the hosted account key for archive quote/fetch/credits.
resolveAccountKey ( accountKey ?: string ) : string | undefined
Copy Resolve the bearer credential; the key follows the host.
resolveApiKey ( apiKey ?: string , baseUrl ?: string ) : string | undefined
Copy resolveBaseUrl ( explicit ?: string ) : string
Copy An AbortSignal wired to SIGTERM/SIGINT (redeploys arrive as SIGTERM).
shutdownSignal ( options ?: { signals? : readonly (" SIGTERM " | " SIGINT ")[] }) : AbortSignal
Copy Make a cvToValue result JSON-serializable: Clarity (u)ints decode to bigint, which JSON.stringify can't handle — convert recursively to strings.
toJsonSafe ( value: unknown ) : unknown
Copy Verify the universal Secondlayer authenticity signature that every delivery carries, regardless of body format (raw, cloudevents, standard-webhooks, …).
verifySecondlayerSignature ( rawBody: string , headers: WebhookHeaderInput , publicKeyPem: string ) : boolean
Copy verifyStandardWebhooksHeaders ( body: string , headers: StandardWebhooksHeaders | Record < string , string | string [] | undefined >, secret: string , opts ?: VerifyOptions ) : boolean
Copy Verify a transaction-inclusion proof.
verifyTransactionProof ( proof: TransactionProof , opts ?: { rewardSet? : RewardSet }) : TransactionProofVerifyResult
Copy Verify a Secondlayer webhook delivery signature.
verifyWebhookSignature ( rawBody: string , headers: WebhookHeaderInput , secret: string , toleranceSeconds ?: number ) : boolean
Copy ← Previous sl.instance Next → Errors Edit on GitHub