@secondlayer/stacks 0.3.0 → 1.0.0-alpha.0

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.
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/broadcast.ts", "../src/errors.ts", "../src/tx/builders.ts", "../src/clients/createClient.ts", "../src/clients/decorators/public.ts", "../src/clients/createPublicClient.ts", "../src/clients/decorators/wallet.ts", "../src/clients/createWalletClient.ts", "../src/clients/decorators/multisig.ts", "../src/clients/createMultiSigClient.ts", "../src/transports/createTransport.ts", "../src/transports/http.ts", "../src/transports/custom.ts", "../src/transports/fallback.ts", "../src/transports/webSocket.ts", "../src/errors/contract.ts"],
4
4
  "sourcesContent": [
5
- "import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { TxIntent } from \"./tx/builders.ts\";\n\n/**\n * Submit a transaction intent to the Stacks network via a workflow-declared\n * signer. The Secondlayer runner intercepts this call to:\n *\n * 1. Resolve `signer` to a `RemoteSignerConfig` (endpoint + publicKey +\n * hmacRef) declared on the workflow.\n * 2. Fetch the HMAC secret from the runtime secret store.\n * 3. Enforce safety caps (`maxMicroStx`, `maxFee`).\n * 4. POST the unsigned tx breakdown to the customer's signer endpoint.\n * 5. Submit the returned signed tx to the Stacks node.\n *\n * Returns the txId immediately. Confirmation polling lands in Sprint 5 via\n * `awaitConfirmation: true` (no-op today — subgraph-backed path forthcoming).\n *\n * Throws `TxRejectedError`, `TxTimeoutError`, or `TxSignerRefusedError` from\n * `@secondlayer/stacks/errors` on failure.\n *\n * Must be called inside a workflow handler (directly or inside `step.run`).\n * Calls outside a runtime-bound context throw immediately.\n */\nexport interface BroadcastOptions {\n\t/** Name of a signer declared in `WorkflowDefinition.signers`. */\n\tsigner: string;\n\t/**\n\t * If `true`, wait for the tx to be confirmed on-chain before returning.\n\t * Sprint 4 ships this flag as a no-op — Sprint 5 adds subgraph-backed\n\t * confirmation polling.\n\t */\n\tawaitConfirmation?: boolean;\n\t/** Minimum confirmations before returning. Only meaningful when `awaitConfirmation: true`. */\n\tminConfirmations?: number;\n\t/**\n\t * Hard cap on micro-STX that can be spent. Required when the tx amount is\n\t * derived from an AI step (the deploy-time AST check enforces this).\n\t */\n\tmaxMicroStx?: bigint;\n\t/** Hard cap on fee in micro-STX. */\n\tmaxFee?: bigint;\n}\n\nexport interface BroadcastResult {\n\ttxId: string;\n\t/** `false` for Sprint 4; `true` once `awaitConfirmation` lands in Sprint 5. */\n\tconfirmed: boolean;\n}\n\n/**\n * Runtime contract implemented by `@secondlayer/workflow-runner`. The stacks\n * package is a pure library — it holds no keys, no DB, and no network —\n * so actual broadcasting is delegated to whatever runtime bound the context.\n */\nexport interface BroadcastRuntime {\n\tbroadcast(intent: TxIntent, opts: BroadcastOptions): Promise<BroadcastResult>;\n}\n\n/**\n * Per-run `AsyncLocalStorage` binding. The runner calls\n * `broadcastContext.run(runtime, async () => handler(ctx))` so concurrent\n * workflow runs see isolated runtime bindings — no module-level global state\n * is mutated.\n */\nexport const broadcastContext: AsyncLocalStorage<BroadcastRuntime> =\n\tnew AsyncLocalStorage<BroadcastRuntime>();\n\nexport async function broadcast(\n\tintent: TxIntent,\n\topts: BroadcastOptions,\n): Promise<BroadcastResult> {\n\tconst runtime = broadcastContext.getStore();\n\tif (!runtime) {\n\t\tthrow new Error(\n\t\t\t\"broadcast() called outside a workflow runner context. \" +\n\t\t\t\t\"Only call `broadcast` inside a workflow handler (directly or inside `step.run`).\",\n\t\t);\n\t}\n\tif (opts.maxMicroStx != null && opts.maxMicroStx <= 0n) {\n\t\tthrow new Error(\"maxMicroStx must be positive when set\");\n\t}\n\tif (opts.maxFee != null && opts.maxFee <= 0n) {\n\t\tthrow new Error(\"maxFee must be positive when set\");\n\t}\n\treturn runtime.broadcast(intent, opts);\n}\n",
5
+ "import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { TxIntent } from \"./tx/builders.ts\";\n\n/**\n * Submit a transaction intent to the Stacks network via a workflow-declared\n * signer. The Secondlayer runner intercepts this call to:\n *\n * 1. Resolve `signer` to a `RemoteSignerConfig` (endpoint + publicKey +\n * hmacRef) declared on the workflow.\n * 2. Fetch the HMAC secret from the runtime secret store.\n * 3. Enforce safety caps (`maxMicroStx`, `maxFee`).\n * 4. POST the unsigned tx breakdown to the customer's signer endpoint.\n * 5. Submit the returned signed tx to the Stacks node.\n *\n * Returns the txId immediately. Confirmation polling lands in Sprint 5 via\n * `awaitConfirmation: true` (no-op today — subgraph-backed path forthcoming).\n *\n * Throws `TxRejectedError`, `TxTimeoutError`, or `TxSignerRefusedError` from\n * `@secondlayer/stacks/errors` on failure.\n *\n * Must be called inside a workflow handler (directly or inside `step.run`).\n * Calls outside a runtime-bound context throw immediately.\n */\nexport interface BroadcastOptions {\n\t/** Name of a signer declared in `WorkflowDefinition.signers`. */\n\tsigner: string;\n\t/**\n\t * If `true`, wait for the tx to be confirmed on-chain before returning.\n\t * Sprint 4 ships this flag as a no-op — Sprint 5 adds subgraph-backed\n\t * confirmation polling.\n\t */\n\tawaitConfirmation?: boolean;\n\t/** Minimum confirmations before returning. Only meaningful when `awaitConfirmation: true`. */\n\tminConfirmations?: number;\n\t/**\n\t * Hard cap on micro-STX that can be spent. Required when the tx amount is\n\t * derived from an AI step (the deploy-time AST check enforces this).\n\t */\n\tmaxMicroStx?: bigint;\n\t/** Hard cap on fee in micro-STX. */\n\tmaxFee?: bigint;\n}\n\nexport interface BroadcastResult {\n\ttxId: string;\n\t/** `false` for Sprint 4; `true` once `awaitConfirmation` lands in Sprint 5. */\n\tconfirmed: boolean;\n}\n\n/**\n * Runtime contract for broadcasting. The stacks package is a pure library —\n * no keys, no DB, no network — so broadcasting is delegated to whatever\n * runtime bound the context.\n */\nexport interface BroadcastRuntime {\n\tbroadcast(intent: TxIntent, opts: BroadcastOptions): Promise<BroadcastResult>;\n}\n\n/**\n * Per-run `AsyncLocalStorage` binding. The runner calls\n * `broadcastContext.run(runtime, async () => handler(ctx))` so concurrent\n * workflow runs see isolated runtime bindings — no module-level global state\n * is mutated.\n */\nexport const broadcastContext: AsyncLocalStorage<BroadcastRuntime> =\n\tnew AsyncLocalStorage<BroadcastRuntime>();\n\nexport async function broadcast(\n\tintent: TxIntent,\n\topts: BroadcastOptions,\n): Promise<BroadcastResult> {\n\tconst runtime = broadcastContext.getStore();\n\tif (!runtime) {\n\t\tthrow new Error(\n\t\t\t\"broadcast() called outside a workflow runner context. \" +\n\t\t\t\t\"Only call `broadcast` inside a workflow handler (directly or inside `step.run`).\",\n\t\t);\n\t}\n\tif (opts.maxMicroStx != null && opts.maxMicroStx <= 0n) {\n\t\tthrow new Error(\"maxMicroStx must be positive when set\");\n\t}\n\tif (opts.maxFee != null && opts.maxFee <= 0n) {\n\t\tthrow new Error(\"maxFee must be positive when set\");\n\t}\n\treturn runtime.broadcast(intent, opts);\n}\n",
6
6
  "/**\n * Structured error classes thrown by `broadcast()` and the workflow runner's\n * broadcast step. The runner's retry policy consults `reason` (for\n * `TxRejectedError`) to decide whether to re-attempt — abort-by-post-condition\n * is non-retryable, timeouts retry with a fee bump, etc.\n */\n\nexport type TxRejectionReason =\n\t| \"abort_by_post_condition\"\n\t| \"abort_by_response\"\n\t| \"runtime_error\"\n\t| \"out_of_gas\"\n\t| \"nonce_conflict\"\n\t| \"signature_invalid\"\n\t| \"unknown\";\n\n/**\n * Thrown when a transaction submitted to the Stacks node is rejected\n * (mempool or on-chain). Each `reason` maps to different retry semantics.\n */\nexport class TxRejectedError extends Error {\n\toverride readonly name = \"TxRejectedError\";\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly reason: TxRejectionReason,\n\t\treadonly txId?: string,\n\t) {\n\t\tsuper(message);\n\t}\n\n\t/**\n\t * Heuristic: is retrying the same tx likely to succeed?\n\t * `abort_by_post_condition` / `abort_by_response` reflect on-chain state\n\t * or explicit rejection — same tx will fail again.\n\t */\n\tget isRetryable(): boolean {\n\t\tswitch (this.reason) {\n\t\t\tcase \"abort_by_post_condition\":\n\t\t\tcase \"abort_by_response\":\n\t\t\tcase \"signature_invalid\":\n\t\t\t\treturn false;\n\t\t\tdefault:\n\t\t\t\treturn true;\n\t\t}\n\t}\n}\n\n/**\n * Thrown when a broadcast was submitted (mempool accepted) but never mined\n * within the configured `confirmationTimeout`. Retryable with fee bump.\n */\nexport class TxTimeoutError extends Error {\n\toverride readonly name = \"TxTimeoutError\";\n\treadonly isRetryable = true;\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly txId: string,\n\t\treadonly timeoutMs: number,\n\t) {\n\t\tsuper(message);\n\t}\n}\n\n/**\n * Thrown when the remote signer refused to sign (policy denied, quota hit,\n * bad request). Non-retryable — customer policy won't change on retry.\n */\nexport class TxSignerRefusedError extends Error {\n\toverride readonly name = \"TxSignerRefusedError\";\n\treadonly isRetryable = false;\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly signerName: string,\n\t\treadonly reason: string,\n\t) {\n\t\tsuper(message);\n\t}\n}\n",
7
7
  "/**\n * Unsigned transaction intents for workflow use.\n *\n * import { tx } from \"@secondlayer/stacks/tx\"\n * await step.run(\"pay\", () => broadcast(\n * tx.transfer({ recipient: \"SP…\", amount: 1_000_000n, memo: \"DCA\" }),\n * { signer: \"treasury\" },\n * ))\n *\n * These helpers return plain \"intent\" objects — a description of *what*\n * should be broadcast, without fee, nonce, signer, or signature. The\n * `broadcast()` step (see Sprint 4) hydrates those at submit time using the\n * configured signer.\n *\n * Keeping intents separate from the existing `buildTokenTransfer` /\n * `buildContractCall` / `buildContractDeploy` in `@secondlayer/stacks/transactions`\n * means workflow authors don't have to manage fee/nonce and a single\n * `broadcast()` path can enforce budget caps + safety layers uniformly.\n */\n\nimport type { ClarityValue, PostCondition } from \"@stacks/transactions\";\n\nexport interface TransferIntent {\n\tkind: \"transfer\";\n\trecipient: string;\n\tamount: bigint;\n\tmemo?: string;\n\tpostConditions?: PostCondition[];\n}\n\nexport interface ContractCallIntent {\n\tkind: \"contract-call\";\n\t/** Fully-qualified contract id, e.g. `\"SP000000000000000000002Q6VF78.bns\"`. */\n\tcontract: string;\n\tfn: string;\n\targs: ClarityValue[];\n\tpostConditions?: PostCondition[];\n}\n\nexport interface DeployIntent {\n\tkind: \"deploy\";\n\tname: string;\n\tsource: string;\n\tclarityVersion?: 1 | 2 | 3;\n}\n\nexport interface MultiSendIntent {\n\tkind: \"multisend\";\n\tpayments: Array<{ recipient: string; amount: bigint; memo?: string }>;\n}\n\nexport type TxIntent =\n\t| TransferIntent\n\t| ContractCallIntent\n\t| DeployIntent\n\t| MultiSendIntent;\n\n/**\n * Lightweight factory functions for building tx intents. Identity-shaped\n * with a `kind` tag so the broadcast step can discriminate at runtime.\n */\nexport const tx = {\n\ttransfer: (opts: Omit<TransferIntent, \"kind\">): TransferIntent => ({\n\t\tkind: \"transfer\",\n\t\t...opts,\n\t}),\n\tcontractCall: (\n\t\topts: Omit<ContractCallIntent, \"kind\">,\n\t): ContractCallIntent => ({ kind: \"contract-call\", ...opts }),\n\tdeploy: (opts: Omit<DeployIntent, \"kind\">): DeployIntent => ({\n\t\tkind: \"deploy\",\n\t\t...opts,\n\t}),\n\tmultisend: (opts: Omit<MultiSendIntent, \"kind\">): MultiSendIntent => ({\n\t\tkind: \"multisend\",\n\t\t...opts,\n\t}),\n} as const;\n",
8
8
  "import type { Client, ClientConfig } from \"./types.ts\";\n\nconst BASE_KEYS = new Set([\n\t\"chain\",\n\t\"account\",\n\t\"transport\",\n\t\"request\",\n\t\"extend\",\n]);\n\nfunction bindExtend(base: Client): Client[\"extend\"] {\n\treturn ((fn: any) => {\n\t\tconst extensions = fn(base);\n\t\tconst next = { ...base };\n\t\tfor (const [key, value] of Object.entries(extensions)) {\n\t\t\tif (BASE_KEYS.has(key)) continue;\n\t\t\t(next as any)[key] = value;\n\t\t}\n\t\tnext.extend = bindExtend(next);\n\t\treturn next as any;\n\t}) as Client[\"extend\"];\n}\n\n/**\n * Create a base client with transport and optional chain/account.\n * Use `.extend()` to compose action decorators (public, wallet, multisig).\n */\nexport function createClient<\n\tTExtended extends Record<string, unknown> = Record<string, unknown>,\n>(config: ClientConfig): Client<TExtended> {\n\tconst transport = config.transport({ chain: config.chain });\n\n\tconst client: Client = {\n\t\tchain: config.chain,\n\t\taccount: config.account,\n\t\ttransport,\n\t\trequest: transport.request,\n\t\textend: null as any,\n\t};\n\n\tclient.extend = bindExtend(client);\n\n\treturn client as Client<TExtended>;\n}\n",
@@ -85,9 +85,9 @@ interface BroadcastResult {
85
85
  confirmed: boolean;
86
86
  }
87
87
  /**
88
- * Runtime contract implemented by `@secondlayer/workflow-runner`. The stacks
89
- * package is a pure library — it holds no keys, no DB, and no network —
90
- * so actual broadcasting is delegated to whatever runtime bound the context.
88
+ * Runtime contract for broadcasting. The stacks package is a pure library —
89
+ * no keys, no DB, no network — so broadcasting is delegated to whatever
90
+ * runtime bound the context.
91
91
  */
92
92
  interface BroadcastRuntime {
93
93
  broadcast(intent: TxIntent, opts: BroadcastOptions): Promise<BroadcastResult>;
@@ -85,9 +85,9 @@ interface BroadcastResult {
85
85
  confirmed: boolean;
86
86
  }
87
87
  /**
88
- * Runtime contract implemented by `@secondlayer/workflow-runner`. The stacks
89
- * package is a pure library — it holds no keys, no DB, and no network —
90
- * so actual broadcasting is delegated to whatever runtime bound the context.
88
+ * Runtime contract for broadcasting. The stacks package is a pure library —
89
+ * no keys, no DB, no network — so broadcasting is delegated to whatever
90
+ * runtime bound the context.
91
91
  */
92
92
  interface BroadcastRuntime {
93
93
  broadcast(intent: TxIntent, opts: BroadcastOptions): Promise<BroadcastResult>;
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/broadcast.ts", "../src/errors.ts", "../src/tx/builders.ts", "../src/clients/createClient.ts", "../src/clients/decorators/public.ts", "../src/clients/createPublicClient.ts", "../src/clients/decorators/wallet.ts", "../src/clients/createWalletClient.ts", "../src/clients/decorators/multisig.ts", "../src/clients/createMultiSigClient.ts", "../src/transports/createTransport.ts", "../src/transports/http.ts", "../src/transports/custom.ts", "../src/transports/fallback.ts", "../src/transports/webSocket.ts", "../src/errors/contract.ts"],
4
4
  "sourcesContent": [
5
- "import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { TxIntent } from \"./tx/builders.ts\";\n\n/**\n * Submit a transaction intent to the Stacks network via a workflow-declared\n * signer. The Secondlayer runner intercepts this call to:\n *\n * 1. Resolve `signer` to a `RemoteSignerConfig` (endpoint + publicKey +\n * hmacRef) declared on the workflow.\n * 2. Fetch the HMAC secret from the runtime secret store.\n * 3. Enforce safety caps (`maxMicroStx`, `maxFee`).\n * 4. POST the unsigned tx breakdown to the customer's signer endpoint.\n * 5. Submit the returned signed tx to the Stacks node.\n *\n * Returns the txId immediately. Confirmation polling lands in Sprint 5 via\n * `awaitConfirmation: true` (no-op today — subgraph-backed path forthcoming).\n *\n * Throws `TxRejectedError`, `TxTimeoutError`, or `TxSignerRefusedError` from\n * `@secondlayer/stacks/errors` on failure.\n *\n * Must be called inside a workflow handler (directly or inside `step.run`).\n * Calls outside a runtime-bound context throw immediately.\n */\nexport interface BroadcastOptions {\n\t/** Name of a signer declared in `WorkflowDefinition.signers`. */\n\tsigner: string;\n\t/**\n\t * If `true`, wait for the tx to be confirmed on-chain before returning.\n\t * Sprint 4 ships this flag as a no-op — Sprint 5 adds subgraph-backed\n\t * confirmation polling.\n\t */\n\tawaitConfirmation?: boolean;\n\t/** Minimum confirmations before returning. Only meaningful when `awaitConfirmation: true`. */\n\tminConfirmations?: number;\n\t/**\n\t * Hard cap on micro-STX that can be spent. Required when the tx amount is\n\t * derived from an AI step (the deploy-time AST check enforces this).\n\t */\n\tmaxMicroStx?: bigint;\n\t/** Hard cap on fee in micro-STX. */\n\tmaxFee?: bigint;\n}\n\nexport interface BroadcastResult {\n\ttxId: string;\n\t/** `false` for Sprint 4; `true` once `awaitConfirmation` lands in Sprint 5. */\n\tconfirmed: boolean;\n}\n\n/**\n * Runtime contract implemented by `@secondlayer/workflow-runner`. The stacks\n * package is a pure library — it holds no keys, no DB, and no network —\n * so actual broadcasting is delegated to whatever runtime bound the context.\n */\nexport interface BroadcastRuntime {\n\tbroadcast(intent: TxIntent, opts: BroadcastOptions): Promise<BroadcastResult>;\n}\n\n/**\n * Per-run `AsyncLocalStorage` binding. The runner calls\n * `broadcastContext.run(runtime, async () => handler(ctx))` so concurrent\n * workflow runs see isolated runtime bindings — no module-level global state\n * is mutated.\n */\nexport const broadcastContext: AsyncLocalStorage<BroadcastRuntime> =\n\tnew AsyncLocalStorage<BroadcastRuntime>();\n\nexport async function broadcast(\n\tintent: TxIntent,\n\topts: BroadcastOptions,\n): Promise<BroadcastResult> {\n\tconst runtime = broadcastContext.getStore();\n\tif (!runtime) {\n\t\tthrow new Error(\n\t\t\t\"broadcast() called outside a workflow runner context. \" +\n\t\t\t\t\"Only call `broadcast` inside a workflow handler (directly or inside `step.run`).\",\n\t\t);\n\t}\n\tif (opts.maxMicroStx != null && opts.maxMicroStx <= 0n) {\n\t\tthrow new Error(\"maxMicroStx must be positive when set\");\n\t}\n\tif (opts.maxFee != null && opts.maxFee <= 0n) {\n\t\tthrow new Error(\"maxFee must be positive when set\");\n\t}\n\treturn runtime.broadcast(intent, opts);\n}\n",
5
+ "import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { TxIntent } from \"./tx/builders.ts\";\n\n/**\n * Submit a transaction intent to the Stacks network via a workflow-declared\n * signer. The Secondlayer runner intercepts this call to:\n *\n * 1. Resolve `signer` to a `RemoteSignerConfig` (endpoint + publicKey +\n * hmacRef) declared on the workflow.\n * 2. Fetch the HMAC secret from the runtime secret store.\n * 3. Enforce safety caps (`maxMicroStx`, `maxFee`).\n * 4. POST the unsigned tx breakdown to the customer's signer endpoint.\n * 5. Submit the returned signed tx to the Stacks node.\n *\n * Returns the txId immediately. Confirmation polling lands in Sprint 5 via\n * `awaitConfirmation: true` (no-op today — subgraph-backed path forthcoming).\n *\n * Throws `TxRejectedError`, `TxTimeoutError`, or `TxSignerRefusedError` from\n * `@secondlayer/stacks/errors` on failure.\n *\n * Must be called inside a workflow handler (directly or inside `step.run`).\n * Calls outside a runtime-bound context throw immediately.\n */\nexport interface BroadcastOptions {\n\t/** Name of a signer declared in `WorkflowDefinition.signers`. */\n\tsigner: string;\n\t/**\n\t * If `true`, wait for the tx to be confirmed on-chain before returning.\n\t * Sprint 4 ships this flag as a no-op — Sprint 5 adds subgraph-backed\n\t * confirmation polling.\n\t */\n\tawaitConfirmation?: boolean;\n\t/** Minimum confirmations before returning. Only meaningful when `awaitConfirmation: true`. */\n\tminConfirmations?: number;\n\t/**\n\t * Hard cap on micro-STX that can be spent. Required when the tx amount is\n\t * derived from an AI step (the deploy-time AST check enforces this).\n\t */\n\tmaxMicroStx?: bigint;\n\t/** Hard cap on fee in micro-STX. */\n\tmaxFee?: bigint;\n}\n\nexport interface BroadcastResult {\n\ttxId: string;\n\t/** `false` for Sprint 4; `true` once `awaitConfirmation` lands in Sprint 5. */\n\tconfirmed: boolean;\n}\n\n/**\n * Runtime contract for broadcasting. The stacks package is a pure library —\n * no keys, no DB, no network — so broadcasting is delegated to whatever\n * runtime bound the context.\n */\nexport interface BroadcastRuntime {\n\tbroadcast(intent: TxIntent, opts: BroadcastOptions): Promise<BroadcastResult>;\n}\n\n/**\n * Per-run `AsyncLocalStorage` binding. The runner calls\n * `broadcastContext.run(runtime, async () => handler(ctx))` so concurrent\n * workflow runs see isolated runtime bindings — no module-level global state\n * is mutated.\n */\nexport const broadcastContext: AsyncLocalStorage<BroadcastRuntime> =\n\tnew AsyncLocalStorage<BroadcastRuntime>();\n\nexport async function broadcast(\n\tintent: TxIntent,\n\topts: BroadcastOptions,\n): Promise<BroadcastResult> {\n\tconst runtime = broadcastContext.getStore();\n\tif (!runtime) {\n\t\tthrow new Error(\n\t\t\t\"broadcast() called outside a workflow runner context. \" +\n\t\t\t\t\"Only call `broadcast` inside a workflow handler (directly or inside `step.run`).\",\n\t\t);\n\t}\n\tif (opts.maxMicroStx != null && opts.maxMicroStx <= 0n) {\n\t\tthrow new Error(\"maxMicroStx must be positive when set\");\n\t}\n\tif (opts.maxFee != null && opts.maxFee <= 0n) {\n\t\tthrow new Error(\"maxFee must be positive when set\");\n\t}\n\treturn runtime.broadcast(intent, opts);\n}\n",
6
6
  "/**\n * Structured error classes thrown by `broadcast()` and the workflow runner's\n * broadcast step. The runner's retry policy consults `reason` (for\n * `TxRejectedError`) to decide whether to re-attempt — abort-by-post-condition\n * is non-retryable, timeouts retry with a fee bump, etc.\n */\n\nexport type TxRejectionReason =\n\t| \"abort_by_post_condition\"\n\t| \"abort_by_response\"\n\t| \"runtime_error\"\n\t| \"out_of_gas\"\n\t| \"nonce_conflict\"\n\t| \"signature_invalid\"\n\t| \"unknown\";\n\n/**\n * Thrown when a transaction submitted to the Stacks node is rejected\n * (mempool or on-chain). Each `reason` maps to different retry semantics.\n */\nexport class TxRejectedError extends Error {\n\toverride readonly name = \"TxRejectedError\";\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly reason: TxRejectionReason,\n\t\treadonly txId?: string,\n\t) {\n\t\tsuper(message);\n\t}\n\n\t/**\n\t * Heuristic: is retrying the same tx likely to succeed?\n\t * `abort_by_post_condition` / `abort_by_response` reflect on-chain state\n\t * or explicit rejection — same tx will fail again.\n\t */\n\tget isRetryable(): boolean {\n\t\tswitch (this.reason) {\n\t\t\tcase \"abort_by_post_condition\":\n\t\t\tcase \"abort_by_response\":\n\t\t\tcase \"signature_invalid\":\n\t\t\t\treturn false;\n\t\t\tdefault:\n\t\t\t\treturn true;\n\t\t}\n\t}\n}\n\n/**\n * Thrown when a broadcast was submitted (mempool accepted) but never mined\n * within the configured `confirmationTimeout`. Retryable with fee bump.\n */\nexport class TxTimeoutError extends Error {\n\toverride readonly name = \"TxTimeoutError\";\n\treadonly isRetryable = true;\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly txId: string,\n\t\treadonly timeoutMs: number,\n\t) {\n\t\tsuper(message);\n\t}\n}\n\n/**\n * Thrown when the remote signer refused to sign (policy denied, quota hit,\n * bad request). Non-retryable — customer policy won't change on retry.\n */\nexport class TxSignerRefusedError extends Error {\n\toverride readonly name = \"TxSignerRefusedError\";\n\treadonly isRetryable = false;\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly signerName: string,\n\t\treadonly reason: string,\n\t) {\n\t\tsuper(message);\n\t}\n}\n",
7
7
  "/**\n * Unsigned transaction intents for workflow use.\n *\n * import { tx } from \"@secondlayer/stacks/tx\"\n * await step.run(\"pay\", () => broadcast(\n * tx.transfer({ recipient: \"SP…\", amount: 1_000_000n, memo: \"DCA\" }),\n * { signer: \"treasury\" },\n * ))\n *\n * These helpers return plain \"intent\" objects — a description of *what*\n * should be broadcast, without fee, nonce, signer, or signature. The\n * `broadcast()` step (see Sprint 4) hydrates those at submit time using the\n * configured signer.\n *\n * Keeping intents separate from the existing `buildTokenTransfer` /\n * `buildContractCall` / `buildContractDeploy` in `@secondlayer/stacks/transactions`\n * means workflow authors don't have to manage fee/nonce and a single\n * `broadcast()` path can enforce budget caps + safety layers uniformly.\n */\n\nimport type { ClarityValue, PostCondition } from \"@stacks/transactions\";\n\nexport interface TransferIntent {\n\tkind: \"transfer\";\n\trecipient: string;\n\tamount: bigint;\n\tmemo?: string;\n\tpostConditions?: PostCondition[];\n}\n\nexport interface ContractCallIntent {\n\tkind: \"contract-call\";\n\t/** Fully-qualified contract id, e.g. `\"SP000000000000000000002Q6VF78.bns\"`. */\n\tcontract: string;\n\tfn: string;\n\targs: ClarityValue[];\n\tpostConditions?: PostCondition[];\n}\n\nexport interface DeployIntent {\n\tkind: \"deploy\";\n\tname: string;\n\tsource: string;\n\tclarityVersion?: 1 | 2 | 3;\n}\n\nexport interface MultiSendIntent {\n\tkind: \"multisend\";\n\tpayments: Array<{ recipient: string; amount: bigint; memo?: string }>;\n}\n\nexport type TxIntent =\n\t| TransferIntent\n\t| ContractCallIntent\n\t| DeployIntent\n\t| MultiSendIntent;\n\n/**\n * Lightweight factory functions for building tx intents. Identity-shaped\n * with a `kind` tag so the broadcast step can discriminate at runtime.\n */\nexport const tx = {\n\ttransfer: (opts: Omit<TransferIntent, \"kind\">): TransferIntent => ({\n\t\tkind: \"transfer\",\n\t\t...opts,\n\t}),\n\tcontractCall: (\n\t\topts: Omit<ContractCallIntent, \"kind\">,\n\t): ContractCallIntent => ({ kind: \"contract-call\", ...opts }),\n\tdeploy: (opts: Omit<DeployIntent, \"kind\">): DeployIntent => ({\n\t\tkind: \"deploy\",\n\t\t...opts,\n\t}),\n\tmultisend: (opts: Omit<MultiSendIntent, \"kind\">): MultiSendIntent => ({\n\t\tkind: \"multisend\",\n\t\t...opts,\n\t}),\n} as const;\n",
8
8
  "import type { Client, ClientConfig } from \"./types.ts\";\n\nconst BASE_KEYS = new Set([\n\t\"chain\",\n\t\"account\",\n\t\"transport\",\n\t\"request\",\n\t\"extend\",\n]);\n\nfunction bindExtend(base: Client): Client[\"extend\"] {\n\treturn ((fn: any) => {\n\t\tconst extensions = fn(base);\n\t\tconst next = { ...base };\n\t\tfor (const [key, value] of Object.entries(extensions)) {\n\t\t\tif (BASE_KEYS.has(key)) continue;\n\t\t\t(next as any)[key] = value;\n\t\t}\n\t\tnext.extend = bindExtend(next);\n\t\treturn next as any;\n\t}) as Client[\"extend\"];\n}\n\n/**\n * Create a base client with transport and optional chain/account.\n * Use `.extend()` to compose action decorators (public, wallet, multisig).\n */\nexport function createClient<\n\tTExtended extends Record<string, unknown> = Record<string, unknown>,\n>(config: ClientConfig): Client<TExtended> {\n\tconst transport = config.transport({ chain: config.chain });\n\n\tconst client: Client = {\n\t\tchain: config.chain,\n\t\taccount: config.account,\n\t\ttransport,\n\t\trequest: transport.request,\n\t\textend: null as any,\n\t};\n\n\tclient.extend = bindExtend(client);\n\n\treturn client as Client<TExtended>;\n}\n",
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/triggers/index.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Typed event-trigger helpers for workflows.\n *\n * import { defineWorkflow } from \"@secondlayer/workflows\"\n * import { on } from \"@secondlayer/stacks/triggers\"\n *\n * export default defineWorkflow({\n * name: \"whale-alert\",\n * trigger: on.stxTransfer({ minAmount: 100_000_000_000n }),\n * handler: async ({ event, step }) => {\n * // event is StxTransferEvent — sender, recipient, amount, tx all typed\n * },\n * })\n *\n * Each helper returns a standard `EventTrigger` (what the runner consumes)\n * plus a phantom `__event` type that `defineWorkflow` reads via conditional\n * type inference. The phantom carries no runtime value.\n */\n\nimport type {\n\tContractCallFilter,\n\tContractDeployFilter,\n\tFtBurnFilter,\n\tFtMintFilter,\n\tFtTransferFilter,\n\tNftBurnFilter,\n\tNftMintFilter,\n\tNftTransferFilter,\n\tPrintEventFilter,\n\tStxBurnFilter,\n\tStxLockFilter,\n\tStxMintFilter,\n\tStxTransferFilter,\n} from \"@secondlayer/subgraphs/types\";\nimport type { EventTrigger } from \"@secondlayer/workflows/types\";\n\n// --- Per-filter event payload shapes ---\n\n/** Metadata shared by every event. */\nexport interface TxMeta {\n\ttxId: string;\n\tsender: string;\n\tblockHeight: number;\n\tblockTime: number;\n}\n\nexport interface StxTransferEvent {\n\tsender: string;\n\trecipient: string;\n\tamount: bigint;\n\tmemo: string | null;\n\ttx: TxMeta;\n}\n\nexport interface StxMintEvent {\n\trecipient: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface StxBurnEvent {\n\tsender: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface StxLockEvent {\n\tlockedAddress: string;\n\tamount: bigint;\n\tunlockHeight: number;\n\ttx: TxMeta;\n}\n\nexport interface FtTransferEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\trecipient: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface FtMintEvent {\n\tassetIdentifier: string;\n\trecipient: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface FtBurnEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface NftTransferEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\trecipient: string;\n\ttokenId: string;\n\ttx: TxMeta;\n}\n\nexport interface NftMintEvent {\n\tassetIdentifier: string;\n\trecipient: string;\n\ttokenId: string;\n\ttx: TxMeta;\n}\n\nexport interface NftBurnEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\ttokenId: string;\n\ttx: TxMeta;\n}\n\nexport interface ContractCallEvent {\n\tcontractId: string;\n\tfunctionName: string;\n\targs: unknown[];\n\tcaller: string;\n\ttx: TxMeta;\n}\n\nexport interface ContractDeployEvent {\n\tcontractId: string;\n\tdeployer: string;\n\tcontractName: string;\n\ttx: TxMeta;\n}\n\nexport interface PrintEventEvent {\n\tcontractId: string;\n\ttopic: string | null;\n\tvalue: unknown;\n\ttx: TxMeta;\n}\n\n// --- Typed trigger wrapper ---\n\n/**\n * Phantom-typed EventTrigger. Runtime shape is identical to `EventTrigger`;\n * the `__event` field only exists at the type level for `defineWorkflow`\n * to infer the handler's `event` parameter.\n */\nexport type TypedEventTrigger<TEvent> = EventTrigger & {\n\treadonly __event?: TEvent;\n};\n\nfunction make<TEvent>(\n\tfilter: EventTrigger[\"filter\"],\n): TypedEventTrigger<TEvent> {\n\treturn { type: \"event\", filter };\n}\n\n// --- `on.*` helpers, 13 total ---\n\nexport interface TriggerHelpers {\n\tstxTransfer: (\n\t\tf?: Omit<StxTransferFilter, \"type\">,\n\t) => TypedEventTrigger<StxTransferEvent>;\n\tstxMint: (f?: Omit<StxMintFilter, \"type\">) => TypedEventTrigger<StxMintEvent>;\n\tstxBurn: (f?: Omit<StxBurnFilter, \"type\">) => TypedEventTrigger<StxBurnEvent>;\n\tstxLock: (f?: Omit<StxLockFilter, \"type\">) => TypedEventTrigger<StxLockEvent>;\n\tftTransfer: (\n\t\tf?: Omit<FtTransferFilter, \"type\">,\n\t) => TypedEventTrigger<FtTransferEvent>;\n\tftMint: (f?: Omit<FtMintFilter, \"type\">) => TypedEventTrigger<FtMintEvent>;\n\tftBurn: (f?: Omit<FtBurnFilter, \"type\">) => TypedEventTrigger<FtBurnEvent>;\n\tnftTransfer: (\n\t\tf?: Omit<NftTransferFilter, \"type\">,\n\t) => TypedEventTrigger<NftTransferEvent>;\n\tnftMint: (f?: Omit<NftMintFilter, \"type\">) => TypedEventTrigger<NftMintEvent>;\n\tnftBurn: (f?: Omit<NftBurnFilter, \"type\">) => TypedEventTrigger<NftBurnEvent>;\n\tcontractCall: (\n\t\tf?: Omit<ContractCallFilter, \"type\">,\n\t) => TypedEventTrigger<ContractCallEvent>;\n\tcontractDeploy: (\n\t\tf?: Omit<ContractDeployFilter, \"type\">,\n\t) => TypedEventTrigger<ContractDeployEvent>;\n\tprintEvent: (\n\t\tf?: Omit<PrintEventFilter, \"type\">,\n\t) => TypedEventTrigger<PrintEventEvent>;\n}\n\nexport const on: TriggerHelpers = {\n\tstxTransfer: (f = {}) =>\n\t\tmake<StxTransferEvent>({ type: \"stx_transfer\", ...f }),\n\n\tstxMint: (f = {}) => make<StxMintEvent>({ type: \"stx_mint\", ...f }),\n\n\tstxBurn: (f = {}) => make<StxBurnEvent>({ type: \"stx_burn\", ...f }),\n\n\tstxLock: (f = {}) => make<StxLockEvent>({ type: \"stx_lock\", ...f }),\n\n\tftTransfer: (f = {}) => make<FtTransferEvent>({ type: \"ft_transfer\", ...f }),\n\n\tftMint: (f = {}) => make<FtMintEvent>({ type: \"ft_mint\", ...f }),\n\n\tftBurn: (f = {}) => make<FtBurnEvent>({ type: \"ft_burn\", ...f }),\n\n\tnftTransfer: (f = {}) =>\n\t\tmake<NftTransferEvent>({ type: \"nft_transfer\", ...f }),\n\n\tnftMint: (f = {}) => make<NftMintEvent>({ type: \"nft_mint\", ...f }),\n\n\tnftBurn: (f = {}) => make<NftBurnEvent>({ type: \"nft_burn\", ...f }),\n\n\tcontractCall: (f = {}) =>\n\t\tmake<ContractCallEvent>({ type: \"contract_call\", ...f }),\n\n\tcontractDeploy: (f = {}) =>\n\t\tmake<ContractDeployEvent>({ type: \"contract_deploy\", ...f }),\n\n\tprintEvent: (f = {}) => make<PrintEventEvent>({ type: \"print_event\", ...f }),\n};\n\n/** Extract the event payload type from a trigger. */\nexport type EventOf<T> = T extends TypedEventTrigger<infer E> ? E : never;\n"
5
+ "/**\n * Typed event-trigger helpers. Each helper returns a standard `EventTrigger`\n * plus a phantom `__event` type used for inference at consumer sites. The\n * phantom carries no runtime value.\n */\n\nimport type {\n\tContractCallFilter,\n\tContractDeployFilter,\n\tFtBurnFilter,\n\tFtMintFilter,\n\tFtTransferFilter,\n\tNftBurnFilter,\n\tNftMintFilter,\n\tNftTransferFilter,\n\tPrintEventFilter,\n\tStxBurnFilter,\n\tStxLockFilter,\n\tStxMintFilter,\n\tStxTransferFilter,\n} from \"@secondlayer/subgraphs/types\";\nimport type { EventTrigger } from \"./types\";\n\n// --- Per-filter event payload shapes ---\n\n/** Metadata shared by every event. */\nexport interface TxMeta {\n\ttxId: string;\n\tsender: string;\n\tblockHeight: number;\n\tblockTime: number;\n}\n\nexport interface StxTransferEvent {\n\tsender: string;\n\trecipient: string;\n\tamount: bigint;\n\tmemo: string | null;\n\ttx: TxMeta;\n}\n\nexport interface StxMintEvent {\n\trecipient: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface StxBurnEvent {\n\tsender: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface StxLockEvent {\n\tlockedAddress: string;\n\tamount: bigint;\n\tunlockHeight: number;\n\ttx: TxMeta;\n}\n\nexport interface FtTransferEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\trecipient: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface FtMintEvent {\n\tassetIdentifier: string;\n\trecipient: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface FtBurnEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface NftTransferEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\trecipient: string;\n\ttokenId: string;\n\ttx: TxMeta;\n}\n\nexport interface NftMintEvent {\n\tassetIdentifier: string;\n\trecipient: string;\n\ttokenId: string;\n\ttx: TxMeta;\n}\n\nexport interface NftBurnEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\ttokenId: string;\n\ttx: TxMeta;\n}\n\nexport interface ContractCallEvent {\n\tcontractId: string;\n\tfunctionName: string;\n\targs: unknown[];\n\tcaller: string;\n\ttx: TxMeta;\n}\n\nexport interface ContractDeployEvent {\n\tcontractId: string;\n\tdeployer: string;\n\tcontractName: string;\n\ttx: TxMeta;\n}\n\nexport interface PrintEventEvent {\n\tcontractId: string;\n\ttopic: string | null;\n\tvalue: unknown;\n\ttx: TxMeta;\n}\n\n// --- Typed trigger wrapper ---\n\n/**\n * Phantom-typed EventTrigger. Runtime shape is identical to `EventTrigger`;\n * the `__event` field only exists at the type level for `defineWorkflow`\n * to infer the handler's `event` parameter.\n */\nexport type TypedEventTrigger<TEvent> = EventTrigger & {\n\treadonly __event?: TEvent;\n};\n\nfunction make<TEvent>(\n\tfilter: EventTrigger[\"filter\"],\n): TypedEventTrigger<TEvent> {\n\treturn { type: \"event\", filter };\n}\n\n// --- `on.*` helpers, 13 total ---\n\nexport interface TriggerHelpers {\n\tstxTransfer: (\n\t\tf?: Omit<StxTransferFilter, \"type\">,\n\t) => TypedEventTrigger<StxTransferEvent>;\n\tstxMint: (f?: Omit<StxMintFilter, \"type\">) => TypedEventTrigger<StxMintEvent>;\n\tstxBurn: (f?: Omit<StxBurnFilter, \"type\">) => TypedEventTrigger<StxBurnEvent>;\n\tstxLock: (f?: Omit<StxLockFilter, \"type\">) => TypedEventTrigger<StxLockEvent>;\n\tftTransfer: (\n\t\tf?: Omit<FtTransferFilter, \"type\">,\n\t) => TypedEventTrigger<FtTransferEvent>;\n\tftMint: (f?: Omit<FtMintFilter, \"type\">) => TypedEventTrigger<FtMintEvent>;\n\tftBurn: (f?: Omit<FtBurnFilter, \"type\">) => TypedEventTrigger<FtBurnEvent>;\n\tnftTransfer: (\n\t\tf?: Omit<NftTransferFilter, \"type\">,\n\t) => TypedEventTrigger<NftTransferEvent>;\n\tnftMint: (f?: Omit<NftMintFilter, \"type\">) => TypedEventTrigger<NftMintEvent>;\n\tnftBurn: (f?: Omit<NftBurnFilter, \"type\">) => TypedEventTrigger<NftBurnEvent>;\n\tcontractCall: (\n\t\tf?: Omit<ContractCallFilter, \"type\">,\n\t) => TypedEventTrigger<ContractCallEvent>;\n\tcontractDeploy: (\n\t\tf?: Omit<ContractDeployFilter, \"type\">,\n\t) => TypedEventTrigger<ContractDeployEvent>;\n\tprintEvent: (\n\t\tf?: Omit<PrintEventFilter, \"type\">,\n\t) => TypedEventTrigger<PrintEventEvent>;\n}\n\nexport const on: TriggerHelpers = {\n\tstxTransfer: (f = {}) =>\n\t\tmake<StxTransferEvent>({ type: \"stx_transfer\", ...f }),\n\n\tstxMint: (f = {}) => make<StxMintEvent>({ type: \"stx_mint\", ...f }),\n\n\tstxBurn: (f = {}) => make<StxBurnEvent>({ type: \"stx_burn\", ...f }),\n\n\tstxLock: (f = {}) => make<StxLockEvent>({ type: \"stx_lock\", ...f }),\n\n\tftTransfer: (f = {}) => make<FtTransferEvent>({ type: \"ft_transfer\", ...f }),\n\n\tftMint: (f = {}) => make<FtMintEvent>({ type: \"ft_mint\", ...f }),\n\n\tftBurn: (f = {}) => make<FtBurnEvent>({ type: \"ft_burn\", ...f }),\n\n\tnftTransfer: (f = {}) =>\n\t\tmake<NftTransferEvent>({ type: \"nft_transfer\", ...f }),\n\n\tnftMint: (f = {}) => make<NftMintEvent>({ type: \"nft_mint\", ...f }),\n\n\tnftBurn: (f = {}) => make<NftBurnEvent>({ type: \"nft_burn\", ...f }),\n\n\tcontractCall: (f = {}) =>\n\t\tmake<ContractCallEvent>({ type: \"contract_call\", ...f }),\n\n\tcontractDeploy: (f = {}) =>\n\t\tmake<ContractDeployEvent>({ type: \"contract_deploy\", ...f }),\n\n\tprintEvent: (f = {}) => make<PrintEventEvent>({ type: \"print_event\", ...f }),\n};\n\n/** Extract the event payload type from a trigger. */\nexport type EventOf<T> = T extends TypedEventTrigger<infer E> ? E : never;\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsJA,SAAS,IAAY,CACpB,QAC4B;AAAA,EAC5B,OAAO,EAAE,MAAM,SAAS,OAAO;AAAA;AAiCzB,IAAM,KAAqB;AAAA,EACjC,aAAa,CAAC,IAAI,CAAC,MAClB,KAAuB,EAAE,MAAM,mBAAmB,EAAE,CAAC;AAAA,EAEtD,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,YAAY,CAAC,IAAI,CAAC,MAAM,KAAsB,EAAE,MAAM,kBAAkB,EAAE,CAAC;AAAA,EAE3E,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAkB,EAAE,MAAM,cAAc,EAAE,CAAC;AAAA,EAE/D,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAkB,EAAE,MAAM,cAAc,EAAE,CAAC;AAAA,EAE/D,aAAa,CAAC,IAAI,CAAC,MAClB,KAAuB,EAAE,MAAM,mBAAmB,EAAE,CAAC;AAAA,EAEtD,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,cAAc,CAAC,IAAI,CAAC,MACnB,KAAwB,EAAE,MAAM,oBAAoB,EAAE,CAAC;AAAA,EAExD,gBAAgB,CAAC,IAAI,CAAC,MACrB,KAA0B,EAAE,MAAM,sBAAsB,EAAE,CAAC;AAAA,EAE5D,YAAY,CAAC,IAAI,CAAC,MAAM,KAAsB,EAAE,MAAM,kBAAkB,EAAE,CAAC;AAC5E;",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyIA,SAAS,IAAY,CACpB,QAC4B;AAAA,EAC5B,OAAO,EAAE,MAAM,SAAS,OAAO;AAAA;AAiCzB,IAAM,KAAqB;AAAA,EACjC,aAAa,CAAC,IAAI,CAAC,MAClB,KAAuB,EAAE,MAAM,mBAAmB,EAAE,CAAC;AAAA,EAEtD,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,YAAY,CAAC,IAAI,CAAC,MAAM,KAAsB,EAAE,MAAM,kBAAkB,EAAE,CAAC;AAAA,EAE3E,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAkB,EAAE,MAAM,cAAc,EAAE,CAAC;AAAA,EAE/D,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAkB,EAAE,MAAM,cAAc,EAAE,CAAC;AAAA,EAE/D,aAAa,CAAC,IAAI,CAAC,MAClB,KAAuB,EAAE,MAAM,mBAAmB,EAAE,CAAC;AAAA,EAEtD,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,cAAc,CAAC,IAAI,CAAC,MACnB,KAAwB,EAAE,MAAM,oBAAoB,EAAE,CAAC;AAAA,EAExD,gBAAgB,CAAC,IAAI,CAAC,MACrB,KAA0B,EAAE,MAAM,sBAAsB,EAAE,CAAC;AAAA,EAE5D,YAAY,CAAC,IAAI,CAAC,MAAM,KAAsB,EAAE,MAAM,kBAAkB,EAAE,CAAC;AAC5E;",
8
8
  "debugId": "10C54A365AA4CC8564756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,9 @@
1
1
  import { ContractCallFilter, ContractDeployFilter, FtBurnFilter, FtMintFilter, FtTransferFilter, NftBurnFilter, NftMintFilter, NftTransferFilter, PrintEventFilter, StxBurnFilter, StxLockFilter, StxMintFilter, StxTransferFilter } from "@secondlayer/subgraphs/types";
2
- import { EventTrigger } from "@secondlayer/workflows/types";
2
+ import { SubgraphFilter } from "@secondlayer/subgraphs/types";
3
+ interface EventTrigger {
4
+ type: "event";
5
+ filter: SubgraphFilter;
6
+ }
3
7
  /** Metadata shared by every event. */
4
8
  interface TxMeta {
5
9
  txId: string;
@@ -1,5 +1,9 @@
1
1
  import { ContractCallFilter, ContractDeployFilter, FtBurnFilter, FtMintFilter, FtTransferFilter, NftBurnFilter, NftMintFilter, NftTransferFilter, PrintEventFilter, StxBurnFilter, StxLockFilter, StxMintFilter, StxTransferFilter } from "@secondlayer/subgraphs/types";
2
- import { EventTrigger } from "@secondlayer/workflows/types";
2
+ import { SubgraphFilter } from "@secondlayer/subgraphs/types";
3
+ interface EventTrigger {
4
+ type: "event";
5
+ filter: SubgraphFilter;
6
+ }
3
7
  /** Metadata shared by every event. */
4
8
  interface TxMeta {
5
9
  txId: string;
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/triggers/index.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Typed event-trigger helpers for workflows.\n *\n * import { defineWorkflow } from \"@secondlayer/workflows\"\n * import { on } from \"@secondlayer/stacks/triggers\"\n *\n * export default defineWorkflow({\n * name: \"whale-alert\",\n * trigger: on.stxTransfer({ minAmount: 100_000_000_000n }),\n * handler: async ({ event, step }) => {\n * // event is StxTransferEvent — sender, recipient, amount, tx all typed\n * },\n * })\n *\n * Each helper returns a standard `EventTrigger` (what the runner consumes)\n * plus a phantom `__event` type that `defineWorkflow` reads via conditional\n * type inference. The phantom carries no runtime value.\n */\n\nimport type {\n\tContractCallFilter,\n\tContractDeployFilter,\n\tFtBurnFilter,\n\tFtMintFilter,\n\tFtTransferFilter,\n\tNftBurnFilter,\n\tNftMintFilter,\n\tNftTransferFilter,\n\tPrintEventFilter,\n\tStxBurnFilter,\n\tStxLockFilter,\n\tStxMintFilter,\n\tStxTransferFilter,\n} from \"@secondlayer/subgraphs/types\";\nimport type { EventTrigger } from \"@secondlayer/workflows/types\";\n\n// --- Per-filter event payload shapes ---\n\n/** Metadata shared by every event. */\nexport interface TxMeta {\n\ttxId: string;\n\tsender: string;\n\tblockHeight: number;\n\tblockTime: number;\n}\n\nexport interface StxTransferEvent {\n\tsender: string;\n\trecipient: string;\n\tamount: bigint;\n\tmemo: string | null;\n\ttx: TxMeta;\n}\n\nexport interface StxMintEvent {\n\trecipient: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface StxBurnEvent {\n\tsender: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface StxLockEvent {\n\tlockedAddress: string;\n\tamount: bigint;\n\tunlockHeight: number;\n\ttx: TxMeta;\n}\n\nexport interface FtTransferEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\trecipient: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface FtMintEvent {\n\tassetIdentifier: string;\n\trecipient: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface FtBurnEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface NftTransferEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\trecipient: string;\n\ttokenId: string;\n\ttx: TxMeta;\n}\n\nexport interface NftMintEvent {\n\tassetIdentifier: string;\n\trecipient: string;\n\ttokenId: string;\n\ttx: TxMeta;\n}\n\nexport interface NftBurnEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\ttokenId: string;\n\ttx: TxMeta;\n}\n\nexport interface ContractCallEvent {\n\tcontractId: string;\n\tfunctionName: string;\n\targs: unknown[];\n\tcaller: string;\n\ttx: TxMeta;\n}\n\nexport interface ContractDeployEvent {\n\tcontractId: string;\n\tdeployer: string;\n\tcontractName: string;\n\ttx: TxMeta;\n}\n\nexport interface PrintEventEvent {\n\tcontractId: string;\n\ttopic: string | null;\n\tvalue: unknown;\n\ttx: TxMeta;\n}\n\n// --- Typed trigger wrapper ---\n\n/**\n * Phantom-typed EventTrigger. Runtime shape is identical to `EventTrigger`;\n * the `__event` field only exists at the type level for `defineWorkflow`\n * to infer the handler's `event` parameter.\n */\nexport type TypedEventTrigger<TEvent> = EventTrigger & {\n\treadonly __event?: TEvent;\n};\n\nfunction make<TEvent>(\n\tfilter: EventTrigger[\"filter\"],\n): TypedEventTrigger<TEvent> {\n\treturn { type: \"event\", filter };\n}\n\n// --- `on.*` helpers, 13 total ---\n\nexport interface TriggerHelpers {\n\tstxTransfer: (\n\t\tf?: Omit<StxTransferFilter, \"type\">,\n\t) => TypedEventTrigger<StxTransferEvent>;\n\tstxMint: (f?: Omit<StxMintFilter, \"type\">) => TypedEventTrigger<StxMintEvent>;\n\tstxBurn: (f?: Omit<StxBurnFilter, \"type\">) => TypedEventTrigger<StxBurnEvent>;\n\tstxLock: (f?: Omit<StxLockFilter, \"type\">) => TypedEventTrigger<StxLockEvent>;\n\tftTransfer: (\n\t\tf?: Omit<FtTransferFilter, \"type\">,\n\t) => TypedEventTrigger<FtTransferEvent>;\n\tftMint: (f?: Omit<FtMintFilter, \"type\">) => TypedEventTrigger<FtMintEvent>;\n\tftBurn: (f?: Omit<FtBurnFilter, \"type\">) => TypedEventTrigger<FtBurnEvent>;\n\tnftTransfer: (\n\t\tf?: Omit<NftTransferFilter, \"type\">,\n\t) => TypedEventTrigger<NftTransferEvent>;\n\tnftMint: (f?: Omit<NftMintFilter, \"type\">) => TypedEventTrigger<NftMintEvent>;\n\tnftBurn: (f?: Omit<NftBurnFilter, \"type\">) => TypedEventTrigger<NftBurnEvent>;\n\tcontractCall: (\n\t\tf?: Omit<ContractCallFilter, \"type\">,\n\t) => TypedEventTrigger<ContractCallEvent>;\n\tcontractDeploy: (\n\t\tf?: Omit<ContractDeployFilter, \"type\">,\n\t) => TypedEventTrigger<ContractDeployEvent>;\n\tprintEvent: (\n\t\tf?: Omit<PrintEventFilter, \"type\">,\n\t) => TypedEventTrigger<PrintEventEvent>;\n}\n\nexport const on: TriggerHelpers = {\n\tstxTransfer: (f = {}) =>\n\t\tmake<StxTransferEvent>({ type: \"stx_transfer\", ...f }),\n\n\tstxMint: (f = {}) => make<StxMintEvent>({ type: \"stx_mint\", ...f }),\n\n\tstxBurn: (f = {}) => make<StxBurnEvent>({ type: \"stx_burn\", ...f }),\n\n\tstxLock: (f = {}) => make<StxLockEvent>({ type: \"stx_lock\", ...f }),\n\n\tftTransfer: (f = {}) => make<FtTransferEvent>({ type: \"ft_transfer\", ...f }),\n\n\tftMint: (f = {}) => make<FtMintEvent>({ type: \"ft_mint\", ...f }),\n\n\tftBurn: (f = {}) => make<FtBurnEvent>({ type: \"ft_burn\", ...f }),\n\n\tnftTransfer: (f = {}) =>\n\t\tmake<NftTransferEvent>({ type: \"nft_transfer\", ...f }),\n\n\tnftMint: (f = {}) => make<NftMintEvent>({ type: \"nft_mint\", ...f }),\n\n\tnftBurn: (f = {}) => make<NftBurnEvent>({ type: \"nft_burn\", ...f }),\n\n\tcontractCall: (f = {}) =>\n\t\tmake<ContractCallEvent>({ type: \"contract_call\", ...f }),\n\n\tcontractDeploy: (f = {}) =>\n\t\tmake<ContractDeployEvent>({ type: \"contract_deploy\", ...f }),\n\n\tprintEvent: (f = {}) => make<PrintEventEvent>({ type: \"print_event\", ...f }),\n};\n\n/** Extract the event payload type from a trigger. */\nexport type EventOf<T> = T extends TypedEventTrigger<infer E> ? E : never;\n"
5
+ "/**\n * Typed event-trigger helpers. Each helper returns a standard `EventTrigger`\n * plus a phantom `__event` type used for inference at consumer sites. The\n * phantom carries no runtime value.\n */\n\nimport type {\n\tContractCallFilter,\n\tContractDeployFilter,\n\tFtBurnFilter,\n\tFtMintFilter,\n\tFtTransferFilter,\n\tNftBurnFilter,\n\tNftMintFilter,\n\tNftTransferFilter,\n\tPrintEventFilter,\n\tStxBurnFilter,\n\tStxLockFilter,\n\tStxMintFilter,\n\tStxTransferFilter,\n} from \"@secondlayer/subgraphs/types\";\nimport type { EventTrigger } from \"./types\";\n\n// --- Per-filter event payload shapes ---\n\n/** Metadata shared by every event. */\nexport interface TxMeta {\n\ttxId: string;\n\tsender: string;\n\tblockHeight: number;\n\tblockTime: number;\n}\n\nexport interface StxTransferEvent {\n\tsender: string;\n\trecipient: string;\n\tamount: bigint;\n\tmemo: string | null;\n\ttx: TxMeta;\n}\n\nexport interface StxMintEvent {\n\trecipient: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface StxBurnEvent {\n\tsender: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface StxLockEvent {\n\tlockedAddress: string;\n\tamount: bigint;\n\tunlockHeight: number;\n\ttx: TxMeta;\n}\n\nexport interface FtTransferEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\trecipient: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface FtMintEvent {\n\tassetIdentifier: string;\n\trecipient: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface FtBurnEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\tamount: bigint;\n\ttx: TxMeta;\n}\n\nexport interface NftTransferEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\trecipient: string;\n\ttokenId: string;\n\ttx: TxMeta;\n}\n\nexport interface NftMintEvent {\n\tassetIdentifier: string;\n\trecipient: string;\n\ttokenId: string;\n\ttx: TxMeta;\n}\n\nexport interface NftBurnEvent {\n\tassetIdentifier: string;\n\tsender: string;\n\ttokenId: string;\n\ttx: TxMeta;\n}\n\nexport interface ContractCallEvent {\n\tcontractId: string;\n\tfunctionName: string;\n\targs: unknown[];\n\tcaller: string;\n\ttx: TxMeta;\n}\n\nexport interface ContractDeployEvent {\n\tcontractId: string;\n\tdeployer: string;\n\tcontractName: string;\n\ttx: TxMeta;\n}\n\nexport interface PrintEventEvent {\n\tcontractId: string;\n\ttopic: string | null;\n\tvalue: unknown;\n\ttx: TxMeta;\n}\n\n// --- Typed trigger wrapper ---\n\n/**\n * Phantom-typed EventTrigger. Runtime shape is identical to `EventTrigger`;\n * the `__event` field only exists at the type level for `defineWorkflow`\n * to infer the handler's `event` parameter.\n */\nexport type TypedEventTrigger<TEvent> = EventTrigger & {\n\treadonly __event?: TEvent;\n};\n\nfunction make<TEvent>(\n\tfilter: EventTrigger[\"filter\"],\n): TypedEventTrigger<TEvent> {\n\treturn { type: \"event\", filter };\n}\n\n// --- `on.*` helpers, 13 total ---\n\nexport interface TriggerHelpers {\n\tstxTransfer: (\n\t\tf?: Omit<StxTransferFilter, \"type\">,\n\t) => TypedEventTrigger<StxTransferEvent>;\n\tstxMint: (f?: Omit<StxMintFilter, \"type\">) => TypedEventTrigger<StxMintEvent>;\n\tstxBurn: (f?: Omit<StxBurnFilter, \"type\">) => TypedEventTrigger<StxBurnEvent>;\n\tstxLock: (f?: Omit<StxLockFilter, \"type\">) => TypedEventTrigger<StxLockEvent>;\n\tftTransfer: (\n\t\tf?: Omit<FtTransferFilter, \"type\">,\n\t) => TypedEventTrigger<FtTransferEvent>;\n\tftMint: (f?: Omit<FtMintFilter, \"type\">) => TypedEventTrigger<FtMintEvent>;\n\tftBurn: (f?: Omit<FtBurnFilter, \"type\">) => TypedEventTrigger<FtBurnEvent>;\n\tnftTransfer: (\n\t\tf?: Omit<NftTransferFilter, \"type\">,\n\t) => TypedEventTrigger<NftTransferEvent>;\n\tnftMint: (f?: Omit<NftMintFilter, \"type\">) => TypedEventTrigger<NftMintEvent>;\n\tnftBurn: (f?: Omit<NftBurnFilter, \"type\">) => TypedEventTrigger<NftBurnEvent>;\n\tcontractCall: (\n\t\tf?: Omit<ContractCallFilter, \"type\">,\n\t) => TypedEventTrigger<ContractCallEvent>;\n\tcontractDeploy: (\n\t\tf?: Omit<ContractDeployFilter, \"type\">,\n\t) => TypedEventTrigger<ContractDeployEvent>;\n\tprintEvent: (\n\t\tf?: Omit<PrintEventFilter, \"type\">,\n\t) => TypedEventTrigger<PrintEventEvent>;\n}\n\nexport const on: TriggerHelpers = {\n\tstxTransfer: (f = {}) =>\n\t\tmake<StxTransferEvent>({ type: \"stx_transfer\", ...f }),\n\n\tstxMint: (f = {}) => make<StxMintEvent>({ type: \"stx_mint\", ...f }),\n\n\tstxBurn: (f = {}) => make<StxBurnEvent>({ type: \"stx_burn\", ...f }),\n\n\tstxLock: (f = {}) => make<StxLockEvent>({ type: \"stx_lock\", ...f }),\n\n\tftTransfer: (f = {}) => make<FtTransferEvent>({ type: \"ft_transfer\", ...f }),\n\n\tftMint: (f = {}) => make<FtMintEvent>({ type: \"ft_mint\", ...f }),\n\n\tftBurn: (f = {}) => make<FtBurnEvent>({ type: \"ft_burn\", ...f }),\n\n\tnftTransfer: (f = {}) =>\n\t\tmake<NftTransferEvent>({ type: \"nft_transfer\", ...f }),\n\n\tnftMint: (f = {}) => make<NftMintEvent>({ type: \"nft_mint\", ...f }),\n\n\tnftBurn: (f = {}) => make<NftBurnEvent>({ type: \"nft_burn\", ...f }),\n\n\tcontractCall: (f = {}) =>\n\t\tmake<ContractCallEvent>({ type: \"contract_call\", ...f }),\n\n\tcontractDeploy: (f = {}) =>\n\t\tmake<ContractDeployEvent>({ type: \"contract_deploy\", ...f }),\n\n\tprintEvent: (f = {}) => make<PrintEventEvent>({ type: \"print_event\", ...f }),\n};\n\n/** Extract the event payload type from a trigger. */\nexport type EventOf<T> = T extends TypedEventTrigger<infer E> ? E : never;\n"
6
6
  ],
7
- "mappings": ";AAsJA,SAAS,IAAY,CACpB,QAC4B;AAAA,EAC5B,OAAO,EAAE,MAAM,SAAS,OAAO;AAAA;AAiCzB,IAAM,KAAqB;AAAA,EACjC,aAAa,CAAC,IAAI,CAAC,MAClB,KAAuB,EAAE,MAAM,mBAAmB,EAAE,CAAC;AAAA,EAEtD,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,YAAY,CAAC,IAAI,CAAC,MAAM,KAAsB,EAAE,MAAM,kBAAkB,EAAE,CAAC;AAAA,EAE3E,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAkB,EAAE,MAAM,cAAc,EAAE,CAAC;AAAA,EAE/D,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAkB,EAAE,MAAM,cAAc,EAAE,CAAC;AAAA,EAE/D,aAAa,CAAC,IAAI,CAAC,MAClB,KAAuB,EAAE,MAAM,mBAAmB,EAAE,CAAC;AAAA,EAEtD,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,cAAc,CAAC,IAAI,CAAC,MACnB,KAAwB,EAAE,MAAM,oBAAoB,EAAE,CAAC;AAAA,EAExD,gBAAgB,CAAC,IAAI,CAAC,MACrB,KAA0B,EAAE,MAAM,sBAAsB,EAAE,CAAC;AAAA,EAE5D,YAAY,CAAC,IAAI,CAAC,MAAM,KAAsB,EAAE,MAAM,kBAAkB,EAAE,CAAC;AAC5E;",
7
+ "mappings": ";AAyIA,SAAS,IAAY,CACpB,QAC4B;AAAA,EAC5B,OAAO,EAAE,MAAM,SAAS,OAAO;AAAA;AAiCzB,IAAM,KAAqB;AAAA,EACjC,aAAa,CAAC,IAAI,CAAC,MAClB,KAAuB,EAAE,MAAM,mBAAmB,EAAE,CAAC;AAAA,EAEtD,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,YAAY,CAAC,IAAI,CAAC,MAAM,KAAsB,EAAE,MAAM,kBAAkB,EAAE,CAAC;AAAA,EAE3E,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAkB,EAAE,MAAM,cAAc,EAAE,CAAC;AAAA,EAE/D,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAkB,EAAE,MAAM,cAAc,EAAE,CAAC;AAAA,EAE/D,aAAa,CAAC,IAAI,CAAC,MAClB,KAAuB,EAAE,MAAM,mBAAmB,EAAE,CAAC;AAAA,EAEtD,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,SAAS,CAAC,IAAI,CAAC,MAAM,KAAmB,EAAE,MAAM,eAAe,EAAE,CAAC;AAAA,EAElE,cAAc,CAAC,IAAI,CAAC,MACnB,KAAwB,EAAE,MAAM,oBAAoB,EAAE,CAAC;AAAA,EAExD,gBAAgB,CAAC,IAAI,CAAC,MACrB,KAA0B,EAAE,MAAM,sBAAsB,EAAE,CAAC;AAAA,EAE5D,YAAY,CAAC,IAAI,CAAC,MAAM,KAAsB,EAAE,MAAM,kBAAkB,EAAE,CAAC;AAC5E;",
8
8
  "debugId": "3E5DFF22EC6ECA5D64756E2164756E21",
9
9
  "names": []
10
10
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@secondlayer/stacks",
3
- "version": "0.3.0",
3
+ "version": "1.0.0-alpha.0",
4
4
  "description": "A viem-style SDK for the Stacks blockchain",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.cjs",
@@ -151,8 +151,7 @@
151
151
  "@noble/ciphers": "2.1.1",
152
152
  "@noble/curves": "2.0.1",
153
153
  "@scure/bip39": "2.0.1",
154
- "@secondlayer/subgraphs": "^0.11.7",
155
- "@secondlayer/workflows": "^1.1.0",
154
+ "@secondlayer/subgraphs": "^1.0.0-alpha.0",
156
155
  "ai": "6.0.167",
157
156
  "zod": "^4.3.6"
158
157
  }