@arkade-os/sdk 0.4.33 → 0.4.34

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.
Files changed (78) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/expo.cjs +5 -5
  3. package/dist/adapters/expo.d.cts +2 -2
  4. package/dist/adapters/expo.d.ts +2 -2
  5. package/dist/adapters/expo.js +3 -3
  6. package/dist/adapters/indexedDB.cjs +5 -5
  7. package/dist/adapters/indexedDB.js +4 -4
  8. package/dist/{ark-DEsDMYGv.d.cts → ark-Dsv5Jq4E.d.cts} +65 -7
  9. package/dist/{ark-DEsDMYGv.d.ts → ark-Dsv5Jq4E.d.ts} +65 -7
  10. package/dist/{asyncStorageTaskQueue-CMrTYlKG.d.ts → asyncStorageTaskQueue-BH-zuth5.d.ts} +1 -1
  11. package/dist/{asyncStorageTaskQueue-D8T1VXEx.d.cts → asyncStorageTaskQueue-D92ch8yI.d.cts} +1 -1
  12. package/dist/{chunk-L6ZETTX3.js → chunk-5WDBHWX3.js} +4 -4
  13. package/dist/{chunk-L6ZETTX3.js.map → chunk-5WDBHWX3.js.map} +1 -1
  14. package/dist/{chunk-5CCRRL5S.cjs → chunk-CCLNFHJ5.cjs} +11 -11
  15. package/dist/{chunk-5CCRRL5S.cjs.map → chunk-CCLNFHJ5.cjs.map} +1 -1
  16. package/dist/{chunk-WMIPYZSB.cjs → chunk-CMPJR3HS.cjs} +42 -9
  17. package/dist/chunk-CMPJR3HS.cjs.map +1 -0
  18. package/dist/{chunk-AOJUURHM.js → chunk-CUSABEUQ.js} +141 -37
  19. package/dist/chunk-CUSABEUQ.js.map +1 -0
  20. package/dist/{chunk-SPDNHPM4.cjs → chunk-FSAXPBGP.cjs} +8 -8
  21. package/dist/{chunk-SPDNHPM4.cjs.map → chunk-FSAXPBGP.cjs.map} +1 -1
  22. package/dist/{chunk-E22HEKLN.js → chunk-FXFBPXV3.js} +3 -3
  23. package/dist/{chunk-E22HEKLN.js.map → chunk-FXFBPXV3.js.map} +1 -1
  24. package/dist/{chunk-GYSK5R57.cjs → chunk-GUTKJMSF.cjs} +164 -59
  25. package/dist/chunk-GUTKJMSF.cjs.map +1 -0
  26. package/dist/{chunk-DSS2GQUG.js → chunk-HFXEUW55.js} +575 -155
  27. package/dist/chunk-HFXEUW55.js.map +1 -0
  28. package/dist/{chunk-TU3LVAPX.js → chunk-OUVTG72A.js} +43 -11
  29. package/dist/chunk-OUVTG72A.js.map +1 -0
  30. package/dist/{chunk-BU3BU6XK.js → chunk-VVGD3JIP.js} +3 -3
  31. package/dist/{chunk-BU3BU6XK.js.map → chunk-VVGD3JIP.js.map} +1 -1
  32. package/dist/{chunk-7K3ROJF6.cjs → chunk-XCHBQVMK.cjs} +718 -298
  33. package/dist/chunk-XCHBQVMK.cjs.map +1 -0
  34. package/dist/{chunk-HAVA4XB7.cjs → chunk-ZS3OZHC7.cjs} +7 -7
  35. package/dist/{chunk-HAVA4XB7.cjs.map → chunk-ZS3OZHC7.cjs.map} +1 -1
  36. package/dist/contracts/handlers/index.cjs +7 -7
  37. package/dist/contracts/handlers/index.d.cts +3 -3
  38. package/dist/contracts/handlers/index.d.ts +3 -3
  39. package/dist/contracts/handlers/index.js +2 -2
  40. package/dist/{delegate-BJeBNP5a.d.cts → delegate-BaS5SCIW.d.cts} +1 -1
  41. package/dist/{delegate-EXN2mfkb.d.ts → delegate-Baz_hb83.d.ts} +1 -1
  42. package/dist/{index-BG2ooYKO.d.ts → index-FwXZveaX.d.ts} +22 -16
  43. package/dist/{index-DHjEeHEp.d.cts → index-lNZ6qaO3.d.cts} +22 -16
  44. package/dist/index.cjs +134 -130
  45. package/dist/index.d.cts +63 -14
  46. package/dist/index.d.ts +63 -14
  47. package/dist/index.js +4 -4
  48. package/dist/repositories/realm/index.cjs +13 -13
  49. package/dist/repositories/realm/index.d.cts +1 -1
  50. package/dist/repositories/realm/index.d.ts +1 -1
  51. package/dist/repositories/realm/index.js +4 -4
  52. package/dist/repositories/sqlite/index.cjs +13 -13
  53. package/dist/repositories/sqlite/index.d.cts +1 -1
  54. package/dist/repositories/sqlite/index.d.ts +1 -1
  55. package/dist/repositories/sqlite/index.js +4 -4
  56. package/dist/{taskRunner-B7lBU45X.d.ts → taskRunner-B1NUWyWR.d.ts} +1 -1
  57. package/dist/{taskRunner-pIGyarFG.d.cts → taskRunner-vFRA3F9b.d.cts} +1 -1
  58. package/dist/wallet/expo/background.cjs +14 -14
  59. package/dist/wallet/expo/background.d.cts +3 -3
  60. package/dist/wallet/expo/background.d.ts +3 -3
  61. package/dist/wallet/expo/background.js +6 -6
  62. package/dist/wallet/expo/index.cjs +13 -13
  63. package/dist/wallet/expo/index.d.cts +5 -5
  64. package/dist/wallet/expo/index.d.ts +5 -5
  65. package/dist/wallet/expo/index.js +5 -5
  66. package/dist/{wallet-C4L_X0i6.d.ts → wallet-By9HIo0Q.d.cts} +160 -5
  67. package/dist/{wallet-D4Dll5Gu.d.cts → wallet-D6uoBLmS.d.ts} +160 -5
  68. package/dist/worker/expo/index.cjs +9 -9
  69. package/dist/worker/expo/index.d.cts +4 -4
  70. package/dist/worker/expo/index.d.ts +4 -4
  71. package/dist/worker/expo/index.js +5 -5
  72. package/package.json +4 -4
  73. package/dist/chunk-7K3ROJF6.cjs.map +0 -1
  74. package/dist/chunk-AOJUURHM.js.map +0 -1
  75. package/dist/chunk-DSS2GQUG.js.map +0 -1
  76. package/dist/chunk-GYSK5R57.cjs.map +0 -1
  77. package/dist/chunk-TU3LVAPX.js.map +0 -1
  78. package/dist/chunk-WMIPYZSB.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/contracts/handlers/registry.ts","../src/script/default.ts","../src/identity/descriptor.ts","../src/contracts/handlers/helpers.ts","../src/contracts/metadata.ts","../src/contracts/handlers/default.ts","../src/script/delegate.ts","../src/contracts/handlers/delegate.ts","../src/script/vhtlc.ts","../src/contracts/handlers/vhtlc.ts","../src/contracts/handlers/boarding.ts","../src/contracts/handlers/index.ts"],"names":["DefaultVtxo","Script","VtxoScript","MultisigTapscript","CSVMultisigTapscript","hex","expand","networks","sequenceToTimelock","timelockToSequence","DelegateVtxo","VHTLC","ConditionMultisigTapscript","CLTVMultisigTapscript","ConditionCSVMultisigTapscript"],"mappings":"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","file":"chunk-GYSK5R57.cjs","sourcesContent":["import { ContractHandler } from \"../types\";\n\n/**\n * Registry for contract handlers.\n *\n * Each contract type (\"default\", \"vhtlc\", etc.) has a handler that knows\n * how to create VtxoScripts, serialize params, and select spending paths.\n *\n * @example\n * ```typescript\n * // Register a custom handler\n * contractHandlers.register(myCustomHandler);\n *\n * // Get handler for a type\n * const handler = contractHandlers.get(\"vhtlc\");\n * const script = handler.createScript(contract.params);\n * ```\n */\nclass ContractHandlerRegistry {\n private handlers = new Map<string, ContractHandler<unknown>>();\n\n /**\n * Register a contract handler.\n *\n * @param handler - The handler to register\n * @throws If a handler for this type is already registered\n */\n register(handler: ContractHandler<unknown>): void {\n if (this.handlers.has(handler.type)) {\n throw new Error(`Contract handler for type '${handler.type}' is already registered`);\n }\n this.handlers.set(handler.type, handler);\n }\n\n /**\n * Get a handler by type.\n *\n * @param type - The contract type\n * @returns The handler, or undefined if not found\n */\n get(type: string): ContractHandler<unknown> | undefined {\n return this.handlers.get(type);\n }\n\n /**\n * Get a handler by type, throwing if not found.\n *\n * @param type - The contract type\n * @returns The handler\n * @throws If no handler is registered for this type\n */\n getOrThrow(type: string): ContractHandler<unknown> {\n const handler = this.get(type);\n if (!handler) {\n throw new Error(`No contract handler registered for type '${type}'`);\n }\n return handler;\n }\n\n /**\n * Check if a handler is registered.\n *\n * @param type - The contract type\n */\n has(type: string): boolean {\n return this.handlers.has(type);\n }\n\n /**\n * Get all registered types.\n */\n getRegisteredTypes(): string[] {\n return Array.from(this.handlers.keys());\n }\n\n /**\n * Unregister a handler (mainly for testing).\n */\n unregister(type: string): boolean {\n return this.handlers.delete(type);\n }\n\n /**\n * Clear all handlers (mainly for testing).\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/**\n * Global registry of contract handlers.\n */\nexport const contractHandlers = new ContractHandlerRegistry();\n","import { Bytes } from \"@scure/btc-signer/utils.js\";\nimport { TapLeafScript, VtxoScript } from \"./base\";\nimport { CSVMultisigTapscript, MultisigTapscript, RelativeTimelock } from \"./tapscript\";\nimport { hex } from \"@scure/base\";\n\n/**\n * DefaultVtxo is the default implementation of a VtxoScript.\n * It contains 1 forfeit path and 1 exit path.\n * - forfeit = (Alice + Server)\n * - exit = (Alice) after csvTimelock\n */\nexport namespace DefaultVtxo {\n /**\n * Options is the options for the DefaultVtxo.Script class.\n * csvTimelock is the exit path timelock, default is 144 blocks (1 day).\n */\n export interface Options {\n pubKey: Bytes;\n serverPubKey: Bytes;\n csvTimelock: RelativeTimelock;\n }\n\n /**\n * DefaultVtxo.Script is the class letting to create the vtxo script.\n * @example\n * ```typescript\n * const vtxoScript = new DefaultVtxo.Script({\n * pubKey: new Uint8Array(32),\n * serverPubKey: new Uint8Array(32),\n * csvTimelock: {\n * value: 605184n,\n * type: \"seconds\"\n * }\n * });\n *\n * console.log(\"script pub key:\", vtxoScript.pkScript)\n * ```\n */\n export class Script extends VtxoScript {\n static readonly DEFAULT_TIMELOCK: RelativeTimelock = {\n value: 144n,\n type: \"blocks\",\n }; // 1 day in blocks\n\n readonly forfeitScript: string;\n readonly exitScript: string;\n\n /** Create the default virtual output script with one forfeit path and one exit path. */\n constructor(readonly options: Options) {\n const { pubKey, serverPubKey, csvTimelock } = options;\n\n const forfeitScript = MultisigTapscript.encode({\n pubkeys: [pubKey, serverPubKey],\n }).script;\n\n const exitScript = CSVMultisigTapscript.encode({\n timelock: csvTimelock,\n pubkeys: [pubKey],\n }).script;\n\n super([forfeitScript, exitScript]);\n\n this.forfeitScript = hex.encode(forfeitScript);\n this.exitScript = hex.encode(exitScript);\n }\n\n /** Return the forfeit tapleaf script. */\n forfeit(): TapLeafScript {\n return this.findLeaf(this.forfeitScript);\n }\n\n /** Return the unilateral exit tapleaf script. */\n exit(): TapLeafScript {\n return this.findLeaf(this.exitScript);\n }\n }\n}\n","import { expand, networks } from \"@bitcoinerlab/descriptors-scure\";\nimport { hex } from \"@scure/base\";\n\n/**\n * True iff `descriptor` is a Bitcoin mainnet descriptor (xpub-prefixed\n * BIP32 key).\n *\n * Note: testnet, signet, regtest, mutinynet, and other non-mainnet\n * networks all share the same `tpub` BIP32 version bytes — they cannot\n * be distinguished from one another at the descriptor level. Callers\n * that need a `Network` constants object for `expand()` pick\n * `networks.bitcoin` vs `networks.testnet` themselves; callers that\n * need the *actual* network the wallet is on must track that\n * out-of-band.\n */\nexport function isMainnetDescriptor(descriptor: string): boolean {\n return !descriptor.includes(\"tpub\");\n}\n\n/**\n * Shared \"does `candidate` belong to the identity backed by\n * `ourDescriptor`?\" predicate.\n *\n * - HD descriptors (expanding to a `bip32` key) match by account xpub\n * on both sides — index-agnostic, so a wildcard template and any\n * concrete index under it all collapse to the same xpub.\n * - Bare `tr(pubkey)` candidates fall back to comparing the candidate\n * pubkey against `ourXOnlyPubkey` (the cached pubkey on the identity\n * side, since pulling it from `ourDescriptor` would require an index\n * substitution the caller already performed).\n */\nexport function descriptorIsOurs(\n candidate: string,\n ourDescriptor: string,\n ourXOnlyPubkey: Uint8Array,\n): boolean {\n if (!isDescriptor(candidate)) return false;\n try {\n const candidateInfo = expand({\n descriptor: candidate,\n network: isMainnetDescriptor(candidate) ? networks.bitcoin : networks.testnet,\n }).expansionMap?.[\"@0\"];\n if (!candidateInfo) return false;\n\n if (candidateInfo.bip32) {\n const ourBip32 = expand({\n descriptor: ourDescriptor,\n network: isMainnetDescriptor(ourDescriptor) ? networks.bitcoin : networks.testnet,\n }).expansionMap?.[\"@0\"]?.bip32;\n if (!ourBip32) return false;\n return ourBip32.toBase58() === candidateInfo.bip32.toBase58();\n }\n if (candidateInfo.pubkey) {\n // For tr() the library hands back a 32-byte x-only key, but\n // strip a leading parity byte defensively so a 33-byte\n // compressed key (mismatched length) doesn't silently\n // false-negative against our 32-byte x-only side.\n const candidatePub =\n candidateInfo.pubkey.length === 33\n ? candidateInfo.pubkey.subarray(1)\n : candidateInfo.pubkey;\n if (candidatePub.length !== ourXOnlyPubkey.length) return false;\n return hex.encode(candidatePub) === hex.encode(ourXOnlyPubkey);\n }\n return false;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a string is a descriptor of the shape `tr(...)`.\n *\n * This is a shape check only — it does not validate the inner key material.\n * Use {@link expand} (via {@link extractPubKey} / {@link parseHDDescriptor})\n * for full parsing. The guard rejects empty bodies and missing/trailing\n * parentheses so callers can safely branch on descriptor vs. raw pubkey.\n */\nexport function isDescriptor(value: string): boolean {\n if (typeof value !== \"string\") return false;\n if (!value.startsWith(\"tr(\") || !value.endsWith(\")\")) return false;\n // body length > 0 after stripping \"tr(\" and \")\"\n return value.length > \"tr()\".length;\n}\n\n/**\n * Normalize a value to descriptor format.\n * If already a descriptor, return as-is. If hex pubkey, wrap as tr(pubkey).\n * Throws when the value is empty or not a string so we never produce\n * malformed descriptors like `tr()` that downstream parsers would reject.\n */\nexport function normalizeToDescriptor(value: string): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(\"normalizeToDescriptor: expected a non-empty string value\");\n }\n if (isDescriptor(value)) {\n return value;\n }\n return `tr(${value})`;\n}\n\n/**\n * Extract the public key from a simple descriptor.\n * For simple descriptors (tr(pubkey)), extracts the pubkey using the library.\n * For HD descriptors, throws — use DescriptorProvider to derive the key.\n */\nexport function extractPubKey(descriptor: string): string {\n if (!isDescriptor(descriptor)) {\n return descriptor;\n }\n\n const network = isMainnetDescriptor(descriptor) ? networks.bitcoin : networks.testnet;\n const expansion = expand({ descriptor, network });\n\n if (!expansion.expansionMap) {\n throw new Error(\"Cannot extract pubkey from descriptor: expansion failed.\");\n }\n\n const key = expansion.expansionMap[\"@0\"];\n\n // HD descriptors (have a bip32 key) require DescriptorProvider for derivation\n if (key?.bip32) {\n throw new Error(\n \"Cannot extract pubkey from HD descriptor without derivation. \" +\n \"Use DescriptorProvider to derive the key from the xpub.\",\n );\n }\n\n if (!key?.pubkey) {\n throw new Error(\"Cannot extract pubkey from descriptor: no key found.\");\n }\n\n return hex.encode(key.pubkey);\n}\n\n/**\n * Extract the x-only (32-byte) pubkey from a materialized descriptor.\n * Handles both static `tr(pubkey)` and materialized HD\n * `tr([fp/..]xpub/0/<i>)` shapes via the descriptors-scure expansion map.\n * Throws a plain Error when the descriptor is non-rangeable / unparseable;\n * callers that need a typed error wrap this.\n */\nexport function deriveDescriptorLeafPubKey(descriptor: string): Uint8Array {\n const network = isMainnetDescriptor(descriptor) ? networks.bitcoin : networks.testnet;\n let expansion;\n try {\n expansion = expand({ descriptor, network });\n } catch (e) {\n throw new Error(\n `Cannot derive leaf pubkey from descriptor (length=${descriptor.length}): ` +\n `ensure it is materialized (no wildcard) and parsable.`,\n { cause: e },\n );\n }\n const key = expansion.expansionMap?.[\"@0\"];\n if (!key?.pubkey) {\n throw new Error(\n `Cannot derive leaf pubkey from descriptor (length=${descriptor.length}): ` +\n `parsed but no '@0' pubkey in the expansion map.`,\n );\n }\n return key.pubkey;\n}\n\n/** Parsed HD descriptor components. */\nexport interface ParsedHDDescriptor {\n fingerprint: string;\n basePath: string;\n xpub: string;\n derivationPath: string;\n}\n\n/**\n * Parse an HD descriptor into its components.\n * HD descriptors have the format: tr([fingerprint/path']xpub/derivation)\n * Returns null if the descriptor is not in HD format.\n */\nexport function parseHDDescriptor(descriptor: string): ParsedHDDescriptor | null {\n if (!isDescriptor(descriptor)) {\n return null;\n }\n\n let expansion;\n try {\n const network = isMainnetDescriptor(descriptor) ? networks.bitcoin : networks.testnet;\n expansion = expand({ descriptor, network });\n } catch {\n return null;\n }\n\n const key = expansion.expansionMap?.[\"@0\"];\n if (!key?.masterFingerprint || !key.originPath || !key.keyPath || !key.bip32) {\n return null;\n }\n\n return {\n fingerprint: hex.encode(key.masterFingerprint),\n basePath: key.originPath.replace(/^\\//, \"\"),\n xpub: key.bip32.toBase58(),\n derivationPath: key.keyPath.replace(/^\\//, \"\"),\n };\n}\n","import { sequenceToTimelock } from \"../../utils/timelock\";\nimport { Contract, PathContext } from \"../types\";\nimport { isDescriptor, extractPubKey } from \"../../identity/descriptor\";\n\n/**\n * Extract raw hex pubkey from a value that may be a descriptor or raw hex.\n * Returns undefined for HD descriptors or unparseable values so role\n * resolution stays best-effort and never throws.\n */\nfunction extractRawPubKey(value: string): string | undefined {\n if (!isDescriptor(value)) {\n return value.toLowerCase();\n }\n try {\n return extractPubKey(value).toLowerCase();\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve wallet's role from explicit role or by matching descriptor/pubkey.\n */\nexport function resolveRole(\n contract: Contract,\n context: PathContext,\n): \"sender\" | \"receiver\" | undefined {\n // Explicit role takes precedence\n if (context.role === \"sender\" || context.role === \"receiver\") {\n return context.role;\n }\n\n const senderKey = contract.params.sender ? extractRawPubKey(contract.params.sender) : undefined;\n const receiverKey = contract.params.receiver\n ? extractRawPubKey(contract.params.receiver)\n : undefined;\n\n const matchRole = (rawWalletKey: string | undefined): \"sender\" | \"receiver\" | undefined => {\n if (!rawWalletKey) return undefined;\n if (senderKey && rawWalletKey === senderKey) {\n return \"sender\";\n }\n if (receiverKey && rawWalletKey === receiverKey) {\n return \"receiver\";\n }\n return undefined;\n };\n\n // Try the preferred descriptor first. If it cannot be resolved\n // (for example an HD descriptor without derivation support), fall back\n // to walletPubKey for backward compatibility.\n if (context.walletDescriptor) {\n const walletDescriptorKey = extractRawPubKey(context.walletDescriptor);\n const matchedRole = matchRole(walletDescriptorKey);\n if (matchedRole) {\n return matchedRole;\n }\n\n if (!walletDescriptorKey && context.walletPubKey) {\n return matchRole(extractRawPubKey(context.walletPubKey));\n }\n return undefined;\n }\n\n if (context.walletPubKey) {\n return matchRole(extractRawPubKey(context.walletPubKey));\n }\n\n return undefined;\n}\n\n/**\n * BIP65 threshold: locktime values below this are interpreted as block heights,\n * values at or above are interpreted as Unix timestamps (seconds).\n */\nconst CLTV_HEIGHT_THRESHOLD = 500_000_000n;\n\n/**\n * Check if an absolute (CLTV) locktime is currently satisfied.\n *\n * Following the BIP65 convention:\n * - locktime < 500_000_000 → interpreted as a block height; compared against `context.blockHeight`\n * - locktime >= 500_000_000 → interpreted as a Unix timestamp (seconds); compared against `context.currentTime`\n *\n * Returns false if the relevant context field is missing.\n */\nexport function isCltvSatisfied(context: PathContext, locktime: bigint): boolean {\n if (locktime < CLTV_HEIGHT_THRESHOLD) {\n if (context.blockHeight === undefined) return false;\n return BigInt(context.blockHeight) >= locktime;\n }\n const currentTimeSec = BigInt(Math.floor(context.currentTime / 1000));\n return currentTimeSec >= locktime;\n}\n\n/**\n * Check if a CSV timelock is currently satisfied for the given context/virtual output.\n */\nexport function isCsvSpendable(context: PathContext, sequence?: number): boolean {\n if (sequence === undefined) return true;\n if (!context.vtxo) return false;\n const timelock = sequenceToTimelock(sequence);\n\n if (timelock.type === \"blocks\") {\n if (context.blockHeight === undefined || context.vtxo.status.block_height === undefined) {\n return false;\n }\n return context.blockHeight - context.vtxo.status.block_height >= Number(timelock.value);\n }\n\n if (timelock.type === \"seconds\") {\n const blockTime = context.vtxo.status.block_time;\n if (blockTime === undefined) return false;\n return context.currentTime / 1000 - blockTime >= Number(timelock.value);\n }\n\n return false;\n}\n","/**\n * Sentinel stored in `contract.metadata.source` to mark a contract the\n * wallet generated for its own rotating receive address. Lives here (the\n * contracts layer) so contract handlers can tag/discover without importing\n * the wallet module. Re-exported from `wallet/walletReceiveRotator` for\n * backward compatibility of existing import paths.\n *\n * Tagging makes the boot lookup unambiguous — the rotator filters on\n * `metadata.source === WALLET_RECEIVE_SOURCE` rather than on \"any active\n * default contract\", so a contract repo that also holds default contracts\n * created for other reasons (legacy timelock variants, external\n * integrations) doesn't confuse the wallet's display state.\n */\nexport const WALLET_RECEIVE_SOURCE = \"wallet-receive\";\n","import { hex } from \"@scure/base\";\nimport { DefaultVtxo } from \"../../script/default\";\nimport { RelativeTimelock } from \"../../script/tapscript\";\nimport { Contract, ContractHandler, Discoverable, PathContext, PathSelection } from \"../types\";\nimport type { DiscoveredContract, DiscoveryDeps } from \"../types\";\nimport { isCsvSpendable } from \"./helpers\";\nimport { sequenceToTimelock, timelockToSequence } from \"../../utils/timelock\";\nimport {\n normalizeToDescriptor,\n extractPubKey,\n deriveDescriptorLeafPubKey,\n} from \"../../identity/descriptor\";\nimport { WALLET_RECEIVE_SOURCE } from \"../metadata\";\n\n/**\n * Typed parameters for DefaultVtxo contracts.\n */\nexport interface DefaultContractParams {\n pubKey: Uint8Array;\n serverPubKey: Uint8Array;\n csvTimelock: RelativeTimelock;\n}\n\n/**\n * Extract pubkey bytes from a descriptor or hex string.\n */\nfunction extractPubKeyBytes(value: string): Uint8Array {\n return hex.decode(extractPubKey(normalizeToDescriptor(value)));\n}\n\n/**\n * Handler for default wallet VTXOs.\n *\n * Default contracts use the standard forfeit + exit tapscript:\n * - forfeit: (Alice + Server) multisig for collaborative spending\n * - exit: (Alice) + CSV timelock for unilateral exit\n */\nexport const DefaultContractHandler: ContractHandler<DefaultContractParams, DefaultVtxo.Script> &\n Discoverable = {\n type: \"default\",\n\n createScript(params: Record<string, string>): DefaultVtxo.Script {\n const typed = this.deserializeParams(params);\n return new DefaultVtxo.Script(typed);\n },\n\n serializeParams(params: DefaultContractParams): Record<string, string> {\n return {\n pubKey: hex.encode(params.pubKey),\n serverPubKey: hex.encode(params.serverPubKey),\n csvTimelock: timelockToSequence(params.csvTimelock).toString(),\n };\n },\n\n deserializeParams(params: Record<string, string>): DefaultContractParams {\n // csvTimelock may be absent on legacy/minimal params (e.g. hex pubkeys\n // with no timelock). DefaultVtxo.Script no longer applies its own\n // fallback, so restore it here rather than feeding sequenceToTimelock\n // a NaN (which silently decodes to a zero timelock).\n const csvTimelock =\n params.csvTimelock !== undefined && params.csvTimelock !== \"\"\n ? sequenceToTimelock(Number(params.csvTimelock))\n : DefaultVtxo.Script.DEFAULT_TIMELOCK;\n return {\n pubKey: extractPubKeyBytes(params.pubKey),\n serverPubKey: extractPubKeyBytes(params.serverPubKey),\n csvTimelock,\n };\n },\n\n selectPath(\n script: DefaultVtxo.Script,\n contract: Contract,\n context: PathContext,\n ): PathSelection | null {\n if (context.collaborative) {\n // Use forfeit path for collaborative spending\n return { leaf: script.forfeit() };\n }\n\n // Use exit path for unilateral exit (only if CSV is satisfied)\n const sequence = contract.params.csvTimelock\n ? Number(contract.params.csvTimelock)\n : undefined;\n if (!isCsvSpendable(context, sequence)) {\n return null;\n }\n return {\n leaf: script.exit(),\n sequence,\n };\n },\n\n getAllSpendingPaths(\n script: DefaultVtxo.Script,\n contract: Contract,\n context: PathContext,\n ): PathSelection[] {\n const paths: PathSelection[] = [];\n\n // Forfeit path available with server cooperation\n if (context.collaborative) {\n paths.push({ leaf: script.forfeit() });\n }\n\n // Exit path always possible (CSV checked at tx time)\n const exitPath: PathSelection = { leaf: script.exit() };\n if (contract.params.csvTimelock) {\n exitPath.sequence = Number(contract.params.csvTimelock);\n }\n paths.push(exitPath);\n\n return paths;\n },\n\n getSpendablePaths(\n script: DefaultVtxo.Script,\n contract: Contract,\n context: PathContext,\n ): PathSelection[] {\n const paths: PathSelection[] = [];\n\n if (context.collaborative) {\n paths.push({ leaf: script.forfeit() });\n }\n\n const exitSequence = contract.params.csvTimelock\n ? Number(contract.params.csvTimelock)\n : undefined;\n\n if (isCsvSpendable(context, exitSequence)) {\n const exitPath: PathSelection = { leaf: script.exit() };\n if (exitSequence !== undefined) {\n exitPath.sequence = exitSequence;\n }\n paths.push(exitPath);\n }\n\n return paths;\n },\n\n async discoverAt(\n index: number,\n descriptor: string,\n deps: DiscoveryDeps,\n ): Promise<DiscoveredContract[]> {\n const pubKey = deriveDescriptorLeafPubKey(descriptor);\n const out: DiscoveredContract[] = [];\n for (const csvTimelock of deps.csvTimelocks) {\n const script = new DefaultVtxo.Script({\n pubKey,\n serverPubKey: deps.serverPubKey,\n csvTimelock,\n });\n const scriptHex = hex.encode(script.pkScript);\n const { vtxos } = await deps.indexerProvider.getVtxos({\n scripts: [scriptHex],\n });\n if (vtxos.length === 0) continue;\n out.push({\n type: \"default\",\n params: {\n pubKey: hex.encode(pubKey),\n serverPubKey: hex.encode(deps.serverPubKey),\n csvTimelock: timelockToSequence(csvTimelock).toString(),\n },\n script: scriptHex,\n address: script.address(deps.network.hrp, deps.serverPubKey).encode(),\n ...(index > 0\n ? {\n metadata: {\n source: WALLET_RECEIVE_SOURCE,\n signingDescriptor: descriptor,\n },\n }\n : {}),\n });\n }\n return out;\n },\n};\n","import { Bytes } from \"@scure/btc-signer/utils.js\";\nimport { DefaultVtxo } from \"./default\";\nimport { MultisigTapscript } from \"./tapscript\";\nimport { TapLeafScript, VtxoScript } from \"./base\";\nimport { hex } from \"@scure/base\";\n\n/**\n * DelegateVtxo extends DefaultVtxo with an extra delegate path\n */\nexport namespace DelegateVtxo {\n /**\n * Options extends DefaultVtxo.Options and adds a delegatePubKey\n */\n export interface Options extends DefaultVtxo.Options {\n delegatePubKey: Bytes;\n }\n\n /**\n * DelegateVtxo.Script extends DefaultVtxo.Script and adds a delegate path.\n * @example\n * ```typescript\n * const vtxoScript = new DelegateVtxo.Script({\n * pubKey: new Uint8Array(32),\n * serverPubKey: new Uint8Array(32),\n * delegatePubKey: new Uint8Array(32),\n * csvTimelock: {\n * value: 605184n,\n * type: \"seconds\"\n * }\n * });\n *\n * console.log(\"script pub key:\", vtxoScript.pkScript)\n * ```\n */\n export class Script extends VtxoScript {\n readonly defaultVtxo: DefaultVtxo.Script;\n readonly delegateScript: string;\n\n /** Create a delegated virtual output script with forfeit, exit, and delegate paths. */\n constructor(readonly options: Options) {\n const defaultVtxo = new DefaultVtxo.Script(options);\n const { delegatePubKey, pubKey, serverPubKey } = options;\n const delegateScript = MultisigTapscript.encode({\n pubkeys: [pubKey, delegatePubKey, serverPubKey],\n }).script;\n\n super([...defaultVtxo.scripts, delegateScript]);\n\n this.defaultVtxo = defaultVtxo;\n this.delegateScript = hex.encode(delegateScript);\n }\n\n /** Return the forfeit tapleaf script. */\n forfeit(): TapLeafScript {\n return this.findLeaf(this.defaultVtxo.forfeitScript);\n }\n\n /** Return the unilateral exit tapleaf script. */\n exit(): TapLeafScript {\n return this.findLeaf(this.defaultVtxo.exitScript);\n }\n\n /** Return the delegate tapleaf script. */\n delegate(): TapLeafScript {\n return this.findLeaf(this.delegateScript);\n }\n }\n}\n","import { hex } from \"@scure/base\";\nimport { DelegateVtxo } from \"../../script/delegate\";\nimport { RelativeTimelock } from \"../../script/tapscript\";\nimport { Contract, ContractHandler, Discoverable, PathContext, PathSelection } from \"../types\";\nimport type { DiscoveredContract, DiscoveryDeps } from \"../types\";\nimport { isCsvSpendable } from \"./helpers\";\nimport { sequenceToTimelock, timelockToSequence } from \"../../utils/timelock\";\nimport { deriveDescriptorLeafPubKey } from \"../../identity/descriptor\";\nimport { WALLET_RECEIVE_SOURCE } from \"../metadata\";\n\n/**\n * Typed parameters for DelegateVtxo contracts.\n */\nexport interface DelegateContractParams {\n pubKey: Uint8Array;\n serverPubKey: Uint8Array;\n delegatePubKey: Uint8Array;\n csvTimelock: RelativeTimelock;\n}\n\n/**\n * Handler for delegate wallet virtual outputs.\n *\n * Delegate contracts extend the default tapscript with an additional delegate path:\n * - forfeit: (Alice + Server) multisig for collaborative spending\n * - exit: (Alice) + CSV timelock for unilateral exit\n * - delegate: (Alice + Delegate + Server) multisig for delegated renewal\n */\nexport const DelegateContractHandler: ContractHandler<DelegateContractParams, DelegateVtxo.Script> &\n Discoverable = {\n type: \"delegate\",\n\n createScript(params: Record<string, string>): DelegateVtxo.Script {\n const typed = this.deserializeParams(params);\n return new DelegateVtxo.Script(typed);\n },\n\n serializeParams(params: DelegateContractParams): Record<string, string> {\n return {\n pubKey: hex.encode(params.pubKey),\n serverPubKey: hex.encode(params.serverPubKey),\n delegatePubKey: hex.encode(params.delegatePubKey),\n csvTimelock: timelockToSequence(params.csvTimelock).toString(),\n };\n },\n\n deserializeParams(params: Record<string, string>): DelegateContractParams {\n const csvTimelock = sequenceToTimelock(Number(params.csvTimelock));\n return {\n pubKey: hex.decode(params.pubKey),\n serverPubKey: hex.decode(params.serverPubKey),\n delegatePubKey: hex.decode(params.delegatePubKey),\n csvTimelock,\n };\n },\n\n selectPath(\n script: DelegateVtxo.Script,\n contract: Contract,\n context: PathContext,\n ): PathSelection | null {\n if (context.collaborative) {\n return { leaf: script.forfeit() };\n }\n\n const sequence = contract.params.csvTimelock\n ? Number(contract.params.csvTimelock)\n : undefined;\n if (!isCsvSpendable(context, sequence)) {\n return null;\n }\n return {\n leaf: script.exit(),\n sequence,\n };\n },\n\n getAllSpendingPaths(\n script: DelegateVtxo.Script,\n contract: Contract,\n context: PathContext,\n ): PathSelection[] {\n const paths: PathSelection[] = [];\n\n if (context.collaborative) {\n paths.push({ leaf: script.forfeit() });\n }\n\n const exitPath: PathSelection = { leaf: script.exit() };\n if (contract.params.csvTimelock) {\n exitPath.sequence = Number(contract.params.csvTimelock);\n }\n paths.push(exitPath);\n\n // Delegate path (Alice + Delegate + Server) — collaborative only\n if (context.collaborative) {\n paths.push({ leaf: script.delegate() });\n }\n\n return paths;\n },\n\n getSpendablePaths(\n script: DelegateVtxo.Script,\n contract: Contract,\n context: PathContext,\n ): PathSelection[] {\n const paths: PathSelection[] = [];\n\n if (context.collaborative) {\n paths.push({ leaf: script.forfeit() });\n }\n\n const exitSequence = contract.params.csvTimelock\n ? Number(contract.params.csvTimelock)\n : undefined;\n\n if (isCsvSpendable(context, exitSequence)) {\n const exitPath: PathSelection = { leaf: script.exit() };\n if (exitSequence !== undefined) {\n exitPath.sequence = exitSequence;\n }\n paths.push(exitPath);\n }\n\n return paths;\n },\n\n async discoverAt(\n index: number,\n descriptor: string,\n deps: DiscoveryDeps,\n ): Promise<DiscoveredContract[]> {\n if (!deps.delegatePubKey) return [];\n const pubKey = deriveDescriptorLeafPubKey(descriptor);\n const out: DiscoveredContract[] = [];\n for (const csvTimelock of deps.csvTimelocks) {\n const script = new DelegateVtxo.Script({\n pubKey,\n serverPubKey: deps.serverPubKey,\n delegatePubKey: deps.delegatePubKey,\n csvTimelock,\n });\n const scriptHex = hex.encode(script.pkScript);\n const { vtxos } = await deps.indexerProvider.getVtxos({\n scripts: [scriptHex],\n });\n if (vtxos.length === 0) continue;\n out.push({\n type: \"delegate\",\n params: {\n pubKey: hex.encode(pubKey),\n serverPubKey: hex.encode(deps.serverPubKey),\n delegatePubKey: hex.encode(deps.delegatePubKey),\n csvTimelock: timelockToSequence(csvTimelock).toString(),\n },\n script: scriptHex,\n address: script.address(deps.network.hrp, deps.serverPubKey).encode(),\n ...(index > 0\n ? {\n metadata: {\n source: WALLET_RECEIVE_SOURCE,\n signingDescriptor: descriptor,\n },\n }\n : {}),\n });\n }\n return out;\n },\n};\n","import { Script } from \"@scure/btc-signer\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\nimport {\n CLTVMultisigTapscript,\n ConditionCSVMultisigTapscript,\n ConditionMultisigTapscript,\n CSVMultisigTapscript,\n MultisigTapscript,\n RelativeTimelock,\n} from \"./tapscript\";\nimport { hex } from \"@scure/base\";\nimport { TapLeafScript, VtxoScript } from \"./base\";\n\n/** Virtual Hash Time Lock Contract (VHTLC) namespace. */\nexport namespace VHTLC {\n export interface Options {\n sender: Bytes;\n receiver: Bytes;\n server: Bytes;\n preimageHash: Bytes;\n refundLocktime: bigint;\n unilateralClaimDelay: RelativeTimelock;\n unilateralRefundDelay: RelativeTimelock;\n unilateralRefundWithoutReceiverDelay: RelativeTimelock;\n }\n\n /**\n * Virtual Hash Time Lock Contract (VHTLC) script implementation.\n *\n * VHTLC enables atomic swaps and conditional payments in the Arkade protocol.\n * It provides multiple spending paths:\n *\n * - **claim**: Receiver can claim funds by revealing the preimage\n * - **refund**: Sender and receiver can collaboratively refund\n * - **refundWithoutReceiver**: Sender can refund after locktime expires\n * - **unilateralClaim**: Receiver can claim unilaterally after delay\n * - **unilateralRefund**: Sender and receiver can refund unilaterally after delay\n * - **unilateralRefundWithoutReceiver**: Sender can refund unilaterally after delay\n *\n * @example\n * ```typescript\n * const vhtlc = new VHTLC.Script({\n * sender: alicePubKey,\n * receiver: bobPubKey,\n * server: serverPubKey,\n * preimageHash: hash160(secret),\n * refundLocktime: BigInt(chainTip + 10),\n * unilateralClaimDelay: { type: 'blocks', value: 100n },\n * unilateralRefundDelay: { type: 'blocks', value: 102n },\n * unilateralRefundWithoutReceiverDelay: { type: 'blocks', value: 103n }\n * });\n * ```\n */\n export class Script extends VtxoScript {\n readonly claimScript: string;\n readonly refundScript: string;\n readonly refundWithoutReceiverScript: string;\n readonly unilateralClaimScript: string;\n readonly unilateralRefundScript: string;\n readonly unilateralRefundWithoutReceiverScript: string;\n\n /** Create a VHTLC script from the supplied participant keys, hash, and timelocks. */\n constructor(readonly options: Options) {\n validateOptions(options);\n\n const {\n sender,\n receiver,\n server,\n preimageHash,\n refundLocktime,\n unilateralClaimDelay,\n unilateralRefundDelay,\n unilateralRefundWithoutReceiverDelay,\n } = options;\n\n const conditionScript = preimageConditionScript(preimageHash);\n\n const claimScript = ConditionMultisigTapscript.encode({\n conditionScript,\n pubkeys: [receiver, server],\n }).script;\n\n const refundScript = MultisigTapscript.encode({\n pubkeys: [sender, receiver, server],\n }).script;\n\n const refundWithoutReceiverScript = CLTVMultisigTapscript.encode({\n absoluteTimelock: refundLocktime,\n pubkeys: [sender, server],\n }).script;\n\n const unilateralClaimScript = ConditionCSVMultisigTapscript.encode({\n conditionScript,\n timelock: unilateralClaimDelay,\n pubkeys: [receiver],\n }).script;\n\n const unilateralRefundScript = CSVMultisigTapscript.encode({\n timelock: unilateralRefundDelay,\n pubkeys: [sender, receiver],\n }).script;\n\n const unilateralRefundWithoutReceiverScript = CSVMultisigTapscript.encode({\n timelock: unilateralRefundWithoutReceiverDelay,\n pubkeys: [sender],\n }).script;\n\n super([\n claimScript,\n refundScript,\n refundWithoutReceiverScript,\n unilateralClaimScript,\n unilateralRefundScript,\n unilateralRefundWithoutReceiverScript,\n ]);\n\n this.claimScript = hex.encode(claimScript);\n this.refundScript = hex.encode(refundScript);\n this.refundWithoutReceiverScript = hex.encode(refundWithoutReceiverScript);\n this.unilateralClaimScript = hex.encode(unilateralClaimScript);\n this.unilateralRefundScript = hex.encode(unilateralRefundScript);\n this.unilateralRefundWithoutReceiverScript = hex.encode(\n unilateralRefundWithoutReceiverScript,\n );\n }\n\n /** Return the collaborative claim tapleaf script. */\n claim(): TapLeafScript {\n return this.findLeaf(this.claimScript);\n }\n\n /** Return the collaborative refund tapleaf script. */\n refund(): TapLeafScript {\n return this.findLeaf(this.refundScript);\n }\n\n /** Return the refund-without-receiver tapleaf script. */\n refundWithoutReceiver(): TapLeafScript {\n return this.findLeaf(this.refundWithoutReceiverScript);\n }\n\n /** Return the unilateral claim tapleaf script. */\n unilateralClaim(): TapLeafScript {\n return this.findLeaf(this.unilateralClaimScript);\n }\n\n /** Return the unilateral refund tapleaf script. */\n unilateralRefund(): TapLeafScript {\n return this.findLeaf(this.unilateralRefundScript);\n }\n\n /** Return the unilateral refund-without-receiver tapleaf script. */\n unilateralRefundWithoutReceiver(): TapLeafScript {\n return this.findLeaf(this.unilateralRefundWithoutReceiverScript);\n }\n }\n\n function validateOptions(options: Options): void {\n const {\n sender,\n receiver,\n server,\n preimageHash,\n refundLocktime,\n unilateralClaimDelay,\n unilateralRefundDelay,\n unilateralRefundWithoutReceiverDelay,\n } = options;\n\n if (!preimageHash || preimageHash.length !== 20) {\n throw new Error(\"preimage hash must be 20 bytes\");\n }\n if (!receiver || receiver.length !== 32) {\n throw new Error(\"Invalid public key length (receiver)\");\n }\n if (!sender || sender.length !== 32) {\n throw new Error(\"Invalid public key length (sender)\");\n }\n if (!server || server.length !== 32) {\n throw new Error(\"Invalid public key length (server)\");\n }\n if (typeof refundLocktime !== \"bigint\" || refundLocktime <= 0n) {\n throw new Error(\"refund locktime must be greater than 0\");\n }\n if (\n !unilateralClaimDelay ||\n typeof unilateralClaimDelay.value !== \"bigint\" ||\n unilateralClaimDelay.value <= 0n\n ) {\n throw new Error(\"unilateral claim delay must greater than 0\");\n }\n if (unilateralClaimDelay.type === \"seconds\" && unilateralClaimDelay.value % 512n !== 0n) {\n throw new Error(\"seconds timelock must be multiple of 512\");\n }\n if (unilateralClaimDelay.type === \"seconds\" && unilateralClaimDelay.value < 512n) {\n throw new Error(\"seconds timelock must be greater or equal to 512\");\n }\n if (\n !unilateralRefundDelay ||\n typeof unilateralRefundDelay.value !== \"bigint\" ||\n unilateralRefundDelay.value <= 0n\n ) {\n throw new Error(\"unilateral refund delay must greater than 0\");\n }\n if (unilateralRefundDelay.type === \"seconds\" && unilateralRefundDelay.value % 512n !== 0n) {\n throw new Error(\"seconds timelock must be multiple of 512\");\n }\n if (unilateralRefundDelay.type === \"seconds\" && unilateralRefundDelay.value < 512n) {\n throw new Error(\"seconds timelock must be greater or equal to 512\");\n }\n if (\n !unilateralRefundWithoutReceiverDelay ||\n typeof unilateralRefundWithoutReceiverDelay.value !== \"bigint\" ||\n unilateralRefundWithoutReceiverDelay.value <= 0n\n ) {\n throw new Error(\"unilateral refund without receiver delay must greater than 0\");\n }\n if (\n unilateralRefundWithoutReceiverDelay.type === \"seconds\" &&\n unilateralRefundWithoutReceiverDelay.value % 512n !== 0n\n ) {\n throw new Error(\"seconds timelock must be multiple of 512\");\n }\n if (\n unilateralRefundWithoutReceiverDelay.type === \"seconds\" &&\n unilateralRefundWithoutReceiverDelay.value < 512n\n ) {\n throw new Error(\"seconds timelock must be greater or equal to 512\");\n }\n }\n}\n\nfunction preimageConditionScript(preimageHash: Bytes): Bytes {\n return Script.encode([\"HASH160\", preimageHash, \"EQUAL\"]);\n}\n","import { hex } from \"@scure/base\";\nimport { VHTLC } from \"../../script/vhtlc\";\nimport { RelativeTimelock } from \"../../script/tapscript\";\nimport { Contract, ContractHandler, PathContext, PathSelection } from \"../types\";\nimport { isCltvSatisfied, isCsvSpendable, resolveRole } from \"./helpers\";\nimport { sequenceToTimelock, timelockToSequence } from \"../../utils/timelock\";\n\n/**\n * Typed parameters for VHTLC contracts.\n */\nexport interface VHTLCContractParams {\n sender: Uint8Array;\n receiver: Uint8Array;\n server: Uint8Array;\n preimageHash: Uint8Array;\n refundLocktime: bigint;\n unilateralClaimDelay: RelativeTimelock;\n unilateralRefundDelay: RelativeTimelock;\n unilateralRefundWithoutReceiverDelay: RelativeTimelock;\n}\n\n/**\n * Handler for Virtual Hash Time Lock Contract (VHTLC).\n *\n * VHTLC supports multiple spending paths:\n *\n * Collaborative paths (with server):\n * - claim: Receiver + Server with preimage\n * - refund: Sender + Receiver + Server\n * - refundWithoutReceiver: Sender + Server after CLTV locktime\n *\n * Unilateral paths (without server):\n * - unilateralClaim: Receiver with preimage after CSV delay\n * - unilateralRefund: Sender + Receiver after CSV delay\n * - unilateralRefundWithoutReceiver: Sender after CSV delay\n */\nexport const VHTLCContractHandler: ContractHandler<VHTLCContractParams, VHTLC.Script> = {\n type: \"vhtlc\",\n\n createScript(params: Record<string, string>): VHTLC.Script {\n const typed = this.deserializeParams(params);\n return new VHTLC.Script(typed);\n },\n\n serializeParams(params: VHTLCContractParams): Record<string, string> {\n return {\n sender: hex.encode(params.sender),\n receiver: hex.encode(params.receiver),\n server: hex.encode(params.server),\n hash: hex.encode(params.preimageHash),\n refundLocktime: params.refundLocktime.toString(),\n claimDelay: timelockToSequence(params.unilateralClaimDelay).toString(),\n refundDelay: timelockToSequence(params.unilateralRefundDelay).toString(),\n refundNoReceiverDelay: timelockToSequence(\n params.unilateralRefundWithoutReceiverDelay,\n ).toString(),\n };\n },\n\n deserializeParams(params: Record<string, string>): VHTLCContractParams {\n return {\n sender: hex.decode(params.sender),\n receiver: hex.decode(params.receiver),\n server: hex.decode(params.server),\n preimageHash: hex.decode(params.hash),\n refundLocktime: BigInt(params.refundLocktime),\n unilateralClaimDelay: sequenceToTimelock(Number(params.claimDelay)),\n unilateralRefundDelay: sequenceToTimelock(Number(params.refundDelay)),\n unilateralRefundWithoutReceiverDelay: sequenceToTimelock(\n Number(params.refundNoReceiverDelay),\n ),\n };\n },\n\n /**\n * Select spending path based on context.\n *\n * Role is determined from `context.role` or by matching\n * `context.walletDescriptor` (preferred) / `context.walletPubKey`\n * against sender/receiver in contract params.\n */\n selectPath(\n script: VHTLC.Script,\n contract: Contract,\n context: PathContext,\n ): PathSelection | null {\n const role = resolveRole(contract, context);\n const preimage = contract.params?.preimage;\n const refundLocktime = BigInt(contract.params.refundLocktime);\n\n if (!role) {\n return null;\n }\n\n if (context.collaborative) {\n if (role === \"receiver\" && preimage) {\n return {\n leaf: script.claim(),\n extraWitness: [hex.decode(preimage)],\n };\n }\n\n if (role === \"sender\" && isCltvSatisfied(context, refundLocktime)) {\n return {\n leaf: script.refundWithoutReceiver(),\n };\n }\n\n return null;\n }\n\n // Unilateral paths\n if (role === \"receiver\" && preimage) {\n const sequence = Number(contract.params.claimDelay);\n if (!isCsvSpendable(context, sequence)) return null;\n return {\n leaf: script.unilateralClaim(),\n extraWitness: [hex.decode(preimage)],\n sequence,\n };\n }\n\n if (role === \"sender\") {\n const sequence = Number(contract.params.refundNoReceiverDelay);\n if (!isCsvSpendable(context, sequence)) return null;\n return {\n leaf: script.unilateralRefundWithoutReceiver(),\n sequence,\n };\n }\n\n return null;\n },\n\n /**\n * Get all possible spending paths (no timelock checks).\n *\n * Role is determined from `context.role` or by matching\n * `context.walletDescriptor` (preferred) / `context.walletPubKey`\n * against sender/receiver in contract params.\n */\n getAllSpendingPaths(\n script: VHTLC.Script,\n contract: Contract,\n context: PathContext,\n ): PathSelection[] {\n const role = resolveRole(contract, context);\n const paths: PathSelection[] = [];\n\n if (!role) {\n return paths;\n }\n\n const preimage = contract.params?.preimage;\n\n if (context.collaborative) {\n // Collaborative paths (no timelock checks)\n if (role === \"receiver\" && preimage) {\n paths.push({\n leaf: script.claim(),\n extraWitness: [hex.decode(preimage)],\n });\n }\n if (role === \"sender\") {\n paths.push({\n leaf: script.refundWithoutReceiver(),\n });\n }\n } else {\n // Unilateral paths (no timelock checks)\n if (role === \"receiver\" && preimage) {\n const sequence = Number(contract.params.claimDelay);\n paths.push({\n leaf: script.unilateralClaim(),\n extraWitness: [hex.decode(preimage)],\n sequence,\n });\n }\n if (role === \"sender\") {\n const sequence = Number(contract.params.refundNoReceiverDelay);\n paths.push({\n leaf: script.unilateralRefundWithoutReceiver(),\n sequence,\n });\n }\n }\n\n return paths;\n },\n\n getSpendablePaths(\n script: VHTLC.Script,\n contract: Contract,\n context: PathContext,\n ): PathSelection[] {\n const role = resolveRole(contract, context);\n const paths: PathSelection[] = [];\n\n if (!role) {\n return paths;\n }\n\n const preimage = contract.params?.preimage;\n const refundLocktime = BigInt(contract.params.refundLocktime);\n\n if (context.collaborative) {\n if (role === \"receiver\" && preimage) {\n paths.push({\n leaf: script.claim(),\n extraWitness: [hex.decode(preimage)],\n });\n }\n if (role === \"sender\" && isCltvSatisfied(context, refundLocktime)) {\n paths.push({\n leaf: script.refundWithoutReceiver(),\n });\n }\n return paths;\n }\n\n if (role === \"receiver\" && preimage) {\n const sequence = Number(contract.params.claimDelay);\n if (isCsvSpendable(context, sequence)) {\n paths.push({\n leaf: script.unilateralClaim(),\n extraWitness: [hex.decode(preimage)],\n sequence,\n });\n }\n }\n if (role === \"sender\") {\n const sequence = Number(contract.params.refundNoReceiverDelay);\n if (isCsvSpendable(context, sequence)) {\n paths.push({\n leaf: script.unilateralRefundWithoutReceiver(),\n sequence,\n });\n }\n }\n\n return paths;\n },\n};\n","import { DefaultVtxo } from \"../../script/default\";\nimport { Contract, ContractHandler, PathContext, PathSelection } from \"../types\";\nimport { DefaultContractHandler, DefaultContractParams } from \"./default\";\n\n/**\n * Typed parameters for boarding contracts.\n *\n * Boarding reuses the exact `default` contract parameter shape\n * (`pubKey` / `serverPubKey` / `csvTimelock`) rather than inventing\n * boarding-specific names — the boarding semantics come from the\n * contract type and from populating `csvTimelock` with the server's\n * boarding-exit delay (`ArkInfo.boardingExitDelay`) instead of the\n * offchain unilateral-exit delay.\n */\nexport type BoardingContractParams = DefaultContractParams;\n\n/**\n * Handler for the boarding contract (registered type `boarding`).\n *\n * The boarding contract derives the on-chain Bitcoin address used to\n * board funds onto Arkade. It shares the exact `DefaultVtxo.Script`\n * shape with the `default` contract — a Taproot output co-owned by the\n * wallet and the Ark server, with a CSV exit path back to the wallet —\n * and therefore reuses the `default` handler's path logic (forfeit via\n * server cooperation, exit after the boarding CSV).\n *\n * Boarding semantics come entirely from the contract type and from\n * sourcing the CSV timelock from the server's boarding-exit delay\n * (`ArkInfo.boardingExitDelay`), not from renamed parameters. The\n * offchain `default` contract is built from `ArkInfo.unilateralExitDelay`\n * instead, so the two share a script shape but differ in their CSV\n * timelock value. Parameters round-trip through the same\n * `timelockToSequence` / `sequenceToTimelock` helpers and BIP68 sequence\n * encoding as `default` / `delegate`.\n *\n * Unlike `default` / `delegate`, the boarding handler deliberately does\n * **not** implement {@link Discoverable.discoverAt}: branch/index\n * selection for HD wallets is owned by the wallet / address-provider\n * layer, which hands this handler an already-derived pubkey. As a result\n * `isDiscoverable(BoardingContractHandler)` is `false`.\n *\n * Identity & the default/boarding collision: a contract's `script` (pkScript)\n * is its unique identity — a script owns exactly one repository row. `boarding`\n * is a first-class type with its own row **when its script is distinct** from\n * the wallet's `default` baseline — the real-world case, since a sound Ark\n * server keeps boardingExitDelay strictly longer than unilateralExitDelay (equal\n * delays would expose the provider to a double-spend). Should those delays ever\n * coincide (a misconfigured/malicious server), the boarding script is\n * byte-identical to the default script and the wallet coalesces the single\n * shared row onto the `default` type (\"default wins\"; see `ensureWalletContract`)\n * rather than persisting a second row. Either way the funds are equally spendable\n * through the shared `DefaultVtxo.Script` paths. Consumers must NOT rely on\n * `contract.type === \"boarding\"` to identify the boarding purpose — resolve the\n * boarding script via `wallet.getBoardingAddress()` / `wallet.boardingTapscript`\n * (which never depend on the persisted contract's type) and match by script when\n * needed.\n */\nexport const BoardingContractHandler: ContractHandler<BoardingContractParams, DefaultVtxo.Script> =\n {\n type: \"boarding\",\n\n createScript(params: Record<string, string>): DefaultVtxo.Script {\n return DefaultContractHandler.createScript(params);\n },\n\n serializeParams(params: BoardingContractParams): Record<string, string> {\n return DefaultContractHandler.serializeParams(params);\n },\n\n deserializeParams(params: Record<string, string>): BoardingContractParams {\n return DefaultContractHandler.deserializeParams(params);\n },\n\n selectPath(\n script: DefaultVtxo.Script,\n contract: Contract,\n context: PathContext,\n ): PathSelection | null {\n return DefaultContractHandler.selectPath(script, contract, context);\n },\n\n getAllSpendingPaths(\n script: DefaultVtxo.Script,\n contract: Contract,\n context: PathContext,\n ): PathSelection[] {\n return DefaultContractHandler.getAllSpendingPaths(script, contract, context);\n },\n\n getSpendablePaths(\n script: DefaultVtxo.Script,\n contract: Contract,\n context: PathContext,\n ): PathSelection[] {\n return DefaultContractHandler.getSpendablePaths(script, contract, context);\n },\n };\n","export { contractHandlers } from \"./registry\";\nexport { DefaultContractHandler } from \"./default\";\nexport type { DefaultContractParams } from \"./default\";\nexport { DelegateContractHandler } from \"./delegate\";\nexport type { DelegateContractParams } from \"./delegate\";\nexport { VHTLCContractHandler } from \"./vhtlc\";\nexport type { VHTLCContractParams } from \"./vhtlc\";\nexport { BoardingContractHandler } from \"./boarding\";\nexport type { BoardingContractParams } from \"./boarding\";\n\n// Register built-in handlers\nimport { contractHandlers } from \"./registry\";\nimport { DefaultContractHandler } from \"./default\";\nimport { DelegateContractHandler } from \"./delegate\";\nimport { VHTLCContractHandler } from \"./vhtlc\";\nimport { BoardingContractHandler } from \"./boarding\";\n\ncontractHandlers.register(DefaultContractHandler);\ncontractHandlers.register(DelegateContractHandler);\ncontractHandlers.register(VHTLCContractHandler);\ncontractHandlers.register(BoardingContractHandler);\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/timelock.ts","../src/networks.ts","../src/script/address.ts","../src/script/tapscript.ts","../src/script/base.ts"],"names":["Script","MultisigTapscript","MultisigType","encode","decode","CSVMultisigTapscript","ConditionCSVMultisigTapscript","ConditionMultisigTapscript","CLTVMultisigTapscript","leaf","hex"],"mappings":"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","file":"chunk-TU3LVAPX.js","sourcesContent":["import * as bip68 from \"bip68\";\nimport type { RelativeTimelock } from \"../script/tapscript\";\n\n/**\n * Convert RelativeTimelock to BIP68 sequence number.\n */\nexport function timelockToSequence(timelock: RelativeTimelock): number {\n return bip68.encode(\n timelock.type === \"blocks\"\n ? { blocks: Number(timelock.value) }\n : { seconds: Number(timelock.value) },\n );\n}\n\n/**\n * Convert BIP68 sequence number back to RelativeTimelock.\n */\nexport function sequenceToTimelock(sequence: number): RelativeTimelock {\n const decoded = bip68.decode(sequence);\n if (\"blocks\" in decoded && decoded.blocks !== undefined) {\n return { type: \"blocks\", value: BigInt(decoded.blocks) };\n }\n if (\"seconds\" in decoded && decoded.seconds !== undefined) {\n return { type: \"seconds\", value: BigInt(decoded.seconds) };\n }\n throw new Error(`Invalid BIP68 sequence: ${sequence}`);\n}\n","import { NETWORK, TEST_NETWORK } from \"@scure/btc-signer/utils.js\";\n\nexport type NetworkName = \"bitcoin\" | \"testnet\" | \"signet\" | \"mutinynet\" | \"regtest\";\n\nexport interface Network {\n hrp: string;\n bech32: string;\n pubKeyHash: number;\n scriptHash: number;\n wif: number;\n}\nexport const getNetwork = (network: NetworkName): Network => {\n return networks[network];\n};\n\nexport const networks = {\n bitcoin: withArkPrefix(NETWORK, \"ark\"),\n testnet: withArkPrefix(TEST_NETWORK, \"tark\"),\n signet: withArkPrefix(TEST_NETWORK, \"tark\"),\n mutinynet: withArkPrefix(TEST_NETWORK, \"tark\"),\n regtest: withArkPrefix(\n {\n ...TEST_NETWORK,\n bech32: \"bcrt\",\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n },\n \"tark\",\n ),\n};\n\nfunction withArkPrefix(network: Omit<Network, \"hrp\">, prefix: string): Network {\n return {\n ...network,\n hrp: prefix,\n };\n}\n\nexport const DEFAULT_ARKADE_SERVER_URL = \"https://arkade.computer\" as const;\nexport const DEFAULT_NETWORK = networks.bitcoin;\nexport const DEFAULT_NETWORK_NAME = \"bitcoin\" as const satisfies NetworkName;\n","import { bech32m } from \"@scure/base\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\nimport { Script } from \"@scure/btc-signer/script.js\";\nimport { DEFAULT_NETWORK } from \"../networks\";\n\n/**\n * ArkAddress allows creating and decoding bech32m-encoded Arkade addresses.\n *\n * An Arkade address is composed of:\n * - a human readable prefix (hrp)\n * - a version byte (1 byte)\n * - a server public key (32 bytes)\n * - a vtxo taproot public key (32 bytes)\n *\n * @remarks\n * This is an Arkade-specific address format.\n * It is distinct from the Taproot onchain address returned by `VtxoScript.onchainAddress`.\n *\n * @see VtxoScript\n *\n * @example\n * ```typescript\n * const address = new ArkAddress(\n * new Uint8Array(32), // server public key\n * new Uint8Array(32), // vtxo taproot public key\n * \"ark\"\n * );\n *\n * const encoded = address.encode();\n * console.log(\"address: \", encoded);\n *\n * const decoded = ArkAddress.decode(encoded);\n * ```\n */\nexport class ArkAddress {\n /**\n * Create an Arkade address from its server public key, Taproot output key, and prefix.\n *\n * @param serverPubKey - 32-byte Arkade server public key\n * @param vtxoTaprootKey - 32-byte Taproot output key (a.k.a. tweaked public key)\n * @param hrp - Bech32 human-readable prefix\n * @param version - Address version byte\n * @defaultValue `version = 0`\n * @throws Error if either public key is not 32 bytes long\n */\n constructor(\n readonly serverPubKey: Bytes,\n readonly vtxoTaprootKey: Bytes,\n readonly hrp: string = DEFAULT_NETWORK.hrp,\n readonly version: number = 0,\n ) {\n if (serverPubKey.length !== 32) {\n throw new Error(\n \"Invalid server public key length, expected 32 bytes, got \" + serverPubKey.length,\n );\n }\n if (vtxoTaprootKey.length !== 32) {\n throw new Error(\n \"Invalid vtxo taproot public key length, expected 32 bytes, got \" +\n vtxoTaprootKey.length,\n );\n }\n }\n\n /**\n * Decode an Arkade address from its bech32m string form.\n *\n * @param address - Bech32m-encoded Arkade address\n * @returns Decoded Arkade address\n * @throws Error if the address is malformed or has an invalid payload length\n * @see encode\n */\n static decode(address: string): ArkAddress {\n const decoded = bech32m.decodeUnsafe(address, 1023);\n if (!decoded) {\n throw new Error(\"Invalid address\");\n }\n const data = new Uint8Array(bech32m.fromWords(decoded.words));\n\n // First the version byte, then 32 bytes server pubkey, then 32 bytes vtxo taproot public key.\n if (data.length !== 1 + 32 + 32) {\n throw new Error(\"Invalid data length, expected 65 bytes, got \" + data.length);\n }\n\n const version = data[0];\n const serverPubKey = data.slice(1, 33);\n const vtxoTaprootPubKey = data.slice(33, 65);\n\n return new ArkAddress(serverPubKey, vtxoTaprootPubKey, decoded.prefix, version);\n }\n\n /**\n * Encode the address to its bech32m string form.\n *\n * @returns Bech32m-encoded Arkade address\n * @see decode\n */\n encode(): string {\n // Combine version byte, server pubkey, and vtxo taproot public key.\n const data = new Uint8Array(1 + 32 + 32);\n data[0] = this.version;\n data.set(this.serverPubKey, 1);\n data.set(this.vtxoTaprootKey, 33);\n\n const words = bech32m.toWords(data);\n return bech32m.encode(this.hrp, words, 1023);\n }\n\n /** ScriptPubKey used to send non-dust funds to the address. */\n get pkScript(): Bytes {\n return Script.encode([\"OP_1\", this.vtxoTaprootKey]);\n }\n\n /** ScriptPubKey used to send sub-dust funds to the address. */\n get subdustPkScript(): Bytes {\n return Script.encode([\"RETURN\", this.vtxoTaprootKey]);\n }\n}\n","import { Script, ScriptNum, ScriptType, p2tr_ms } from \"@scure/btc-signer\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\nimport { hex } from \"@scure/base\";\nimport { sequenceToTimelock, timelockToSequence } from \"../utils/timelock\";\n\nconst MinimalScriptNum = ScriptNum(undefined, true);\n\n/**\n * RelativeTimelock lets to create timelocked with CHECKSEQUENCEVERIFY script.\n *\n * @example\n * ```typescript\n * const timelock = { value: 144n, type: \"blocks\" }; // 1 day in blocks\n * const timelock = { value: 512n, type: \"seconds\" }; // 8 minutes in seconds\n * ```\n */\nexport type RelativeTimelock = {\n value: bigint;\n type: \"seconds\" | \"blocks\";\n};\n\nexport enum TapscriptType {\n Multisig = \"multisig\",\n CSVMultisig = \"csv-multisig\",\n ConditionCSVMultisig = \"condition-csv-multisig\",\n ConditionMultisig = \"condition-multisig\",\n CLTVMultisig = \"cltv-multisig\",\n}\n\n/**\n * ArkTapscript is the base element of vtxo scripts.\n * It is used to encode and decode the different types of vtxo scripts.\n */\nexport interface ArkTapscript<T extends TapscriptType, Params> {\n type: T;\n params: Params;\n script: Uint8Array;\n}\n\n/**\n * decodeTapscript is a function that decodes an Arkade tapscript from a raw script.\n *\n * @throws {Error} if the script is not a valid Arkade tapscript\n * @example\n * ```typescript\n * const arkTapscript = decodeTapscript(new Uint8Array(32));\n * console.log(\"type:\", arkTapscript.type);\n * ```\n */\nexport function decodeTapscript(script: Uint8Array): ArkTapscript<TapscriptType, any> {\n const types = [\n MultisigTapscript,\n CSVMultisigTapscript,\n ConditionCSVMultisigTapscript,\n ConditionMultisigTapscript,\n CLTVMultisigTapscript,\n ];\n\n for (const type of types) {\n try {\n return type.decode(script);\n } catch (error) {\n continue;\n }\n }\n\n throw new Error(`Failed to decode: script ${hex.encode(script)} is not a valid tapscript`);\n}\n\n/**\n * Implements a multi-signature tapscript.\n *\n * <pubkey> CHECKSIGVERIFY <pubkey> CHECKSIG\n *\n * @example\n * ```typescript\n * const multisigTapscript = MultisigTapscript.encode({ pubkeys: [new Uint8Array(32), new Uint8Array(32)] });\n * ```\n */\nexport namespace MultisigTapscript {\n export type Type = ArkTapscript<TapscriptType.Multisig, Params>;\n\n export enum MultisigType {\n CHECKSIG,\n CHECKSIGADD,\n }\n\n export type Params = {\n pubkeys: Bytes[];\n type?: MultisigType;\n };\n\n /** Encode a plain multisig tapscript. */\n export function encode(params: Params): Type {\n if (params.pubkeys.length === 0) {\n throw new Error(\"At least 1 pubkey is required\");\n }\n\n for (const pubkey of params.pubkeys) {\n if (pubkey.length !== 32) {\n throw new Error(`Invalid pubkey length: expected 32, got ${pubkey.length}`);\n }\n }\n\n if (!params.type) {\n params.type = MultisigType.CHECKSIG;\n }\n\n if (params.type === MultisigType.CHECKSIGADD) {\n return {\n type: TapscriptType.Multisig,\n params,\n script: p2tr_ms(params.pubkeys.length, params.pubkeys).script,\n };\n }\n\n const asm: ScriptType = [];\n for (let i = 0; i < params.pubkeys.length; i++) {\n asm.push(params.pubkeys[i]);\n\n // CHECKSIGVERIFY except the last pubkey\n if (i < params.pubkeys.length - 1) {\n asm.push(\"CHECKSIGVERIFY\");\n } else {\n asm.push(\"CHECKSIG\");\n }\n }\n\n return {\n type: TapscriptType.Multisig,\n params,\n script: Script.encode(asm),\n };\n }\n\n /** Decode a plain multisig tapscript from raw script bytes. */\n export function decode(script: Uint8Array): Type {\n if (script.length === 0) {\n throw new Error(\"Failed to decode: script is empty\");\n }\n\n try {\n // Try decoding as checksigAdd first\n return decodeChecksigAdd(script);\n } catch (error) {\n // If checksigAdd fails, try regular checksig\n try {\n return decodeChecksig(script);\n } catch (error2) {\n throw new Error(\n `Failed to decode script: ${error2 instanceof Error ? error2.message : String(error2)}`,\n );\n }\n }\n }\n\n // <pubkey> CHECKSIG <pubkey> CHECKSIGADD <len_keys> NUMEQUAL\n function decodeChecksigAdd(script: Uint8Array): Type {\n const asm = Script.decode(script);\n const pubkeys: Bytes[] = [];\n let foundNumEqual = false;\n\n // Parse through ASM operations\n for (let i = 0; i < asm.length; i++) {\n const op = asm[i];\n\n // If it's a data push, it should be a 32-byte pubkey\n if (typeof op !== \"string\" && typeof op !== \"number\") {\n if (op.length !== 32) {\n throw new Error(`Invalid pubkey length: expected 32, got ${op.length}`);\n }\n pubkeys.push(op);\n\n // Check next operation is CHECKSIGADD or CHECKSIG\n if (\n i + 1 >= asm.length ||\n (asm[i + 1] !== \"CHECKSIGADD\" && asm[i + 1] !== \"CHECKSIG\")\n ) {\n throw new Error(\"Expected CHECKSIGADD or CHECKSIG after pubkey\");\n }\n i++; // Skip the CHECKSIGADD op\n continue;\n }\n\n // Last operation should be NUMEQUAL\n if (i === asm.length - 1) {\n if (op !== \"NUMEQUAL\") {\n throw new Error(\"Expected NUMEQUAL at end of script\");\n }\n foundNumEqual = true;\n }\n }\n\n if (!foundNumEqual) {\n throw new Error(\"Missing NUMEQUAL operation\");\n }\n\n if (pubkeys.length === 0) {\n throw new Error(\"Invalid script: must have at least 1 pubkey\");\n }\n\n // Verify the script by re-encoding and comparing\n const reconstructed = encode({\n pubkeys,\n type: MultisigType.CHECKSIGADD,\n });\n if (hex.encode(reconstructed.script) !== hex.encode(script)) {\n throw new Error(\"Invalid script format: script reconstruction mismatch\");\n }\n\n return {\n type: TapscriptType.Multisig,\n params: { pubkeys, type: MultisigType.CHECKSIGADD },\n script,\n };\n }\n\n // <pubkey> CHECKSIGVERIFY <pubkey> CHECKSIG\n function decodeChecksig(script: Uint8Array): Type {\n const asm = Script.decode(script);\n const pubkeys: Bytes[] = [];\n\n // Parse through ASM operations\n for (let i = 0; i < asm.length; i++) {\n const op = asm[i];\n\n // If it's a data push, it should be a 32-byte pubkey\n if (typeof op !== \"string\" && typeof op !== \"number\") {\n if (op.length !== 32) {\n throw new Error(`Invalid pubkey length: expected 32, got ${op.length}`);\n }\n pubkeys.push(op);\n\n // Check next operation\n if (i + 1 >= asm.length) {\n throw new Error(\"Unexpected end of script\");\n }\n\n const nextOp = asm[i + 1];\n if (nextOp !== \"CHECKSIGVERIFY\" && nextOp !== \"CHECKSIG\") {\n throw new Error(\"Expected CHECKSIGVERIFY or CHECKSIG after pubkey\");\n }\n\n // Last operation must be CHECKSIG, not CHECKSIGVERIFY\n if (i === asm.length - 2 && nextOp !== \"CHECKSIG\") {\n throw new Error(\"Last operation must be CHECKSIG\");\n }\n\n i++; // Skip the CHECKSIG/CHECKSIGVERIFY op\n continue;\n }\n }\n\n if (pubkeys.length === 0) {\n throw new Error(\"Invalid script: must have at least 1 pubkey\");\n }\n\n // Verify the script by re-encoding and comparing\n const reconstructed = encode({ pubkeys, type: MultisigType.CHECKSIG });\n if (hex.encode(reconstructed.script) !== hex.encode(script)) {\n throw new Error(\"Invalid script format: script reconstruction mismatch\");\n }\n\n return {\n type: TapscriptType.Multisig,\n params: { pubkeys, type: MultisigType.CHECKSIG },\n script,\n };\n }\n\n /** Return true when the tapscript is a plain multisig tapscript. */\n export function is(tapscript: ArkTapscript<any, any>): tapscript is Type {\n return tapscript.type === TapscriptType.Multisig;\n }\n}\n\n/**\n * Implements a relative timelock script that requires all specified pubkeys to sign\n * after the relative timelock has expired. The timelock can be specified in blocks or seconds.\n *\n * This is the standard exit closure and it is also used for the sweep closure in vtxo trees.\n *\n * <sequence> CHECKSEQUENCEVERIFY DROP <pubkey> CHECKSIG\n *\n * @example\n * ```typescript\n * const csvMultisigTapscript = CSVMultisigTapscript.encode({ timelock: { type: \"blocks\", value: 144 }, pubkeys: [new Uint8Array(32), new Uint8Array(32)] });\n * ```\n */\nexport namespace CSVMultisigTapscript {\n export type Type = ArkTapscript<TapscriptType.CSVMultisig, Params>;\n\n export type Params = {\n timelock: RelativeTimelock;\n } & MultisigTapscript.Params;\n\n /** Encode a CSV multisig tapscript. */\n export function encode(params: Params): Type {\n for (const pubkey of params.pubkeys) {\n if (pubkey.length !== 32) {\n throw new Error(`Invalid pubkey length: expected 32, got ${pubkey.length}`);\n }\n }\n\n const sequence = MinimalScriptNum.encode(BigInt(timelockToSequence(params.timelock)));\n\n const asm: ScriptType = [\n sequence.length === 1 ? sequence[0] : sequence,\n \"CHECKSEQUENCEVERIFY\",\n \"DROP\",\n ];\n const multisigScript = MultisigTapscript.encode(params);\n const script = new Uint8Array([...Script.encode(asm), ...multisigScript.script]);\n\n return {\n type: TapscriptType.CSVMultisig,\n params,\n script,\n };\n }\n\n /** Decode a CSV multisig tapscript from raw script bytes. */\n export function decode(script: Uint8Array): Type {\n if (script.length === 0) {\n throw new Error(\"Failed to decode: script is empty\");\n }\n\n const isValid = isScriptValid(script);\n if (isValid instanceof Error) {\n throw isValid;\n }\n\n const asm = Script.decode(script);\n\n const sequence = asm[0];\n const multisigScript = new Uint8Array(Script.encode(asm.slice(3)));\n let multisig: MultisigTapscript.Type;\n\n try {\n multisig = MultisigTapscript.decode(multisigScript);\n } catch (error) {\n throw new Error(\n `Invalid multisig script: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n let sequenceNum: number;\n if (typeof sequence === \"number\") {\n sequenceNum = sequence;\n } else {\n sequenceNum = Number(MinimalScriptNum.decode(sequence as Uint8Array));\n }\n const timelock = sequenceToTimelock(sequenceNum);\n\n const reconstructed = encode({\n timelock,\n ...multisig.params,\n });\n\n if (hex.encode(reconstructed.script) !== hex.encode(script)) {\n throw new Error(\"Invalid script format: script reconstruction mismatch\");\n }\n\n return {\n type: TapscriptType.CSVMultisig,\n params: {\n timelock,\n ...multisig.params,\n },\n script,\n };\n }\n\n /** Return true when the tapscript is a CSV multisig tapscript. */\n export function is(tapscript: ArkTapscript<any, any>): tapscript is Type {\n return tapscript.type === TapscriptType.CSVMultisig;\n }\n\n export function isScriptValid(script: Uint8Array): true | Error {\n const asm = Script.decode(script);\n\n if (asm.length < 3) {\n return new Error(`Invalid script: too short (expected at least 3)`);\n }\n\n const sequence = asm[0];\n if (typeof sequence === \"string\") {\n return new Error(\"Invalid script: expected sequence number\");\n }\n\n if (asm[1] !== \"CHECKSEQUENCEVERIFY\" || asm[2] !== \"DROP\") {\n return new Error(\"Invalid script: expected CHECKSEQUENCEVERIFY DROP\");\n }\n\n return true;\n }\n}\n\n/**\n * Combines a condition script with an exit closure. The resulting script requires\n * the condition to be met, followed by the standard exit closure requirements\n * (timelock and signatures).\n *\n * <conditionScript> VERIFY <sequence> CHECKSEQUENCEVERIFY DROP <pubkey> CHECKSIGVERIFY <pubkey> CHECKSIG\n *\n * @example\n * ```typescript\n * const conditionCSVMultisigTapscript = ConditionCSVMultisigTapscript.encode({ conditionScript: new Uint8Array(32), pubkeys: [new Uint8Array(32), new Uint8Array(32)] });\n * ```\n */\nexport namespace ConditionCSVMultisigTapscript {\n export type Type = ArkTapscript<TapscriptType.ConditionCSVMultisig, Params>;\n\n export type Params = {\n conditionScript: Bytes;\n } & CSVMultisigTapscript.Params;\n\n /** Encode a condition + CSV multisig tapscript. */\n export function encode(params: Params): Type {\n const script = new Uint8Array([\n ...params.conditionScript,\n ...Script.encode([\"VERIFY\"]),\n ...CSVMultisigTapscript.encode(params).script,\n ]);\n\n return {\n type: TapscriptType.ConditionCSVMultisig,\n params,\n script,\n };\n }\n\n /** Decode a condition + CSV multisig tapscript from raw script bytes. */\n export function decode(script: Uint8Array): Type {\n if (script.length === 0) {\n throw new Error(\"Failed to decode: script is empty\");\n }\n\n const isValid = isScriptValid(script);\n if (isValid instanceof Error) {\n throw isValid;\n }\n\n const asm = Script.decode(script);\n\n let verifyIndex = getVerifyIndex(asm);\n\n if (verifyIndex === -1) {\n throw Error(\"Invalid script: missing VERIFY operation\");\n }\n\n const conditionScript = new Uint8Array(Script.encode(asm.slice(0, verifyIndex)));\n const csvMultisigScript = new Uint8Array(Script.encode(asm.slice(verifyIndex + 1)));\n\n let csvMultisig: CSVMultisigTapscript.Type;\n try {\n csvMultisig = CSVMultisigTapscript.decode(csvMultisigScript);\n } catch (error) {\n throw new Error(\n `Invalid CSV multisig script: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n const reconstructed = encode({\n conditionScript,\n ...csvMultisig.params,\n });\n\n if (hex.encode(reconstructed.script) !== hex.encode(script)) {\n throw new Error(\"Invalid script format: script reconstruction mismatch\");\n }\n\n return {\n type: TapscriptType.ConditionCSVMultisig,\n params: {\n conditionScript,\n ...csvMultisig.params,\n },\n script,\n };\n }\n\n /** Return true when the tapscript is a condition + CSV multisig tapscript. */\n export function is(tapscript: ArkTapscript<any, any>): tapscript is Type {\n return tapscript.type === TapscriptType.ConditionCSVMultisig;\n }\n\n function getVerifyIndex(asm: ScriptType) {\n let verifyIndex = -1;\n for (let i = asm.length - 1; i >= 0; i--) {\n if (asm[i] === \"VERIFY\") {\n verifyIndex = i;\n return verifyIndex;\n }\n }\n return verifyIndex;\n }\n\n export function isScriptValid(script: Uint8Array): true | Error {\n const asm = Script.decode(script);\n\n if (asm.length < 1) {\n return new Error(`Invalid script: too short (expected at least 1)`);\n }\n\n let verifyIndex = getVerifyIndex(asm);\n\n if (verifyIndex === -1) {\n return new Error(\"Invalid script: missing VERIFY operation\");\n }\n\n return true;\n }\n}\n\n/**\n * Combines a condition script with a forfeit closure. The resulting script requires\n * the condition to be met, followed by the standard forfeit closure requirements\n * (multi-signature).\n *\n * <conditionScript> VERIFY <pubkey> CHECKSIGVERIFY <pubkey> CHECKSIG\n *\n * @example\n * ```typescript\n * const conditionMultisigTapscript = ConditionMultisigTapscript.encode({ conditionScript: new Uint8Array(32), pubkeys: [new Uint8Array(32), new Uint8Array(32)] });\n * ```\n */\nexport namespace ConditionMultisigTapscript {\n export type Type = ArkTapscript<TapscriptType.ConditionMultisig, Params>;\n\n export type Params = {\n conditionScript: Bytes;\n } & MultisigTapscript.Params;\n\n /** Encode a condition + multisig tapscript. */\n export function encode(params: Params): Type {\n const script = new Uint8Array([\n ...params.conditionScript,\n ...Script.encode([\"VERIFY\"]),\n ...MultisigTapscript.encode(params).script,\n ]);\n\n return {\n type: TapscriptType.ConditionMultisig,\n params,\n script,\n };\n }\n\n /** Decode a condition + multisig tapscript from raw script bytes. */\n export function decode(script: Uint8Array): Type {\n if (script.length === 0) {\n throw new Error(\"Failed to decode: script is empty\");\n }\n\n const isValid = isScriptValid(script);\n if (isValid instanceof Error) {\n throw isValid;\n }\n\n const asm = Script.decode(script);\n\n let verifyIndex = getVerifyIndex(asm);\n\n if (verifyIndex === -1) {\n throw Error(\"Invalid script: missing VERIFY operation\");\n }\n\n const conditionScript = new Uint8Array(Script.encode(asm.slice(0, verifyIndex)));\n const multisigScript = new Uint8Array(Script.encode(asm.slice(verifyIndex + 1)));\n\n let multisig: MultisigTapscript.Type;\n try {\n multisig = MultisigTapscript.decode(multisigScript);\n } catch (error) {\n throw new Error(\n `Invalid multisig script: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n const reconstructed = encode({\n conditionScript,\n ...multisig.params,\n });\n\n if (hex.encode(reconstructed.script) !== hex.encode(script)) {\n throw new Error(\"Invalid script format: script reconstruction mismatch\");\n }\n\n return {\n type: TapscriptType.ConditionMultisig,\n params: {\n conditionScript,\n ...multisig.params,\n },\n script,\n };\n }\n\n /** Return true when the tapscript is a condition + multisig tapscript. */\n export function is(tapscript: ArkTapscript<any, any>): tapscript is Type {\n return tapscript.type === TapscriptType.ConditionMultisig;\n }\n\n function getVerifyIndex(asm: ScriptType) {\n let verifyIndex = -1;\n for (let i = asm.length - 1; i >= 0; i--) {\n if (asm[i] === \"VERIFY\") {\n verifyIndex = i;\n return verifyIndex;\n }\n }\n return verifyIndex;\n }\n\n export function isScriptValid(script: Uint8Array): true | Error {\n const asm = Script.decode(script);\n\n if (asm.length < 1) {\n return new Error(`Invalid script: too short (expected at least 1)`);\n }\n\n let verifyIndex = getVerifyIndex(asm);\n\n if (verifyIndex === -1) {\n return new Error(\"Invalid script: missing VERIFY operation\");\n }\n\n return true;\n }\n}\n\n/**\n * Implements an absolute timelock (CLTV) script combined with a forfeit closure.\n * The script requires waiting until a specific block height/timestamp before the\n * forfeit closure conditions can be met.\n *\n * <locktime> CHECKLOCKTIMEVERIFY DROP <pubkey> CHECKSIGVERIFY <pubkey> CHECKSIG\n *\n * @example\n * ```typescript\n * const cltvMultisigTapscript = CLTVMultisigTapscript.encode({ absoluteTimelock: 144, pubkeys: [new Uint8Array(32), new Uint8Array(32)] });\n * ```\n */\nexport namespace CLTVMultisigTapscript {\n export type Type = ArkTapscript<TapscriptType.CLTVMultisig, Params>;\n\n export type Params = {\n absoluteTimelock: bigint;\n } & MultisigTapscript.Params;\n\n /** Encode a CLTV multisig tapscript. */\n export function encode(params: Params): Type {\n const locktime = MinimalScriptNum.encode(params.absoluteTimelock);\n const asm: ScriptType = [\n locktime.length === 1 ? locktime[0] : locktime,\n \"CHECKLOCKTIMEVERIFY\",\n \"DROP\",\n ];\n const timelockedScript = Script.encode(asm);\n\n const script = new Uint8Array([\n ...timelockedScript,\n ...MultisigTapscript.encode(params).script,\n ]);\n\n return {\n type: TapscriptType.CLTVMultisig,\n params,\n script,\n };\n }\n\n /** Decode a CLTV multisig tapscript from raw script bytes. */\n export function decode(script: Uint8Array): Type {\n if (script.length === 0) {\n throw new Error(\"Failed to decode: script is empty\");\n }\n\n const isValid = isScriptValid(script);\n if (isValid instanceof Error) {\n throw isValid;\n }\n\n const asm = Script.decode(script);\n\n const locktime = asm[0];\n if (typeof locktime === \"string\") {\n throw new Error(\"Invalid script: expected locktime number\");\n }\n\n if (asm[1] !== \"CHECKLOCKTIMEVERIFY\" || asm[2] !== \"DROP\") {\n throw new Error(\"Invalid script: expected CHECKLOCKTIMEVERIFY DROP\");\n }\n\n const multisigScript = new Uint8Array(Script.encode(asm.slice(3)));\n let multisig: MultisigTapscript.Type;\n\n try {\n multisig = MultisigTapscript.decode(multisigScript);\n } catch (error) {\n throw new Error(\n `Invalid multisig script: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n let absoluteTimelock: bigint;\n if (typeof locktime === \"number\") {\n absoluteTimelock = BigInt(locktime);\n } else {\n absoluteTimelock = MinimalScriptNum.decode(locktime as Bytes);\n }\n\n const reconstructed = encode({\n absoluteTimelock,\n ...multisig.params,\n });\n\n if (hex.encode(reconstructed.script) !== hex.encode(script)) {\n throw new Error(\"Invalid script format: script reconstruction mismatch\");\n }\n\n return {\n type: TapscriptType.CLTVMultisig,\n params: {\n absoluteTimelock,\n ...multisig.params,\n },\n script,\n };\n }\n\n /** Return true when the tapscript is a CLTV multisig tapscript. */\n export function is(tapscript: ArkTapscript<any, any>): tapscript is Type {\n return tapscript.type === TapscriptType.CLTVMultisig;\n }\n\n export function isScriptValid(script: Uint8Array): true | Error {\n const asm = Script.decode(script);\n\n if (asm.length < 3) {\n return new Error(`Invalid script: too short (expected at least 3)`);\n }\n\n const locktime = asm[0];\n if (typeof locktime === \"string\") {\n return new Error(\"Invalid script: expected locktime as number or bytes\");\n }\n\n if (asm[1] !== \"CHECKLOCKTIMEVERIFY\" || asm[2] !== \"DROP\") {\n return new Error(\"Invalid script: expected CHECKLOCKTIMEVERIFY DROP\");\n }\n\n return true;\n }\n}\n","import {\n Script,\n Address,\n p2tr,\n taprootListToTree,\n TAPROOT_UNSPENDABLE_KEY,\n NETWORK,\n} from \"@scure/btc-signer\";\nimport { TAP_LEAF_VERSION } from \"@scure/btc-signer/payment.js\";\nimport { PSBTOutput } from \"@scure/btc-signer/psbt.js\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\nimport { hex } from \"@scure/base\";\nimport { ArkAddress } from \"./address\";\nimport { timelockToSequence } from \"../utils/timelock\";\nimport {\n CLTVMultisigTapscript,\n ConditionCSVMultisigTapscript,\n CSVMultisigTapscript,\n} from \"./tapscript\";\nimport { DEFAULT_NETWORK } from \"../networks\";\n\nexport type TapLeafScript = [\n {\n version: number;\n internalKey: Bytes;\n merklePath: Bytes[];\n },\n Bytes,\n];\n\nexport const TapTreeCoder: (typeof PSBTOutput.tapTree)[2] = PSBTOutput.tapTree[2];\n\nexport function scriptFromTapLeafScript(leaf: TapLeafScript): Bytes {\n return leaf[1].subarray(0, leaf[1].length - 1); // remove the version byte\n}\n\n/**\n * VtxoScript is a script that contains a list of tapleaf scripts.\n * It is used to create virtual output scripts.\n *\n * @see ArkAddress\n *\n * @example\n * ```typescript\n * const vtxoScript = new VtxoScript([new Uint8Array(32), new Uint8Array(32)]);\n * ```\n */\nexport class VtxoScript {\n readonly leaves: TapLeafScript[];\n readonly tweakedPublicKey: Bytes;\n\n /**\n * Decode a virtual output script from an encoded TapTree.\n *\n * @param tapTree - Encoded TapTree bytes\n * @returns Decoded virtual output script\n * @throws Error if the TapTree cannot be decoded into a valid script set\n * @see encode\n */\n static decode(tapTree: Bytes): VtxoScript {\n const leaves = TapTreeCoder.decode(tapTree);\n const scripts = leaves.map((leaf) => leaf.script);\n return new VtxoScript(scripts);\n }\n\n /**\n * Create a virtual output script from its tapleaf scripts.\n *\n * @param scripts - Raw tapscript bytes for each leaf\n * @throws Error if the provided leaves cannot produce a valid Taproot tree\n */\n constructor(readonly scripts: Bytes[]) {\n // reverse the scripts if the number of scripts is odd\n // this is to be compatible with arkd algorithm computing taproot tree from list of tapscripts\n // the scripts must be reversed only HERE while we compute the tweaked public key\n // but the original order should be preserved while encoding as taptree\n // note: .slice().reverse() is used instead of .reverse() to avoid mutating the original array\n const list = scripts.length % 2 !== 0 ? scripts.slice().reverse() : scripts;\n\n const tapTree = taprootListToTree(\n list.map((script) => ({\n script,\n leafVersion: TAP_LEAF_VERSION,\n })),\n );\n\n const payment = p2tr(TAPROOT_UNSPENDABLE_KEY, tapTree, undefined, true);\n\n if (!payment.tapLeafScript || payment.tapLeafScript.length !== scripts.length) {\n throw new Error(\"invalid scripts\");\n }\n\n this.leaves = payment.tapLeafScript;\n this.tweakedPublicKey = payment.tweakedPubkey;\n }\n\n /**\n * Encode the virtual output script to a TapTree byte representation.\n *\n * @returns Encoded TapTree bytes\n * @see decode\n */\n encode(): Bytes {\n const tapTree = TapTreeCoder.encode(\n this.scripts.map((script) => ({\n depth: 1,\n version: TAP_LEAF_VERSION,\n script,\n })),\n );\n return tapTree;\n }\n\n /**\n * Build the Arkade address corresponding to this virtual output script.\n *\n * @param prefix - Bech32 human-readable prefix\n * @param serverPubKey - 32-byte Arkade server public key\n * @returns Arkade address for this script\n * @see ArkAddress\n */\n address(prefix: string = DEFAULT_NETWORK.hrp, serverPubKey: Bytes): ArkAddress {\n return new ArkAddress(serverPubKey, this.tweakedPublicKey, prefix);\n }\n\n get pkScript(): Bytes {\n return Script.encode([\"OP_1\", this.tweakedPublicKey]);\n }\n\n /**\n * Build the Taproot onchain address corresponding to this virtual output script.\n *\n * @param network - Bitcoin network descriptor\n * @returns Taproot onchain address\n * @see address\n */\n onchainAddress(network: typeof NETWORK = DEFAULT_NETWORK): string {\n return Address(network).encode({\n type: \"tr\",\n pubkey: this.tweakedPublicKey,\n });\n }\n\n /**\n * Look up a tapleaf script by its hex-encoded tapscript body.\n *\n * @param scriptHex - Hex-encoded tapscript body without the leaf version byte\n * @returns Matching tapleaf script\n * @throws Error if no matching leaf exists\n */\n findLeaf(scriptHex: string): TapLeafScript {\n const leaf = this.leaves.find(\n (leaf) => hex.encode(scriptFromTapLeafScript(leaf)) === scriptHex,\n )!;\n if (!leaf) {\n throw new Error(`leaf '${scriptHex}' not found`);\n }\n return leaf;\n }\n\n /**\n * Return all unilateral exit paths embedded in the virtual output script.\n *\n * @returns CSV-based exit paths found in the leaves\n * @see getSequence\n */\n exitPaths(): Array<CSVMultisigTapscript.Type | ConditionCSVMultisigTapscript.Type> {\n const paths: Array<CSVMultisigTapscript.Type | ConditionCSVMultisigTapscript.Type> = [];\n for (const leaf of this.leaves) {\n try {\n const script = scriptFromTapLeafScript(leaf);\n if (CSVMultisigTapscript.isScriptValid(script) === true) {\n const tapScript = CSVMultisigTapscript.decode(script);\n paths.push(tapScript);\n } else if (ConditionCSVMultisigTapscript.isScriptValid(script) === true) {\n const tapScript = ConditionCSVMultisigTapscript.decode(script);\n paths.push(tapScript);\n }\n } catch (e) {\n console.debug(\"Failed to decode script\", e);\n }\n }\n return paths;\n }\n}\n\nexport type EncodedVtxoScript = { tapTree: Bytes };\n\n/**\n * Extract the timelock value encoded in a timelocked tapleaf, if any.\n *\n * The return value is unit-ambiguous: for a CSV leaf it is a BIP-68\n * nSequence (relative timelock); for a CLTV leaf it is an absolute\n * nLockTime. Callers must know which leaf shape they are inspecting to\n * interpret the number correctly, and must not copy a CSV result into\n * `Transaction.lockTime` (or vice versa).\n *\n * @param tapLeafScript - Tapleaf script to inspect\n * @returns The encoded timelock value, or `undefined` when neither a CSV\n * nor CLTV path is present\n * @see VtxoScript.exitPaths\n */\n// TODO(next-major): return a discriminated union\n// (`{ kind: \"relative\", nSequence } | { kind: \"absolute\", lockTime }`)\n// so callers can't conflate the two. Deferred because changing the\n// return type is a breaking change.\nexport function getSequence(tapLeafScript: TapLeafScript): number | undefined {\n let sequence: number | undefined = undefined;\n\n try {\n const scriptWithLeafVersion = tapLeafScript[1];\n const script = scriptWithLeafVersion.subarray(0, scriptWithLeafVersion.length - 1);\n try {\n const params = CSVMultisigTapscript.decode(script).params;\n sequence = timelockToSequence(params.timelock);\n } catch {\n const params = CLTVMultisigTapscript.decode(script).params;\n sequence = Number(params.absoluteTimelock);\n }\n } catch {}\n\n return sequence;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/timelock.ts","../src/networks.ts","../src/script/address.ts","../src/script/tapscript.ts","../src/script/base.ts"],"names":["bip68","NETWORK","TEST_NETWORK","bech32m","Script","ScriptNum","MultisigTapscript","CSVMultisigTapscript","ConditionCSVMultisigTapscript","ConditionMultisigTapscript","CLTVMultisigTapscript","hex","MultisigType","encode","p2tr_ms","decode","PSBTOutput","taprootListToTree","TAP_LEAF_VERSION","p2tr","TAPROOT_UNSPENDABLE_KEY","Address","leaf"],"mappings":"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","file":"chunk-WMIPYZSB.cjs","sourcesContent":["import * as bip68 from \"bip68\";\nimport type { RelativeTimelock } from \"../script/tapscript\";\n\n/**\n * Convert RelativeTimelock to BIP68 sequence number.\n */\nexport function timelockToSequence(timelock: RelativeTimelock): number {\n return bip68.encode(\n timelock.type === \"blocks\"\n ? { blocks: Number(timelock.value) }\n : { seconds: Number(timelock.value) },\n );\n}\n\n/**\n * Convert BIP68 sequence number back to RelativeTimelock.\n */\nexport function sequenceToTimelock(sequence: number): RelativeTimelock {\n const decoded = bip68.decode(sequence);\n if (\"blocks\" in decoded && decoded.blocks !== undefined) {\n return { type: \"blocks\", value: BigInt(decoded.blocks) };\n }\n if (\"seconds\" in decoded && decoded.seconds !== undefined) {\n return { type: \"seconds\", value: BigInt(decoded.seconds) };\n }\n throw new Error(`Invalid BIP68 sequence: ${sequence}`);\n}\n","import { NETWORK, TEST_NETWORK } from \"@scure/btc-signer/utils.js\";\n\nexport type NetworkName = \"bitcoin\" | \"testnet\" | \"signet\" | \"mutinynet\" | \"regtest\";\n\nexport interface Network {\n hrp: string;\n bech32: string;\n pubKeyHash: number;\n scriptHash: number;\n wif: number;\n}\nexport const getNetwork = (network: NetworkName): Network => {\n return networks[network];\n};\n\nexport const networks = {\n bitcoin: withArkPrefix(NETWORK, \"ark\"),\n testnet: withArkPrefix(TEST_NETWORK, \"tark\"),\n signet: withArkPrefix(TEST_NETWORK, \"tark\"),\n mutinynet: withArkPrefix(TEST_NETWORK, \"tark\"),\n regtest: withArkPrefix(\n {\n ...TEST_NETWORK,\n bech32: \"bcrt\",\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n },\n \"tark\",\n ),\n};\n\nfunction withArkPrefix(network: Omit<Network, \"hrp\">, prefix: string): Network {\n return {\n ...network,\n hrp: prefix,\n };\n}\n\nexport const DEFAULT_ARKADE_SERVER_URL = \"https://arkade.computer\" as const;\nexport const DEFAULT_NETWORK = networks.bitcoin;\nexport const DEFAULT_NETWORK_NAME = \"bitcoin\" as const satisfies NetworkName;\n","import { bech32m } from \"@scure/base\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\nimport { Script } from \"@scure/btc-signer/script.js\";\nimport { DEFAULT_NETWORK } from \"../networks\";\n\n/**\n * ArkAddress allows creating and decoding bech32m-encoded Arkade addresses.\n *\n * An Arkade address is composed of:\n * - a human readable prefix (hrp)\n * - a version byte (1 byte)\n * - a server public key (32 bytes)\n * - a vtxo taproot public key (32 bytes)\n *\n * @remarks\n * This is an Arkade-specific address format.\n * It is distinct from the Taproot onchain address returned by `VtxoScript.onchainAddress`.\n *\n * @see VtxoScript\n *\n * @example\n * ```typescript\n * const address = new ArkAddress(\n * new Uint8Array(32), // server public key\n * new Uint8Array(32), // vtxo taproot public key\n * \"ark\"\n * );\n *\n * const encoded = address.encode();\n * console.log(\"address: \", encoded);\n *\n * const decoded = ArkAddress.decode(encoded);\n * ```\n */\nexport class ArkAddress {\n /**\n * Create an Arkade address from its server public key, Taproot output key, and prefix.\n *\n * @param serverPubKey - 32-byte Arkade server public key\n * @param vtxoTaprootKey - 32-byte Taproot output key (a.k.a. tweaked public key)\n * @param hrp - Bech32 human-readable prefix\n * @param version - Address version byte\n * @defaultValue `version = 0`\n * @throws Error if either public key is not 32 bytes long\n */\n constructor(\n readonly serverPubKey: Bytes,\n readonly vtxoTaprootKey: Bytes,\n readonly hrp: string = DEFAULT_NETWORK.hrp,\n readonly version: number = 0,\n ) {\n if (serverPubKey.length !== 32) {\n throw new Error(\n \"Invalid server public key length, expected 32 bytes, got \" + serverPubKey.length,\n );\n }\n if (vtxoTaprootKey.length !== 32) {\n throw new Error(\n \"Invalid vtxo taproot public key length, expected 32 bytes, got \" +\n vtxoTaprootKey.length,\n );\n }\n }\n\n /**\n * Decode an Arkade address from its bech32m string form.\n *\n * @param address - Bech32m-encoded Arkade address\n * @returns Decoded Arkade address\n * @throws Error if the address is malformed or has an invalid payload length\n * @see encode\n */\n static decode(address: string): ArkAddress {\n const decoded = bech32m.decodeUnsafe(address, 1023);\n if (!decoded) {\n throw new Error(\"Invalid address\");\n }\n const data = new Uint8Array(bech32m.fromWords(decoded.words));\n\n // First the version byte, then 32 bytes server pubkey, then 32 bytes vtxo taproot public key.\n if (data.length !== 1 + 32 + 32) {\n throw new Error(\"Invalid data length, expected 65 bytes, got \" + data.length);\n }\n\n const version = data[0];\n const serverPubKey = data.slice(1, 33);\n const vtxoTaprootPubKey = data.slice(33, 65);\n\n return new ArkAddress(serverPubKey, vtxoTaprootPubKey, decoded.prefix, version);\n }\n\n /**\n * Encode the address to its bech32m string form.\n *\n * @returns Bech32m-encoded Arkade address\n * @see decode\n */\n encode(): string {\n // Combine version byte, server pubkey, and vtxo taproot public key.\n const data = new Uint8Array(1 + 32 + 32);\n data[0] = this.version;\n data.set(this.serverPubKey, 1);\n data.set(this.vtxoTaprootKey, 33);\n\n const words = bech32m.toWords(data);\n return bech32m.encode(this.hrp, words, 1023);\n }\n\n /** ScriptPubKey used to send non-dust funds to the address. */\n get pkScript(): Bytes {\n return Script.encode([\"OP_1\", this.vtxoTaprootKey]);\n }\n\n /** ScriptPubKey used to send sub-dust funds to the address. */\n get subdustPkScript(): Bytes {\n return Script.encode([\"RETURN\", this.vtxoTaprootKey]);\n }\n}\n","import { Script, ScriptNum, ScriptType, p2tr_ms } from \"@scure/btc-signer\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\nimport { hex } from \"@scure/base\";\nimport { sequenceToTimelock, timelockToSequence } from \"../utils/timelock\";\n\nconst MinimalScriptNum = ScriptNum(undefined, true);\n\n/**\n * RelativeTimelock lets to create timelocked with CHECKSEQUENCEVERIFY script.\n *\n * @example\n * ```typescript\n * const timelock = { value: 144n, type: \"blocks\" }; // 1 day in blocks\n * const timelock = { value: 512n, type: \"seconds\" }; // 8 minutes in seconds\n * ```\n */\nexport type RelativeTimelock = {\n value: bigint;\n type: \"seconds\" | \"blocks\";\n};\n\nexport enum TapscriptType {\n Multisig = \"multisig\",\n CSVMultisig = \"csv-multisig\",\n ConditionCSVMultisig = \"condition-csv-multisig\",\n ConditionMultisig = \"condition-multisig\",\n CLTVMultisig = \"cltv-multisig\",\n}\n\n/**\n * ArkTapscript is the base element of vtxo scripts.\n * It is used to encode and decode the different types of vtxo scripts.\n */\nexport interface ArkTapscript<T extends TapscriptType, Params> {\n type: T;\n params: Params;\n script: Uint8Array;\n}\n\n/**\n * decodeTapscript is a function that decodes an Arkade tapscript from a raw script.\n *\n * @throws {Error} if the script is not a valid Arkade tapscript\n * @example\n * ```typescript\n * const arkTapscript = decodeTapscript(new Uint8Array(32));\n * console.log(\"type:\", arkTapscript.type);\n * ```\n */\nexport function decodeTapscript(script: Uint8Array): ArkTapscript<TapscriptType, any> {\n const types = [\n MultisigTapscript,\n CSVMultisigTapscript,\n ConditionCSVMultisigTapscript,\n ConditionMultisigTapscript,\n CLTVMultisigTapscript,\n ];\n\n for (const type of types) {\n try {\n return type.decode(script);\n } catch (error) {\n continue;\n }\n }\n\n throw new Error(`Failed to decode: script ${hex.encode(script)} is not a valid tapscript`);\n}\n\n/**\n * Implements a multi-signature tapscript.\n *\n * <pubkey> CHECKSIGVERIFY <pubkey> CHECKSIG\n *\n * @example\n * ```typescript\n * const multisigTapscript = MultisigTapscript.encode({ pubkeys: [new Uint8Array(32), new Uint8Array(32)] });\n * ```\n */\nexport namespace MultisigTapscript {\n export type Type = ArkTapscript<TapscriptType.Multisig, Params>;\n\n export enum MultisigType {\n CHECKSIG,\n CHECKSIGADD,\n }\n\n export type Params = {\n pubkeys: Bytes[];\n type?: MultisigType;\n };\n\n /** Encode a plain multisig tapscript. */\n export function encode(params: Params): Type {\n if (params.pubkeys.length === 0) {\n throw new Error(\"At least 1 pubkey is required\");\n }\n\n for (const pubkey of params.pubkeys) {\n if (pubkey.length !== 32) {\n throw new Error(`Invalid pubkey length: expected 32, got ${pubkey.length}`);\n }\n }\n\n if (!params.type) {\n params.type = MultisigType.CHECKSIG;\n }\n\n if (params.type === MultisigType.CHECKSIGADD) {\n return {\n type: TapscriptType.Multisig,\n params,\n script: p2tr_ms(params.pubkeys.length, params.pubkeys).script,\n };\n }\n\n const asm: ScriptType = [];\n for (let i = 0; i < params.pubkeys.length; i++) {\n asm.push(params.pubkeys[i]);\n\n // CHECKSIGVERIFY except the last pubkey\n if (i < params.pubkeys.length - 1) {\n asm.push(\"CHECKSIGVERIFY\");\n } else {\n asm.push(\"CHECKSIG\");\n }\n }\n\n return {\n type: TapscriptType.Multisig,\n params,\n script: Script.encode(asm),\n };\n }\n\n /** Decode a plain multisig tapscript from raw script bytes. */\n export function decode(script: Uint8Array): Type {\n if (script.length === 0) {\n throw new Error(\"Failed to decode: script is empty\");\n }\n\n try {\n // Try decoding as checksigAdd first\n return decodeChecksigAdd(script);\n } catch (error) {\n // If checksigAdd fails, try regular checksig\n try {\n return decodeChecksig(script);\n } catch (error2) {\n throw new Error(\n `Failed to decode script: ${error2 instanceof Error ? error2.message : String(error2)}`,\n );\n }\n }\n }\n\n // <pubkey> CHECKSIG <pubkey> CHECKSIGADD <len_keys> NUMEQUAL\n function decodeChecksigAdd(script: Uint8Array): Type {\n const asm = Script.decode(script);\n const pubkeys: Bytes[] = [];\n let foundNumEqual = false;\n\n // Parse through ASM operations\n for (let i = 0; i < asm.length; i++) {\n const op = asm[i];\n\n // If it's a data push, it should be a 32-byte pubkey\n if (typeof op !== \"string\" && typeof op !== \"number\") {\n if (op.length !== 32) {\n throw new Error(`Invalid pubkey length: expected 32, got ${op.length}`);\n }\n pubkeys.push(op);\n\n // Check next operation is CHECKSIGADD or CHECKSIG\n if (\n i + 1 >= asm.length ||\n (asm[i + 1] !== \"CHECKSIGADD\" && asm[i + 1] !== \"CHECKSIG\")\n ) {\n throw new Error(\"Expected CHECKSIGADD or CHECKSIG after pubkey\");\n }\n i++; // Skip the CHECKSIGADD op\n continue;\n }\n\n // Last operation should be NUMEQUAL\n if (i === asm.length - 1) {\n if (op !== \"NUMEQUAL\") {\n throw new Error(\"Expected NUMEQUAL at end of script\");\n }\n foundNumEqual = true;\n }\n }\n\n if (!foundNumEqual) {\n throw new Error(\"Missing NUMEQUAL operation\");\n }\n\n if (pubkeys.length === 0) {\n throw new Error(\"Invalid script: must have at least 1 pubkey\");\n }\n\n // Verify the script by re-encoding and comparing\n const reconstructed = encode({\n pubkeys,\n type: MultisigType.CHECKSIGADD,\n });\n if (hex.encode(reconstructed.script) !== hex.encode(script)) {\n throw new Error(\"Invalid script format: script reconstruction mismatch\");\n }\n\n return {\n type: TapscriptType.Multisig,\n params: { pubkeys, type: MultisigType.CHECKSIGADD },\n script,\n };\n }\n\n // <pubkey> CHECKSIGVERIFY <pubkey> CHECKSIG\n function decodeChecksig(script: Uint8Array): Type {\n const asm = Script.decode(script);\n const pubkeys: Bytes[] = [];\n\n // Parse through ASM operations\n for (let i = 0; i < asm.length; i++) {\n const op = asm[i];\n\n // If it's a data push, it should be a 32-byte pubkey\n if (typeof op !== \"string\" && typeof op !== \"number\") {\n if (op.length !== 32) {\n throw new Error(`Invalid pubkey length: expected 32, got ${op.length}`);\n }\n pubkeys.push(op);\n\n // Check next operation\n if (i + 1 >= asm.length) {\n throw new Error(\"Unexpected end of script\");\n }\n\n const nextOp = asm[i + 1];\n if (nextOp !== \"CHECKSIGVERIFY\" && nextOp !== \"CHECKSIG\") {\n throw new Error(\"Expected CHECKSIGVERIFY or CHECKSIG after pubkey\");\n }\n\n // Last operation must be CHECKSIG, not CHECKSIGVERIFY\n if (i === asm.length - 2 && nextOp !== \"CHECKSIG\") {\n throw new Error(\"Last operation must be CHECKSIG\");\n }\n\n i++; // Skip the CHECKSIG/CHECKSIGVERIFY op\n continue;\n }\n }\n\n if (pubkeys.length === 0) {\n throw new Error(\"Invalid script: must have at least 1 pubkey\");\n }\n\n // Verify the script by re-encoding and comparing\n const reconstructed = encode({ pubkeys, type: MultisigType.CHECKSIG });\n if (hex.encode(reconstructed.script) !== hex.encode(script)) {\n throw new Error(\"Invalid script format: script reconstruction mismatch\");\n }\n\n return {\n type: TapscriptType.Multisig,\n params: { pubkeys, type: MultisigType.CHECKSIG },\n script,\n };\n }\n\n /** Return true when the tapscript is a plain multisig tapscript. */\n export function is(tapscript: ArkTapscript<any, any>): tapscript is Type {\n return tapscript.type === TapscriptType.Multisig;\n }\n}\n\n/**\n * Implements a relative timelock script that requires all specified pubkeys to sign\n * after the relative timelock has expired. The timelock can be specified in blocks or seconds.\n *\n * This is the standard exit closure and it is also used for the sweep closure in vtxo trees.\n *\n * <sequence> CHECKSEQUENCEVERIFY DROP <pubkey> CHECKSIG\n *\n * @example\n * ```typescript\n * const csvMultisigTapscript = CSVMultisigTapscript.encode({ timelock: { type: \"blocks\", value: 144 }, pubkeys: [new Uint8Array(32), new Uint8Array(32)] });\n * ```\n */\nexport namespace CSVMultisigTapscript {\n export type Type = ArkTapscript<TapscriptType.CSVMultisig, Params>;\n\n export type Params = {\n timelock: RelativeTimelock;\n } & MultisigTapscript.Params;\n\n /** Encode a CSV multisig tapscript. */\n export function encode(params: Params): Type {\n for (const pubkey of params.pubkeys) {\n if (pubkey.length !== 32) {\n throw new Error(`Invalid pubkey length: expected 32, got ${pubkey.length}`);\n }\n }\n\n const sequence = MinimalScriptNum.encode(BigInt(timelockToSequence(params.timelock)));\n\n const asm: ScriptType = [\n sequence.length === 1 ? sequence[0] : sequence,\n \"CHECKSEQUENCEVERIFY\",\n \"DROP\",\n ];\n const multisigScript = MultisigTapscript.encode(params);\n const script = new Uint8Array([...Script.encode(asm), ...multisigScript.script]);\n\n return {\n type: TapscriptType.CSVMultisig,\n params,\n script,\n };\n }\n\n /** Decode a CSV multisig tapscript from raw script bytes. */\n export function decode(script: Uint8Array): Type {\n if (script.length === 0) {\n throw new Error(\"Failed to decode: script is empty\");\n }\n\n const isValid = isScriptValid(script);\n if (isValid instanceof Error) {\n throw isValid;\n }\n\n const asm = Script.decode(script);\n\n const sequence = asm[0];\n const multisigScript = new Uint8Array(Script.encode(asm.slice(3)));\n let multisig: MultisigTapscript.Type;\n\n try {\n multisig = MultisigTapscript.decode(multisigScript);\n } catch (error) {\n throw new Error(\n `Invalid multisig script: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n let sequenceNum: number;\n if (typeof sequence === \"number\") {\n sequenceNum = sequence;\n } else {\n sequenceNum = Number(MinimalScriptNum.decode(sequence as Uint8Array));\n }\n const timelock = sequenceToTimelock(sequenceNum);\n\n const reconstructed = encode({\n timelock,\n ...multisig.params,\n });\n\n if (hex.encode(reconstructed.script) !== hex.encode(script)) {\n throw new Error(\"Invalid script format: script reconstruction mismatch\");\n }\n\n return {\n type: TapscriptType.CSVMultisig,\n params: {\n timelock,\n ...multisig.params,\n },\n script,\n };\n }\n\n /** Return true when the tapscript is a CSV multisig tapscript. */\n export function is(tapscript: ArkTapscript<any, any>): tapscript is Type {\n return tapscript.type === TapscriptType.CSVMultisig;\n }\n\n export function isScriptValid(script: Uint8Array): true | Error {\n const asm = Script.decode(script);\n\n if (asm.length < 3) {\n return new Error(`Invalid script: too short (expected at least 3)`);\n }\n\n const sequence = asm[0];\n if (typeof sequence === \"string\") {\n return new Error(\"Invalid script: expected sequence number\");\n }\n\n if (asm[1] !== \"CHECKSEQUENCEVERIFY\" || asm[2] !== \"DROP\") {\n return new Error(\"Invalid script: expected CHECKSEQUENCEVERIFY DROP\");\n }\n\n return true;\n }\n}\n\n/**\n * Combines a condition script with an exit closure. The resulting script requires\n * the condition to be met, followed by the standard exit closure requirements\n * (timelock and signatures).\n *\n * <conditionScript> VERIFY <sequence> CHECKSEQUENCEVERIFY DROP <pubkey> CHECKSIGVERIFY <pubkey> CHECKSIG\n *\n * @example\n * ```typescript\n * const conditionCSVMultisigTapscript = ConditionCSVMultisigTapscript.encode({ conditionScript: new Uint8Array(32), pubkeys: [new Uint8Array(32), new Uint8Array(32)] });\n * ```\n */\nexport namespace ConditionCSVMultisigTapscript {\n export type Type = ArkTapscript<TapscriptType.ConditionCSVMultisig, Params>;\n\n export type Params = {\n conditionScript: Bytes;\n } & CSVMultisigTapscript.Params;\n\n /** Encode a condition + CSV multisig tapscript. */\n export function encode(params: Params): Type {\n const script = new Uint8Array([\n ...params.conditionScript,\n ...Script.encode([\"VERIFY\"]),\n ...CSVMultisigTapscript.encode(params).script,\n ]);\n\n return {\n type: TapscriptType.ConditionCSVMultisig,\n params,\n script,\n };\n }\n\n /** Decode a condition + CSV multisig tapscript from raw script bytes. */\n export function decode(script: Uint8Array): Type {\n if (script.length === 0) {\n throw new Error(\"Failed to decode: script is empty\");\n }\n\n const isValid = isScriptValid(script);\n if (isValid instanceof Error) {\n throw isValid;\n }\n\n const asm = Script.decode(script);\n\n let verifyIndex = getVerifyIndex(asm);\n\n if (verifyIndex === -1) {\n throw Error(\"Invalid script: missing VERIFY operation\");\n }\n\n const conditionScript = new Uint8Array(Script.encode(asm.slice(0, verifyIndex)));\n const csvMultisigScript = new Uint8Array(Script.encode(asm.slice(verifyIndex + 1)));\n\n let csvMultisig: CSVMultisigTapscript.Type;\n try {\n csvMultisig = CSVMultisigTapscript.decode(csvMultisigScript);\n } catch (error) {\n throw new Error(\n `Invalid CSV multisig script: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n const reconstructed = encode({\n conditionScript,\n ...csvMultisig.params,\n });\n\n if (hex.encode(reconstructed.script) !== hex.encode(script)) {\n throw new Error(\"Invalid script format: script reconstruction mismatch\");\n }\n\n return {\n type: TapscriptType.ConditionCSVMultisig,\n params: {\n conditionScript,\n ...csvMultisig.params,\n },\n script,\n };\n }\n\n /** Return true when the tapscript is a condition + CSV multisig tapscript. */\n export function is(tapscript: ArkTapscript<any, any>): tapscript is Type {\n return tapscript.type === TapscriptType.ConditionCSVMultisig;\n }\n\n function getVerifyIndex(asm: ScriptType) {\n let verifyIndex = -1;\n for (let i = asm.length - 1; i >= 0; i--) {\n if (asm[i] === \"VERIFY\") {\n verifyIndex = i;\n return verifyIndex;\n }\n }\n return verifyIndex;\n }\n\n export function isScriptValid(script: Uint8Array): true | Error {\n const asm = Script.decode(script);\n\n if (asm.length < 1) {\n return new Error(`Invalid script: too short (expected at least 1)`);\n }\n\n let verifyIndex = getVerifyIndex(asm);\n\n if (verifyIndex === -1) {\n return new Error(\"Invalid script: missing VERIFY operation\");\n }\n\n return true;\n }\n}\n\n/**\n * Combines a condition script with a forfeit closure. The resulting script requires\n * the condition to be met, followed by the standard forfeit closure requirements\n * (multi-signature).\n *\n * <conditionScript> VERIFY <pubkey> CHECKSIGVERIFY <pubkey> CHECKSIG\n *\n * @example\n * ```typescript\n * const conditionMultisigTapscript = ConditionMultisigTapscript.encode({ conditionScript: new Uint8Array(32), pubkeys: [new Uint8Array(32), new Uint8Array(32)] });\n * ```\n */\nexport namespace ConditionMultisigTapscript {\n export type Type = ArkTapscript<TapscriptType.ConditionMultisig, Params>;\n\n export type Params = {\n conditionScript: Bytes;\n } & MultisigTapscript.Params;\n\n /** Encode a condition + multisig tapscript. */\n export function encode(params: Params): Type {\n const script = new Uint8Array([\n ...params.conditionScript,\n ...Script.encode([\"VERIFY\"]),\n ...MultisigTapscript.encode(params).script,\n ]);\n\n return {\n type: TapscriptType.ConditionMultisig,\n params,\n script,\n };\n }\n\n /** Decode a condition + multisig tapscript from raw script bytes. */\n export function decode(script: Uint8Array): Type {\n if (script.length === 0) {\n throw new Error(\"Failed to decode: script is empty\");\n }\n\n const isValid = isScriptValid(script);\n if (isValid instanceof Error) {\n throw isValid;\n }\n\n const asm = Script.decode(script);\n\n let verifyIndex = getVerifyIndex(asm);\n\n if (verifyIndex === -1) {\n throw Error(\"Invalid script: missing VERIFY operation\");\n }\n\n const conditionScript = new Uint8Array(Script.encode(asm.slice(0, verifyIndex)));\n const multisigScript = new Uint8Array(Script.encode(asm.slice(verifyIndex + 1)));\n\n let multisig: MultisigTapscript.Type;\n try {\n multisig = MultisigTapscript.decode(multisigScript);\n } catch (error) {\n throw new Error(\n `Invalid multisig script: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n const reconstructed = encode({\n conditionScript,\n ...multisig.params,\n });\n\n if (hex.encode(reconstructed.script) !== hex.encode(script)) {\n throw new Error(\"Invalid script format: script reconstruction mismatch\");\n }\n\n return {\n type: TapscriptType.ConditionMultisig,\n params: {\n conditionScript,\n ...multisig.params,\n },\n script,\n };\n }\n\n /** Return true when the tapscript is a condition + multisig tapscript. */\n export function is(tapscript: ArkTapscript<any, any>): tapscript is Type {\n return tapscript.type === TapscriptType.ConditionMultisig;\n }\n\n function getVerifyIndex(asm: ScriptType) {\n let verifyIndex = -1;\n for (let i = asm.length - 1; i >= 0; i--) {\n if (asm[i] === \"VERIFY\") {\n verifyIndex = i;\n return verifyIndex;\n }\n }\n return verifyIndex;\n }\n\n export function isScriptValid(script: Uint8Array): true | Error {\n const asm = Script.decode(script);\n\n if (asm.length < 1) {\n return new Error(`Invalid script: too short (expected at least 1)`);\n }\n\n let verifyIndex = getVerifyIndex(asm);\n\n if (verifyIndex === -1) {\n return new Error(\"Invalid script: missing VERIFY operation\");\n }\n\n return true;\n }\n}\n\n/**\n * Implements an absolute timelock (CLTV) script combined with a forfeit closure.\n * The script requires waiting until a specific block height/timestamp before the\n * forfeit closure conditions can be met.\n *\n * <locktime> CHECKLOCKTIMEVERIFY DROP <pubkey> CHECKSIGVERIFY <pubkey> CHECKSIG\n *\n * @example\n * ```typescript\n * const cltvMultisigTapscript = CLTVMultisigTapscript.encode({ absoluteTimelock: 144, pubkeys: [new Uint8Array(32), new Uint8Array(32)] });\n * ```\n */\nexport namespace CLTVMultisigTapscript {\n export type Type = ArkTapscript<TapscriptType.CLTVMultisig, Params>;\n\n export type Params = {\n absoluteTimelock: bigint;\n } & MultisigTapscript.Params;\n\n /** Encode a CLTV multisig tapscript. */\n export function encode(params: Params): Type {\n const locktime = MinimalScriptNum.encode(params.absoluteTimelock);\n const asm: ScriptType = [\n locktime.length === 1 ? locktime[0] : locktime,\n \"CHECKLOCKTIMEVERIFY\",\n \"DROP\",\n ];\n const timelockedScript = Script.encode(asm);\n\n const script = new Uint8Array([\n ...timelockedScript,\n ...MultisigTapscript.encode(params).script,\n ]);\n\n return {\n type: TapscriptType.CLTVMultisig,\n params,\n script,\n };\n }\n\n /** Decode a CLTV multisig tapscript from raw script bytes. */\n export function decode(script: Uint8Array): Type {\n if (script.length === 0) {\n throw new Error(\"Failed to decode: script is empty\");\n }\n\n const isValid = isScriptValid(script);\n if (isValid instanceof Error) {\n throw isValid;\n }\n\n const asm = Script.decode(script);\n\n const locktime = asm[0];\n if (typeof locktime === \"string\") {\n throw new Error(\"Invalid script: expected locktime number\");\n }\n\n if (asm[1] !== \"CHECKLOCKTIMEVERIFY\" || asm[2] !== \"DROP\") {\n throw new Error(\"Invalid script: expected CHECKLOCKTIMEVERIFY DROP\");\n }\n\n const multisigScript = new Uint8Array(Script.encode(asm.slice(3)));\n let multisig: MultisigTapscript.Type;\n\n try {\n multisig = MultisigTapscript.decode(multisigScript);\n } catch (error) {\n throw new Error(\n `Invalid multisig script: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n let absoluteTimelock: bigint;\n if (typeof locktime === \"number\") {\n absoluteTimelock = BigInt(locktime);\n } else {\n absoluteTimelock = MinimalScriptNum.decode(locktime as Bytes);\n }\n\n const reconstructed = encode({\n absoluteTimelock,\n ...multisig.params,\n });\n\n if (hex.encode(reconstructed.script) !== hex.encode(script)) {\n throw new Error(\"Invalid script format: script reconstruction mismatch\");\n }\n\n return {\n type: TapscriptType.CLTVMultisig,\n params: {\n absoluteTimelock,\n ...multisig.params,\n },\n script,\n };\n }\n\n /** Return true when the tapscript is a CLTV multisig tapscript. */\n export function is(tapscript: ArkTapscript<any, any>): tapscript is Type {\n return tapscript.type === TapscriptType.CLTVMultisig;\n }\n\n export function isScriptValid(script: Uint8Array): true | Error {\n const asm = Script.decode(script);\n\n if (asm.length < 3) {\n return new Error(`Invalid script: too short (expected at least 3)`);\n }\n\n const locktime = asm[0];\n if (typeof locktime === \"string\") {\n return new Error(\"Invalid script: expected locktime as number or bytes\");\n }\n\n if (asm[1] !== \"CHECKLOCKTIMEVERIFY\" || asm[2] !== \"DROP\") {\n return new Error(\"Invalid script: expected CHECKLOCKTIMEVERIFY DROP\");\n }\n\n return true;\n }\n}\n","import {\n Script,\n Address,\n p2tr,\n taprootListToTree,\n TAPROOT_UNSPENDABLE_KEY,\n NETWORK,\n} from \"@scure/btc-signer\";\nimport { TAP_LEAF_VERSION } from \"@scure/btc-signer/payment.js\";\nimport { PSBTOutput } from \"@scure/btc-signer/psbt.js\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\nimport { hex } from \"@scure/base\";\nimport { ArkAddress } from \"./address\";\nimport { timelockToSequence } from \"../utils/timelock\";\nimport {\n CLTVMultisigTapscript,\n ConditionCSVMultisigTapscript,\n CSVMultisigTapscript,\n} from \"./tapscript\";\nimport { DEFAULT_NETWORK } from \"../networks\";\n\nexport type TapLeafScript = [\n {\n version: number;\n internalKey: Bytes;\n merklePath: Bytes[];\n },\n Bytes,\n];\n\nexport const TapTreeCoder: (typeof PSBTOutput.tapTree)[2] = PSBTOutput.tapTree[2];\n\nexport function scriptFromTapLeafScript(leaf: TapLeafScript): Bytes {\n return leaf[1].subarray(0, leaf[1].length - 1); // remove the version byte\n}\n\n/**\n * VtxoScript is a script that contains a list of tapleaf scripts.\n * It is used to create virtual output scripts.\n *\n * @see ArkAddress\n *\n * @example\n * ```typescript\n * const vtxoScript = new VtxoScript([new Uint8Array(32), new Uint8Array(32)]);\n * ```\n */\nexport class VtxoScript {\n readonly leaves: TapLeafScript[];\n readonly tweakedPublicKey: Bytes;\n\n /**\n * Decode a virtual output script from an encoded TapTree.\n *\n * @param tapTree - Encoded TapTree bytes\n * @returns Decoded virtual output script\n * @throws Error if the TapTree cannot be decoded into a valid script set\n * @see encode\n */\n static decode(tapTree: Bytes): VtxoScript {\n const leaves = TapTreeCoder.decode(tapTree);\n const scripts = leaves.map((leaf) => leaf.script);\n return new VtxoScript(scripts);\n }\n\n /**\n * Create a virtual output script from its tapleaf scripts.\n *\n * @param scripts - Raw tapscript bytes for each leaf\n * @throws Error if the provided leaves cannot produce a valid Taproot tree\n */\n constructor(readonly scripts: Bytes[]) {\n // reverse the scripts if the number of scripts is odd\n // this is to be compatible with arkd algorithm computing taproot tree from list of tapscripts\n // the scripts must be reversed only HERE while we compute the tweaked public key\n // but the original order should be preserved while encoding as taptree\n // note: .slice().reverse() is used instead of .reverse() to avoid mutating the original array\n const list = scripts.length % 2 !== 0 ? scripts.slice().reverse() : scripts;\n\n const tapTree = taprootListToTree(\n list.map((script) => ({\n script,\n leafVersion: TAP_LEAF_VERSION,\n })),\n );\n\n const payment = p2tr(TAPROOT_UNSPENDABLE_KEY, tapTree, undefined, true);\n\n if (!payment.tapLeafScript || payment.tapLeafScript.length !== scripts.length) {\n throw new Error(\"invalid scripts\");\n }\n\n this.leaves = payment.tapLeafScript;\n this.tweakedPublicKey = payment.tweakedPubkey;\n }\n\n /**\n * Encode the virtual output script to a TapTree byte representation.\n *\n * @returns Encoded TapTree bytes\n * @see decode\n */\n encode(): Bytes {\n const tapTree = TapTreeCoder.encode(\n this.scripts.map((script) => ({\n depth: 1,\n version: TAP_LEAF_VERSION,\n script,\n })),\n );\n return tapTree;\n }\n\n /**\n * Build the Arkade address corresponding to this virtual output script.\n *\n * @param prefix - Bech32 human-readable prefix\n * @param serverPubKey - 32-byte Arkade server public key\n * @returns Arkade address for this script\n * @see ArkAddress\n */\n address(prefix: string = DEFAULT_NETWORK.hrp, serverPubKey: Bytes): ArkAddress {\n return new ArkAddress(serverPubKey, this.tweakedPublicKey, prefix);\n }\n\n get pkScript(): Bytes {\n return Script.encode([\"OP_1\", this.tweakedPublicKey]);\n }\n\n /**\n * Build the Taproot onchain address corresponding to this virtual output script.\n *\n * @param network - Bitcoin network descriptor\n * @returns Taproot onchain address\n * @see address\n */\n onchainAddress(network: typeof NETWORK = DEFAULT_NETWORK): string {\n return Address(network).encode({\n type: \"tr\",\n pubkey: this.tweakedPublicKey,\n });\n }\n\n /**\n * Look up a tapleaf script by its hex-encoded tapscript body.\n *\n * @param scriptHex - Hex-encoded tapscript body without the leaf version byte\n * @returns Matching tapleaf script\n * @throws Error if no matching leaf exists\n */\n findLeaf(scriptHex: string): TapLeafScript {\n const leaf = this.leaves.find(\n (leaf) => hex.encode(scriptFromTapLeafScript(leaf)) === scriptHex,\n )!;\n if (!leaf) {\n throw new Error(`leaf '${scriptHex}' not found`);\n }\n return leaf;\n }\n\n /**\n * Return all unilateral exit paths embedded in the virtual output script.\n *\n * @returns CSV-based exit paths found in the leaves\n * @see getSequence\n */\n exitPaths(): Array<CSVMultisigTapscript.Type | ConditionCSVMultisigTapscript.Type> {\n const paths: Array<CSVMultisigTapscript.Type | ConditionCSVMultisigTapscript.Type> = [];\n for (const leaf of this.leaves) {\n try {\n const script = scriptFromTapLeafScript(leaf);\n if (CSVMultisigTapscript.isScriptValid(script) === true) {\n const tapScript = CSVMultisigTapscript.decode(script);\n paths.push(tapScript);\n } else if (ConditionCSVMultisigTapscript.isScriptValid(script) === true) {\n const tapScript = ConditionCSVMultisigTapscript.decode(script);\n paths.push(tapScript);\n }\n } catch (e) {\n console.debug(\"Failed to decode script\", e);\n }\n }\n return paths;\n }\n}\n\nexport type EncodedVtxoScript = { tapTree: Bytes };\n\n/**\n * Extract the timelock value encoded in a timelocked tapleaf, if any.\n *\n * The return value is unit-ambiguous: for a CSV leaf it is a BIP-68\n * nSequence (relative timelock); for a CLTV leaf it is an absolute\n * nLockTime. Callers must know which leaf shape they are inspecting to\n * interpret the number correctly, and must not copy a CSV result into\n * `Transaction.lockTime` (or vice versa).\n *\n * @param tapLeafScript - Tapleaf script to inspect\n * @returns The encoded timelock value, or `undefined` when neither a CSV\n * nor CLTV path is present\n * @see VtxoScript.exitPaths\n */\n// TODO(next-major): return a discriminated union\n// (`{ kind: \"relative\", nSequence } | { kind: \"absolute\", lockTime }`)\n// so callers can't conflate the two. Deferred because changing the\n// return type is a breaking change.\nexport function getSequence(tapLeafScript: TapLeafScript): number | undefined {\n let sequence: number | undefined = undefined;\n\n try {\n const scriptWithLeafVersion = tapLeafScript[1];\n const script = scriptWithLeafVersion.subarray(0, scriptWithLeafVersion.length - 1);\n try {\n const params = CSVMultisigTapscript.decode(script).params;\n sequence = timelockToSequence(params.timelock);\n } catch {\n const params = CLTVMultisigTapscript.decode(script).params;\n sequence = Number(params.absoluteTimelock);\n }\n } catch {}\n\n return sequence;\n}\n"]}