stxer 0.7.0 → 0.9.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.
@@ -1 +1 @@
1
- {"version":3,"file":"stxer.cjs.production.min.js","sources":["../src/constants.ts","../src/ast.ts","../src/batch-api.ts","../src/batch-processor.ts","../src/clarity-api.ts","../src/simulation-api.ts","../src/simulation.ts","../src/tip.ts","../src/types.ts"],"sourcesContent":["/**\n * API endpoint constants\n */\n\n/** Default stxer API endpoint for mainnet */\nexport const STXER_API_MAINNET = 'https://api.stxer.xyz';\n\n/** stxer API endpoint for testnet */\nexport const STXER_API_TESTNET = 'https://testnet-api.stxer.xyz';\n\n/** Default stxer API endpoint (mainnet) */\nexport const DEFAULT_STXER_API = STXER_API_MAINNET;\n","/**\n * WARNING:\n *\n * this file will be used in cross-runtime environments (browser, cloudflare workers, XLinkSDK, etc.),\n * so please be careful when adding `import`s to it.\n */\n\nimport { DEFAULT_STXER_API } from './constants';\nimport type { ClarityEpoch, ContractAST } from './types';\n\nexport interface AstOptions {\n stxerApi?: string;\n}\n\nexport interface GetContractAstOptions extends AstOptions {\n contractId: string;\n}\n\n/**\n * Fetch the AST for an on-chain contract.\n * @param options - Contract ID and optional API endpoint\n * @returns The contract AST with metadata\n */\nexport async function getContractAST(\n options: GetContractAstOptions,\n): Promise<ContractAST> {\n const url = `${options.stxerApi ?? DEFAULT_STXER_API}/contracts/${options.contractId}`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch contract AST: ${response.status} ${response.statusText}`,\n );\n }\n\n const text = await response.text();\n if (!text.startsWith('{')) {\n throw new Error(`Invalid response from contracts endpoint: ${text}`);\n }\n\n return JSON.parse(text) as ContractAST;\n}\n\nexport interface ParseContractOptions extends AstOptions {\n sourceCode: string;\n contractId: string;\n clarityVersion?: '1' | '2' | '3' | '4';\n epoch?: ClarityEpoch;\n}\n\n/**\n * Parse contract source code into an AST.\n * @param options - Source code, contract ID, and optional configuration\n * @returns The parsed contract AST\n */\nexport async function parseContract(\n options: ParseContractOptions,\n): Promise<ContractAST> {\n const url = `${options.stxerApi ?? DEFAULT_STXER_API}/contracts:parse`;\n\n const payload: {\n contract_id: string;\n source_code: string;\n clarity_version?: string;\n epoch?: string;\n } = {\n contract_id: options.contractId,\n source_code: options.sourceCode,\n };\n\n if (options.clarityVersion !== undefined) {\n payload.clarity_version = options.clarityVersion;\n }\n if (options.epoch !== undefined) {\n payload.epoch = options.epoch;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to parse contract: ${response.status} ${response.statusText}`,\n );\n }\n\n const text = await response.text();\n if (!text.startsWith('{')) {\n throw new Error(`Invalid response from contract parse endpoint: ${text}`);\n }\n\n return JSON.parse(text) as ContractAST;\n}\n\n// Re-export AST-related types for convenience\nexport type {\n ClarityAbi,\n ClarityAbiFunction,\n ClarityAbiFungibleToken,\n ClarityAbiMap,\n ClarityAbiNonFungibleToken,\n ClarityAbiType,\n ClarityAbiVariable,\n ClarityEpoch,\n ClarityVersion,\n ContractAST,\n SymbolicExpression,\n} from './types';\n","/**\n * WARNING:\n *\n * this file will be used in cross-runtime environments (browser, cloudflare workers, XLinkSDK, etc.),\n * so please be careful when adding `import`s to it.\n */\n\nimport {\n type ClarityValue,\n type ContractPrincipalCV,\n deserializeCV,\n serializeCV,\n} from '@stacks/transactions';\n\nexport interface BatchReads {\n variables?: {\n contract: ContractPrincipalCV;\n variableName: string;\n }[];\n maps?: {\n contract: ContractPrincipalCV;\n mapName: string;\n mapKey: ClarityValue;\n }[];\n readonly?: {\n contract: ContractPrincipalCV;\n functionName: string;\n functionArgs: ClarityValue[];\n }[];\n index_block_hash?: string;\n}\n\nexport interface BatchReadsResult {\n /** Index block hash the batch ran against. Matches the wire field name. */\n index_block_hash: string;\n vars: (ClarityValue | Error)[];\n maps: (ClarityValue | Error)[];\n readonly: (ClarityValue | Error)[];\n}\n\nexport interface BatchApiOptions {\n stxerApi?: string;\n}\n\nconst DEFAULT_STXER_API = 'https://api.stxer.xyz';\n\nfunction convertResults(\n rs: ({ Ok: string } | { Err: string })[] | undefined,\n): (ClarityValue | Error)[] {\n const results: (ClarityValue | Error)[] = [];\n for (const v of rs ?? []) {\n if ('Ok' in v) {\n results.push(deserializeCV(v.Ok));\n } else {\n results.push(new Error(v.Err));\n }\n }\n return results;\n}\n\nexport async function batchRead(\n reads: BatchReads,\n options: BatchApiOptions = {},\n): Promise<BatchReadsResult> {\n const ibh =\n reads.index_block_hash == null\n ? undefined\n : reads.index_block_hash.startsWith('0x')\n ? reads.index_block_hash.substring(2)\n : reads.index_block_hash;\n\n const payload: {\n tip?: string;\n vars: string[][];\n maps: string[][];\n readonly: string[][];\n } = { vars: [], maps: [], readonly: [], tip: ibh };\n\n if (reads.variables != null) {\n for (const variable of reads.variables) {\n payload.vars.push([\n serializeCV(variable.contract),\n variable.variableName,\n ]);\n }\n }\n\n if (reads.maps != null) {\n for (const map of reads.maps) {\n payload.maps.push([\n serializeCV(map.contract),\n map.mapName,\n serializeCV(map.mapKey),\n ]);\n }\n }\n\n if (reads.readonly != null) {\n for (const ro of reads.readonly) {\n payload.readonly.push([\n serializeCV(ro.contract),\n ro.functionName,\n ...ro.functionArgs.map((v) => serializeCV(v)),\n ]);\n }\n }\n\n const url = `${options.stxerApi ?? DEFAULT_STXER_API}/sidecar/v2/batch`;\n const data = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n const text = await data.text();\n if (!text.includes('Ok') && !text.includes('Err')) {\n throw new Error(\n `Requesting batch reads failed: ${text}, url: ${url}, payload: ${JSON.stringify(\n payload,\n )}`,\n );\n }\n\n const rs = JSON.parse(text) as {\n index_block_hash: string;\n vars?: ({ Ok: string } | { Err: string })[];\n maps?: ({ Ok: string } | { Err: string })[];\n readonly?: ({ Ok: string } | { Err: string })[];\n };\n\n return {\n index_block_hash: rs.index_block_hash,\n vars: convertResults(rs.vars),\n maps: convertResults(rs.maps),\n readonly: convertResults(rs.readonly),\n };\n}\n","/**\n * WARNING:\n *\n * this file will be used in cross-runtime environments (browser, cloudflare workers, XLinkSDK, etc.),\n * so please be careful when adding `import`s to it.\n */\n\nimport {\n type ClarityValue,\n contractPrincipalCV,\n type OptionalCV,\n} from '@stacks/transactions';\nimport { type BatchReads, batchRead } from './batch-api';\n\nexport interface ReadOnlyRequest {\n mode: 'readonly';\n contractAddress: string;\n contractName: string;\n functionName: string;\n functionArgs: ClarityValue[];\n}\n\nexport interface MapEntryRequest {\n mode: 'mapEntry';\n contractAddress: string;\n contractName: string;\n mapName: string;\n mapKey: ClarityValue;\n}\n\nexport interface VariableRequest {\n mode: 'variable';\n contractAddress: string;\n contractName: string;\n variableName: string;\n}\n\nexport type BatchRequest = MapEntryRequest | VariableRequest | ReadOnlyRequest;\n\nexport interface QueuedRequest {\n request: BatchRequest;\n tip?: string;\n resolve: (value: ClarityValue | OptionalCV) => void;\n reject: (error: Error) => void;\n}\n\nexport class BatchProcessor {\n private queues = new Map<string, QueuedRequest[]>();\n private timeoutIds = new Map<string, ReturnType<typeof setTimeout>>();\n\n private readonly stxerAPIEndpoint: string;\n private readonly batchDelayMs: number;\n\n constructor(options: { stxerAPIEndpoint?: string; batchDelayMs: number }) {\n this.stxerAPIEndpoint = options.stxerAPIEndpoint ?? 'https://api.stxer.xyz';\n this.batchDelayMs = options.batchDelayMs;\n }\n\n private getQueueKey(tip?: string): string {\n return tip ?? '_undefined';\n }\n\n read(request: BatchRequest): Promise<ClarityValue | OptionalCV> {\n return new Promise((resolve, reject) => {\n this.enqueue({ request, resolve, reject });\n });\n }\n\n enqueue(request: QueuedRequest): void {\n const queueKey = this.getQueueKey(request.tip);\n\n const queue = this.queues.get(queueKey) ?? [];\n if (!this.queues.has(queueKey)) {\n this.queues.set(queueKey, queue);\n }\n queue.push(request);\n\n if (!this.timeoutIds.has(queueKey)) {\n const timeoutId = setTimeout(\n () => this.processBatch(queueKey),\n this.batchDelayMs,\n );\n this.timeoutIds.set(queueKey, timeoutId);\n }\n }\n\n private async processBatch(queueKey: string): Promise<void> {\n const currentQueue = this.queues.get(queueKey) ?? [];\n this.queues.delete(queueKey);\n\n const timeoutId = this.timeoutIds.get(queueKey);\n if (timeoutId) {\n clearTimeout(timeoutId);\n this.timeoutIds.delete(queueKey);\n }\n\n if (currentQueue.length === 0) return;\n\n try {\n const readonlyRequests = currentQueue.filter(\n (q): q is QueuedRequest & { request: ReadOnlyRequest } =>\n q.request.mode === 'readonly',\n );\n const mapRequests = currentQueue.filter(\n (q): q is QueuedRequest & { request: MapEntryRequest } =>\n q.request.mode === 'mapEntry',\n );\n const variableRequests = currentQueue.filter(\n (q): q is QueuedRequest & { request: VariableRequest } =>\n q.request.mode === 'variable',\n );\n\n const tip = queueKey === '_undefined' ? undefined : queueKey;\n\n const batchRequest: BatchReads = {\n readonly: readonlyRequests.map(({ request }) => ({\n contract: contractPrincipalCV(\n request.contractAddress,\n request.contractName,\n ),\n functionName: request.functionName,\n functionArgs: request.functionArgs,\n })),\n maps: mapRequests.map(({ request }) => ({\n contract: contractPrincipalCV(\n request.contractAddress,\n request.contractName,\n ),\n mapName: request.mapName,\n mapKey: request.mapKey,\n })),\n variables: variableRequests.map(({ request }) => ({\n contract: contractPrincipalCV(\n request.contractAddress,\n request.contractName,\n ),\n variableName: request.variableName,\n })),\n index_block_hash: tip,\n };\n\n const results = await batchRead(batchRequest, {\n stxerApi: this.stxerAPIEndpoint,\n });\n\n // Handle readonly results\n for (const [index, result] of results.readonly.entries()) {\n if (result instanceof Error) {\n readonlyRequests[index].reject(result);\n } else {\n readonlyRequests[index].resolve(result);\n }\n }\n\n // Handle variable results\n for (const [index, result] of results.vars.entries()) {\n if (result instanceof Error) {\n variableRequests[index].reject(result);\n } else {\n variableRequests[index].resolve(result);\n }\n }\n\n // Handle map results\n for (const [index, result] of results.maps.entries()) {\n if (result instanceof Error) {\n mapRequests[index].reject(result);\n } else {\n mapRequests[index].resolve(result);\n }\n }\n } catch (error) {\n for (const item of currentQueue) {\n item.reject(error as Error);\n }\n }\n }\n}\n","import {\n ClarityType,\n type ClarityValue,\n type OptionalCV,\n} from '@stacks/transactions';\nimport type {\n ClarityAbiFunction,\n ClarityAbiMap,\n ClarityAbiVariable,\n TContractPrincipal,\n TPrincipal,\n} from 'clarity-abi';\nimport type {\n InferMapValueType,\n InferReadMapParameterType,\n InferReadonlyCallParameterType,\n InferReadonlyCallResultType,\n InferReadVariableParameterType,\n InferVariableType,\n} from 'ts-clarity';\nimport { decodeAbi, encodeAbi } from 'ts-clarity';\nimport { BatchProcessor } from './batch-processor';\n\n// Shared processor instance with default settings\nconst defaultProcessor = new BatchProcessor({\n batchDelayMs: 100,\n});\n\nexport type ReadonlyCallRuntimeOptions = {\n sender?: TPrincipal;\n contract: TContractPrincipal;\n stacksEndpoint?: string;\n indexBlockHash?: string;\n batchProcessor?: BatchProcessor;\n};\n\nexport type ReadMapRuntimeParameters = {\n contract: TContractPrincipal;\n stacksEndpoint?: string;\n proof?: boolean;\n indexBlockHash?: string;\n batchProcessor?: BatchProcessor;\n};\n\nexport type ReadVariableRuntimeParameterType = {\n contract: TContractPrincipal;\n stacksEndpoint?: string;\n proof?: boolean;\n indexBlockHash?: string;\n batchProcessor?: BatchProcessor;\n};\n\nexport async function callReadonly<\n Functions extends readonly ClarityAbiFunction[] | readonly unknown[],\n FunctionName extends string,\n>(\n params: InferReadonlyCallParameterType<Functions, FunctionName> &\n ReadonlyCallRuntimeOptions,\n): Promise<InferReadonlyCallResultType<Functions, FunctionName>> {\n const processor = params.batchProcessor ?? defaultProcessor;\n const [deployer, contractName] = params.contract.split('.', 2);\n const fn = String(params.functionName);\n\n const functionDef = (params.abi as readonly ClarityAbiFunction[]).find(\n (def) => def.name === params.functionName,\n );\n if (!functionDef) {\n throw new Error(\n `failed to find function definition for ${params.functionName}`,\n );\n }\n\n const argsKV = (params as unknown as { args: Record<string, unknown> }).args;\n const args: ClarityValue[] = [];\n for (const argDef of functionDef.args) {\n args.push(encodeAbi(argDef.type, argsKV[argDef.name]));\n }\n\n return new Promise((resolve, reject) => {\n processor.enqueue({\n request: {\n mode: 'readonly',\n contractAddress: deployer,\n contractName: contractName,\n functionName: fn,\n functionArgs: args,\n },\n tip: params.indexBlockHash,\n resolve: (result: ClarityValue | OptionalCV) => {\n try {\n const decoded = decodeAbi(functionDef.outputs.type, result);\n resolve(\n decoded as InferReadonlyCallResultType<Functions, FunctionName>,\n );\n } catch (error) {\n reject(error);\n }\n },\n reject,\n });\n });\n}\n\nexport async function readMap<\n Maps extends\n | readonly ClarityAbiMap[]\n | readonly unknown[] = readonly ClarityAbiMap[],\n MapName extends string = string,\n>(\n params: InferReadMapParameterType<Maps, MapName> & ReadMapRuntimeParameters,\n): Promise<InferMapValueType<Maps, MapName> | null> {\n const processor = params.batchProcessor ?? defaultProcessor;\n const [deployer, contractName] = params.contract.split('.', 2);\n\n const mapDef = (params.abi as readonly ClarityAbiMap[]).find(\n (m) => m.name === params.mapName,\n );\n if (!mapDef) {\n throw new Error(`failed to find map definition for ${params.mapName}`);\n }\n\n const key: ClarityValue = encodeAbi(mapDef.key, params.key);\n\n return new Promise((resolve, reject) => {\n processor.enqueue({\n request: {\n mode: 'mapEntry',\n contractAddress: deployer,\n contractName: contractName,\n mapName: params.mapName,\n mapKey: key,\n },\n tip: params.indexBlockHash,\n resolve: (result: ClarityValue | OptionalCV) => {\n try {\n if (result.type === ClarityType.OptionalNone) {\n resolve(null);\n return;\n }\n if (result.type !== ClarityType.OptionalSome) {\n throw new Error(`unexpected map value: ${result}`);\n }\n const someCV = result as {\n type: ClarityType.OptionalSome;\n value: ClarityValue;\n };\n const decoded = decodeAbi(mapDef.value, someCV.value);\n resolve(decoded as InferMapValueType<Maps, MapName>);\n } catch (error) {\n reject(error);\n }\n },\n reject,\n });\n });\n}\n\nexport async function readVariable<\n Variables extends\n | readonly ClarityAbiVariable[]\n | readonly unknown[] = readonly ClarityAbiVariable[],\n VariableName extends string = string,\n>(\n params: InferReadVariableParameterType<Variables, VariableName> &\n ReadVariableRuntimeParameterType,\n): Promise<InferVariableType<Variables, VariableName>> {\n const processor = params.batchProcessor ?? defaultProcessor;\n const [deployer, contractName] = params.contract.split('.', 2);\n\n const varDef = (params.abi as readonly ClarityAbiVariable[]).find(\n (def) => def.name === params.variableName,\n );\n if (!varDef) {\n throw new Error(\n `failed to find variable definition for ${params.variableName}`,\n );\n }\n\n return new Promise((resolve, reject) => {\n processor.enqueue({\n request: {\n mode: 'variable',\n contractAddress: deployer,\n contractName: contractName,\n variableName: params.variableName,\n },\n tip: params.indexBlockHash,\n resolve: (result: ClarityValue | OptionalCV) => {\n try {\n const decoded = decodeAbi(varDef.type, result);\n resolve(decoded as InferVariableType<Variables, VariableName>);\n } catch (error) {\n reject(error);\n }\n },\n reject,\n });\n });\n}\n","/**\n * Low-level programmatic simulation APIs\n *\n * These functions provide direct access to the stxer V2 simulation endpoints\n * for programmatic use cases where you need more control than SimulationBuilder provides.\n */\n\nimport { DEFAULT_STXER_API } from './constants';\nimport type {\n InstantSimulationRequest,\n InstantSimulationResponse,\n SimulationBatchReadsRequest,\n SimulationBatchReadsResponse,\n SimulationResult,\n SubmitSimulationStepsRequest,\n SubmitSimulationStepsResponse,\n} from './types';\n\n/**\n * Options for API calls\n */\nexport interface SimulationApiOptions {\n /** stxer API endpoint (default: https://api.stxer.xyz) */\n stxerApi?: string;\n}\n\n/**\n * Create simulation session options\n */\nexport interface CreateSessionOptions {\n /** Block height for simulation (optional, uses tip if not provided) */\n block_height?: number;\n /** Block hash corresponding to block_height */\n block_hash?: string;\n /** Skip debug tracing for faster simulations */\n skip_tracing?: boolean;\n}\n\n/**\n * Instantly simulate a transaction\n *\n * This is useful for apps/wallets to get the result of a transaction before sending it.\n * Lightweight - no debug tracing information.\n *\n * @param request - Instant simulation request\n * @param options - API options\n * @returns Instant simulation response with receipt and optional reads\n *\n * @example\n * ```typescript\n * import { instantSimulation } from 'stxer';\n *\n * const result = await instantSimulation({\n * transaction: '0x...',\n * block_height: 130818,\n * block_hash: '0x...',\n * reads: [\n * { DataVar: ['SP...contract', 'my-var'] },\n * { StxBalance: 'SP...' }\n * ]\n * });\n * console.log(result.receipt.result);\n * ```\n */\nexport async function instantSimulation(\n request: InstantSimulationRequest,\n options: SimulationApiOptions = {},\n): Promise<InstantSimulationResponse> {\n const apiEndpoint = options.stxerApi ?? DEFAULT_STXER_API;\n\n const response = await fetch(\n `${apiEndpoint}/devtools/v2/simulations:instant`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Instant simulation failed: ${text}`);\n }\n\n return response.json() as Promise<InstantSimulationResponse>;\n}\n\n/**\n * Create a new simulation session\n *\n * A session allows you to run multiple steps in a forked chain state.\n *\n * @param options - Create session options\n * @param apiOptions - API options\n * @returns Session ID\n *\n * @example\n * ```typescript\n * import { createSimulationSession } from 'stxer';\n *\n * const sessionId = await createSimulationSession({\n * block_height: 130818,\n * skip_tracing: false\n * });\n * ```\n */\nexport async function createSimulationSession(\n options: CreateSessionOptions = {},\n apiOptions: SimulationApiOptions = {},\n): Promise<string> {\n const apiEndpoint = apiOptions.stxerApi ?? DEFAULT_STXER_API;\n\n const response = await fetch(`${apiEndpoint}/devtools/v2/simulations`, {\n method: 'POST',\n body: JSON.stringify(options),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to create simulation session: ${text}`);\n }\n\n const result = (await response.json()) as { id: string };\n return result.id;\n}\n\n/**\n * Submit steps to a simulation session\n *\n * Steps are executed sequentially in the session's forked chain state.\n *\n * @param sessionId - Simulation session ID\n * @param request - Steps to submit\n * @param options - API options\n * @returns Array of step results\n *\n * @example\n * ```typescript\n * import { submitSimulationSteps } from 'stxer';\n *\n * const results = await submitSimulationSteps(sessionId, {\n * steps: [\n * { Transaction: '0x...' },\n * { Eval: ['SP...', '', 'SP...contract', '(var-get my-var)'] },\n * { Reads: [{ DataVar: ['SP...contract', 'my-var'] }] }\n * ]\n * });\n * ```\n */\nexport async function submitSimulationSteps(\n sessionId: string,\n request: SubmitSimulationStepsRequest,\n options: SimulationApiOptions = {},\n): Promise<SubmitSimulationStepsResponse> {\n const apiEndpoint = options.stxerApi ?? DEFAULT_STXER_API;\n\n const response = await fetch(\n `${apiEndpoint}/devtools/v2/simulations/${sessionId}`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to submit simulation steps: ${text}`);\n }\n\n return response.json() as Promise<SubmitSimulationStepsResponse>;\n}\n\n/**\n * Get simulation session results\n *\n * Returns the full simulation result including metadata and all step results.\n *\n * @param sessionId - Simulation session ID\n * @param options - API options\n * @returns Complete simulation result\n *\n * @example\n * ```typescript\n * import { getSimulationResult } from 'stxer';\n *\n * const result = await getSimulationResult(sessionId);\n * console.log(result.metadata);\n * console.log(result.steps);\n * ```\n */\nexport async function getSimulationResult(\n sessionId: string,\n options: SimulationApiOptions = {},\n): Promise<SimulationResult> {\n const apiEndpoint = options.stxerApi ?? DEFAULT_STXER_API;\n\n const response = await fetch(\n `${apiEndpoint}/devtools/v2/simulations/${sessionId}`,\n {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to get simulation result: ${text}`);\n }\n\n return response.json() as Promise<SimulationResult>;\n}\n\n/**\n * Batch reads from a simulation session\n *\n * Similar to sidecar batch reads, but reads from the simulation's forked state.\n *\n * @param sessionId - Simulation session ID\n * @param request - Batch reads request\n * @param options - API options\n * @returns Batch read results\n *\n * @example\n * ```typescript\n * import { simulationBatchReads } from 'stxer';\n *\n * const results = await simulationBatchReads(sessionId, {\n * vars: [['SP...contract', 'my-var']],\n * maps: [['SP...contract', 'my-map', '0x...']],\n * stx: ['SP...']\n * });\n * console.log(results.vars);\n * ```\n */\nexport async function simulationBatchReads(\n sessionId: string,\n request: SimulationBatchReadsRequest,\n options: SimulationApiOptions = {},\n): Promise<SimulationBatchReadsResponse> {\n const apiEndpoint = options.stxerApi ?? DEFAULT_STXER_API;\n\n const response = await fetch(\n `${apiEndpoint}/devtools/v2/simulations/${sessionId}/reads`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to batch reads from simulation: ${text}`);\n }\n\n return response.json() as Promise<SimulationBatchReadsResponse>;\n}\n","import {\n AddressVersion,\n STACKS_MAINNET,\n STACKS_TESTNET,\n type StacksNetworkName,\n} from '@stacks/network';\nimport type { Block } from '@stacks/stacks-blockchain-api-types';\nimport {\n AddressHashMode,\n type ClarityValue,\n ClarityVersion,\n type MultiSigSpendingCondition,\n makeUnsignedContractCall,\n makeUnsignedContractDeploy,\n makeUnsignedSTXTokenTransfer,\n PostConditionMode,\n type StacksTransactionWire,\n} from '@stacks/transactions';\nimport { c32addressDecode } from 'c32check';\nimport { type AccountDataResponse, getNodeInfo, richFetch } from 'ts-clarity';\nimport { STXER_API_MAINNET, STXER_API_TESTNET } from './constants';\nimport {\n createSimulationSession,\n submitSimulationSteps,\n} from './simulation-api';\nimport type { ReadStep, SimulationStepInput } from './types';\n\nfunction setSender(tx: StacksTransactionWire, sender: string) {\n const [addressVersion, signer] = c32addressDecode(sender);\n switch (addressVersion) {\n case AddressVersion.MainnetSingleSig:\n case AddressVersion.TestnetSingleSig:\n tx.auth.spendingCondition.hashMode = AddressHashMode.P2PKH;\n tx.auth.spendingCondition.signer = signer;\n break;\n case AddressVersion.MainnetMultiSig:\n case AddressVersion.TestnetMultiSig: {\n const sc = tx.auth.spendingCondition;\n tx.auth.spendingCondition = {\n hashMode: AddressHashMode.P2SH,\n signer,\n fields: [],\n signaturesRequired: 0,\n nonce: sc.nonce,\n fee: sc.fee,\n } as MultiSigSpendingCondition;\n break;\n }\n }\n return tx;\n}\n\nexport interface SimulationEval {\n contract_id: string;\n code: string;\n}\n\ninterface SimulationBuilderOptions {\n apiEndpoint?: string;\n stacksNodeAPI?: string;\n network?: StacksNetworkName | string;\n skipTracing?: boolean;\n}\n\nexport class SimulationBuilder {\n private apiEndpoint: string;\n private stacksNodeAPI: string;\n private network: StacksNetworkName | string;\n private skipTracing: boolean;\n\n private constructor(options: SimulationBuilderOptions = {}) {\n this.network = options.network ?? 'mainnet';\n const isTestnet = this.network === 'testnet';\n\n this.apiEndpoint =\n options.apiEndpoint ??\n (isTestnet ? STXER_API_TESTNET : STXER_API_MAINNET);\n this.stacksNodeAPI =\n options.stacksNodeAPI ??\n (isTestnet ? 'https://api.testnet.hiro.so' : 'https://api.hiro.so');\n this.skipTracing = options.skipTracing ?? false;\n }\n\n public static new(options?: SimulationBuilderOptions) {\n return new SimulationBuilder(options);\n }\n\n // biome-ignore lint/style/useNumberNamespace: ignore this\n private block = NaN;\n private sender = '';\n private steps: (\n | {\n // inline simulation (V1 - not supported in V2, but kept for potential future support)\n simulationId: string;\n }\n | {\n // contract call\n contract_id: string;\n function_name: string;\n function_args?: ClarityValue[];\n sender: string;\n fee: number;\n }\n | {\n // contract deploy\n contract_name: string;\n source_code: string;\n deployer: string;\n fee: number;\n clarity_version: ClarityVersion;\n }\n | {\n // STX transfer\n recipient: string;\n amount: number;\n sender: string;\n fee: number;\n }\n | SimulationEval\n | {\n // SetContractCode - V2 native step type\n type: 'SetContractCode';\n contract_id: string;\n source_code: string;\n clarity_version: ClarityVersion;\n }\n | {\n // Reads - V2 native batch reads step type\n type: 'Reads';\n reads: ReadStep[];\n }\n | {\n // TenureExtend - V2 native step type\n type: 'TenureExtend';\n }\n )[] = [];\n\n public useBlockHeight(block: number) {\n this.block = block;\n return this;\n }\n\n public withSender(address: string) {\n this.sender = address;\n return this;\n }\n\n public inlineSimulation(simulationId: string) {\n this.steps.push({\n simulationId,\n });\n return this;\n }\n\n public addSTXTransfer(params: {\n recipient: string;\n amount: number;\n sender?: string;\n fee?: number;\n }) {\n if (params.sender == null && this.sender === '') {\n throw new Error(\n 'Please specify a sender with useSender or adding a sender paramenter',\n );\n }\n this.steps.push({\n ...params,\n sender: params.sender ?? this.sender,\n fee: params.fee ?? 0,\n });\n return this;\n }\n\n public addContractCall(params: {\n contract_id: string;\n function_name: string;\n function_args?: ClarityValue[];\n sender?: string;\n fee?: number;\n }) {\n if (params.sender == null && this.sender === '') {\n throw new Error(\n 'Please specify a sender with useSender or adding a sender paramenter',\n );\n }\n this.steps.push({\n ...params,\n sender: params.sender ?? this.sender,\n fee: params.fee ?? 0,\n });\n return this;\n }\n\n public addContractDeploy(params: {\n contract_name: string;\n source_code: string;\n deployer?: string;\n fee?: number;\n clarity_version?: ClarityVersion;\n }) {\n if (params.deployer == null && this.sender === '') {\n throw new Error(\n 'Please specify a deployer with useSender or adding a deployer paramenter',\n );\n }\n this.steps.push({\n ...params,\n deployer: params.deployer ?? this.sender,\n fee: params.fee ?? 0,\n clarity_version: params.clarity_version ?? ClarityVersion.Clarity4,\n });\n return this;\n }\n\n public addEvalCode(inside_contract_id: string, code: string) {\n this.steps.push({\n contract_id: inside_contract_id,\n code,\n });\n return this;\n }\n\n public addMapRead(contract_id: string, map: string, key: string) {\n this.steps.push({\n contract_id,\n code: `(map-get ${map} ${key})`,\n });\n return this;\n }\n\n public addVarRead(contract_id: string, variable: string) {\n this.steps.push({\n contract_id,\n code: `(var-get ${variable})`,\n });\n return this;\n }\n\n public addSetContractCode(params: {\n contract_id: string;\n source_code: string;\n clarity_version?: ClarityVersion;\n }) {\n this.steps.push({\n type: 'SetContractCode',\n contract_id: params.contract_id,\n source_code: params.source_code,\n clarity_version: params.clarity_version ?? ClarityVersion.Clarity4,\n });\n return this;\n }\n\n public addReads(reads: ReadStep[]) {\n this.steps.push({\n type: 'Reads',\n reads,\n });\n return this;\n }\n\n public addTenureExtend() {\n this.steps.push({\n type: 'TenureExtend',\n });\n return this;\n }\n\n private async getBlockInfo() {\n if (Number.isNaN(this.block)) {\n const { stacks_tip_height } = await getNodeInfo({\n stacksEndpoint: this.stacksNodeAPI,\n });\n this.block = stacks_tip_height;\n }\n const info: Block = await richFetch(\n `${this.stacksNodeAPI}/extended/v1/block/by_height/${this.block}?unanchored=true`,\n ).then((r) => r.json());\n if (\n info.height !== this.block ||\n typeof info.hash !== 'string' ||\n !info.hash.startsWith('0x')\n ) {\n throw new Error(\n `failed to get block info for block height ${this.block}`,\n );\n }\n return {\n block_height: this.block,\n block_hash: info.hash.substring(2),\n index_block_hash: info.index_block_hash.substring(2),\n };\n }\n\n public async run(): Promise<string> {\n console.log(\n `--------------------------------\nThis product can never exist without your support!\n\nWe receive sponsorship funds with:\nSP212Y5JKN59YP3GYG07K3S8W5SSGE4KH6B5STXER\n\nFeedbacks and feature requests are welcome.\nTo get in touch: contact@stxer.xyz\n--------------------------------`,\n );\n const block = await this.getBlockInfo();\n console.log(\n `Using block height ${block.block_height} hash 0x${block.block_hash} to run simulation.`,\n );\n\n const v2Steps: SimulationStepInput[] = [];\n const nonce_by_address = new Map<string, number>();\n const nextNonce = async (sender: string) => {\n const nonce = nonce_by_address.get(sender);\n if (nonce == null) {\n const url = `${\n this.stacksNodeAPI\n }/v2/accounts/${sender}?proof=${false}&tip=${block.index_block_hash}`;\n const account: AccountDataResponse = await richFetch(url).then((r) =>\n r.json(),\n );\n nonce_by_address.set(sender, account.nonce + 1);\n return account.nonce;\n }\n nonce_by_address.set(sender, nonce + 1);\n return nonce;\n };\n\n let network = this.network === 'mainnet' ? STACKS_MAINNET : STACKS_TESTNET;\n if (this.stacksNodeAPI) {\n network = {\n ...network,\n client: {\n ...network.client,\n baseUrl: this.stacksNodeAPI,\n },\n };\n }\n\n for (const step of this.steps) {\n if ('simulationId' in step) {\n // Inline simulation - for V2 we would need to fetch the previous simulation\n // and convert its steps to V2 format. This is complex and may not be\n // commonly used, so for now we'll throw an error.\n throw new Error(\n 'inlineSimulation is not yet supported in V2 API. Please run simulations from scratch.',\n );\n }\n if ('sender' in step && 'function_name' in step) {\n const nonce = await nextNonce(step.sender);\n const tx = await makeUnsignedContractCall({\n contractAddress: step.contract_id.split('.')[0] as string,\n contractName: step.contract_id.split('.')[1] as string,\n functionName: step.function_name,\n functionArgs: step.function_args ?? [],\n nonce,\n network,\n publicKey: '',\n postConditionMode: PostConditionMode.Allow,\n fee: step.fee,\n });\n setSender(tx, step.sender);\n v2Steps.push({ Transaction: bytesToHex(tx.serializeBytes()) });\n } else if ('sender' in step && 'recipient' in step) {\n const nonce = await nextNonce(step.sender);\n const tx = await makeUnsignedSTXTokenTransfer({\n recipient: step.recipient,\n amount: step.amount,\n nonce,\n network,\n publicKey: '',\n fee: step.fee,\n });\n setSender(tx, step.sender);\n v2Steps.push({ Transaction: bytesToHex(tx.serializeBytes()) });\n } else if ('deployer' in step) {\n const nonce = await nextNonce(step.deployer);\n const tx = await makeUnsignedContractDeploy({\n contractName: step.contract_name,\n codeBody: step.source_code,\n nonce,\n network,\n publicKey: '',\n postConditionMode: PostConditionMode.Allow,\n fee: step.fee,\n clarityVersion: step.clarity_version,\n });\n setSender(tx, step.deployer);\n v2Steps.push({ Transaction: bytesToHex(tx.serializeBytes()) });\n } else if ('code' in step) {\n // Eval step - format: [sender, sponsor, contract_id, code]\n // For eval without a sender, we use empty string for sponsor\n const [contractAddress, contractName] = step.contract_id.split('.');\n v2Steps.push({\n Eval: [\n this.sender || contractAddress,\n '',\n `${contractAddress}.${contractName}`,\n step.code,\n ],\n });\n } else if (step.type === 'SetContractCode') {\n // SetContractCode - format: [contract_id, code, clarity_version]\n v2Steps.push({\n SetContractCode: [\n step.contract_id,\n step.source_code,\n clarityVersionToNumber(step.clarity_version),\n ],\n });\n } else if (step.type === 'Reads') {\n // Reads - batch read operations\n v2Steps.push({\n Reads: step.reads,\n });\n } else if (step.type === 'TenureExtend') {\n // TenureExtend - format: []\n v2Steps.push({\n TenureExtend: [],\n });\n } else {\n console.log(`Invalid simulation step: ${step}`);\n }\n }\n\n // Create V2 simulation session\n const simulationId = await createSimulationSession(\n {\n block_height: block.block_height,\n block_hash: block.block_hash,\n skip_tracing: this.skipTracing,\n },\n { stxerApi: this.apiEndpoint },\n );\n\n // Submit steps\n await submitSimulationSteps(\n simulationId,\n { steps: v2Steps },\n { stxerApi: this.apiEndpoint },\n );\n\n console.log(\n `Simulation will be available at: https://stxer.xyz/simulations/${this.network}/${simulationId}`,\n );\n return simulationId;\n }\n\n public pipe(\n transform: (builder: SimulationBuilder) => SimulationBuilder,\n ): SimulationBuilder {\n return transform(this);\n }\n}\n\n// Helper function to convert Uint8Array to hex string\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n// Helper function to convert ClarityVersion to number\nfunction clarityVersionToNumber(version: ClarityVersion): number {\n switch (version) {\n case ClarityVersion.Clarity1:\n return 1;\n case ClarityVersion.Clarity2:\n return 2;\n case ClarityVersion.Clarity3:\n return 3;\n case ClarityVersion.Clarity4:\n return 4;\n default:\n return 4;\n }\n}\n\n// Re-export simulation types\nexport type {\n CreateSimulationRequest,\n ExecutionCost,\n InstantSimulationRequest,\n InstantSimulationResponse,\n ReadResult,\n ReadStep,\n SimulationMetadata,\n SimulationResult,\n SimulationStepInput,\n TransactionReceipt,\n} from './types';\n","/**\n * WARNING:\n *\n * this file will be used in cross-runtime environments (browser, cloudflare workers, XLinkSDK, etc.),\n * so please be careful when adding `import`s to it.\n */\n\nimport { DEFAULT_STXER_API } from './constants';\nimport type { SidecarTip } from './types';\n\nexport interface TipOptions {\n stxerApi?: string;\n}\n\n/**\n * Fetch the current tip information from the sidecar.\n * @param options - Optional API endpoint configuration\n * @returns The current chain tip information\n */\nexport async function getTip(options: TipOptions = {}): Promise<SidecarTip> {\n const url = `${options.stxerApi ?? DEFAULT_STXER_API}/sidecar/tip`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch tip: ${response.status} ${response.statusText}`,\n );\n }\n\n const text = await response.text();\n if (!text.startsWith('{')) {\n throw new Error(`Invalid response from tip endpoint: ${text}`);\n }\n\n return JSON.parse(text) as SidecarTip;\n}\n","/**\n * Type definitions for stxer-api V2 endpoints\n * Hand-written types based on OpenAPI spec at https://api.stxer.xyz/openapi.json\n */\n\n// =============================================================================\n// Sidecar Tip Types\n// =============================================================================\n\nexport interface TenureCost {\n read_count: number;\n read_length: number;\n write_count: number;\n write_length: number;\n runtime: number;\n}\n\nexport interface SidecarTip {\n bitcoin_height: number;\n block_hash: string;\n block_height: number;\n block_time: number;\n burn_block_height: number;\n burn_block_time: number;\n consensus_hash: string;\n index_block_hash: string;\n is_nakamoto: boolean;\n tenure_cost: TenureCost;\n tenure_height: number;\n sortition_id: string;\n epoch_id: string;\n}\n\n// =============================================================================\n// AST Types\n// =============================================================================\n\nexport interface ClarityAbiType {\n readonly?: { type: ClarityAbiTypeName; length?: number } | string;\n tuple?: { name: string; type: ClarityAbiType }[];\n list?: { type: ClarityAbiType; length: number };\n buffer?: { length: number };\n string_ascii?: { length: number };\n string_utf8?: { length: number };\n principal?: [];\n bool?: [];\n int?: { length: number };\n uint?: { length: number };\n response?: { ok: ClarityAbiType; error: ClarityAbiType };\n optional?: ClarityAbiType;\n contract?: { name: string; address: string };\n}\n\nexport type ClarityAbiTypeName =\n | 'optional'\n | 'response'\n | 'bool'\n | 'int'\n | 'uint'\n | 'string-ascii'\n | 'string-utf8'\n | 'buff'\n | 'list'\n | 'tuple'\n | 'principal'\n | 'trait-reference'\n | 'contract';\n\nexport interface ClarityAbiFunction {\n name: string;\n access: 'private' | 'public' | 'read_only';\n args: Array<{ name: string; type: ClarityAbiType }>;\n outputs: { type: ClarityAbiType };\n}\n\nexport interface ClarityAbiVariable {\n name: string;\n access: 'variable' | 'constant';\n type: ClarityAbiType;\n}\n\nexport interface ClarityAbiMap {\n name: string;\n key: ClarityAbiType;\n value: ClarityAbiType;\n}\n\nexport interface ClarityAbiFungibleToken {\n name: string;\n}\n\nexport interface ClarityAbiNonFungibleToken {\n name: string;\n type: ClarityAbiType;\n}\n\nexport type ClarityEpoch =\n | 'Epoch10'\n | 'Epoch20'\n | 'Epoch2_05'\n | 'Epoch21'\n | 'Epoch22'\n | 'Epoch23'\n | 'Epoch24'\n | 'Epoch25'\n | 'Epoch30'\n | 'Epoch31'\n | 'Epoch32'\n | 'Epoch33'\n | 'Epoch34'\n | 'Epoch35';\n\nexport type ClarityVersion = 'Clarity1' | 'Clarity2' | 'Clarity3' | 'Clarity4';\n\nexport interface ClarityAbi {\n functions: ClarityAbiFunction[];\n variables: ClarityAbiVariable[];\n maps: ClarityAbiMap[];\n fungible_tokens: ClarityAbiFungibleToken[];\n non_fungible_tokens: ClarityAbiNonFungibleToken[];\n epoch: ClarityEpoch;\n clarity_version: ClarityVersion;\n}\n\nexport interface SymbolicExpressionField {\n field: string;\n}\n\nexport interface SymbolicExpressionTraitReference {\n trait_reference: {\n clarity_name: string;\n trait_definition: string;\n trait_definition_type: 'Defined' | 'Imported';\n };\n}\n\nexport interface SymbolicExpressionAtom {\n atom: string;\n}\n\nexport interface SymbolicExpressionAtomValue {\n atom_value: string;\n}\n\nexport interface SymbolicExpressionLiteralValue {\n literal_value: string;\n}\n\nexport interface SymbolicExpressionList {\n list: SymbolicExpression[];\n}\n\nexport type SymbolicExpression = {\n id: number;\n span: string;\n expr:\n | SymbolicExpressionAtom\n | SymbolicExpressionAtomValue\n | SymbolicExpressionLiteralValue\n | SymbolicExpressionList\n | SymbolicExpressionField\n | SymbolicExpressionTraitReference;\n pre_comments?: Array<{ comment: string; span: string }>;\n post_comments?: Array<{ comment: string; span: string }>;\n end_line_comment?: string;\n};\n\nexport interface ContractAST {\n contract_identifier: string;\n expressions: SymbolicExpression[];\n top_level_expression_sorting: number[];\n referenced_traits: Record<\n string,\n { trait_definition: string; trait_definition_type: 'Defined' | 'Imported' }\n >;\n implemented_traits: string[];\n tx_id?: string;\n canonical?: boolean;\n contract_id?: string;\n block_height?: number;\n source_code?: string;\n abi?: ClarityAbi;\n}\n\n// =============================================================================\n// V2 Simulation Types\n// =============================================================================\n\nexport interface ExecutionCost {\n read_count: number;\n read_length: number;\n write_count: number;\n write_length: number;\n runtime: number;\n}\n\n/**\n * Receipt for a transaction that the engine executed to completion.\n *\n * \"Successful execution\" does NOT imply contract-level success. Four\n * failure signals to check, in this order:\n * 1. Outer `Err` on `Result.Transaction` — engine could not run the tx\n * at all (deserialization failure etc.); no receipt is produced.\n * 2. `post_condition_aborted: true` — execution ran, post-condition\n * tripped, state was rolled back.\n * 3. `vm_error: string` (without `post_condition_aborted`) — Clarity\n * VM raised a runtime error or static analysis failed.\n * 4. `(err uX)` inside `result` — contract returned a Clarity error\n * response. Application-level; NOT signalled by any field above.\n * Decode `result` to detect.\n *\n * `post_condition_aborted` and `vm_error` are NOT independent: when a\n * PC trips the upstream sets `post_condition_aborted: true` AND writes\n * the PC abort reason into `vm_error` as a side effect. The reverse is\n * not true — `vm_error` alone (with `post_condition_aborted: false`)\n * means a VM / analysis failure that is not a PC abort.\n */\nexport interface TransactionReceipt {\n /**\n * Clarity return value, SIP-005 hex-serialized. For contract-call txs\n * this includes the `(ok ...)` / `(err ...)` response wrapper —\n * Clarity-level `(err uX)` lives here, NOT on `vm_error` or the outer\n * `Err`.\n */\n result: string;\n stx_burned: number;\n tx_index: number;\n /**\n * Error message from the upstream Clarity VM. `null` when the tx had\n * no VM-level issue. When `post_condition_aborted` is `true` this\n * field is also populated with the PC abort reason — check\n * `post_condition_aborted` first to disambiguate.\n */\n vm_error: string | null;\n /**\n * `true` when one or more post-conditions failed and the tx was\n * aborted. Implies `vm_error` is also set (to the abort reason); the\n * reverse does not hold.\n */\n post_condition_aborted: boolean;\n /** Wall-clock simulation time in milliseconds. */\n costs: number;\n execution_cost: ExecutionCost;\n /**\n * Events emitted during execution (contract logs, STX transfers,\n * FT/NFT events, etc.). Each entry is a JSON-encoded **string** —\n * call `JSON.parse(events[i])` to get the event object. Items are\n * NOT JSON objects in the array.\n *\n * For typed access, use {@link parseSimulationEvent} or cast:\n * `JSON.parse(events[i]) as SimulationEvent`.\n */\n events: string[];\n}\n\nexport interface TransactionOkResult {\n Ok: TransactionReceipt;\n}\n\nexport interface TransactionErrResult {\n Err: string;\n}\n\n// =============================================================================\n// Simulation Events\n// =============================================================================\n// Wire format for entries inside `TransactionReceipt.events[]` (each entry\n// there is a JSON-encoded string carrying one of these payloads).\n//\n// Source of truth: `clarity/src/vm/events.rs` in\n// https://github.com/stacks-network/stacks-core —\n// `StacksTransactionEvent::json_serialize`. These types intentionally\n// differ from `@stacks/stacks-blockchain-api-types.TransactionEvent`,\n// which describes Hiro API responses with a different envelope.\n//\n// Numeric fields that the rust source emits via `format!(\"{}\", u128)` /\n// `format!(\"{}\", u64)` are typed as `string`, not `number` — the wire\n// carries them as decimal strings to preserve full precision.\n\n/** Common envelope present on every event variant. */\ninterface SimulationEventBase {\n /** Hex txid with leading `0x`. */\n txid: string;\n event_index: number;\n /**\n * `true` when the event was emitted from successfully committed code.\n * `false` when the tx was rolled back (post-condition abort, vm_error).\n * Tracks rust `tx_receipt.vm_error.is_none() && !post_condition_aborted`.\n */\n committed: boolean;\n}\n\n/** Payload for `print` events and other contract-emitted events. */\nexport interface SmartContractEventData {\n /** `<address>.<contract_name>` of the contract that emitted the event. */\n contract_identifier: string;\n /** Topic key — `\"print\"` for `(print …)` calls. */\n topic: string;\n /**\n * Structured Clarity Value JSON (the rust `Value` enum's serde output).\n * The shape is complex and varies by Clarity type; prefer `raw_value`\n * for typed decoding.\n */\n value: unknown;\n /**\n * SIP-005 hex of the value, with leading `0x`. Pass to\n * `deserializeCV()` from `@stacks/transactions` for typed decoding.\n */\n raw_value: string;\n}\n\nexport interface StxTransferEventData {\n sender: string;\n recipient: string;\n /** uSTX amount as a decimal string (rust serializes u128 via Display). */\n amount: string;\n /** Hex memo, possibly empty. */\n memo: string;\n}\n\nexport interface StxMintEventData {\n recipient: string;\n amount: string;\n}\n\nexport interface StxBurnEventData {\n sender: string;\n amount: string;\n}\n\nexport interface StxLockEventData {\n locked_amount: string;\n /** Decimal string (rust serializes u64 via Display). */\n unlock_height: string;\n locked_address: string;\n contract_identifier: string;\n}\n\nexport interface NftTransferEventData {\n /** `<contract_id>::<asset_name>`. */\n asset_identifier: string;\n sender: string;\n recipient: string;\n value: unknown;\n raw_value: string;\n}\n\nexport interface NftMintEventData {\n asset_identifier: string;\n recipient: string;\n value: unknown;\n raw_value: string;\n}\n\nexport interface NftBurnEventData {\n asset_identifier: string;\n sender: string;\n value: unknown;\n raw_value: string;\n}\n\nexport interface FtTransferEventData {\n asset_identifier: string;\n sender: string;\n recipient: string;\n amount: string;\n}\n\nexport interface FtMintEventData {\n asset_identifier: string;\n recipient: string;\n amount: string;\n}\n\nexport interface FtBurnEventData {\n asset_identifier: string;\n sender: string;\n amount: string;\n}\n\n/**\n * Discriminated union of every event variant the simulator emits.\n * The `type` discriminator names the per-variant payload key — e.g.\n * `type: 'contract_event'` carries the payload at `event.contract_event`.\n *\n * ```ts\n * const event = parseSimulationEvent(receipt.events[0]);\n * if (event.type === 'contract_event') {\n * // event.contract_event.{contract_identifier, topic, raw_value, value}\n * }\n * ```\n */\nexport type SimulationEvent =\n | (SimulationEventBase & {\n type: 'contract_event';\n contract_event: SmartContractEventData;\n })\n | (SimulationEventBase & {\n type: 'stx_transfer_event';\n stx_transfer_event: StxTransferEventData;\n })\n | (SimulationEventBase & {\n type: 'stx_mint_event';\n stx_mint_event: StxMintEventData;\n })\n | (SimulationEventBase & {\n type: 'stx_burn_event';\n stx_burn_event: StxBurnEventData;\n })\n | (SimulationEventBase & {\n type: 'stx_lock_event';\n stx_lock_event: StxLockEventData;\n })\n | (SimulationEventBase & {\n type: 'nft_transfer_event';\n nft_transfer_event: NftTransferEventData;\n })\n | (SimulationEventBase & {\n type: 'nft_mint_event';\n nft_mint_event: NftMintEventData;\n })\n | (SimulationEventBase & {\n type: 'nft_burn_event';\n nft_burn_event: NftBurnEventData;\n })\n | (SimulationEventBase & {\n type: 'ft_transfer_event';\n ft_transfer_event: FtTransferEventData;\n })\n | (SimulationEventBase & {\n type: 'ft_mint_event';\n ft_mint_event: FtMintEventData;\n })\n | (SimulationEventBase & {\n type: 'ft_burn_event';\n ft_burn_event: FtBurnEventData;\n });\n\n/** Convenience parser for `TransactionReceipt.events[i]`. */\nexport function parseSimulationEvent(raw: string): SimulationEvent {\n return JSON.parse(raw) as SimulationEvent;\n}\n\n// Read step types\nexport interface MapEntryStep {\n MapEntry: [contract_id: string, map_name: string, key_hex: string];\n}\n\nexport interface DataVarStep {\n DataVar: [contract_id: string, variable_name: string];\n}\n\nexport interface EvalReadonlyStep {\n /** `sponsor` is `\"\"` (empty string) when there is no sponsor. */\n EvalReadonly: [\n sender: string,\n sponsor: string,\n contract_id: string,\n code: string,\n ];\n}\n\nexport interface StxBalanceStep {\n /** Principal whose STX balance to read. */\n StxBalance: string;\n}\n\nexport interface FtBalanceStep {\n /**\n * Reads the FT balance via three separate parameters. Note: the batch\n * `ft_balance` field on `SimulationBatchReadsRequest` uses a different\n * `<contract_id>::<token_name>` combined identifier shape.\n */\n FtBalance: [contract_id: string, token_name: string, principal: string];\n}\n\nexport interface FtSupplyStep {\n FtSupply: [contract_id: string, token_name: string];\n}\n\nexport interface NonceStep {\n /** Principal whose nonce to read. */\n Nonce: string;\n}\n\nexport type ReadStep =\n | MapEntryStep\n | DataVarStep\n | EvalReadonlyStep\n | StxBalanceStep\n | FtBalanceStep\n | FtSupplyStep\n | NonceStep;\n\nexport interface ReadOkResult {\n Ok: string; // clarity value hex OR number string for balances/nonces\n}\n\nexport interface ReadErrResult {\n Err: string;\n}\n\nexport type ReadResult = ReadOkResult | ReadErrResult;\n\n/**\n * Per-step result returned by `POST /devtools/v2/simulations/{id}` (the\n * \"submit steps\" endpoint). Mirrors the rust `RunSimulationStepResult`\n * enum — externally tagged, exactly one variant key present.\n *\n * Distinct from `SimulationStepSummary`, which is what\n * `GET /devtools/v2/simulations/{id}` returns and includes the original\n * step input alongside the result.\n */\nexport type SimulationStepResult =\n | { Transaction: TransactionOkResult | TransactionErrResult }\n | { Eval: { Ok: string } | { Err: string } }\n | { SetContractCode: { Ok: null } | { Err: string } }\n | { Reads: ReadResult[] }\n | { TenureExtend: ExecutionCost };\n\n// Simulation step types (summary format from GET /devtools/v2/simulations/{id})\nexport interface TransactionStepSummary {\n /** Transaction serialized to hex. */\n Transaction: string;\n /** Hex-encoded txid. Empty string `\"\"` when the tx failed engine-level. */\n TxId: string;\n Result: {\n Transaction: TransactionOkResult | TransactionErrResult;\n };\n ExecutionCost: ExecutionCost;\n}\n\nexport interface ReadsStepSummary {\n Reads: ReadStep[];\n Result: {\n Reads: ReadResult[];\n };\n}\n\nexport interface SetContractCodeStepSummary {\n SetContractCode: [contract_id: string, code: string, clarity_version: number];\n Result: {\n SetContractCode: { Ok: null } | { Err: string };\n };\n}\n\nexport interface EvalStepSummary {\n /** `sponsor` is `\"\"` (empty string) when there is no sponsor. */\n Eval: [sender: string, sponsor: string, contract_id: string, code: string];\n Result: {\n Eval: { Ok: string } | { Err: string };\n };\n}\n\nexport interface TenureExtendStepSummary {\n Result: {\n TenureExtend: ExecutionCost;\n };\n}\n\nexport type SimulationStepSummary =\n | TransactionStepSummary\n | ReadsStepSummary\n | SetContractCodeStepSummary\n | EvalStepSummary\n | TenureExtendStepSummary;\n\n// Simulation metadata\nexport interface SimulationMetadata {\n block_height: number;\n block_hash: string;\n burn_block_height: number;\n burn_block_hash: string;\n consensus_hash: string;\n epoch: string;\n index_block_hash: string;\n skip_tracing: boolean;\n sortition_id: string;\n}\n\n// Full simulation result\nexport interface SimulationResult {\n metadata: SimulationMetadata;\n steps: SimulationStepSummary[];\n}\n\n// Create session request\nexport interface CreateSimulationRequest {\n block_height?: number;\n block_hash?: string;\n skip_tracing?: boolean;\n}\n\nexport interface CreateSimulationResponse {\n id: string;\n}\n\n// Submit steps request\nexport type SimulationStepInput =\n | { Transaction: string }\n | {\n /** `sponsor` is `\"\"` when there is no sponsor. */\n Eval: [\n sender: string,\n sponsor: string,\n contract_id: string,\n code: string,\n ];\n }\n | {\n SetContractCode: [\n contract_id: string,\n code: string,\n clarity_version: number,\n ];\n }\n | { Reads: ReadStep[] }\n | { TenureExtend: [] };\n\nexport interface SubmitSimulationStepsRequest {\n steps: SimulationStepInput[];\n}\n\nexport interface SubmitSimulationStepsResponse {\n steps: SimulationStepResult[];\n}\n\n// Batch reads from simulation\nexport interface SimulationBatchReadsRequest {\n /** `[contract_id, variable_name]` per entry. */\n vars?: [contract_id: string, variable_name: string][];\n /** `[contract_id, map_name, key_hex]` per entry. */\n maps?: [contract_id: string, map_name: string, key_hex: string][];\n /**\n * `[contract_id, function_name, ...arg_hex]` per entry. The first two\n * positions are fixed; remaining elements are hex-encoded Clarity\n * values, one per function argument (so the length matches the\n * function's arity, not arbitrary).\n */\n readonly?: [\n contract_id: string,\n function_name: string,\n ...args_hex: string[],\n ][];\n /**\n * `[sender, sponsor, contract_id, function_name, ...arg_hex]` per\n * entry. The first four positions are fixed (`sponsor` is `\"\"` when\n * there is no sponsor); remaining elements are hex-encoded Clarity\n * values, one per function argument.\n */\n readonly_with_sender?: [\n sender: string,\n sponsor: string,\n contract_id: string,\n function_name: string,\n ...args_hex: string[],\n ][];\n /** Principals to read STX balances for. */\n stx?: string[];\n /** Principals to read nonces for. */\n nonces?: string[];\n /** `[<contract_id>::<token_name>, principal]` per entry. */\n ft_balance?: [token_identifier: string, principal: string][];\n /**\n * Flat array of FT identifiers in `<contract_id>::<token_name>` form,\n * one entry per token to look up. Any length.\n */\n ft_supply?: string[];\n}\n\n/**\n * Each category is omitted from the JSON response when the corresponding\n * request field was empty/absent (rust uses\n * `serde(skip_serializing_if = \"Vec::is_empty\")` per field).\n */\nexport interface SimulationBatchReadsResponse {\n vars?: ReadResult[];\n maps?: ReadResult[];\n readonly?: ReadResult[];\n readonly_with_sender?: ReadResult[];\n stx?: ReadResult[];\n nonces?: ReadResult[];\n ft_balance?: ReadResult[];\n ft_supply?: ReadResult[];\n}\n\n// Instant simulation\nexport interface InstantSimulationRequest {\n /** Transaction serialized to hex. */\n transaction: string;\n block_height?: number;\n block_hash?: string;\n reads?: ReadStep[];\n}\n\nexport interface InstantSimulationResponse {\n /** Always present (may be `[]`). Aligned positionally with the request `reads`. */\n reads: ReadResult[];\n receipt: TransactionReceipt;\n}\n"],"names":["STXER_API_MAINNET","STXER_API_TESTNET","DEFAULT_STXER_API","_getContractAST","_asyncToGenerator","_regenerator","m","_callee","options","_options$stxerApi","url","response","text","w","_context","n","stxerApi","contractId","fetch","method","headers","Accept","v","ok","Error","status","statusText","startsWith","a","JSON","parse","apply","this","arguments","_parseContract","_callee2","_options$stxerApi2","payload","_context2","contract_id","source_code","sourceCode","undefined","clarityVersion","clarity_version","epoch","body","stringify","convertResults","rs","_step","results","_iterator","_createForOfIteratorHelperLoose","done","value","push","deserializeCV","Ok","Err","batchRead","_x","_x2","_batchRead","reads","ibh","index_block_hash","substring","vars","maps","readonly","tip","variables","_iterator2","_step2","serializeCV","variable","contract","variableName","_iterator3","_step3","map","mapName","mapKey","_iterator4","_step4","ro","functionName","concat","functionArgs","data","includes","defaultProcessor","BatchProcessor","_options$stxerAPIEndp","queues","Map","timeoutIds","stxerAPIEndpoint","batchDelayMs","_proto","prototype","getQueueKey","read","request","_this","Promise","resolve","reject","enqueue","_this$queues$get","_this2","queueKey","queue","get","has","set","timeoutId","setTimeout","processBatch","_processBatch","_this$queues$get2","currentQueue","readonlyRequests","mapRequests","variableRequests","batchRequest","_step$value","index","result","_step2$value","_index","_result","_step3$value","_index2","_result2","_t","p","clearTimeout","length","filter","q","mode","_ref","contractPrincipalCV","contractAddress","contractName","_ref2","_ref3","entries","_callReadonly","params","_params$batchProcesso","processor","_params$contract$spli","deployer","fn","functionDef","argsKV","args","argDef","batchProcessor","split","String","abi","find","def","name","encodeAbi","type","indexBlockHash","decoded","decodeAbi","outputs","error","_readMap","_params$batchProcesso2","_params$contract$spli2","mapDef","key","ClarityType","OptionalNone","OptionalSome","_readVariable","_callee3","_params$batchProcesso3","_params$contract$spli3","varDef","_context3","_instantSimulation","apiEndpoint","json","createSimulationSession","_x3","_x4","_createSimulationSession","apiOptions","_apiOptions$stxerApi","id","submitSimulationSteps","_x5","_x6","_x7","_submitSimulationSteps","sessionId","_getSimulationResult","_callee4","_options$stxerApi3","_context4","_simulationBatchReads","_callee5","_options$stxerApi4","_context5","setSender","tx","sender","_c32addressDecode","c32addressDecode","signer","AddressVersion","MainnetSingleSig","TestnetSingleSig","auth","spendingCondition","hashMode","AddressHashMode","P2PKH","MainnetMultiSig","TestnetMultiSig","sc","P2SH","fields","signaturesRequired","nonce","fee","SimulationBuilder","_options$network","_options$apiEndpoint","_options$stacksNodeAP","_options$skipTracing","stacksNodeAPI","network","skipTracing","block","NaN","steps","isTestnet","useBlockHeight","withSender","address","inlineSimulation","simulationId","addSTXTransfer","_params$sender","_params$fee","_extends","addContractCall","_params$sender2","_params$fee2","addContractDeploy","_params$deployer","_params$fee3","_params$clarity_versi","ClarityVersion","Clarity4","addEvalCode","inside_contract_id","code","addMapRead","addVarRead","addSetContractCode","_params$clarity_versi2","addReads","addTenureExtend","getBlockInfo","_getBlockInfo","info","Number","isNaN","getNodeInfo","stacksEndpoint","stacks_tip_height","richFetch","then","r","height","hash","block_height","block_hash","run","_run","v2Steps","nonce_by_address","nextNonce","step","_step$function_args","_nonce","_tx","_nonce2","_tx2","_step$contract_id$spl","console","log","account","STACKS_MAINNET","STACKS_TESTNET","client","baseUrl","makeUnsignedContractCall","function_name","function_args","publicKey","postConditionMode","PostConditionMode","Allow","Transaction","bytesToHex","serializeBytes","makeUnsignedSTXTokenTransfer","recipient","amount","makeUnsignedContractDeploy","contract_name","codeBody","Eval","SetContractCode","clarityVersionToNumber","Reads","TenureExtend","skip_tracing","pipe","transform","bytes","Array","from","b","toString","padStart","join","version","Clarity1","Clarity2","Clarity3","_getTip","callReadonly","getContractAST","_x8","_x9","getTip","parseContract","raw","readMap","readVariable","_x0","_x1","_x10"],"mappings":"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"}
1
+ {"version":3,"file":"stxer.cjs.production.min.js","sources":["../src/constants.ts","../src/ast.ts","../src/batch-api.ts","../src/bitcoin.ts","../src/batch-processor.ts","../src/clarity-api.ts","../src/simulation-api.ts","../src/transaction.ts","../src/simulation.ts","../src/tip.ts","../src/types.ts"],"sourcesContent":["/**\n * API endpoint constants\n */\n\n/** Default stxer API endpoint for mainnet */\nexport const STXER_API_MAINNET = 'https://api.stxer.xyz';\n\n/** stxer API endpoint for testnet */\nexport const STXER_API_TESTNET = 'https://testnet-api.stxer.xyz';\n\n/** Default stxer API endpoint (mainnet) */\nexport const DEFAULT_STXER_API = STXER_API_MAINNET;\n","/**\n * WARNING:\n *\n * this file will be used in cross-runtime environments (browser, cloudflare workers, XLinkSDK, etc.),\n * so please be careful when adding `import`s to it.\n */\n\nimport { DEFAULT_STXER_API } from './constants';\nimport type { ClarityEpoch, ContractAST } from './types';\n\nexport interface AstOptions {\n stxerApi?: string;\n}\n\nexport interface GetContractAstOptions extends AstOptions {\n contractId: string;\n}\n\n/**\n * Fetch the AST for an on-chain contract.\n * @param options - Contract ID and optional API endpoint\n * @returns The contract AST with metadata\n */\nexport async function getContractAST(\n options: GetContractAstOptions,\n): Promise<ContractAST> {\n const url = `${options.stxerApi ?? DEFAULT_STXER_API}/contracts/${options.contractId}`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch contract AST: ${response.status} ${response.statusText}`,\n );\n }\n\n const text = await response.text();\n if (!text.startsWith('{')) {\n throw new Error(`Invalid response from contracts endpoint: ${text}`);\n }\n\n return JSON.parse(text) as ContractAST;\n}\n\nexport interface ParseContractOptions extends AstOptions {\n sourceCode: string;\n contractId: string;\n clarityVersion?: '1' | '2' | '3' | '4' | '5' | '6';\n epoch?: ClarityEpoch;\n}\n\n/**\n * Parse contract source code into an AST.\n * @param options - Source code, contract ID, and optional configuration\n * @returns The parsed contract AST\n */\nexport async function parseContract(\n options: ParseContractOptions,\n): Promise<ContractAST> {\n const url = `${options.stxerApi ?? DEFAULT_STXER_API}/contracts:parse`;\n\n const payload: {\n contract_id: string;\n source_code: string;\n clarity_version?: string;\n epoch?: string;\n } = {\n contract_id: options.contractId,\n source_code: options.sourceCode,\n };\n\n if (options.clarityVersion !== undefined) {\n payload.clarity_version = options.clarityVersion;\n }\n if (options.epoch !== undefined) {\n payload.epoch = options.epoch;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to parse contract: ${response.status} ${response.statusText}`,\n );\n }\n\n const text = await response.text();\n if (!text.startsWith('{')) {\n throw new Error(`Invalid response from contract parse endpoint: ${text}`);\n }\n\n return JSON.parse(text) as ContractAST;\n}\n\n// Re-export AST-related types for convenience\nexport type {\n ClarityAbi,\n ClarityAbiFunction,\n ClarityAbiFungibleToken,\n ClarityAbiMap,\n ClarityAbiNonFungibleToken,\n ClarityAbiType,\n ClarityAbiVariable,\n ClarityEpoch,\n ClarityVersion,\n ContractAST,\n SymbolicExpression,\n} from './types';\n","/**\n * WARNING:\n *\n * this file will be used in cross-runtime environments (browser, cloudflare workers, XLinkSDK, etc.),\n * so please be careful when adding `import`s to it.\n */\n\nimport {\n type ClarityValue,\n type ContractPrincipalCV,\n deserializeCV,\n serializeCV,\n} from '@stacks/transactions';\n\nexport interface BatchReads {\n variables?: {\n contract: ContractPrincipalCV;\n variableName: string;\n }[];\n maps?: {\n contract: ContractPrincipalCV;\n mapName: string;\n mapKey: ClarityValue;\n }[];\n readonly?: {\n contract: ContractPrincipalCV;\n functionName: string;\n functionArgs: ClarityValue[];\n }[];\n index_block_hash?: string;\n}\n\nexport interface BatchReadsResult {\n /** Index block hash the batch ran against. Matches the wire field name. */\n index_block_hash: string;\n vars: (ClarityValue | Error)[];\n maps: (ClarityValue | Error)[];\n readonly: (ClarityValue | Error)[];\n}\n\nexport interface BatchApiOptions {\n stxerApi?: string;\n}\n\nconst DEFAULT_STXER_API = 'https://api.stxer.xyz';\n\nfunction convertResults(\n rs: ({ Ok: string } | { Err: string })[] | undefined,\n): (ClarityValue | Error)[] {\n const results: (ClarityValue | Error)[] = [];\n for (const v of rs ?? []) {\n if ('Ok' in v) {\n results.push(deserializeCV(v.Ok));\n } else {\n results.push(new Error(v.Err));\n }\n }\n return results;\n}\n\nexport async function batchRead(\n reads: BatchReads,\n options: BatchApiOptions = {},\n): Promise<BatchReadsResult> {\n const ibh =\n reads.index_block_hash == null\n ? undefined\n : reads.index_block_hash.startsWith('0x')\n ? reads.index_block_hash.substring(2)\n : reads.index_block_hash;\n\n const payload: {\n tip?: string;\n vars: string[][];\n maps: string[][];\n readonly: string[][];\n } = { vars: [], maps: [], readonly: [], tip: ibh };\n\n if (reads.variables != null) {\n for (const variable of reads.variables) {\n payload.vars.push([\n serializeCV(variable.contract),\n variable.variableName,\n ]);\n }\n }\n\n if (reads.maps != null) {\n for (const map of reads.maps) {\n payload.maps.push([\n serializeCV(map.contract),\n map.mapName,\n serializeCV(map.mapKey),\n ]);\n }\n }\n\n if (reads.readonly != null) {\n for (const ro of reads.readonly) {\n payload.readonly.push([\n serializeCV(ro.contract),\n ro.functionName,\n ...ro.functionArgs.map((v) => serializeCV(v)),\n ]);\n }\n }\n\n const url = `${options.stxerApi ?? DEFAULT_STXER_API}/sidecar/v2/batch`;\n const data = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n const text = await data.text();\n if (!text.includes('Ok') && !text.includes('Err')) {\n throw new Error(\n `Requesting batch reads failed: ${text}, url: ${url}, payload: ${JSON.stringify(\n payload,\n )}`,\n );\n }\n\n const rs = JSON.parse(text) as {\n index_block_hash: string;\n vars?: ({ Ok: string } | { Err: string })[];\n maps?: ({ Ok: string } | { Err: string })[];\n readonly?: ({ Ok: string } | { Err: string })[];\n };\n\n return {\n index_block_hash: rs.index_block_hash,\n vars: convertResults(rs.vars),\n maps: convertResults(rs.maps),\n readonly: convertResults(rs.readonly),\n };\n}\n","/**\n * Bitcoin SPV utilities for cross-chain simulations.\n *\n * Stacks bridge contracts (sBTC, Brotocol, hBTC, …) verify Bitcoin\n * deposit transactions against burn-block headers and Merkle proofs\n * stored in the Stacks chainstate. To exercise these contracts under\n * the simulator you need three things on the wire:\n *\n * 1. A non-witness Bitcoin transaction whose `txid` (= `sha256d` of\n * the bytes) the Stacks contract can recover.\n * 2. An 80-byte block header whose hash matches the\n * `BurnchainHeaderHash` value the simulator stores. The simulator\n * accepts any 32-byte hash via the `burn_header_hashes` override\n * on `AdvanceBlocks`; pair the override with `buildHeader` so the\n * contract's `verify-block-header` resolves to the same value.\n * 3. A Merkle proof linking the txid to the block header's\n * `merkleRoot`. {@link merkleProof} produces the proof; the\n * contract's on-chain verifier follows the same Bitcoin\n * convention this module implements (leaves are NOT pre-hashed;\n * `sha256d` of concatenated children for inner nodes).\n *\n * All wire-byte conventions match `clarity-bitcoin-v1-07` (the\n * current on-chain SPV reference): hash slots inside the header are\n * stored in *internal byte order* (raw `sha256d`), not the\n * display-reversed form Bitcoin block explorers show.\n *\n * @example\n * ```typescript\n * import {\n * forgeBitcoinTx, p2wpkhScript, opReturnScript,\n * buildBitcoinHeader, singleTxMerkleRoot,\n * hexToBytes, bytesToHex,\n * } from 'stxer';\n *\n * const tx = forgeBitcoinTx({\n * inputs: [{ prevTxid: hexToBytes('00'.repeat(32)), prevVout: 0,\n * scriptSig: new Uint8Array() }],\n * outputs: [\n * { value: 100_000n, scriptPubKey: p2wpkhScript(hexToBytes('aa'.repeat(20))) },\n * { value: 0n, scriptPubKey: opReturnScript(hexToBytes('5832' + '00'.repeat(20))) },\n * ],\n * });\n * const header = buildBitcoinHeader({\n * merkleRoot: singleTxMerkleRoot(tx.txid),\n * });\n * // Pass `bytesToHex(header.hash)` as `burn_header_hashes[0]` on\n * // `addAdvanceBlocks`; pass `bytesToHex(tx.txid)` to the bridge's\n * // `complete-deposit-wrapper` (or equivalent).\n * ```\n */\nimport { sha256 as nobleSha256 } from '@noble/hashes/sha2.js';\n\n// ============================================================================\n// Hashing primitives\n// ============================================================================\n\n/**\n * SHA-256. Pure-JS via `@noble/hashes` so this module works in\n * browsers, Node, and Bun without a polyfill.\n */\nexport function sha256(data: Uint8Array): Uint8Array {\n return nobleSha256(data);\n}\n\n/** Bitcoin-style double-sha256 used for txids, block hashes, and Merkle nodes. */\nexport function sha256d(data: Uint8Array): Uint8Array {\n return sha256(sha256(data));\n}\n\n// ============================================================================\n// Hex encoding\n// ============================================================================\n\n/** Decode a hex string (with or without `0x` prefix). */\nexport function hexToBytes(s: string): Uint8Array {\n const t = s.toLowerCase().replace(/^0x/, '');\n if (t.length % 2 !== 0) throw new Error('odd-length hex');\n const out = new Uint8Array(t.length / 2);\n for (let i = 0; i < out.length; i++) {\n out[i] = Number.parseInt(t.slice(i * 2, i * 2 + 2), 16);\n }\n return out;\n}\n\n/** Lower-case hex (no `0x` prefix). */\nexport function bytesToHex(b: Uint8Array): string {\n return Array.from(b)\n .map((x) => x.toString(16).padStart(2, '0'))\n .join('');\n}\n\n// ============================================================================\n// Bitcoin script builders\n// ============================================================================\n\n/** P2WPKH output script: `OP_0 <20-byte pubkey-hash>`. */\nexport function p2wpkhScript(pubKeyHash20: Uint8Array): Uint8Array {\n if (pubKeyHash20.length !== 20) {\n throw new Error('pubKeyHash must be 20 bytes');\n }\n const out = new Uint8Array(22);\n out[0] = 0x00; // OP_0\n out[1] = 0x14; // pushdata length 20\n out.set(pubKeyHash20, 2);\n return out;\n}\n\n/** P2PKH output script: `OP_DUP OP_HASH160 <hash> OP_EQUALVERIFY OP_CHECKSIG`. */\nexport function p2pkhScript(pubKeyHash20: Uint8Array): Uint8Array {\n if (pubKeyHash20.length !== 20) {\n throw new Error('pubKeyHash must be 20 bytes');\n }\n const out = new Uint8Array(25);\n out[0] = 0x76; // OP_DUP\n out[1] = 0xa9; // OP_HASH160\n out[2] = 0x14; // pushdata 20\n out.set(pubKeyHash20, 3);\n out[23] = 0x88; // OP_EQUALVERIFY\n out[24] = 0xac; // OP_CHECKSIG\n return out;\n}\n\n/**\n * `OP_RETURN <data>` output. Used to embed peg-in metadata\n * (recipient principal, marker bytes, etc.). Bitcoin's standard relay\n * limit caps `data` at 80 bytes; this helper rejects > 75 to leave\n * room for the prefix bytes.\n */\nexport function opReturnScript(data: Uint8Array): Uint8Array {\n if (data.length > 75) {\n throw new Error(`OP_RETURN data too long: ${data.length}`);\n }\n const out = new Uint8Array(2 + data.length);\n out[0] = 0x6a; // OP_RETURN\n out[1] = data.length; // direct push\n out.set(data, 2);\n return out;\n}\n\n// ============================================================================\n// Bitcoin transaction forging\n// ============================================================================\n\nexport interface BitcoinTxInput {\n /** 32-byte previous txid in *internal byte order* (raw `sha256d`). */\n prevTxid: Uint8Array;\n prevVout: number;\n /** Script signature bytes. Empty for segwit-style inputs. */\n scriptSig: Uint8Array;\n /** Sequence number; default `0xfffffffd`. */\n sequence?: number;\n}\n\nexport interface BitcoinTxOutput {\n /** Satoshi amount. */\n value: bigint;\n /** Locking script — use {@link p2wpkhScript} / {@link p2pkhScript} / {@link opReturnScript}. */\n scriptPubKey: Uint8Array;\n}\n\nexport interface ForgedBitcoinTx {\n /** Wire-encoded non-witness tx bytes (this is what the txid is computed over). */\n bytes: Uint8Array;\n /** Canonical txid: `sha256d(bytes)`. Internal byte order. */\n txid: Uint8Array;\n /** Display-form (reversed) txid — what block explorers render. */\n txidDisplay: Uint8Array;\n}\n\n/**\n * Build a non-witness Bitcoin transaction (legacy serialization). The\n * txid is `sha256d` of the returned `bytes`. Use this form when you\n * only need to assert SPV inclusion; segwit witness data is irrelevant\n * to the txid.\n *\n * Wire format:\n * ```\n * 4 version (LE)\n * varint in-count\n * per-input: 32 prev_txid + 4 prev_vout + varint script-len + script + 4 sequence\n * varint out-count\n * per-output: 8 value (LE) + varint script-len + script\n * 4 locktime (LE)\n * ```\n */\nexport function forgeBitcoinTx(opts: {\n version?: number;\n inputs: BitcoinTxInput[];\n outputs: BitcoinTxOutput[];\n locktime?: number;\n}): ForgedBitcoinTx {\n const chunks: Uint8Array[] = [];\n const u32le = (n: number) => {\n const b = new Uint8Array(4);\n new DataView(b.buffer).setUint32(0, n >>> 0, true);\n return b;\n };\n const u64le = (n: bigint) => {\n const b = new Uint8Array(8);\n const view = new DataView(b.buffer);\n view.setUint32(0, Number(n & 0xffffffffn), true);\n view.setUint32(4, Number((n >> 32n) & 0xffffffffn), true);\n return b;\n };\n const varint = (n: number): Uint8Array => {\n if (n < 0xfd) return new Uint8Array([n]);\n if (n <= 0xffff) {\n const b = new Uint8Array(3);\n b[0] = 0xfd;\n new DataView(b.buffer).setUint16(1, n, true);\n return b;\n }\n if (n <= 0xffffffff) {\n const b = new Uint8Array(5);\n b[0] = 0xfe;\n new DataView(b.buffer).setUint32(1, n, true);\n return b;\n }\n throw new Error(`varint too large: ${n}`);\n };\n\n chunks.push(u32le(opts.version ?? 2));\n chunks.push(varint(opts.inputs.length));\n for (const i of opts.inputs) {\n if (i.prevTxid.length !== 32) {\n throw new Error('prevTxid must be 32 bytes');\n }\n chunks.push(i.prevTxid);\n chunks.push(u32le(i.prevVout));\n chunks.push(varint(i.scriptSig.length));\n chunks.push(i.scriptSig);\n chunks.push(u32le(i.sequence ?? 0xfffffffd));\n }\n chunks.push(varint(opts.outputs.length));\n for (const o of opts.outputs) {\n chunks.push(u64le(o.value));\n chunks.push(varint(o.scriptPubKey.length));\n chunks.push(o.scriptPubKey);\n }\n chunks.push(u32le(opts.locktime ?? 0));\n\n const total = chunks.reduce((s, c) => s + c.length, 0);\n const bytes = new Uint8Array(total);\n let off = 0;\n for (const c of chunks) {\n bytes.set(c, off);\n off += c.length;\n }\n const txid = sha256d(bytes);\n const txidDisplay = reverseBytes(txid);\n return { bytes, txid, txidDisplay };\n}\n\n// ============================================================================\n// Bitcoin block header\n// ============================================================================\n\nexport interface BitcoinHeader {\n version: number;\n prevHash: Uint8Array;\n merkleRoot: Uint8Array;\n timestamp: number;\n bits: number;\n nonce: number;\n}\n\nexport interface BuiltBitcoinHeader {\n /** Raw 80-byte serialized header. */\n header: Uint8Array;\n /**\n * Display-form hash (`reverse(sha256d(header))`) — what the Stacks\n * chainstate stores as `BurnchainHeaderHash`. Pass this as the\n * `burn_header_hashes[i]` override on `addAdvanceBlocks`.\n */\n hash: Uint8Array;\n /** Raw `sha256d(header)` (internal byte order). */\n rawHash: Uint8Array;\n}\n\n/**\n * Build an 80-byte Bitcoin block header. `prevHash` and `merkleRoot`\n * are written in internal byte order (raw `sha256d` output) — matching\n * the on-chain `clarity-bitcoin-v1-07` parser convention.\n */\nexport function buildBitcoinHeader(\n h: Partial<BitcoinHeader> & { merkleRoot: Uint8Array },\n): BuiltBitcoinHeader {\n const out = new Uint8Array(80);\n const view = new DataView(out.buffer);\n view.setUint32(0, h.version ?? 0x20000000, true);\n out.set(h.prevHash ?? new Uint8Array(32), 4);\n out.set(h.merkleRoot, 36);\n view.setUint32(68, h.timestamp ?? Math.floor(Date.now() / 1000), true);\n view.setUint32(72, h.bits ?? 0x1d00ffff, true);\n view.setUint32(76, h.nonce ?? 0, true);\n const rawHash = sha256d(out);\n return { header: out, hash: reverseBytes(rawHash), rawHash };\n}\n\n// ============================================================================\n// Merkle proofs (Bitcoin convention)\n// ============================================================================\n\n/**\n * Single-tx Merkle root — the txid itself. Bitcoin's Merkle tree\n * convention does NOT pre-hash the leaves; for a one-tx block the\n * root equals the txid.\n */\nexport function singleTxMerkleRoot(txid: Uint8Array): Uint8Array {\n return new Uint8Array(txid);\n}\n\n/**\n * Compute a Bitcoin Merkle proof for `txid` at `index` in `txids`\n * (transaction order within the block). Returns the sibling hashes\n * from leaf to root.\n *\n * Bitcoin convention:\n * - Leaves are the txids themselves (no pre-hashing).\n * - Inner nodes are `sha256d(left || right)`.\n * - Odd levels duplicate the last entry to pair.\n */\nexport function merkleProof(\n txids: Uint8Array[],\n index: number,\n): { proof: Uint8Array[]; root: Uint8Array } {\n if (index < 0 || index >= txids.length) {\n throw new Error(`merkleProof: index ${index} out of range ${txids.length}`);\n }\n let level: Uint8Array[] = txids.map((t) => new Uint8Array(t));\n const proof: Uint8Array[] = [];\n let i = index;\n while (level.length > 1) {\n if (level.length % 2 === 1) level.push(level[level.length - 1]);\n const sibling = level[i ^ 1];\n proof.push(sibling);\n const next: Uint8Array[] = [];\n for (let j = 0; j < level.length; j += 2) {\n next.push(sha256d(concatBytes(level[j], level[j + 1])));\n }\n level = next;\n i = Math.floor(i / 2);\n }\n return { proof, root: level[0] };\n}\n\n/**\n * Verify a Bitcoin Merkle proof against `root`. Returns `true` iff the\n * proof reconstructs the root from `txid` at `index`. Matches the\n * on-chain `verify-merkle-proof` semantic.\n */\nexport function verifyMerkleProof(\n txid: Uint8Array,\n index: number,\n proof: Uint8Array[],\n root: Uint8Array,\n): boolean {\n let h: Uint8Array = new Uint8Array(txid);\n let i = index;\n for (const sibling of proof) {\n h =\n (i & 1) === 0\n ? sha256d(concatBytes(h, sibling))\n : sha256d(concatBytes(sibling, h));\n i = Math.floor(i / 2);\n }\n return bytesEqual(h, root);\n}\n\n// ============================================================================\n// Internal byte helpers\n// ============================================================================\n\nfunction reverseBytes(a: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length);\n for (let i = 0; i < a.length; i++) out[i] = a[a.length - 1 - i];\n return out;\n}\n\nfunction concatBytes(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return out;\n}\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n","/**\n * WARNING:\n *\n * this file will be used in cross-runtime environments (browser, cloudflare workers, XLinkSDK, etc.),\n * so please be careful when adding `import`s to it.\n */\n\nimport {\n type ClarityValue,\n contractPrincipalCV,\n type OptionalCV,\n} from '@stacks/transactions';\nimport { type BatchReads, batchRead } from './batch-api';\n\nexport interface ReadOnlyRequest {\n mode: 'readonly';\n contractAddress: string;\n contractName: string;\n functionName: string;\n functionArgs: ClarityValue[];\n}\n\nexport interface MapEntryRequest {\n mode: 'mapEntry';\n contractAddress: string;\n contractName: string;\n mapName: string;\n mapKey: ClarityValue;\n}\n\nexport interface VariableRequest {\n mode: 'variable';\n contractAddress: string;\n contractName: string;\n variableName: string;\n}\n\nexport type BatchRequest = MapEntryRequest | VariableRequest | ReadOnlyRequest;\n\nexport interface QueuedRequest {\n request: BatchRequest;\n tip?: string;\n resolve: (value: ClarityValue | OptionalCV) => void;\n reject: (error: Error) => void;\n}\n\nexport class BatchProcessor {\n private queues = new Map<string, QueuedRequest[]>();\n private timeoutIds = new Map<string, ReturnType<typeof setTimeout>>();\n\n private readonly stxerAPIEndpoint: string;\n private readonly batchDelayMs: number;\n\n constructor(options: { stxerAPIEndpoint?: string; batchDelayMs: number }) {\n this.stxerAPIEndpoint = options.stxerAPIEndpoint ?? 'https://api.stxer.xyz';\n this.batchDelayMs = options.batchDelayMs;\n }\n\n private getQueueKey(tip?: string): string {\n return tip ?? '_undefined';\n }\n\n read(request: BatchRequest): Promise<ClarityValue | OptionalCV> {\n return new Promise((resolve, reject) => {\n this.enqueue({ request, resolve, reject });\n });\n }\n\n enqueue(request: QueuedRequest): void {\n const queueKey = this.getQueueKey(request.tip);\n\n const queue = this.queues.get(queueKey) ?? [];\n if (!this.queues.has(queueKey)) {\n this.queues.set(queueKey, queue);\n }\n queue.push(request);\n\n if (!this.timeoutIds.has(queueKey)) {\n const timeoutId = setTimeout(\n () => this.processBatch(queueKey),\n this.batchDelayMs,\n );\n this.timeoutIds.set(queueKey, timeoutId);\n }\n }\n\n private async processBatch(queueKey: string): Promise<void> {\n const currentQueue = this.queues.get(queueKey) ?? [];\n this.queues.delete(queueKey);\n\n const timeoutId = this.timeoutIds.get(queueKey);\n if (timeoutId) {\n clearTimeout(timeoutId);\n this.timeoutIds.delete(queueKey);\n }\n\n if (currentQueue.length === 0) return;\n\n try {\n const readonlyRequests = currentQueue.filter(\n (q): q is QueuedRequest & { request: ReadOnlyRequest } =>\n q.request.mode === 'readonly',\n );\n const mapRequests = currentQueue.filter(\n (q): q is QueuedRequest & { request: MapEntryRequest } =>\n q.request.mode === 'mapEntry',\n );\n const variableRequests = currentQueue.filter(\n (q): q is QueuedRequest & { request: VariableRequest } =>\n q.request.mode === 'variable',\n );\n\n const tip = queueKey === '_undefined' ? undefined : queueKey;\n\n const batchRequest: BatchReads = {\n readonly: readonlyRequests.map(({ request }) => ({\n contract: contractPrincipalCV(\n request.contractAddress,\n request.contractName,\n ),\n functionName: request.functionName,\n functionArgs: request.functionArgs,\n })),\n maps: mapRequests.map(({ request }) => ({\n contract: contractPrincipalCV(\n request.contractAddress,\n request.contractName,\n ),\n mapName: request.mapName,\n mapKey: request.mapKey,\n })),\n variables: variableRequests.map(({ request }) => ({\n contract: contractPrincipalCV(\n request.contractAddress,\n request.contractName,\n ),\n variableName: request.variableName,\n })),\n index_block_hash: tip,\n };\n\n const results = await batchRead(batchRequest, {\n stxerApi: this.stxerAPIEndpoint,\n });\n\n // Handle readonly results\n for (const [index, result] of results.readonly.entries()) {\n if (result instanceof Error) {\n readonlyRequests[index].reject(result);\n } else {\n readonlyRequests[index].resolve(result);\n }\n }\n\n // Handle variable results\n for (const [index, result] of results.vars.entries()) {\n if (result instanceof Error) {\n variableRequests[index].reject(result);\n } else {\n variableRequests[index].resolve(result);\n }\n }\n\n // Handle map results\n for (const [index, result] of results.maps.entries()) {\n if (result instanceof Error) {\n mapRequests[index].reject(result);\n } else {\n mapRequests[index].resolve(result);\n }\n }\n } catch (error) {\n for (const item of currentQueue) {\n item.reject(error as Error);\n }\n }\n }\n}\n","import {\n ClarityType,\n type ClarityValue,\n type OptionalCV,\n} from '@stacks/transactions';\nimport type {\n ClarityAbiFunction,\n ClarityAbiMap,\n ClarityAbiVariable,\n TContractPrincipal,\n TPrincipal,\n} from 'clarity-abi';\nimport type {\n InferMapValueType,\n InferReadMapParameterType,\n InferReadonlyCallParameterType,\n InferReadonlyCallResultType,\n InferReadVariableParameterType,\n InferVariableType,\n} from 'ts-clarity';\nimport { decodeAbi, encodeAbi } from 'ts-clarity';\nimport { BatchProcessor } from './batch-processor';\n\n// Shared processor instance with default settings\nconst defaultProcessor = new BatchProcessor({\n batchDelayMs: 100,\n});\n\nexport type ReadonlyCallRuntimeOptions = {\n sender?: TPrincipal;\n contract: TContractPrincipal;\n stacksEndpoint?: string;\n indexBlockHash?: string;\n batchProcessor?: BatchProcessor;\n};\n\nexport type ReadMapRuntimeParameters = {\n contract: TContractPrincipal;\n stacksEndpoint?: string;\n proof?: boolean;\n indexBlockHash?: string;\n batchProcessor?: BatchProcessor;\n};\n\nexport type ReadVariableRuntimeParameterType = {\n contract: TContractPrincipal;\n stacksEndpoint?: string;\n proof?: boolean;\n indexBlockHash?: string;\n batchProcessor?: BatchProcessor;\n};\n\nexport async function callReadonly<\n Functions extends readonly ClarityAbiFunction[] | readonly unknown[],\n FunctionName extends string,\n>(\n params: InferReadonlyCallParameterType<Functions, FunctionName> &\n ReadonlyCallRuntimeOptions,\n): Promise<InferReadonlyCallResultType<Functions, FunctionName>> {\n const processor = params.batchProcessor ?? defaultProcessor;\n const [deployer, contractName] = params.contract.split('.', 2);\n const fn = String(params.functionName);\n\n const functionDef = (params.abi as readonly ClarityAbiFunction[]).find(\n (def) => def.name === params.functionName,\n );\n if (!functionDef) {\n throw new Error(\n `failed to find function definition for ${params.functionName}`,\n );\n }\n\n const argsKV = (params as unknown as { args: Record<string, unknown> }).args;\n const args: ClarityValue[] = [];\n for (const argDef of functionDef.args) {\n args.push(encodeAbi(argDef.type, argsKV[argDef.name]));\n }\n\n return new Promise((resolve, reject) => {\n processor.enqueue({\n request: {\n mode: 'readonly',\n contractAddress: deployer,\n contractName: contractName,\n functionName: fn,\n functionArgs: args,\n },\n tip: params.indexBlockHash,\n resolve: (result: ClarityValue | OptionalCV) => {\n try {\n const decoded = decodeAbi(functionDef.outputs.type, result);\n resolve(\n decoded as InferReadonlyCallResultType<Functions, FunctionName>,\n );\n } catch (error) {\n reject(error);\n }\n },\n reject,\n });\n });\n}\n\nexport async function readMap<\n Maps extends\n | readonly ClarityAbiMap[]\n | readonly unknown[] = readonly ClarityAbiMap[],\n MapName extends string = string,\n>(\n params: InferReadMapParameterType<Maps, MapName> & ReadMapRuntimeParameters,\n): Promise<InferMapValueType<Maps, MapName> | null> {\n const processor = params.batchProcessor ?? defaultProcessor;\n const [deployer, contractName] = params.contract.split('.', 2);\n\n const mapDef = (params.abi as readonly ClarityAbiMap[]).find(\n (m) => m.name === params.mapName,\n );\n if (!mapDef) {\n throw new Error(`failed to find map definition for ${params.mapName}`);\n }\n\n const key: ClarityValue = encodeAbi(mapDef.key, params.key);\n\n return new Promise((resolve, reject) => {\n processor.enqueue({\n request: {\n mode: 'mapEntry',\n contractAddress: deployer,\n contractName: contractName,\n mapName: params.mapName,\n mapKey: key,\n },\n tip: params.indexBlockHash,\n resolve: (result: ClarityValue | OptionalCV) => {\n try {\n if (result.type === ClarityType.OptionalNone) {\n resolve(null);\n return;\n }\n if (result.type !== ClarityType.OptionalSome) {\n throw new Error(`unexpected map value: ${result}`);\n }\n const someCV = result as {\n type: ClarityType.OptionalSome;\n value: ClarityValue;\n };\n const decoded = decodeAbi(mapDef.value, someCV.value);\n resolve(decoded as InferMapValueType<Maps, MapName>);\n } catch (error) {\n reject(error);\n }\n },\n reject,\n });\n });\n}\n\nexport async function readVariable<\n Variables extends\n | readonly ClarityAbiVariable[]\n | readonly unknown[] = readonly ClarityAbiVariable[],\n VariableName extends string = string,\n>(\n params: InferReadVariableParameterType<Variables, VariableName> &\n ReadVariableRuntimeParameterType,\n): Promise<InferVariableType<Variables, VariableName>> {\n const processor = params.batchProcessor ?? defaultProcessor;\n const [deployer, contractName] = params.contract.split('.', 2);\n\n const varDef = (params.abi as readonly ClarityAbiVariable[]).find(\n (def) => def.name === params.variableName,\n );\n if (!varDef) {\n throw new Error(\n `failed to find variable definition for ${params.variableName}`,\n );\n }\n\n return new Promise((resolve, reject) => {\n processor.enqueue({\n request: {\n mode: 'variable',\n contractAddress: deployer,\n contractName: contractName,\n variableName: params.variableName,\n },\n tip: params.indexBlockHash,\n resolve: (result: ClarityValue | OptionalCV) => {\n try {\n const decoded = decodeAbi(varDef.type, result);\n resolve(decoded as InferVariableType<Variables, VariableName>);\n } catch (error) {\n reject(error);\n }\n },\n reject,\n });\n });\n}\n","/**\n * Low-level programmatic simulation APIs\n *\n * These functions provide direct access to the stxer V2 simulation endpoints\n * for programmatic use cases where you need more control than SimulationBuilder provides.\n */\n\nimport { DEFAULT_STXER_API } from './constants';\nimport type {\n InstantSimulationRequest,\n InstantSimulationResponse,\n SimulationBatchReadsRequest,\n SimulationBatchReadsResponse,\n SimulationResult,\n SimulationTipResponse,\n SubmitSimulationStepsRequest,\n SubmitSimulationStepsResponse,\n U64,\n} from './types';\n\n/**\n * Server-side error markers. `simulation_busy` ↔ HTTP 409,\n * `simulation_outdated` ↔ HTTP 410. Other errors keep `marker = null`.\n */\nexport type SimulationErrorMarker =\n | 'simulation_busy'\n | 'simulation_outdated'\n | null;\n\n/**\n * Thrown by the simulation-api fetch wrappers when the API responds\n * with a non-2xx status. `status` carries the wire HTTP code so\n * callers can branch on 409 (busy) / 410 (outdated) without parsing\n * the message string. `marker` is the server-side classification\n * extracted from the body prefix (`simulation_busy:` /\n * `simulation_outdated:`).\n *\n * Pre-0.8.0 SDKs threw a plain `Error` whose message embedded the body\n * text; that lossy form is still used for the message field here so\n * existing log scrapers keep working.\n */\nexport class SimulationError extends Error {\n readonly status: number;\n readonly marker: SimulationErrorMarker;\n readonly body: string;\n constructor(operation: string, status: number, body: string) {\n const marker = detectMarker(body);\n super(`${operation} (HTTP ${status}): ${body}`);\n this.name = 'SimulationError';\n this.status = status;\n this.marker = marker;\n this.body = body;\n }\n}\n\nfunction detectMarker(body: string): SimulationErrorMarker {\n if (body.includes('simulation_busy:')) return 'simulation_busy';\n if (body.includes('simulation_outdated:')) return 'simulation_outdated';\n return null;\n}\n\nasync function throwSimulationError(\n operation: string,\n response: Response,\n): Promise<never> {\n const text = await response.text();\n throw new SimulationError(operation, response.status, text);\n}\n\n/**\n * Options for API calls\n */\nexport interface SimulationApiOptions {\n /** stxer API endpoint (default: https://api.stxer.xyz) */\n stxerApi?: string;\n}\n\n/**\n * Create simulation session options\n */\nexport interface CreateSessionOptions {\n /**\n * Block height for simulation (optional, uses tip if not provided).\n * u64 — `number | string`; see {@link U64}.\n */\n block_height?: U64;\n /** Block hash corresponding to block_height */\n block_hash?: string;\n /** Skip debug tracing for faster simulations */\n skip_tracing?: boolean;\n}\n\n/**\n * Instantly simulate a transaction\n *\n * This is useful for apps/wallets to get the result of a transaction before sending it.\n * Lightweight - no debug tracing information.\n *\n * @param request - Instant simulation request\n * @param options - API options\n * @returns Instant simulation response with receipt and optional reads\n *\n * @example\n * ```typescript\n * import { instantSimulation } from 'stxer';\n *\n * const result = await instantSimulation({\n * transaction: '0x...',\n * block_height: 130818,\n * block_hash: '0x...',\n * reads: [\n * { DataVar: ['SP...contract', 'my-var'] },\n * { StxBalance: 'SP...' }\n * ]\n * });\n * console.log(result.receipt.result);\n * ```\n */\nexport async function instantSimulation(\n request: InstantSimulationRequest,\n options: SimulationApiOptions = {},\n): Promise<InstantSimulationResponse> {\n const apiEndpoint = options.stxerApi ?? DEFAULT_STXER_API;\n\n const response = await fetch(\n `${apiEndpoint}/devtools/v2/simulations:instant`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n },\n );\n\n if (!response.ok) {\n await throwSimulationError('Instant simulation failed', response);\n }\n\n return response.json() as Promise<InstantSimulationResponse>;\n}\n\n/**\n * Create a new simulation session\n *\n * A session allows you to run multiple steps in a forked chain state.\n *\n * @param options - Create session options\n * @param apiOptions - API options\n * @returns Session ID\n *\n * @example\n * ```typescript\n * import { createSimulationSession } from 'stxer';\n *\n * const sessionId = await createSimulationSession({\n * block_height: 130818,\n * skip_tracing: false\n * });\n * ```\n */\nexport async function createSimulationSession(\n options: CreateSessionOptions = {},\n apiOptions: SimulationApiOptions = {},\n): Promise<string> {\n const apiEndpoint = apiOptions.stxerApi ?? DEFAULT_STXER_API;\n\n const response = await fetch(`${apiEndpoint}/devtools/v2/simulations`, {\n method: 'POST',\n body: JSON.stringify(options),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n await throwSimulationError('Failed to create simulation session', response);\n }\n\n const result = (await response.json()) as { id: string };\n return result.id;\n}\n\n/**\n * Submit steps to a simulation session\n *\n * Steps are executed sequentially in the session's forked chain state.\n *\n * @param sessionId - Simulation session ID\n * @param request - Steps to submit\n * @param options - API options\n * @returns Array of step results\n *\n * @example\n * ```typescript\n * import { submitSimulationSteps } from 'stxer';\n *\n * const results = await submitSimulationSteps(sessionId, {\n * steps: [\n * { Transaction: '0x...' },\n * { Eval: ['SP...', '', 'SP...contract', '(var-get my-var)'] },\n * { Reads: [{ DataVar: ['SP...contract', 'my-var'] }] }\n * ]\n * });\n * ```\n */\nexport async function submitSimulationSteps(\n sessionId: string,\n request: SubmitSimulationStepsRequest,\n options: SimulationApiOptions = {},\n): Promise<SubmitSimulationStepsResponse> {\n const apiEndpoint = options.stxerApi ?? DEFAULT_STXER_API;\n\n const response = await fetch(\n `${apiEndpoint}/devtools/v2/simulations/${sessionId}`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n },\n );\n\n if (!response.ok) {\n await throwSimulationError('Failed to submit simulation steps', response);\n }\n\n return response.json() as Promise<SubmitSimulationStepsResponse>;\n}\n\n/**\n * Get simulation session results\n *\n * Returns the full simulation result including metadata and all step results.\n *\n * @param sessionId - Simulation session ID\n * @param options - API options\n * @returns Complete simulation result\n *\n * @example\n * ```typescript\n * import { getSimulationResult } from 'stxer';\n *\n * const result = await getSimulationResult(sessionId);\n * console.log(result.metadata);\n * console.log(result.steps);\n * ```\n */\nexport async function getSimulationResult(\n sessionId: string,\n options: SimulationApiOptions = {},\n): Promise<SimulationResult> {\n const apiEndpoint = options.stxerApi ?? DEFAULT_STXER_API;\n\n const response = await fetch(\n `${apiEndpoint}/devtools/v2/simulations/${sessionId}`,\n {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n },\n );\n\n if (!response.ok) {\n await throwSimulationError('Failed to get simulation result', response);\n }\n\n return response.json() as Promise<SimulationResult>;\n}\n\n/**\n * Get the current tip of a simulation session.\n *\n * Returns the latest synthetic tip when at least one `AdvanceBlocks`\n * step has run (`synthetic: true`, includes `vrf_seed` and\n * `tenure_change`). Returns the parent metadata pinned at session\n * start otherwise (`synthetic: false`, `vrf_seed` and `tenure_change`\n * omitted).\n *\n * Backed by `GET /devtools/v2/simulations/{id}/tip`. Older simulator\n * builds that predate this route respond 404.\n *\n * @example\n * ```typescript\n * import { getSimulationTip } from 'stxer';\n *\n * const tip = await getSimulationTip(sessionId);\n * if (tip.synthetic) {\n * console.log('synthetic tip vrf_seed:', tip.vrf_seed);\n * }\n * ```\n */\nexport async function getSimulationTip(\n sessionId: string,\n options: SimulationApiOptions = {},\n): Promise<SimulationTipResponse> {\n const apiEndpoint = options.stxerApi ?? DEFAULT_STXER_API;\n\n const response = await fetch(\n `${apiEndpoint}/devtools/v2/simulations/${sessionId}/tip`,\n {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n },\n );\n\n if (!response.ok) {\n await throwSimulationError('Failed to get simulation tip', response);\n }\n\n return response.json() as Promise<SimulationTipResponse>;\n}\n\n/**\n * Batch reads from a simulation session\n *\n * Similar to sidecar batch reads, but reads from the simulation's forked state.\n *\n * @param sessionId - Simulation session ID\n * @param request - Batch reads request\n * @param options - API options\n * @returns Batch read results\n *\n * @example\n * ```typescript\n * import { simulationBatchReads } from 'stxer';\n *\n * const results = await simulationBatchReads(sessionId, {\n * vars: [['SP...contract', 'my-var']],\n * maps: [['SP...contract', 'my-map', '0x...']],\n * stx: ['SP...']\n * });\n * console.log(results.vars);\n * ```\n */\nexport async function simulationBatchReads(\n sessionId: string,\n request: SimulationBatchReadsRequest,\n options: SimulationApiOptions = {},\n): Promise<SimulationBatchReadsResponse> {\n const apiEndpoint = options.stxerApi ?? DEFAULT_STXER_API;\n\n const response = await fetch(\n `${apiEndpoint}/devtools/v2/simulations/${sessionId}/reads`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n },\n );\n\n if (!response.ok) {\n await throwSimulationError(\n 'Failed to batch reads from simulation',\n response,\n );\n }\n\n return response.json() as Promise<SimulationBatchReadsResponse>;\n}\n","/**\n * Transaction-building helpers for the simulator.\n *\n * The simulator does NOT verify signatures — it derives `tx-sender`\n * from the `signer` field (= hash160 of the public key) plus the\n * `hashMode` byte. By overriding those two fields on an *unsigned*\n * transaction, you can simulate any sender without a private key.\n *\n * {@link setSender} performs the override; {@link buildUnsignedContractCallHex}\n * combines the unsigned-tx builder from `@stacks/transactions` with\n * `setSender` and returns a hex string ready to drop into a\n * `{ Transaction: <hex> }` simulation step.\n */\nimport { AddressVersion, type StacksNetworkName } from '@stacks/network';\nimport {\n AddressHashMode,\n Cl,\n type ClarityValue,\n type MultiSigSpendingCondition,\n makeUnsignedContractCall,\n PostConditionMode,\n type StacksTransactionWire,\n serializeTransaction,\n} from '@stacks/transactions';\nimport { c32addressDecode } from 'c32check';\n\n/**\n * Override the spending condition's `signer` (and `hashMode`) so the\n * simulator treats `tx-sender` as `sender`.\n *\n * Single-sig and multi-sig flavours are both handled — the multi-sig\n * spending condition is rebuilt with empty signature fields because\n * the simulator never validates signatures.\n */\nexport function setSender(\n tx: StacksTransactionWire,\n sender: string,\n): StacksTransactionWire {\n const [addressVersion, signer] = c32addressDecode(sender);\n switch (addressVersion) {\n case AddressVersion.MainnetSingleSig:\n case AddressVersion.TestnetSingleSig:\n tx.auth.spendingCondition.hashMode = AddressHashMode.P2PKH;\n tx.auth.spendingCondition.signer = signer;\n break;\n case AddressVersion.MainnetMultiSig:\n case AddressVersion.TestnetMultiSig: {\n const sc = tx.auth.spendingCondition;\n tx.auth.spendingCondition = {\n hashMode: AddressHashMode.P2SH,\n signer,\n fields: [],\n signaturesRequired: 0,\n nonce: sc.nonce,\n fee: sc.fee,\n } as MultiSigSpendingCondition;\n break;\n }\n default:\n throw new Error(`unsupported address version: ${addressVersion}`);\n }\n return tx;\n}\n\nexport interface ContractCallTxArgs {\n /** Principal to set as `tx-sender`. */\n sender: string;\n /** Fully-qualified contract id, e.g. `\"SP1G48….dia-oracle\"`. */\n contract: string;\n functionName: string;\n functionArgs: ClarityValue[];\n /** microSTX. Defaults to 1_000. */\n fee?: number;\n /** Nonce to declare. Caller is responsible for sequencing. */\n nonce: number;\n network?: StacksNetworkName;\n /**\n * Post-condition mode. Defaults to `Allow` so the simulator runs\n * the call regardless of asset movements; switch to `Deny` + an\n * explicit list when a test wants to assert post-condition\n * enforcement.\n */\n postConditionMode?: PostConditionMode;\n}\n\n/**\n * Build an unsigned contract-call transaction with `sender` patched\n * in via {@link setSender}, then return the serialized hex (no `0x`\n * prefix). Drop the result directly into `{ Transaction: <hex> }`.\n *\n * @example\n * ```typescript\n * import { Cl } from '@stacks/transactions';\n * import { buildUnsignedContractCallHex } from 'stxer';\n *\n * const txHex = await buildUnsignedContractCallHex({\n * sender: 'SP3573...',\n * contract: 'SM3VDXK...sbtc-deposit',\n * functionName: 'complete-deposit-wrapper',\n * functionArgs: [Cl.bufferFromHex(txid), Cl.uint(0), Cl.uint(amount), ...],\n * nonce: 5,\n * });\n * await submitSimulationSteps(sim, { steps: [{ Transaction: txHex }] });\n * ```\n */\nexport async function buildUnsignedContractCallHex(\n args: ContractCallTxArgs,\n): Promise<string> {\n const [contractAddress, contractName] = args.contract.split('.');\n if (!contractName) {\n throw new Error(`bad contract id \"${args.contract}\" — expected SP….name`);\n }\n const tx = await makeUnsignedContractCall({\n contractAddress,\n contractName,\n functionName: args.functionName,\n functionArgs: args.functionArgs,\n fee: args.fee ?? 1_000,\n nonce: args.nonce,\n // Dummy 33-byte compressed pubkey. The simulator never validates\n // the signature; setSender overwrites the derived signer hash.\n publicKey: '0'.repeat(66),\n network: args.network ?? 'mainnet',\n postConditionMode: args.postConditionMode ?? PostConditionMode.Allow,\n });\n setSender(tx, args.sender);\n return serializeTransaction(tx);\n}\n\n/**\n * Build a `Cl.contractPrincipal` from a `\"SP….name\"` id string.\n * Trips on standard principals or malformed ids — those should use\n * `Cl.principal` directly.\n */\nexport function ftPrincipal(contractId: string): ClarityValue {\n const [addr, name] = contractId.split('.');\n if (!name) {\n throw new Error(`bad contract id \"${contractId}\" — expected SP….name`);\n }\n return Cl.contractPrincipal(addr, name);\n}\n","import {\n STACKS_MAINNET,\n STACKS_TESTNET,\n type StacksNetworkName,\n} from '@stacks/network';\nimport type { Block } from '@stacks/stacks-blockchain-api-types';\nimport {\n Cl,\n ClarityType,\n type ClarityValue,\n ClarityVersion,\n cvToString,\n deserializeCV,\n makeUnsignedContractCall,\n makeUnsignedContractDeploy,\n makeUnsignedSTXTokenTransfer,\n PostConditionMode,\n serializeCV,\n} from '@stacks/transactions';\nimport { type AccountDataResponse, getNodeInfo, richFetch } from 'ts-clarity';\nimport { bytesToHex } from './bitcoin';\nimport { STXER_API_MAINNET, STXER_API_TESTNET } from './constants';\nimport {\n createSimulationSession,\n type SimulationApiOptions,\n simulationBatchReads,\n submitSimulationSteps,\n} from './simulation-api';\nimport {\n buildUnsignedContractCallHex,\n type ContractCallTxArgs,\n setSender,\n} from './transaction';\nimport type {\n AdvanceBlocksRequest,\n ReadStep,\n SimulationStepInput,\n TenureExtendCause,\n TransactionReceipt,\n} from './types';\n\nexport interface SimulationEval {\n contract_id: string;\n code: string;\n}\n\ninterface SimulationBuilderOptions {\n apiEndpoint?: string;\n stacksNodeAPI?: string;\n network?: StacksNetworkName | string;\n skipTracing?: boolean;\n}\n\nexport class SimulationBuilder {\n private apiEndpoint: string;\n private stacksNodeAPI: string;\n private network: StacksNetworkName | string;\n private skipTracing: boolean;\n\n private constructor(options: SimulationBuilderOptions = {}) {\n this.network = options.network ?? 'mainnet';\n const isTestnet = this.network === 'testnet';\n\n this.apiEndpoint =\n options.apiEndpoint ??\n (isTestnet ? STXER_API_TESTNET : STXER_API_MAINNET);\n this.stacksNodeAPI =\n options.stacksNodeAPI ??\n (isTestnet ? 'https://api.testnet.hiro.so' : 'https://api.hiro.so');\n this.skipTracing = options.skipTracing ?? false;\n }\n\n public static new(options?: SimulationBuilderOptions) {\n return new SimulationBuilder(options);\n }\n\n private block = Number.NaN;\n private sender = '';\n private steps: (\n | {\n // inline simulation (V1 - not supported in V2, but kept for potential future support)\n simulationId: string;\n }\n | {\n // contract call\n contract_id: string;\n function_name: string;\n function_args?: ClarityValue[];\n sender: string;\n fee: number;\n }\n | {\n // contract deploy\n contract_name: string;\n source_code: string;\n deployer: string;\n fee: number;\n clarity_version: ClarityVersion;\n }\n | {\n // STX transfer\n recipient: string;\n amount: number;\n sender: string;\n fee: number;\n }\n | SimulationEval\n | {\n // SetContractCode - V2 native step type\n type: 'SetContractCode';\n contract_id: string;\n source_code: string;\n clarity_version: ClarityVersion;\n }\n | {\n // Reads - V2 native batch reads step type\n type: 'Reads';\n reads: ReadStep[];\n }\n | {\n // TenureExtend - V2 native step type\n type: 'TenureExtend';\n cause: TenureExtendCause;\n }\n | {\n // AdvanceBlocks - V2 native step type, synthesizes blocks\n type: 'AdvanceBlocks';\n request: AdvanceBlocksRequest;\n }\n )[] = [];\n\n public useBlockHeight(block: number) {\n this.block = block;\n return this;\n }\n\n public withSender(address: string) {\n this.sender = address;\n return this;\n }\n\n public inlineSimulation(simulationId: string) {\n this.steps.push({\n simulationId,\n });\n return this;\n }\n\n public addSTXTransfer(params: {\n recipient: string;\n amount: number;\n sender?: string;\n fee?: number;\n }) {\n if (params.sender == null && this.sender === '') {\n throw new Error(\n 'Please specify a sender with useSender or adding a sender paramenter',\n );\n }\n this.steps.push({\n ...params,\n sender: params.sender ?? this.sender,\n fee: params.fee ?? 0,\n });\n return this;\n }\n\n public addContractCall(params: {\n contract_id: string;\n function_name: string;\n function_args?: ClarityValue[];\n sender?: string;\n fee?: number;\n }) {\n if (params.sender == null && this.sender === '') {\n throw new Error(\n 'Please specify a sender with useSender or adding a sender paramenter',\n );\n }\n this.steps.push({\n ...params,\n sender: params.sender ?? this.sender,\n fee: params.fee ?? 0,\n });\n return this;\n }\n\n public addContractDeploy(params: {\n contract_name: string;\n source_code: string;\n deployer?: string;\n fee?: number;\n clarity_version?: ClarityVersion;\n }) {\n if (params.deployer == null && this.sender === '') {\n throw new Error(\n 'Please specify a deployer with useSender or adding a deployer paramenter',\n );\n }\n this.steps.push({\n ...params,\n deployer: params.deployer ?? this.sender,\n fee: params.fee ?? 0,\n clarity_version: params.clarity_version ?? ClarityVersion.Clarity5,\n });\n return this;\n }\n\n public addEvalCode(inside_contract_id: string, code: string) {\n this.steps.push({\n contract_id: inside_contract_id,\n code,\n });\n return this;\n }\n\n public addMapRead(contract_id: string, map: string, key: string) {\n this.steps.push({\n contract_id,\n code: `(map-get ${map} ${key})`,\n });\n return this;\n }\n\n public addVarRead(contract_id: string, variable: string) {\n this.steps.push({\n contract_id,\n code: `(var-get ${variable})`,\n });\n return this;\n }\n\n public addSetContractCode(params: {\n contract_id: string;\n source_code: string;\n clarity_version?: ClarityVersion;\n }) {\n this.steps.push({\n type: 'SetContractCode',\n contract_id: params.contract_id,\n source_code: params.source_code,\n clarity_version: params.clarity_version ?? ClarityVersion.Clarity5,\n });\n return this;\n }\n\n public addReads(reads: ReadStep[]) {\n this.steps.push({\n type: 'Reads',\n reads,\n });\n return this;\n }\n\n /**\n * Add a `TenureExtend` step. Defaults to `cause: 'Extended'` (full\n * cost reset) — equivalent in server-side behavior to the legacy\n * zero-arg call.\n *\n * Pass an explicit `TenureExtendCause` to reset only one SIP-034\n * dimension (`ExtendedRuntime` / `ExtendedReadCount` / etc.).\n *\n * On the wire SDK 0.8.0 emits the modern `{ TenureExtend: { cause } }`\n * shape. The server still parses the legacy `[]` shape for any\n * caller emitting raw step objects.\n */\n public addTenureExtend(cause: TenureExtendCause = 'Extended') {\n this.steps.push({\n type: 'TenureExtend',\n cause,\n });\n return this;\n }\n\n /**\n * Synthesize bitcoin and stacks blocks on top of the simulation's\n * pinned parent tip. Used to model burn-block / tenure boundaries\n * (bridge contracts, time-locked redemptions, locked-STX unlock).\n *\n * The simulator validates the request shape; older simulator builds\n * that don't yet support `AdvanceBlocks` reject this variant with\n * HTTP 400.\n *\n * @example\n * ```typescript\n * builder.addAdvanceBlocks({\n * bitcoin_blocks: 1,\n * stacks_blocks_per_bitcoin: 1,\n * });\n * ```\n */\n public addAdvanceBlocks(request: AdvanceBlocksRequest) {\n this.steps.push({\n type: 'AdvanceBlocks',\n request,\n });\n return this;\n }\n\n private async getBlockInfo() {\n if (Number.isNaN(this.block)) {\n const { stacks_tip_height } = await getNodeInfo({\n stacksEndpoint: this.stacksNodeAPI,\n });\n this.block = stacks_tip_height;\n }\n const info: Block = await richFetch(\n `${this.stacksNodeAPI}/extended/v1/block/by_height/${this.block}?unanchored=true`,\n ).then((r) => r.json());\n if (\n info.height !== this.block ||\n typeof info.hash !== 'string' ||\n !info.hash.startsWith('0x')\n ) {\n throw new Error(\n `failed to get block info for block height ${this.block}`,\n );\n }\n return {\n block_height: this.block,\n block_hash: info.hash.substring(2),\n index_block_hash: info.index_block_hash.substring(2),\n };\n }\n\n public async run(): Promise<string> {\n console.log(\n `--------------------------------\nThis product can never exist without your support!\n\nWe receive sponsorship funds with:\nSP212Y5JKN59YP3GYG07K3S8W5SSGE4KH6B5STXER\n\nFeedbacks and feature requests are welcome.\nTo get in touch: contact@stxer.xyz\n--------------------------------`,\n );\n const block = await this.getBlockInfo();\n console.log(\n `Using block height ${block.block_height} hash 0x${block.block_hash} to run simulation.`,\n );\n\n const v2Steps: SimulationStepInput[] = [];\n const nonce_by_address = new Map<string, number>();\n const nextNonce = async (sender: string) => {\n const nonce = nonce_by_address.get(sender);\n if (nonce == null) {\n const url = `${\n this.stacksNodeAPI\n }/v2/accounts/${sender}?proof=${false}&tip=${block.index_block_hash}`;\n const account: AccountDataResponse = await richFetch(url).then((r) =>\n r.json(),\n );\n nonce_by_address.set(sender, account.nonce + 1);\n return account.nonce;\n }\n nonce_by_address.set(sender, nonce + 1);\n return nonce;\n };\n\n let network = this.network === 'mainnet' ? STACKS_MAINNET : STACKS_TESTNET;\n if (this.stacksNodeAPI) {\n network = {\n ...network,\n client: {\n ...network.client,\n baseUrl: this.stacksNodeAPI,\n },\n };\n }\n\n for (const step of this.steps) {\n if ('simulationId' in step) {\n // Inline simulation - for V2 we would need to fetch the previous simulation\n // and convert its steps to V2 format. This is complex and may not be\n // commonly used, so for now we'll throw an error.\n throw new Error(\n 'inlineSimulation is not yet supported in V2 API. Please run simulations from scratch.',\n );\n }\n if ('sender' in step && 'function_name' in step) {\n const nonce = await nextNonce(step.sender);\n const tx = await makeUnsignedContractCall({\n contractAddress: step.contract_id.split('.')[0] as string,\n contractName: step.contract_id.split('.')[1] as string,\n functionName: step.function_name,\n functionArgs: step.function_args ?? [],\n nonce,\n network,\n publicKey: '',\n postConditionMode: PostConditionMode.Allow,\n fee: step.fee,\n });\n setSender(tx, step.sender);\n v2Steps.push({ Transaction: bytesToHex(tx.serializeBytes()) });\n } else if ('sender' in step && 'recipient' in step) {\n const nonce = await nextNonce(step.sender);\n const tx = await makeUnsignedSTXTokenTransfer({\n recipient: step.recipient,\n amount: step.amount,\n nonce,\n network,\n publicKey: '',\n fee: step.fee,\n });\n setSender(tx, step.sender);\n v2Steps.push({ Transaction: bytesToHex(tx.serializeBytes()) });\n } else if ('deployer' in step) {\n const nonce = await nextNonce(step.deployer);\n const tx = await makeUnsignedContractDeploy({\n contractName: step.contract_name,\n codeBody: step.source_code,\n nonce,\n network,\n publicKey: '',\n postConditionMode: PostConditionMode.Allow,\n fee: step.fee,\n clarityVersion: step.clarity_version,\n });\n setSender(tx, step.deployer);\n v2Steps.push({ Transaction: bytesToHex(tx.serializeBytes()) });\n } else if ('code' in step) {\n // Eval step - format: [sender, sponsor, contract_id, code]\n // For eval without a sender, we use empty string for sponsor\n const [contractAddress, contractName] = step.contract_id.split('.');\n v2Steps.push({\n Eval: [\n this.sender || contractAddress,\n '',\n `${contractAddress}.${contractName}`,\n step.code,\n ],\n });\n } else if (step.type === 'SetContractCode') {\n // SetContractCode - format: [contract_id, code, clarity_version]\n v2Steps.push({\n SetContractCode: [\n step.contract_id,\n step.source_code,\n clarityVersionToNumber(step.clarity_version),\n ],\n });\n } else if (step.type === 'Reads') {\n // Reads - batch read operations\n v2Steps.push({\n Reads: step.reads,\n });\n } else if (step.type === 'TenureExtend') {\n // TenureExtend - modern wire shape (legacy `[]` is still parsed\n // server-side for direct-emit consumers, but the builder always\n // emits the explicit cause).\n v2Steps.push({\n TenureExtend: { cause: step.cause },\n });\n } else if (step.type === 'AdvanceBlocks') {\n v2Steps.push({\n AdvanceBlocks: step.request,\n });\n } else {\n console.log(`Invalid simulation step: ${step}`);\n }\n }\n\n // Create V2 simulation session\n const simulationId = await createSimulationSession(\n {\n block_height: block.block_height,\n block_hash: block.block_hash,\n skip_tracing: this.skipTracing,\n },\n { stxerApi: this.apiEndpoint },\n );\n\n // Submit steps\n await submitSimulationSteps(\n simulationId,\n { steps: v2Steps },\n { stxerApi: this.apiEndpoint },\n );\n\n console.log(\n `Simulation will be available at: https://stxer.xyz/simulations/${this.network}/${simulationId}`,\n );\n return simulationId;\n }\n\n public pipe(\n transform: (builder: SimulationBuilder) => SimulationBuilder,\n ): SimulationBuilder {\n return transform(this);\n }\n}\n\n// Helper function to convert ClarityVersion to number\nfunction clarityVersionToNumber(version: ClarityVersion): number {\n switch (version) {\n case ClarityVersion.Clarity1:\n return 1;\n case ClarityVersion.Clarity2:\n return 2;\n case ClarityVersion.Clarity3:\n return 3;\n case ClarityVersion.Clarity4:\n return 4;\n case ClarityVersion.Clarity5:\n return 5;\n case ClarityVersion.Clarity6:\n return 6;\n default:\n return 6;\n }\n}\n\n// =============================================================================\n// Session-bound helpers\n// =============================================================================\n//\n// Higher-level helpers that bind to an existing simulation session.\n// Wrap `submitSimulationSteps` / `simulationBatchReads` for the common\n// patterns simulation tests reach for: read a fungible-token balance,\n// read a principal's STX balance / nonce, send a contract call and\n// decode the result.\n//\n// Errors:\n// - Wire-level failures (HTTP non-2xx) propagate as the typed\n// `SimulationError` from `./simulation-api`.\n// - Per-step `Err` results (validation failures) throw a normal\n// `Error` carrying the upstream message.\n// - VM-level failures (`vm_error`) and post-condition aborts are\n// returned via {@link CallContractResult.vmError} / `pcAborted` —\n// they do NOT throw, so callers can assert on them.\n\nexport interface CallContractResult {\n /** Decoded Clarity result (e.g. `(ok true)`, `(err u100)`, `u5`). */\n result: string;\n /** Hex-encoded raw Clarity result (SIP-005). */\n resultHex: string;\n /** VM-level error message, if any (e.g. arithmetic overflow). */\n vmError: string | null;\n /** True when one or more post-conditions tripped. */\n pcAborted: boolean;\n /** Full upstream receipt for callers that need more detail. */\n receipt: TransactionReceipt;\n}\n\n/**\n * Build, submit, and decode a contract-call transaction. The caller\n * supplies the principal to use as `tx-sender`; nonce is auto-fetched\n * via {@link getNonce} unless `nonce` is explicitly provided.\n */\nexport async function callContract(\n sessionId: string,\n args: Omit<ContractCallTxArgs, 'nonce'> & {\n nonce?: number;\n postConditionMode?: PostConditionMode;\n },\n options: SimulationApiOptions = {},\n): Promise<CallContractResult> {\n const nonce =\n args.nonce ?? Number(await getNonce(sessionId, args.sender, options));\n const txHex = await buildUnsignedContractCallHex({ ...args, nonce });\n const r = await submitSimulationSteps(\n sessionId,\n { steps: [{ Transaction: txHex }] },\n options,\n );\n const step = r.steps[0];\n if (!('Transaction' in step)) {\n throw new Error(\n `expected Transaction step, got ${JSON.stringify(step).slice(0, 200)}`,\n );\n }\n if ('Err' in step.Transaction) {\n throw new Error(`Transaction Err: ${step.Transaction.Err}`);\n }\n const receipt = step.Transaction.Ok;\n return {\n result: cvToString(deserializeCV(receipt.result)),\n resultHex: receipt.result,\n vmError: receipt.vm_error,\n pcAborted: receipt.post_condition_aborted,\n receipt,\n };\n}\n\n/**\n * Read the SIP-010 / hBTC-style `(get-balance principal)` value.\n * Returns 0n if the read returns `(err …)`. Throws on infra failures.\n */\nexport async function getFtBalance(\n sessionId: string,\n contractId: string,\n principal: string,\n options: SimulationApiOptions = {},\n): Promise<bigint> {\n const r = await simulationBatchReads(\n sessionId,\n {\n readonly: [\n [contractId, 'get-balance', serializeCV(Cl.principal(principal))],\n ],\n },\n options,\n );\n const v = r.readonly?.[0];\n if (!v || !('Ok' in v)) {\n throw new Error(`get-balance(${contractId}) failed: ${JSON.stringify(v)}`);\n }\n const decoded = deserializeCV(v.Ok);\n if (decoded.type === ClarityType.ResponseErr) {\n return 0n;\n }\n if (decoded.type !== ClarityType.ResponseOk) {\n throw new Error(`unexpected get-balance shape: ${cvToString(decoded)}`);\n }\n if (decoded.value.type !== ClarityType.UInt) {\n throw new Error(`expected uint inside (ok …), got ${decoded.value.type}`);\n }\n return BigInt(decoded.value.value);\n}\n\n/** Read a principal's STX balance (uSTX) from a simulation session. */\nexport async function getStxBalance(\n sessionId: string,\n principal: string,\n options: SimulationApiOptions = {},\n): Promise<bigint> {\n const r = await simulationBatchReads(\n sessionId,\n { stx: [principal] },\n options,\n );\n const v = r.stx?.[0];\n if (!v || !('Ok' in v)) {\n throw new Error(`stx balance read for ${principal} failed`);\n }\n return BigInt(v.Ok);\n}\n\n/** Read a principal's current nonce. Returns 0n if never seen. */\nexport async function getNonce(\n sessionId: string,\n principal: string,\n options: SimulationApiOptions = {},\n): Promise<bigint> {\n const r = await simulationBatchReads(\n sessionId,\n { nonces: [principal] },\n options,\n );\n const v = r.nonces?.[0];\n if (!v || !('Ok' in v)) return 0n;\n return BigInt(v.Ok);\n}\n\n/**\n * Read a Clarity data variable. Returns the decoded `ClarityValue`,\n * or throws if the read failed.\n */\nexport async function readDataVar(\n sessionId: string,\n contractId: string,\n varName: string,\n options: SimulationApiOptions = {},\n): Promise<ClarityValue> {\n const r = await simulationBatchReads(\n sessionId,\n { vars: [[contractId, varName]] },\n options,\n );\n const v = r.vars?.[0];\n if (!v || !('Ok' in v)) {\n throw new Error(\n `var-get ${contractId} ${varName} failed: ${JSON.stringify(v)}`,\n );\n }\n return deserializeCV(v.Ok);\n}\n\n// Re-export simulation types\nexport type {\n CreateSimulationRequest,\n ExecutionCost,\n InstantSimulationRequest,\n InstantSimulationResponse,\n ReadResult,\n ReadStep,\n SimulationMetadata,\n SimulationResult,\n SimulationStepInput,\n TransactionReceipt,\n} from './types';\n","/**\n * WARNING:\n *\n * this file will be used in cross-runtime environments (browser, cloudflare workers, XLinkSDK, etc.),\n * so please be careful when adding `import`s to it.\n */\n\nimport { DEFAULT_STXER_API } from './constants';\nimport type { SidecarTip } from './types';\n\nexport interface TipOptions {\n stxerApi?: string;\n}\n\n/**\n * Fetch the current tip information from the sidecar.\n * @param options - Optional API endpoint configuration\n * @returns The current chain tip information\n */\nexport async function getTip(options: TipOptions = {}): Promise<SidecarTip> {\n const url = `${options.stxerApi ?? DEFAULT_STXER_API}/sidecar/tip`;\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch tip: ${response.status} ${response.statusText}`,\n );\n }\n\n const text = await response.text();\n if (!text.startsWith('{')) {\n throw new Error(`Invalid response from tip endpoint: ${text}`);\n }\n\n return JSON.parse(text) as SidecarTip;\n}\n","/**\n * Type definitions for stxer-api V2 endpoints\n * Hand-written types based on OpenAPI spec at https://api.stxer.xyz/openapi.json\n */\n\n// =============================================================================\n// Sidecar Tip Types\n// =============================================================================\n\n/**\n * Rust `u64` / `u128` fields serialize as JSON numbers but can exceed JS\n * `Number.MAX_SAFE_INTEGER` (2^53 - 1). Accept either form: numbers are\n * convenient for small values, decimal strings preserve full precision\n * for large ones. Mirrors how `pox_addrs[k].payout` (u128) is typed.\n *\n * In practice nearly all values fit in `Number` — this typing exists so\n * code that *might* see a large value (post-genesis cumulative cost\n * counters, accumulated stx_burned in long simulations) cannot silently\n * lose precision. Use `BigInt(x)` to normalize before arithmetic when in\n * doubt.\n */\nexport type U64 = number | string;\n/** Rust `u128`. See {@link U64} for usage notes. */\nexport type U128 = number | string;\n\nexport interface TenureCost {\n read_count: U64;\n read_length: U64;\n write_count: U64;\n write_length: U64;\n runtime: U64;\n}\n\nexport interface SidecarTip {\n bitcoin_height: number;\n block_hash: string;\n block_height: U64;\n block_time: U64;\n burn_block_height: number;\n burn_block_time: U64;\n consensus_hash: string;\n index_block_hash: string;\n is_nakamoto: boolean;\n tenure_cost: TenureCost;\n tenure_height: U64;\n sortition_id: string;\n epoch_id: string;\n}\n\n// =============================================================================\n// AST Types\n// =============================================================================\n\nexport interface ClarityAbiType {\n readonly?: { type: ClarityAbiTypeName; length?: number } | string;\n tuple?: { name: string; type: ClarityAbiType }[];\n list?: { type: ClarityAbiType; length: number };\n buffer?: { length: number };\n string_ascii?: { length: number };\n string_utf8?: { length: number };\n principal?: [];\n bool?: [];\n int?: { length: number };\n uint?: { length: number };\n response?: { ok: ClarityAbiType; error: ClarityAbiType };\n optional?: ClarityAbiType;\n contract?: { name: string; address: string };\n}\n\nexport type ClarityAbiTypeName =\n | 'optional'\n | 'response'\n | 'bool'\n | 'int'\n | 'uint'\n | 'string-ascii'\n | 'string-utf8'\n | 'buff'\n | 'list'\n | 'tuple'\n | 'principal'\n | 'trait-reference'\n | 'contract';\n\nexport interface ClarityAbiFunction {\n name: string;\n access: 'private' | 'public' | 'read_only';\n args: Array<{ name: string; type: ClarityAbiType }>;\n outputs: { type: ClarityAbiType };\n}\n\nexport interface ClarityAbiVariable {\n name: string;\n access: 'variable' | 'constant';\n type: ClarityAbiType;\n}\n\nexport interface ClarityAbiMap {\n name: string;\n key: ClarityAbiType;\n value: ClarityAbiType;\n}\n\nexport interface ClarityAbiFungibleToken {\n name: string;\n}\n\nexport interface ClarityAbiNonFungibleToken {\n name: string;\n type: ClarityAbiType;\n}\n\nexport type ClarityEpoch =\n | 'Epoch10'\n | 'Epoch20'\n | 'Epoch2_05'\n | 'Epoch21'\n | 'Epoch22'\n | 'Epoch23'\n | 'Epoch24'\n | 'Epoch25'\n | 'Epoch30'\n | 'Epoch31'\n | 'Epoch32'\n | 'Epoch33'\n | 'Epoch34'\n | 'Epoch35'\n | 'Epoch40';\n\n/**\n * Wire-format Clarity version name as emitted by the stxer AST parser\n * (`/contracts:parse-ast`). Used in {@link ClarityAbi.clarity_version}.\n *\n * **Distinct from the numeric `ClarityVersion` enum re-exported by\n * `@stacks/transactions`** (1..6), which is what the SDK builder\n * methods (`addContractDeploy`, `makeUnsignedContractDeploy`, etc.)\n * accept. To build transactions:\n *\n * import { ClarityVersion } from '@stacks/transactions';\n * // ClarityVersion.Clarity5 -> 5\n *\n * To check an AST response:\n *\n * import type { ClarityVersionName } from 'stxer';\n * if (abi.clarity_version === 'Clarity5') { ... }\n */\nexport type ClarityVersionName =\n | 'Clarity1'\n | 'Clarity2'\n | 'Clarity3'\n | 'Clarity4'\n | 'Clarity5'\n | 'Clarity6';\n\n/** @deprecated Renamed to {@link ClarityVersionName} in 0.8.0 to avoid collision with `@stacks/transactions`'s numeric `ClarityVersion` enum. Re-exported for back-compat — will be removed in a future major. */\nexport type ClarityVersion = ClarityVersionName;\n\nexport interface ClarityAbi {\n functions: ClarityAbiFunction[];\n variables: ClarityAbiVariable[];\n maps: ClarityAbiMap[];\n fungible_tokens: ClarityAbiFungibleToken[];\n non_fungible_tokens: ClarityAbiNonFungibleToken[];\n epoch: ClarityEpoch;\n clarity_version: ClarityVersionName;\n}\n\nexport interface SymbolicExpressionField {\n field: string;\n}\n\nexport interface SymbolicExpressionTraitReference {\n trait_reference: {\n clarity_name: string;\n trait_definition: string;\n trait_definition_type: 'Defined' | 'Imported';\n };\n}\n\nexport interface SymbolicExpressionAtom {\n atom: string;\n}\n\nexport interface SymbolicExpressionAtomValue {\n atom_value: string;\n}\n\nexport interface SymbolicExpressionLiteralValue {\n literal_value: string;\n}\n\nexport interface SymbolicExpressionList {\n list: SymbolicExpression[];\n}\n\nexport type SymbolicExpression = {\n id: number;\n span: string;\n expr:\n | SymbolicExpressionAtom\n | SymbolicExpressionAtomValue\n | SymbolicExpressionLiteralValue\n | SymbolicExpressionList\n | SymbolicExpressionField\n | SymbolicExpressionTraitReference;\n pre_comments?: Array<{ comment: string; span: string }>;\n post_comments?: Array<{ comment: string; span: string }>;\n end_line_comment?: string;\n};\n\nexport interface ContractAST {\n contract_identifier: string;\n expressions: SymbolicExpression[];\n top_level_expression_sorting: number[];\n referenced_traits: Record<\n string,\n { trait_definition: string; trait_definition_type: 'Defined' | 'Imported' }\n >;\n implemented_traits: string[];\n tx_id?: string;\n canonical?: boolean;\n contract_id?: string;\n block_height?: number;\n source_code?: string;\n abi?: ClarityAbi;\n}\n\n// =============================================================================\n// V2 Simulation Types\n// =============================================================================\n\nexport interface ExecutionCost {\n read_count: U64;\n read_length: U64;\n write_count: U64;\n write_length: U64;\n runtime: U64;\n}\n\n/**\n * Receipt for a transaction that the engine executed to completion.\n *\n * \"Successful execution\" does NOT imply contract-level success. Four\n * failure signals to check, in this order:\n * 1. Outer `Err` on `Result.Transaction` — engine could not run the tx\n * at all (deserialization failure etc.); no receipt is produced.\n * 2. `post_condition_aborted: true` — execution ran, post-condition\n * tripped, state was rolled back.\n * 3. `vm_error: string` (without `post_condition_aborted`) — Clarity\n * VM raised a runtime error or static analysis failed.\n * 4. `(err uX)` inside `result` — contract returned a Clarity error\n * response. Application-level; NOT signalled by any field above.\n * Decode `result` to detect.\n *\n * `post_condition_aborted` and `vm_error` are NOT independent: when a\n * PC trips the upstream sets `post_condition_aborted: true` AND writes\n * the PC abort reason into `vm_error` as a side effect. The reverse is\n * not true — `vm_error` alone (with `post_condition_aborted: false`)\n * means a VM / analysis failure that is not a PC abort.\n */\nexport interface TransactionReceipt {\n /**\n * Clarity return value, SIP-005 hex-serialized. For contract-call txs\n * this includes the `(ok ...)` / `(err ...)` response wrapper —\n * Clarity-level `(err uX)` lives here, NOT on `vm_error` or the outer\n * `Err`.\n */\n result: string;\n /**\n * STX (in micro-STX) burned by this transaction. u128 — accept as\n * `number | string` to preserve precision above 2^53.\n */\n stx_burned: U128;\n tx_index: number;\n /**\n * Error message from the upstream Clarity VM. `null` when the tx had\n * no VM-level issue. When `post_condition_aborted` is `true` this\n * field is also populated with the PC abort reason — check\n * `post_condition_aborted` first to disambiguate.\n */\n vm_error: string | null;\n /**\n * `true` when one or more post-conditions failed and the tx was\n * aborted. Implies `vm_error` is also set (to the abort reason); the\n * reverse does not hold.\n */\n post_condition_aborted: boolean;\n /** Wall-clock simulation time in milliseconds. */\n costs: number;\n execution_cost: ExecutionCost;\n /**\n * Events emitted during execution (contract logs, STX transfers,\n * FT/NFT events, etc.). Each entry is a JSON-encoded **string** —\n * call `JSON.parse(events[i])` to get the event object. Items are\n * NOT JSON objects in the array.\n *\n * For typed access, use {@link parseSimulationEvent} or cast:\n * `JSON.parse(events[i]) as SimulationEvent`.\n */\n events: string[];\n}\n\nexport interface TransactionOkResult {\n Ok: TransactionReceipt;\n}\n\nexport interface TransactionErrResult {\n Err: string;\n}\n\n// =============================================================================\n// Simulation Events\n// =============================================================================\n// Wire format for entries inside `TransactionReceipt.events[]` (each entry\n// there is a JSON-encoded string carrying one of these payloads).\n//\n// Source of truth: `clarity/src/vm/events.rs` in\n// https://github.com/stacks-network/stacks-core —\n// `StacksTransactionEvent::json_serialize`. These types intentionally\n// differ from `@stacks/stacks-blockchain-api-types.TransactionEvent`,\n// which describes Hiro API responses with a different envelope.\n//\n// Numeric fields that the rust source emits via `format!(\"{}\", u128)` /\n// `format!(\"{}\", u64)` are typed as `string`, not `number` — the wire\n// carries them as decimal strings to preserve full precision.\n\n/** Common envelope present on every event variant. */\ninterface SimulationEventBase {\n /** Hex txid with leading `0x`. */\n txid: string;\n event_index: number;\n /**\n * `true` when the event was emitted from successfully committed code.\n * `false` when the tx was rolled back (post-condition abort, vm_error).\n * Tracks rust `tx_receipt.vm_error.is_none() && !post_condition_aborted`.\n */\n committed: boolean;\n}\n\n/** Payload for `print` events and other contract-emitted events. */\nexport interface SmartContractEventData {\n /** `<address>.<contract_name>` of the contract that emitted the event. */\n contract_identifier: string;\n /** Topic key — `\"print\"` for `(print …)` calls. */\n topic: string;\n /**\n * Structured Clarity Value JSON (the rust `Value` enum's serde output).\n * The shape is complex and varies by Clarity type; prefer `raw_value`\n * for typed decoding.\n */\n value: unknown;\n /**\n * SIP-005 hex of the value, with leading `0x`. Pass to\n * `deserializeCV()` from `@stacks/transactions` for typed decoding.\n */\n raw_value: string;\n}\n\nexport interface StxTransferEventData {\n sender: string;\n recipient: string;\n /** uSTX amount as a decimal string (rust serializes u128 via Display). */\n amount: string;\n /** Hex memo, possibly empty. */\n memo: string;\n}\n\nexport interface StxMintEventData {\n recipient: string;\n amount: string;\n}\n\nexport interface StxBurnEventData {\n sender: string;\n amount: string;\n}\n\nexport interface StxLockEventData {\n locked_amount: string;\n /** Decimal string (rust serializes u64 via Display). */\n unlock_height: string;\n locked_address: string;\n contract_identifier: string;\n}\n\nexport interface NftTransferEventData {\n /** `<contract_id>::<asset_name>`. */\n asset_identifier: string;\n sender: string;\n recipient: string;\n value: unknown;\n raw_value: string;\n}\n\nexport interface NftMintEventData {\n asset_identifier: string;\n recipient: string;\n value: unknown;\n raw_value: string;\n}\n\nexport interface NftBurnEventData {\n asset_identifier: string;\n sender: string;\n value: unknown;\n raw_value: string;\n}\n\nexport interface FtTransferEventData {\n asset_identifier: string;\n sender: string;\n recipient: string;\n amount: string;\n}\n\nexport interface FtMintEventData {\n asset_identifier: string;\n recipient: string;\n amount: string;\n}\n\nexport interface FtBurnEventData {\n asset_identifier: string;\n sender: string;\n amount: string;\n}\n\n/**\n * Discriminated union of every event variant the simulator emits.\n * The `type` discriminator names the per-variant payload key — e.g.\n * `type: 'contract_event'` carries the payload at `event.contract_event`.\n *\n * ```ts\n * const event = parseSimulationEvent(receipt.events[0]);\n * if (event.type === 'contract_event') {\n * // event.contract_event.{contract_identifier, topic, raw_value, value}\n * }\n * ```\n */\nexport type SimulationEvent =\n | (SimulationEventBase & {\n type: 'contract_event';\n contract_event: SmartContractEventData;\n })\n | (SimulationEventBase & {\n type: 'stx_transfer_event';\n stx_transfer_event: StxTransferEventData;\n })\n | (SimulationEventBase & {\n type: 'stx_mint_event';\n stx_mint_event: StxMintEventData;\n })\n | (SimulationEventBase & {\n type: 'stx_burn_event';\n stx_burn_event: StxBurnEventData;\n })\n | (SimulationEventBase & {\n type: 'stx_lock_event';\n stx_lock_event: StxLockEventData;\n })\n | (SimulationEventBase & {\n type: 'nft_transfer_event';\n nft_transfer_event: NftTransferEventData;\n })\n | (SimulationEventBase & {\n type: 'nft_mint_event';\n nft_mint_event: NftMintEventData;\n })\n | (SimulationEventBase & {\n type: 'nft_burn_event';\n nft_burn_event: NftBurnEventData;\n })\n | (SimulationEventBase & {\n type: 'ft_transfer_event';\n ft_transfer_event: FtTransferEventData;\n })\n | (SimulationEventBase & {\n type: 'ft_mint_event';\n ft_mint_event: FtMintEventData;\n })\n | (SimulationEventBase & {\n type: 'ft_burn_event';\n ft_burn_event: FtBurnEventData;\n });\n\n/** Convenience parser for `TransactionReceipt.events[i]`. */\nexport function parseSimulationEvent(raw: string): SimulationEvent {\n return JSON.parse(raw) as SimulationEvent;\n}\n\n// Read step types\nexport interface MapEntryStep {\n MapEntry: [contract_id: string, map_name: string, key_hex: string];\n}\n\nexport interface DataVarStep {\n DataVar: [contract_id: string, variable_name: string];\n}\n\n/**\n * Evaluate an arbitrary read-only Clarity expression in the context of\n * `sender` (and optional `sponsor`). The Clarity analyzer rejects any\n * expression that would mutate state, so this is a pure projection.\n *\n * Use when a plain `DataVar` / `MapEntry` read isn't enough — read-only\n * `contract-call?` projections, custom expressions, or anything that\n * needs a specific sender principal in scope. Cheaper than `Eval` (no\n * write access, no step slot) and the only sender-context read shape.\n *\n * Choosing between read variants:\n * - `DataVar` / `MapEntry` — direct storage reads, no Clarity\n * evaluation; cheapest.\n * - `EvalReadonly` — arbitrary read-only Clarity in sender/sponsor\n * context; analyzer-enforced no writes.\n * - `Eval` (top-level step variant on {@link SimulationStepInput},\n * NOT a Reads sub-type) — arbitrary Clarity with **write access**.\n * Use only when you need to mutate state.\n * - `Transaction` — real Stacks tx with receipt, events,\n * post-conditions, fee, nonce.\n *\n * @example\n * { EvalReadonly: ['SP...sender', '', 'SP...contract', '(get-counter)'] }\n * { EvalReadonly: ['SP...sender', '', 'SP...oracle', \"(contract-call? .oracle get-value 'STX-USD)\"] }\n */\nexport interface EvalReadonlyStep {\n /** `sponsor` is `\"\"` (empty string) when there is no sponsor. */\n EvalReadonly: [\n sender: string,\n sponsor: string,\n contract_id: string,\n code: string,\n ];\n}\n\nexport interface StxBalanceStep {\n /** Principal whose STX balance to read. */\n StxBalance: string;\n}\n\nexport interface FtBalanceStep {\n /**\n * Reads the FT balance via three separate parameters. Note: the batch\n * `ft_balance` field on `SimulationBatchReadsRequest` uses a different\n * `<contract_id>::<token_name>` combined identifier shape.\n */\n FtBalance: [contract_id: string, token_name: string, principal: string];\n}\n\nexport interface FtSupplyStep {\n FtSupply: [contract_id: string, token_name: string];\n}\n\nexport interface NonceStep {\n /** Principal whose nonce to read. */\n Nonce: string;\n}\n\nexport type ReadStep =\n | MapEntryStep\n | DataVarStep\n | EvalReadonlyStep\n | StxBalanceStep\n | FtBalanceStep\n | FtSupplyStep\n | NonceStep;\n\nexport interface ReadOkResult {\n Ok: string; // clarity value hex OR number string for balances/nonces\n}\n\nexport interface ReadErrResult {\n Err: string;\n}\n\nexport type ReadResult = ReadOkResult | ReadErrResult;\n\n/**\n * Tenure-extend cause. `Extended` resets all cost dimensions; the\n * SIP-034 variants reset a single dimension only.\n */\nexport type TenureExtendCause =\n | 'Extended'\n | 'ExtendedRuntime'\n | 'ExtendedReadCount'\n | 'ExtendedReadLength'\n | 'ExtendedWriteCount'\n | 'ExtendedWriteLength';\n\n/** PoX address used inside `AdvanceBlocksRequest.pox_addrs`. */\nexport interface PoxAddrInput {\n /** Address version byte (0..255). */\n version: number;\n /** Address hashbytes as hex (no `0x` prefix). */\n hashbytes: string;\n}\n\n/**\n * Request payload for the `AdvanceBlocks` step variant. Synthesizes\n * bitcoin and stacks blocks on top of the simulation's pinned parent\n * tip. Hex strings for 32-byte hashes / VRF seeds; PoX address\n * overrides use the tuple form `[addrs, payout_ustx]` on the wire.\n */\nexport interface AdvanceBlocksRequest {\n bitcoin_blocks: number;\n stacks_blocks_per_bitcoin: number;\n /** Defaults to 600 (mainnet target) upstream when omitted. */\n bitcoin_interval_secs?: U64;\n /**\n * Per-burn-index burn-header-hash overrides, keyed by 0-based burn\n * index within this batch. Hex strings (32 bytes, with or without\n * `0x` prefix).\n */\n burn_header_hashes?: Record<string, string>;\n /**\n * Per-burn-index PoX address overrides as `[addrs, payout_ustx]`.\n * `payout_ustx` is `u128` upstream — see {@link U128}.\n */\n pox_addrs?: Record<string, [PoxAddrInput[], U128]>;\n /** Per-burn-index VRF-seed overrides as 32-byte hex strings. */\n vrf_seeds?: Record<string, string>;\n}\n\n/**\n * One synthesized block produced by an `AdvanceBlocks` step. Returned\n * inside `SimulationStepResult.AdvanceBlocks.Ok` and as the `tip`\n * fields when synthetic.\n */\nexport interface AdvancedBlockSummary {\n stacks_height: U64;\n burn_height: number;\n coinbase_height: number;\n index_block_hash: string;\n burn_header_hash: string;\n vrf_seed: string;\n block_time: U64;\n burn_block_time: U64;\n /**\n * `true` when this synthetic block is the first stacks block in a\n * new tenure (i.e. follows a synthesized bitcoin block).\n */\n tenure_change: boolean;\n}\n\n/**\n * Response shape for `GET /devtools/v2/simulations/{id}/tip`. When\n * `synthetic` is `false`, fields mirror the parent metadata pinned at\n * session start; `vrf_seed` and `tenure_change` are omitted in that\n * case.\n */\nexport interface SimulationTipResponse {\n synthetic: boolean;\n stacks_height: U64;\n burn_height: number;\n coinbase_height: number;\n block_time: U64;\n burn_block_time: U64;\n index_block_hash: string;\n consensus_hash: string;\n burn_header_hash: string;\n sortition_id: string;\n epoch: string;\n /** Only present when `synthetic` is `true`. */\n vrf_seed?: string;\n /** Only present when `synthetic` is `true`. */\n tenure_change?: boolean;\n}\n\n/**\n * Per-step result returned by `POST /devtools/v2/simulations/{id}` (the\n * \"submit steps\" endpoint). Externally tagged — exactly one variant key\n * is present per object.\n *\n * Distinct from `SimulationStepSummary`, which is what\n * `GET /devtools/v2/simulations/{id}` returns and includes the original\n * step input alongside the result.\n */\nexport type SimulationStepResult =\n | { Transaction: TransactionOkResult | TransactionErrResult }\n | { Eval: { Ok: string } | { Err: string } }\n | { SetContractCode: { Ok: null } | { Err: string } }\n | { Reads: ReadResult[] }\n | { TenureExtend: ExecutionCost }\n | {\n AdvanceBlocks: { Ok: AdvancedBlockSummary[] } | { Err: string };\n };\n\n// Simulation step types (summary format from GET /devtools/v2/simulations/{id})\nexport interface TransactionStepSummary {\n /** Transaction serialized to hex. */\n Transaction: string;\n /** Hex-encoded txid. Empty string `\"\"` when the tx failed engine-level. */\n TxId: string;\n Result: {\n Transaction: TransactionOkResult | TransactionErrResult;\n };\n ExecutionCost: ExecutionCost;\n}\n\nexport interface ReadsStepSummary {\n Reads: ReadStep[];\n Result: {\n Reads: ReadResult[];\n };\n}\n\nexport interface SetContractCodeStepSummary {\n SetContractCode: [contract_id: string, code: string, clarity_version: number];\n Result: {\n SetContractCode: { Ok: null } | { Err: string };\n };\n}\n\nexport interface EvalStepSummary {\n /** `sponsor` is `\"\"` (empty string) when there is no sponsor. */\n Eval: [sender: string, sponsor: string, contract_id: string, code: string];\n Result: {\n Eval: { Ok: string } | { Err: string };\n };\n}\n\n/**\n * Echoed `AdvanceBlocks` input as serialized in the summary response.\n * Differs from the request shape ({@link AdvanceBlocksRequest}) in two\n * places: `bitcoin_interval_secs` is nullable (serde `Option`); each\n * `pox_addrs` value is the `{addrs, payout}` object form (vs. the\n * request's tuple form).\n */\nexport interface AdvanceBlocksStepEcho {\n bitcoin_blocks: number;\n stacks_blocks_per_bitcoin: number;\n bitcoin_interval_secs: U64 | null;\n burn_header_hashes: Record<string, string>;\n pox_addrs: Record<string, { addrs: PoxAddrInput[]; payout: U128 }>;\n vrf_seeds: Record<string, string>;\n}\n\nexport interface TenureExtendStepSummary {\n /**\n * Echoed input shape. The server normalizes legacy `{TenureExtend: []}`\n * inputs to `{cause: 'Extended'}` at parse time, so the summary always\n * carries the modern form regardless of how the step was submitted.\n */\n TenureExtend: { cause: TenureExtendCause };\n Result: {\n TenureExtend: ExecutionCost;\n };\n}\n\nexport interface AdvanceBlocksStepSummary {\n AdvanceBlocks: AdvanceBlocksStepEcho;\n Result: {\n AdvanceBlocks: { Ok: AdvancedBlockSummary[] } | { Err: string };\n };\n}\n\nexport type SimulationStepSummary =\n | TransactionStepSummary\n | ReadsStepSummary\n | SetContractCodeStepSummary\n | EvalStepSummary\n | TenureExtendStepSummary\n | AdvanceBlocksStepSummary;\n\n// Simulation metadata\nexport interface SimulationMetadata {\n block_height: U64;\n block_hash: string;\n burn_block_height: number;\n burn_block_hash: string;\n consensus_hash: string;\n epoch: string;\n index_block_hash: string;\n skip_tracing: boolean;\n sortition_id: string;\n}\n\n// Full simulation result\nexport interface SimulationResult {\n metadata: SimulationMetadata;\n steps: SimulationStepSummary[];\n}\n\n// Create session request\nexport interface CreateSimulationRequest {\n block_height?: U64;\n block_hash?: string;\n skip_tracing?: boolean;\n}\n\nexport interface CreateSimulationResponse {\n id: string;\n}\n\n/**\n * One step submitted to `POST /devtools/v2/simulations/{id}`. Tagged\n * union — exactly one variant key per object.\n *\n * **Picking the right Clarity-execution shape** — `Transaction` /\n * `Eval` / `Reads` differ on side-effects, cost, and what they emit:\n *\n * - `Transaction` — full Stacks tx mechanics. Generates a\n * `TransactionReceipt` (events, vm_error, post_condition_aborted,\n * execution_cost), consumes nonce, charges fee, enforces\n * post-conditions. The only variant that emits a receipt. Use when\n * simulating a real user action.\n * - `Eval` — arbitrary Clarity with **write access** to contract\n * storage; no fee, no nonce, no post-conditions, no receipt — just\n * the resulting Clarity value or err. Use to stub state mid-session\n * (`var-set`, `map-set`, …) or run code with side-effects without\n * tx ceremony.\n * - `Reads` (batch of {@link ReadStep}, including `EvalReadonly`) —\n * pure projection, no state changes, cheapest. Use when you only\n * need to read derived data; `EvalReadonly` provides the\n * sender/sponsor context that `DataVar` / `MapEntry` cannot.\n *\n * `SetContractCode` replaces a contract's code (write side-effects, no\n * fee/nonce/receipt — like `Eval` but at the contract level).\n * `TenureExtend` resets cost dimensions. `AdvanceBlocks` synthesizes\n * burn/stacks blocks (see {@link AdvanceBlocksRequest}).\n *\n * `TenureExtend` accepts both legacy `[]` (treated server-side as\n * `cause: 'Extended'`) and modern `{ cause }` shapes. SDK 0.8.0 emits\n * the modern form via {@link SimulationBuilder.addTenureExtend}; the\n * legacy shape stays in this union so consumers passing literal step\n * objects (not via the builder) still type-check.\n */\nexport type SimulationStepInput =\n | { Transaction: string }\n | {\n /** `sponsor` is `\"\"` when there is no sponsor. */\n Eval: [\n sender: string,\n sponsor: string,\n contract_id: string,\n code: string,\n ];\n }\n | {\n SetContractCode: [\n contract_id: string,\n code: string,\n clarity_version: number,\n ];\n }\n | { Reads: ReadStep[] }\n | { TenureExtend: [] | { cause: TenureExtendCause } }\n | { AdvanceBlocks: AdvanceBlocksRequest };\n\nexport interface SubmitSimulationStepsRequest {\n steps: SimulationStepInput[];\n}\n\nexport interface SubmitSimulationStepsResponse {\n steps: SimulationStepResult[];\n}\n\n// Batch reads from simulation\nexport interface SimulationBatchReadsRequest {\n /** `[contract_id, variable_name]` per entry. */\n vars?: [contract_id: string, variable_name: string][];\n /** `[contract_id, map_name, key_hex]` per entry. */\n maps?: [contract_id: string, map_name: string, key_hex: string][];\n /**\n * `[contract_id, function_name, ...arg_hex]` per entry. The first two\n * positions are fixed; remaining elements are hex-encoded Clarity\n * values, one per function argument (so the length matches the\n * function's arity, not arbitrary).\n */\n readonly?: [\n contract_id: string,\n function_name: string,\n ...args_hex: string[],\n ][];\n /**\n * `[sender, sponsor, contract_id, function_name, ...arg_hex]` per\n * entry. The first four positions are fixed (`sponsor` is `\"\"` when\n * there is no sponsor); remaining elements are hex-encoded Clarity\n * values, one per function argument.\n */\n readonly_with_sender?: [\n sender: string,\n sponsor: string,\n contract_id: string,\n function_name: string,\n ...args_hex: string[],\n ][];\n /** Principals to read STX balances for. */\n stx?: string[];\n /** Principals to read nonces for. */\n nonces?: string[];\n /** `[<contract_id>::<token_name>, principal]` per entry. */\n ft_balance?: [token_identifier: string, principal: string][];\n /**\n * Flat array of FT identifiers in `<contract_id>::<token_name>` form,\n * one entry per token to look up. Any length.\n */\n ft_supply?: string[];\n}\n\n/**\n * Each category is omitted from the JSON response when the corresponding\n * request field was empty/absent (rust uses\n * `serde(skip_serializing_if = \"Vec::is_empty\")` per field).\n */\nexport interface SimulationBatchReadsResponse {\n vars?: ReadResult[];\n maps?: ReadResult[];\n readonly?: ReadResult[];\n readonly_with_sender?: ReadResult[];\n stx?: ReadResult[];\n nonces?: ReadResult[];\n ft_balance?: ReadResult[];\n ft_supply?: ReadResult[];\n}\n\n// Instant simulation\nexport interface InstantSimulationRequest {\n /** Transaction serialized to hex. */\n transaction: string;\n block_height?: U64;\n block_hash?: string;\n reads?: ReadStep[];\n}\n\nexport interface InstantSimulationResponse {\n /** Always present (may be `[]`). Aligned positionally with the request `reads`. */\n reads: ReadResult[];\n receipt: TransactionReceipt;\n}\n"],"names":["STXER_API_MAINNET","STXER_API_TESTNET","DEFAULT_STXER_API","_getContractAST","_asyncToGenerator","_regenerator","m","_callee","options","_options$stxerApi","url","response","text","w","_context","n","stxerApi","contractId","fetch","method","headers","Accept","v","ok","Error","status","statusText","startsWith","a","JSON","parse","apply","this","arguments","_parseContract","_callee2","_options$stxerApi2","payload","_context2","contract_id","source_code","sourceCode","undefined","clarityVersion","clarity_version","epoch","body","stringify","convertResults","rs","_step","results","_iterator","_createForOfIteratorHelperLoose","done","value","push","deserializeCV","Ok","Err","batchRead","_x","_x2","_batchRead","reads","ibh","index_block_hash","substring","vars","maps","readonly","tip","variables","_iterator2","_step2","serializeCV","variable","contract","variableName","_iterator3","_step3","map","mapName","mapKey","_iterator4","_step4","ro","functionName","concat","functionArgs","data","includes","sha256","nobleSha256","sha256d","bytesToHex","b","Array","from","x","toString","padStart","join","reverseBytes","out","Uint8Array","length","i","concatBytes","set","defaultProcessor","BatchProcessor","_options$stxerAPIEndp","queues","Map","timeoutIds","stxerAPIEndpoint","batchDelayMs","_proto","prototype","getQueueKey","read","request","_this","Promise","resolve","reject","enqueue","_this$queues$get","_this2","queueKey","queue","get","has","timeoutId","setTimeout","processBatch","_processBatch","_this$queues$get2","currentQueue","readonlyRequests","mapRequests","variableRequests","batchRequest","_step$value","index","result","_step2$value","_index","_result","_step3$value","_index2","_result2","_t","p","clearTimeout","filter","q","mode","_ref","contractPrincipalCV","contractAddress","contractName","_ref2","_ref3","entries","_callReadonly","params","_params$batchProcesso","processor","_params$contract$spli","deployer","fn","functionDef","argsKV","args","argDef","batchProcessor","split","String","abi","find","def","name","encodeAbi","type","indexBlockHash","decoded","decodeAbi","outputs","error","_readMap","_params$batchProcesso2","_params$contract$spli2","mapDef","key","ClarityType","OptionalNone","OptionalSome","_readVariable","_callee3","_params$batchProcesso3","_params$contract$spli3","varDef","_context3","SimulationError","_Error","operation","marker","detectMarker","call","_wrapNativeSuper","throwSimulationError","_throwSimulationError","_instantSimulation","apiEndpoint","json","createSimulationSession","_x5","_x6","_createSimulationSession","apiOptions","_apiOptions$stxerApi","id","submitSimulationSteps","_x7","_x8","_x9","_submitSimulationSteps","_callee4","sessionId","_context4","_getSimulationResult","_callee5","_options$stxerApi3","_context5","_getSimulationTip","_callee6","_options$stxerApi4","_context6","simulationBatchReads","_x12","_x13","_x14","_simulationBatchReads","_callee7","_options$stxerApi5","_context7","setSender","tx","sender","_c32addressDecode","c32addressDecode","addressVersion","signer","AddressVersion","MainnetSingleSig","TestnetSingleSig","auth","spendingCondition","hashMode","AddressHashMode","P2PKH","MainnetMultiSig","TestnetMultiSig","sc","P2SH","fields","signaturesRequired","nonce","fee","buildUnsignedContractCallHex","_buildUnsignedContractCallHex","_args$fee","_args$network","_args$postConditionMo","_args$contract$split","makeUnsignedContractCall","publicKey","repeat","network","postConditionMode","PostConditionMode","Allow","serializeTransaction","SimulationBuilder","_options$network","_options$apiEndpoint","_options$stacksNodeAP","_options$skipTracing","stacksNodeAPI","skipTracing","block","Number","NaN","steps","isTestnet","useBlockHeight","withSender","address","inlineSimulation","simulationId","addSTXTransfer","_params$sender","_params$fee","_extends","addContractCall","_params$sender2","_params$fee2","addContractDeploy","_params$deployer","_params$fee3","_params$clarity_versi","ClarityVersion","Clarity5","addEvalCode","inside_contract_id","code","addMapRead","addVarRead","addSetContractCode","_params$clarity_versi2","addReads","addTenureExtend","cause","addAdvanceBlocks","getBlockInfo","_getBlockInfo","info","isNaN","getNodeInfo","stacksEndpoint","stacks_tip_height","richFetch","then","r","height","hash","block_height","block_hash","run","_run","v2Steps","nonce_by_address","nextNonce","step","_step$function_args","_nonce","_tx","_nonce2","_tx2","_step$contract_id$spl","console","log","account","STACKS_MAINNET","STACKS_TESTNET","client","baseUrl","function_name","function_args","Transaction","serializeBytes","makeUnsignedSTXTokenTransfer","recipient","amount","makeUnsignedContractDeploy","contract_name","codeBody","Eval","SetContractCode","clarityVersionToNumber","Reads","TenureExtend","AdvanceBlocks","skip_tracing","pipe","transform","version","Clarity1","Clarity2","Clarity3","Clarity4","_callContract","_args$nonce","txHex","receipt","_t2","getNonce","slice","cvToString","resultHex","vmError","vm_error","pcAborted","post_condition_aborted","_getFtBalance","principal","_r$readonly","Cl","ResponseErr","ResponseOk","UInt","BigInt","_getStxBalance","_r$stx","stx","_x10","_x11","_getNonce","_r$nonces","nonces","_readDataVar","_callee8","varName","_r$vars","_context8","_getTip","h","_h$version","_h$prevHash","_h$timestamp","_h$bits","_h$nonce","view","DataView","buffer","setUint32","prevHash","merkleRoot","timestamp","Math","floor","Date","now","bits","rawHash","header","_x3","_x4","callReadonly","opts","_opts$version","_opts$locktime","chunks","u32le","u64le","varint","setUint16","inputs","_i$sequence","prevTxid","prevVout","scriptSig","sequence","o","scriptPubKey","locktime","total","reduce","s","c","bytes","off","_i","_chunks","txid","txidDisplay","_contractId$split","addr","contractPrincipal","getContractAST","getFtBalance","_x0","_x1","getTip","t","toLowerCase","replace","parseInt","txids","level","proof","next","j","root","pubKeyHash20","parseContract","raw","readDataVar","_x15","_x16","readMap","readVariable","sibling","bytesEqual"],"mappings":"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"}