@secondlayer/shared 11.6.1 → 11.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/archive/range-digest.d.ts +46 -27
- package/dist/src/archive/semantic-digest-builder.d.ts +46 -27
- package/dist/src/coverage/index.d.ts +46 -27
- package/dist/src/db/index.d.ts +57 -39
- package/dist/src/db/index.js +5 -4
- package/dist/src/db/index.js.map +3 -3
- package/dist/src/db/queries/chain-reorgs.d.ts +46 -27
- package/dist/src/db/queries/chain-reorgs.js +5 -4
- package/dist/src/db/queries/chain-reorgs.js.map +3 -3
- package/dist/src/db/queries/contracts.d.ts +46 -27
- package/dist/src/db/queries/instance.d.ts +46 -27
- package/dist/src/db/queries/integrity.d.ts +47 -28
- package/dist/src/db/queries/integrity.js +4 -3
- package/dist/src/db/queries/integrity.js.map +3 -3
- package/dist/src/db/queries/subgraph-gaps.d.ts +46 -27
- package/dist/src/db/queries/subgraph-operations.d.ts +46 -27
- package/dist/src/db/queries/subgraphs.d.ts +47 -33
- package/dist/src/db/queries/subgraphs.js +1 -10
- package/dist/src/db/queries/subgraphs.js.map +3 -3
- package/dist/src/db/queries/sync-scope.d.ts +46 -27
- package/dist/src/db/queries/webhooks.d.ts +46 -27
- package/dist/src/db/schema.d.ts +53 -36
- package/dist/src/index-http.d.ts +23 -0
- package/dist/src/index-http.js +9 -2
- package/dist/src/index-http.js.map +3 -3
- package/dist/src/index.d.ts +86 -42
- package/dist/src/index.js +58 -6
- package/dist/src/index.js.map +5 -5
- package/dist/src/node/local-client.d.ts +67 -28
- package/dist/src/node/local-client.js +41 -2
- package/dist/src/node/local-client.js.map +5 -4
- package/dist/src/schemas/index.d.ts +23 -1
- package/dist/src/schemas/index.js +38 -1
- package/dist/src/schemas/index.js.map +3 -3
- package/dist/src/schemas/webhooks.d.ts +23 -1
- package/dist/src/schemas/webhooks.js +38 -1
- package/dist/src/schemas/webhooks.js.map +3 -3
- package/dist/src/streams-rows/index.d.ts +43 -1
- package/dist/src/streams-rows/index.js +14 -3
- package/dist/src/streams-rows/index.js.map +3 -3
- package/dist/src/types.d.ts +12 -1
- package/migrations/0131_vm_events.ts +81 -0
- package/migrations/0132_vm_events_type_ordinal_idx.ts +21 -0
- package/migrations/0133_vm_events_fk_cascade.ts +47 -0
- package/migrations/0134_waitlists.ts +64 -0
- package/migrations/0135_drop_hosted_play_and_meters.ts +58 -0
- package/package.json +2 -2
|
@@ -74,6 +74,11 @@ var CHAIN_TRIGGER_TYPES = [
|
|
|
74
74
|
"contract_call",
|
|
75
75
|
"contract_deploy",
|
|
76
76
|
"print_event",
|
|
77
|
+
"nested_contract_call",
|
|
78
|
+
"var_set",
|
|
79
|
+
"map_set",
|
|
80
|
+
"map_insert",
|
|
81
|
+
"map_delete",
|
|
77
82
|
"sbtc_deposit",
|
|
78
83
|
"sbtc_withdrawal_create",
|
|
79
84
|
"sbtc_withdrawal_accept",
|
|
@@ -168,6 +173,38 @@ var ChainTriggerSchema = z.discriminatedUnion("type", [
|
|
|
168
173
|
topic: triggerPattern.optional(),
|
|
169
174
|
trait: trait.optional()
|
|
170
175
|
}).strict(),
|
|
176
|
+
z.object({
|
|
177
|
+
type: z.literal("nested_contract_call"),
|
|
178
|
+
contractId: triggerPattern.optional(),
|
|
179
|
+
functionName: triggerPattern.optional(),
|
|
180
|
+
caller: triggerPattern.optional(),
|
|
181
|
+
sender: triggerPattern.optional(),
|
|
182
|
+
trait: trait.optional()
|
|
183
|
+
}).strict(),
|
|
184
|
+
z.object({
|
|
185
|
+
type: z.literal("var_set"),
|
|
186
|
+
contractId: triggerPattern.optional(),
|
|
187
|
+
varName: triggerPattern.optional(),
|
|
188
|
+
trait: trait.optional()
|
|
189
|
+
}).strict(),
|
|
190
|
+
z.object({
|
|
191
|
+
type: z.literal("map_set"),
|
|
192
|
+
contractId: triggerPattern.optional(),
|
|
193
|
+
map: triggerPattern.optional(),
|
|
194
|
+
trait: trait.optional()
|
|
195
|
+
}).strict(),
|
|
196
|
+
z.object({
|
|
197
|
+
type: z.literal("map_insert"),
|
|
198
|
+
contractId: triggerPattern.optional(),
|
|
199
|
+
map: triggerPattern.optional(),
|
|
200
|
+
trait: trait.optional()
|
|
201
|
+
}).strict(),
|
|
202
|
+
z.object({
|
|
203
|
+
type: z.literal("map_delete"),
|
|
204
|
+
contractId: triggerPattern.optional(),
|
|
205
|
+
map: triggerPattern.optional(),
|
|
206
|
+
trait: trait.optional()
|
|
207
|
+
}).strict(),
|
|
171
208
|
z.object({
|
|
172
209
|
type: z.literal("sbtc_deposit"),
|
|
173
210
|
sender: triggerPattern.optional(),
|
|
@@ -403,5 +440,5 @@ export {
|
|
|
403
440
|
CHAIN_TRIGGER_FIELDS
|
|
404
441
|
};
|
|
405
442
|
|
|
406
|
-
//# debugId=
|
|
443
|
+
//# debugId=1BC43B557BD63FCF64756E2164756E21
|
|
407
444
|
//# sourceMappingURL=webhooks.js.map
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/schemas/webhooks.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { z } from \"zod\";\n\nexport const WEBHOOK_FORMATS = [\n\t\"standard-webhooks\",\n\t\"inngest\",\n\t\"trigger\",\n\t\"cloudflare\",\n\t\"cloudevents\",\n\t\"raw\",\n] as const;\n\nexport const WEBHOOK_RUNTIMES = [\n\t\"inngest\",\n\t\"trigger\",\n\t\"cloudflare\",\n\t\"node\",\n] as const;\n\nexport const WEBHOOK_STATUSES = [\"active\", \"paused\", \"error\"] as const;\n\nexport const WEBHOOK_FILTER_OPERATORS = [\n\t\"eq\",\n\t\"neq\",\n\t\"gt\",\n\t\"gte\",\n\t\"lt\",\n\t\"lte\",\n\t\"in\",\n] as const;\n\nconst webhookUrl = z\n\t.string()\n\t.trim()\n\t.min(1)\n\t.refine(\n\t\t(value) => value.startsWith(\"http://\") || value.startsWith(\"https://\"),\n\t\t\"must be an http(s) URL\",\n\t);\n\nconst name = z.string().trim().min(1).max(128);\nconst resourceName = z.string().trim().min(1).max(128);\n\nexport const WebhookStatusSchema: z.ZodType<WebhookStatus> =\n\tz.enum(WEBHOOK_STATUSES);\nexport const WebhookFormatSchema: z.ZodType<WebhookFormat> =\n\tz.enum(WEBHOOK_FORMATS);\nexport const WebhookRuntimeSchema: z.ZodType<WebhookRuntime> =\n\tz.enum(WEBHOOK_RUNTIMES);\n\nexport const WebhookFilterPrimitiveSchema: z.ZodType<WebhookFilterPrimitive> =\n\tz.union([z.string(), z.number().finite(), z.boolean()]);\n\nexport const WebhookFilterOperatorSchema: z.ZodType<WebhookFilterOperator> =\n\tz.union([\n\t\tz.object({ eq: WebhookFilterPrimitiveSchema }).strict(),\n\t\tz.object({ neq: WebhookFilterPrimitiveSchema }).strict(),\n\t\tz.object({ gt: z.union([z.string(), z.number().finite()]) }).strict(),\n\t\tz.object({ gte: z.union([z.string(), z.number().finite()]) }).strict(),\n\t\tz.object({ lt: z.union([z.string(), z.number().finite()]) }).strict(),\n\t\tz.object({ lte: z.union([z.string(), z.number().finite()]) }).strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\tin: z.array(WebhookFilterPrimitiveSchema).min(1),\n\t\t\t})\n\t\t\t.strict(),\n\t]);\n\nexport const WebhookFilterClauseSchema: z.ZodType<WebhookFilterClause> =\n\tz.union([WebhookFilterPrimitiveSchema, WebhookFilterOperatorSchema]);\n\nexport const WebhookFilterSchema: z.ZodType<WebhookFilter> = z.record(\n\tz.string().min(1),\n\tWebhookFilterClauseSchema,\n);\n\n// --- Chain triggers (direct chain-level webhooks) -----------------------\n// A chain webhook reacts to raw chain events matched directly off the\n// Index/Streams clock (no subgraph). `triggers` is an array of these filters —\n// the JSON mirror of the subgraph runtime's `SubgraphFilter` union. Defined\n// here (not imported from @secondlayer/subgraphs) to avoid a shared→subgraphs\n// cycle; the evaluator maps these to `SubgraphFilter` at match time. Amounts are\n// non-negative integer strings (uint128 can exceed JS safe-int) or numbers.\n\nexport const CHAIN_TRIGGER_TYPES = [\n\t\"stx_transfer\",\n\t\"stx_mint\",\n\t\"stx_burn\",\n\t\"stx_lock\",\n\t\"ft_transfer\",\n\t\"ft_mint\",\n\t\"ft_burn\",\n\t\"nft_transfer\",\n\t\"nft_mint\",\n\t\"nft_burn\",\n\t\"contract_call\",\n\t\"contract_deploy\",\n\t\"print_event\",\n\t\"sbtc_deposit\",\n\t\"sbtc_withdrawal_create\",\n\t\"sbtc_withdrawal_accept\",\n\t\"sbtc_withdrawal_reject\",\n\t\"sbtc_withdrawal_swept_confirmed\",\n] as const;\n\nconst triggerAmount = z.union([\n\tz.string().trim().regex(/^\\d+$/, \"must be a non-negative integer string\"),\n\tz.number().int().nonnegative(),\n]);\n/** Principal/identifier/name patterns — `*` wildcards allowed (matched by the\n * evaluator). */\nconst triggerPattern = z.string().trim().min(1);\nconst trait = z.string().trim().min(1);\n\nexport const ChainTriggerSchema: z.ZodType<ChainTrigger> = z.discriminatedUnion(\n\t\"type\",\n\t[\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"stx_transfer\"),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\trecipient: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t\tmaxAmount: triggerAmount.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"stx_mint\"),\n\t\t\t\trecipient: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"stx_burn\"),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"stx_lock\"),\n\t\t\t\tlockedAddress: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"ft_transfer\"),\n\t\t\t\tassetIdentifier: triggerPattern.optional(),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\trecipient: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"ft_mint\"),\n\t\t\t\tassetIdentifier: triggerPattern.optional(),\n\t\t\t\trecipient: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"ft_burn\"),\n\t\t\t\tassetIdentifier: triggerPattern.optional(),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"nft_transfer\"),\n\t\t\t\tassetIdentifier: triggerPattern.optional(),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\trecipient: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"nft_mint\"),\n\t\t\t\tassetIdentifier: triggerPattern.optional(),\n\t\t\t\trecipient: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"nft_burn\"),\n\t\t\t\tassetIdentifier: triggerPattern.optional(),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"contract_call\"),\n\t\t\t\tcontractId: triggerPattern.optional(),\n\t\t\t\tfunctionName: triggerPattern.optional(),\n\t\t\t\tcaller: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"contract_deploy\"),\n\t\t\t\tdeployer: triggerPattern.optional(),\n\t\t\t\tcontractName: triggerPattern.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"print_event\"),\n\t\t\t\tcontractId: triggerPattern.optional(),\n\t\t\t\ttopic: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"sbtc_deposit\"),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t\tmaxAmount: triggerAmount.optional(),\n\t\t\t\tbitcoinTxid: triggerPattern.optional(),\n\t\t\t\trequestId: z.number().int().nonnegative().optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"sbtc_withdrawal_create\"),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t\tmaxAmount: triggerAmount.optional(),\n\t\t\t\trequestId: z.number().int().nonnegative().optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"sbtc_withdrawal_accept\"),\n\t\t\t\trequestId: z.number().int().nonnegative().optional(),\n\t\t\t\tsweepTxid: triggerPattern.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"sbtc_withdrawal_reject\"),\n\t\t\t\trequestId: z.number().int().nonnegative().optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"sbtc_withdrawal_swept_confirmed\"),\n\t\t\t\trequestId: z.number().int().nonnegative().optional(),\n\t\t\t\tsweepTxid: triggerPattern.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t],\n);\n\nexport const ChainTriggersSchema: z.ZodType<ChainTrigger[]> = z\n\t.array(ChainTriggerSchema)\n\t.min(1)\n\t.max(50);\n\n/**\n * Per-type accepted filter fields for chain triggers, DERIVED from\n * {@link ChainTriggerSchema} so the agent-facing reference can never drift behind\n * the validator. `{ stx_transfer: [\"sender\",\"recipient\",\"minAmount\",\"maxAmount\"], ... }`.\n */\nexport const CHAIN_TRIGGER_FIELDS: Record<string, string[]> =\n\tObject.fromEntries(\n\t\t// biome-ignore lint/suspicious/noExplicitAny: zod-internal introspection of this module's own discriminated union\n\t\t((ChainTriggerSchema as any)._zod.def.options as any[]).map((opt) => {\n\t\t\tconst shape = opt._zod.def.shape as Record<string, unknown>;\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: literal value lives on the zod-internal def\n\t\t\tconst type = (shape.type as any)._zod.def.values[0] as string;\n\t\t\treturn [type, Object.keys(shape).filter((k) => k !== \"type\")];\n\t\t}),\n\t);\n\nexport const CreateWebhookRequestSchema: z.ZodType<ParsedCreateWebhookRequest> =\n\tz\n\t\t.object({\n\t\t\tname,\n\t\t\t// Subgraph mode (kind=subgraph): subgraphName + tableName + optional filter.\n\t\t\tsubgraphName: resourceName.optional(),\n\t\t\ttableName: resourceName.optional(),\n\t\t\tfilter: WebhookFilterSchema.optional(),\n\t\t\t// Chain mode (kind=chain): triggers.\n\t\t\ttriggers: ChainTriggersSchema.optional(),\n\t\t\turl: webhookUrl,\n\t\t\tformat: WebhookFormatSchema.default(\"standard-webhooks\"),\n\t\t\truntime: WebhookRuntimeSchema.nullable().optional(),\n\t\t\tauthConfig: z.record(z.string(), z.unknown()).optional(),\n\t\t\tmaxRetries: z.number().int().min(0).max(100).optional(),\n\t\t\ttimeoutMs: z.number().int().min(100).max(300_000).optional(),\n\t\t\tconcurrency: z.number().int().min(1).max(100).optional(),\n\t\t})\n\t\t.refine(\n\t\t\t(v) => {\n\t\t\t\tconst subgraphMode =\n\t\t\t\t\tv.subgraphName !== undefined || v.tableName !== undefined;\n\t\t\t\tconst chainMode = v.triggers !== undefined;\n\t\t\t\tif (chainMode && subgraphMode) return false;\n\t\t\t\tif (chainMode) return true;\n\t\t\t\t// Subgraph mode requires BOTH subgraphName and tableName.\n\t\t\t\treturn v.subgraphName !== undefined && v.tableName !== undefined;\n\t\t\t},\n\t\t\t{\n\t\t\t\tmessage:\n\t\t\t\t\t\"provide either { subgraphName, tableName } for a subgraph webhook OR { triggers } for a chain webhook — not both\",\n\t\t\t},\n\t\t)\n\t\t.refine((v) => v.filter === undefined || v.triggers === undefined, {\n\t\t\tmessage:\n\t\t\t\t\"`filter` applies to subgraph webhooks; chain webhooks use `triggers`\",\n\t\t\tpath: [\"filter\"],\n\t\t});\n\nexport const UpdateWebhookRequestSchema: z.ZodType<UpdateWebhookRequest> = z\n\t.object({\n\t\tname: name.optional(),\n\t\turl: webhookUrl.optional(),\n\t\tfilter: WebhookFilterSchema.optional(),\n\t\tformat: WebhookFormatSchema.optional(),\n\t\truntime: WebhookRuntimeSchema.nullable().optional(),\n\t\tauthConfig: z.record(z.string(), z.unknown()).optional(),\n\t\tmaxRetries: z.number().int().min(0).max(100).optional(),\n\t\ttimeoutMs: z.number().int().min(100).max(300_000).optional(),\n\t\tconcurrency: z.number().int().min(1).max(100).optional(),\n\t})\n\t.refine((value) => Object.keys(value).length > 0, {\n\t\tmessage: \"At least one field must be provided\",\n\t});\n\nexport const ReplayWebhookRequestSchema: z.ZodType<ReplayWebhookRequest> = z\n\t.object({\n\t\tfromBlock: z.number().int().nonnegative(),\n\t\ttoBlock: z.number().int().nonnegative(),\n\t\tforce: z.string().trim().min(1).max(64).optional(),\n\t})\n\t.refine((value) => value.fromBlock <= value.toBlock, {\n\t\tmessage: \"fromBlock must be less than or equal to toBlock\",\n\t\tpath: [\"toBlock\"],\n\t});\n\nexport type WebhookStatus = (typeof WEBHOOK_STATUSES)[number];\n/** Polymorphic webhook mode (mirrors db/types `WebhookKind`). */\nexport type WebhookKind = \"subgraph\" | \"chain\";\nexport type WebhookFormat = (typeof WEBHOOK_FORMATS)[number];\nexport type WebhookRuntime = (typeof WEBHOOK_RUNTIMES)[number];\nexport type WebhookFilterPrimitive = string | number | boolean;\nexport type WebhookFilterOperator =\n\t| { eq: WebhookFilterPrimitive }\n\t| { neq: WebhookFilterPrimitive }\n\t| { gt: string | number }\n\t| { gte: string | number }\n\t| { lt: string | number }\n\t| { lte: string | number }\n\t| { in: WebhookFilterPrimitive[] };\nexport type WebhookFilterClause =\n\t| WebhookFilterPrimitive\n\t| WebhookFilterOperator;\nexport type WebhookFilter = Record<string, WebhookFilterClause>;\n\nexport type ChainTriggerType = (typeof CHAIN_TRIGGER_TYPES)[number];\n/** Non-negative integer amount over JSON (string for uint128 safety, or number). */\nexport type ChainTriggerAmount = string | number;\n\ninterface TraitScoped {\n\ttrait?: string;\n}\n\n/** JSON mirror of the subgraph runtime's `SubgraphFilter` union. */\nexport type ChainTrigger =\n\t| {\n\t\t\ttype: \"stx_transfer\";\n\t\t\tsender?: string;\n\t\t\trecipient?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t\t\tmaxAmount?: ChainTriggerAmount;\n\t }\n\t| { type: \"stx_mint\"; recipient?: string; minAmount?: ChainTriggerAmount }\n\t| { type: \"stx_burn\"; sender?: string; minAmount?: ChainTriggerAmount }\n\t| {\n\t\t\ttype: \"stx_lock\";\n\t\t\tlockedAddress?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t }\n\t| ({\n\t\t\ttype: \"ft_transfer\";\n\t\t\tassetIdentifier?: string;\n\t\t\tsender?: string;\n\t\t\trecipient?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"ft_mint\";\n\t\t\tassetIdentifier?: string;\n\t\t\trecipient?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"ft_burn\";\n\t\t\tassetIdentifier?: string;\n\t\t\tsender?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"nft_transfer\";\n\t\t\tassetIdentifier?: string;\n\t\t\tsender?: string;\n\t\t\trecipient?: string;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"nft_mint\";\n\t\t\tassetIdentifier?: string;\n\t\t\trecipient?: string;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"nft_burn\";\n\t\t\tassetIdentifier?: string;\n\t\t\tsender?: string;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"contract_call\";\n\t\t\tcontractId?: string;\n\t\t\tfunctionName?: string;\n\t\t\tcaller?: string;\n\t } & TraitScoped)\n\t| { type: \"contract_deploy\"; deployer?: string; contractName?: string }\n\t| ({\n\t\t\ttype: \"print_event\";\n\t\t\tcontractId?: string;\n\t\t\ttopic?: string;\n\t } & TraitScoped)\n\t| {\n\t\t\ttype: \"sbtc_deposit\";\n\t\t\tsender?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t\t\tmaxAmount?: ChainTriggerAmount;\n\t\t\tbitcoinTxid?: string;\n\t\t\trequestId?: number;\n\t }\n\t| {\n\t\t\ttype: \"sbtc_withdrawal_create\";\n\t\t\tsender?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t\t\tmaxAmount?: ChainTriggerAmount;\n\t\t\trequestId?: number;\n\t }\n\t| {\n\t\t\ttype: \"sbtc_withdrawal_accept\";\n\t\t\trequestId?: number;\n\t\t\tsweepTxid?: string;\n\t }\n\t| { type: \"sbtc_withdrawal_reject\"; requestId?: number }\n\t| {\n\t\t\ttype: \"sbtc_withdrawal_swept_confirmed\";\n\t\t\trequestId?: number;\n\t\t\tsweepTxid?: string;\n\t };\n\n/** Args for a chain-trigger builder — every field of a variant except `type`. */\ntype TriggerArgs<T extends ChainTrigger[\"type\"]> = Omit<\n\tExtract<ChainTrigger, { type: T }>,\n\t\"type\"\n>;\n\n/**\n * Ergonomic chain-trigger constructors for `webhooks.create({ triggers })`.\n * Each returns a bare `ChainTrigger` (the wire shape the API expects):\n *\n * ```ts\n * client.webhooks.create({\n * url: \"https://my.app/webhook\",\n * triggers: [trigger.contractCall({ contractId: \"SP....amm\", functionName: \"swap-*\" })],\n * });\n * ```\n */\nexport const trigger = {\n\tstxTransfer: (f: TriggerArgs<\"stx_transfer\"> = {}): ChainTrigger => ({\n\t\ttype: \"stx_transfer\",\n\t\t...f,\n\t}),\n\tstxMint: (f: TriggerArgs<\"stx_mint\"> = {}): ChainTrigger => ({\n\t\ttype: \"stx_mint\",\n\t\t...f,\n\t}),\n\tstxBurn: (f: TriggerArgs<\"stx_burn\"> = {}): ChainTrigger => ({\n\t\ttype: \"stx_burn\",\n\t\t...f,\n\t}),\n\tstxLock: (f: TriggerArgs<\"stx_lock\"> = {}): ChainTrigger => ({\n\t\ttype: \"stx_lock\",\n\t\t...f,\n\t}),\n\tftTransfer: (f: TriggerArgs<\"ft_transfer\"> = {}): ChainTrigger => ({\n\t\ttype: \"ft_transfer\",\n\t\t...f,\n\t}),\n\tftMint: (f: TriggerArgs<\"ft_mint\"> = {}): ChainTrigger => ({\n\t\ttype: \"ft_mint\",\n\t\t...f,\n\t}),\n\tftBurn: (f: TriggerArgs<\"ft_burn\"> = {}): ChainTrigger => ({\n\t\ttype: \"ft_burn\",\n\t\t...f,\n\t}),\n\tnftTransfer: (f: TriggerArgs<\"nft_transfer\"> = {}): ChainTrigger => ({\n\t\ttype: \"nft_transfer\",\n\t\t...f,\n\t}),\n\tnftMint: (f: TriggerArgs<\"nft_mint\"> = {}): ChainTrigger => ({\n\t\ttype: \"nft_mint\",\n\t\t...f,\n\t}),\n\tnftBurn: (f: TriggerArgs<\"nft_burn\"> = {}): ChainTrigger => ({\n\t\ttype: \"nft_burn\",\n\t\t...f,\n\t}),\n\tcontractCall: (f: TriggerArgs<\"contract_call\"> = {}): ChainTrigger => ({\n\t\ttype: \"contract_call\",\n\t\t...f,\n\t}),\n\tcontractDeploy: (f: TriggerArgs<\"contract_deploy\"> = {}): ChainTrigger => ({\n\t\ttype: \"contract_deploy\",\n\t\t...f,\n\t}),\n\tprintEvent: (f: TriggerArgs<\"print_event\"> = {}): ChainTrigger => ({\n\t\ttype: \"print_event\",\n\t\t...f,\n\t}),\n\tsbtcDeposit: (f: TriggerArgs<\"sbtc_deposit\"> = {}): ChainTrigger => ({\n\t\ttype: \"sbtc_deposit\",\n\t\t...f,\n\t}),\n\tsbtcWithdrawalCreate: (\n\t\tf: TriggerArgs<\"sbtc_withdrawal_create\"> = {},\n\t): ChainTrigger => ({\n\t\ttype: \"sbtc_withdrawal_create\",\n\t\t...f,\n\t}),\n\tsbtcWithdrawalAccept: (\n\t\tf: TriggerArgs<\"sbtc_withdrawal_accept\"> = {},\n\t): ChainTrigger => ({\n\t\ttype: \"sbtc_withdrawal_accept\",\n\t\t...f,\n\t}),\n\tsbtcWithdrawalReject: (\n\t\tf: TriggerArgs<\"sbtc_withdrawal_reject\"> = {},\n\t): ChainTrigger => ({\n\t\ttype: \"sbtc_withdrawal_reject\",\n\t\t...f,\n\t}),\n\tsbtcWithdrawalSweptConfirmed: (\n\t\tf: TriggerArgs<\"sbtc_withdrawal_swept_confirmed\"> = {},\n\t): ChainTrigger => ({\n\t\ttype: \"sbtc_withdrawal_swept_confirmed\",\n\t\t...f,\n\t}),\n} as const;\n\nexport interface CreateWebhookRequest {\n\tname: string;\n\t/** Subgraph mode. */\n\tsubgraphName?: string;\n\ttableName?: string;\n\tfilter?: WebhookFilter;\n\t/** Chain mode. */\n\ttriggers?: ChainTrigger[];\n\turl: string;\n\tformat?: WebhookFormat;\n\truntime?: WebhookRuntime | null;\n\tauthConfig?: Record<string, unknown>;\n\tmaxRetries?: number;\n\ttimeoutMs?: number;\n\tconcurrency?: number;\n}\n\nexport interface ParsedCreateWebhookRequest\n\textends Omit<CreateWebhookRequest, \"format\"> {\n\tformat: WebhookFormat;\n}\n\nexport interface UpdateWebhookRequest {\n\tname?: string;\n\turl?: string;\n\tfilter?: WebhookFilter;\n\tformat?: WebhookFormat;\n\truntime?: WebhookRuntime | null;\n\tauthConfig?: Record<string, unknown>;\n\tmaxRetries?: number;\n\ttimeoutMs?: number;\n\tconcurrency?: number;\n}\n\nexport type ParsedUpdateWebhookRequest = UpdateWebhookRequest;\n\nexport interface ReplayWebhookRequest {\n\tfromBlock: number;\n\ttoBlock: number;\n\tforce?: string;\n}\n\nexport type ParsedReplayWebhookRequest = ReplayWebhookRequest;\n\nexport interface WebhookSummary {\n\tid: string;\n\tname: string;\n\tstatus: WebhookStatus;\n\tkind: WebhookKind;\n\t/** Null for chain webhooks. */\n\tsubgraphName: string | null;\n\t/** Null for chain webhooks. */\n\ttableName: string | null;\n\tformat: WebhookFormat;\n\truntime: WebhookRuntime | null;\n\turl: string;\n\tlastDeliveryAt: string | null;\n\tlastSuccessAt: string | null;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface WebhookDetail extends WebhookSummary {\n\tfilter: Record<string, unknown>;\n\t/** Chain-trigger filters (chain webhooks only). */\n\ttriggers: ChainTrigger[] | null;\n\tauthConfig: Record<string, unknown>;\n\tmaxRetries: number;\n\ttimeoutMs: number;\n\tconcurrency: number;\n\tcircuitFailures: number;\n\tcircuitOpenedAt: string | null;\n\tlastError: string | null;\n}\n\nexport interface CreateWebhookResponse {\n\twebhook: WebhookDetail;\n\t/** Plaintext signing secret — surfaced ONCE. Store it server-side. */\n\tsigningSecret: string;\n}\n\nexport interface RotateSecretResponse {\n\twebhook: WebhookDetail;\n\tsigningSecret: string;\n}\n\nexport interface DeliveryRow {\n\tid: string;\n\tattempt: number;\n\tstatusCode: number | null;\n\terrorMessage: string | null;\n\tdurationMs: number | null;\n\tresponseBody: string | null;\n\tdispatchedAt: string;\n}\n\nexport interface ReplayResult {\n\treplayId: string;\n\tenqueuedCount: number;\n\tscannedCount: number;\n}\n\n/** Result of a one-off test delivery (`POST /:id/test`). Logged as a delivery\n * row (with a null outbox_id) so it shows up under the webhook's deliveries. */\nexport interface WebhookTestResult {\n\tok: boolean;\n\tstatusCode: number | null;\n\terror: string | null;\n\tdurationMs: number;\n\tdeliveryId: string;\n}\n\nexport interface DeadRow {\n\tid: string;\n\teventType: string;\n\tattempt: number;\n\tblockHeight: number;\n\ttxId: string | null;\n\tpayload: Record<string, unknown>;\n\tfailedAt: string | null;\n\tcreatedAt: string;\n}\n\nexport interface WebhookSchemaColumn {\n\ttype?: unknown;\n}\n\nexport interface WebhookSchemaTable {\n\tcolumns: Record<string, WebhookSchemaColumn>;\n}\n\nexport type WebhookSchemaTables = Record<string, WebhookSchemaTable>;\n\nconst SCALAR_COLUMN_TYPES = new Set([\n\t\"text\",\n\t\"uint\",\n\t\"int\",\n\t\"principal\",\n\t\"boolean\",\n\t\"timestamp\",\n]);\n\nconst COMPARISON_COLUMN_TYPES = new Set([\"uint\", \"int\", \"timestamp\"]);\n\nfunction formatIssuePath(path: PropertyKey[]): string {\n\treturn path.length > 0 ? `${path.map(String).join(\".\")}: ` : \"\";\n}\n\nexport function formatWebhookSchemaErrors(error: z.ZodError): string[] {\n\treturn error.issues.map(\n\t\t(issue) => `${formatIssuePath(issue.path)}${issue.message}`,\n\t);\n}\n\nfunction operatorForClause(clause: WebhookFilterClause): string {\n\tif (clause === null || typeof clause !== \"object\" || Array.isArray(clause)) {\n\t\treturn \"eq\";\n\t}\n\treturn Object.keys(clause)[0] ?? \"eq\";\n}\n\nexport function validateWebhookFilterForTable(input: {\n\tsubgraphName?: string;\n\ttableName: string;\n\tfilter?: unknown;\n\ttables: WebhookSchemaTables;\n}): string[] {\n\tconst errors: string[] = [];\n\tconst table = input.tables[input.tableName];\n\tif (!table) {\n\t\tconst names = Object.keys(input.tables);\n\t\terrors.push(\n\t\t\t`Unknown table \"${input.tableName}\"${\n\t\t\t\tinput.subgraphName ? ` in subgraph \"${input.subgraphName}\"` : \"\"\n\t\t\t}.${names.length > 0 ? ` Available tables: ${names.join(\", \")}.` : \"\"}`,\n\t\t);\n\t\treturn errors;\n\t}\n\n\tif (input.filter === undefined) return errors;\n\n\tconst parsed = WebhookFilterSchema.safeParse(input.filter);\n\tif (!parsed.success) {\n\t\treturn formatWebhookSchemaErrors(parsed.error);\n\t}\n\n\tfor (const [field, clause] of Object.entries(parsed.data)) {\n\t\tconst column = table.columns[field];\n\t\tif (!column) {\n\t\t\terrors.push(\n\t\t\t\t`Unknown filter field \"${field}\" on table \"${input.tableName}\".`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst columnType =\n\t\t\ttypeof column.type === \"string\" ? column.type.toLowerCase() : \"\";\n\t\tif (!SCALAR_COLUMN_TYPES.has(columnType)) {\n\t\t\terrors.push(\n\t\t\t\t`Filter field \"${field}\" has unsupported type \"${columnType || \"unknown\"}\"; webhook filters require scalar columns.`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst operator = operatorForClause(clause);\n\t\tif (\n\t\t\t(operator === \"gt\" ||\n\t\t\t\toperator === \"gte\" ||\n\t\t\t\toperator === \"lt\" ||\n\t\t\t\toperator === \"lte\") &&\n\t\t\t!COMPARISON_COLUMN_TYPES.has(columnType)\n\t\t) {\n\t\t\terrors.push(\n\t\t\t\t`Operator \"${operator}\" is not supported for ${columnType} field \"${field}\".`,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn errors;\n}\n"
|
|
5
|
+
"import { z } from \"zod\";\n\nexport const WEBHOOK_FORMATS = [\n\t\"standard-webhooks\",\n\t\"inngest\",\n\t\"trigger\",\n\t\"cloudflare\",\n\t\"cloudevents\",\n\t\"raw\",\n] as const;\n\nexport const WEBHOOK_RUNTIMES = [\n\t\"inngest\",\n\t\"trigger\",\n\t\"cloudflare\",\n\t\"node\",\n] as const;\n\nexport const WEBHOOK_STATUSES = [\"active\", \"paused\", \"error\"] as const;\n\nexport const WEBHOOK_FILTER_OPERATORS = [\n\t\"eq\",\n\t\"neq\",\n\t\"gt\",\n\t\"gte\",\n\t\"lt\",\n\t\"lte\",\n\t\"in\",\n] as const;\n\nconst webhookUrl = z\n\t.string()\n\t.trim()\n\t.min(1)\n\t.refine(\n\t\t(value) => value.startsWith(\"http://\") || value.startsWith(\"https://\"),\n\t\t\"must be an http(s) URL\",\n\t);\n\nconst name = z.string().trim().min(1).max(128);\nconst resourceName = z.string().trim().min(1).max(128);\n\nexport const WebhookStatusSchema: z.ZodType<WebhookStatus> =\n\tz.enum(WEBHOOK_STATUSES);\nexport const WebhookFormatSchema: z.ZodType<WebhookFormat> =\n\tz.enum(WEBHOOK_FORMATS);\nexport const WebhookRuntimeSchema: z.ZodType<WebhookRuntime> =\n\tz.enum(WEBHOOK_RUNTIMES);\n\nexport const WebhookFilterPrimitiveSchema: z.ZodType<WebhookFilterPrimitive> =\n\tz.union([z.string(), z.number().finite(), z.boolean()]);\n\nexport const WebhookFilterOperatorSchema: z.ZodType<WebhookFilterOperator> =\n\tz.union([\n\t\tz.object({ eq: WebhookFilterPrimitiveSchema }).strict(),\n\t\tz.object({ neq: WebhookFilterPrimitiveSchema }).strict(),\n\t\tz.object({ gt: z.union([z.string(), z.number().finite()]) }).strict(),\n\t\tz.object({ gte: z.union([z.string(), z.number().finite()]) }).strict(),\n\t\tz.object({ lt: z.union([z.string(), z.number().finite()]) }).strict(),\n\t\tz.object({ lte: z.union([z.string(), z.number().finite()]) }).strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\tin: z.array(WebhookFilterPrimitiveSchema).min(1),\n\t\t\t})\n\t\t\t.strict(),\n\t]);\n\nexport const WebhookFilterClauseSchema: z.ZodType<WebhookFilterClause> =\n\tz.union([WebhookFilterPrimitiveSchema, WebhookFilterOperatorSchema]);\n\nexport const WebhookFilterSchema: z.ZodType<WebhookFilter> = z.record(\n\tz.string().min(1),\n\tWebhookFilterClauseSchema,\n);\n\n// --- Chain triggers (direct chain-level webhooks) -----------------------\n// A chain webhook reacts to raw chain events matched directly off the\n// Index/Streams clock (no subgraph). `triggers` is an array of these filters —\n// the JSON mirror of the subgraph runtime's `SubgraphFilter` union. Defined\n// here (not imported from @secondlayer/subgraphs) to avoid a shared→subgraphs\n// cycle; the evaluator maps these to `SubgraphFilter` at match time. Amounts are\n// non-negative integer strings (uint128 can exceed JS safe-int) or numbers.\n\nexport const CHAIN_TRIGGER_TYPES = [\n\t\"stx_transfer\",\n\t\"stx_mint\",\n\t\"stx_burn\",\n\t\"stx_lock\",\n\t\"ft_transfer\",\n\t\"ft_mint\",\n\t\"ft_burn\",\n\t\"nft_transfer\",\n\t\"nft_mint\",\n\t\"nft_burn\",\n\t\"contract_call\",\n\t\"contract_deploy\",\n\t\"print_event\",\n\t\"nested_contract_call\",\n\t\"var_set\",\n\t\"map_set\",\n\t\"map_insert\",\n\t\"map_delete\",\n\t\"sbtc_deposit\",\n\t\"sbtc_withdrawal_create\",\n\t\"sbtc_withdrawal_accept\",\n\t\"sbtc_withdrawal_reject\",\n\t\"sbtc_withdrawal_swept_confirmed\",\n] as const;\n\nconst triggerAmount = z.union([\n\tz.string().trim().regex(/^\\d+$/, \"must be a non-negative integer string\"),\n\tz.number().int().nonnegative(),\n]);\n/** Principal/identifier/name patterns — `*` wildcards allowed (matched by the\n * evaluator). */\nconst triggerPattern = z.string().trim().min(1);\nconst trait = z.string().trim().min(1);\n\nexport const ChainTriggerSchema: z.ZodType<ChainTrigger> = z.discriminatedUnion(\n\t\"type\",\n\t[\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"stx_transfer\"),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\trecipient: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t\tmaxAmount: triggerAmount.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"stx_mint\"),\n\t\t\t\trecipient: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"stx_burn\"),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"stx_lock\"),\n\t\t\t\tlockedAddress: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"ft_transfer\"),\n\t\t\t\tassetIdentifier: triggerPattern.optional(),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\trecipient: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"ft_mint\"),\n\t\t\t\tassetIdentifier: triggerPattern.optional(),\n\t\t\t\trecipient: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"ft_burn\"),\n\t\t\t\tassetIdentifier: triggerPattern.optional(),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"nft_transfer\"),\n\t\t\t\tassetIdentifier: triggerPattern.optional(),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\trecipient: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"nft_mint\"),\n\t\t\t\tassetIdentifier: triggerPattern.optional(),\n\t\t\t\trecipient: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"nft_burn\"),\n\t\t\t\tassetIdentifier: triggerPattern.optional(),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"contract_call\"),\n\t\t\t\tcontractId: triggerPattern.optional(),\n\t\t\t\tfunctionName: triggerPattern.optional(),\n\t\t\t\tcaller: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"contract_deploy\"),\n\t\t\t\tdeployer: triggerPattern.optional(),\n\t\t\t\tcontractName: triggerPattern.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"print_event\"),\n\t\t\t\tcontractId: triggerPattern.optional(),\n\t\t\t\ttopic: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"nested_contract_call\"),\n\t\t\t\tcontractId: triggerPattern.optional(),\n\t\t\t\tfunctionName: triggerPattern.optional(),\n\t\t\t\tcaller: triggerPattern.optional(),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"var_set\"),\n\t\t\t\tcontractId: triggerPattern.optional(),\n\t\t\t\tvarName: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"map_set\"),\n\t\t\t\tcontractId: triggerPattern.optional(),\n\t\t\t\tmap: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"map_insert\"),\n\t\t\t\tcontractId: triggerPattern.optional(),\n\t\t\t\tmap: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"map_delete\"),\n\t\t\t\tcontractId: triggerPattern.optional(),\n\t\t\t\tmap: triggerPattern.optional(),\n\t\t\t\ttrait: trait.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"sbtc_deposit\"),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t\tmaxAmount: triggerAmount.optional(),\n\t\t\t\tbitcoinTxid: triggerPattern.optional(),\n\t\t\t\trequestId: z.number().int().nonnegative().optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"sbtc_withdrawal_create\"),\n\t\t\t\tsender: triggerPattern.optional(),\n\t\t\t\tminAmount: triggerAmount.optional(),\n\t\t\t\tmaxAmount: triggerAmount.optional(),\n\t\t\t\trequestId: z.number().int().nonnegative().optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"sbtc_withdrawal_accept\"),\n\t\t\t\trequestId: z.number().int().nonnegative().optional(),\n\t\t\t\tsweepTxid: triggerPattern.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"sbtc_withdrawal_reject\"),\n\t\t\t\trequestId: z.number().int().nonnegative().optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal(\"sbtc_withdrawal_swept_confirmed\"),\n\t\t\t\trequestId: z.number().int().nonnegative().optional(),\n\t\t\t\tsweepTxid: triggerPattern.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t],\n);\n\nexport const ChainTriggersSchema: z.ZodType<ChainTrigger[]> = z\n\t.array(ChainTriggerSchema)\n\t.min(1)\n\t.max(50);\n\n/**\n * Per-type accepted filter fields for chain triggers, DERIVED from\n * {@link ChainTriggerSchema} so the agent-facing reference can never drift behind\n * the validator. `{ stx_transfer: [\"sender\",\"recipient\",\"minAmount\",\"maxAmount\"], ... }`.\n */\nexport const CHAIN_TRIGGER_FIELDS: Record<string, string[]> =\n\tObject.fromEntries(\n\t\t// biome-ignore lint/suspicious/noExplicitAny: zod-internal introspection of this module's own discriminated union\n\t\t((ChainTriggerSchema as any)._zod.def.options as any[]).map((opt) => {\n\t\t\tconst shape = opt._zod.def.shape as Record<string, unknown>;\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: literal value lives on the zod-internal def\n\t\t\tconst type = (shape.type as any)._zod.def.values[0] as string;\n\t\t\treturn [type, Object.keys(shape).filter((k) => k !== \"type\")];\n\t\t}),\n\t);\n\nexport const CreateWebhookRequestSchema: z.ZodType<ParsedCreateWebhookRequest> =\n\tz\n\t\t.object({\n\t\t\tname,\n\t\t\t// Subgraph mode (kind=subgraph): subgraphName + tableName + optional filter.\n\t\t\tsubgraphName: resourceName.optional(),\n\t\t\ttableName: resourceName.optional(),\n\t\t\tfilter: WebhookFilterSchema.optional(),\n\t\t\t// Chain mode (kind=chain): triggers.\n\t\t\ttriggers: ChainTriggersSchema.optional(),\n\t\t\turl: webhookUrl,\n\t\t\tformat: WebhookFormatSchema.default(\"standard-webhooks\"),\n\t\t\truntime: WebhookRuntimeSchema.nullable().optional(),\n\t\t\tauthConfig: z.record(z.string(), z.unknown()).optional(),\n\t\t\tmaxRetries: z.number().int().min(0).max(100).optional(),\n\t\t\ttimeoutMs: z.number().int().min(100).max(300_000).optional(),\n\t\t\tconcurrency: z.number().int().min(1).max(100).optional(),\n\t\t})\n\t\t.refine(\n\t\t\t(v) => {\n\t\t\t\tconst subgraphMode =\n\t\t\t\t\tv.subgraphName !== undefined || v.tableName !== undefined;\n\t\t\t\tconst chainMode = v.triggers !== undefined;\n\t\t\t\tif (chainMode && subgraphMode) return false;\n\t\t\t\tif (chainMode) return true;\n\t\t\t\t// Subgraph mode requires BOTH subgraphName and tableName.\n\t\t\t\treturn v.subgraphName !== undefined && v.tableName !== undefined;\n\t\t\t},\n\t\t\t{\n\t\t\t\tmessage:\n\t\t\t\t\t\"provide either { subgraphName, tableName } for a subgraph webhook OR { triggers } for a chain webhook — not both\",\n\t\t\t},\n\t\t)\n\t\t.refine((v) => v.filter === undefined || v.triggers === undefined, {\n\t\t\tmessage:\n\t\t\t\t\"`filter` applies to subgraph webhooks; chain webhooks use `triggers`\",\n\t\t\tpath: [\"filter\"],\n\t\t});\n\nexport const UpdateWebhookRequestSchema: z.ZodType<UpdateWebhookRequest> = z\n\t.object({\n\t\tname: name.optional(),\n\t\turl: webhookUrl.optional(),\n\t\tfilter: WebhookFilterSchema.optional(),\n\t\tformat: WebhookFormatSchema.optional(),\n\t\truntime: WebhookRuntimeSchema.nullable().optional(),\n\t\tauthConfig: z.record(z.string(), z.unknown()).optional(),\n\t\tmaxRetries: z.number().int().min(0).max(100).optional(),\n\t\ttimeoutMs: z.number().int().min(100).max(300_000).optional(),\n\t\tconcurrency: z.number().int().min(1).max(100).optional(),\n\t})\n\t.refine((value) => Object.keys(value).length > 0, {\n\t\tmessage: \"At least one field must be provided\",\n\t});\n\nexport const ReplayWebhookRequestSchema: z.ZodType<ReplayWebhookRequest> = z\n\t.object({\n\t\tfromBlock: z.number().int().nonnegative(),\n\t\ttoBlock: z.number().int().nonnegative(),\n\t\tforce: z.string().trim().min(1).max(64).optional(),\n\t})\n\t.refine((value) => value.fromBlock <= value.toBlock, {\n\t\tmessage: \"fromBlock must be less than or equal to toBlock\",\n\t\tpath: [\"toBlock\"],\n\t});\n\nexport type WebhookStatus = (typeof WEBHOOK_STATUSES)[number];\n/** Polymorphic webhook mode (mirrors db/types `WebhookKind`). */\nexport type WebhookKind = \"subgraph\" | \"chain\";\nexport type WebhookFormat = (typeof WEBHOOK_FORMATS)[number];\nexport type WebhookRuntime = (typeof WEBHOOK_RUNTIMES)[number];\nexport type WebhookFilterPrimitive = string | number | boolean;\nexport type WebhookFilterOperator =\n\t| { eq: WebhookFilterPrimitive }\n\t| { neq: WebhookFilterPrimitive }\n\t| { gt: string | number }\n\t| { gte: string | number }\n\t| { lt: string | number }\n\t| { lte: string | number }\n\t| { in: WebhookFilterPrimitive[] };\nexport type WebhookFilterClause =\n\t| WebhookFilterPrimitive\n\t| WebhookFilterOperator;\nexport type WebhookFilter = Record<string, WebhookFilterClause>;\n\nexport type ChainTriggerType = (typeof CHAIN_TRIGGER_TYPES)[number];\n/** Non-negative integer amount over JSON (string for uint128 safety, or number). */\nexport type ChainTriggerAmount = string | number;\n\ninterface TraitScoped {\n\ttrait?: string;\n}\n\n/** JSON mirror of the subgraph runtime's `SubgraphFilter` union. */\nexport type ChainTrigger =\n\t| {\n\t\t\ttype: \"stx_transfer\";\n\t\t\tsender?: string;\n\t\t\trecipient?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t\t\tmaxAmount?: ChainTriggerAmount;\n\t }\n\t| { type: \"stx_mint\"; recipient?: string; minAmount?: ChainTriggerAmount }\n\t| { type: \"stx_burn\"; sender?: string; minAmount?: ChainTriggerAmount }\n\t| {\n\t\t\ttype: \"stx_lock\";\n\t\t\tlockedAddress?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t }\n\t| ({\n\t\t\ttype: \"ft_transfer\";\n\t\t\tassetIdentifier?: string;\n\t\t\tsender?: string;\n\t\t\trecipient?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"ft_mint\";\n\t\t\tassetIdentifier?: string;\n\t\t\trecipient?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"ft_burn\";\n\t\t\tassetIdentifier?: string;\n\t\t\tsender?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"nft_transfer\";\n\t\t\tassetIdentifier?: string;\n\t\t\tsender?: string;\n\t\t\trecipient?: string;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"nft_mint\";\n\t\t\tassetIdentifier?: string;\n\t\t\trecipient?: string;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"nft_burn\";\n\t\t\tassetIdentifier?: string;\n\t\t\tsender?: string;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"contract_call\";\n\t\t\tcontractId?: string;\n\t\t\tfunctionName?: string;\n\t\t\tcaller?: string;\n\t } & TraitScoped)\n\t| { type: \"contract_deploy\"; deployer?: string; contractName?: string }\n\t| ({\n\t\t\ttype: \"print_event\";\n\t\t\tcontractId?: string;\n\t\t\ttopic?: string;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"nested_contract_call\";\n\t\t\tcontractId?: string;\n\t\t\tfunctionName?: string;\n\t\t\tcaller?: string;\n\t\t\tsender?: string;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"var_set\";\n\t\t\tcontractId?: string;\n\t\t\tvarName?: string;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"map_set\";\n\t\t\tcontractId?: string;\n\t\t\tmap?: string;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"map_insert\";\n\t\t\tcontractId?: string;\n\t\t\tmap?: string;\n\t } & TraitScoped)\n\t| ({\n\t\t\ttype: \"map_delete\";\n\t\t\tcontractId?: string;\n\t\t\tmap?: string;\n\t } & TraitScoped)\n\t| {\n\t\t\ttype: \"sbtc_deposit\";\n\t\t\tsender?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t\t\tmaxAmount?: ChainTriggerAmount;\n\t\t\tbitcoinTxid?: string;\n\t\t\trequestId?: number;\n\t }\n\t| {\n\t\t\ttype: \"sbtc_withdrawal_create\";\n\t\t\tsender?: string;\n\t\t\tminAmount?: ChainTriggerAmount;\n\t\t\tmaxAmount?: ChainTriggerAmount;\n\t\t\trequestId?: number;\n\t }\n\t| {\n\t\t\ttype: \"sbtc_withdrawal_accept\";\n\t\t\trequestId?: number;\n\t\t\tsweepTxid?: string;\n\t }\n\t| { type: \"sbtc_withdrawal_reject\"; requestId?: number }\n\t| {\n\t\t\ttype: \"sbtc_withdrawal_swept_confirmed\";\n\t\t\trequestId?: number;\n\t\t\tsweepTxid?: string;\n\t };\n\n/** Args for a chain-trigger builder — every field of a variant except `type`. */\ntype TriggerArgs<T extends ChainTrigger[\"type\"]> = Omit<\n\tExtract<ChainTrigger, { type: T }>,\n\t\"type\"\n>;\n\n/**\n * Ergonomic chain-trigger constructors for `webhooks.create({ triggers })`.\n * Each returns a bare `ChainTrigger` (the wire shape the API expects):\n *\n * ```ts\n * client.webhooks.create({\n * url: \"https://my.app/webhook\",\n * triggers: [trigger.contractCall({ contractId: \"SP....amm\", functionName: \"swap-*\" })],\n * });\n * ```\n */\nexport const trigger = {\n\tstxTransfer: (f: TriggerArgs<\"stx_transfer\"> = {}): ChainTrigger => ({\n\t\ttype: \"stx_transfer\",\n\t\t...f,\n\t}),\n\tstxMint: (f: TriggerArgs<\"stx_mint\"> = {}): ChainTrigger => ({\n\t\ttype: \"stx_mint\",\n\t\t...f,\n\t}),\n\tstxBurn: (f: TriggerArgs<\"stx_burn\"> = {}): ChainTrigger => ({\n\t\ttype: \"stx_burn\",\n\t\t...f,\n\t}),\n\tstxLock: (f: TriggerArgs<\"stx_lock\"> = {}): ChainTrigger => ({\n\t\ttype: \"stx_lock\",\n\t\t...f,\n\t}),\n\tftTransfer: (f: TriggerArgs<\"ft_transfer\"> = {}): ChainTrigger => ({\n\t\ttype: \"ft_transfer\",\n\t\t...f,\n\t}),\n\tftMint: (f: TriggerArgs<\"ft_mint\"> = {}): ChainTrigger => ({\n\t\ttype: \"ft_mint\",\n\t\t...f,\n\t}),\n\tftBurn: (f: TriggerArgs<\"ft_burn\"> = {}): ChainTrigger => ({\n\t\ttype: \"ft_burn\",\n\t\t...f,\n\t}),\n\tnftTransfer: (f: TriggerArgs<\"nft_transfer\"> = {}): ChainTrigger => ({\n\t\ttype: \"nft_transfer\",\n\t\t...f,\n\t}),\n\tnftMint: (f: TriggerArgs<\"nft_mint\"> = {}): ChainTrigger => ({\n\t\ttype: \"nft_mint\",\n\t\t...f,\n\t}),\n\tnftBurn: (f: TriggerArgs<\"nft_burn\"> = {}): ChainTrigger => ({\n\t\ttype: \"nft_burn\",\n\t\t...f,\n\t}),\n\tcontractCall: (f: TriggerArgs<\"contract_call\"> = {}): ChainTrigger => ({\n\t\ttype: \"contract_call\",\n\t\t...f,\n\t}),\n\tcontractDeploy: (f: TriggerArgs<\"contract_deploy\"> = {}): ChainTrigger => ({\n\t\ttype: \"contract_deploy\",\n\t\t...f,\n\t}),\n\tprintEvent: (f: TriggerArgs<\"print_event\"> = {}): ChainTrigger => ({\n\t\ttype: \"print_event\",\n\t\t...f,\n\t}),\n\tsbtcDeposit: (f: TriggerArgs<\"sbtc_deposit\"> = {}): ChainTrigger => ({\n\t\ttype: \"sbtc_deposit\",\n\t\t...f,\n\t}),\n\tsbtcWithdrawalCreate: (\n\t\tf: TriggerArgs<\"sbtc_withdrawal_create\"> = {},\n\t): ChainTrigger => ({\n\t\ttype: \"sbtc_withdrawal_create\",\n\t\t...f,\n\t}),\n\tsbtcWithdrawalAccept: (\n\t\tf: TriggerArgs<\"sbtc_withdrawal_accept\"> = {},\n\t): ChainTrigger => ({\n\t\ttype: \"sbtc_withdrawal_accept\",\n\t\t...f,\n\t}),\n\tsbtcWithdrawalReject: (\n\t\tf: TriggerArgs<\"sbtc_withdrawal_reject\"> = {},\n\t): ChainTrigger => ({\n\t\ttype: \"sbtc_withdrawal_reject\",\n\t\t...f,\n\t}),\n\tsbtcWithdrawalSweptConfirmed: (\n\t\tf: TriggerArgs<\"sbtc_withdrawal_swept_confirmed\"> = {},\n\t): ChainTrigger => ({\n\t\ttype: \"sbtc_withdrawal_swept_confirmed\",\n\t\t...f,\n\t}),\n} as const;\n\nexport interface CreateWebhookRequest {\n\tname: string;\n\t/** Subgraph mode. */\n\tsubgraphName?: string;\n\ttableName?: string;\n\tfilter?: WebhookFilter;\n\t/** Chain mode. */\n\ttriggers?: ChainTrigger[];\n\turl: string;\n\tformat?: WebhookFormat;\n\truntime?: WebhookRuntime | null;\n\tauthConfig?: Record<string, unknown>;\n\tmaxRetries?: number;\n\ttimeoutMs?: number;\n\tconcurrency?: number;\n}\n\nexport interface ParsedCreateWebhookRequest\n\textends Omit<CreateWebhookRequest, \"format\"> {\n\tformat: WebhookFormat;\n}\n\nexport interface UpdateWebhookRequest {\n\tname?: string;\n\turl?: string;\n\tfilter?: WebhookFilter;\n\tformat?: WebhookFormat;\n\truntime?: WebhookRuntime | null;\n\tauthConfig?: Record<string, unknown>;\n\tmaxRetries?: number;\n\ttimeoutMs?: number;\n\tconcurrency?: number;\n}\n\nexport type ParsedUpdateWebhookRequest = UpdateWebhookRequest;\n\nexport interface ReplayWebhookRequest {\n\tfromBlock: number;\n\ttoBlock: number;\n\tforce?: string;\n}\n\nexport type ParsedReplayWebhookRequest = ReplayWebhookRequest;\n\nexport interface WebhookSummary {\n\tid: string;\n\tname: string;\n\tstatus: WebhookStatus;\n\tkind: WebhookKind;\n\t/** Null for chain webhooks. */\n\tsubgraphName: string | null;\n\t/** Null for chain webhooks. */\n\ttableName: string | null;\n\tformat: WebhookFormat;\n\truntime: WebhookRuntime | null;\n\turl: string;\n\tlastDeliveryAt: string | null;\n\tlastSuccessAt: string | null;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface WebhookDetail extends WebhookSummary {\n\tfilter: Record<string, unknown>;\n\t/** Chain-trigger filters (chain webhooks only). */\n\ttriggers: ChainTrigger[] | null;\n\tauthConfig: Record<string, unknown>;\n\tmaxRetries: number;\n\ttimeoutMs: number;\n\tconcurrency: number;\n\tcircuitFailures: number;\n\tcircuitOpenedAt: string | null;\n\tlastError: string | null;\n}\n\nexport interface CreateWebhookResponse {\n\twebhook: WebhookDetail;\n\t/** Plaintext signing secret — surfaced ONCE. Store it server-side. */\n\tsigningSecret: string;\n}\n\nexport interface RotateSecretResponse {\n\twebhook: WebhookDetail;\n\tsigningSecret: string;\n}\n\nexport interface DeliveryRow {\n\tid: string;\n\tattempt: number;\n\tstatusCode: number | null;\n\terrorMessage: string | null;\n\tdurationMs: number | null;\n\tresponseBody: string | null;\n\tdispatchedAt: string;\n}\n\nexport interface ReplayResult {\n\treplayId: string;\n\tenqueuedCount: number;\n\tscannedCount: number;\n}\n\n/** Result of a one-off test delivery (`POST /:id/test`). Logged as a delivery\n * row (with a null outbox_id) so it shows up under the webhook's deliveries. */\nexport interface WebhookTestResult {\n\tok: boolean;\n\tstatusCode: number | null;\n\terror: string | null;\n\tdurationMs: number;\n\tdeliveryId: string;\n}\n\nexport interface DeadRow {\n\tid: string;\n\teventType: string;\n\tattempt: number;\n\tblockHeight: number;\n\ttxId: string | null;\n\tpayload: Record<string, unknown>;\n\tfailedAt: string | null;\n\tcreatedAt: string;\n}\n\nexport interface WebhookSchemaColumn {\n\ttype?: unknown;\n}\n\nexport interface WebhookSchemaTable {\n\tcolumns: Record<string, WebhookSchemaColumn>;\n}\n\nexport type WebhookSchemaTables = Record<string, WebhookSchemaTable>;\n\nconst SCALAR_COLUMN_TYPES = new Set([\n\t\"text\",\n\t\"uint\",\n\t\"int\",\n\t\"principal\",\n\t\"boolean\",\n\t\"timestamp\",\n]);\n\nconst COMPARISON_COLUMN_TYPES = new Set([\"uint\", \"int\", \"timestamp\"]);\n\nfunction formatIssuePath(path: PropertyKey[]): string {\n\treturn path.length > 0 ? `${path.map(String).join(\".\")}: ` : \"\";\n}\n\nexport function formatWebhookSchemaErrors(error: z.ZodError): string[] {\n\treturn error.issues.map(\n\t\t(issue) => `${formatIssuePath(issue.path)}${issue.message}`,\n\t);\n}\n\nfunction operatorForClause(clause: WebhookFilterClause): string {\n\tif (clause === null || typeof clause !== \"object\" || Array.isArray(clause)) {\n\t\treturn \"eq\";\n\t}\n\treturn Object.keys(clause)[0] ?? \"eq\";\n}\n\nexport function validateWebhookFilterForTable(input: {\n\tsubgraphName?: string;\n\ttableName: string;\n\tfilter?: unknown;\n\ttables: WebhookSchemaTables;\n}): string[] {\n\tconst errors: string[] = [];\n\tconst table = input.tables[input.tableName];\n\tif (!table) {\n\t\tconst names = Object.keys(input.tables);\n\t\terrors.push(\n\t\t\t`Unknown table \"${input.tableName}\"${\n\t\t\t\tinput.subgraphName ? ` in subgraph \"${input.subgraphName}\"` : \"\"\n\t\t\t}.${names.length > 0 ? ` Available tables: ${names.join(\", \")}.` : \"\"}`,\n\t\t);\n\t\treturn errors;\n\t}\n\n\tif (input.filter === undefined) return errors;\n\n\tconst parsed = WebhookFilterSchema.safeParse(input.filter);\n\tif (!parsed.success) {\n\t\treturn formatWebhookSchemaErrors(parsed.error);\n\t}\n\n\tfor (const [field, clause] of Object.entries(parsed.data)) {\n\t\tconst column = table.columns[field];\n\t\tif (!column) {\n\t\t\terrors.push(\n\t\t\t\t`Unknown filter field \"${field}\" on table \"${input.tableName}\".`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst columnType =\n\t\t\ttypeof column.type === \"string\" ? column.type.toLowerCase() : \"\";\n\t\tif (!SCALAR_COLUMN_TYPES.has(columnType)) {\n\t\t\terrors.push(\n\t\t\t\t`Filter field \"${field}\" has unsupported type \"${columnType || \"unknown\"}\"; webhook filters require scalar columns.`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst operator = operatorForClause(clause);\n\t\tif (\n\t\t\t(operator === \"gt\" ||\n\t\t\t\toperator === \"gte\" ||\n\t\t\t\toperator === \"lt\" ||\n\t\t\t\toperator === \"lte\") &&\n\t\t\t!COMPARISON_COLUMN_TYPES.has(columnType)\n\t\t) {\n\t\t\terrors.push(\n\t\t\t\t`Operator \"${operator}\" is not supported for ${columnType} field \"${field}\".`,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn errors;\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "1BC43B557BD63FCF64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -6,6 +6,7 @@ declare function toJsonSafe(value: unknown): unknown;
|
|
|
6
6
|
declare function decodeClarityValue(hex: string): unknown;
|
|
7
7
|
import { DECODED_EVENT_TYPES } from "@secondlayer/stacks/filters";
|
|
8
8
|
import { DecodedEventType } from "@secondlayer/stacks/filters";
|
|
9
|
+
import { VmEventType } from "@secondlayer/stacks/filters";
|
|
9
10
|
/** Alias kept for the Streams surface (identical to {@link DECODED_EVENT_TYPES}).
|
|
10
11
|
* Explicit type annotation required — isolatedDeclarations emits `unknown` for
|
|
11
12
|
* a bare const-to-const alias. */
|
|
@@ -118,6 +119,47 @@ type StreamsEventOf<
|
|
|
118
119
|
/** A raw Streams event. Discriminated on `event_type`, so `event.payload`
|
|
119
120
|
* narrows to the matching payload shape once the type is checked. */
|
|
120
121
|
type StreamsEvent = StreamsEventOf<"stx_transfer", StxTransferPayload> | StreamsEventOf<"stx_mint", StxMintPayload> | StreamsEventOf<"stx_burn", StxBurnPayload> | StreamsEventOf<"stx_lock", StxLockPayload> | StreamsEventOf<"ft_transfer", FtTransferPayload> | StreamsEventOf<"ft_mint", FtMintPayload> | StreamsEventOf<"ft_burn", FtBurnPayload> | StreamsEventOf<"nft_transfer", NftTransferPayload> | StreamsEventOf<"nft_mint", NftMintPayload> | StreamsEventOf<"nft_burn", NftBurnPayload> | StreamsEventOf<"print", PrintPayload>;
|
|
122
|
+
type NestedContractCallPayload = {
|
|
123
|
+
contract_identifier: string
|
|
124
|
+
/** tx-sender (the signer). `null` when the VM had none. */
|
|
125
|
+
sender: string | null
|
|
126
|
+
/** The contract that issued `contract-call?`. */
|
|
127
|
+
caller: string
|
|
128
|
+
function_name: string
|
|
129
|
+
/** Clarity hex per argument. */
|
|
130
|
+
function_args: string[]
|
|
131
|
+
raw_result: string
|
|
132
|
+
};
|
|
133
|
+
type VarSetPayload = {
|
|
134
|
+
contract_identifier: string
|
|
135
|
+
var_name: string
|
|
136
|
+
raw_value: string
|
|
137
|
+
};
|
|
138
|
+
type MapWritePayload = {
|
|
139
|
+
contract_identifier: string
|
|
140
|
+
map_name: string
|
|
141
|
+
raw_key: string
|
|
142
|
+
raw_value: string
|
|
143
|
+
};
|
|
144
|
+
type MapDeletePayload = {
|
|
145
|
+
contract_identifier: string
|
|
146
|
+
map_name: string
|
|
147
|
+
raw_key: string
|
|
148
|
+
};
|
|
149
|
+
type VmStreamsEventOf<
|
|
150
|
+
T extends VmEventType,
|
|
151
|
+
P
|
|
152
|
+
> = StreamsEventBase & {
|
|
153
|
+
event_type: T
|
|
154
|
+
payload: P
|
|
155
|
+
};
|
|
156
|
+
/** A Streams `clock=vm` row. Same envelope as {@link StreamsEvent}; the
|
|
157
|
+
* discriminator is one of the five VM_EVENT_TYPES and `event_index` is
|
|
158
|
+
* `ordinal`. */
|
|
159
|
+
type VmStreamsEvent = VmStreamsEventOf<"nested_contract_call", NestedContractCallPayload> | VmStreamsEventOf<"var_set", VarSetPayload> | VmStreamsEventOf<"map_set", MapWritePayload> | VmStreamsEventOf<"map_insert", MapWritePayload> | VmStreamsEventOf<"map_delete", MapDeletePayload>;
|
|
160
|
+
/** Anything `GET /v1/streams/events` can return: Streams 1.0 rows on the
|
|
161
|
+
* classic clock, or vm rows on `clock=vm`. A response never mixes the two. */
|
|
162
|
+
type StreamsWireEvent = StreamsEvent | VmStreamsEvent;
|
|
121
163
|
/** Superset of the columns the decoded_events table holds. Every decoded
|
|
122
164
|
* event's `decoded_payload` is assignable to this, so the indexer's writer
|
|
123
165
|
* can map columns generically instead of per-event-type. */
|
|
@@ -396,4 +438,4 @@ declare function decodeNftBurn(event: StreamsEvent): DecodedNftBurn;
|
|
|
396
438
|
/** Union of every decoded DB-row shape the guard+decode pairs produce —
|
|
397
439
|
* exactly what the `decoded_events` table stores. */
|
|
398
440
|
type DecodedEventRow = DecodedFtTransfer | DecodedNftTransfer | DecodedStxTransfer | DecodedStxMint | DecodedStxBurn | DecodedStxLock | DecodedFtMint | DecodedFtBurn | DecodedNftMint | DecodedNftBurn | DecodedPrint;
|
|
399
|
-
export { toJsonSafe, requireString, requireHexValue, requireAmountField, requireAmount, parseAssetIdentifier, optionalString, isStxTransfer, isStxMint, isStxLock, isStxBurn, isPrint, isNftTransfer, isNftMint, isNftBurn, isFtTransfer, isFtMint, isFtBurn, decodedRow, decodeStxTransfer, decodeStxMint, decodeStxLock, decodeStxBurn, decodePrint, decodeNftTransfer, decodeNftMint, decodeNftBurn, decodeFtTransfer, decodeFtMint, decodeFtBurn, decodeClarityValue, StxTransferPayload, StxMintPayload, StxLockPayload, StxBurnPayload, StreamsEventType, StreamsEventPayload, StreamsEventBase, StreamsEvent, StreamsClarityValue, STREAMS_EVENT_TYPES, PrintPayload, NftTransferPayload, NftTransferEvent, NftMintPayload, NftBurnPayload, FtTransferPayload, FtTransferEvent, FtMintPayload, FtBurnPayload, DecodedStxTransferPayload, DecodedStxTransfer, DecodedStxMintPayload, DecodedStxMint, DecodedStxLockPayload, DecodedStxLock, DecodedStxBurnPayload, DecodedStxBurn, DecodedPrintValue, DecodedPrintPayload, DecodedPrint, DecodedNftTransferPayload, DecodedNftTransfer, DecodedNftMintPayload, DecodedNftMint, DecodedNftBurnPayload, DecodedNftBurn, DecodedFtTransferPayload, DecodedFtTransfer, DecodedFtMintPayload, DecodedFtMint, DecodedFtBurnPayload, DecodedFtBurn, DecodedEventRow, DecodedEventColumns };
|
|
441
|
+
export { toJsonSafe, requireString, requireHexValue, requireAmountField, requireAmount, parseAssetIdentifier, optionalString, isStxTransfer, isStxMint, isStxLock, isStxBurn, isPrint, isNftTransfer, isNftMint, isNftBurn, isFtTransfer, isFtMint, isFtBurn, decodedRow, decodeStxTransfer, decodeStxMint, decodeStxLock, decodeStxBurn, decodePrint, decodeNftTransfer, decodeNftMint, decodeNftBurn, decodeFtTransfer, decodeFtMint, decodeFtBurn, decodeClarityValue, VmStreamsEvent, VarSetPayload, StxTransferPayload, StxMintPayload, StxLockPayload, StxBurnPayload, StreamsWireEvent, StreamsEventType, StreamsEventPayload, StreamsEventBase, StreamsEvent, StreamsClarityValue, STREAMS_EVENT_TYPES, PrintPayload, NftTransferPayload, NftTransferEvent, NftMintPayload, NftBurnPayload, NestedContractCallPayload, MapWritePayload, MapDeletePayload, FtTransferPayload, FtTransferEvent, FtMintPayload, FtBurnPayload, DecodedStxTransferPayload, DecodedStxTransfer, DecodedStxMintPayload, DecodedStxMint, DecodedStxLockPayload, DecodedStxLock, DecodedStxBurnPayload, DecodedStxBurn, DecodedPrintValue, DecodedPrintPayload, DecodedPrint, DecodedNftTransferPayload, DecodedNftTransfer, DecodedNftMintPayload, DecodedNftMint, DecodedNftBurnPayload, DecodedNftBurn, DecodedFtTransferPayload, DecodedFtTransfer, DecodedFtMintPayload, DecodedFtMint, DecodedFtBurnPayload, DecodedFtBurn, DecodedEventRow, DecodedEventColumns };
|
|
@@ -39,10 +39,21 @@ function decodeClarityValue(hex) {
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
// src/event-types.ts
|
|
42
|
-
import { DECODED_EVENT_TYPES } from "@secondlayer/stacks/filters";
|
|
43
42
|
import {
|
|
44
|
-
DECODED_EVENT_TYPES
|
|
43
|
+
DECODED_EVENT_TYPES
|
|
45
44
|
} from "@secondlayer/stacks/filters";
|
|
45
|
+
import {
|
|
46
|
+
DECODED_EVENT_TYPES as DECODED_EVENT_TYPES2,
|
|
47
|
+
VM_EVENT_TYPES,
|
|
48
|
+
VM_NODE_TO_STORED_TYPE
|
|
49
|
+
} from "@secondlayer/stacks/filters";
|
|
50
|
+
var VM_STORED_TO_NODE_TYPE = {
|
|
51
|
+
nested_contract_call: "contract_call_event",
|
|
52
|
+
var_set: "var_set_event",
|
|
53
|
+
map_set: "map_set_event",
|
|
54
|
+
map_insert: "map_insert_event",
|
|
55
|
+
map_delete: "map_delete_event"
|
|
56
|
+
};
|
|
46
57
|
var STREAMS_EVENT_TYPES = DECODED_EVENT_TYPES;
|
|
47
58
|
// src/streams-rows/_payload.ts
|
|
48
59
|
function requireString(payload, field, eventType) {
|
|
@@ -332,5 +343,5 @@ export {
|
|
|
332
343
|
STREAMS_EVENT_TYPES
|
|
333
344
|
};
|
|
334
345
|
|
|
335
|
-
//# debugId=
|
|
346
|
+
//# debugId=1AE9813B531A511E64756E2164756E21
|
|
336
347
|
//# sourceMappingURL=index.js.map
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"sources": ["../src/streams-rows/clarity.ts", "../src/event-types.ts", "../src/streams-rows/_payload.ts", "../src/streams-rows/ft-transfer.ts", "../src/streams-rows/nft-transfer.ts", "../src/streams-rows/print.ts", "../src/streams-rows/stx-events.ts", "../src/streams-rows/token-mint-burn.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { cvToValue, deserializeCV } from \"@secondlayer/stacks/clarity\";\n\n/** Make a cvToValue result JSON-serializable: Clarity (u)ints decode to bigint,\n * which JSON.stringify can't handle — convert recursively to strings. */\nexport function toJsonSafe(value: unknown): unknown {\n\tif (typeof value === \"bigint\") return value.toString();\n\tif (Array.isArray(value)) return value.map(toJsonSafe);\n\tif (value && typeof value === \"object\") {\n\t\tconst out: Record<string, unknown> = {};\n\t\tfor (const [key, val] of Object.entries(value)) {\n\t\t\tout[key] = toJsonSafe(val);\n\t\t}\n\t\treturn out;\n\t}\n\treturn value;\n}\n\n/** Decode a hex-encoded Clarity value to JSON-safe JS (uints as strings,\n * buffers as `0x…` hex, tuples as objects). Returns the input hex on failure. */\nexport function decodeClarityValue(hex: string): unknown {\n\ttry {\n\t\tconst clean = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n\t\treturn toJsonSafe(cvToValue(deserializeCV(clean)));\n\t} catch {\n\t\treturn hex;\n\t}\n}\n",
|
|
6
|
-
"// The decoded event-type vocabulary — canonical home is now\n// `@secondlayer/stacks/filters` (the LEAF of the dependency graph: shared\n// depends on stacks, never the reverse, so no package can drift a private\n// copy upward). Re-exported here so every existing `@secondlayer/shared`\n// import keeps working unchanged.\nimport {
|
|
6
|
+
"// The decoded event-type vocabulary — canonical home is now\n// `@secondlayer/stacks/filters` (the LEAF of the dependency graph: shared\n// depends on stacks, never the reverse, so no package can drift a private\n// copy upward). Re-exported here so every existing `@secondlayer/shared`\n// import keeps working unchanged.\nimport {\n\tDECODED_EVENT_TYPES,\n\ttype VM_NODE_TO_STORED_TYPE,\n} from \"@secondlayer/stacks/filters\";\nimport type { DecodedEventType } from \"@secondlayer/stacks/filters\";\n\nexport {\n\tDECODED_EVENT_TYPES,\n\tVM_EVENT_TYPES,\n\tVM_NODE_TO_STORED_TYPE,\n\ttype DecodedEventType,\n\ttype VmEventType,\n\ttype VmNodeEventType,\n} from \"@secondlayer/stacks/filters\";\n\ntype VmStoredToNode = {\n\t[K in keyof typeof VM_NODE_TO_STORED_TYPE as (typeof VM_NODE_TO_STORED_TYPE)[K]]: K;\n};\n\n/** Inverse of {@link VM_NODE_TO_STORED_TYPE}. Replay reconstruction emits the\n * node-shaped `/new_block.vm_events` body, so ingest can re-parse it. */\nexport const VM_STORED_TO_NODE_TYPE: VmStoredToNode = {\n\tnested_contract_call: \"contract_call_event\",\n\tvar_set: \"var_set_event\",\n\tmap_set: \"map_set_event\",\n\tmap_insert: \"map_insert_event\",\n\tmap_delete: \"map_delete_event\",\n};\n\n/** Alias kept for the Streams surface (identical to {@link DECODED_EVENT_TYPES}).\n * Explicit type annotation required — isolatedDeclarations emits `unknown` for\n * a bare const-to-const alias. */\nexport const STREAMS_EVENT_TYPES: typeof DECODED_EVENT_TYPES =\n\tDECODED_EVENT_TYPES;\nexport type StreamsEventType = DecodedEventType;\n",
|
|
7
7
|
"import type { StreamsEvent } from \"./events.ts\";\n\n/** Superset of the columns the decoded_events table holds. Every decoded\n * event's `decoded_payload` is assignable to this, so the indexer's writer\n * can map columns generically instead of per-event-type. */\nexport type DecodedEventColumns = {\n\tcontract_id?: string | null;\n\tasset_identifier?: string | null;\n\tsender?: string | null;\n\trecipient?: string | null;\n\tamount?: string | null;\n\tvalue?: string | null;\n\tmemo?: string | null;\n\t/** JSONB overflow for non-flat types (e.g. print's decoded value). */\n\tpayload?: unknown;\n};\n\nexport function requireString(\n\tpayload: Record<string, unknown>,\n\tfield: string,\n\teventType: string,\n): string {\n\tconst value = payload[field];\n\tif (typeof value !== \"string\" || value.length === 0) {\n\t\tthrow new Error(`${eventType} payload missing ${field}`);\n\t}\n\treturn value;\n}\n\nexport function optionalString(value: unknown): string | null {\n\treturn typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nexport function requireAmountField(\n\tpayload: Record<string, unknown>,\n\tfield: string,\n\teventType: string,\n): string {\n\tconst amount = requireString(payload, field, eventType);\n\tif (!/^(0|[1-9]\\d*)$/.test(amount)) {\n\t\tthrow new Error(`${eventType} payload has malformed ${field}`);\n\t}\n\treturn amount;\n}\n\nexport function requireAmount(\n\tpayload: Record<string, unknown>,\n\teventType: string,\n): string {\n\treturn requireAmountField(payload, \"amount\", eventType);\n}\n\nexport function parseAssetIdentifier(\n\tassetIdentifier: string,\n\teventType: string,\n): { contract_id: string; token_name: string | null } {\n\tconst [contractId, tokenName] = assetIdentifier.split(\"::\");\n\tif (!contractId) {\n\t\tthrow new Error(`${eventType} payload has malformed asset_identifier`);\n\t}\n\treturn {\n\t\tcontract_id: contractId,\n\t\ttoken_name: tokenName && tokenName.length > 0 ? tokenName : null,\n\t};\n}\n\n/** NFT token id: live streams emits a typed Clarity value at `value` and the\n * canonical hex at `raw_value`; prefer raw_value when present. */\nexport function requireHexValue(\n\tpayload: Record<string, unknown>,\n\teventType: string,\n): string {\n\tconst rawValue = payload.raw_value;\n\tif (typeof rawValue === \"string\") {\n\t\tif (!/^0x[0-9a-fA-F]*$/.test(rawValue)) {\n\t\t\tthrow new Error(`${eventType} payload has malformed value`);\n\t\t}\n\t\treturn rawValue;\n\t}\n\n\tconst value = payload.value;\n\tconst hex =\n\t\ttypeof value === \"string\"\n\t\t\t? value\n\t\t\t: value &&\n\t\t\t\t\ttypeof value === \"object\" &&\n\t\t\t\t\ttypeof (value as { hex?: unknown }).hex === \"string\"\n\t\t\t\t? (value as { hex: string }).hex\n\t\t\t\t: null;\n\n\tif (!hex) {\n\t\tthrow new Error(`${eventType} payload missing value`);\n\t}\n\tif (!/^0x[0-9a-fA-F]*$/.test(hex)) {\n\t\tthrow new Error(`${eventType} payload has malformed value`);\n\t}\n\treturn hex;\n}\n\n/** Common envelope fields shared by every decoded event, lifted off the\n * source StreamsEvent. The decoder supplies event_type + decoded_payload. */\nexport function decodedRow<T extends string, P>(\n\tevent: StreamsEvent,\n\teventType: T,\n\tdecoded_payload: P,\n): {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: T;\n\tdecoded_payload: P;\n\tsource_cursor: string;\n} {\n\treturn {\n\t\tcursor: event.cursor,\n\t\tblock_height: event.block_height,\n\t\ttx_id: event.tx_id,\n\t\ttx_index: event.tx_index,\n\t\tevent_index: event.event_index,\n\t\tevent_type: eventType,\n\t\tdecoded_payload,\n\t\tsource_cursor: event.cursor,\n\t};\n}\n",
|
|
8
8
|
"import {\n\tdecodedRow,\n\tparseAssetIdentifier,\n\trequireAmount,\n\trequireString,\n} from \"./_payload.ts\";\nimport type { StreamsEvent } from \"./events.ts\";\n\nexport type { FtTransferPayload } from \"./events.ts\";\n\nexport type FtTransferEvent = Extract<\n\tStreamsEvent,\n\t{ event_type: \"ft_transfer\" }\n>;\n\nexport type DecodedFtTransferPayload = {\n\tasset_identifier: string;\n\tcontract_id: string;\n\ttoken_name: string | null;\n\tsender: string;\n\trecipient: string;\n\tamount: string;\n};\n\nexport type DecodedFtTransfer = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"ft_transfer\";\n\tdecoded_payload: DecodedFtTransferPayload;\n\tsource_cursor: string;\n};\n\nexport function isFtTransfer(event: StreamsEvent): event is FtTransferEvent {\n\treturn event.event_type === \"ft_transfer\";\n}\n\nexport function decodeFtTransfer(event: StreamsEvent): DecodedFtTransfer {\n\tif (!isFtTransfer(event)) {\n\t\tthrow new Error(`Expected ft_transfer event, got ${event.event_type}`);\n\t}\n\n\tconst payload = event.payload;\n\tconst assetIdentifier = requireString(\n\t\tpayload,\n\t\t\"asset_identifier\",\n\t\t\"ft_transfer\",\n\t);\n\tconst sender = requireString(payload, \"sender\", \"ft_transfer\");\n\tconst recipient = requireString(payload, \"recipient\", \"ft_transfer\");\n\tconst amount = requireAmount(payload, \"ft_transfer\");\n\tconst { contract_id, token_name } = parseAssetIdentifier(\n\t\tassetIdentifier,\n\t\t\"ft_transfer\",\n\t);\n\n\treturn decodedRow(event, \"ft_transfer\", {\n\t\tasset_identifier: assetIdentifier,\n\t\tcontract_id: event.contract_id ?? contract_id,\n\t\ttoken_name,\n\t\tsender,\n\t\trecipient,\n\t\tamount,\n\t});\n}\n",
|
|
9
9
|
"import {\n\tdecodedRow,\n\tparseAssetIdentifier,\n\trequireHexValue,\n\trequireString,\n} from \"./_payload.ts\";\nimport type { StreamsEvent } from \"./events.ts\";\n\nexport type { NftTransferPayload } from \"./events.ts\";\n\nexport type NftTransferEvent = Extract<\n\tStreamsEvent,\n\t{ event_type: \"nft_transfer\" }\n>;\n\nexport type DecodedNftTransferPayload = {\n\tasset_identifier: string;\n\tcontract_id: string;\n\ttoken_name: string | null;\n\tsender: string;\n\trecipient: string;\n\tvalue: string;\n};\n\nexport type DecodedNftTransfer = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"nft_transfer\";\n\tdecoded_payload: DecodedNftTransferPayload;\n\tsource_cursor: string;\n};\n\nexport function isNftTransfer(event: StreamsEvent): event is NftTransferEvent {\n\treturn event.event_type === \"nft_transfer\";\n}\n\nexport function decodeNftTransfer(event: StreamsEvent): DecodedNftTransfer {\n\tif (!isNftTransfer(event)) {\n\t\tthrow new Error(`Expected nft_transfer event, got ${event.event_type}`);\n\t}\n\n\tconst payload = event.payload;\n\tconst assetIdentifier = requireString(\n\t\tpayload,\n\t\t\"asset_identifier\",\n\t\t\"nft_transfer\",\n\t);\n\tconst sender = requireString(payload, \"sender\", \"nft_transfer\");\n\tconst recipient = requireString(payload, \"recipient\", \"nft_transfer\");\n\tconst value = requireHexValue(payload, \"nft_transfer\");\n\tconst { contract_id, token_name } = parseAssetIdentifier(\n\t\tassetIdentifier,\n\t\t\"nft_transfer\",\n\t);\n\n\treturn decodedRow(event, \"nft_transfer\", {\n\t\tasset_identifier: assetIdentifier,\n\t\tcontract_id: event.contract_id ?? contract_id,\n\t\ttoken_name,\n\t\tsender,\n\t\trecipient,\n\t\tvalue,\n\t});\n}\n",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"import {\n\tdecodedRow,\n\toptionalString,\n\trequireAmount,\n\trequireAmountField,\n\trequireString,\n} from \"./_payload.ts\";\nimport type { StreamsEvent } from \"./events.ts\";\n\nexport type DecodedStxTransferPayload = {\n\tsender: string;\n\trecipient: string;\n\tamount: string;\n\tmemo: string | null;\n};\n\nexport type DecodedStxTransfer = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"stx_transfer\";\n\tdecoded_payload: DecodedStxTransferPayload;\n\tsource_cursor: string;\n};\n\nexport type DecodedStxMintPayload = {\n\trecipient: string;\n\tamount: string;\n};\n\nexport type DecodedStxMint = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"stx_mint\";\n\tdecoded_payload: DecodedStxMintPayload;\n\tsource_cursor: string;\n};\n\nexport type DecodedStxBurnPayload = {\n\tsender: string;\n\tamount: string;\n};\n\nexport type DecodedStxBurn = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"stx_burn\";\n\tdecoded_payload: DecodedStxBurnPayload;\n\tsource_cursor: string;\n};\n\nexport function isStxTransfer(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"stx_transfer\" } {\n\treturn event.event_type === \"stx_transfer\";\n}\n\nexport function decodeStxTransfer(event: StreamsEvent): DecodedStxTransfer {\n\tif (!isStxTransfer(event)) {\n\t\tthrow new Error(`Expected stx_transfer event, got ${event.event_type}`);\n\t}\n\tconst payload = event.payload;\n\treturn decodedRow(event, \"stx_transfer\", {\n\t\tsender: requireString(payload, \"sender\", \"stx_transfer\"),\n\t\trecipient: requireString(payload, \"recipient\", \"stx_transfer\"),\n\t\tamount: requireAmount(payload, \"stx_transfer\"),\n\t\tmemo: optionalString(payload.memo),\n\t});\n}\n\nexport function isStxMint(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"stx_mint\" } {\n\treturn event.event_type === \"stx_mint\";\n}\n\nexport function decodeStxMint(event: StreamsEvent): DecodedStxMint {\n\tif (!isStxMint(event)) {\n\t\tthrow new Error(`Expected stx_mint event, got ${event.event_type}`);\n\t}\n\tconst payload = event.payload;\n\treturn decodedRow(event, \"stx_mint\", {\n\t\trecipient: requireString(payload, \"recipient\", \"stx_mint\"),\n\t\tamount: requireAmount(payload, \"stx_mint\"),\n\t});\n}\n\nexport function isStxBurn(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"stx_burn\" } {\n\treturn event.event_type === \"stx_burn\";\n}\n\nexport function decodeStxBurn(event: StreamsEvent): DecodedStxBurn {\n\tif (!isStxBurn(event)) {\n\t\tthrow new Error(`Expected stx_burn event, got ${event.event_type}`);\n\t}\n\tconst payload = event.payload;\n\treturn decodedRow(event, \"stx_burn\", {\n\t\tsender: requireString(payload, \"sender\", \"stx_burn\"),\n\t\tamount: requireAmount(payload, \"stx_burn\"),\n\t});\n}\n\nexport type DecodedStxLockPayload = {\n\t// The locked principal maps to `sender` and the locked uSTX to `amount` so\n\t// stx_lock is filterable like the other STX types; the lock-specific\n\t// unlock_height rides in the jsonb `payload` overflow.\n\tsender: string;\n\tamount: string;\n\tpayload: { unlock_height: string | null };\n};\n\nexport type DecodedStxLock = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"stx_lock\";\n\tdecoded_payload: DecodedStxLockPayload;\n\tsource_cursor: string;\n};\n\nexport function isStxLock(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"stx_lock\" } {\n\treturn event.event_type === \"stx_lock\";\n}\n\nexport function decodeStxLock(event: StreamsEvent): DecodedStxLock {\n\tif (!isStxLock(event)) {\n\t\tthrow new Error(`Expected stx_lock event, got ${event.event_type}`);\n\t}\n\tconst payload = event.payload;\n\treturn decodedRow(event, \"stx_lock\", {\n\t\tsender: requireString(payload, \"locked_address\", \"stx_lock\"),\n\t\tamount: requireAmountField(payload, \"locked_amount\", \"stx_lock\"),\n\t\tpayload: { unlock_height: optionalString(payload.unlock_height) },\n\t});\n}\n",
|
|
12
12
|
"import {\n\tdecodedRow,\n\tparseAssetIdentifier,\n\trequireAmount,\n\trequireHexValue,\n\trequireString,\n} from \"./_payload.ts\";\nimport type { StreamsEvent } from \"./events.ts\";\n\nexport type DecodedFtMintPayload = {\n\tasset_identifier: string;\n\tcontract_id: string;\n\ttoken_name: string | null;\n\trecipient: string;\n\tamount: string;\n};\n\nexport type DecodedFtMint = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"ft_mint\";\n\tdecoded_payload: DecodedFtMintPayload;\n\tsource_cursor: string;\n};\n\nexport type DecodedFtBurnPayload = {\n\tasset_identifier: string;\n\tcontract_id: string;\n\ttoken_name: string | null;\n\tsender: string;\n\tamount: string;\n};\n\nexport type DecodedFtBurn = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"ft_burn\";\n\tdecoded_payload: DecodedFtBurnPayload;\n\tsource_cursor: string;\n};\n\nexport type DecodedNftMintPayload = {\n\tasset_identifier: string;\n\tcontract_id: string;\n\ttoken_name: string | null;\n\trecipient: string;\n\tvalue: string;\n};\n\nexport type DecodedNftMint = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"nft_mint\";\n\tdecoded_payload: DecodedNftMintPayload;\n\tsource_cursor: string;\n};\n\nexport type DecodedNftBurnPayload = {\n\tasset_identifier: string;\n\tcontract_id: string;\n\ttoken_name: string | null;\n\tsender: string;\n\tvalue: string;\n};\n\nexport type DecodedNftBurn = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"nft_burn\";\n\tdecoded_payload: DecodedNftBurnPayload;\n\tsource_cursor: string;\n};\n\nfunction assetFields(event: StreamsEvent, eventType: string) {\n\tconst assetIdentifier = requireString(\n\t\tevent.payload,\n\t\t\"asset_identifier\",\n\t\teventType,\n\t);\n\tconst { contract_id, token_name } = parseAssetIdentifier(\n\t\tassetIdentifier,\n\t\teventType,\n\t);\n\treturn {\n\t\tasset_identifier: assetIdentifier,\n\t\tcontract_id: event.contract_id ?? contract_id,\n\t\ttoken_name,\n\t};\n}\n\nexport function isFtMint(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"ft_mint\" } {\n\treturn event.event_type === \"ft_mint\";\n}\n\nexport function decodeFtMint(event: StreamsEvent): DecodedFtMint {\n\tif (!isFtMint(event)) {\n\t\tthrow new Error(`Expected ft_mint event, got ${event.event_type}`);\n\t}\n\treturn decodedRow(event, \"ft_mint\", {\n\t\t...assetFields(event, \"ft_mint\"),\n\t\trecipient: requireString(event.payload, \"recipient\", \"ft_mint\"),\n\t\tamount: requireAmount(event.payload, \"ft_mint\"),\n\t});\n}\n\nexport function isFtBurn(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"ft_burn\" } {\n\treturn event.event_type === \"ft_burn\";\n}\n\nexport function decodeFtBurn(event: StreamsEvent): DecodedFtBurn {\n\tif (!isFtBurn(event)) {\n\t\tthrow new Error(`Expected ft_burn event, got ${event.event_type}`);\n\t}\n\treturn decodedRow(event, \"ft_burn\", {\n\t\t...assetFields(event, \"ft_burn\"),\n\t\tsender: requireString(event.payload, \"sender\", \"ft_burn\"),\n\t\tamount: requireAmount(event.payload, \"ft_burn\"),\n\t});\n}\n\nexport function isNftMint(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"nft_mint\" } {\n\treturn event.event_type === \"nft_mint\";\n}\n\nexport function decodeNftMint(event: StreamsEvent): DecodedNftMint {\n\tif (!isNftMint(event)) {\n\t\tthrow new Error(`Expected nft_mint event, got ${event.event_type}`);\n\t}\n\treturn decodedRow(event, \"nft_mint\", {\n\t\t...assetFields(event, \"nft_mint\"),\n\t\trecipient: requireString(event.payload, \"recipient\", \"nft_mint\"),\n\t\tvalue: requireHexValue(event.payload, \"nft_mint\"),\n\t});\n}\n\nexport function isNftBurn(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"nft_burn\" } {\n\treturn event.event_type === \"nft_burn\";\n}\n\nexport function decodeNftBurn(event: StreamsEvent): DecodedNftBurn {\n\tif (!isNftBurn(event)) {\n\t\tthrow new Error(`Expected nft_burn event, got ${event.event_type}`);\n\t}\n\treturn decodedRow(event, \"nft_burn\", {\n\t\t...assetFields(event, \"nft_burn\"),\n\t\tsender: requireString(event.payload, \"sender\", \"nft_burn\"),\n\t\tvalue: requireHexValue(event.payload, \"nft_burn\"),\n\t});\n}\n"
|
|
13
13
|
],
|
|
14
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAIO,SAAS,UAAU,CAAC,OAAyB;AAAA,EACnD,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO,MAAM,SAAS;AAAA,EACrD,IAAI,MAAM,QAAQ,KAAK;AAAA,IAAG,OAAO,MAAM,IAAI,UAAU;AAAA,EACrD,IAAI,SAAS,OAAO,UAAU,UAAU;AAAA,IACvC,MAAM,MAA+B,CAAC;AAAA,IACtC,YAAY,KAAK,QAAQ,OAAO,QAAQ,KAAK,GAAG;AAAA,MAC/C,IAAI,OAAO,WAAW,GAAG;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA,EACR;AAAA,EACA,OAAO;AAAA;AAKD,SAAS,kBAAkB,CAAC,KAAsB;AAAA,EACxD,IAAI;AAAA,IACH,MAAM,QAAQ,IAAI,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI;AAAA,IACpD,OAAO,WAAW,UAAU,cAAc,KAAK,CAAC,CAAC;AAAA,IAChD,MAAM;AAAA,IACP,OAAO;AAAA;AAAA;;ACnBT;
|
|
15
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "1AE9813B531A511E64756E2164756E21",
|
|
16
16
|
"names": []
|
|
17
17
|
}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -34,6 +34,15 @@ interface EventsTable {
|
|
|
34
34
|
data: unknown;
|
|
35
35
|
created_at: Generated<Date>;
|
|
36
36
|
}
|
|
37
|
+
interface VmEventsTable {
|
|
38
|
+
id: Generated<string>;
|
|
39
|
+
tx_id: string;
|
|
40
|
+
block_height: number;
|
|
41
|
+
ordinal: number;
|
|
42
|
+
type: string;
|
|
43
|
+
data: unknown;
|
|
44
|
+
created_at: Generated<Date>;
|
|
45
|
+
}
|
|
37
46
|
interface IndexProgressTable {
|
|
38
47
|
network: string;
|
|
39
48
|
last_indexed_block: Generated<number>;
|
|
@@ -47,6 +56,8 @@ type Transaction = Selectable<TransactionsTable>;
|
|
|
47
56
|
type InsertTransaction = Insertable<TransactionsTable>;
|
|
48
57
|
type Event = Selectable<EventsTable>;
|
|
49
58
|
type InsertEvent = Insertable<EventsTable>;
|
|
59
|
+
type VmEvent = Selectable<VmEventsTable>;
|
|
60
|
+
type InsertVmEvent = Insertable<VmEventsTable>;
|
|
50
61
|
type IndexProgress = Selectable<IndexProgressTable>;
|
|
51
62
|
type InsertIndexProgress = Insertable<IndexProgressTable>;
|
|
52
63
|
interface EnvSchemaOutput {
|
|
@@ -69,4 +80,4 @@ interface EnvSchemaOutput {
|
|
|
69
80
|
type Env = EnvSchemaOutput & {
|
|
70
81
|
enabledNetworks: ("mainnet" | "testnet")[]
|
|
71
82
|
};
|
|
72
|
-
export { Transaction, InsertTransaction, InsertIndexProgress, InsertEvent, InsertBlock, IndexProgress, Event, Env, Block };
|
|
83
|
+
export { VmEvent, Transaction, InsertVmEvent, InsertTransaction, InsertIndexProgress, InsertEvent, InsertBlock, IndexProgress, Event, Env, Block };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { type Kysely, sql } from "kysely";
|
|
2
|
+
import { onChainPlane } from "../src/db/migration-role.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Opt-in node vm_events (`"storage"` / `"contract_calls"`). Second clock:
|
|
6
|
+
* ingest assigns `ordinal` from `/new_block.vm_events` array order.
|
|
7
|
+
* Never mixed into `events.event_index` / Streams 1.0. `"*"` payloads omit
|
|
8
|
+
* the field; this table stays empty until a collecting node is wired.
|
|
9
|
+
*
|
|
10
|
+
* Stored `type` uses Secondlayer names (nested_contract_call, var_set,
|
|
11
|
+
* map_set, map_insert, map_delete) — not the node's `*_event` labels, and
|
|
12
|
+
* not outer `contract_call`.
|
|
13
|
+
*/
|
|
14
|
+
export async function up(db: Kysely<unknown>): Promise<void> {
|
|
15
|
+
await onChainPlane(async () => {
|
|
16
|
+
await sql`SET lock_timeout = '30s'`.execute(db);
|
|
17
|
+
|
|
18
|
+
await sql`
|
|
19
|
+
CREATE TABLE IF NOT EXISTS vm_events (
|
|
20
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
21
|
+
tx_id TEXT NOT NULL REFERENCES transactions (tx_id),
|
|
22
|
+
block_height BIGINT NOT NULL REFERENCES blocks (height),
|
|
23
|
+
ordinal INTEGER NOT NULL,
|
|
24
|
+
type TEXT NOT NULL,
|
|
25
|
+
data JSONB NOT NULL,
|
|
26
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
27
|
+
CONSTRAINT vm_events_type_check CHECK (type IN (
|
|
28
|
+
'nested_contract_call',
|
|
29
|
+
'var_set',
|
|
30
|
+
'map_set',
|
|
31
|
+
'map_insert',
|
|
32
|
+
'map_delete'
|
|
33
|
+
))
|
|
34
|
+
)
|
|
35
|
+
`.execute(db);
|
|
36
|
+
|
|
37
|
+
await sql`
|
|
38
|
+
CREATE UNIQUE INDEX IF NOT EXISTS vm_events_logical_id_uniq
|
|
39
|
+
ON vm_events (block_height, ordinal)
|
|
40
|
+
`.execute(db);
|
|
41
|
+
await sql`
|
|
42
|
+
CREATE INDEX IF NOT EXISTS vm_events_block_height_idx
|
|
43
|
+
ON vm_events (block_height)
|
|
44
|
+
`.execute(db);
|
|
45
|
+
await sql`
|
|
46
|
+
CREATE INDEX IF NOT EXISTS vm_events_tx_id_idx
|
|
47
|
+
ON vm_events (tx_id)
|
|
48
|
+
`.execute(db);
|
|
49
|
+
await sql`
|
|
50
|
+
CREATE INDEX IF NOT EXISTS vm_events_type_height_idx
|
|
51
|
+
ON vm_events (type, block_height)
|
|
52
|
+
`.execute(db);
|
|
53
|
+
|
|
54
|
+
await sql`
|
|
55
|
+
CREATE TABLE IF NOT EXISTS vm_events_archive (
|
|
56
|
+
archive_id BIGSERIAL PRIMARY KEY,
|
|
57
|
+
id TEXT NOT NULL,
|
|
58
|
+
tx_id TEXT NOT NULL,
|
|
59
|
+
block_height BIGINT NOT NULL,
|
|
60
|
+
ordinal INTEGER NOT NULL,
|
|
61
|
+
type TEXT NOT NULL,
|
|
62
|
+
data JSONB,
|
|
63
|
+
created_at TIMESTAMPTZ NOT NULL,
|
|
64
|
+
orphaned_block_hash TEXT,
|
|
65
|
+
archived_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
66
|
+
)
|
|
67
|
+
`.execute(db);
|
|
68
|
+
|
|
69
|
+
await sql`
|
|
70
|
+
CREATE INDEX IF NOT EXISTS vm_events_archive_height_idx
|
|
71
|
+
ON vm_events_archive (block_height)
|
|
72
|
+
`.execute(db);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export async function down(db: Kysely<unknown>): Promise<void> {
|
|
77
|
+
await onChainPlane(async () => {
|
|
78
|
+
await sql`DROP TABLE IF EXISTS vm_events_archive`.execute(db);
|
|
79
|
+
await sql`DROP TABLE IF EXISTS vm_events`.execute(db);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Kysely, sql } from "kysely";
|
|
2
|
+
import { onChainPlane } from "../src/db/migration-role.ts";
|
|
3
|
+
|
|
4
|
+
/** Index seek: (event_type, block_height, ordinal). */
|
|
5
|
+
export async function up(db: Kysely<unknown>): Promise<void> {
|
|
6
|
+
await onChainPlane(async () => {
|
|
7
|
+
await sql`SET lock_timeout = '30s'`.execute(db);
|
|
8
|
+
await sql`
|
|
9
|
+
CREATE INDEX IF NOT EXISTS vm_events_type_height_ordinal_idx
|
|
10
|
+
ON vm_events (type, block_height, ordinal)
|
|
11
|
+
`.execute(db);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export async function down(db: Kysely<unknown>): Promise<void> {
|
|
16
|
+
await onChainPlane(async () => {
|
|
17
|
+
await sql`DROP INDEX IF EXISTS vm_events_type_height_ordinal_idx`.execute(
|
|
18
|
+
db,
|
|
19
|
+
);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type Kysely, sql } from "kysely";
|
|
2
|
+
import { onChainPlane } from "../src/db/migration-role.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* `vm_events` referenced `transactions` / `blocks` with plain FKs, like
|
|
6
|
+
* `events_tx_id_fkey`. Every sweep that deletes a height (cli bootstrap and
|
|
7
|
+
* repair, repair-fork-block, cleanup-reorg-dupes, the smoke and drill scripts)
|
|
8
|
+
* deletes `events` explicitly before `transactions` — and none of them name
|
|
9
|
+
* `vm_events`, so each would fail with an FK violation the moment a vm row
|
|
10
|
+
* exists. Cascade instead of teaching six call sites about a second child:
|
|
11
|
+
* vm rows follow their parent. persistBlock still archives + deletes them
|
|
12
|
+
* explicitly before the parent, which stays correct under cascade.
|
|
13
|
+
*/
|
|
14
|
+
export async function up(db: Kysely<unknown>): Promise<void> {
|
|
15
|
+
await onChainPlane(async () => {
|
|
16
|
+
await sql`SET lock_timeout = '30s'`.execute(db);
|
|
17
|
+
await sql`
|
|
18
|
+
ALTER TABLE vm_events
|
|
19
|
+
DROP CONSTRAINT IF EXISTS vm_events_tx_id_fkey,
|
|
20
|
+
DROP CONSTRAINT IF EXISTS vm_events_block_height_fkey
|
|
21
|
+
`.execute(db);
|
|
22
|
+
await sql`
|
|
23
|
+
ALTER TABLE vm_events
|
|
24
|
+
ADD CONSTRAINT vm_events_tx_id_fkey
|
|
25
|
+
FOREIGN KEY (tx_id) REFERENCES transactions (tx_id) ON DELETE CASCADE,
|
|
26
|
+
ADD CONSTRAINT vm_events_block_height_fkey
|
|
27
|
+
FOREIGN KEY (block_height) REFERENCES blocks (height) ON DELETE CASCADE
|
|
28
|
+
`.execute(db);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function down(db: Kysely<unknown>): Promise<void> {
|
|
33
|
+
await onChainPlane(async () => {
|
|
34
|
+
await sql`
|
|
35
|
+
ALTER TABLE vm_events
|
|
36
|
+
DROP CONSTRAINT IF EXISTS vm_events_tx_id_fkey,
|
|
37
|
+
DROP CONSTRAINT IF EXISTS vm_events_block_height_fkey
|
|
38
|
+
`.execute(db);
|
|
39
|
+
await sql`
|
|
40
|
+
ALTER TABLE vm_events
|
|
41
|
+
ADD CONSTRAINT vm_events_tx_id_fkey
|
|
42
|
+
FOREIGN KEY (tx_id) REFERENCES transactions (tx_id),
|
|
43
|
+
ADD CONSTRAINT vm_events_block_height_fkey
|
|
44
|
+
FOREIGN KEY (block_height) REFERENCES blocks (height)
|
|
45
|
+
`.execute(db);
|
|
46
|
+
});
|
|
47
|
+
}
|