@arkade-os/sdk 0.4.63 → 0.4.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/expo.cjs +5 -5
- package/dist/adapters/expo.js +3 -3
- package/dist/adapters/indexedDB.cjs +5 -5
- package/dist/adapters/indexedDB.js +4 -4
- package/dist/{asyncStorageTaskQueue-CIUEhv2t.d.cts → asyncStorageTaskQueue-Chwe60Ce.d.cts} +2 -2
- package/dist/{asyncStorageTaskQueue-LT-xvvDN.d.ts → asyncStorageTaskQueue-Dq_UcvDx.d.ts} +2 -2
- package/dist/{chunk-K56BNZV3.cjs → chunk-35YIP6OA.cjs} +10 -10
- package/dist/{chunk-K56BNZV3.cjs.map → chunk-35YIP6OA.cjs.map} +1 -1
- package/dist/{chunk-P6XYE27K.cjs → chunk-4N45WCSJ.cjs} +17 -17
- package/dist/{chunk-P6XYE27K.cjs.map → chunk-4N45WCSJ.cjs.map} +1 -1
- package/dist/{chunk-AB67CMHS.cjs → chunk-FZFSGOTZ.cjs} +3 -3
- package/dist/{chunk-AB67CMHS.cjs.map → chunk-FZFSGOTZ.cjs.map} +1 -1
- package/dist/{chunk-CZFAMS57.js → chunk-HQ2DDMQN.js} +3 -3
- package/dist/{chunk-CZFAMS57.js.map → chunk-HQ2DDMQN.js.map} +1 -1
- package/dist/{chunk-OAESYVZQ.js → chunk-LN2VZP63.js} +3 -3
- package/dist/{chunk-OAESYVZQ.js.map → chunk-LN2VZP63.js.map} +1 -1
- package/dist/{chunk-COOBS7ET.cjs → chunk-LPEE2H2M.cjs} +401 -401
- package/dist/{chunk-COOBS7ET.cjs.map → chunk-LPEE2H2M.cjs.map} +1 -1
- package/dist/{chunk-LG5GY73A.cjs → chunk-RXITDAV4.cjs} +17 -17
- package/dist/{chunk-LG5GY73A.cjs.map → chunk-RXITDAV4.cjs.map} +1 -1
- package/dist/{chunk-KWW74O2F.js → chunk-USXWE2EJ.js} +4 -4
- package/dist/{chunk-KWW74O2F.js.map → chunk-USXWE2EJ.js.map} +1 -1
- package/dist/{chunk-X7MMBB7S.js → chunk-WJN2BLEI.js} +5 -5
- package/dist/{chunk-X7MMBB7S.js.map → chunk-WJN2BLEI.js.map} +1 -1
- package/dist/{chunk-OL7V43WS.cjs → chunk-WXCVS6PD.cjs} +48 -48
- package/dist/{chunk-OL7V43WS.cjs.map → chunk-WXCVS6PD.cjs.map} +1 -1
- package/dist/{chunk-MA32NXUV.js → chunk-XJCBV4AA.js} +3 -3
- package/dist/{chunk-MA32NXUV.js.map → chunk-XJCBV4AA.js.map} +1 -1
- package/dist/{chunk-FKKERGKA.js → chunk-ZUEGFM3T.js} +4 -4
- package/dist/{chunk-FKKERGKA.js.map → chunk-ZUEGFM3T.js.map} +1 -1
- package/dist/contracts/handlers/index.cjs +9 -9
- package/dist/contracts/handlers/index.js +2 -2
- package/dist/index.cjs +268 -268
- package/dist/index.js +4 -4
- package/dist/repositories/realm/index.cjs +19 -19
- package/dist/repositories/realm/index.js +5 -5
- package/dist/repositories/sqlite/index.cjs +18 -18
- package/dist/repositories/sqlite/index.js +5 -5
- package/dist/{taskRunner-BQb0W1XG.d.ts → taskRunner-BDzWbpct.d.ts} +1 -1
- package/dist/{taskRunner-BJ6_AnLq.d.cts → taskRunner-CIKOS2OO.d.cts} +1 -1
- package/dist/wallet/expo/background.cjs +14 -14
- package/dist/wallet/expo/background.d.cts +2 -2
- package/dist/wallet/expo/background.d.ts +2 -2
- package/dist/wallet/expo/background.js +6 -6
- package/dist/wallet/expo/index.cjs +14 -14
- package/dist/wallet/expo/index.d.cts +1 -1
- package/dist/wallet/expo/index.d.ts +1 -1
- package/dist/wallet/expo/index.js +5 -5
- package/dist/worker/expo/index.cjs +9 -9
- package/dist/worker/expo/index.d.cts +3 -3
- package/dist/worker/expo/index.d.ts +3 -3
- package/dist/worker/expo/index.js +5 -5
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/transaction.ts","../src/utils/timelock.ts","../src/utils/unknownFields.ts","../src/networks.ts","../src/script/address.ts","../src/script/tapscript.ts","../src/script/taprootTree.ts","../src/script/base.ts","../src/providers/eventSource.ts","../package.json","../src/utils/fetch.ts","../src/providers/errors.ts","../src/intent/index.ts","../src/providers/utils.ts","../src/providers/rateGate.ts","../src/providers/ark.ts","../src/providers/availability.ts","../src/contracts/constants.ts","../src/wallet/vtxo.ts"],"names":["BtcSignerTransaction","bip68","ArkPsbtFieldKey","RawWitness","ScriptNum","NETWORK","TEST_NETWORK","version","bech32m","Script","MultisigTapscript","CSVMultisigTapscript","ConditionCSVMultisigTapscript","ConditionMultisigTapscript","CLTVMultisigTapscript","hex","MultisigType","encode","p2tr_ms","decode","TAP_LEAF_VERSION","PSBTOutput","p2tr","TAPROOT_UNSPENDABLE_KEY","Address","leaf","Intent","OP","SigHash","schnorr","SettlementEventType"],"mappings":"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","file":"chunk-AB67CMHS.cjs","sourcesContent":["import { Transaction as BtcSignerTransaction } from \"@scure/btc-signer\";\nimport { TxOpts } from \"@scure/btc-signer/transaction.js\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\n\n/**\n * Transaction is a wrapper around the @scure/btc-signer Transaction class.\n * It adds the Arkade protocol specific options to the transaction.\n */\nexport class Transaction extends BtcSignerTransaction {\n static ARK_TX_OPTS: TxOpts = {\n allowUnknown: true,\n allowUnknownOutputs: true,\n allowUnknownInputs: true,\n };\n\n constructor(opts?: TxOpts) {\n super(withArkOpts(opts));\n }\n\n static fromPSBT(psbt_: Bytes, opts?: TxOpts): Transaction {\n return BtcSignerTransaction.fromPSBT(psbt_, withArkOpts(opts));\n }\n\n static fromRaw(raw: Bytes, opts?: TxOpts): Transaction {\n return BtcSignerTransaction.fromRaw(raw, withArkOpts(opts));\n }\n}\n\nfunction withArkOpts(opts?: TxOpts): TxOpts {\n return { ...Transaction.ARK_TX_OPTS, ...opts };\n}\n","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 { RawWitness, ScriptNum, Transaction } from \"@scure/btc-signer\";\nimport { TransactionInputUpdate } from \"@scure/btc-signer/psbt.js\";\nimport { sequenceToTimelock } from \"./timelock\";\n\n/**\n * ArkPsbtFieldKey are the available key names for the Arkade PSBT custom fields.\n */\nexport enum ArkPsbtFieldKey {\n VtxoTaprootTree = \"taptree\",\n VtxoTreeExpiry = \"expiry\",\n Cosigner = \"cosigner\",\n ConditionWitness = \"condition\",\n PrevArkTx = \"prevarktx\",\n PrevoutTx = \"prevouttx\",\n}\n\n/**\n * ArkPsbtFieldKeyType is the key type of the Arkade PSBT custom field.\n * Every Arkade PSBT field has key type 222.\n */\nexport const ArkPsbtFieldKeyType = 222;\n\n/**\n * ArkPsbtFieldCoder is the coder for the Arkade PSBT custom fields.\n * Each type has its own coder.\n */\nexport interface ArkPsbtFieldCoder<T> {\n key: ArkPsbtFieldKey;\n encode: (value: T) => NonNullable<TransactionInputUpdate[\"unknown\"]>[number];\n decode: (value: NonNullable<TransactionInputUpdate[\"unknown\"]>[number]) => T | null;\n}\n\n/**\n * setArkPsbtField appends a new unknown field to the input at inputIndex\n *\n * @example\n * ```typescript\n * setArkPsbtField(tx, 0, VtxoTaprootTree, myTaprootTree);\n * setArkPsbtField(tx, 0, VtxoTreeExpiry, myVtxoTreeExpiry);\n * ```\n */\nexport function setArkPsbtField<T>(\n tx: Transaction,\n inputIndex: number,\n coder: ArkPsbtFieldCoder<T>,\n value: T,\n): void {\n tx.updateInput(inputIndex, {\n unknown: [...(tx.getInput(inputIndex)?.unknown ?? []), coder.encode(value)],\n });\n}\n\n/**\n * getArkPsbtFields returns all the values of the given coder for the input at inputIndex\n * Multiple fields of the same type can exist in a single input.\n *\n * @example\n * ```typescript\n * const vtxoTaprootTreeFields = getArkPsbtFields(tx, 0, VtxoTaprootTree);\n * console.log(`input has ${vtxoTaprootTreeFields.length} vtxoTaprootTree fields`);\n */\nexport function getArkPsbtFields<T>(\n tx: Transaction,\n inputIndex: number,\n coder: ArkPsbtFieldCoder<T>,\n): T[] {\n const unknown = tx.getInput(inputIndex)?.unknown ?? [];\n\n const fields: T[] = [];\n for (const u of unknown) {\n const v = coder.decode(u);\n if (v !== null) fields.push(v);\n }\n return fields;\n}\n\n/**\n * VtxoTaprootTree is set to pass all spending leaves of the vtxo input\n *\n * @example\n * ```typescript\n * const vtxoTaprootTree = VtxoTaprootTree.encode(myTaprootTree);\n */\nexport const VtxoTaprootTree: ArkPsbtFieldCoder<Uint8Array> = {\n key: ArkPsbtFieldKey.VtxoTaprootTree,\n encode: (value) => [\n {\n type: ArkPsbtFieldKeyType,\n key: encodedPsbtFieldKey[ArkPsbtFieldKey.VtxoTaprootTree],\n },\n value,\n ],\n decode: (value) =>\n nullIfCatch(() => {\n if (!checkKeyMatch(value[0], ArkPsbtFieldKey.VtxoTaprootTree)) return null;\n return value[1];\n }),\n};\n\n/**\n * ConditionWitness is set to pass the witness data used to finalize the conditionMultisigClosure\n *\n * @example\n * ```typescript\n * const conditionWitness = ConditionWitness.encode(myConditionWitness);\n */\nexport const ConditionWitness: ArkPsbtFieldCoder<Uint8Array[]> = {\n key: ArkPsbtFieldKey.ConditionWitness,\n encode: (value) => [\n {\n type: ArkPsbtFieldKeyType,\n key: encodedPsbtFieldKey[ArkPsbtFieldKey.ConditionWitness],\n },\n RawWitness.encode(value),\n ],\n decode: (value) =>\n nullIfCatch(() => {\n if (!checkKeyMatch(value[0], ArkPsbtFieldKey.ConditionWitness)) return null;\n return RawWitness.decode(value[1]);\n }),\n};\n\n/**\n * PrevArkTxField carries the serialized raw bitcoin tx of the previous Ark tx\n * spent by an input. Used by OP_INSPECTINPUTSCRIPTPUBKEY on intent proofs and\n * other contexts where the prevout pkScript must be looked up off-chain.\n *\n * Key: [0xde] || \"prevarktx\". Value: serialized wire.MsgTx (NOT a PSBT).\n */\nexport const PrevArkTxField: ArkPsbtFieldCoder<Uint8Array> = {\n key: ArkPsbtFieldKey.PrevArkTx,\n encode: (value) => [\n {\n type: ArkPsbtFieldKeyType,\n key: encodedPsbtFieldKey[ArkPsbtFieldKey.PrevArkTx],\n },\n value,\n ],\n decode: (value) =>\n nullIfCatch(() => {\n if (!checkKeyMatch(value[0], ArkPsbtFieldKey.PrevArkTx)) return null;\n return value[1];\n }),\n};\n\n/**\n * PrevoutTxField carries the serialized raw bitcoin tx that produced the\n * previous output spent by an input. Used by OP_INSPECTINPUTSCRIPTPUBKEY in\n * the SubmitOnchainTx flow, where there is no Ark tx but a plain Bitcoin\n * funding tx whose pkScript must be resolvable.\n *\n * Key: [0xde] || \"prevouttx\". Value: serialized wire.MsgTx (NOT a PSBT).\n */\nexport const PrevoutTxField: ArkPsbtFieldCoder<Uint8Array> = {\n key: ArkPsbtFieldKey.PrevoutTx,\n encode: (value) => [\n {\n type: ArkPsbtFieldKeyType,\n key: encodedPsbtFieldKey[ArkPsbtFieldKey.PrevoutTx],\n },\n value,\n ],\n decode: (value) =>\n nullIfCatch(() => {\n if (!checkKeyMatch(value[0], ArkPsbtFieldKey.PrevoutTx)) return null;\n return value[1];\n }),\n};\n\n/**\n * CosignerPublicKey is set on every TxGraph transactions to identify the musig2 public keys\n *\n * @example\n * ```typescript\n * const cosignerPublicKey = CosignerPublicKey.encode(myCosignerPublicKey);\n */\nexport const CosignerPublicKey: ArkPsbtFieldCoder<{\n index: number;\n key: Uint8Array;\n}> = {\n key: ArkPsbtFieldKey.Cosigner,\n encode: (value) => [\n {\n type: ArkPsbtFieldKeyType,\n key: new Uint8Array([...encodedPsbtFieldKey[ArkPsbtFieldKey.Cosigner], value.index]),\n },\n value.key,\n ],\n decode: (unknown) =>\n nullIfCatch(() => {\n if (!checkKeyMatch(unknown[0], ArkPsbtFieldKey.Cosigner, true)) return null;\n return {\n index: unknown[0].key[unknown[0].key.length - 1],\n key: unknown[1],\n };\n }),\n};\n\n/**\n * VtxoTreeExpiry is set to pass the expiry time of the input\n *\n * @example\n * ```typescript\n * const vtxoTreeExpiry = VtxoTreeExpiry.encode(myVtxoTreeExpiry);\n */\nexport const VtxoTreeExpiry: ArkPsbtFieldCoder<{\n type: \"blocks\" | \"seconds\";\n value: bigint;\n}> = {\n key: ArkPsbtFieldKey.VtxoTreeExpiry,\n encode: (value) => [\n {\n type: ArkPsbtFieldKeyType,\n key: encodedPsbtFieldKey[ArkPsbtFieldKey.VtxoTreeExpiry],\n },\n ScriptNum(6, true).encode(value.value === 0n ? 0n : value.value),\n ],\n decode: (unknown) =>\n nullIfCatch(() => {\n if (!checkKeyMatch(unknown[0], ArkPsbtFieldKey.VtxoTreeExpiry)) return null;\n const v = ScriptNum(6, true).decode(unknown[1]);\n if (!v) return null;\n return sequenceToTimelock(Number(v));\n }),\n};\n\nconst encodedPsbtFieldKey: Record<string, Uint8Array> = Object.fromEntries(\n Object.values(ArkPsbtFieldKey).map((key) => [key, new TextEncoder().encode(key)]),\n);\n\nconst nullIfCatch = <T>(fn: () => T): T | null => {\n try {\n return fn();\n } catch {\n return null;\n }\n};\n\nfunction checkKeyMatch(\n key: { type: number; key: Uint8Array },\n arkPsbtFieldKey: ArkPsbtFieldKey,\n prefixOnly: boolean = false,\n): boolean {\n if (key.type !== ArkPsbtFieldKeyType) return false;\n const expected = encodedPsbtFieldKey[arkPsbtFieldKey];\n if (key.key.length < expected.length) return false;\n if (!prefixOnly && key.key.length !== expected.length) return false;\n for (let i = 0; i < expected.length; i++) {\n if (key.key[i] !== expected[i]) return false;\n }\n return true;\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 /**\n * Canonical name this network was resolved from, when known.\n *\n * `bech32` cannot separate the tb-family — testnet, signet and mutinynet\n * share every field above — so anything that has to tell them apart (a\n * per-network timelock floor, for one) has no other handle. Optional\n * because a hand-built `Network` carries no name: consumers must read a\n * missing one as \"unknown\" and fall back to their strictest branch rather\n * than guess at one.\n */\n name?: NetworkName;\n}\nexport const getNetwork = (network: NetworkName): Network => {\n const found = networks[network];\n // Fail closed: an unknown network must never silently fall through to\n // mainnet params (e.g. via Address()'s default) when validating addresses.\n if (!found) throw new Error(`Unsupported network: ${network}`);\n return found;\n};\n\nexport const networks = {\n bitcoin: withArkPrefix(NETWORK, \"ark\", \"bitcoin\"),\n testnet: withArkPrefix(TEST_NETWORK, \"tark\", \"testnet\"),\n signet: withArkPrefix(TEST_NETWORK, \"tark\", \"signet\"),\n mutinynet: withArkPrefix(TEST_NETWORK, \"tark\", \"mutinynet\"),\n regtest: withArkPrefix(\n {\n ...TEST_NETWORK,\n bech32: \"bcrt\",\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n },\n \"tark\",\n \"regtest\",\n ),\n};\n\nfunction withArkPrefix(\n network: Omit<Network, \"hrp\" | \"name\">,\n prefix: string,\n name: NetworkName,\n): Network {\n return {\n ...network,\n hrp: prefix,\n name,\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\n/**\n * 33-byte compressed secp256k1 point, lowercase hex.\n *\n * Compressed rather than the 32-byte x-only form, for two reasons that are not\n * about the covenant leaf. The leaf itself is indifferent:\n * `computeArkadeScriptPublicKey` truncates by length and `lift_x`es, so a\n * compressed key and its x-only tail tweak to the same point — even for an\n * odd-Y (`03`) key like mutinynet's.\n *\n * What decides it is that compressed is the lossless form and the one actually\n * on the wire. The emulator's `/v1/info` returns `signerPubkey` compressed and\n * `Arkade.connect` keeps all 33 bytes of it (unlike the Arkade server key on\n * the line above, which it slices), so a value pinned here in compressed form\n * is byte-identical to what a live fetch yields and can substitute for it\n * directly. Going the other way is a one-way door: x-only can always be\n * recovered by dropping the prefix, but the parity bit cannot be recovered\n * from x-only. Consumers that need 32 bytes — the Arkade Intents offer TLV,\n * for one — already normalize at their own boundary.\n */\nconst COMPRESSED_PUBKEY = /^0[23][0-9a-f]{64}$/;\n\n/** Covenant co-signer (\"emulator\") for the mainnet Arkade deployment. */\nexport const BITCOIN_EMULATOR_PUBKEY =\n \"0239c196415da47b26456a101daaa12ba9e445bfe153197f1e2b750bf40e52092e\" as const;\n\n/** Covenant co-signer (\"emulator\") for the hosted mutinynet Arkade deployment. */\nexport const MUTINYNET_EMULATOR_PUBKEY =\n \"03f823b9b2febc81f4af967e77aed2f541cbd3397c6d8f5a72e32eb7b471af889a\" as const;\n\n/** Covenant co-signer (\"emulator\") shipped with the `arkade-regtest` stack. */\nexport const REGTEST_EMULATOR_PUBKEY =\n \"02999413c46fa10ada5cbc4bcc79a1d09160c2ba3cfc812705d7a13e5e545fb2a9\" as const;\n\n/**\n * The covenant co-signer each network's Arkade deployment runs.\n *\n * This is a property of the NETWORK, not of whoever happens to be talking to\n * it: every participant building a covenant contract on one network co-signs\n * with the same key, so carrying a per-deployment copy of it can only ever\n * introduce disagreement — two peers on one network advertising two keys is a\n * misconfiguration nothing downstream is positioned to catch.\n *\n * `testnet` and `signet` are absent because no emulator is deployed for them;\n * they resolve to a throw rather than to a neighbouring network's key.\n */\nconst EMULATOR_PUBKEYS: Partial<Record<NetworkName, string>> = {\n bitcoin: BITCOIN_EMULATOR_PUBKEY,\n mutinynet: MUTINYNET_EMULATOR_PUBKEY,\n regtest: REGTEST_EMULATOR_PUBKEY,\n};\n\n/**\n * The pinned co-signer key for `network`, as 33-byte compressed lowercase hex.\n *\n * @throws if the network carries no name, or names one with no deployed\n * emulator. Fail closed on both counts: the return value ends up in a\n * covenant leaf that decides who can move the funds, so there is no\n * defensible fallback. Guessing a neighbour's key (the tb-family share every\n * other field on {@link Network}) would build a leaf co-signed by a service\n * that will never sign for it — funds locked to a key nobody holds — and\n * returning an empty string just moves the same failure somewhere harder to\n * read. A hand-assembled `Network` carries no `name` and lands here too,\n * matching how the per-network timelock floors treat an unnamed network.\n *\n * Deliberately NOT falling back to whatever key the emulator reports about\n * itself: that is the self-report this pin exists to stop trusting, and doing\n * it only on unpinned networks would make the guarantee depend on\n * `network.name` with no signal to the caller that it had lapsed. The\n * unnamed case is the sharp one — a hand-built `Network` can carry\n * bitcoin-equivalent parameters, so a silent fallback would drop to\n * \"trust the endpoint\" on exactly the input that looks most like mainnet.\n * Callers who mean it pass {@link resolveEmulatorPubkey}'s override, which\n * the thrown message names.\n */\nexport function defaultEmulatorPubkey(network: Network): string {\n const pinned = network.name ? EMULATOR_PUBKEYS[network.name] : undefined;\n if (!pinned) {\n // Name the remedy, not just the refusal. Whoever hits this usually has\n // a working emulator in front of them, so a bare \"not pinned\" reads as\n // the SDK being broken rather than as one argument being missing.\n const cause = network.name\n ? `no emulator is deployed for ${network.name}`\n : `this Network carries no name, so it cannot be matched ` +\n `(build it with getNetwork(...) rather than by hand)`;\n throw new Error(\n `No emulator co-signer key is pinned for this network: ${cause}; ` +\n `pass emulatorPubkey: \"<33-byte compressed hex>\" to Arkade.connect to ` +\n `co-sign with your own emulator instead. Pinned networks: ` +\n `${Object.keys(EMULATOR_PUBKEYS).join(\", \")}`,\n );\n }\n return pinned;\n}\n\n/**\n * Resolve the co-signer key for `network`, letting a caller substitute its own.\n *\n * The override is the escape hatch for three situations, and the first is the\n * one that matters operationally:\n *\n * 1. **A network rotated its emulator key and this SDK has not shipped the new\n * constant yet.** Since `Arkade.connect` no longer asks the service which\n * key it signs with, a rotation is invisible here until the constant is\n * updated — covenants keep building against the retired key and fail only\n * when a claim is attempted. Passing the new key restores service without\n * waiting for a release, so a rotation is a config change rather than an\n * outage.\n * 2. A private or self-hosted emulator, including on a network with no pinned\n * key at all (signet, testnet, a hand-built `Network`).\n * 3. Tests and local stacks.\n *\n * Supplying it means co-signing with a different service: every covenant built\n * from the returned key can be completed by whoever holds it and by no one\n * else, so it is a statement that you trust that operator in place of the\n * network's. Prefer {@link defaultEmulatorPubkey} unless that is deliberate.\n *\n * A malformed override throws rather than being passed through — a typo here\n * would otherwise surface as an unspendable contract long after the fact.\n */\nexport function resolveEmulatorPubkey(network: Network, override?: string): string {\n if (override === undefined) return defaultEmulatorPubkey(network);\n if (!COMPRESSED_PUBKEY.test(override)) {\n throw new Error(\n `Emulator pubkey override must be 33-byte compressed secp256k1 hex ` +\n `(66 lowercase chars, 02/03 prefix), got ${JSON.stringify(override)}.`,\n );\n }\n return override;\n}\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 { TAP_LEAF_VERSION } from \"@scure/btc-signer/payment.js\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\n\n/**\n * A leaf node in the Taproot script tree, as consumed by\n * `@scure/btc-signer`'s `p2tr(internalKey, tree, ...)`.\n */\nexport interface TaprootLeaf {\n script: Bytes;\n leafVersion: number;\n}\n\n/**\n * Internal tree node shape consumed by `@scure/btc-signer`'s `p2tr`:\n * - A leaf is `{ script, leafVersion }`\n * - A branch is a 2-element tuple `[leftNode, rightNode]` of nodes\n */\nexport type TaprootTreeNode = TaprootLeaf | [TaprootTreeNode, TaprootTreeNode];\n\n/**\n * Assemble a Taproot script tree from a flat list of scripts using the\n * exact algorithm arkd's btcd dependency uses\n * (`txscript.AssembleTaprootScriptTree`, see\n * https://github.com/btcsuite/btcd/blob/master/txscript/taproot.go).\n *\n * The algorithm:\n *\n * Phase 1 — pair leaves left-to-right:\n * for i := 0; i < len(leaves); i += 2:\n * if i is the last index (odd leaf at end):\n * merge with the LAST branch built so far (do NOT pair as a fresh leaf)\n * else:\n * create a new branch from (leaves[i], leaves[i+1])\n *\n * Phase 2 — FIFO-queue merge branches:\n * while branches has ≥ 2 items:\n * take front two, combine into a new branch, push to back of queue\n *\n * This matters because `@scure/btc-signer`'s `taprootListToTree` builds a\n * Huffman tree (weight-1 leaves combine by smallest-weight pairs). For\n * power-of-2 leaf counts both algorithms happen to produce the same\n * perfectly-balanced binary tree and agree. For any other count they\n * produce DIFFERENT shapes → different merkle roots → different taproot\n * output keys → arkd rejects spends with `INVALID_PSBT_INPUT`.\n *\n * Reproducing btcd's algorithm here lets the SDK construct taptrees that\n * arkd accepts for arbitrary leaf counts.\n *\n * @param scripts - Raw tapscript bytes for each leaf, in the order they\n * should be encoded in the TapTree PSBT field.\n * @returns The nested-tuple form `p2tr` accepts.\n */\nexport function assembleBtcdTaprootTree(scripts: Bytes[]): TaprootTreeNode {\n if (scripts.length === 0) {\n throw new Error(\"assembleBtcdTaprootTree: empty scripts list\");\n }\n\n const leaves: TaprootLeaf[] = scripts.map((script) => ({\n script,\n leafVersion: TAP_LEAF_VERSION,\n }));\n\n if (leaves.length === 1) {\n return leaves[0];\n }\n\n // ── Phase 1: pair leaves left-to-right ─────────────────────────────\n const branches: TaprootTreeNode[] = [];\n for (let i = 0; i < leaves.length; i += 2) {\n if (i === leaves.length - 1) {\n // Odd leaf at end: merge into the LAST branch built so far.\n // Mirrors btcd's\n // branches[len(branches)-1] = NewTapBranch(branchToMerge, leaf)\n const last = branches.pop();\n if (last === undefined) {\n // Defensive — caller should have provided ≥ 2 leaves.\n throw new Error(\n `assembleBtcdTaprootTree: unexpected odd leaf at i=${i} with no prior branch`,\n );\n }\n branches.push([last, leaves[i]]);\n } else {\n // Pair two consecutive leaves into a new branch.\n branches.push([leaves[i], leaves[i + 1]]);\n }\n }\n\n // ── Phase 2: FIFO-queue merge branches ─────────────────────────────\n // Take front two, combine, push to back. Stops when one branch remains.\n while (branches.length >= 2) {\n const left = branches.shift()!;\n const right = branches.shift()!;\n branches.push([left, right]);\n }\n\n return branches[0];\n}\n","import { Address, p2tr, TAPROOT_UNSPENDABLE_KEY, NETWORK } 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 { assembleBtcdTaprootTree } from \"./taprootTree\";\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 readonly pkScript: 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 * The Taproot script tree is assembled using btcd's algorithm\n * (`txscript.AssembleTaprootScriptTree`) so the derived taproot output\n * key agrees with arkd for any leaf count. `@scure/btc-signer`'s\n * default `taprootListToTree` is a Huffman builder that only agrees\n * with arkd for power-of-2 leaf counts.\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 const tapTree = assembleBtcdTaprootTree(scripts);\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 this.pkScript = payment.script;\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 /**\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","/**\n * Where the SDK gets its `EventSource`.\n *\n * Every server-sent-events stream this SDK opens — settlement events, the tx\n * feed, the indexer script subscription — needs one, and until now each site\n * reached for the global. That works in browsers and, via\n * {@link ExpoArkProvider}/{@link ExpoIndexerProvider}, in React Native. It does\n * NOT work in Node, which exposes `EventSource` only behind\n * `--experimental-eventsource` (24.x) — so a CLI, a server-side wallet or a\n * background worker got a `ReferenceError` out of the stream and everything\n * event-driven degraded to whatever polling happened to be running.\n *\n * Resolution order, per call: an explicit per-provider factory, then whatever\n * {@link configureEventSource} was given, then the global. When none answers,\n * {@link resolveEventSource} throws {@link EventSourceUnavailableError} rather\n * than a bare `ReferenceError`, so callers can tell \"this environment has no\n * SSE\" from \"the connection dropped\" — a distinction that matters, because the\n * first is not worth reconnecting for and the second is.\n */\n\n/**\n * The slice of `EventSource` this SDK actually uses.\n *\n * Structural rather than the DOM type on purpose: Node's `eventsource` package\n * and the React Native polyfills are not DOM `EventSource`s, and demanding one\n * made every consumer launder a perfectly capable object through\n * `as unknown as EventSource` — a cast that hides real mismatches as readily as\n * it waves through this one.\n */\nexport interface EventSourceLike {\n addEventListener(type: \"message\" | \"error\", listener: (event: MessageEvent) => void): void;\n removeEventListener(type: \"message\" | \"error\", listener: (event: MessageEvent) => void): void;\n close(): void;\n}\n\n/** Opens an SSE connection to `url`. `new EventSource(url)`, as a value. */\nexport type EventSourceFactory = (url: string) => EventSourceLike;\n\n/** Options shared by every provider that opens an SSE stream. */\nexport interface EventSourceCapable {\n /**\n * Where this provider gets its `EventSource`, overriding\n * {@link configureEventSource} and the global. Use it when one process\n * needs different transports per connection; otherwise configure once.\n */\n eventSource?: EventSourceFactory;\n}\n\nconst GUIDANCE =\n \"Pass one with configureEventSource(url => new EventSource(url)) — in Node, from the \" +\n \"`eventsource` package or by running with --experimental-eventsource. In React Native, \" +\n \"use ExpoArkProvider / ExpoIndexerProvider instead.\";\n\n/**\n * No `EventSource` could be resolved, so no SSE stream can be opened.\n *\n * A property of the environment, not of the connection: retrying cannot fix it,\n * which is why {@link ContractWatcher} reports it once and stops reconnecting\n * instead of looping on it.\n */\nexport class EventSourceUnavailableError extends Error {\n constructor() {\n super(`no EventSource is available, so server-sent events cannot be opened. ${GUIDANCE}`);\n this.name = \"EventSourceUnavailableError\";\n }\n}\n\n/**\n * Type guard for {@link EventSourceUnavailableError}.\n *\n * Falls back to the `name` because a custom error crossing the service-worker\n * `postMessage` boundary arrives as a plain `Error` — the same reason\n * `ProviderUnavailableError` keeps its state in the message.\n */\nexport function isEventSourceUnavailableError(error: unknown): error is Error {\n return (\n error instanceof EventSourceUnavailableError ||\n (error instanceof Error && error.name === \"EventSourceUnavailableError\")\n );\n}\n\nlet configured: EventSourceFactory | undefined;\n\n/**\n * Set the `EventSource` every provider uses by default. Call once at startup,\n * before opening a wallet; pass `undefined` to go back to the global.\n *\n * This exists because the provider-level option cannot reach providers the SDK\n * builds for you — `Wallet.create({ arkServerUrl })` constructs both itself.\n *\n * @example\n * ```typescript\n * import { EventSource } from \"eventsource\";\n * configureEventSource((url) => new EventSource(url));\n * ```\n */\nexport function configureEventSource(factory?: EventSourceFactory): void {\n configured = factory;\n}\n\n/** What {@link configureEventSource} last set, if anything. */\nexport function getConfiguredEventSource(): EventSourceFactory | undefined {\n return configured;\n}\n\n/**\n * Resolve the factory to open a stream with, or throw\n * {@link EventSourceUnavailableError}.\n *\n * The global is read on every call rather than captured at module load: a test\n * (or a polyfill) that assigns `globalThis.EventSource` after import must still\n * be seen.\n */\nexport function resolveEventSource(override?: EventSourceFactory): EventSourceFactory {\n const factory =\n override ??\n configured ??\n (typeof EventSource === \"undefined\" ? undefined : (url: string) => new EventSource(url));\n if (!factory) throw new EventSourceUnavailableError();\n return factory;\n}\n","{\n \"name\": \"@arkade-os/sdk\",\n \"version\": \"0.4.63\",\n \"description\": \"TypeScript SDK for building Bitcoin wallets using the Arkade protocol\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/arkade-os/ts-sdk.git\",\n \"directory\": \"packages/ts-sdk\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"sideEffects\": [\n \"src/index.ts\",\n \"src/contracts/handlers/index.ts\",\n \"dist/index.js\",\n \"dist/index.cjs\",\n \"dist/contracts/handlers/index.js\",\n \"dist/contracts/handlers/index.cjs\"\n ],\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./adapters/expo\": {\n \"import\": {\n \"types\": \"./dist/adapters/expo.d.ts\",\n \"default\": \"./dist/adapters/expo.js\"\n },\n \"require\": {\n \"types\": \"./dist/adapters/expo.d.cts\",\n \"default\": \"./dist/adapters/expo.cjs\"\n }\n },\n \"./adapters/localStorage\": {\n \"import\": {\n \"types\": \"./dist/adapters/localStorage.d.ts\",\n \"default\": \"./dist/adapters/localStorage.js\"\n },\n \"require\": {\n \"types\": \"./dist/adapters/localStorage.d.cts\",\n \"default\": \"./dist/adapters/localStorage.cjs\"\n }\n },\n \"./adapters/fileSystem\": {\n \"import\": {\n \"types\": \"./dist/adapters/fileSystem.d.ts\",\n \"default\": \"./dist/adapters/fileSystem.js\"\n },\n \"require\": {\n \"types\": \"./dist/adapters/fileSystem.d.cts\",\n \"default\": \"./dist/adapters/fileSystem.cjs\"\n }\n },\n \"./adapters/indexedDB\": {\n \"import\": {\n \"types\": \"./dist/adapters/indexedDB.d.ts\",\n \"default\": \"./dist/adapters/indexedDB.js\"\n },\n \"require\": {\n \"types\": \"./dist/adapters/indexedDB.d.cts\",\n \"default\": \"./dist/adapters/indexedDB.cjs\"\n }\n },\n \"./adapters/asyncStorage\": {\n \"import\": {\n \"types\": \"./dist/adapters/asyncStorage.d.ts\",\n \"default\": \"./dist/adapters/asyncStorage.js\"\n },\n \"require\": {\n \"types\": \"./dist/adapters/asyncStorage.d.cts\",\n \"default\": \"./dist/adapters/asyncStorage.cjs\"\n }\n },\n \"./repositories/sqlite\": {\n \"import\": {\n \"types\": \"./dist/repositories/sqlite/index.d.ts\",\n \"default\": \"./dist/repositories/sqlite/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/repositories/sqlite/index.d.cts\",\n \"default\": \"./dist/repositories/sqlite/index.cjs\"\n }\n },\n \"./repositories/realm\": {\n \"import\": {\n \"types\": \"./dist/repositories/realm/index.d.ts\",\n \"default\": \"./dist/repositories/realm/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/repositories/realm/index.d.cts\",\n \"default\": \"./dist/repositories/realm/index.cjs\"\n }\n },\n \"./worker/expo\": {\n \"import\": {\n \"types\": \"./dist/worker/expo/index.d.ts\",\n \"default\": \"./dist/worker/expo/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/worker/expo/index.d.cts\",\n \"default\": \"./dist/worker/expo/index.cjs\"\n }\n },\n \"./wallet/expo\": {\n \"import\": {\n \"types\": \"./dist/wallet/expo/index.d.ts\",\n \"default\": \"./dist/wallet/expo/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/wallet/expo/index.d.cts\",\n \"default\": \"./dist/wallet/expo/index.cjs\"\n }\n },\n \"./wallet/expo/background\": {\n \"import\": {\n \"types\": \"./dist/wallet/expo/background.d.ts\",\n \"default\": \"./dist/wallet/expo/background.js\"\n },\n \"require\": {\n \"types\": \"./dist/wallet/expo/background.d.cts\",\n \"default\": \"./dist/wallet/expo/background.cjs\"\n }\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"engines\": {\n \"node\": \">=22.12.0 <27\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"smoke:dist\": \"node scripts/smoke-dist.mjs\",\n \"typecheck\": \"tsc --noEmit\",\n \"check:vtxo\": \"node scripts/check-virtual-status.mjs && node scripts/check-provider-boundary.mjs\",\n \"docs:build\": \"pnpm run typecheck && pnpm typedoc\",\n \"docs:open\": \"open ../../docs/index.html\",\n \"test\": \"vitest run\",\n \"test:master\": \"ARK_ENV=master vitest run\",\n \"test:unit\": \"vitest run --exclude test/e2e\",\n \"test:setup\": \"node test/setup.mjs\",\n \"regtest:start\": \"node ./regtest/regtest.mjs start\",\n \"regtest:stop\": \"node ./regtest/regtest.mjs stop\",\n \"regtest:clean\": \"node ./regtest/regtest.mjs clean\",\n \"regtest\": \"pnpm regtest:clean && pnpm regtest:start && pnpm test:setup-docker\",\n \"test:setup-docker\": \"node test/setup.mjs docker\",\n \"test:integration\": \"vitest run test/e2e/**\",\n \"test:integration-docker\": \"ARK_ENV=docker vitest run test/e2e/**\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"format\": \"prettier --write src test examples\",\n \"lint\": \"prettier --check src test examples && pnpm run check:vtxo\",\n \"audit\": \"pnpm audit\",\n \"prepack\": \"pnpm run build\",\n \"prepublishOnly\": \"pnpm run build\"\n },\n \"dependencies\": {\n \"@bitcoinerlab/descriptors-scure\": \"3.1.7\",\n \"@marcbachmann/cel-js\": \"8.0.0\",\n \"@noble/curves\": \"2.0.1\",\n \"@noble/secp256k1\": \"3.0.0\",\n \"@scure/base\": \"2.0.0\",\n \"@scure/bip39\": \"2.0.1\",\n \"@scure/btc-signer\": \"2.0.1\",\n \"bip68\": \"1.0.4\",\n \"ws-electrumx-client\": \"1.0.5\"\n },\n \"devDependencies\": {\n \"@types/better-sqlite3\": \"7.6.13\",\n \"@vitest/coverage-v8\": \"3.2.7\",\n \"better-sqlite3\": \"12.6.2\",\n \"tsup\": \"^8.5.0\",\n \"typedoc\": \"^0.28.19\",\n \"typescript\": \"5.9.2\"\n },\n \"peerDependencies\": {\n \"@react-native-async-storage/async-storage\": \">=1.0.0\",\n \"expo\": \">=54.0.0\",\n \"expo-background-task\": \"~1.0.10 || >=55.0.0\",\n \"expo-sqlite\": \"~16.0.10 || >=55.0.0\",\n \"expo-task-manager\": \"~14.0.9 || >=55.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"expo\": {\n \"optional\": true\n },\n \"expo-sqlite\": {\n \"optional\": true\n },\n \"expo-background-task\": {\n \"optional\": true\n },\n \"expo-task-manager\": {\n \"optional\": true\n },\n \"@react-native-async-storage/async-storage\": {\n \"optional\": true\n }\n },\n \"keywords\": [\n \"ark\",\n \"arkade\",\n \"bip39\",\n \"bitcoin\",\n \"btc\",\n \"crypto\",\n \"lightning\",\n \"sdk\",\n \"stablecoin\",\n \"taproot\",\n \"typescript\",\n \"utxo\",\n \"vtxo\",\n \"wallet\"\n ],\n \"author\": \"Ark Labs\",\n \"license\": \"MIT\",\n \"packageManager\": \"pnpm@10.25.0\"\n}\n","import { version } from \"../../package.json\";\n\nexport const buildVersion = \"0.9.9\";\n\n/**\n * The SDK's own version string, sourced from package.json\n */\nexport const sdkVersion = `ts-sdk/${version}`;\n\n/**\n * Wraps a transport-level `fetch` rejection (DNS failure, connection refused,\n * TLS or CORS error) with the request method and URL, preserving the original\n * as {@link Error.cause}.\n */\nexport class FetchError extends Error {\n /** The request URL that failed, when derivable from the `fetch` input. */\n readonly url?: string;\n /** The HTTP method of the failed request (defaults to `\"GET\"`). */\n readonly method?: string;\n\n constructor(message: string, options: { url?: string; method?: string; cause?: unknown }) {\n super(message, { cause: options.cause });\n this.name = \"FetchError\";\n this.url = options.url;\n this.method = options.method;\n }\n}\n\n/**\n * Guarded passthrough to the platform `fetch` with no Arkade-specific headers.\n * Use for any service that is NOT the Ark server (delegate, Esplora, …): those\n * origins reject unknown request headers such as `X-Build-Version` in the CORS\n * preflight.\n *\n * Transport-level rejections are re-thrown as a {@link FetchError}.\n */\nexport function baseFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"Fetch API is not available in this environment.\");\n }\n return globalThis.fetch(input, init).catch((cause) => {\n const { url, method } = describeRequest(input, init);\n throw new FetchError(`Network request failed: ${method} ${url}`, { url, method, cause });\n });\n}\n\n/**\n * `fetch` for the Ark server only: adds the `X-Build-Version` compatibility\n * header that arkd's version guard reads, plus the `X-SDK-VERSION` header\n * carrying this package's own version. Do NOT use it for other origins — they\n * reject these custom headers in CORS preflight.\n */\nexport function fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const headers = new Headers(init?.headers);\n headers.set(\"X-Build-Version\", buildVersion);\n headers.set(\"X-SDK-VERSION\", sdkVersion);\n return baseFetch(input, { ...init, headers });\n}\n\n/**\n * Derive a human-readable `{ url, method }` for a failed request from the\n * `fetch` arguments, handling the `string | URL | Request` input shapes. The\n * `init.method` wins, then a `Request`'s own method, defaulting to `\"GET\"`.\n */\nfunction describeRequest(\n input: RequestInfo | URL,\n init?: RequestInit,\n): { url: string; method: string } {\n let url: string;\n if (typeof input === \"string\") {\n url = input;\n } else if (input instanceof URL) {\n url = input.href;\n } else {\n url = input.url;\n }\n\n let method: string;\n if (init?.method !== undefined) {\n method = init.method;\n } else if (input instanceof Request) {\n method = input.method;\n } else {\n method = \"GET\";\n }\n\n return { url, method };\n}\n","import { FetchError } from \"../utils/fetch\";\n\nexport class ArkError extends Error {\n constructor(\n readonly code: number,\n readonly message: string,\n readonly name: string,\n readonly metadata?: Record<string, string>,\n ) {\n super(message);\n }\n}\n\n/**\n * Structured arkd error `name`s the SDK branches on, centralized so call sites don't\n * hardcode string literals. Not an exhaustive mirror of the server's codes — only the\n * ones the SDK acts on.\n */\nexport const ArkErrorName = {\n DIGEST_MISMATCH: \"DIGEST_MISMATCH\",\n VTXO_ALREADY_SPENT: \"VTXO_ALREADY_SPENT\",\n INVALID_TX_FILTER: \"INVALID_TX_FILTER\",\n TX_FILTERS_LIMIT_EXCEEDED: \"TX_FILTERS_LIMIT_EXCEEDED\",\n /**\n * A CLTV closure was spent before its absolute locktime matured. Raised only by\n * `submitTx` (never `finalizeTx`), with metadata\n * `{ locktime, current_locktime, type: \"height\" | \"time\" }`.\n *\n * Self-healing, so defer and retry rather than fail: the server matures a\n * seconds-locktime against the **chain tip block's timestamp**, not its wall clock,\n * so a spend attempted promptly at maturity is rejected until a later block lands.\n */\n FORFEIT_CLOSURE_LOCKED: \"FORFEIT_CLOSURE_LOCKED\",\n} as const;\n\nexport type ArkErrorName = (typeof ArkErrorName)[keyof typeof ArkErrorName];\n\n/**\n * Type guard for a structured {@link ArkError}, optionally narrowing to a specific\n * `name`. Prefer it over comparing `err.name` literals.\n *\n * `name` accepts only cataloged {@link ArkErrorName} values; to branch on a name the\n * catalog does not cover, either add it there or compare `err.name` after guarding\n * with the one-argument form.\n *\n * @example\n * if (isArkError(maybeArkError(err), ArkErrorName.DIGEST_MISMATCH)) { ... }\n */\nexport function isArkError(error: unknown, name?: ArkErrorName): error is ArkError {\n return error instanceof ArkError && (name === undefined || error.name === name);\n}\n\n/**\n * Which remote dependency an availability failure refers to. Used to label the\n * {@link ProviderUnavailableError} message and the wallet's\n * `ProviderConnectionState`; it is deliberately *not* carried as a structured\n * field on the error, since custom `Error` own-properties do not survive the\n * service-worker `postMessage` boundary. Structured clone keeps `message`,\n * `stack` and `cause`, drops own-properties, and normalizes a custom `name` to\n * `\"Error\"` — only the built-in error names survive it.\n */\nexport type ProviderKind = \"arkade\" | \"indexer\";\n\n/**\n * A remote provider (Arkade operator or its indexer) is temporarily\n * unreachable. This is a *retryable* condition — transport failure, request\n * timeout, or a 5xx/429-style temporary HTTP response — as opposed to a\n * terminal configuration/authorization/schema error, which stays a plain\n * `Error`/{@link ArkError}. The original low-level error is preserved as\n * {@link Error.cause}.\n */\nexport class ProviderUnavailableError extends Error {\n /** Always `true`: this error type only ever wraps retryable conditions. */\n readonly retryable = true;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { cause: options?.cause });\n this.name = \"ProviderUnavailableError\";\n }\n}\n\n/**\n * A response does not reconcile with what the SDK submitted or already\n * validated — a checkpoint tx whose txid is not among those submitted, a\n * commitment tx that differs from the one validated at tree signing. Terminal\n * rather than retryable: the two are equal by construction in a well-formed\n * exchange, so the same request would produce the same outcome.\n *\n * Neither own-properties nor a custom `name` cross the service-worker\n * `postMessage` boundary (see {@link ProviderKind}), so `retryable` and `name`\n * are in-process conveniences and every distinguishing detail belongs in\n * `message` — the one field a consumer past the boundary can still branch on.\n */\nexport class ServerResponseMismatchError extends Error {\n readonly retryable = false;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { cause: options?.cause });\n this.name = \"ServerResponseMismatchError\";\n }\n}\n\n/**\n * Throw a typed {@link ProviderUnavailableError} for a temporary HTTP response\n * (429 rate-limit or any 5xx), otherwise return. `fetch()` resolves — rather\n * than rejects — on HTTP error status, so status-code classification has to live\n * at each provider's non-2xx branch, not in the transport wrapper. 4xx and other\n * responses are left to the caller to treat as terminal.\n *\n * Status alone is not enough to classify an arkd response, though: arkd sits\n * behind grpc-gateway, which maps application-level gRPC errors onto HTTP status\n * codes across the whole range — gRPC INTERNAL becomes HTTP 500, for instance. So\n * a 5xx does not by itself mean the operator is unavailable: a 500 whose body\n * carries a structured arkd error (e.g. `INTERNAL_ERROR (0): ...already registered\n * by another intent`) is a deliberate, terminal rejection that must reach the\n * caller as an {@link ArkError}, never be retried. When `body` is provided and\n * decodes to a structured arkd error, this returns without throwing; classify by\n * status only for a bodyless call or a non-structured body (a bare proxy/gateway\n * failure). Mirrors NArk's BuildVersionHandler, which branches on body content,\n * not status.\n */\nexport function throwIfHttpUnavailable(\n response: Response,\n kind: ProviderKind,\n body?: string,\n): void {\n if (body !== undefined && maybeArkError(new Error(body))) return;\n if (response.status === 429 || response.status >= 500) {\n throw new ProviderUnavailableError(\n `${kind} unavailable: ${response.status} ${response.statusText}`,\n );\n }\n}\n\n/**\n * Map a transport-level {@link FetchError} (server unreachable) to a typed\n * {@link ProviderUnavailableError}, preserving the original as `cause`; return\n * any other error unchanged. Returns the error to `throw` rather than throwing,\n * so a `catch` block can `throw toProviderUnavailable(err, kind)`.\n */\nexport function toProviderUnavailable(err: unknown, kind: ProviderKind): unknown {\n if (err instanceof FetchError) {\n return new ProviderUnavailableError(`${kind} request failed`, { cause: err });\n }\n return err;\n}\n\n/**\n * Try to convert an error to an ArkError class, returning undefined if the error is not an ArkError\n * @param error - The error to parse\n * @returns The parsed ArkError, or undefined if the error is not an ArkError\n */\nexport function maybeArkError(error: any): ArkError | undefined {\n try {\n if (!(error instanceof Error)) return undefined;\n const decoded = JSON.parse(error.message);\n\n // Preferred: the structured ErrorDetails the server attaches in details[].\n if (Array.isArray(decoded.details)) {\n for (const details of decoded.details) {\n if (!(\"@type\" in details)) continue;\n const type = details[\"@type\"];\n if (type !== \"type.googleapis.com/ark.v1.ErrorDetails\") continue;\n\n if (!(\"code\" in details)) continue;\n\n const code = details.code;\n\n if (!(\"message\" in details)) continue;\n const message = details.message;\n\n if (!(\"name\" in details)) continue;\n const name = details.name;\n\n let metadata: Record<string, string> | undefined;\n if (\"metadata\" in details && isMetadata(details.metadata)) {\n metadata = details.metadata;\n }\n\n return new ArkError(code, message, name, metadata);\n }\n }\n\n // Fallback: arkd's guard interceptors (build-version, digest) run outside\n // the error-detail converter, so their REST errors arrive with an empty\n // `details[]` and the structured name only in the top-level message, as\n // \"NAME (code): human message\". Recover the name and code so callers can\n // still branch on the error name (metadata is unavailable on this path).\n if (typeof decoded.message === \"string\") {\n const m = decoded.message.match(/^([A-Z][A-Z0-9_]*) \\((\\d+)\\): ([\\s\\S]*)$/);\n if (m) return new ArkError(Number(m[2]), m[3], m[1]);\n }\n\n return undefined;\n } catch (e) {\n return undefined;\n }\n}\n\nfunction isMetadata(value: any): value is Record<string, string> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { OP, Script, SigHash } from \"@scure/btc-signer\";\nimport { TransactionInput, TransactionOutput } from \"@scure/btc-signer/psbt.js\";\nimport { schnorr } from \"@noble/curves/secp256k1.js\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\nimport { Transaction } from \"../utils/transaction\";\nimport { ConditionWitness, VtxoTaprootTree } from \"../utils/unknownFields\";\nimport { hex } from \"@scure/base\";\nimport { getSequence, VtxoScript } from \"../script/base\";\nimport { ExtendedCoin } from \"../wallet\";\n\n/**\n * Intent proof implementation for Bitcoin message signing.\n *\n * Intent proof defines a standard for signing Bitcoin messages as well as proving\n * ownership of outputs.\n *\n * This namespace provides utilities for creating and validating Intent proof.\n *\n * It is greatly inspired by BIP322.\n * @see https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki\n *\n * @example\n * ```typescript\n * // Create a Intent proof\n * const proof = Intent.create(\n * \"Hello Bitcoin!\",\n * [input],\n * [output]\n * );\n *\n * // Sign the proof\n * const signedProof = await identity.sign(proof);\n *\n */\nexport namespace Intent {\n // Intent proof is a special invalid psbt containing the inputs to prove ownership\n // signing the proof means signing the psbt as a regular transaction\n export type Proof = Transaction;\n\n /**\n * Creates a new Intent proof unsigned transaction.\n *\n * This function constructs a special transaction that can be signed to prove\n * ownership of onchain and virtual outputs. The proof includes the message to be\n * signed and the inputs/outputs that demonstrate ownership.\n *\n * @param message - The Intent message to be signed, either raw string of Message object\n * @param ins - Array of transaction inputs to prove ownership of\n * @param outputs - Optional array of transaction outputs\n * @returns An unsigned Intent proof transaction\n */\n export function create(\n message: string | Message,\n ins: (TransactionInput | ExtendedCoin)[],\n outputs: TransactionOutput[] = [],\n ): Proof {\n if (typeof message !== \"string\") {\n message = encodeMessage(message);\n }\n\n if (ins.length == 0) throw new Error(\"intent proof requires at least one input\");\n const inputs = ins.map(prepareCoinAsIntentProofInput);\n if (!validateInputs(inputs)) throw new Error(\"invalid inputs\");\n if (!validateOutputs(outputs)) throw new Error(\"invalid outputs\");\n\n // Create the initial transaction to spend.\n const toSpend = craftToSpendTx(message, inputs[0].witnessUtxo.script);\n\n // Create the transaction to sign.\n return craftToSignTx(toSpend, inputs, outputs, message);\n }\n\n /**\n * Compute the fee paid by an intent proof transaction.\n *\n * @param proof - Intent proof transaction\n * @returns The fee in satoshis\n */\n export function fee(proof: Proof): number {\n let sumOfInputs = 0n;\n for (let i = 0; i < proof.inputsLength; i++) {\n const input = proof.getInput(i);\n if (input.witnessUtxo === undefined)\n throw new Error(\"intent proof input requires witness utxo\");\n sumOfInputs += input.witnessUtxo.amount;\n }\n\n let sumOfOutputs = 0n;\n for (let i = 0; i < proof.outputsLength; i++) {\n const output = proof.getOutput(i);\n if (output.amount === undefined) throw new Error(\"intent proof output requires amount\");\n sumOfOutputs += output.amount;\n }\n\n if (sumOfOutputs > sumOfInputs) {\n throw new Error(\n `intent proof output amount is greater than input amount: ${sumOfOutputs} > ${sumOfInputs}`,\n );\n }\n\n return Number(sumOfInputs - sumOfOutputs);\n }\n\n export type RegisterMessage = {\n type: \"register\";\n onchain_output_indexes: number[];\n valid_at: number;\n expire_at: number;\n cosigners_public_keys: string[];\n };\n\n export type DeleteMessage = {\n type: \"delete\";\n expire_at: number;\n };\n\n export type GetPendingTxMessage = {\n type: \"get-pending-tx\";\n expire_at: number;\n };\n export type Message = RegisterMessage | DeleteMessage | GetPendingTxMessage;\n\n /**\n * Serialize an intent message to the canonical JSON string used for signing.\n *\n * @param message - Intent message payload\n * @returns Canonical string form of the message\n */\n export function encodeMessage(message: Message): string {\n switch (message.type) {\n case \"register\":\n return JSON.stringify({\n type: \"register\",\n onchain_output_indexes: message.onchain_output_indexes,\n valid_at: message.valid_at,\n expire_at: message.expire_at,\n cosigners_public_keys: message.cosigners_public_keys,\n });\n case \"delete\":\n return JSON.stringify({\n type: \"delete\",\n expire_at: message.expire_at,\n });\n case \"get-pending-tx\":\n return JSON.stringify({\n type: \"get-pending-tx\",\n expire_at: message.expire_at,\n });\n }\n }\n}\n\nexport const OP_RETURN_EMPTY_PKSCRIPT = new Uint8Array([OP.RETURN]);\nconst ZERO_32 = new Uint8Array(32).fill(0);\nconst MAX_INDEX = 0xffffffff;\nexport const TAG_INTENT_PROOF = \"ark-intent-proof-message\";\n// BIP-322 v2 global field: the UTF-8 message being signed. Lets a co-signer\n// recognise a message-signing PSBT and recompute the to_spend commitment from\n// PSBT-internal data alone.\nconst PSBT_GLOBAL_GENERIC_SIGNED_MESSAGE = 0x09;\n\ntype ValidatedTxInput = TransactionInput & {\n witnessUtxo: { script: Uint8Array; amount: bigint };\n index: number;\n txid: Bytes;\n};\n\ntype ValidatedTxOutput = TransactionOutput & {\n amount: bigint;\n script: Uint8Array;\n};\n\nfunction validateInput(input: TransactionInput): input is ValidatedTxInput {\n if (input.index === undefined) throw new Error(\"intent proof input requires index\");\n if (input.txid === undefined) throw new Error(\"intent proof input requires txid\");\n if (input.witnessUtxo === undefined)\n throw new Error(\"intent proof input requires witness utxo\");\n return true;\n}\n\nfunction validateInputs(inputs: TransactionInput[]): inputs is ValidatedTxInput[] {\n inputs.forEach(validateInput);\n return true;\n}\n\nfunction validateOutput(output: TransactionOutput): output is ValidatedTxOutput {\n if (output.amount === undefined) throw new Error(\"intent proof output requires amount\");\n if (output.script === undefined) throw new Error(\"intent proof output requires script\");\n return true;\n}\n\nfunction validateOutputs(outputs: TransactionOutput[]): outputs is ValidatedTxOutput[] {\n outputs.forEach(validateOutput);\n return true;\n}\n\n/**\n * Creates the \"to_spend\" transaction used by both intent proofs and BIP-322.\n *\n * The message is hashed with the given tagged-hash tag before being placed\n * into the scriptSig as `OP_0 <hash>`.\n *\n * @param message - The message to embed\n * @param pkScript - The scriptPubKey of the signer's address\n * @param tag - Tagged-hash tag (defaults to the Arkade intent proof tag)\n */\nexport function craftToSpendTx(\n message: string,\n pkScript: Uint8Array,\n tag: string = TAG_INTENT_PROOF,\n): Transaction {\n const messageHash = hashMessage(message, tag);\n const tx = new Transaction({\n version: 0,\n });\n\n // add input with zero hash and max index\n tx.addInput({\n txid: ZERO_32, // zero hash\n index: MAX_INDEX,\n sequence: 0,\n });\n\n // add output with zero value and provided pkScript\n tx.addOutput({\n amount: 0n,\n script: pkScript,\n });\n\n tx.updateInput(0, {\n finalScriptSig: Script.encode([\"OP_0\", messageHash]),\n });\n\n return tx;\n}\n\n/**\n * Creates the \"to_sign\" transaction that is signed to produce the proof.\n *\n * The first input references the `toSpend` transaction; the remaining inputs are\n * the ownership inputs being proven. When no outputs are provided a single\n * value-0 OP_RETURN output is added. The BIP-322 `PSBT_GLOBAL_GENERIC_SIGNED_MESSAGE`\n * (`0x09`) global field is set to the UTF-8 message so a verifier can recompute\n * the `toSpend` commitment from PSBT-internal data alone.\n *\n * @param toSpend - The \"to_spend\" transaction whose id the first input references\n * @param inputs - Validated ownership inputs (input[0] is the toSpend reference)\n * @param outputs - Proof outputs; an OP_RETURN placeholder is used when empty\n * @param message - The canonical message the proof commits to\n * @returns The unsigned \"to_sign\" proof transaction\n */\nfunction craftToSignTx(\n toSpend: Transaction,\n inputs: ValidatedTxInput[],\n outputs: ValidatedTxOutput[],\n message: string,\n): Transaction {\n const firstInput = inputs[0];\n\n // Proof tx is never broadcast onchain — toSpend references a zero-hash\n // outpoint (see BIP-322). The tx exists only as a sighash commitment\n // the server verifies signatures against; nLockTime and nSequence carry\n // no consensus meaning here, they only need to match between signer and\n // verifier. Use lockTime = 0 (BIP-322 convention) and leave each input's\n // nSequence untouched.\n const tx = new Transaction({\n version: 2,\n lockTime: 0,\n });\n\n // add the first \"toSpend\" input\n tx.addInput({\n ...firstInput,\n txid: toSpend.id,\n index: 0,\n witnessUtxo: {\n script: firstInput.witnessUtxo.script,\n amount: 0n,\n },\n sighashType: SigHash.ALL,\n });\n\n // add other inputs\n for (const [i, input] of inputs.entries()) {\n tx.addInput({\n ...input,\n sighashType: SigHash.ALL,\n });\n\n if (input.unknown?.length) {\n tx.updateInput(i + 1, {\n unknown: input.unknown,\n });\n }\n }\n\n // add the special OP_RETURN output if no outputs are provided\n if (outputs.length === 0) {\n outputs = [\n {\n amount: 0n,\n script: OP_RETURN_EMPTY_PKSCRIPT,\n },\n ];\n }\n\n for (const output of outputs) {\n tx.addOutput({\n amount: output.amount,\n script: output.script,\n });\n }\n\n // Set BIP-322's PSBT_GLOBAL_GENERIC_SIGNED_MESSAGE (0x09) to the signed\n // message. @scure/btc-signer exposes no public setter for PSBT global\n // fields, so write the unknown global entry directly. 0x09 is unused in the\n // global keymap, so it round-trips as an unknown field that toPSBT()/\n // fromPSBT() preserve.\n const global = (\n tx as unknown as {\n global: { unknown?: [{ type: number; key: Uint8Array }, Uint8Array][] };\n }\n ).global;\n global.unknown = [\n ...(global.unknown ?? []),\n [\n { type: PSBT_GLOBAL_GENERIC_SIGNED_MESSAGE, key: new Uint8Array() },\n new TextEncoder().encode(message),\n ],\n ];\n\n return tx;\n}\n\nfunction hashMessage(message: string, tag: string = TAG_INTENT_PROOF): Uint8Array {\n return schnorr.utils.taggedHash(tag, new TextEncoder().encode(message));\n}\n\nfunction prepareCoinAsIntentProofInput(coin: ExtendedCoin | TransactionInput): TransactionInput {\n if (!(\"tapTree\" in coin)) {\n return coin;\n }\n const vtxoScript = VtxoScript.decode(coin.tapTree);\n const sequence = getSequence(coin.intentTapLeafScript);\n\n const unknown = [VtxoTaprootTree.encode(coin.tapTree)];\n if (coin.extraWitness) {\n unknown.push(ConditionWitness.encode(coin.extraWitness));\n }\n\n return {\n txid: hex.decode(coin.txid),\n index: coin.vout,\n witnessUtxo: {\n amount: BigInt(coin.value),\n script: vtxoScript.pkScript,\n },\n sequence,\n tapLeafScript: [coin.intentTapLeafScript],\n unknown,\n };\n}\n","import type { EventSourceLike } from \"./eventSource\";\n\nexport type ManagedEventSourceIterator = AsyncGenerator<MessageEvent, void, unknown> & {\n close(): void;\n};\n\nfunction createAbortError(): Error {\n const error = new Error(\"EventSource closed\");\n error.name = \"AbortError\";\n return error;\n}\n\n/**\n * Creates a close-aware EventSource async iterator.\n *\n * Listeners attach eagerly so events are buffered before the first next() call.\n * close() closes the EventSource, removes listeners, and wakes any pending\n * next() even when the browser does not emit an error from EventSource.close().\n */\nexport function eventSourceIterator(eventSource: EventSourceLike): ManagedEventSourceIterator {\n const messageQueue: MessageEvent[] = [];\n const errorQueue: Error[] = [];\n let messageResolve: ((value: MessageEvent) => void) | null = null;\n let errorResolve: ((error: Error) => void) | null = null;\n let closed = false;\n let cleanedUp = false;\n\n const cleanup = () => {\n if (cleanedUp) return;\n cleanedUp = true;\n eventSource.removeEventListener(\"message\", messageHandler);\n eventSource.removeEventListener(\"error\", errorHandler);\n };\n\n const close = () => {\n if (closed) return;\n closed = true;\n messageQueue.length = 0;\n errorQueue.length = 0;\n eventSource.close();\n cleanup();\n\n if (errorResolve) {\n const reject = errorResolve;\n messageResolve = null;\n errorResolve = null;\n reject(createAbortError());\n }\n };\n\n const messageHandler = (event: MessageEvent) => {\n if (closed) return;\n if (messageResolve) {\n const resolve = messageResolve;\n messageResolve = null;\n errorResolve = null;\n resolve(event);\n } else {\n messageQueue.push(event);\n }\n };\n\n const errorHandler = () => {\n if (closed) return;\n const error = new Error(\"EventSource error\");\n error.name = \"EventSourceError\";\n if (errorResolve) {\n const reject = errorResolve;\n messageResolve = null;\n errorResolve = null;\n reject(error);\n } else {\n errorQueue.push(error);\n }\n };\n\n // Attach listeners immediately so events are buffered\n // even before the caller starts iterating\n eventSource.addEventListener(\"message\", messageHandler);\n eventSource.addEventListener(\"error\", errorHandler);\n\n const gen = (async function* () {\n try {\n while (!closed) {\n // if we have queued messages, yield the first one, remove it from the queue\n if (messageQueue.length > 0) {\n yield messageQueue.shift()!;\n continue;\n }\n\n // if we have queued errors, throw the first one, remove it from the queue\n if (errorQueue.length > 0) {\n const error = errorQueue.shift()!;\n throw error;\n }\n\n // wait for the next message or error\n const result = await new Promise<MessageEvent>((resolve, reject) => {\n messageResolve = resolve;\n errorResolve = reject;\n }).finally(() => {\n messageResolve = null;\n errorResolve = null;\n });\n\n if (!closed && result) {\n yield result;\n }\n }\n } finally {\n closed = true;\n cleanup();\n eventSource.close();\n }\n })();\n\n const origReturn = gen.return.bind(gen);\n const managed = gen as ManagedEventSourceIterator;\n managed.close = close;\n managed.return = (value?: void | PromiseLike<void>) => {\n close();\n return origReturn(value);\n };\n\n return managed;\n}\n\nexport function isEventSourceError(error: unknown): error is Error {\n return error instanceof Error && error.name === \"EventSourceError\";\n}\n","/**\n * Origin-scoped politeness gate for outbound provider requests.\n *\n * Per-request retry alone cannot survive a rate limiter: under a burst every\n * in-flight request gets the same `429` and the same `Retry-After`, sleeps\n * independently, and wakes in unison to re-trip it — while requests queued\n * behind them learn nothing from the `429` at all. So the backoff state is\n * shared, keyed by **origin** (`/v1/info` and `/v1/indexer/*` are one host\n * behind one limiter). Callers use one of two verbs:\n *\n * - **Wait + report** ({@link OriginRateGate.runHttp}) — indexer and operator\n * reads, where delaying a send is safe. Waiting is separate from retrying:\n * an indexer POST waits and reports but is not replayed (see `indexerFetch`).\n * - **Report-only** ({@link OriginRateGate.reportRateLimited}) — intent and\n * settlement POSTs, which feed the shared signal but never wait or retry:\n * batch sessions have deadlines, and these POSTs are not idempotent at the\n * application level, so a certain missed round beats a possible `429`.\n */\n\n/** Per-origin in-flight cap on the wait+report path (the browser per-host cap). */\nconst DEFAULT_MAX_CONCURRENT = 6;\n\n/** Cooldown applied to a `429` that carries no usable `Retry-After`. */\nconst DEFAULT_COOLDOWN_MS = 5_000;\n\n/** Ceiling on a single cooldown, so a bogus `Retry-After` can't wedge the wallet. */\nconst MAX_COOLDOWN_MS = 60_000;\n\n/** Upper bound of the random delay decorrelating waiters released together. */\nconst DEFAULT_JITTER_MS = 500;\n\nexport interface RateGateOptions {\n maxConcurrent?: number;\n defaultCooldownMs?: number;\n maxCooldownMs?: number;\n jitterMs?: number;\n}\n\ninterface OriginState {\n /** Epoch ms before which no gated request to this origin may be sent. */\n blockedUntil: number;\n /** In-flight gated requests. */\n active: number;\n /** FIFO of waiters parked on the concurrency cap. */\n queue: (() => void)[];\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Parse a `Retry-After` header into milliseconds, in either spec encoding\n * (delta-seconds or HTTP-date). `undefined` when absent or unparseable.\n */\nexport function parseRetryAfterMs(header: string | null | undefined): number | undefined {\n if (header === null || header === undefined) return undefined;\n const trimmed = header.trim();\n // Checked before Number(), which maps \"\" to 0.\n if (trimmed === \"\") return undefined;\n\n const seconds = Number(trimmed);\n // A negative delta is malformed — delta-seconds is non-negative — so there\n // is no valid reading of it. Fall back to the caller's default instead of\n // clamping to 0, which would mean \"no cooldown at all\".\n if (Number.isFinite(seconds)) return seconds < 0 ? undefined : seconds * 1000;\n\n // Unlike a negative delta, a past HTTP-date is well-formed and does mean\n // \"retry now\", so it clamps rather than falling back.\n const at = Date.parse(trimmed);\n if (!Number.isNaN(at)) return Math.max(0, at - Date.now());\n\n return undefined;\n}\n\n/** Derive the origin key for a `fetch` input, tolerating the three input shapes. */\nexport function requestOrigin(input: RequestInfo | URL): string {\n let url: string;\n if (typeof input === \"string\") {\n url = input;\n } else if (input instanceof URL) {\n url = input.href;\n } else {\n url = input.url;\n }\n try {\n return new URL(url).origin;\n } catch {\n // Unparseable (e.g. relative): key on the raw string. Grouping is then\n // wrong, but only ever over- or under-shares a cooldown.\n return url;\n }\n}\n\n/** Shared cooldown + concurrency state, keyed by origin. */\nexport class OriginRateGate {\n private readonly states = new Map<string, OriginState>();\n private readonly maxConcurrent: number;\n private readonly defaultCooldownMs: number;\n private readonly maxCooldownMs: number;\n private readonly jitterMs: number;\n\n constructor(options?: RateGateOptions) {\n this.maxConcurrent = options?.maxConcurrent ?? DEFAULT_MAX_CONCURRENT;\n this.defaultCooldownMs = options?.defaultCooldownMs ?? DEFAULT_COOLDOWN_MS;\n this.maxCooldownMs = options?.maxCooldownMs ?? MAX_COOLDOWN_MS;\n this.jitterMs = options?.jitterMs ?? DEFAULT_JITTER_MS;\n }\n\n /**\n * Run `fn` under the origin's concurrency cap and behind any active\n * cooldown. Put only the request in `fn`: the slot is released as soon as\n * it settles, so body parsing doesn't hold one.\n */\n async run<T>(input: RequestInfo | URL, fn: () => Promise<T>): Promise<T> {\n const state = this.stateFor(requestOrigin(input));\n await this.acquire(state);\n try {\n // Re-checked after each sleep, so a `429` seen by another request\n // while this one waits extends the wait instead of slipping through.\n for (;;) {\n const remaining = state.blockedUntil - Date.now();\n if (remaining <= 0) break;\n await sleep(remaining + Math.random() * this.jitterMs);\n }\n return await fn();\n } finally {\n this.release(state);\n }\n }\n\n /**\n * {@link run} for a request whose response the gate should inspect: a `429`\n * is recorded *before* the slot is released. Reporting after `run()` resolves\n * is too late — `release()` hands the slot to the next queued waiter, which\n * resumes, sees no cooldown, and sends into the limiter that just refused us.\n *\n * Prefer this over `run` for anything returning a `Response`.\n */\n runHttp(input: RequestInfo | URL, fn: () => Promise<Response>): Promise<Response> {\n return this.run(input, async () => {\n const response = await fn();\n if (response.status === 429) {\n this.reportRateLimited(input, response.headers?.get(\"retry-after\"));\n }\n return response;\n });\n }\n\n /**\n * Record an observed `429`, pausing every gated request to that origin.\n * Monotonic: a shorter cooldown never shortens one already in effect.\n */\n reportRateLimited(input: RequestInfo | URL, retryAfterHeader?: string | null): void {\n const cooldown = Math.min(\n parseRetryAfterMs(retryAfterHeader) ?? this.defaultCooldownMs,\n this.maxCooldownMs,\n );\n const state = this.stateFor(requestOrigin(input));\n state.blockedUntil = Math.max(state.blockedUntil, Date.now() + cooldown);\n }\n\n /** Milliseconds left on `input` origin's cooldown; `0` when not cooling down. */\n cooldownRemainingMs(input: RequestInfo | URL): number {\n const state = this.states.get(requestOrigin(input));\n if (!state) return 0;\n return Math.max(0, state.blockedUntil - Date.now());\n }\n\n /**\n * Drop all per-origin state, so test suites don't inherit each other's\n * cooldowns. Waiters queued on the discarded state still drain normally.\n */\n reset(): void {\n this.states.clear();\n }\n\n private stateFor(origin: string): OriginState {\n let state = this.states.get(origin);\n if (!state) {\n state = { blockedUntil: 0, active: 0, queue: [] };\n this.states.set(origin, state);\n }\n return state;\n }\n\n private acquire(state: OriginState): Promise<void> {\n if (state.active < this.maxConcurrent) {\n state.active += 1;\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n state.queue.push(() => {\n state.active += 1;\n resolve();\n });\n });\n }\n\n private release(state: OriginState): void {\n state.active -= 1;\n const next = state.queue.shift();\n if (next) next();\n }\n}\n\n/**\n * Process-wide gate shared by every provider fetch path. Origin keying keeps\n * embedders on several operators from cross-throttling each other.\n */\nexport const rateGate = new OriginRateGate();\n","import { TxTreeNode } from \"../tree/txTree\";\nimport { TreeNonces, TreePartialSigs } from \"../tree/signingSession\";\nimport { hex } from \"@scure/base\";\nimport { Vtxo } from \"./indexer\";\nimport { eventSourceIterator, isEventSourceError } from \"./utils\";\nimport {\n isEventSourceUnavailableError,\n resolveEventSource,\n type EventSourceCapable,\n type EventSourceFactory,\n} from \"./eventSource\";\nimport {\n ArkErrorName,\n isArkError,\n maybeArkError,\n throwIfHttpUnavailable,\n toProviderUnavailable,\n} from \"./errors\";\nimport type { IntentFeeConfig } from \"../arkfee\";\nimport { Intent } from \"../intent\";\nimport { DEFAULT_ARKADE_SERVER_URL } from \"../networks\";\nimport { fetch } from \"../utils/fetch\";\nimport { rateGate } from \"./rateGate\";\n\n/**\n * Thrown by {@link RestArkProvider} when arkd rejects a request with\n * `DIGEST_MISMATCH` — the client's cached server info was stale (e.g. an\n * operator signer rotation). By the time this surfaces the provider has already\n * refreshed its info and fired `onServerInfoChanged`; the caller should rebuild\n * the request under the fresh server info and retry. Mirrors NArk's\n * `DigestMismatchException` (dotnet-sdk #131): the SDK never silently retries.\n */\nexport class DigestMismatchError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DigestMismatchError\";\n }\n}\n\n/** Output requested during settlement or transaction submission. */\nexport type Output = {\n /** Destination address, either onchain or Arkade (offchain). */\n address: string;\n\n /** Amount to send in satoshis. */\n amount: bigint;\n};\n\nexport enum SettlementEventType {\n BatchStarted = \"batch_started\",\n BatchFinalization = \"batch_finalization\",\n BatchFinalized = \"batch_finalized\",\n BatchFailed = \"batch_failed\",\n TreeSigningStarted = \"tree_signing_started\",\n TreeNonces = \"tree_nonces\",\n TreeTx = \"tree_tx\",\n TreeSignature = \"tree_signature\",\n StreamStarted = \"stream_started\",\n}\n\nexport type BatchFinalizationEvent = {\n type: SettlementEventType.BatchFinalization;\n id: string;\n commitmentTx: string;\n};\n\nexport type BatchFinalizedEvent = {\n type: SettlementEventType.BatchFinalized;\n id: string;\n commitmentTxid: string;\n};\n\nexport type BatchFailedEvent = {\n type: SettlementEventType.BatchFailed;\n id: string;\n reason: string;\n};\n\nexport type TreeSigningStartedEvent = {\n type: SettlementEventType.TreeSigningStarted;\n id: string;\n cosignersPublicKeys: string[];\n unsignedCommitmentTx: string;\n};\n\nexport type TreeNoncesEvent = {\n type: SettlementEventType.TreeNonces;\n id: string;\n topic: string[];\n txid: string;\n /** Musig2 public nonces keyed by cosigner public key. */\n nonces: TreeNonces;\n};\n\nexport type BatchStartedEvent = {\n type: SettlementEventType.BatchStarted;\n id: string;\n intentIdHashes: string[];\n batchExpiry: bigint;\n};\n\nexport type TreeTxEvent = {\n type: SettlementEventType.TreeTx;\n id: string;\n topic: string[];\n batchIndex: number;\n chunk: TxTreeNode;\n};\n\nexport type TreeSignatureEvent = {\n type: SettlementEventType.TreeSignature;\n id: string;\n topic: string[];\n batchIndex: number;\n txid: string;\n signature: string;\n};\n\nexport type StreamStartedEvent = {\n type: SettlementEventType.StreamStarted;\n id: string;\n};\n\nexport type SettlementEvent =\n | BatchFinalizationEvent\n | BatchFinalizedEvent\n | BatchFailedEvent\n | TreeSigningStartedEvent\n | TreeNoncesEvent\n | BatchStartedEvent\n | TreeTxEvent\n | TreeSignatureEvent\n | StreamStartedEvent;\n\nexport interface ScheduledSession {\n duration: bigint;\n fees: FeeInfo;\n nextEndTime: bigint;\n nextStartTime: bigint;\n period: bigint;\n}\n\nexport interface FeeInfo {\n intentFee: IntentFeeConfig;\n txFeeRate: string;\n}\n\nexport interface PendingTx {\n arkTxid: string;\n finalArkTx: string;\n signedCheckpointTxs: string[];\n}\n\nexport interface DeprecatedSigner {\n /**\n * Unix timestamp (seconds) after which the server no longer accepts this\n * signer's VTXOs as cooperative-migration inputs. arkd advertises this as a\n * non-nullable field, so it is always present: `0n` is the sentinel for \"no\n * cutoff advertised\" — the deprecated signer is due for migration\n * immediately ({@link classifyContractSigner} maps `0n` to `DUE_NOW`). A\n * positive value is a real deadline (`MIGRATABLE` until it passes, then\n * `EXPIRED`).\n */\n cutoffDate: bigint;\n pubkey: string;\n}\n\nexport type ServiceStatus = Record<string, string>;\n\nexport interface ArkInfo {\n boardingExitDelay: bigint;\n checkpointTapscript: string;\n deprecatedSigners: DeprecatedSigner[];\n digest: string;\n dust: bigint;\n fees: FeeInfo;\n forfeitAddress: string;\n forfeitPubkey: string;\n network: string;\n scheduledSession?: ScheduledSession;\n serviceStatus: ServiceStatus;\n sessionDuration: bigint;\n signerPubkey: string;\n unilateralExitDelay: bigint;\n /**\n * Sweep delay the operator advertises for the shared batch output.\n * `undefined` when not advertised — never coerce to `0n`, which would\n * satisfy any floor comparison.\n */\n vtxoTreeExpiry?: bigint;\n /**\n * Maximum boarding input amount.\n *\n * @remarks\n * `-1` means unlimited, while `0` disables boarding.\n */\n utxoMaxAmount: bigint;\n utxoMinAmount: bigint;\n version: string;\n /**\n * Maximum virtual output amount.\n *\n * @remarks\n * `-1` means unlimited.\n */\n vtxoMaxAmount: bigint;\n vtxoMinAmount: bigint;\n}\n\n/** Signed intent payload sent to the Arkade server. */\nexport interface SignedIntent<T extends Intent.Message> {\n /** Base64-encoded signed proof transaction. */\n proof: string;\n\n /** Intent message payload associated with the proof. */\n message: T;\n}\n\n/** Transaction notification emitted by the Arkade server stream. */\nexport interface TxNotification {\n /** Transaction id. */\n txid: string;\n\n /** Raw transaction payload. */\n tx: string;\n\n /** Virtual outputs spent by the transaction. */\n spentVtxos: Vtxo[];\n\n /** Virtual outputs made spendable by the transaction. */\n spendableVtxos: Vtxo[];\n\n /** Optional checkpoint transactions associated with the notification. */\n checkpointTxs?: Record<string, { txid: string; tx: string }>;\n}\n\nexport interface ArkProvider {\n /** Fetch Arkade server configuration and fee settings. */\n getInfo(): Promise<ArkInfo>;\n\n /** Submit a signed Arkade transaction and its checkpoint transactions. */\n submitTx(\n signedArkTx: string,\n checkpointTxs: string[],\n ): Promise<{\n arkTxid: string;\n finalArkTx: string;\n signedCheckpointTxs: string[];\n }>;\n\n /** Finalize a previously submitted Arkade transaction. */\n finalizeTx(arkTxid: string, finalCheckpointTxs: string[]): Promise<void>;\n\n /** Register a signed intent with the Arkade server. */\n registerIntent(intent: SignedIntent<Intent.RegisterMessage>): Promise<string>;\n\n /** Delete a previously registered intent. */\n deleteIntent(intent: SignedIntent<Intent.DeleteMessage>): Promise<void>;\n\n /** Confirm an already registered intent id. */\n confirmRegistration(intentId: string): Promise<void>;\n\n /** Submit musig2 tree nonces for a batch signing session. */\n submitTreeNonces(batchId: string, pubkey: string, nonces: TreeNonces): Promise<void>;\n\n /** Submit musig2 partial signatures for a batch signing session. */\n submitTreeSignatures(\n batchId: string,\n pubkey: string,\n signatures: TreePartialSigs,\n ): Promise<void>;\n\n /** Submit signed forfeit transactions for cooperative settlement. */\n submitSignedForfeitTxs(signedForfeitTxs: string[], signedCommitmentTx?: string): Promise<void>;\n\n /** Open the settlement event stream for the given topics. */\n getEventStream(signal: AbortSignal, topics: string[]): AsyncIterableIterator<SettlementEvent>;\n\n /** Stream transaction notifications emitted by the Arkade server. */\n getTransactionsStream(signal: AbortSignal): AsyncIterableIterator<{\n commitmentTx?: TxNotification;\n arkTx?: TxNotification;\n }>;\n\n /** Fetch pending transactions for a signed get-pending-tx intent. */\n getPendingTxs(intent: SignedIntent<Intent.GetPendingTxMessage>): Promise<PendingTx[]>;\n}\n\n/**\n * REST-based Arkade provider implementation.\n *\n * @see https://buf.build/arkade-os/arkd/docs/main:ark.v1#ark.v1.ArkService\n * @example\n * ```typescript\n * const provider = new RestArkProvider('https://arkade.computer');\n * const info = await provider.getInfo();\n * ```\n */\nexport class RestArkProvider implements ArkProvider {\n /** Overrides {@link configureEventSource} for this provider's streams. */\n protected readonly eventSource?: EventSourceFactory;\n\n constructor(\n public serverUrl: string = DEFAULT_ARKADE_SERVER_URL,\n options: EventSourceCapable = {},\n ) {\n this.eventSource = options.eventSource;\n }\n\n /**\n * Last server-info digest seen (from {@link getInfo}). Sent as `X-Digest`\n * on outgoing requests so arkd can reject a client whose cached info is\n * stale. Empty until the first {@link getInfo}.\n */\n private _digest = \"\";\n\n private _serverInfoListeners = new Set<(info: ArkInfo) => void>();\n\n /**\n * Subscribe to server-info changes. Fired when a request is rejected with\n * `DIGEST_MISMATCH` and fresh info is re-fetched, so consumers (the wallet)\n * can re-derive signer-dependent state mid-session without polling. Returns\n * an unsubscribe function.\n */\n onServerInfoChanged(listener: (info: ArkInfo) => void): () => void {\n this._serverInfoListeners.add(listener);\n return () => {\n this._serverInfoListeners.delete(listener);\n };\n }\n\n private emitServerInfoChanged(info: ArkInfo): void {\n for (const listener of this._serverInfoListeners) {\n try {\n listener(info);\n } catch (e) {\n console.warn(\"onServerInfoChanged listener threw\", e);\n }\n }\n }\n\n /**\n * `fetch` wrapper for arkd requests that participates in server-info digest\n * negotiation. Sends the cached `X-Digest`; when arkd rejects a request with\n * `DIGEST_MISMATCH`, refreshes {@link getInfo} (updating the digest), fires\n * {@link onServerInfoChanged}, and THROWS {@link DigestMismatchError} — it\n * never silently retries, since the in-flight request was built against the\n * now-stale config. Dormant until arkd returns the error — then it is the\n * instant, event-driven signer-rotation trigger. {@link getInfo} itself never\n * routes through here: it is the refresh path and must not be digest-gated.\n */\n private async authedFetch(url: string, init: RequestInit): Promise<Response> {\n // Read the cached digest once, in the method body where `this` is\n // unambiguously the provider, and build the header set imperatively. A\n // prior nested-arrow form (`() => this._digest ? ... : init`) read\n // `this._digest` as empty on some CI runners and dropped the header.\n const digest = this._digest;\n const headers: Record<string, string> = {\n ...(init.headers as Record<string, string> | undefined),\n };\n if (digest) headers[\"X-Digest\"] = digest;\n let response: Response;\n try {\n response = await fetch(url, { ...init, headers });\n } catch (err) {\n // Server unreachable: surface a typed retryable unavailable error so\n // cooperative flows fail with it rather than leaking a raw FetchError.\n throw toProviderUnavailable(err, \"arkade\");\n }\n if (response.ok) return response;\n // Report-only (see rateGate): this POST is never delayed or retried.\n if (response.status === 429) {\n rateGate.reportRateLimited(url, response.headers?.get(\"retry-after\"));\n }\n // Read the body first: error classification must branch on its content,\n // not just the HTTP status. arkd is behind grpc-gateway, which renders\n // application-level errors across the 4xx AND 5xx range (gRPC INTERNAL ->\n // HTTP 500), so status alone can't tell a terminal rejection apart from a\n // genuine availability failure.\n let body: string;\n try {\n body = await response.clone().text();\n } catch (e) {\n // Couldn't read the body to classify it (e.g. the connection dropped\n // mid-body). Fall back to status-only classification so a genuine\n // 429/5xx still surfaces as retryable; digest detection is only\n // deferred to the next getInfo(), not lost.\n console.warn(\"authedFetch could not read response body for digest check\", e);\n throwIfHttpUnavailable(response, \"arkade\");\n return response;\n }\n // Only arkd's *structured* digest error counts: a grpc-gateway\n // ErrorDetails whose name is DIGEST_MISMATCH (arkd's X-Digest guard,\n // v0.9.9-rc.1 #1104), parsed via the shared maybeArkError. A raw\n // substring match would let an unrelated error body that merely mentions\n // the token trigger a spurious refresh + signer rotation.\n const arkError = maybeArkError(new Error(body));\n // A structured arkd error means the operator is up and deliberately\n // rejecting the request — terminal, even when grpc-gateway renders it as a\n // 5xx. Only a non-structured 429/5xx (a bare proxy/gateway failure) is a\n // retryable availability condition.\n if (!arkError) throwIfHttpUnavailable(response, \"arkade\");\n if (!isArkError(arkError, ArkErrorName.DIGEST_MISMATCH)) return response;\n // arkd rejected this request because our cached server info is stale\n // (e.g. the operator rotated its signer). Mirror NArk's BuildVersionHandler\n // (dotnet-sdk #131): clear the digest, refetch info, fire onServerInfoChanged\n // so the wallet re-derives signer-dependent state, then THROW. The SDK does\n // NOT silently retry — the in-flight request was built against the old config,\n // so the caller must rebuild and retry it under the refreshed server info.\n this._digest = \"\";\n const info = await this.getInfo();\n this.emitServerInfoChanged(info);\n throw new DigestMismatchError(\n \"Arkade server reported a configuration digest mismatch; server info was \" +\n \"refreshed. Rebuild and retry the request under the new server info.\",\n );\n }\n\n async getInfo(): Promise<ArkInfo> {\n const url = `${this.serverUrl}/v1/info`;\n // Wait + report (see rateGate): shares an origin, and a limiter, with\n // the indexer.\n const response = await rateGate.runHttp(url, () => fetch(url));\n if (!response.ok) {\n const errorText = await response.text();\n // A 429 or 5xx means the operator is up but temporarily unable to\n // serve — a retryable availability failure, not a config/auth error.\n // Surface it as a typed unavailable error so wallet boot can fall\n // back to a cached server-info snapshot. Pass the body so a 5xx that\n // actually carries a structured arkd error (grpc-gateway maps gRPC\n // INTERNAL -> HTTP 500) stays terminal instead. `fetch` transport\n // failures (server unreachable) are already surfaced as FetchError\n // upstream.\n throwIfHttpUnavailable(response, \"arkade\", errorText);\n handleError(errorText, `Failed to get server info: ${response.statusText}`);\n }\n const fromServer = await response.json();\n const info: ArkInfo = {\n boardingExitDelay: BigInt(fromServer.boardingExitDelay ?? 0),\n checkpointTapscript: fromServer.checkpointTapscript ?? \"\",\n deprecatedSigners:\n fromServer.deprecatedSigners?.map((signer: any) => ({\n // arkd advertises `cutoffDate` as a non-nullable field, so it\n // is always a bigint here — `0n` is the sentinel for \"no\n // cutoff\" (the classifier maps it to DUE_NOW). The grpc-gateway\n // marshals with EmitUnpopulated, so an unset `cutoff_date`\n // already arrives as `\"0\"`; a genuinely missing field defaults\n // to `0n` too. Never collapse to `undefined`.\n cutoffDate: BigInt(signer.cutoffDate ?? 0),\n pubkey: signer.pubkey ?? \"\",\n })) ?? [],\n digest: fromServer.digest ?? \"\",\n dust: BigInt(fromServer.dust ?? 0),\n fees: {\n intentFee: fromServer.fees?.intentFee ?? {},\n txFeeRate: fromServer?.fees?.txFeeRate ?? \"\",\n },\n forfeitAddress: fromServer.forfeitAddress ?? \"\",\n forfeitPubkey: fromServer.forfeitPubkey ?? \"\",\n network: fromServer.network ?? \"\",\n scheduledSession:\n \"scheduledSession\" in fromServer && fromServer.scheduledSession != null\n ? {\n duration: BigInt(fromServer.scheduledSession.duration ?? 0),\n nextStartTime: BigInt(fromServer.scheduledSession.nextStartTime ?? 0),\n nextEndTime: BigInt(fromServer.scheduledSession.nextEndTime ?? 0),\n period: BigInt(fromServer.scheduledSession.period ?? 0),\n fees: fromServer.scheduledSession.fees ?? {},\n }\n : undefined,\n serviceStatus: fromServer.serviceStatus ?? {},\n sessionDuration: BigInt(fromServer.sessionDuration ?? 0),\n signerPubkey: fromServer.signerPubkey ?? \"\",\n unilateralExitDelay: BigInt(fromServer.unilateralExitDelay ?? 0),\n vtxoTreeExpiry:\n fromServer.vtxoTreeExpiry != null ? BigInt(fromServer.vtxoTreeExpiry) : undefined,\n utxoMaxAmount: BigInt(fromServer.utxoMaxAmount ?? -1),\n utxoMinAmount: BigInt(fromServer.utxoMinAmount ?? 0),\n version: fromServer.version ?? \"\",\n vtxoMaxAmount: BigInt(fromServer.vtxoMaxAmount ?? -1),\n vtxoMinAmount: BigInt(fromServer.vtxoMinAmount ?? 0),\n };\n this._digest = info.digest;\n return info;\n }\n\n async submitTx(\n signedArkTx: string,\n checkpointTxs: string[],\n ): Promise<{\n arkTxid: string;\n finalArkTx: string;\n signedCheckpointTxs: string[];\n }> {\n const url = `${this.serverUrl}/v1/tx/submit`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n signedArkTx,\n checkpointTxs,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to submit virtual transaction: ${errorText}`);\n }\n\n const data = await response.json();\n return {\n arkTxid: data.arkTxid,\n finalArkTx: data.finalArkTx,\n signedCheckpointTxs: data.signedCheckpointTxs,\n };\n }\n\n async finalizeTx(arkTxid: string, finalCheckpointTxs: string[]): Promise<void> {\n const url = `${this.serverUrl}/v1/tx/finalize`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n arkTxid,\n finalCheckpointTxs,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to finalize offchain transaction: ${errorText}`);\n }\n }\n\n async registerIntent(intent: SignedIntent<Intent.RegisterMessage>): Promise<string> {\n const url = `${this.serverUrl}/v1/batch/registerIntent`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n intent: {\n proof: intent.proof,\n message: Intent.encodeMessage(intent.message),\n },\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to register intent: ${errorText}`);\n }\n\n const data = await response.json();\n return data.intentId;\n }\n\n async deleteIntent(intent: SignedIntent<Intent.DeleteMessage>): Promise<void> {\n const url = `${this.serverUrl}/v1/batch/deleteIntent`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n intent: {\n proof: intent.proof,\n message: Intent.encodeMessage(intent.message),\n },\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to delete intent: ${errorText}`);\n }\n }\n\n async confirmRegistration(intentId: string): Promise<void> {\n const url = `${this.serverUrl}/v1/batch/ack`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n intentId,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to confirm registration: ${errorText}`);\n }\n }\n\n async submitTreeNonces(batchId: string, pubkey: string, nonces: TreeNonces): Promise<void> {\n const url = `${this.serverUrl}/v1/batch/tree/submitNonces`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n batchId,\n pubkey,\n treeNonces: encodeMusig2Nonces(nonces),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to submit tree nonces: ${errorText}`);\n }\n }\n\n async submitTreeSignatures(\n batchId: string,\n pubkey: string,\n signatures: TreePartialSigs,\n ): Promise<void> {\n const url = `${this.serverUrl}/v1/batch/tree/submitSignatures`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n batchId,\n pubkey,\n treeSignatures: encodeMusig2Signatures(signatures),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to submit tree signatures: ${errorText}`);\n }\n }\n\n async submitSignedForfeitTxs(\n signedForfeitTxs: string[],\n signedCommitmentTx?: string,\n ): Promise<void> {\n const url = `${this.serverUrl}/v1/batch/submitForfeitTxs`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n signedForfeitTxs: signedForfeitTxs,\n signedCommitmentTx: signedCommitmentTx,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to submit forfeit transactions: ${response.statusText}`);\n }\n }\n\n getEventStream(signal: AbortSignal, topics: string[]): AsyncIterableIterator<SettlementEvent> {\n const url = `${this.serverUrl}/v1/batch/events`;\n const queryParams =\n topics.length > 0\n ? `?${topics.map((topic) => `topics=${encodeURIComponent(topic)}`).join(\"&\")}`\n : \"\";\n\n // The EventSource is allocated inside the generator body so that\n // abandoning the returned iterator before iteration starts does not\n // leak the underlying SSE connection. `return()` is overridden below\n // so that closing the generator also closes the connection even when\n // the body is currently suspended at an await point.\n let iterator: ReturnType<typeof eventSourceIterator> | null = null;\n const closeIterator = () => iterator?.close();\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const gen = (async function* () {\n const abortHandler = closeIterator;\n signal?.addEventListener(\"abort\", abortHandler);\n\n try {\n while (!signal?.aborted) {\n const currentIterator = eventSourceIterator(\n resolveEventSource(self.eventSource)(url + queryParams),\n );\n iterator = currentIterator;\n\n try {\n for await (const event of currentIterator) {\n if (signal?.aborted) break;\n\n try {\n const data = JSON.parse(event.data);\n const settlementEvent = self.parseSettlementEvent(data);\n if (settlementEvent) {\n yield settlementEvent;\n }\n } catch (err) {\n console.error(\"Failed to parse event:\", err);\n throw err;\n }\n }\n } catch (error) {\n if (\n signal?.aborted ||\n (error instanceof Error && error.name === \"AbortError\")\n ) {\n break;\n }\n\n // ignore timeout errors, they're expected when the server is not sending anything for 5 min\n if (isFetchTimeoutError(error)) {\n console.debug(\"Timeout error ignored\");\n continue;\n }\n\n if (isEventSourceError(error)) {\n throw error;\n }\n\n // A missing EventSource is an environment fact, not a\n // stream failure: the caller reports it once (see\n // ContractWatcher), where this loop would log it on\n // every reconnect attempt.\n if (isEventSourceUnavailableError(error)) throw error;\n\n console.error(\"Event stream error:\", error);\n throw error;\n } finally {\n currentIterator.close();\n iterator = null;\n }\n }\n } finally {\n signal?.removeEventListener(\"abort\", abortHandler);\n closeIterator();\n }\n })();\n\n const origReturn = gen.return.bind(gen);\n gen.return = (value) => {\n closeIterator();\n return origReturn(value);\n };\n\n return gen;\n }\n\n getTransactionsStream(signal: AbortSignal): AsyncIterableIterator<{\n commitmentTx?: TxNotification;\n arkTx?: TxNotification;\n }> {\n const url = `${this.serverUrl}/v1/txs`;\n let iterator: ReturnType<typeof eventSourceIterator> | null = null;\n const closeIterator = () => iterator?.close();\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const gen = (async function* () {\n const abortHandler = closeIterator;\n signal?.addEventListener(\"abort\", abortHandler);\n\n try {\n while (!signal?.aborted) {\n try {\n const currentIterator = eventSourceIterator(\n resolveEventSource(self.eventSource)(url),\n );\n iterator = currentIterator;\n\n for await (const event of currentIterator) {\n if (signal?.aborted) break;\n\n try {\n const data = JSON.parse(event.data);\n const txNotification = self.parseTransactionNotification(data);\n if (txNotification) {\n yield txNotification;\n }\n } catch (err) {\n console.error(\"Failed to parse transaction notification:\", err);\n throw err;\n }\n }\n } catch (error) {\n if (\n signal?.aborted ||\n (error instanceof Error && error.name === \"AbortError\")\n ) {\n break;\n }\n\n // ignore timeout errors, they're expected when the server is not sending anything for 5 min\n if (isFetchTimeoutError(error)) {\n console.debug(\"Timeout error ignored\");\n continue;\n }\n\n if (isEventSourceError(error)) {\n throw error;\n }\n\n // A missing EventSource is an environment fact, not a\n // stream failure: the caller reports it once (see\n // ContractWatcher), where this loop would log it on\n // every reconnect attempt.\n if (isEventSourceUnavailableError(error)) throw error;\n\n console.error(\"Transaction stream error:\", error);\n throw error;\n } finally {\n closeIterator();\n iterator = null;\n }\n }\n } finally {\n signal?.removeEventListener(\"abort\", abortHandler);\n closeIterator();\n }\n })();\n\n const origReturn = gen.return.bind(gen);\n gen.return = (value) => {\n closeIterator();\n return origReturn(value);\n };\n\n return gen;\n }\n\n async getPendingTxs(intent: SignedIntent<Intent.GetPendingTxMessage>): Promise<PendingTx[]> {\n const url = `${this.serverUrl}/v1/tx/pending`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n intent: {\n proof: intent.proof,\n message: Intent.encodeMessage(intent.message),\n },\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to get pending transactions: ${errorText}`);\n }\n\n const data = await response.json();\n return data.pendingTxs;\n }\n\n protected parseSettlementEvent(\n data: ProtoTypes.GetEventStreamResponse,\n ): SettlementEvent | null {\n // Check for BatchStarted event\n if (data.batchStarted) {\n return {\n type: SettlementEventType.BatchStarted,\n id: data.batchStarted.id,\n intentIdHashes: data.batchStarted.intentIdHashes,\n batchExpiry: BigInt(data.batchStarted.batchExpiry),\n };\n }\n\n // Check for BatchFinalization event\n if (data.batchFinalization) {\n return {\n type: SettlementEventType.BatchFinalization,\n id: data.batchFinalization.id,\n commitmentTx: data.batchFinalization.commitmentTx,\n };\n }\n\n // Check for BatchFinalized event\n if (data.batchFinalized) {\n return {\n type: SettlementEventType.BatchFinalized,\n id: data.batchFinalized.id,\n commitmentTxid: data.batchFinalized.commitmentTxid,\n };\n }\n\n // Check for BatchFailed event\n if (data.batchFailed) {\n return {\n type: SettlementEventType.BatchFailed,\n id: data.batchFailed.id,\n reason: data.batchFailed.reason,\n };\n }\n\n // Check for TreeSigningStarted event\n if (data.treeSigningStarted) {\n return {\n type: SettlementEventType.TreeSigningStarted,\n id: data.treeSigningStarted.id,\n cosignersPublicKeys: data.treeSigningStarted.cosignersPubkeys,\n unsignedCommitmentTx: data.treeSigningStarted.unsignedCommitmentTx,\n };\n }\n\n // Check for TreeNoncesAggregated event\n if (data.treeNoncesAggregated) {\n // skip treeNoncesAggregated event, deprecated\n return null;\n }\n\n if (data.treeNonces) {\n return {\n type: SettlementEventType.TreeNonces,\n id: data.treeNonces.id,\n topic: data.treeNonces.topic,\n txid: data.treeNonces.txid,\n nonces: decodeMusig2Nonces(data.treeNonces.nonces), // pubkey -> public nonce\n };\n }\n\n // Check for TreeTx event\n if (data.treeTx) {\n const children = Object.fromEntries(\n Object.entries(data.treeTx.children).map(([outputIndex, txid]) => {\n return [parseInt(outputIndex), txid];\n }),\n );\n\n return {\n type: SettlementEventType.TreeTx,\n id: data.treeTx.id,\n topic: data.treeTx.topic,\n batchIndex: data.treeTx.batchIndex,\n chunk: {\n txid: data.treeTx.txid,\n tx: data.treeTx.tx,\n children,\n },\n };\n }\n\n if (data.treeSignature) {\n return {\n type: SettlementEventType.TreeSignature,\n id: data.treeSignature.id,\n topic: data.treeSignature.topic,\n batchIndex: data.treeSignature.batchIndex,\n txid: data.treeSignature.txid,\n signature: data.treeSignature.signature,\n };\n }\n\n if (data.streamStarted) {\n return {\n type: SettlementEventType.StreamStarted,\n id: data.streamStarted.id,\n };\n }\n\n // Skip heartbeat events\n if (data.heartbeat) {\n return null;\n }\n\n console.warn(\"Unknown event type:\", data);\n return null;\n }\n\n protected parseTransactionNotification(\n data: ProtoTypes.GetTransactionsStreamResponse,\n ): { commitmentTx?: TxNotification; arkTx?: TxNotification } | null {\n if (data.commitmentTx) {\n return {\n commitmentTx: {\n txid: data.commitmentTx.txid,\n tx: data.commitmentTx.tx,\n spentVtxos: data.commitmentTx.spentVtxos.map(mapVtxo),\n spendableVtxos: data.commitmentTx.spendableVtxos.map(mapVtxo),\n checkpointTxs: data.commitmentTx.checkpointTxs,\n },\n };\n }\n\n if (data.arkTx) {\n return {\n arkTx: {\n txid: data.arkTx.txid,\n tx: data.arkTx.tx,\n spentVtxos: data.arkTx.spentVtxos.map(mapVtxo),\n spendableVtxos: data.arkTx.spendableVtxos.map(mapVtxo),\n checkpointTxs: data.arkTx.checkpointTxs,\n },\n };\n }\n\n // Skip heartbeat events\n if (data.heartbeat) {\n return null;\n }\n\n console.warn(\"Unknown transaction notification type:\", data);\n return null;\n }\n}\n\nfunction encodeMusig2Nonces(nonces: TreeNonces): Record<string, string> {\n const noncesObject: Record<string, string> = {};\n for (const [txid, nonce] of nonces) {\n noncesObject[txid] = hex.encode(nonce.pubNonce);\n }\n return noncesObject;\n}\n\nfunction encodeMusig2Signatures(signatures: TreePartialSigs): Record<string, string> {\n const sigObject: Record<string, string> = {};\n for (const [txid, sig] of signatures) {\n sigObject[txid] = hex.encode(sig.encode());\n }\n return sigObject;\n}\n\nfunction decodeMusig2Nonces(noncesObject: Record<string, string>): TreeNonces {\n return new Map(\n Object.entries(noncesObject).map(([txid, nonce]) => {\n if (typeof nonce !== \"string\") {\n throw new Error(\"invalid nonce\");\n }\n return [txid, { pubNonce: hex.decode(nonce) }];\n }),\n );\n}\n\n// ProtoTypes namespace defines unexported types representing the raw data received from the server\nnamespace ProtoTypes {\n interface BatchStartedEvent {\n id: string;\n intentIdHashes: string[];\n batchExpiry: number;\n }\n\n interface BatchFailed {\n id: string;\n reason: string;\n }\n\n export interface BatchFinalizationEvent {\n id: string;\n commitmentTx: string;\n }\n\n interface BatchFinalizedEvent {\n id: string;\n commitmentTxid: string;\n }\n\n interface TreeSigningStartedEvent {\n id: string;\n cosignersPubkeys: string[];\n unsignedCommitmentTx: string;\n }\n\n interface TreeNoncesAggregatedEvent {\n id: string;\n treeNonces: Record<string, string>;\n }\n\n interface TreeNoncesEvent {\n id: string;\n topic: string[];\n txid: string;\n nonces: Record<string, string>;\n }\n\n interface TreeTxEvent {\n id: string;\n topic: string[];\n batchIndex: number;\n txid: string;\n tx: string;\n children: Record<string, string>;\n }\n\n interface TreeSignatureEvent {\n id: string;\n topic: string[];\n batchIndex: number;\n txid: string;\n signature: string;\n }\n\n interface StreamStartedEvent {\n id: string;\n }\n\n interface Heartbeat {\n // Empty interface for heartbeat events\n }\n\n export interface VtxoData {\n outpoint: {\n txid: string;\n vout: number;\n };\n amount: string;\n script: string;\n createdAt: string;\n expiresAt: string | null;\n commitmentTxids: string[];\n isPreconfirmed: boolean;\n isSwept: boolean;\n isUnrolled: boolean;\n isSpent: boolean;\n spentBy: string;\n settledBy?: string;\n arkTxid?: string;\n }\n\n export interface GetEventStreamResponse {\n batchStarted?: BatchStartedEvent;\n batchFailed?: BatchFailed;\n batchFinalization?: BatchFinalizationEvent;\n batchFinalized?: BatchFinalizedEvent;\n treeSigningStarted?: TreeSigningStartedEvent;\n treeNoncesAggregated?: TreeNoncesAggregatedEvent;\n treeNonces?: TreeNoncesEvent;\n treeTx?: TreeTxEvent;\n treeSignature?: TreeSignatureEvent;\n streamStarted?: StreamStartedEvent;\n heartbeat?: Heartbeat;\n }\n\n export interface GetTransactionsStreamResponse {\n commitmentTx?: {\n txid: string;\n tx: string;\n spentVtxos: VtxoData[];\n spendableVtxos: VtxoData[];\n checkpointTxs?: Record<string, { txid: string; tx: string }>;\n };\n arkTx?: {\n txid: string;\n tx: string;\n spentVtxos: VtxoData[];\n spendableVtxos: VtxoData[];\n checkpointTxs?: Record<string, { txid: string; tx: string }>;\n };\n heartbeat?: Heartbeat;\n }\n\n // Legacy types for backward compatibility\n export interface EventData {\n batchStarted?: BatchStartedEvent;\n batchFailed?: BatchFailed;\n batchFinalization?: BatchFinalizationEvent;\n batchFinalized?: BatchFinalizedEvent;\n treeSigningStarted?: TreeSigningStartedEvent;\n treeNoncesAggregated?: TreeNoncesAggregatedEvent;\n treeTx?: TreeTxEvent;\n treeSignature?: TreeSignatureEvent;\n }\n\n export interface TransactionData {\n commitmentTx?: {\n txid: string;\n tx: string;\n spentVtxos: VtxoData[];\n spendableVtxos: VtxoData[];\n checkpointTxs?: Record<string, { txid: string; tx: string }>;\n };\n arkTx?: {\n txid: string;\n tx: string;\n spentVtxos: VtxoData[];\n spendableVtxos: VtxoData[];\n checkpointTxs?: Record<string, { txid: string; tx: string }>;\n };\n }\n}\n\nexport function isFetchTimeoutError(err: any): boolean {\n const checkError = (error: any) => {\n if (!(error instanceof Error)) return false;\n\n // TODO: get something more robust than this\n const isCloudflare524 = error.name === \"TypeError\" && error.message === \"Failed to fetch\";\n\n return (\n isCloudflare524 ||\n error.name === \"HeadersTimeoutError\" ||\n error.name === \"BodyTimeoutError\" ||\n (error as any).code === \"UND_ERR_HEADERS_TIMEOUT\" ||\n (error as any).code === \"UND_ERR_BODY_TIMEOUT\"\n );\n };\n\n return checkError(err) || checkError((err as any).cause);\n}\n\nfunction mapVtxo(vtxo: ProtoTypes.VtxoData): Vtxo {\n return {\n outpoint: {\n txid: vtxo.outpoint.txid,\n vout: vtxo.outpoint.vout,\n },\n amount: vtxo.amount,\n script: vtxo.script,\n createdAt: vtxo.createdAt,\n expiresAt: vtxo.expiresAt,\n commitmentTxids: vtxo.commitmentTxids,\n isPreconfirmed: vtxo.isPreconfirmed,\n isSwept: vtxo.isSwept,\n isUnrolled: vtxo.isUnrolled,\n isSpent: vtxo.isSpent,\n spentBy: vtxo.spentBy,\n settledBy: vtxo.settledBy,\n arkTxid: vtxo.arkTxid,\n };\n}\n\nfunction handleError(errorText: string, defaultMessage: string): never {\n const error = new Error(errorText);\n const arkError = maybeArkError(error);\n throw arkError ?? new Error(defaultMessage);\n}\n","import { FetchError } from \"../utils/fetch\";\nimport { isFetchTimeoutError } from \"./ark\";\nimport { ProviderUnavailableError } from \"./errors\";\n\n/**\n * Whether a provider error is a *retryable* availability failure (operator or\n * indexer temporarily unreachable) rather than a terminal one.\n *\n * Retryable:\n * - {@link ProviderUnavailableError} — already-classified 5xx/429/unavailable\n * (see e.g. {@link https | RestArkProvider.getInfo}'s non-2xx branch);\n * - {@link FetchError} — transport-level `fetch` rejection (DNS failure,\n * connection refused, TLS/CORS), which also carries undici timeouts as its\n * `cause`;\n * - {@link isFetchTimeoutError} — header/body timeouts that surface directly.\n *\n * Everything else (4xx, invalid JSON, schema violations, network mismatch,\n * unsupported network) is terminal and returns `false`.\n *\n * NOTE (Step 2, Scope 2): this classifies the errors currently produced by the\n * boot-critical `getInfo` path. Normalizing the indexer's per-branch\n * `!res.ok` throws and the remaining Ark RPC methods into\n * {@link ProviderUnavailableError} is the broader Scope-2 work still pending.\n */\nexport function isRetryableProviderError(error: unknown): boolean {\n return (\n error instanceof ProviderUnavailableError ||\n error instanceof FetchError ||\n isFetchTimeoutError(error)\n );\n}\n","/**\n * Default indexer pagination size for batched VTXO queries (`getVtxos`).\n *\n * Shared by {@link ContractManager}'s bulk history sync, the discovery\n * handlers' batched `detectUsedScripts` probe, and `wallet/vtxo.ts`'s chunked\n * reader so they can't drift. It lives in its own leaf module (importing\n * nothing) so every layer can use it without a `handlers → contractManager`\n * import cycle — contractManager imports the handler registry, so the handlers\n * must not import back from contractManager.\n *\n * Large enough that a single wallet index's candidate scripts resolve in one\n * page in the common case.\n */\nexport const DEFAULT_PAGE_SIZE = 500;\n\n/**\n * Maximum scripts per `getVtxos` query string.\n *\n * Scripts cost ~77 bytes each in the URL, so an unbounded wallet-derived list\n * `414`s: a few hundred contracts is ~28 KB. 32 keeps a request at ~2.6 KB —\n * well inside any plausible limit, since `arkd`'s real ceiling is unpublished\n * and 16 is the largest batch observed working in the wild.\n *\n * Shared by `wallet/vtxo.ts`'s `getAllNormalizedVtxos` and the discovery\n * handlers' batched `detectUsedScripts` probe (which also gets a 10-index scan\n * window collapsed into 1-2 requests as a side effect) so the two can't drift\n * onto different budgets for the same URL constraint.\n */\nexport const SCRIPT_QUERY_CHUNK_SIZE = 32;\n\n/**\n * Maximum outpoints per `getVtxos` query string. ~79 encoded bytes each, so 64\n * is ~5 KB — real margin under the common 8 KB request-line ceiling, against\n * the same unpublished `arkd` limit that budgets scripts at 32.\n */\nexport const OUTPOINT_QUERY_CHUNK_SIZE = 64;\n","import {\n DEFAULT_PAGE_SIZE,\n OUTPOINT_QUERY_CHUNK_SIZE,\n SCRIPT_QUERY_CHUNK_SIZE,\n} from \"../contracts/constants\";\nimport { isRetryableProviderError } from \"../providers/availability\";\nimport type { GetVtxosOptions, IndexerProvider, PageResponse, Vtxo } from \"../providers/indexer\";\nimport type { OnchainProvider } from \"../providers/onchain\";\nimport type { ExtendedVirtualCoin, VirtualCoin, VirtualStatus } from \"./index\";\n\n/**\n * Canonical VTXO facts, the conversions between them and the legacy `virtualStatus` projection,\n * and the capability predicates behavior is expected to read.\n *\n * Three directions are owned here:\n *\n * 1. wire `Vtxo` -> canonical ({@link convertVtxo})\n * 2. canonical -> legacy `virtualStatus` ({@link toVirtualStatus})\n * 3. legacy `virtualStatus` -> canonical ({@link normalizeVtxo})\n *\n * Direction 3 is not just for old persisted rows: `IndexerProvider` and `WalletRepository` are\n * public interfaces, so consumer implementations may hand back legacy-shaped coins through the\n * front door. Normalization therefore runs where the SDK *consumes* an interface, never inside an\n * implementation of one.\n */\n\n/**\n * Below this, a millisecond value is too small to be a real batch expiry and is read as a block\n * height instead. The server returns one scalar for both units.\n *\n * A UTC constant rather than `getFullYear()`, which reads local time and would make the\n * classification depend on the runtime's timezone.\n */\nexport const EXPIRY_MIN_PLAUSIBLE_MS = Date.UTC(2025, 0, 1);\n\n/**\n * The current moment, as the expiry predicates need it.\n *\n * `height` is optional: offline-first paths have no chain tip at hand. When it is absent,\n * height-based expiry cannot be evaluated and reads as not expired.\n */\nexport type TimeHeight = { timestamp: Date; height?: number };\n\n/**\n * Resolve the {@link TimeHeight} for one expiry-driven pass.\n *\n * @remarks\n * Fetch the tip once per pass and reuse the result for every VTXO in it, so the pass judges them\n * all against the same height.\n *\n * A tip-fetch failure **degrades to timestamp-only rather than blocking**: height-encoded expiry\n * then reads as not expired, which is what the whole SDK did before heights were evaluated at all.\n * Recovery and deprecated-signer migration must not become unavailable because the onchain provider\n * is down.\n *\n * Pass no provider to opt out of height entirely — the offline-first paths (balance, coin\n * selection) do this deliberately.\n */\nexport async function resolveTimeHeight(\n provider?: Pick<OnchainProvider, \"getChainTip\">,\n): Promise<TimeHeight> {\n const timestamp = new Date();\n if (!provider) return { timestamp };\n try {\n const tip = await provider.getChainTip();\n return { timestamp, height: tip.height };\n } catch (e) {\n console.warn(\"Failed to fetch chain tip; height-based expiry will not be evaluated\", e);\n return { timestamp };\n }\n}\n\n/**\n * A {@link VirtualCoin} that has passed through {@link normalizeVtxo}: every fact the capability\n * predicates read is present.\n *\n * Internal signatures take this rather than `VirtualCoin` so the compiler rejects un-normalized\n * input — on the public shape these facts are optional, and `undefined` is falsy, so a legacy coin\n * would silently read as \"not swept\", \"not spent\", and drop out of the wrong bucket.\n *\n * It is deliberately a *subtype* of `VirtualCoin`, so normalized coins are returned to consumers\n * directly and no egress projection exists.\n */\nexport type NormalizedVirtualCoin = Omit<\n VirtualCoin,\n \"isSwept\" | \"isPreconfirmed\" | \"isSpent\" | \"spentBy\" | \"commitmentTxIds\"\n> & {\n isSwept: boolean;\n isPreconfirmed: boolean;\n isSpent: boolean;\n spentBy: string;\n commitmentTxIds: string[];\n};\n\nexport type NormalizedExtendedVirtualCoin = ExtendedVirtualCoin & NormalizedVirtualCoin;\n\n// --- expiry ------------------------------------------------------------------------------------\n\n/** The wire's single `expiresAt` scalar -> canonical, disambiguating seconds from height. */\nexport function parseWireExpiry(raw: string | null | undefined): {\n expiresAt?: Date;\n expiresAtHeight?: number;\n} {\n if (raw === null || raw === undefined || raw === \"\") return {};\n const n = Number(raw);\n // `n <= 0` would otherwise yield `expiresAtHeight: 0`, which every chain tip is past — a VTXO\n // with no expiry would read as permanently expired.\n if (!Number.isFinite(n) || n <= 0) return {};\n const ms = n * 1000;\n if (ms >= EXPIRY_MIN_PLAUSIBLE_MS) return { expiresAt: new Date(ms) };\n return { expiresAtHeight: n };\n}\n\n/** Canonical -> legacy `batchExpiry`. */\nexport function toBatchExpiry(c: {\n expiresAt?: Date;\n expiresAtHeight?: number;\n}): number | undefined {\n if (c.expiresAt !== undefined) return c.expiresAt.getTime();\n // Multiplying a block height by 1000 is dimensionally meaningless, but it is what the legacy\n // converter did and what consumers already receive. Preserved deliberately.\n if (c.expiresAtHeight !== undefined) return c.expiresAtHeight * 1000;\n return undefined;\n}\n\n/** Legacy `batchExpiry` -> canonical, inverting {@link toBatchExpiry} on its domain. */\nexport function parseLegacyExpiry(batchExpiry: number | undefined): {\n expiresAt?: Date;\n expiresAtHeight?: number;\n} {\n // Same `<= 0` guard as `parseWireExpiry`.\n if (batchExpiry === undefined || batchExpiry <= 0) return {};\n if (batchExpiry >= EXPIRY_MIN_PLAUSIBLE_MS) return { expiresAt: new Date(batchExpiry) };\n return { expiresAtHeight: batchExpiry / 1000 };\n}\n\n// --- normalization -----------------------------------------------------------------------------\n\n/** Synthesize the legacy projection from canonical facts. */\nexport function toVirtualStatus(c: {\n isSpent?: boolean;\n isSwept?: boolean;\n isPreconfirmed?: boolean;\n commitmentTxIds?: string[];\n expiresAt?: Date;\n expiresAtHeight?: number;\n}): VirtualStatus {\n return {\n // Precedence is load-bearing: consumers bucket on this label, so any other order silently\n // moves VTXOs between buckets.\n state: c.isSpent\n ? \"spent\"\n : c.isSwept\n ? \"swept\"\n : c.isPreconfirmed\n ? \"preconfirmed\"\n : \"settled\",\n commitmentTxIds: c.commitmentTxIds,\n batchExpiry: toBatchExpiry(c),\n };\n}\n\n/**\n * Fill in every canonical fact, deriving from `virtualStatus` when a coin carries only the legacy\n * shape. Idempotent.\n *\n * Facts are derived with `??` so a coin that already carries its own authoritative value keeps it\n * rather than having it re-derived from the lossy projection.\n */\nexport function normalizeVtxo<T extends VirtualCoin>(v: T): T & NormalizedVirtualCoin {\n const state = v.virtualStatus?.state;\n const canonicalExpiry = v.expiresAt !== undefined || v.expiresAtHeight !== undefined;\n const expiry = canonicalExpiry\n ? // Coerce: a backend that persists through JSON hands back an ISO string, which typechecks\n // as `Date` but returns NaN from `.getTime()` — comparing false against everything.\n {\n expiresAt: v.expiresAt === undefined ? undefined : new Date(v.expiresAt),\n expiresAtHeight: v.expiresAtHeight,\n }\n : parseLegacyExpiry(v.virtualStatus?.batchExpiry);\n\n // `state === \"spent\"` cannot tell us whether the coin was *also* swept or preconfirmed — the\n // collapse destroyed that. Reading them as false matches today's behavior: a spent coin already\n // fails every spendability check.\n const isSpent = v.isSpent ?? state === \"spent\";\n const isSwept = v.isSwept ?? state === \"swept\";\n const isPreconfirmed = v.isPreconfirmed ?? state === \"preconfirmed\";\n const commitmentTxIds = v.commitmentTxIds ?? v.virtualStatus?.commitmentTxIds ?? [];\n\n return {\n ...v,\n isSpent,\n isSwept,\n isPreconfirmed,\n spentBy: v.spentBy ?? \"\",\n commitmentTxIds,\n ...expiry,\n virtualStatus:\n v.virtualStatus ??\n toVirtualStatus({ isSpent, isSwept, isPreconfirmed, commitmentTxIds, ...expiry }),\n };\n}\n\n/** Wire `Vtxo` -> canonical `VirtualCoin`. Shared by every indexer provider. */\nexport function convertVtxo(vtxo: Vtxo): NormalizedVirtualCoin {\n const expiry = parseWireExpiry(vtxo.expiresAt);\n const facts = {\n isSpent: vtxo.isSpent,\n isSwept: vtxo.isSwept,\n isPreconfirmed: vtxo.isPreconfirmed,\n commitmentTxIds: vtxo.commitmentTxids,\n ...expiry,\n };\n return {\n txid: vtxo.outpoint.txid,\n vout: vtxo.outpoint.vout,\n value: Number(vtxo.amount),\n status: {\n confirmed: !vtxo.isSwept && !vtxo.isPreconfirmed,\n isLeaf: !vtxo.isPreconfirmed,\n },\n ...facts,\n virtualStatus: toVirtualStatus(facts),\n spentBy: vtxo.spentBy ?? \"\",\n settledBy: vtxo.settledBy,\n arkTxId: vtxo.arkTxid,\n createdAt: new Date(Number(vtxo.createdAt) * 1000),\n isUnrolled: vtxo.isUnrolled,\n script: vtxo.script,\n assets: vtxo.assets?.map((a) => ({\n assetId: a.assetId,\n amount: BigInt(a.amount),\n })),\n };\n}\n\n// --- provider boundary -------------------------------------------------------------------------\n\n/**\n * The only sanctioned way for SDK logic to read VTXOs from an `IndexerProvider`: a drop-in for\n * `provider.getVtxos()` that normalizes whatever came back. A cheap pass-through for the built-in\n * providers, which already populate the facts.\n */\nexport async function getNormalizedVtxos(\n provider: Pick<IndexerProvider, \"getVtxos\">,\n opts?: GetVtxosOptions,\n): Promise<{ vtxos: NormalizedVirtualCoin[]; page?: PageResponse }> {\n const { vtxos, page } = await provider.getVtxos(opts);\n return { vtxos: vtxos.map(normalizeVtxo), page };\n}\n\n/** Everything a script query can filter on, minus the cursor this reader owns. */\nexport type VtxoScriptQuery = Omit<GetVtxosOptions, \"scripts\" | \"outpoints\" | \"pageIndex\">;\n\n/**\n * Read every virtual output for an arbitrary number of scripts.\n *\n * @remarks\n * Scripts travel in the query string, so a wallet-derived list must be chunked\n * at {@link SCRIPT_QUERY_CHUNK_SIZE} or the request `414`s. Chunks run\n * sequentially — that pacing is the point, since this path can now run wide —\n * and each is paged to exhaustion, so callers cannot silently receive page one.\n */\nexport async function getAllNormalizedVtxos(\n provider: Pick<IndexerProvider, \"getVtxos\">,\n scripts: string[],\n opts: VtxoScriptQuery = {},\n): Promise<NormalizedVirtualCoin[]> {\n const { pageSize = DEFAULT_PAGE_SIZE, ...filters } = opts;\n const all: NormalizedVirtualCoin[] = [];\n\n for (let i = 0; i < scripts.length; i += SCRIPT_QUERY_CHUNK_SIZE) {\n const chunk = scripts.slice(i, i + SCRIPT_QUERY_CHUNK_SIZE);\n let pageIndex = 0;\n let hasMore = true;\n\n while (hasMore) {\n const { vtxos, page } = await getNormalizedVtxos(provider, {\n ...filters,\n scripts: chunk,\n pageIndex,\n pageSize,\n });\n all.push(...vtxos);\n\n // A short page means the last one: providers that omit `page`\n // entirely are treated as unpaged.\n hasMore = page ? vtxos.length === pageSize : false;\n pageIndex++;\n if (hasMore) await new Promise((r) => setTimeout(r, 500));\n }\n }\n\n return all;\n}\n\n/**\n * Resolve `createdAt` (epoch ms) for txids by querying each txid's output 0 as a virtual\n * outpoint, chunked at {@link OUTPOINT_QUERY_CHUNK_SIZE}. `pageSize` is explicit because the\n * provider omits `page.size` when unset and a server default below the chunk size would\n * silently short-page. Best-effort: a retryable failure drops its chunk and leaves the map\n * partial; terminal errors propagate.\n */\nexport async function fetchVtxoCreatedAtByTxid(\n provider: Pick<IndexerProvider, \"getVtxos\">,\n txids: string[],\n): Promise<Map<string, number>> {\n const unique = [...new Set(txids)].filter((txid) => txid !== \"\");\n const createdAt = new Map<string, number>();\n\n for (let i = 0; i < unique.length; i += OUTPOINT_QUERY_CHUNK_SIZE) {\n const chunk = unique.slice(i, i + OUTPOINT_QUERY_CHUNK_SIZE);\n try {\n const { vtxos } = await getNormalizedVtxos(provider, {\n outpoints: chunk.map((txid) => ({ txid, vout: 0 })),\n pageSize: DEFAULT_PAGE_SIZE,\n });\n for (const v of vtxos) {\n createdAt.set(v.txid, v.createdAt.getTime());\n }\n } catch (err) {\n if (!isRetryableProviderError(err)) throw err;\n }\n }\n\n return createdAt;\n}\n\n// --- capabilities ------------------------------------------------------------------------------\n\n/**\n * Whether a virtual output has been consumed and can never be spent again.\n *\n * @remarks\n * Unions all three spend facts rather than trusting any one of them. The wire contract permits\n * `isSpent: true` with an empty `spentBy` (settlement inputs needing no forfeit are written that\n * way), so a `spentBy || settledBy` definition would classify a spent VTXO as spendable — inflating\n * balance and selecting it for a send that must fail.\n */\nexport function hasTerminalSpend(vtxo: VirtualCoin): boolean {\n const n = normalizeVtxo(vtxo);\n return !!n.isSpent || !!n.spentBy || !!n.settledBy;\n}\n\n/**\n * Whether a virtual output's batch expiry has passed. Pure expiry — swept is a separate fact, ORed\n * in explicitly by {@link canSpendOffchain} / {@link canRecoverOnchain}.\n *\n * @remarks\n * Not named `isExpired`: the deprecated {@link isExpired} also returns `true` for a swept VTXO, and\n * two same-named predicates with different truth conditions is how a call site gets silently\n * rewired.\n *\n * Height-based expiry is only evaluated when `now.height` is supplied.\n */\nexport function isPastExpiry(vtxo: VirtualCoin, now: TimeHeight): boolean {\n const n = normalizeVtxo(vtxo);\n if (n.expiresAt !== undefined && now.timestamp.getTime() >= n.expiresAt.getTime()) return true;\n return (\n n.expiresAtHeight !== undefined &&\n now.height !== undefined &&\n now.height >= n.expiresAtHeight\n );\n}\n\n/** Whether a virtual output can be spent in an offchain transaction. The send/coin-selection test. */\nexport function canSpendOffchain(vtxo: VirtualCoin, now: TimeHeight): boolean {\n const n = normalizeVtxo(vtxo);\n return !hasTerminalSpend(n) && !(n.isSwept || isPastExpiry(n, now));\n}\n\n/**\n * Whether a virtual output must be recovered into a fresh batch rather than spent offchain. The\n * recovery/renewal test and the `recoverable` balance bucket.\n */\nexport function canRecoverOnchain(vtxo: VirtualCoin, now: TimeHeight): boolean {\n const n = normalizeVtxo(vtxo);\n return !hasTerminalSpend(n) && (n.isSwept || isPastExpiry(n, now));\n}\n\n// --- fee estimation ----------------------------------------------------------------------------\n\n/**\n * The `OffchainInput` fields that come from the VTXO itself, shared by every offchain fee estimate.\n *\n * @remarks\n * `expiry` goes through {@link toBatchExpiry} so the estimator keeps seeing exactly what the legacy\n * `batchExpiry` path fed it. Correcting the height case here would move fees, which is out of\n * scope.\n */\nexport function toOffchainInputFeeParams(vtxo: NormalizedVirtualCoin): {\n amount: bigint;\n type: \"recoverable\" | \"vtxo\";\n weight: number;\n birth: Date;\n expiry: Date | undefined;\n} {\n const batchExpiry = toBatchExpiry(vtxo);\n return {\n amount: BigInt(vtxo.value),\n type: vtxo.isSwept ? \"recoverable\" : \"vtxo\",\n weight: 0,\n birth: vtxo.createdAt,\n expiry: batchExpiry ? new Date(batchExpiry) : undefined,\n };\n}\n\n// --- discrimination ----------------------------------------------------------------------------\n\n/**\n * Narrow a settle input to a virtual output.\n *\n * @remarks\n * Keyed on `script`: it is required on `VirtualCoin` (so legacy and canonical shapes both have it)\n * and absent from `ExtendedCoin`, which the optional canonical facts cannot claim.\n *\n * The `typeof` guard is load-bearing — `settle` accepts arknote strings, and `in` throws a\n * `TypeError` on a primitive rather than returning false.\n */\nexport function isVirtualCoin<T>(input: T): input is T & VirtualCoin {\n return (\n typeof input === \"object\" &&\n input !== null &&\n typeof (input as { script?: unknown }).script === \"string\"\n );\n}\n\n// --- deprecated compatibility wrappers ---------------------------------------------------------\n\n/**\n * Return whether a virtual output is still spendable.\n *\n * @param vtxo - virtual output to inspect\n * @returns `true` when the virtual output has not been consumed\n *\n * @deprecated Ambiguous: `true` for swept or expired virtual outputs, which cannot in fact be spent\n * offchain. Use {@link canSpendOffchain}.\n */\nexport function isSpendable(vtxo: VirtualCoin): boolean {\n return !hasTerminalSpend(vtxo);\n}\n\n/**\n * Return whether a virtual output is recoverable.\n *\n * @param vtxo - virtual output to inspect\n * @returns `true` when the virtual output is swept but not yet consumed\n *\n * @deprecated Swept-only: ignores virtual outputs that are past expiry but not yet swept, which are\n * equally recoverable. Use {@link canRecoverOnchain}.\n */\nexport function isRecoverable(vtxo: VirtualCoin): boolean {\n const n = normalizeVtxo(vtxo);\n return n.isSwept && !hasTerminalSpend(n);\n}\n\n/**\n * Return whether a virtual output should be treated as expired.\n *\n * @param vtxo - virtual output to inspect\n * @returns `true` when the virtual output is swept or its wall-clock batch expiry has passed\n *\n * @deprecated Conflates swept with expired, and cannot evaluate height-based expiry — being\n * synchronous, it has no source for the current chain tip, so it ignores `expiresAtHeight` exactly\n * as it always has. For the recovery decision use {@link canRecoverOnchain}; to reproduce this\n * truth condition use `v.isSwept || isPastExpiry(v, now)`.\n */\nexport function isExpired(vtxo: VirtualCoin): boolean {\n const n = normalizeVtxo(vtxo);\n return n.isSwept || (n.expiresAt !== undefined && n.expiresAt.getTime() <= Date.now());\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/transaction.ts","../src/utils/timelock.ts","../src/utils/unknownFields.ts","../src/networks.ts","../src/script/address.ts","../src/script/tapscript.ts","../src/script/taprootTree.ts","../src/script/base.ts","../src/providers/eventSource.ts","../package.json","../src/utils/fetch.ts","../src/providers/errors.ts","../src/intent/index.ts","../src/providers/utils.ts","../src/providers/rateGate.ts","../src/providers/ark.ts","../src/providers/availability.ts","../src/contracts/constants.ts","../src/wallet/vtxo.ts"],"names":["BtcSignerTransaction","bip68","ArkPsbtFieldKey","RawWitness","ScriptNum","NETWORK","TEST_NETWORK","version","bech32m","Script","MultisigTapscript","CSVMultisigTapscript","ConditionCSVMultisigTapscript","ConditionMultisigTapscript","CLTVMultisigTapscript","hex","MultisigType","encode","p2tr_ms","decode","TAP_LEAF_VERSION","PSBTOutput","p2tr","TAPROOT_UNSPENDABLE_KEY","Address","leaf","Intent","OP","SigHash","schnorr","SettlementEventType"],"mappings":"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","file":"chunk-FZFSGOTZ.cjs","sourcesContent":["import { Transaction as BtcSignerTransaction } from \"@scure/btc-signer\";\nimport { TxOpts } from \"@scure/btc-signer/transaction.js\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\n\n/**\n * Transaction is a wrapper around the @scure/btc-signer Transaction class.\n * It adds the Arkade protocol specific options to the transaction.\n */\nexport class Transaction extends BtcSignerTransaction {\n static ARK_TX_OPTS: TxOpts = {\n allowUnknown: true,\n allowUnknownOutputs: true,\n allowUnknownInputs: true,\n };\n\n constructor(opts?: TxOpts) {\n super(withArkOpts(opts));\n }\n\n static fromPSBT(psbt_: Bytes, opts?: TxOpts): Transaction {\n return BtcSignerTransaction.fromPSBT(psbt_, withArkOpts(opts));\n }\n\n static fromRaw(raw: Bytes, opts?: TxOpts): Transaction {\n return BtcSignerTransaction.fromRaw(raw, withArkOpts(opts));\n }\n}\n\nfunction withArkOpts(opts?: TxOpts): TxOpts {\n return { ...Transaction.ARK_TX_OPTS, ...opts };\n}\n","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 { RawWitness, ScriptNum, Transaction } from \"@scure/btc-signer\";\nimport { TransactionInputUpdate } from \"@scure/btc-signer/psbt.js\";\nimport { sequenceToTimelock } from \"./timelock\";\n\n/**\n * ArkPsbtFieldKey are the available key names for the Arkade PSBT custom fields.\n */\nexport enum ArkPsbtFieldKey {\n VtxoTaprootTree = \"taptree\",\n VtxoTreeExpiry = \"expiry\",\n Cosigner = \"cosigner\",\n ConditionWitness = \"condition\",\n PrevArkTx = \"prevarktx\",\n PrevoutTx = \"prevouttx\",\n}\n\n/**\n * ArkPsbtFieldKeyType is the key type of the Arkade PSBT custom field.\n * Every Arkade PSBT field has key type 222.\n */\nexport const ArkPsbtFieldKeyType = 222;\n\n/**\n * ArkPsbtFieldCoder is the coder for the Arkade PSBT custom fields.\n * Each type has its own coder.\n */\nexport interface ArkPsbtFieldCoder<T> {\n key: ArkPsbtFieldKey;\n encode: (value: T) => NonNullable<TransactionInputUpdate[\"unknown\"]>[number];\n decode: (value: NonNullable<TransactionInputUpdate[\"unknown\"]>[number]) => T | null;\n}\n\n/**\n * setArkPsbtField appends a new unknown field to the input at inputIndex\n *\n * @example\n * ```typescript\n * setArkPsbtField(tx, 0, VtxoTaprootTree, myTaprootTree);\n * setArkPsbtField(tx, 0, VtxoTreeExpiry, myVtxoTreeExpiry);\n * ```\n */\nexport function setArkPsbtField<T>(\n tx: Transaction,\n inputIndex: number,\n coder: ArkPsbtFieldCoder<T>,\n value: T,\n): void {\n tx.updateInput(inputIndex, {\n unknown: [...(tx.getInput(inputIndex)?.unknown ?? []), coder.encode(value)],\n });\n}\n\n/**\n * getArkPsbtFields returns all the values of the given coder for the input at inputIndex\n * Multiple fields of the same type can exist in a single input.\n *\n * @example\n * ```typescript\n * const vtxoTaprootTreeFields = getArkPsbtFields(tx, 0, VtxoTaprootTree);\n * console.log(`input has ${vtxoTaprootTreeFields.length} vtxoTaprootTree fields`);\n */\nexport function getArkPsbtFields<T>(\n tx: Transaction,\n inputIndex: number,\n coder: ArkPsbtFieldCoder<T>,\n): T[] {\n const unknown = tx.getInput(inputIndex)?.unknown ?? [];\n\n const fields: T[] = [];\n for (const u of unknown) {\n const v = coder.decode(u);\n if (v !== null) fields.push(v);\n }\n return fields;\n}\n\n/**\n * VtxoTaprootTree is set to pass all spending leaves of the vtxo input\n *\n * @example\n * ```typescript\n * const vtxoTaprootTree = VtxoTaprootTree.encode(myTaprootTree);\n */\nexport const VtxoTaprootTree: ArkPsbtFieldCoder<Uint8Array> = {\n key: ArkPsbtFieldKey.VtxoTaprootTree,\n encode: (value) => [\n {\n type: ArkPsbtFieldKeyType,\n key: encodedPsbtFieldKey[ArkPsbtFieldKey.VtxoTaprootTree],\n },\n value,\n ],\n decode: (value) =>\n nullIfCatch(() => {\n if (!checkKeyMatch(value[0], ArkPsbtFieldKey.VtxoTaprootTree)) return null;\n return value[1];\n }),\n};\n\n/**\n * ConditionWitness is set to pass the witness data used to finalize the conditionMultisigClosure\n *\n * @example\n * ```typescript\n * const conditionWitness = ConditionWitness.encode(myConditionWitness);\n */\nexport const ConditionWitness: ArkPsbtFieldCoder<Uint8Array[]> = {\n key: ArkPsbtFieldKey.ConditionWitness,\n encode: (value) => [\n {\n type: ArkPsbtFieldKeyType,\n key: encodedPsbtFieldKey[ArkPsbtFieldKey.ConditionWitness],\n },\n RawWitness.encode(value),\n ],\n decode: (value) =>\n nullIfCatch(() => {\n if (!checkKeyMatch(value[0], ArkPsbtFieldKey.ConditionWitness)) return null;\n return RawWitness.decode(value[1]);\n }),\n};\n\n/**\n * PrevArkTxField carries the serialized raw bitcoin tx of the previous Ark tx\n * spent by an input. Used by OP_INSPECTINPUTSCRIPTPUBKEY on intent proofs and\n * other contexts where the prevout pkScript must be looked up off-chain.\n *\n * Key: [0xde] || \"prevarktx\". Value: serialized wire.MsgTx (NOT a PSBT).\n */\nexport const PrevArkTxField: ArkPsbtFieldCoder<Uint8Array> = {\n key: ArkPsbtFieldKey.PrevArkTx,\n encode: (value) => [\n {\n type: ArkPsbtFieldKeyType,\n key: encodedPsbtFieldKey[ArkPsbtFieldKey.PrevArkTx],\n },\n value,\n ],\n decode: (value) =>\n nullIfCatch(() => {\n if (!checkKeyMatch(value[0], ArkPsbtFieldKey.PrevArkTx)) return null;\n return value[1];\n }),\n};\n\n/**\n * PrevoutTxField carries the serialized raw bitcoin tx that produced the\n * previous output spent by an input. Used by OP_INSPECTINPUTSCRIPTPUBKEY in\n * the SubmitOnchainTx flow, where there is no Ark tx but a plain Bitcoin\n * funding tx whose pkScript must be resolvable.\n *\n * Key: [0xde] || \"prevouttx\". Value: serialized wire.MsgTx (NOT a PSBT).\n */\nexport const PrevoutTxField: ArkPsbtFieldCoder<Uint8Array> = {\n key: ArkPsbtFieldKey.PrevoutTx,\n encode: (value) => [\n {\n type: ArkPsbtFieldKeyType,\n key: encodedPsbtFieldKey[ArkPsbtFieldKey.PrevoutTx],\n },\n value,\n ],\n decode: (value) =>\n nullIfCatch(() => {\n if (!checkKeyMatch(value[0], ArkPsbtFieldKey.PrevoutTx)) return null;\n return value[1];\n }),\n};\n\n/**\n * CosignerPublicKey is set on every TxGraph transactions to identify the musig2 public keys\n *\n * @example\n * ```typescript\n * const cosignerPublicKey = CosignerPublicKey.encode(myCosignerPublicKey);\n */\nexport const CosignerPublicKey: ArkPsbtFieldCoder<{\n index: number;\n key: Uint8Array;\n}> = {\n key: ArkPsbtFieldKey.Cosigner,\n encode: (value) => [\n {\n type: ArkPsbtFieldKeyType,\n key: new Uint8Array([...encodedPsbtFieldKey[ArkPsbtFieldKey.Cosigner], value.index]),\n },\n value.key,\n ],\n decode: (unknown) =>\n nullIfCatch(() => {\n if (!checkKeyMatch(unknown[0], ArkPsbtFieldKey.Cosigner, true)) return null;\n return {\n index: unknown[0].key[unknown[0].key.length - 1],\n key: unknown[1],\n };\n }),\n};\n\n/**\n * VtxoTreeExpiry is set to pass the expiry time of the input\n *\n * @example\n * ```typescript\n * const vtxoTreeExpiry = VtxoTreeExpiry.encode(myVtxoTreeExpiry);\n */\nexport const VtxoTreeExpiry: ArkPsbtFieldCoder<{\n type: \"blocks\" | \"seconds\";\n value: bigint;\n}> = {\n key: ArkPsbtFieldKey.VtxoTreeExpiry,\n encode: (value) => [\n {\n type: ArkPsbtFieldKeyType,\n key: encodedPsbtFieldKey[ArkPsbtFieldKey.VtxoTreeExpiry],\n },\n ScriptNum(6, true).encode(value.value === 0n ? 0n : value.value),\n ],\n decode: (unknown) =>\n nullIfCatch(() => {\n if (!checkKeyMatch(unknown[0], ArkPsbtFieldKey.VtxoTreeExpiry)) return null;\n const v = ScriptNum(6, true).decode(unknown[1]);\n if (!v) return null;\n return sequenceToTimelock(Number(v));\n }),\n};\n\nconst encodedPsbtFieldKey: Record<string, Uint8Array> = Object.fromEntries(\n Object.values(ArkPsbtFieldKey).map((key) => [key, new TextEncoder().encode(key)]),\n);\n\nconst nullIfCatch = <T>(fn: () => T): T | null => {\n try {\n return fn();\n } catch {\n return null;\n }\n};\n\nfunction checkKeyMatch(\n key: { type: number; key: Uint8Array },\n arkPsbtFieldKey: ArkPsbtFieldKey,\n prefixOnly: boolean = false,\n): boolean {\n if (key.type !== ArkPsbtFieldKeyType) return false;\n const expected = encodedPsbtFieldKey[arkPsbtFieldKey];\n if (key.key.length < expected.length) return false;\n if (!prefixOnly && key.key.length !== expected.length) return false;\n for (let i = 0; i < expected.length; i++) {\n if (key.key[i] !== expected[i]) return false;\n }\n return true;\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 /**\n * Canonical name this network was resolved from, when known.\n *\n * `bech32` cannot separate the tb-family — testnet, signet and mutinynet\n * share every field above — so anything that has to tell them apart (a\n * per-network timelock floor, for one) has no other handle. Optional\n * because a hand-built `Network` carries no name: consumers must read a\n * missing one as \"unknown\" and fall back to their strictest branch rather\n * than guess at one.\n */\n name?: NetworkName;\n}\nexport const getNetwork = (network: NetworkName): Network => {\n const found = networks[network];\n // Fail closed: an unknown network must never silently fall through to\n // mainnet params (e.g. via Address()'s default) when validating addresses.\n if (!found) throw new Error(`Unsupported network: ${network}`);\n return found;\n};\n\nexport const networks = {\n bitcoin: withArkPrefix(NETWORK, \"ark\", \"bitcoin\"),\n testnet: withArkPrefix(TEST_NETWORK, \"tark\", \"testnet\"),\n signet: withArkPrefix(TEST_NETWORK, \"tark\", \"signet\"),\n mutinynet: withArkPrefix(TEST_NETWORK, \"tark\", \"mutinynet\"),\n regtest: withArkPrefix(\n {\n ...TEST_NETWORK,\n bech32: \"bcrt\",\n pubKeyHash: 0x6f,\n scriptHash: 0xc4,\n },\n \"tark\",\n \"regtest\",\n ),\n};\n\nfunction withArkPrefix(\n network: Omit<Network, \"hrp\" | \"name\">,\n prefix: string,\n name: NetworkName,\n): Network {\n return {\n ...network,\n hrp: prefix,\n name,\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\n/**\n * 33-byte compressed secp256k1 point, lowercase hex.\n *\n * Compressed rather than the 32-byte x-only form, for two reasons that are not\n * about the covenant leaf. The leaf itself is indifferent:\n * `computeArkadeScriptPublicKey` truncates by length and `lift_x`es, so a\n * compressed key and its x-only tail tweak to the same point — even for an\n * odd-Y (`03`) key like mutinynet's.\n *\n * What decides it is that compressed is the lossless form and the one actually\n * on the wire. The emulator's `/v1/info` returns `signerPubkey` compressed and\n * `Arkade.connect` keeps all 33 bytes of it (unlike the Arkade server key on\n * the line above, which it slices), so a value pinned here in compressed form\n * is byte-identical to what a live fetch yields and can substitute for it\n * directly. Going the other way is a one-way door: x-only can always be\n * recovered by dropping the prefix, but the parity bit cannot be recovered\n * from x-only. Consumers that need 32 bytes — the Arkade Intents offer TLV,\n * for one — already normalize at their own boundary.\n */\nconst COMPRESSED_PUBKEY = /^0[23][0-9a-f]{64}$/;\n\n/** Covenant co-signer (\"emulator\") for the mainnet Arkade deployment. */\nexport const BITCOIN_EMULATOR_PUBKEY =\n \"0239c196415da47b26456a101daaa12ba9e445bfe153197f1e2b750bf40e52092e\" as const;\n\n/** Covenant co-signer (\"emulator\") for the hosted mutinynet Arkade deployment. */\nexport const MUTINYNET_EMULATOR_PUBKEY =\n \"03f823b9b2febc81f4af967e77aed2f541cbd3397c6d8f5a72e32eb7b471af889a\" as const;\n\n/** Covenant co-signer (\"emulator\") shipped with the `arkade-regtest` stack. */\nexport const REGTEST_EMULATOR_PUBKEY =\n \"02999413c46fa10ada5cbc4bcc79a1d09160c2ba3cfc812705d7a13e5e545fb2a9\" as const;\n\n/**\n * The covenant co-signer each network's Arkade deployment runs.\n *\n * This is a property of the NETWORK, not of whoever happens to be talking to\n * it: every participant building a covenant contract on one network co-signs\n * with the same key, so carrying a per-deployment copy of it can only ever\n * introduce disagreement — two peers on one network advertising two keys is a\n * misconfiguration nothing downstream is positioned to catch.\n *\n * `testnet` and `signet` are absent because no emulator is deployed for them;\n * they resolve to a throw rather than to a neighbouring network's key.\n */\nconst EMULATOR_PUBKEYS: Partial<Record<NetworkName, string>> = {\n bitcoin: BITCOIN_EMULATOR_PUBKEY,\n mutinynet: MUTINYNET_EMULATOR_PUBKEY,\n regtest: REGTEST_EMULATOR_PUBKEY,\n};\n\n/**\n * The pinned co-signer key for `network`, as 33-byte compressed lowercase hex.\n *\n * @throws if the network carries no name, or names one with no deployed\n * emulator. Fail closed on both counts: the return value ends up in a\n * covenant leaf that decides who can move the funds, so there is no\n * defensible fallback. Guessing a neighbour's key (the tb-family share every\n * other field on {@link Network}) would build a leaf co-signed by a service\n * that will never sign for it — funds locked to a key nobody holds — and\n * returning an empty string just moves the same failure somewhere harder to\n * read. A hand-assembled `Network` carries no `name` and lands here too,\n * matching how the per-network timelock floors treat an unnamed network.\n *\n * Deliberately NOT falling back to whatever key the emulator reports about\n * itself: that is the self-report this pin exists to stop trusting, and doing\n * it only on unpinned networks would make the guarantee depend on\n * `network.name` with no signal to the caller that it had lapsed. The\n * unnamed case is the sharp one — a hand-built `Network` can carry\n * bitcoin-equivalent parameters, so a silent fallback would drop to\n * \"trust the endpoint\" on exactly the input that looks most like mainnet.\n * Callers who mean it pass {@link resolveEmulatorPubkey}'s override, which\n * the thrown message names.\n */\nexport function defaultEmulatorPubkey(network: Network): string {\n const pinned = network.name ? EMULATOR_PUBKEYS[network.name] : undefined;\n if (!pinned) {\n // Name the remedy, not just the refusal. Whoever hits this usually has\n // a working emulator in front of them, so a bare \"not pinned\" reads as\n // the SDK being broken rather than as one argument being missing.\n const cause = network.name\n ? `no emulator is deployed for ${network.name}`\n : `this Network carries no name, so it cannot be matched ` +\n `(build it with getNetwork(...) rather than by hand)`;\n throw new Error(\n `No emulator co-signer key is pinned for this network: ${cause}; ` +\n `pass emulatorPubkey: \"<33-byte compressed hex>\" to Arkade.connect to ` +\n `co-sign with your own emulator instead. Pinned networks: ` +\n `${Object.keys(EMULATOR_PUBKEYS).join(\", \")}`,\n );\n }\n return pinned;\n}\n\n/**\n * Resolve the co-signer key for `network`, letting a caller substitute its own.\n *\n * The override is the escape hatch for three situations, and the first is the\n * one that matters operationally:\n *\n * 1. **A network rotated its emulator key and this SDK has not shipped the new\n * constant yet.** Since `Arkade.connect` no longer asks the service which\n * key it signs with, a rotation is invisible here until the constant is\n * updated — covenants keep building against the retired key and fail only\n * when a claim is attempted. Passing the new key restores service without\n * waiting for a release, so a rotation is a config change rather than an\n * outage.\n * 2. A private or self-hosted emulator, including on a network with no pinned\n * key at all (signet, testnet, a hand-built `Network`).\n * 3. Tests and local stacks.\n *\n * Supplying it means co-signing with a different service: every covenant built\n * from the returned key can be completed by whoever holds it and by no one\n * else, so it is a statement that you trust that operator in place of the\n * network's. Prefer {@link defaultEmulatorPubkey} unless that is deliberate.\n *\n * A malformed override throws rather than being passed through — a typo here\n * would otherwise surface as an unspendable contract long after the fact.\n */\nexport function resolveEmulatorPubkey(network: Network, override?: string): string {\n if (override === undefined) return defaultEmulatorPubkey(network);\n if (!COMPRESSED_PUBKEY.test(override)) {\n throw new Error(\n `Emulator pubkey override must be 33-byte compressed secp256k1 hex ` +\n `(66 lowercase chars, 02/03 prefix), got ${JSON.stringify(override)}.`,\n );\n }\n return override;\n}\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 { TAP_LEAF_VERSION } from \"@scure/btc-signer/payment.js\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\n\n/**\n * A leaf node in the Taproot script tree, as consumed by\n * `@scure/btc-signer`'s `p2tr(internalKey, tree, ...)`.\n */\nexport interface TaprootLeaf {\n script: Bytes;\n leafVersion: number;\n}\n\n/**\n * Internal tree node shape consumed by `@scure/btc-signer`'s `p2tr`:\n * - A leaf is `{ script, leafVersion }`\n * - A branch is a 2-element tuple `[leftNode, rightNode]` of nodes\n */\nexport type TaprootTreeNode = TaprootLeaf | [TaprootTreeNode, TaprootTreeNode];\n\n/**\n * Assemble a Taproot script tree from a flat list of scripts using the\n * exact algorithm arkd's btcd dependency uses\n * (`txscript.AssembleTaprootScriptTree`, see\n * https://github.com/btcsuite/btcd/blob/master/txscript/taproot.go).\n *\n * The algorithm:\n *\n * Phase 1 — pair leaves left-to-right:\n * for i := 0; i < len(leaves); i += 2:\n * if i is the last index (odd leaf at end):\n * merge with the LAST branch built so far (do NOT pair as a fresh leaf)\n * else:\n * create a new branch from (leaves[i], leaves[i+1])\n *\n * Phase 2 — FIFO-queue merge branches:\n * while branches has ≥ 2 items:\n * take front two, combine into a new branch, push to back of queue\n *\n * This matters because `@scure/btc-signer`'s `taprootListToTree` builds a\n * Huffman tree (weight-1 leaves combine by smallest-weight pairs). For\n * power-of-2 leaf counts both algorithms happen to produce the same\n * perfectly-balanced binary tree and agree. For any other count they\n * produce DIFFERENT shapes → different merkle roots → different taproot\n * output keys → arkd rejects spends with `INVALID_PSBT_INPUT`.\n *\n * Reproducing btcd's algorithm here lets the SDK construct taptrees that\n * arkd accepts for arbitrary leaf counts.\n *\n * @param scripts - Raw tapscript bytes for each leaf, in the order they\n * should be encoded in the TapTree PSBT field.\n * @returns The nested-tuple form `p2tr` accepts.\n */\nexport function assembleBtcdTaprootTree(scripts: Bytes[]): TaprootTreeNode {\n if (scripts.length === 0) {\n throw new Error(\"assembleBtcdTaprootTree: empty scripts list\");\n }\n\n const leaves: TaprootLeaf[] = scripts.map((script) => ({\n script,\n leafVersion: TAP_LEAF_VERSION,\n }));\n\n if (leaves.length === 1) {\n return leaves[0];\n }\n\n // ── Phase 1: pair leaves left-to-right ─────────────────────────────\n const branches: TaprootTreeNode[] = [];\n for (let i = 0; i < leaves.length; i += 2) {\n if (i === leaves.length - 1) {\n // Odd leaf at end: merge into the LAST branch built so far.\n // Mirrors btcd's\n // branches[len(branches)-1] = NewTapBranch(branchToMerge, leaf)\n const last = branches.pop();\n if (last === undefined) {\n // Defensive — caller should have provided ≥ 2 leaves.\n throw new Error(\n `assembleBtcdTaprootTree: unexpected odd leaf at i=${i} with no prior branch`,\n );\n }\n branches.push([last, leaves[i]]);\n } else {\n // Pair two consecutive leaves into a new branch.\n branches.push([leaves[i], leaves[i + 1]]);\n }\n }\n\n // ── Phase 2: FIFO-queue merge branches ─────────────────────────────\n // Take front two, combine, push to back. Stops when one branch remains.\n while (branches.length >= 2) {\n const left = branches.shift()!;\n const right = branches.shift()!;\n branches.push([left, right]);\n }\n\n return branches[0];\n}\n","import { Address, p2tr, TAPROOT_UNSPENDABLE_KEY, NETWORK } 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 { assembleBtcdTaprootTree } from \"./taprootTree\";\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 readonly pkScript: 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 * The Taproot script tree is assembled using btcd's algorithm\n * (`txscript.AssembleTaprootScriptTree`) so the derived taproot output\n * key agrees with arkd for any leaf count. `@scure/btc-signer`'s\n * default `taprootListToTree` is a Huffman builder that only agrees\n * with arkd for power-of-2 leaf counts.\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 const tapTree = assembleBtcdTaprootTree(scripts);\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 this.pkScript = payment.script;\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 /**\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","/**\n * Where the SDK gets its `EventSource`.\n *\n * Every server-sent-events stream this SDK opens — settlement events, the tx\n * feed, the indexer script subscription — needs one, and until now each site\n * reached for the global. That works in browsers and, via\n * {@link ExpoArkProvider}/{@link ExpoIndexerProvider}, in React Native. It does\n * NOT work in Node, which exposes `EventSource` only behind\n * `--experimental-eventsource` (24.x) — so a CLI, a server-side wallet or a\n * background worker got a `ReferenceError` out of the stream and everything\n * event-driven degraded to whatever polling happened to be running.\n *\n * Resolution order, per call: an explicit per-provider factory, then whatever\n * {@link configureEventSource} was given, then the global. When none answers,\n * {@link resolveEventSource} throws {@link EventSourceUnavailableError} rather\n * than a bare `ReferenceError`, so callers can tell \"this environment has no\n * SSE\" from \"the connection dropped\" — a distinction that matters, because the\n * first is not worth reconnecting for and the second is.\n */\n\n/**\n * The slice of `EventSource` this SDK actually uses.\n *\n * Structural rather than the DOM type on purpose: Node's `eventsource` package\n * and the React Native polyfills are not DOM `EventSource`s, and demanding one\n * made every consumer launder a perfectly capable object through\n * `as unknown as EventSource` — a cast that hides real mismatches as readily as\n * it waves through this one.\n */\nexport interface EventSourceLike {\n addEventListener(type: \"message\" | \"error\", listener: (event: MessageEvent) => void): void;\n removeEventListener(type: \"message\" | \"error\", listener: (event: MessageEvent) => void): void;\n close(): void;\n}\n\n/** Opens an SSE connection to `url`. `new EventSource(url)`, as a value. */\nexport type EventSourceFactory = (url: string) => EventSourceLike;\n\n/** Options shared by every provider that opens an SSE stream. */\nexport interface EventSourceCapable {\n /**\n * Where this provider gets its `EventSource`, overriding\n * {@link configureEventSource} and the global. Use it when one process\n * needs different transports per connection; otherwise configure once.\n */\n eventSource?: EventSourceFactory;\n}\n\nconst GUIDANCE =\n \"Pass one with configureEventSource(url => new EventSource(url)) — in Node, from the \" +\n \"`eventsource` package or by running with --experimental-eventsource. In React Native, \" +\n \"use ExpoArkProvider / ExpoIndexerProvider instead.\";\n\n/**\n * No `EventSource` could be resolved, so no SSE stream can be opened.\n *\n * A property of the environment, not of the connection: retrying cannot fix it,\n * which is why {@link ContractWatcher} reports it once and stops reconnecting\n * instead of looping on it.\n */\nexport class EventSourceUnavailableError extends Error {\n constructor() {\n super(`no EventSource is available, so server-sent events cannot be opened. ${GUIDANCE}`);\n this.name = \"EventSourceUnavailableError\";\n }\n}\n\n/**\n * Type guard for {@link EventSourceUnavailableError}.\n *\n * Falls back to the `name` because a custom error crossing the service-worker\n * `postMessage` boundary arrives as a plain `Error` — the same reason\n * `ProviderUnavailableError` keeps its state in the message.\n */\nexport function isEventSourceUnavailableError(error: unknown): error is Error {\n return (\n error instanceof EventSourceUnavailableError ||\n (error instanceof Error && error.name === \"EventSourceUnavailableError\")\n );\n}\n\nlet configured: EventSourceFactory | undefined;\n\n/**\n * Set the `EventSource` every provider uses by default. Call once at startup,\n * before opening a wallet; pass `undefined` to go back to the global.\n *\n * This exists because the provider-level option cannot reach providers the SDK\n * builds for you — `Wallet.create({ arkServerUrl })` constructs both itself.\n *\n * @example\n * ```typescript\n * import { EventSource } from \"eventsource\";\n * configureEventSource((url) => new EventSource(url));\n * ```\n */\nexport function configureEventSource(factory?: EventSourceFactory): void {\n configured = factory;\n}\n\n/** What {@link configureEventSource} last set, if anything. */\nexport function getConfiguredEventSource(): EventSourceFactory | undefined {\n return configured;\n}\n\n/**\n * Resolve the factory to open a stream with, or throw\n * {@link EventSourceUnavailableError}.\n *\n * The global is read on every call rather than captured at module load: a test\n * (or a polyfill) that assigns `globalThis.EventSource` after import must still\n * be seen.\n */\nexport function resolveEventSource(override?: EventSourceFactory): EventSourceFactory {\n const factory =\n override ??\n configured ??\n (typeof EventSource === \"undefined\" ? undefined : (url: string) => new EventSource(url));\n if (!factory) throw new EventSourceUnavailableError();\n return factory;\n}\n","{\n \"name\": \"@arkade-os/sdk\",\n \"version\": \"0.4.64\",\n \"description\": \"TypeScript SDK for building Bitcoin wallets using the Arkade protocol\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/arkade-os/ts-sdk.git\",\n \"directory\": \"packages/ts-sdk\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"sideEffects\": [\n \"src/index.ts\",\n \"src/contracts/handlers/index.ts\",\n \"dist/index.js\",\n \"dist/index.cjs\",\n \"dist/contracts/handlers/index.js\",\n \"dist/contracts/handlers/index.cjs\"\n ],\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./adapters/expo\": {\n \"import\": {\n \"types\": \"./dist/adapters/expo.d.ts\",\n \"default\": \"./dist/adapters/expo.js\"\n },\n \"require\": {\n \"types\": \"./dist/adapters/expo.d.cts\",\n \"default\": \"./dist/adapters/expo.cjs\"\n }\n },\n \"./adapters/localStorage\": {\n \"import\": {\n \"types\": \"./dist/adapters/localStorage.d.ts\",\n \"default\": \"./dist/adapters/localStorage.js\"\n },\n \"require\": {\n \"types\": \"./dist/adapters/localStorage.d.cts\",\n \"default\": \"./dist/adapters/localStorage.cjs\"\n }\n },\n \"./adapters/fileSystem\": {\n \"import\": {\n \"types\": \"./dist/adapters/fileSystem.d.ts\",\n \"default\": \"./dist/adapters/fileSystem.js\"\n },\n \"require\": {\n \"types\": \"./dist/adapters/fileSystem.d.cts\",\n \"default\": \"./dist/adapters/fileSystem.cjs\"\n }\n },\n \"./adapters/indexedDB\": {\n \"import\": {\n \"types\": \"./dist/adapters/indexedDB.d.ts\",\n \"default\": \"./dist/adapters/indexedDB.js\"\n },\n \"require\": {\n \"types\": \"./dist/adapters/indexedDB.d.cts\",\n \"default\": \"./dist/adapters/indexedDB.cjs\"\n }\n },\n \"./adapters/asyncStorage\": {\n \"import\": {\n \"types\": \"./dist/adapters/asyncStorage.d.ts\",\n \"default\": \"./dist/adapters/asyncStorage.js\"\n },\n \"require\": {\n \"types\": \"./dist/adapters/asyncStorage.d.cts\",\n \"default\": \"./dist/adapters/asyncStorage.cjs\"\n }\n },\n \"./repositories/sqlite\": {\n \"import\": {\n \"types\": \"./dist/repositories/sqlite/index.d.ts\",\n \"default\": \"./dist/repositories/sqlite/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/repositories/sqlite/index.d.cts\",\n \"default\": \"./dist/repositories/sqlite/index.cjs\"\n }\n },\n \"./repositories/realm\": {\n \"import\": {\n \"types\": \"./dist/repositories/realm/index.d.ts\",\n \"default\": \"./dist/repositories/realm/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/repositories/realm/index.d.cts\",\n \"default\": \"./dist/repositories/realm/index.cjs\"\n }\n },\n \"./worker/expo\": {\n \"import\": {\n \"types\": \"./dist/worker/expo/index.d.ts\",\n \"default\": \"./dist/worker/expo/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/worker/expo/index.d.cts\",\n \"default\": \"./dist/worker/expo/index.cjs\"\n }\n },\n \"./wallet/expo\": {\n \"import\": {\n \"types\": \"./dist/wallet/expo/index.d.ts\",\n \"default\": \"./dist/wallet/expo/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/wallet/expo/index.d.cts\",\n \"default\": \"./dist/wallet/expo/index.cjs\"\n }\n },\n \"./wallet/expo/background\": {\n \"import\": {\n \"types\": \"./dist/wallet/expo/background.d.ts\",\n \"default\": \"./dist/wallet/expo/background.js\"\n },\n \"require\": {\n \"types\": \"./dist/wallet/expo/background.d.cts\",\n \"default\": \"./dist/wallet/expo/background.cjs\"\n }\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"engines\": {\n \"node\": \">=22.12.0 <27\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"smoke:dist\": \"node scripts/smoke-dist.mjs\",\n \"typecheck\": \"tsc --noEmit\",\n \"check:vtxo\": \"node scripts/check-virtual-status.mjs && node scripts/check-provider-boundary.mjs\",\n \"docs:build\": \"pnpm run typecheck && pnpm typedoc\",\n \"docs:open\": \"open ../../docs/index.html\",\n \"test\": \"vitest run\",\n \"test:master\": \"ARK_ENV=master vitest run\",\n \"test:unit\": \"vitest run --exclude test/e2e\",\n \"test:setup\": \"node test/setup.mjs\",\n \"regtest:start\": \"node ./regtest/regtest.mjs start\",\n \"regtest:stop\": \"node ./regtest/regtest.mjs stop\",\n \"regtest:clean\": \"node ./regtest/regtest.mjs clean\",\n \"regtest\": \"pnpm regtest:clean && pnpm regtest:start && pnpm test:setup-docker\",\n \"test:setup-docker\": \"node test/setup.mjs docker\",\n \"test:integration\": \"vitest run test/e2e/**\",\n \"test:integration-docker\": \"ARK_ENV=docker vitest run test/e2e/**\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"format\": \"prettier --write src test examples\",\n \"lint\": \"prettier --check src test examples && pnpm run check:vtxo\",\n \"audit\": \"pnpm audit\",\n \"prepack\": \"pnpm run build\",\n \"prepublishOnly\": \"pnpm run build\"\n },\n \"dependencies\": {\n \"@bitcoinerlab/descriptors-scure\": \"3.1.7\",\n \"@marcbachmann/cel-js\": \"8.0.0\",\n \"@noble/curves\": \"2.0.1\",\n \"@noble/secp256k1\": \"3.0.0\",\n \"@scure/base\": \"2.0.0\",\n \"@scure/bip39\": \"2.0.1\",\n \"@scure/btc-signer\": \"2.0.1\",\n \"bip68\": \"1.0.4\",\n \"ws-electrumx-client\": \"1.0.5\"\n },\n \"devDependencies\": {\n \"@types/better-sqlite3\": \"7.6.13\",\n \"@vitest/coverage-v8\": \"3.2.7\",\n \"better-sqlite3\": \"12.6.2\",\n \"tsup\": \"^8.5.0\",\n \"typedoc\": \"^0.28.19\",\n \"typescript\": \"5.9.2\"\n },\n \"peerDependencies\": {\n \"@react-native-async-storage/async-storage\": \">=1.0.0\",\n \"expo\": \">=54.0.0\",\n \"expo-background-task\": \"~1.0.10 || >=55.0.0\",\n \"expo-sqlite\": \"~16.0.10 || >=55.0.0\",\n \"expo-task-manager\": \"~14.0.9 || >=55.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"expo\": {\n \"optional\": true\n },\n \"expo-sqlite\": {\n \"optional\": true\n },\n \"expo-background-task\": {\n \"optional\": true\n },\n \"expo-task-manager\": {\n \"optional\": true\n },\n \"@react-native-async-storage/async-storage\": {\n \"optional\": true\n }\n },\n \"keywords\": [\n \"ark\",\n \"arkade\",\n \"bip39\",\n \"bitcoin\",\n \"btc\",\n \"crypto\",\n \"lightning\",\n \"sdk\",\n \"stablecoin\",\n \"taproot\",\n \"typescript\",\n \"utxo\",\n \"vtxo\",\n \"wallet\"\n ],\n \"author\": \"Ark Labs\",\n \"license\": \"MIT\",\n \"packageManager\": \"pnpm@10.25.0\"\n}\n","import { version } from \"../../package.json\";\n\nexport const buildVersion = \"0.9.9\";\n\n/**\n * The SDK's own version string, sourced from package.json\n */\nexport const sdkVersion = `ts-sdk/${version}`;\n\n/**\n * Wraps a transport-level `fetch` rejection (DNS failure, connection refused,\n * TLS or CORS error) with the request method and URL, preserving the original\n * as {@link Error.cause}.\n */\nexport class FetchError extends Error {\n /** The request URL that failed, when derivable from the `fetch` input. */\n readonly url?: string;\n /** The HTTP method of the failed request (defaults to `\"GET\"`). */\n readonly method?: string;\n\n constructor(message: string, options: { url?: string; method?: string; cause?: unknown }) {\n super(message, { cause: options.cause });\n this.name = \"FetchError\";\n this.url = options.url;\n this.method = options.method;\n }\n}\n\n/**\n * Guarded passthrough to the platform `fetch` with no Arkade-specific headers.\n * Use for any service that is NOT the Ark server (delegate, Esplora, …): those\n * origins reject unknown request headers such as `X-Build-Version` in the CORS\n * preflight.\n *\n * Transport-level rejections are re-thrown as a {@link FetchError}.\n */\nexport function baseFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n if (typeof globalThis.fetch !== \"function\") {\n throw new Error(\"Fetch API is not available in this environment.\");\n }\n return globalThis.fetch(input, init).catch((cause) => {\n const { url, method } = describeRequest(input, init);\n throw new FetchError(`Network request failed: ${method} ${url}`, { url, method, cause });\n });\n}\n\n/**\n * `fetch` for the Ark server only: adds the `X-Build-Version` compatibility\n * header that arkd's version guard reads, plus the `X-SDK-VERSION` header\n * carrying this package's own version. Do NOT use it for other origins — they\n * reject these custom headers in CORS preflight.\n */\nexport function fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const headers = new Headers(init?.headers);\n headers.set(\"X-Build-Version\", buildVersion);\n headers.set(\"X-SDK-VERSION\", sdkVersion);\n return baseFetch(input, { ...init, headers });\n}\n\n/**\n * Derive a human-readable `{ url, method }` for a failed request from the\n * `fetch` arguments, handling the `string | URL | Request` input shapes. The\n * `init.method` wins, then a `Request`'s own method, defaulting to `\"GET\"`.\n */\nfunction describeRequest(\n input: RequestInfo | URL,\n init?: RequestInit,\n): { url: string; method: string } {\n let url: string;\n if (typeof input === \"string\") {\n url = input;\n } else if (input instanceof URL) {\n url = input.href;\n } else {\n url = input.url;\n }\n\n let method: string;\n if (init?.method !== undefined) {\n method = init.method;\n } else if (input instanceof Request) {\n method = input.method;\n } else {\n method = \"GET\";\n }\n\n return { url, method };\n}\n","import { FetchError } from \"../utils/fetch\";\n\nexport class ArkError extends Error {\n constructor(\n readonly code: number,\n readonly message: string,\n readonly name: string,\n readonly metadata?: Record<string, string>,\n ) {\n super(message);\n }\n}\n\n/**\n * Structured arkd error `name`s the SDK branches on, centralized so call sites don't\n * hardcode string literals. Not an exhaustive mirror of the server's codes — only the\n * ones the SDK acts on.\n */\nexport const ArkErrorName = {\n DIGEST_MISMATCH: \"DIGEST_MISMATCH\",\n VTXO_ALREADY_SPENT: \"VTXO_ALREADY_SPENT\",\n INVALID_TX_FILTER: \"INVALID_TX_FILTER\",\n TX_FILTERS_LIMIT_EXCEEDED: \"TX_FILTERS_LIMIT_EXCEEDED\",\n /**\n * A CLTV closure was spent before its absolute locktime matured. Raised only by\n * `submitTx` (never `finalizeTx`), with metadata\n * `{ locktime, current_locktime, type: \"height\" | \"time\" }`.\n *\n * Self-healing, so defer and retry rather than fail: the server matures a\n * seconds-locktime against the **chain tip block's timestamp**, not its wall clock,\n * so a spend attempted promptly at maturity is rejected until a later block lands.\n */\n FORFEIT_CLOSURE_LOCKED: \"FORFEIT_CLOSURE_LOCKED\",\n} as const;\n\nexport type ArkErrorName = (typeof ArkErrorName)[keyof typeof ArkErrorName];\n\n/**\n * Type guard for a structured {@link ArkError}, optionally narrowing to a specific\n * `name`. Prefer it over comparing `err.name` literals.\n *\n * `name` accepts only cataloged {@link ArkErrorName} values; to branch on a name the\n * catalog does not cover, either add it there or compare `err.name` after guarding\n * with the one-argument form.\n *\n * @example\n * if (isArkError(maybeArkError(err), ArkErrorName.DIGEST_MISMATCH)) { ... }\n */\nexport function isArkError(error: unknown, name?: ArkErrorName): error is ArkError {\n return error instanceof ArkError && (name === undefined || error.name === name);\n}\n\n/**\n * Which remote dependency an availability failure refers to. Used to label the\n * {@link ProviderUnavailableError} message and the wallet's\n * `ProviderConnectionState`; it is deliberately *not* carried as a structured\n * field on the error, since custom `Error` own-properties do not survive the\n * service-worker `postMessage` boundary. Structured clone keeps `message`,\n * `stack` and `cause`, drops own-properties, and normalizes a custom `name` to\n * `\"Error\"` — only the built-in error names survive it.\n */\nexport type ProviderKind = \"arkade\" | \"indexer\";\n\n/**\n * A remote provider (Arkade operator or its indexer) is temporarily\n * unreachable. This is a *retryable* condition — transport failure, request\n * timeout, or a 5xx/429-style temporary HTTP response — as opposed to a\n * terminal configuration/authorization/schema error, which stays a plain\n * `Error`/{@link ArkError}. The original low-level error is preserved as\n * {@link Error.cause}.\n */\nexport class ProviderUnavailableError extends Error {\n /** Always `true`: this error type only ever wraps retryable conditions. */\n readonly retryable = true;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { cause: options?.cause });\n this.name = \"ProviderUnavailableError\";\n }\n}\n\n/**\n * A response does not reconcile with what the SDK submitted or already\n * validated — a checkpoint tx whose txid is not among those submitted, a\n * commitment tx that differs from the one validated at tree signing. Terminal\n * rather than retryable: the two are equal by construction in a well-formed\n * exchange, so the same request would produce the same outcome.\n *\n * Neither own-properties nor a custom `name` cross the service-worker\n * `postMessage` boundary (see {@link ProviderKind}), so `retryable` and `name`\n * are in-process conveniences and every distinguishing detail belongs in\n * `message` — the one field a consumer past the boundary can still branch on.\n */\nexport class ServerResponseMismatchError extends Error {\n readonly retryable = false;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, { cause: options?.cause });\n this.name = \"ServerResponseMismatchError\";\n }\n}\n\n/**\n * Throw a typed {@link ProviderUnavailableError} for a temporary HTTP response\n * (429 rate-limit or any 5xx), otherwise return. `fetch()` resolves — rather\n * than rejects — on HTTP error status, so status-code classification has to live\n * at each provider's non-2xx branch, not in the transport wrapper. 4xx and other\n * responses are left to the caller to treat as terminal.\n *\n * Status alone is not enough to classify an arkd response, though: arkd sits\n * behind grpc-gateway, which maps application-level gRPC errors onto HTTP status\n * codes across the whole range — gRPC INTERNAL becomes HTTP 500, for instance. So\n * a 5xx does not by itself mean the operator is unavailable: a 500 whose body\n * carries a structured arkd error (e.g. `INTERNAL_ERROR (0): ...already registered\n * by another intent`) is a deliberate, terminal rejection that must reach the\n * caller as an {@link ArkError}, never be retried. When `body` is provided and\n * decodes to a structured arkd error, this returns without throwing; classify by\n * status only for a bodyless call or a non-structured body (a bare proxy/gateway\n * failure). Mirrors NArk's BuildVersionHandler, which branches on body content,\n * not status.\n */\nexport function throwIfHttpUnavailable(\n response: Response,\n kind: ProviderKind,\n body?: string,\n): void {\n if (body !== undefined && maybeArkError(new Error(body))) return;\n if (response.status === 429 || response.status >= 500) {\n throw new ProviderUnavailableError(\n `${kind} unavailable: ${response.status} ${response.statusText}`,\n );\n }\n}\n\n/**\n * Map a transport-level {@link FetchError} (server unreachable) to a typed\n * {@link ProviderUnavailableError}, preserving the original as `cause`; return\n * any other error unchanged. Returns the error to `throw` rather than throwing,\n * so a `catch` block can `throw toProviderUnavailable(err, kind)`.\n */\nexport function toProviderUnavailable(err: unknown, kind: ProviderKind): unknown {\n if (err instanceof FetchError) {\n return new ProviderUnavailableError(`${kind} request failed`, { cause: err });\n }\n return err;\n}\n\n/**\n * Try to convert an error to an ArkError class, returning undefined if the error is not an ArkError\n * @param error - The error to parse\n * @returns The parsed ArkError, or undefined if the error is not an ArkError\n */\nexport function maybeArkError(error: any): ArkError | undefined {\n try {\n if (!(error instanceof Error)) return undefined;\n const decoded = JSON.parse(error.message);\n\n // Preferred: the structured ErrorDetails the server attaches in details[].\n if (Array.isArray(decoded.details)) {\n for (const details of decoded.details) {\n if (!(\"@type\" in details)) continue;\n const type = details[\"@type\"];\n if (type !== \"type.googleapis.com/ark.v1.ErrorDetails\") continue;\n\n if (!(\"code\" in details)) continue;\n\n const code = details.code;\n\n if (!(\"message\" in details)) continue;\n const message = details.message;\n\n if (!(\"name\" in details)) continue;\n const name = details.name;\n\n let metadata: Record<string, string> | undefined;\n if (\"metadata\" in details && isMetadata(details.metadata)) {\n metadata = details.metadata;\n }\n\n return new ArkError(code, message, name, metadata);\n }\n }\n\n // Fallback: arkd's guard interceptors (build-version, digest) run outside\n // the error-detail converter, so their REST errors arrive with an empty\n // `details[]` and the structured name only in the top-level message, as\n // \"NAME (code): human message\". Recover the name and code so callers can\n // still branch on the error name (metadata is unavailable on this path).\n if (typeof decoded.message === \"string\") {\n const m = decoded.message.match(/^([A-Z][A-Z0-9_]*) \\((\\d+)\\): ([\\s\\S]*)$/);\n if (m) return new ArkError(Number(m[2]), m[3], m[1]);\n }\n\n return undefined;\n } catch (e) {\n return undefined;\n }\n}\n\nfunction isMetadata(value: any): value is Record<string, string> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { OP, Script, SigHash } from \"@scure/btc-signer\";\nimport { TransactionInput, TransactionOutput } from \"@scure/btc-signer/psbt.js\";\nimport { schnorr } from \"@noble/curves/secp256k1.js\";\nimport { Bytes } from \"@scure/btc-signer/utils.js\";\nimport { Transaction } from \"../utils/transaction\";\nimport { ConditionWitness, VtxoTaprootTree } from \"../utils/unknownFields\";\nimport { hex } from \"@scure/base\";\nimport { getSequence, VtxoScript } from \"../script/base\";\nimport { ExtendedCoin } from \"../wallet\";\n\n/**\n * Intent proof implementation for Bitcoin message signing.\n *\n * Intent proof defines a standard for signing Bitcoin messages as well as proving\n * ownership of outputs.\n *\n * This namespace provides utilities for creating and validating Intent proof.\n *\n * It is greatly inspired by BIP322.\n * @see https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki\n *\n * @example\n * ```typescript\n * // Create a Intent proof\n * const proof = Intent.create(\n * \"Hello Bitcoin!\",\n * [input],\n * [output]\n * );\n *\n * // Sign the proof\n * const signedProof = await identity.sign(proof);\n *\n */\nexport namespace Intent {\n // Intent proof is a special invalid psbt containing the inputs to prove ownership\n // signing the proof means signing the psbt as a regular transaction\n export type Proof = Transaction;\n\n /**\n * Creates a new Intent proof unsigned transaction.\n *\n * This function constructs a special transaction that can be signed to prove\n * ownership of onchain and virtual outputs. The proof includes the message to be\n * signed and the inputs/outputs that demonstrate ownership.\n *\n * @param message - The Intent message to be signed, either raw string of Message object\n * @param ins - Array of transaction inputs to prove ownership of\n * @param outputs - Optional array of transaction outputs\n * @returns An unsigned Intent proof transaction\n */\n export function create(\n message: string | Message,\n ins: (TransactionInput | ExtendedCoin)[],\n outputs: TransactionOutput[] = [],\n ): Proof {\n if (typeof message !== \"string\") {\n message = encodeMessage(message);\n }\n\n if (ins.length == 0) throw new Error(\"intent proof requires at least one input\");\n const inputs = ins.map(prepareCoinAsIntentProofInput);\n if (!validateInputs(inputs)) throw new Error(\"invalid inputs\");\n if (!validateOutputs(outputs)) throw new Error(\"invalid outputs\");\n\n // Create the initial transaction to spend.\n const toSpend = craftToSpendTx(message, inputs[0].witnessUtxo.script);\n\n // Create the transaction to sign.\n return craftToSignTx(toSpend, inputs, outputs, message);\n }\n\n /**\n * Compute the fee paid by an intent proof transaction.\n *\n * @param proof - Intent proof transaction\n * @returns The fee in satoshis\n */\n export function fee(proof: Proof): number {\n let sumOfInputs = 0n;\n for (let i = 0; i < proof.inputsLength; i++) {\n const input = proof.getInput(i);\n if (input.witnessUtxo === undefined)\n throw new Error(\"intent proof input requires witness utxo\");\n sumOfInputs += input.witnessUtxo.amount;\n }\n\n let sumOfOutputs = 0n;\n for (let i = 0; i < proof.outputsLength; i++) {\n const output = proof.getOutput(i);\n if (output.amount === undefined) throw new Error(\"intent proof output requires amount\");\n sumOfOutputs += output.amount;\n }\n\n if (sumOfOutputs > sumOfInputs) {\n throw new Error(\n `intent proof output amount is greater than input amount: ${sumOfOutputs} > ${sumOfInputs}`,\n );\n }\n\n return Number(sumOfInputs - sumOfOutputs);\n }\n\n export type RegisterMessage = {\n type: \"register\";\n onchain_output_indexes: number[];\n valid_at: number;\n expire_at: number;\n cosigners_public_keys: string[];\n };\n\n export type DeleteMessage = {\n type: \"delete\";\n expire_at: number;\n };\n\n export type GetPendingTxMessage = {\n type: \"get-pending-tx\";\n expire_at: number;\n };\n export type Message = RegisterMessage | DeleteMessage | GetPendingTxMessage;\n\n /**\n * Serialize an intent message to the canonical JSON string used for signing.\n *\n * @param message - Intent message payload\n * @returns Canonical string form of the message\n */\n export function encodeMessage(message: Message): string {\n switch (message.type) {\n case \"register\":\n return JSON.stringify({\n type: \"register\",\n onchain_output_indexes: message.onchain_output_indexes,\n valid_at: message.valid_at,\n expire_at: message.expire_at,\n cosigners_public_keys: message.cosigners_public_keys,\n });\n case \"delete\":\n return JSON.stringify({\n type: \"delete\",\n expire_at: message.expire_at,\n });\n case \"get-pending-tx\":\n return JSON.stringify({\n type: \"get-pending-tx\",\n expire_at: message.expire_at,\n });\n }\n }\n}\n\nexport const OP_RETURN_EMPTY_PKSCRIPT = new Uint8Array([OP.RETURN]);\nconst ZERO_32 = new Uint8Array(32).fill(0);\nconst MAX_INDEX = 0xffffffff;\nexport const TAG_INTENT_PROOF = \"ark-intent-proof-message\";\n// BIP-322 v2 global field: the UTF-8 message being signed. Lets a co-signer\n// recognise a message-signing PSBT and recompute the to_spend commitment from\n// PSBT-internal data alone.\nconst PSBT_GLOBAL_GENERIC_SIGNED_MESSAGE = 0x09;\n\ntype ValidatedTxInput = TransactionInput & {\n witnessUtxo: { script: Uint8Array; amount: bigint };\n index: number;\n txid: Bytes;\n};\n\ntype ValidatedTxOutput = TransactionOutput & {\n amount: bigint;\n script: Uint8Array;\n};\n\nfunction validateInput(input: TransactionInput): input is ValidatedTxInput {\n if (input.index === undefined) throw new Error(\"intent proof input requires index\");\n if (input.txid === undefined) throw new Error(\"intent proof input requires txid\");\n if (input.witnessUtxo === undefined)\n throw new Error(\"intent proof input requires witness utxo\");\n return true;\n}\n\nfunction validateInputs(inputs: TransactionInput[]): inputs is ValidatedTxInput[] {\n inputs.forEach(validateInput);\n return true;\n}\n\nfunction validateOutput(output: TransactionOutput): output is ValidatedTxOutput {\n if (output.amount === undefined) throw new Error(\"intent proof output requires amount\");\n if (output.script === undefined) throw new Error(\"intent proof output requires script\");\n return true;\n}\n\nfunction validateOutputs(outputs: TransactionOutput[]): outputs is ValidatedTxOutput[] {\n outputs.forEach(validateOutput);\n return true;\n}\n\n/**\n * Creates the \"to_spend\" transaction used by both intent proofs and BIP-322.\n *\n * The message is hashed with the given tagged-hash tag before being placed\n * into the scriptSig as `OP_0 <hash>`.\n *\n * @param message - The message to embed\n * @param pkScript - The scriptPubKey of the signer's address\n * @param tag - Tagged-hash tag (defaults to the Arkade intent proof tag)\n */\nexport function craftToSpendTx(\n message: string,\n pkScript: Uint8Array,\n tag: string = TAG_INTENT_PROOF,\n): Transaction {\n const messageHash = hashMessage(message, tag);\n const tx = new Transaction({\n version: 0,\n });\n\n // add input with zero hash and max index\n tx.addInput({\n txid: ZERO_32, // zero hash\n index: MAX_INDEX,\n sequence: 0,\n });\n\n // add output with zero value and provided pkScript\n tx.addOutput({\n amount: 0n,\n script: pkScript,\n });\n\n tx.updateInput(0, {\n finalScriptSig: Script.encode([\"OP_0\", messageHash]),\n });\n\n return tx;\n}\n\n/**\n * Creates the \"to_sign\" transaction that is signed to produce the proof.\n *\n * The first input references the `toSpend` transaction; the remaining inputs are\n * the ownership inputs being proven. When no outputs are provided a single\n * value-0 OP_RETURN output is added. The BIP-322 `PSBT_GLOBAL_GENERIC_SIGNED_MESSAGE`\n * (`0x09`) global field is set to the UTF-8 message so a verifier can recompute\n * the `toSpend` commitment from PSBT-internal data alone.\n *\n * @param toSpend - The \"to_spend\" transaction whose id the first input references\n * @param inputs - Validated ownership inputs (input[0] is the toSpend reference)\n * @param outputs - Proof outputs; an OP_RETURN placeholder is used when empty\n * @param message - The canonical message the proof commits to\n * @returns The unsigned \"to_sign\" proof transaction\n */\nfunction craftToSignTx(\n toSpend: Transaction,\n inputs: ValidatedTxInput[],\n outputs: ValidatedTxOutput[],\n message: string,\n): Transaction {\n const firstInput = inputs[0];\n\n // Proof tx is never broadcast onchain — toSpend references a zero-hash\n // outpoint (see BIP-322). The tx exists only as a sighash commitment\n // the server verifies signatures against; nLockTime and nSequence carry\n // no consensus meaning here, they only need to match between signer and\n // verifier. Use lockTime = 0 (BIP-322 convention) and leave each input's\n // nSequence untouched.\n const tx = new Transaction({\n version: 2,\n lockTime: 0,\n });\n\n // add the first \"toSpend\" input\n tx.addInput({\n ...firstInput,\n txid: toSpend.id,\n index: 0,\n witnessUtxo: {\n script: firstInput.witnessUtxo.script,\n amount: 0n,\n },\n sighashType: SigHash.ALL,\n });\n\n // add other inputs\n for (const [i, input] of inputs.entries()) {\n tx.addInput({\n ...input,\n sighashType: SigHash.ALL,\n });\n\n if (input.unknown?.length) {\n tx.updateInput(i + 1, {\n unknown: input.unknown,\n });\n }\n }\n\n // add the special OP_RETURN output if no outputs are provided\n if (outputs.length === 0) {\n outputs = [\n {\n amount: 0n,\n script: OP_RETURN_EMPTY_PKSCRIPT,\n },\n ];\n }\n\n for (const output of outputs) {\n tx.addOutput({\n amount: output.amount,\n script: output.script,\n });\n }\n\n // Set BIP-322's PSBT_GLOBAL_GENERIC_SIGNED_MESSAGE (0x09) to the signed\n // message. @scure/btc-signer exposes no public setter for PSBT global\n // fields, so write the unknown global entry directly. 0x09 is unused in the\n // global keymap, so it round-trips as an unknown field that toPSBT()/\n // fromPSBT() preserve.\n const global = (\n tx as unknown as {\n global: { unknown?: [{ type: number; key: Uint8Array }, Uint8Array][] };\n }\n ).global;\n global.unknown = [\n ...(global.unknown ?? []),\n [\n { type: PSBT_GLOBAL_GENERIC_SIGNED_MESSAGE, key: new Uint8Array() },\n new TextEncoder().encode(message),\n ],\n ];\n\n return tx;\n}\n\nfunction hashMessage(message: string, tag: string = TAG_INTENT_PROOF): Uint8Array {\n return schnorr.utils.taggedHash(tag, new TextEncoder().encode(message));\n}\n\nfunction prepareCoinAsIntentProofInput(coin: ExtendedCoin | TransactionInput): TransactionInput {\n if (!(\"tapTree\" in coin)) {\n return coin;\n }\n const vtxoScript = VtxoScript.decode(coin.tapTree);\n const sequence = getSequence(coin.intentTapLeafScript);\n\n const unknown = [VtxoTaprootTree.encode(coin.tapTree)];\n if (coin.extraWitness) {\n unknown.push(ConditionWitness.encode(coin.extraWitness));\n }\n\n return {\n txid: hex.decode(coin.txid),\n index: coin.vout,\n witnessUtxo: {\n amount: BigInt(coin.value),\n script: vtxoScript.pkScript,\n },\n sequence,\n tapLeafScript: [coin.intentTapLeafScript],\n unknown,\n };\n}\n","import type { EventSourceLike } from \"./eventSource\";\n\nexport type ManagedEventSourceIterator = AsyncGenerator<MessageEvent, void, unknown> & {\n close(): void;\n};\n\nfunction createAbortError(): Error {\n const error = new Error(\"EventSource closed\");\n error.name = \"AbortError\";\n return error;\n}\n\n/**\n * Creates a close-aware EventSource async iterator.\n *\n * Listeners attach eagerly so events are buffered before the first next() call.\n * close() closes the EventSource, removes listeners, and wakes any pending\n * next() even when the browser does not emit an error from EventSource.close().\n */\nexport function eventSourceIterator(eventSource: EventSourceLike): ManagedEventSourceIterator {\n const messageQueue: MessageEvent[] = [];\n const errorQueue: Error[] = [];\n let messageResolve: ((value: MessageEvent) => void) | null = null;\n let errorResolve: ((error: Error) => void) | null = null;\n let closed = false;\n let cleanedUp = false;\n\n const cleanup = () => {\n if (cleanedUp) return;\n cleanedUp = true;\n eventSource.removeEventListener(\"message\", messageHandler);\n eventSource.removeEventListener(\"error\", errorHandler);\n };\n\n const close = () => {\n if (closed) return;\n closed = true;\n messageQueue.length = 0;\n errorQueue.length = 0;\n eventSource.close();\n cleanup();\n\n if (errorResolve) {\n const reject = errorResolve;\n messageResolve = null;\n errorResolve = null;\n reject(createAbortError());\n }\n };\n\n const messageHandler = (event: MessageEvent) => {\n if (closed) return;\n if (messageResolve) {\n const resolve = messageResolve;\n messageResolve = null;\n errorResolve = null;\n resolve(event);\n } else {\n messageQueue.push(event);\n }\n };\n\n const errorHandler = () => {\n if (closed) return;\n const error = new Error(\"EventSource error\");\n error.name = \"EventSourceError\";\n if (errorResolve) {\n const reject = errorResolve;\n messageResolve = null;\n errorResolve = null;\n reject(error);\n } else {\n errorQueue.push(error);\n }\n };\n\n // Attach listeners immediately so events are buffered\n // even before the caller starts iterating\n eventSource.addEventListener(\"message\", messageHandler);\n eventSource.addEventListener(\"error\", errorHandler);\n\n const gen = (async function* () {\n try {\n while (!closed) {\n // if we have queued messages, yield the first one, remove it from the queue\n if (messageQueue.length > 0) {\n yield messageQueue.shift()!;\n continue;\n }\n\n // if we have queued errors, throw the first one, remove it from the queue\n if (errorQueue.length > 0) {\n const error = errorQueue.shift()!;\n throw error;\n }\n\n // wait for the next message or error\n const result = await new Promise<MessageEvent>((resolve, reject) => {\n messageResolve = resolve;\n errorResolve = reject;\n }).finally(() => {\n messageResolve = null;\n errorResolve = null;\n });\n\n if (!closed && result) {\n yield result;\n }\n }\n } finally {\n closed = true;\n cleanup();\n eventSource.close();\n }\n })();\n\n const origReturn = gen.return.bind(gen);\n const managed = gen as ManagedEventSourceIterator;\n managed.close = close;\n managed.return = (value?: void | PromiseLike<void>) => {\n close();\n return origReturn(value);\n };\n\n return managed;\n}\n\nexport function isEventSourceError(error: unknown): error is Error {\n return error instanceof Error && error.name === \"EventSourceError\";\n}\n","/**\n * Origin-scoped politeness gate for outbound provider requests.\n *\n * Per-request retry alone cannot survive a rate limiter: under a burst every\n * in-flight request gets the same `429` and the same `Retry-After`, sleeps\n * independently, and wakes in unison to re-trip it — while requests queued\n * behind them learn nothing from the `429` at all. So the backoff state is\n * shared, keyed by **origin** (`/v1/info` and `/v1/indexer/*` are one host\n * behind one limiter). Callers use one of two verbs:\n *\n * - **Wait + report** ({@link OriginRateGate.runHttp}) — indexer and operator\n * reads, where delaying a send is safe. Waiting is separate from retrying:\n * an indexer POST waits and reports but is not replayed (see `indexerFetch`).\n * - **Report-only** ({@link OriginRateGate.reportRateLimited}) — intent and\n * settlement POSTs, which feed the shared signal but never wait or retry:\n * batch sessions have deadlines, and these POSTs are not idempotent at the\n * application level, so a certain missed round beats a possible `429`.\n */\n\n/** Per-origin in-flight cap on the wait+report path (the browser per-host cap). */\nconst DEFAULT_MAX_CONCURRENT = 6;\n\n/** Cooldown applied to a `429` that carries no usable `Retry-After`. */\nconst DEFAULT_COOLDOWN_MS = 5_000;\n\n/** Ceiling on a single cooldown, so a bogus `Retry-After` can't wedge the wallet. */\nconst MAX_COOLDOWN_MS = 60_000;\n\n/** Upper bound of the random delay decorrelating waiters released together. */\nconst DEFAULT_JITTER_MS = 500;\n\nexport interface RateGateOptions {\n maxConcurrent?: number;\n defaultCooldownMs?: number;\n maxCooldownMs?: number;\n jitterMs?: number;\n}\n\ninterface OriginState {\n /** Epoch ms before which no gated request to this origin may be sent. */\n blockedUntil: number;\n /** In-flight gated requests. */\n active: number;\n /** FIFO of waiters parked on the concurrency cap. */\n queue: (() => void)[];\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Parse a `Retry-After` header into milliseconds, in either spec encoding\n * (delta-seconds or HTTP-date). `undefined` when absent or unparseable.\n */\nexport function parseRetryAfterMs(header: string | null | undefined): number | undefined {\n if (header === null || header === undefined) return undefined;\n const trimmed = header.trim();\n // Checked before Number(), which maps \"\" to 0.\n if (trimmed === \"\") return undefined;\n\n const seconds = Number(trimmed);\n // A negative delta is malformed — delta-seconds is non-negative — so there\n // is no valid reading of it. Fall back to the caller's default instead of\n // clamping to 0, which would mean \"no cooldown at all\".\n if (Number.isFinite(seconds)) return seconds < 0 ? undefined : seconds * 1000;\n\n // Unlike a negative delta, a past HTTP-date is well-formed and does mean\n // \"retry now\", so it clamps rather than falling back.\n const at = Date.parse(trimmed);\n if (!Number.isNaN(at)) return Math.max(0, at - Date.now());\n\n return undefined;\n}\n\n/** Derive the origin key for a `fetch` input, tolerating the three input shapes. */\nexport function requestOrigin(input: RequestInfo | URL): string {\n let url: string;\n if (typeof input === \"string\") {\n url = input;\n } else if (input instanceof URL) {\n url = input.href;\n } else {\n url = input.url;\n }\n try {\n return new URL(url).origin;\n } catch {\n // Unparseable (e.g. relative): key on the raw string. Grouping is then\n // wrong, but only ever over- or under-shares a cooldown.\n return url;\n }\n}\n\n/** Shared cooldown + concurrency state, keyed by origin. */\nexport class OriginRateGate {\n private readonly states = new Map<string, OriginState>();\n private readonly maxConcurrent: number;\n private readonly defaultCooldownMs: number;\n private readonly maxCooldownMs: number;\n private readonly jitterMs: number;\n\n constructor(options?: RateGateOptions) {\n this.maxConcurrent = options?.maxConcurrent ?? DEFAULT_MAX_CONCURRENT;\n this.defaultCooldownMs = options?.defaultCooldownMs ?? DEFAULT_COOLDOWN_MS;\n this.maxCooldownMs = options?.maxCooldownMs ?? MAX_COOLDOWN_MS;\n this.jitterMs = options?.jitterMs ?? DEFAULT_JITTER_MS;\n }\n\n /**\n * Run `fn` under the origin's concurrency cap and behind any active\n * cooldown. Put only the request in `fn`: the slot is released as soon as\n * it settles, so body parsing doesn't hold one.\n */\n async run<T>(input: RequestInfo | URL, fn: () => Promise<T>): Promise<T> {\n const state = this.stateFor(requestOrigin(input));\n await this.acquire(state);\n try {\n // Re-checked after each sleep, so a `429` seen by another request\n // while this one waits extends the wait instead of slipping through.\n for (;;) {\n const remaining = state.blockedUntil - Date.now();\n if (remaining <= 0) break;\n await sleep(remaining + Math.random() * this.jitterMs);\n }\n return await fn();\n } finally {\n this.release(state);\n }\n }\n\n /**\n * {@link run} for a request whose response the gate should inspect: a `429`\n * is recorded *before* the slot is released. Reporting after `run()` resolves\n * is too late — `release()` hands the slot to the next queued waiter, which\n * resumes, sees no cooldown, and sends into the limiter that just refused us.\n *\n * Prefer this over `run` for anything returning a `Response`.\n */\n runHttp(input: RequestInfo | URL, fn: () => Promise<Response>): Promise<Response> {\n return this.run(input, async () => {\n const response = await fn();\n if (response.status === 429) {\n this.reportRateLimited(input, response.headers?.get(\"retry-after\"));\n }\n return response;\n });\n }\n\n /**\n * Record an observed `429`, pausing every gated request to that origin.\n * Monotonic: a shorter cooldown never shortens one already in effect.\n */\n reportRateLimited(input: RequestInfo | URL, retryAfterHeader?: string | null): void {\n const cooldown = Math.min(\n parseRetryAfterMs(retryAfterHeader) ?? this.defaultCooldownMs,\n this.maxCooldownMs,\n );\n const state = this.stateFor(requestOrigin(input));\n state.blockedUntil = Math.max(state.blockedUntil, Date.now() + cooldown);\n }\n\n /** Milliseconds left on `input` origin's cooldown; `0` when not cooling down. */\n cooldownRemainingMs(input: RequestInfo | URL): number {\n const state = this.states.get(requestOrigin(input));\n if (!state) return 0;\n return Math.max(0, state.blockedUntil - Date.now());\n }\n\n /**\n * Drop all per-origin state, so test suites don't inherit each other's\n * cooldowns. Waiters queued on the discarded state still drain normally.\n */\n reset(): void {\n this.states.clear();\n }\n\n private stateFor(origin: string): OriginState {\n let state = this.states.get(origin);\n if (!state) {\n state = { blockedUntil: 0, active: 0, queue: [] };\n this.states.set(origin, state);\n }\n return state;\n }\n\n private acquire(state: OriginState): Promise<void> {\n if (state.active < this.maxConcurrent) {\n state.active += 1;\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n state.queue.push(() => {\n state.active += 1;\n resolve();\n });\n });\n }\n\n private release(state: OriginState): void {\n state.active -= 1;\n const next = state.queue.shift();\n if (next) next();\n }\n}\n\n/**\n * Process-wide gate shared by every provider fetch path. Origin keying keeps\n * embedders on several operators from cross-throttling each other.\n */\nexport const rateGate = new OriginRateGate();\n","import { TxTreeNode } from \"../tree/txTree\";\nimport { TreeNonces, TreePartialSigs } from \"../tree/signingSession\";\nimport { hex } from \"@scure/base\";\nimport { Vtxo } from \"./indexer\";\nimport { eventSourceIterator, isEventSourceError } from \"./utils\";\nimport {\n isEventSourceUnavailableError,\n resolveEventSource,\n type EventSourceCapable,\n type EventSourceFactory,\n} from \"./eventSource\";\nimport {\n ArkErrorName,\n isArkError,\n maybeArkError,\n throwIfHttpUnavailable,\n toProviderUnavailable,\n} from \"./errors\";\nimport type { IntentFeeConfig } from \"../arkfee\";\nimport { Intent } from \"../intent\";\nimport { DEFAULT_ARKADE_SERVER_URL } from \"../networks\";\nimport { fetch } from \"../utils/fetch\";\nimport { rateGate } from \"./rateGate\";\n\n/**\n * Thrown by {@link RestArkProvider} when arkd rejects a request with\n * `DIGEST_MISMATCH` — the client's cached server info was stale (e.g. an\n * operator signer rotation). By the time this surfaces the provider has already\n * refreshed its info and fired `onServerInfoChanged`; the caller should rebuild\n * the request under the fresh server info and retry. Mirrors NArk's\n * `DigestMismatchException` (dotnet-sdk #131): the SDK never silently retries.\n */\nexport class DigestMismatchError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DigestMismatchError\";\n }\n}\n\n/** Output requested during settlement or transaction submission. */\nexport type Output = {\n /** Destination address, either onchain or Arkade (offchain). */\n address: string;\n\n /** Amount to send in satoshis. */\n amount: bigint;\n};\n\nexport enum SettlementEventType {\n BatchStarted = \"batch_started\",\n BatchFinalization = \"batch_finalization\",\n BatchFinalized = \"batch_finalized\",\n BatchFailed = \"batch_failed\",\n TreeSigningStarted = \"tree_signing_started\",\n TreeNonces = \"tree_nonces\",\n TreeTx = \"tree_tx\",\n TreeSignature = \"tree_signature\",\n StreamStarted = \"stream_started\",\n}\n\nexport type BatchFinalizationEvent = {\n type: SettlementEventType.BatchFinalization;\n id: string;\n commitmentTx: string;\n};\n\nexport type BatchFinalizedEvent = {\n type: SettlementEventType.BatchFinalized;\n id: string;\n commitmentTxid: string;\n};\n\nexport type BatchFailedEvent = {\n type: SettlementEventType.BatchFailed;\n id: string;\n reason: string;\n};\n\nexport type TreeSigningStartedEvent = {\n type: SettlementEventType.TreeSigningStarted;\n id: string;\n cosignersPublicKeys: string[];\n unsignedCommitmentTx: string;\n};\n\nexport type TreeNoncesEvent = {\n type: SettlementEventType.TreeNonces;\n id: string;\n topic: string[];\n txid: string;\n /** Musig2 public nonces keyed by cosigner public key. */\n nonces: TreeNonces;\n};\n\nexport type BatchStartedEvent = {\n type: SettlementEventType.BatchStarted;\n id: string;\n intentIdHashes: string[];\n batchExpiry: bigint;\n};\n\nexport type TreeTxEvent = {\n type: SettlementEventType.TreeTx;\n id: string;\n topic: string[];\n batchIndex: number;\n chunk: TxTreeNode;\n};\n\nexport type TreeSignatureEvent = {\n type: SettlementEventType.TreeSignature;\n id: string;\n topic: string[];\n batchIndex: number;\n txid: string;\n signature: string;\n};\n\nexport type StreamStartedEvent = {\n type: SettlementEventType.StreamStarted;\n id: string;\n};\n\nexport type SettlementEvent =\n | BatchFinalizationEvent\n | BatchFinalizedEvent\n | BatchFailedEvent\n | TreeSigningStartedEvent\n | TreeNoncesEvent\n | BatchStartedEvent\n | TreeTxEvent\n | TreeSignatureEvent\n | StreamStartedEvent;\n\nexport interface ScheduledSession {\n duration: bigint;\n fees: FeeInfo;\n nextEndTime: bigint;\n nextStartTime: bigint;\n period: bigint;\n}\n\nexport interface FeeInfo {\n intentFee: IntentFeeConfig;\n txFeeRate: string;\n}\n\nexport interface PendingTx {\n arkTxid: string;\n finalArkTx: string;\n signedCheckpointTxs: string[];\n}\n\nexport interface DeprecatedSigner {\n /**\n * Unix timestamp (seconds) after which the server no longer accepts this\n * signer's VTXOs as cooperative-migration inputs. arkd advertises this as a\n * non-nullable field, so it is always present: `0n` is the sentinel for \"no\n * cutoff advertised\" — the deprecated signer is due for migration\n * immediately ({@link classifyContractSigner} maps `0n` to `DUE_NOW`). A\n * positive value is a real deadline (`MIGRATABLE` until it passes, then\n * `EXPIRED`).\n */\n cutoffDate: bigint;\n pubkey: string;\n}\n\nexport type ServiceStatus = Record<string, string>;\n\nexport interface ArkInfo {\n boardingExitDelay: bigint;\n checkpointTapscript: string;\n deprecatedSigners: DeprecatedSigner[];\n digest: string;\n dust: bigint;\n fees: FeeInfo;\n forfeitAddress: string;\n forfeitPubkey: string;\n network: string;\n scheduledSession?: ScheduledSession;\n serviceStatus: ServiceStatus;\n sessionDuration: bigint;\n signerPubkey: string;\n unilateralExitDelay: bigint;\n /**\n * Sweep delay the operator advertises for the shared batch output.\n * `undefined` when not advertised — never coerce to `0n`, which would\n * satisfy any floor comparison.\n */\n vtxoTreeExpiry?: bigint;\n /**\n * Maximum boarding input amount.\n *\n * @remarks\n * `-1` means unlimited, while `0` disables boarding.\n */\n utxoMaxAmount: bigint;\n utxoMinAmount: bigint;\n version: string;\n /**\n * Maximum virtual output amount.\n *\n * @remarks\n * `-1` means unlimited.\n */\n vtxoMaxAmount: bigint;\n vtxoMinAmount: bigint;\n}\n\n/** Signed intent payload sent to the Arkade server. */\nexport interface SignedIntent<T extends Intent.Message> {\n /** Base64-encoded signed proof transaction. */\n proof: string;\n\n /** Intent message payload associated with the proof. */\n message: T;\n}\n\n/** Transaction notification emitted by the Arkade server stream. */\nexport interface TxNotification {\n /** Transaction id. */\n txid: string;\n\n /** Raw transaction payload. */\n tx: string;\n\n /** Virtual outputs spent by the transaction. */\n spentVtxos: Vtxo[];\n\n /** Virtual outputs made spendable by the transaction. */\n spendableVtxos: Vtxo[];\n\n /** Optional checkpoint transactions associated with the notification. */\n checkpointTxs?: Record<string, { txid: string; tx: string }>;\n}\n\nexport interface ArkProvider {\n /** Fetch Arkade server configuration and fee settings. */\n getInfo(): Promise<ArkInfo>;\n\n /** Submit a signed Arkade transaction and its checkpoint transactions. */\n submitTx(\n signedArkTx: string,\n checkpointTxs: string[],\n ): Promise<{\n arkTxid: string;\n finalArkTx: string;\n signedCheckpointTxs: string[];\n }>;\n\n /** Finalize a previously submitted Arkade transaction. */\n finalizeTx(arkTxid: string, finalCheckpointTxs: string[]): Promise<void>;\n\n /** Register a signed intent with the Arkade server. */\n registerIntent(intent: SignedIntent<Intent.RegisterMessage>): Promise<string>;\n\n /** Delete a previously registered intent. */\n deleteIntent(intent: SignedIntent<Intent.DeleteMessage>): Promise<void>;\n\n /** Confirm an already registered intent id. */\n confirmRegistration(intentId: string): Promise<void>;\n\n /** Submit musig2 tree nonces for a batch signing session. */\n submitTreeNonces(batchId: string, pubkey: string, nonces: TreeNonces): Promise<void>;\n\n /** Submit musig2 partial signatures for a batch signing session. */\n submitTreeSignatures(\n batchId: string,\n pubkey: string,\n signatures: TreePartialSigs,\n ): Promise<void>;\n\n /** Submit signed forfeit transactions for cooperative settlement. */\n submitSignedForfeitTxs(signedForfeitTxs: string[], signedCommitmentTx?: string): Promise<void>;\n\n /** Open the settlement event stream for the given topics. */\n getEventStream(signal: AbortSignal, topics: string[]): AsyncIterableIterator<SettlementEvent>;\n\n /** Stream transaction notifications emitted by the Arkade server. */\n getTransactionsStream(signal: AbortSignal): AsyncIterableIterator<{\n commitmentTx?: TxNotification;\n arkTx?: TxNotification;\n }>;\n\n /** Fetch pending transactions for a signed get-pending-tx intent. */\n getPendingTxs(intent: SignedIntent<Intent.GetPendingTxMessage>): Promise<PendingTx[]>;\n}\n\n/**\n * REST-based Arkade provider implementation.\n *\n * @see https://buf.build/arkade-os/arkd/docs/main:ark.v1#ark.v1.ArkService\n * @example\n * ```typescript\n * const provider = new RestArkProvider('https://arkade.computer');\n * const info = await provider.getInfo();\n * ```\n */\nexport class RestArkProvider implements ArkProvider {\n /** Overrides {@link configureEventSource} for this provider's streams. */\n protected readonly eventSource?: EventSourceFactory;\n\n constructor(\n public serverUrl: string = DEFAULT_ARKADE_SERVER_URL,\n options: EventSourceCapable = {},\n ) {\n this.eventSource = options.eventSource;\n }\n\n /**\n * Last server-info digest seen (from {@link getInfo}). Sent as `X-Digest`\n * on outgoing requests so arkd can reject a client whose cached info is\n * stale. Empty until the first {@link getInfo}.\n */\n private _digest = \"\";\n\n private _serverInfoListeners = new Set<(info: ArkInfo) => void>();\n\n /**\n * Subscribe to server-info changes. Fired when a request is rejected with\n * `DIGEST_MISMATCH` and fresh info is re-fetched, so consumers (the wallet)\n * can re-derive signer-dependent state mid-session without polling. Returns\n * an unsubscribe function.\n */\n onServerInfoChanged(listener: (info: ArkInfo) => void): () => void {\n this._serverInfoListeners.add(listener);\n return () => {\n this._serverInfoListeners.delete(listener);\n };\n }\n\n private emitServerInfoChanged(info: ArkInfo): void {\n for (const listener of this._serverInfoListeners) {\n try {\n listener(info);\n } catch (e) {\n console.warn(\"onServerInfoChanged listener threw\", e);\n }\n }\n }\n\n /**\n * `fetch` wrapper for arkd requests that participates in server-info digest\n * negotiation. Sends the cached `X-Digest`; when arkd rejects a request with\n * `DIGEST_MISMATCH`, refreshes {@link getInfo} (updating the digest), fires\n * {@link onServerInfoChanged}, and THROWS {@link DigestMismatchError} — it\n * never silently retries, since the in-flight request was built against the\n * now-stale config. Dormant until arkd returns the error — then it is the\n * instant, event-driven signer-rotation trigger. {@link getInfo} itself never\n * routes through here: it is the refresh path and must not be digest-gated.\n */\n private async authedFetch(url: string, init: RequestInit): Promise<Response> {\n // Read the cached digest once, in the method body where `this` is\n // unambiguously the provider, and build the header set imperatively. A\n // prior nested-arrow form (`() => this._digest ? ... : init`) read\n // `this._digest` as empty on some CI runners and dropped the header.\n const digest = this._digest;\n const headers: Record<string, string> = {\n ...(init.headers as Record<string, string> | undefined),\n };\n if (digest) headers[\"X-Digest\"] = digest;\n let response: Response;\n try {\n response = await fetch(url, { ...init, headers });\n } catch (err) {\n // Server unreachable: surface a typed retryable unavailable error so\n // cooperative flows fail with it rather than leaking a raw FetchError.\n throw toProviderUnavailable(err, \"arkade\");\n }\n if (response.ok) return response;\n // Report-only (see rateGate): this POST is never delayed or retried.\n if (response.status === 429) {\n rateGate.reportRateLimited(url, response.headers?.get(\"retry-after\"));\n }\n // Read the body first: error classification must branch on its content,\n // not just the HTTP status. arkd is behind grpc-gateway, which renders\n // application-level errors across the 4xx AND 5xx range (gRPC INTERNAL ->\n // HTTP 500), so status alone can't tell a terminal rejection apart from a\n // genuine availability failure.\n let body: string;\n try {\n body = await response.clone().text();\n } catch (e) {\n // Couldn't read the body to classify it (e.g. the connection dropped\n // mid-body). Fall back to status-only classification so a genuine\n // 429/5xx still surfaces as retryable; digest detection is only\n // deferred to the next getInfo(), not lost.\n console.warn(\"authedFetch could not read response body for digest check\", e);\n throwIfHttpUnavailable(response, \"arkade\");\n return response;\n }\n // Only arkd's *structured* digest error counts: a grpc-gateway\n // ErrorDetails whose name is DIGEST_MISMATCH (arkd's X-Digest guard,\n // v0.9.9-rc.1 #1104), parsed via the shared maybeArkError. A raw\n // substring match would let an unrelated error body that merely mentions\n // the token trigger a spurious refresh + signer rotation.\n const arkError = maybeArkError(new Error(body));\n // A structured arkd error means the operator is up and deliberately\n // rejecting the request — terminal, even when grpc-gateway renders it as a\n // 5xx. Only a non-structured 429/5xx (a bare proxy/gateway failure) is a\n // retryable availability condition.\n if (!arkError) throwIfHttpUnavailable(response, \"arkade\");\n if (!isArkError(arkError, ArkErrorName.DIGEST_MISMATCH)) return response;\n // arkd rejected this request because our cached server info is stale\n // (e.g. the operator rotated its signer). Mirror NArk's BuildVersionHandler\n // (dotnet-sdk #131): clear the digest, refetch info, fire onServerInfoChanged\n // so the wallet re-derives signer-dependent state, then THROW. The SDK does\n // NOT silently retry — the in-flight request was built against the old config,\n // so the caller must rebuild and retry it under the refreshed server info.\n this._digest = \"\";\n const info = await this.getInfo();\n this.emitServerInfoChanged(info);\n throw new DigestMismatchError(\n \"Arkade server reported a configuration digest mismatch; server info was \" +\n \"refreshed. Rebuild and retry the request under the new server info.\",\n );\n }\n\n async getInfo(): Promise<ArkInfo> {\n const url = `${this.serverUrl}/v1/info`;\n // Wait + report (see rateGate): shares an origin, and a limiter, with\n // the indexer.\n const response = await rateGate.runHttp(url, () => fetch(url));\n if (!response.ok) {\n const errorText = await response.text();\n // A 429 or 5xx means the operator is up but temporarily unable to\n // serve — a retryable availability failure, not a config/auth error.\n // Surface it as a typed unavailable error so wallet boot can fall\n // back to a cached server-info snapshot. Pass the body so a 5xx that\n // actually carries a structured arkd error (grpc-gateway maps gRPC\n // INTERNAL -> HTTP 500) stays terminal instead. `fetch` transport\n // failures (server unreachable) are already surfaced as FetchError\n // upstream.\n throwIfHttpUnavailable(response, \"arkade\", errorText);\n handleError(errorText, `Failed to get server info: ${response.statusText}`);\n }\n const fromServer = await response.json();\n const info: ArkInfo = {\n boardingExitDelay: BigInt(fromServer.boardingExitDelay ?? 0),\n checkpointTapscript: fromServer.checkpointTapscript ?? \"\",\n deprecatedSigners:\n fromServer.deprecatedSigners?.map((signer: any) => ({\n // arkd advertises `cutoffDate` as a non-nullable field, so it\n // is always a bigint here — `0n` is the sentinel for \"no\n // cutoff\" (the classifier maps it to DUE_NOW). The grpc-gateway\n // marshals with EmitUnpopulated, so an unset `cutoff_date`\n // already arrives as `\"0\"`; a genuinely missing field defaults\n // to `0n` too. Never collapse to `undefined`.\n cutoffDate: BigInt(signer.cutoffDate ?? 0),\n pubkey: signer.pubkey ?? \"\",\n })) ?? [],\n digest: fromServer.digest ?? \"\",\n dust: BigInt(fromServer.dust ?? 0),\n fees: {\n intentFee: fromServer.fees?.intentFee ?? {},\n txFeeRate: fromServer?.fees?.txFeeRate ?? \"\",\n },\n forfeitAddress: fromServer.forfeitAddress ?? \"\",\n forfeitPubkey: fromServer.forfeitPubkey ?? \"\",\n network: fromServer.network ?? \"\",\n scheduledSession:\n \"scheduledSession\" in fromServer && fromServer.scheduledSession != null\n ? {\n duration: BigInt(fromServer.scheduledSession.duration ?? 0),\n nextStartTime: BigInt(fromServer.scheduledSession.nextStartTime ?? 0),\n nextEndTime: BigInt(fromServer.scheduledSession.nextEndTime ?? 0),\n period: BigInt(fromServer.scheduledSession.period ?? 0),\n fees: fromServer.scheduledSession.fees ?? {},\n }\n : undefined,\n serviceStatus: fromServer.serviceStatus ?? {},\n sessionDuration: BigInt(fromServer.sessionDuration ?? 0),\n signerPubkey: fromServer.signerPubkey ?? \"\",\n unilateralExitDelay: BigInt(fromServer.unilateralExitDelay ?? 0),\n vtxoTreeExpiry:\n fromServer.vtxoTreeExpiry != null ? BigInt(fromServer.vtxoTreeExpiry) : undefined,\n utxoMaxAmount: BigInt(fromServer.utxoMaxAmount ?? -1),\n utxoMinAmount: BigInt(fromServer.utxoMinAmount ?? 0),\n version: fromServer.version ?? \"\",\n vtxoMaxAmount: BigInt(fromServer.vtxoMaxAmount ?? -1),\n vtxoMinAmount: BigInt(fromServer.vtxoMinAmount ?? 0),\n };\n this._digest = info.digest;\n return info;\n }\n\n async submitTx(\n signedArkTx: string,\n checkpointTxs: string[],\n ): Promise<{\n arkTxid: string;\n finalArkTx: string;\n signedCheckpointTxs: string[];\n }> {\n const url = `${this.serverUrl}/v1/tx/submit`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n signedArkTx,\n checkpointTxs,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to submit virtual transaction: ${errorText}`);\n }\n\n const data = await response.json();\n return {\n arkTxid: data.arkTxid,\n finalArkTx: data.finalArkTx,\n signedCheckpointTxs: data.signedCheckpointTxs,\n };\n }\n\n async finalizeTx(arkTxid: string, finalCheckpointTxs: string[]): Promise<void> {\n const url = `${this.serverUrl}/v1/tx/finalize`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n arkTxid,\n finalCheckpointTxs,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to finalize offchain transaction: ${errorText}`);\n }\n }\n\n async registerIntent(intent: SignedIntent<Intent.RegisterMessage>): Promise<string> {\n const url = `${this.serverUrl}/v1/batch/registerIntent`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n intent: {\n proof: intent.proof,\n message: Intent.encodeMessage(intent.message),\n },\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to register intent: ${errorText}`);\n }\n\n const data = await response.json();\n return data.intentId;\n }\n\n async deleteIntent(intent: SignedIntent<Intent.DeleteMessage>): Promise<void> {\n const url = `${this.serverUrl}/v1/batch/deleteIntent`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n intent: {\n proof: intent.proof,\n message: Intent.encodeMessage(intent.message),\n },\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to delete intent: ${errorText}`);\n }\n }\n\n async confirmRegistration(intentId: string): Promise<void> {\n const url = `${this.serverUrl}/v1/batch/ack`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n intentId,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to confirm registration: ${errorText}`);\n }\n }\n\n async submitTreeNonces(batchId: string, pubkey: string, nonces: TreeNonces): Promise<void> {\n const url = `${this.serverUrl}/v1/batch/tree/submitNonces`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n batchId,\n pubkey,\n treeNonces: encodeMusig2Nonces(nonces),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to submit tree nonces: ${errorText}`);\n }\n }\n\n async submitTreeSignatures(\n batchId: string,\n pubkey: string,\n signatures: TreePartialSigs,\n ): Promise<void> {\n const url = `${this.serverUrl}/v1/batch/tree/submitSignatures`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n batchId,\n pubkey,\n treeSignatures: encodeMusig2Signatures(signatures),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to submit tree signatures: ${errorText}`);\n }\n }\n\n async submitSignedForfeitTxs(\n signedForfeitTxs: string[],\n signedCommitmentTx?: string,\n ): Promise<void> {\n const url = `${this.serverUrl}/v1/batch/submitForfeitTxs`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n signedForfeitTxs: signedForfeitTxs,\n signedCommitmentTx: signedCommitmentTx,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to submit forfeit transactions: ${response.statusText}`);\n }\n }\n\n getEventStream(signal: AbortSignal, topics: string[]): AsyncIterableIterator<SettlementEvent> {\n const url = `${this.serverUrl}/v1/batch/events`;\n const queryParams =\n topics.length > 0\n ? `?${topics.map((topic) => `topics=${encodeURIComponent(topic)}`).join(\"&\")}`\n : \"\";\n\n // The EventSource is allocated inside the generator body so that\n // abandoning the returned iterator before iteration starts does not\n // leak the underlying SSE connection. `return()` is overridden below\n // so that closing the generator also closes the connection even when\n // the body is currently suspended at an await point.\n let iterator: ReturnType<typeof eventSourceIterator> | null = null;\n const closeIterator = () => iterator?.close();\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const gen = (async function* () {\n const abortHandler = closeIterator;\n signal?.addEventListener(\"abort\", abortHandler);\n\n try {\n while (!signal?.aborted) {\n const currentIterator = eventSourceIterator(\n resolveEventSource(self.eventSource)(url + queryParams),\n );\n iterator = currentIterator;\n\n try {\n for await (const event of currentIterator) {\n if (signal?.aborted) break;\n\n try {\n const data = JSON.parse(event.data);\n const settlementEvent = self.parseSettlementEvent(data);\n if (settlementEvent) {\n yield settlementEvent;\n }\n } catch (err) {\n console.error(\"Failed to parse event:\", err);\n throw err;\n }\n }\n } catch (error) {\n if (\n signal?.aborted ||\n (error instanceof Error && error.name === \"AbortError\")\n ) {\n break;\n }\n\n // ignore timeout errors, they're expected when the server is not sending anything for 5 min\n if (isFetchTimeoutError(error)) {\n console.debug(\"Timeout error ignored\");\n continue;\n }\n\n if (isEventSourceError(error)) {\n throw error;\n }\n\n // A missing EventSource is an environment fact, not a\n // stream failure: the caller reports it once (see\n // ContractWatcher), where this loop would log it on\n // every reconnect attempt.\n if (isEventSourceUnavailableError(error)) throw error;\n\n console.error(\"Event stream error:\", error);\n throw error;\n } finally {\n currentIterator.close();\n iterator = null;\n }\n }\n } finally {\n signal?.removeEventListener(\"abort\", abortHandler);\n closeIterator();\n }\n })();\n\n const origReturn = gen.return.bind(gen);\n gen.return = (value) => {\n closeIterator();\n return origReturn(value);\n };\n\n return gen;\n }\n\n getTransactionsStream(signal: AbortSignal): AsyncIterableIterator<{\n commitmentTx?: TxNotification;\n arkTx?: TxNotification;\n }> {\n const url = `${this.serverUrl}/v1/txs`;\n let iterator: ReturnType<typeof eventSourceIterator> | null = null;\n const closeIterator = () => iterator?.close();\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const gen = (async function* () {\n const abortHandler = closeIterator;\n signal?.addEventListener(\"abort\", abortHandler);\n\n try {\n while (!signal?.aborted) {\n try {\n const currentIterator = eventSourceIterator(\n resolveEventSource(self.eventSource)(url),\n );\n iterator = currentIterator;\n\n for await (const event of currentIterator) {\n if (signal?.aborted) break;\n\n try {\n const data = JSON.parse(event.data);\n const txNotification = self.parseTransactionNotification(data);\n if (txNotification) {\n yield txNotification;\n }\n } catch (err) {\n console.error(\"Failed to parse transaction notification:\", err);\n throw err;\n }\n }\n } catch (error) {\n if (\n signal?.aborted ||\n (error instanceof Error && error.name === \"AbortError\")\n ) {\n break;\n }\n\n // ignore timeout errors, they're expected when the server is not sending anything for 5 min\n if (isFetchTimeoutError(error)) {\n console.debug(\"Timeout error ignored\");\n continue;\n }\n\n if (isEventSourceError(error)) {\n throw error;\n }\n\n // A missing EventSource is an environment fact, not a\n // stream failure: the caller reports it once (see\n // ContractWatcher), where this loop would log it on\n // every reconnect attempt.\n if (isEventSourceUnavailableError(error)) throw error;\n\n console.error(\"Transaction stream error:\", error);\n throw error;\n } finally {\n closeIterator();\n iterator = null;\n }\n }\n } finally {\n signal?.removeEventListener(\"abort\", abortHandler);\n closeIterator();\n }\n })();\n\n const origReturn = gen.return.bind(gen);\n gen.return = (value) => {\n closeIterator();\n return origReturn(value);\n };\n\n return gen;\n }\n\n async getPendingTxs(intent: SignedIntent<Intent.GetPendingTxMessage>): Promise<PendingTx[]> {\n const url = `${this.serverUrl}/v1/tx/pending`;\n const response = await this.authedFetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n intent: {\n proof: intent.proof,\n message: Intent.encodeMessage(intent.message),\n },\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n handleError(errorText, `Failed to get pending transactions: ${errorText}`);\n }\n\n const data = await response.json();\n return data.pendingTxs;\n }\n\n protected parseSettlementEvent(\n data: ProtoTypes.GetEventStreamResponse,\n ): SettlementEvent | null {\n // Check for BatchStarted event\n if (data.batchStarted) {\n return {\n type: SettlementEventType.BatchStarted,\n id: data.batchStarted.id,\n intentIdHashes: data.batchStarted.intentIdHashes,\n batchExpiry: BigInt(data.batchStarted.batchExpiry),\n };\n }\n\n // Check for BatchFinalization event\n if (data.batchFinalization) {\n return {\n type: SettlementEventType.BatchFinalization,\n id: data.batchFinalization.id,\n commitmentTx: data.batchFinalization.commitmentTx,\n };\n }\n\n // Check for BatchFinalized event\n if (data.batchFinalized) {\n return {\n type: SettlementEventType.BatchFinalized,\n id: data.batchFinalized.id,\n commitmentTxid: data.batchFinalized.commitmentTxid,\n };\n }\n\n // Check for BatchFailed event\n if (data.batchFailed) {\n return {\n type: SettlementEventType.BatchFailed,\n id: data.batchFailed.id,\n reason: data.batchFailed.reason,\n };\n }\n\n // Check for TreeSigningStarted event\n if (data.treeSigningStarted) {\n return {\n type: SettlementEventType.TreeSigningStarted,\n id: data.treeSigningStarted.id,\n cosignersPublicKeys: data.treeSigningStarted.cosignersPubkeys,\n unsignedCommitmentTx: data.treeSigningStarted.unsignedCommitmentTx,\n };\n }\n\n // Check for TreeNoncesAggregated event\n if (data.treeNoncesAggregated) {\n // skip treeNoncesAggregated event, deprecated\n return null;\n }\n\n if (data.treeNonces) {\n return {\n type: SettlementEventType.TreeNonces,\n id: data.treeNonces.id,\n topic: data.treeNonces.topic,\n txid: data.treeNonces.txid,\n nonces: decodeMusig2Nonces(data.treeNonces.nonces), // pubkey -> public nonce\n };\n }\n\n // Check for TreeTx event\n if (data.treeTx) {\n const children = Object.fromEntries(\n Object.entries(data.treeTx.children).map(([outputIndex, txid]) => {\n return [parseInt(outputIndex), txid];\n }),\n );\n\n return {\n type: SettlementEventType.TreeTx,\n id: data.treeTx.id,\n topic: data.treeTx.topic,\n batchIndex: data.treeTx.batchIndex,\n chunk: {\n txid: data.treeTx.txid,\n tx: data.treeTx.tx,\n children,\n },\n };\n }\n\n if (data.treeSignature) {\n return {\n type: SettlementEventType.TreeSignature,\n id: data.treeSignature.id,\n topic: data.treeSignature.topic,\n batchIndex: data.treeSignature.batchIndex,\n txid: data.treeSignature.txid,\n signature: data.treeSignature.signature,\n };\n }\n\n if (data.streamStarted) {\n return {\n type: SettlementEventType.StreamStarted,\n id: data.streamStarted.id,\n };\n }\n\n // Skip heartbeat events\n if (data.heartbeat) {\n return null;\n }\n\n console.warn(\"Unknown event type:\", data);\n return null;\n }\n\n protected parseTransactionNotification(\n data: ProtoTypes.GetTransactionsStreamResponse,\n ): { commitmentTx?: TxNotification; arkTx?: TxNotification } | null {\n if (data.commitmentTx) {\n return {\n commitmentTx: {\n txid: data.commitmentTx.txid,\n tx: data.commitmentTx.tx,\n spentVtxos: data.commitmentTx.spentVtxos.map(mapVtxo),\n spendableVtxos: data.commitmentTx.spendableVtxos.map(mapVtxo),\n checkpointTxs: data.commitmentTx.checkpointTxs,\n },\n };\n }\n\n if (data.arkTx) {\n return {\n arkTx: {\n txid: data.arkTx.txid,\n tx: data.arkTx.tx,\n spentVtxos: data.arkTx.spentVtxos.map(mapVtxo),\n spendableVtxos: data.arkTx.spendableVtxos.map(mapVtxo),\n checkpointTxs: data.arkTx.checkpointTxs,\n },\n };\n }\n\n // Skip heartbeat events\n if (data.heartbeat) {\n return null;\n }\n\n console.warn(\"Unknown transaction notification type:\", data);\n return null;\n }\n}\n\nfunction encodeMusig2Nonces(nonces: TreeNonces): Record<string, string> {\n const noncesObject: Record<string, string> = {};\n for (const [txid, nonce] of nonces) {\n noncesObject[txid] = hex.encode(nonce.pubNonce);\n }\n return noncesObject;\n}\n\nfunction encodeMusig2Signatures(signatures: TreePartialSigs): Record<string, string> {\n const sigObject: Record<string, string> = {};\n for (const [txid, sig] of signatures) {\n sigObject[txid] = hex.encode(sig.encode());\n }\n return sigObject;\n}\n\nfunction decodeMusig2Nonces(noncesObject: Record<string, string>): TreeNonces {\n return new Map(\n Object.entries(noncesObject).map(([txid, nonce]) => {\n if (typeof nonce !== \"string\") {\n throw new Error(\"invalid nonce\");\n }\n return [txid, { pubNonce: hex.decode(nonce) }];\n }),\n );\n}\n\n// ProtoTypes namespace defines unexported types representing the raw data received from the server\nnamespace ProtoTypes {\n interface BatchStartedEvent {\n id: string;\n intentIdHashes: string[];\n batchExpiry: number;\n }\n\n interface BatchFailed {\n id: string;\n reason: string;\n }\n\n export interface BatchFinalizationEvent {\n id: string;\n commitmentTx: string;\n }\n\n interface BatchFinalizedEvent {\n id: string;\n commitmentTxid: string;\n }\n\n interface TreeSigningStartedEvent {\n id: string;\n cosignersPubkeys: string[];\n unsignedCommitmentTx: string;\n }\n\n interface TreeNoncesAggregatedEvent {\n id: string;\n treeNonces: Record<string, string>;\n }\n\n interface TreeNoncesEvent {\n id: string;\n topic: string[];\n txid: string;\n nonces: Record<string, string>;\n }\n\n interface TreeTxEvent {\n id: string;\n topic: string[];\n batchIndex: number;\n txid: string;\n tx: string;\n children: Record<string, string>;\n }\n\n interface TreeSignatureEvent {\n id: string;\n topic: string[];\n batchIndex: number;\n txid: string;\n signature: string;\n }\n\n interface StreamStartedEvent {\n id: string;\n }\n\n interface Heartbeat {\n // Empty interface for heartbeat events\n }\n\n export interface VtxoData {\n outpoint: {\n txid: string;\n vout: number;\n };\n amount: string;\n script: string;\n createdAt: string;\n expiresAt: string | null;\n commitmentTxids: string[];\n isPreconfirmed: boolean;\n isSwept: boolean;\n isUnrolled: boolean;\n isSpent: boolean;\n spentBy: string;\n settledBy?: string;\n arkTxid?: string;\n }\n\n export interface GetEventStreamResponse {\n batchStarted?: BatchStartedEvent;\n batchFailed?: BatchFailed;\n batchFinalization?: BatchFinalizationEvent;\n batchFinalized?: BatchFinalizedEvent;\n treeSigningStarted?: TreeSigningStartedEvent;\n treeNoncesAggregated?: TreeNoncesAggregatedEvent;\n treeNonces?: TreeNoncesEvent;\n treeTx?: TreeTxEvent;\n treeSignature?: TreeSignatureEvent;\n streamStarted?: StreamStartedEvent;\n heartbeat?: Heartbeat;\n }\n\n export interface GetTransactionsStreamResponse {\n commitmentTx?: {\n txid: string;\n tx: string;\n spentVtxos: VtxoData[];\n spendableVtxos: VtxoData[];\n checkpointTxs?: Record<string, { txid: string; tx: string }>;\n };\n arkTx?: {\n txid: string;\n tx: string;\n spentVtxos: VtxoData[];\n spendableVtxos: VtxoData[];\n checkpointTxs?: Record<string, { txid: string; tx: string }>;\n };\n heartbeat?: Heartbeat;\n }\n\n // Legacy types for backward compatibility\n export interface EventData {\n batchStarted?: BatchStartedEvent;\n batchFailed?: BatchFailed;\n batchFinalization?: BatchFinalizationEvent;\n batchFinalized?: BatchFinalizedEvent;\n treeSigningStarted?: TreeSigningStartedEvent;\n treeNoncesAggregated?: TreeNoncesAggregatedEvent;\n treeTx?: TreeTxEvent;\n treeSignature?: TreeSignatureEvent;\n }\n\n export interface TransactionData {\n commitmentTx?: {\n txid: string;\n tx: string;\n spentVtxos: VtxoData[];\n spendableVtxos: VtxoData[];\n checkpointTxs?: Record<string, { txid: string; tx: string }>;\n };\n arkTx?: {\n txid: string;\n tx: string;\n spentVtxos: VtxoData[];\n spendableVtxos: VtxoData[];\n checkpointTxs?: Record<string, { txid: string; tx: string }>;\n };\n }\n}\n\nexport function isFetchTimeoutError(err: any): boolean {\n const checkError = (error: any) => {\n if (!(error instanceof Error)) return false;\n\n // TODO: get something more robust than this\n const isCloudflare524 = error.name === \"TypeError\" && error.message === \"Failed to fetch\";\n\n return (\n isCloudflare524 ||\n error.name === \"HeadersTimeoutError\" ||\n error.name === \"BodyTimeoutError\" ||\n (error as any).code === \"UND_ERR_HEADERS_TIMEOUT\" ||\n (error as any).code === \"UND_ERR_BODY_TIMEOUT\"\n );\n };\n\n return checkError(err) || checkError((err as any).cause);\n}\n\nfunction mapVtxo(vtxo: ProtoTypes.VtxoData): Vtxo {\n return {\n outpoint: {\n txid: vtxo.outpoint.txid,\n vout: vtxo.outpoint.vout,\n },\n amount: vtxo.amount,\n script: vtxo.script,\n createdAt: vtxo.createdAt,\n expiresAt: vtxo.expiresAt,\n commitmentTxids: vtxo.commitmentTxids,\n isPreconfirmed: vtxo.isPreconfirmed,\n isSwept: vtxo.isSwept,\n isUnrolled: vtxo.isUnrolled,\n isSpent: vtxo.isSpent,\n spentBy: vtxo.spentBy,\n settledBy: vtxo.settledBy,\n arkTxid: vtxo.arkTxid,\n };\n}\n\nfunction handleError(errorText: string, defaultMessage: string): never {\n const error = new Error(errorText);\n const arkError = maybeArkError(error);\n throw arkError ?? new Error(defaultMessage);\n}\n","import { FetchError } from \"../utils/fetch\";\nimport { isFetchTimeoutError } from \"./ark\";\nimport { ProviderUnavailableError } from \"./errors\";\n\n/**\n * Whether a provider error is a *retryable* availability failure (operator or\n * indexer temporarily unreachable) rather than a terminal one.\n *\n * Retryable:\n * - {@link ProviderUnavailableError} — already-classified 5xx/429/unavailable\n * (see e.g. {@link https | RestArkProvider.getInfo}'s non-2xx branch);\n * - {@link FetchError} — transport-level `fetch` rejection (DNS failure,\n * connection refused, TLS/CORS), which also carries undici timeouts as its\n * `cause`;\n * - {@link isFetchTimeoutError} — header/body timeouts that surface directly.\n *\n * Everything else (4xx, invalid JSON, schema violations, network mismatch,\n * unsupported network) is terminal and returns `false`.\n *\n * NOTE (Step 2, Scope 2): this classifies the errors currently produced by the\n * boot-critical `getInfo` path. Normalizing the indexer's per-branch\n * `!res.ok` throws and the remaining Ark RPC methods into\n * {@link ProviderUnavailableError} is the broader Scope-2 work still pending.\n */\nexport function isRetryableProviderError(error: unknown): boolean {\n return (\n error instanceof ProviderUnavailableError ||\n error instanceof FetchError ||\n isFetchTimeoutError(error)\n );\n}\n","/**\n * Default indexer pagination size for batched VTXO queries (`getVtxos`).\n *\n * Shared by {@link ContractManager}'s bulk history sync, the discovery\n * handlers' batched `detectUsedScripts` probe, and `wallet/vtxo.ts`'s chunked\n * reader so they can't drift. It lives in its own leaf module (importing\n * nothing) so every layer can use it without a `handlers → contractManager`\n * import cycle — contractManager imports the handler registry, so the handlers\n * must not import back from contractManager.\n *\n * Large enough that a single wallet index's candidate scripts resolve in one\n * page in the common case.\n */\nexport const DEFAULT_PAGE_SIZE = 500;\n\n/**\n * Maximum scripts per `getVtxos` query string.\n *\n * Scripts cost ~77 bytes each in the URL, so an unbounded wallet-derived list\n * `414`s: a few hundred contracts is ~28 KB. 32 keeps a request at ~2.6 KB —\n * well inside any plausible limit, since `arkd`'s real ceiling is unpublished\n * and 16 is the largest batch observed working in the wild.\n *\n * Shared by `wallet/vtxo.ts`'s `getAllNormalizedVtxos` and the discovery\n * handlers' batched `detectUsedScripts` probe (which also gets a 10-index scan\n * window collapsed into 1-2 requests as a side effect) so the two can't drift\n * onto different budgets for the same URL constraint.\n */\nexport const SCRIPT_QUERY_CHUNK_SIZE = 32;\n\n/**\n * Maximum outpoints per `getVtxos` query string. ~79 encoded bytes each, so 64\n * is ~5 KB — real margin under the common 8 KB request-line ceiling, against\n * the same unpublished `arkd` limit that budgets scripts at 32.\n */\nexport const OUTPOINT_QUERY_CHUNK_SIZE = 64;\n","import {\n DEFAULT_PAGE_SIZE,\n OUTPOINT_QUERY_CHUNK_SIZE,\n SCRIPT_QUERY_CHUNK_SIZE,\n} from \"../contracts/constants\";\nimport { isRetryableProviderError } from \"../providers/availability\";\nimport type { GetVtxosOptions, IndexerProvider, PageResponse, Vtxo } from \"../providers/indexer\";\nimport type { OnchainProvider } from \"../providers/onchain\";\nimport type { ExtendedVirtualCoin, VirtualCoin, VirtualStatus } from \"./index\";\n\n/**\n * Canonical VTXO facts, the conversions between them and the legacy `virtualStatus` projection,\n * and the capability predicates behavior is expected to read.\n *\n * Three directions are owned here:\n *\n * 1. wire `Vtxo` -> canonical ({@link convertVtxo})\n * 2. canonical -> legacy `virtualStatus` ({@link toVirtualStatus})\n * 3. legacy `virtualStatus` -> canonical ({@link normalizeVtxo})\n *\n * Direction 3 is not just for old persisted rows: `IndexerProvider` and `WalletRepository` are\n * public interfaces, so consumer implementations may hand back legacy-shaped coins through the\n * front door. Normalization therefore runs where the SDK *consumes* an interface, never inside an\n * implementation of one.\n */\n\n/**\n * Below this, a millisecond value is too small to be a real batch expiry and is read as a block\n * height instead. The server returns one scalar for both units.\n *\n * A UTC constant rather than `getFullYear()`, which reads local time and would make the\n * classification depend on the runtime's timezone.\n */\nexport const EXPIRY_MIN_PLAUSIBLE_MS = Date.UTC(2025, 0, 1);\n\n/**\n * The current moment, as the expiry predicates need it.\n *\n * `height` is optional: offline-first paths have no chain tip at hand. When it is absent,\n * height-based expiry cannot be evaluated and reads as not expired.\n */\nexport type TimeHeight = { timestamp: Date; height?: number };\n\n/**\n * Resolve the {@link TimeHeight} for one expiry-driven pass.\n *\n * @remarks\n * Fetch the tip once per pass and reuse the result for every VTXO in it, so the pass judges them\n * all against the same height.\n *\n * A tip-fetch failure **degrades to timestamp-only rather than blocking**: height-encoded expiry\n * then reads as not expired, which is what the whole SDK did before heights were evaluated at all.\n * Recovery and deprecated-signer migration must not become unavailable because the onchain provider\n * is down.\n *\n * Pass no provider to opt out of height entirely — the offline-first paths (balance, coin\n * selection) do this deliberately.\n */\nexport async function resolveTimeHeight(\n provider?: Pick<OnchainProvider, \"getChainTip\">,\n): Promise<TimeHeight> {\n const timestamp = new Date();\n if (!provider) return { timestamp };\n try {\n const tip = await provider.getChainTip();\n return { timestamp, height: tip.height };\n } catch (e) {\n console.warn(\"Failed to fetch chain tip; height-based expiry will not be evaluated\", e);\n return { timestamp };\n }\n}\n\n/**\n * A {@link VirtualCoin} that has passed through {@link normalizeVtxo}: every fact the capability\n * predicates read is present.\n *\n * Internal signatures take this rather than `VirtualCoin` so the compiler rejects un-normalized\n * input — on the public shape these facts are optional, and `undefined` is falsy, so a legacy coin\n * would silently read as \"not swept\", \"not spent\", and drop out of the wrong bucket.\n *\n * It is deliberately a *subtype* of `VirtualCoin`, so normalized coins are returned to consumers\n * directly and no egress projection exists.\n */\nexport type NormalizedVirtualCoin = Omit<\n VirtualCoin,\n \"isSwept\" | \"isPreconfirmed\" | \"isSpent\" | \"spentBy\" | \"commitmentTxIds\"\n> & {\n isSwept: boolean;\n isPreconfirmed: boolean;\n isSpent: boolean;\n spentBy: string;\n commitmentTxIds: string[];\n};\n\nexport type NormalizedExtendedVirtualCoin = ExtendedVirtualCoin & NormalizedVirtualCoin;\n\n// --- expiry ------------------------------------------------------------------------------------\n\n/** The wire's single `expiresAt` scalar -> canonical, disambiguating seconds from height. */\nexport function parseWireExpiry(raw: string | null | undefined): {\n expiresAt?: Date;\n expiresAtHeight?: number;\n} {\n if (raw === null || raw === undefined || raw === \"\") return {};\n const n = Number(raw);\n // `n <= 0` would otherwise yield `expiresAtHeight: 0`, which every chain tip is past — a VTXO\n // with no expiry would read as permanently expired.\n if (!Number.isFinite(n) || n <= 0) return {};\n const ms = n * 1000;\n if (ms >= EXPIRY_MIN_PLAUSIBLE_MS) return { expiresAt: new Date(ms) };\n return { expiresAtHeight: n };\n}\n\n/** Canonical -> legacy `batchExpiry`. */\nexport function toBatchExpiry(c: {\n expiresAt?: Date;\n expiresAtHeight?: number;\n}): number | undefined {\n if (c.expiresAt !== undefined) return c.expiresAt.getTime();\n // Multiplying a block height by 1000 is dimensionally meaningless, but it is what the legacy\n // converter did and what consumers already receive. Preserved deliberately.\n if (c.expiresAtHeight !== undefined) return c.expiresAtHeight * 1000;\n return undefined;\n}\n\n/** Legacy `batchExpiry` -> canonical, inverting {@link toBatchExpiry} on its domain. */\nexport function parseLegacyExpiry(batchExpiry: number | undefined): {\n expiresAt?: Date;\n expiresAtHeight?: number;\n} {\n // Same `<= 0` guard as `parseWireExpiry`.\n if (batchExpiry === undefined || batchExpiry <= 0) return {};\n if (batchExpiry >= EXPIRY_MIN_PLAUSIBLE_MS) return { expiresAt: new Date(batchExpiry) };\n return { expiresAtHeight: batchExpiry / 1000 };\n}\n\n// --- normalization -----------------------------------------------------------------------------\n\n/** Synthesize the legacy projection from canonical facts. */\nexport function toVirtualStatus(c: {\n isSpent?: boolean;\n isSwept?: boolean;\n isPreconfirmed?: boolean;\n commitmentTxIds?: string[];\n expiresAt?: Date;\n expiresAtHeight?: number;\n}): VirtualStatus {\n return {\n // Precedence is load-bearing: consumers bucket on this label, so any other order silently\n // moves VTXOs between buckets.\n state: c.isSpent\n ? \"spent\"\n : c.isSwept\n ? \"swept\"\n : c.isPreconfirmed\n ? \"preconfirmed\"\n : \"settled\",\n commitmentTxIds: c.commitmentTxIds,\n batchExpiry: toBatchExpiry(c),\n };\n}\n\n/**\n * Fill in every canonical fact, deriving from `virtualStatus` when a coin carries only the legacy\n * shape. Idempotent.\n *\n * Facts are derived with `??` so a coin that already carries its own authoritative value keeps it\n * rather than having it re-derived from the lossy projection.\n */\nexport function normalizeVtxo<T extends VirtualCoin>(v: T): T & NormalizedVirtualCoin {\n const state = v.virtualStatus?.state;\n const canonicalExpiry = v.expiresAt !== undefined || v.expiresAtHeight !== undefined;\n const expiry = canonicalExpiry\n ? // Coerce: a backend that persists through JSON hands back an ISO string, which typechecks\n // as `Date` but returns NaN from `.getTime()` — comparing false against everything.\n {\n expiresAt: v.expiresAt === undefined ? undefined : new Date(v.expiresAt),\n expiresAtHeight: v.expiresAtHeight,\n }\n : parseLegacyExpiry(v.virtualStatus?.batchExpiry);\n\n // `state === \"spent\"` cannot tell us whether the coin was *also* swept or preconfirmed — the\n // collapse destroyed that. Reading them as false matches today's behavior: a spent coin already\n // fails every spendability check.\n const isSpent = v.isSpent ?? state === \"spent\";\n const isSwept = v.isSwept ?? state === \"swept\";\n const isPreconfirmed = v.isPreconfirmed ?? state === \"preconfirmed\";\n const commitmentTxIds = v.commitmentTxIds ?? v.virtualStatus?.commitmentTxIds ?? [];\n\n return {\n ...v,\n isSpent,\n isSwept,\n isPreconfirmed,\n spentBy: v.spentBy ?? \"\",\n commitmentTxIds,\n ...expiry,\n virtualStatus:\n v.virtualStatus ??\n toVirtualStatus({ isSpent, isSwept, isPreconfirmed, commitmentTxIds, ...expiry }),\n };\n}\n\n/** Wire `Vtxo` -> canonical `VirtualCoin`. Shared by every indexer provider. */\nexport function convertVtxo(vtxo: Vtxo): NormalizedVirtualCoin {\n const expiry = parseWireExpiry(vtxo.expiresAt);\n const facts = {\n isSpent: vtxo.isSpent,\n isSwept: vtxo.isSwept,\n isPreconfirmed: vtxo.isPreconfirmed,\n commitmentTxIds: vtxo.commitmentTxids,\n ...expiry,\n };\n return {\n txid: vtxo.outpoint.txid,\n vout: vtxo.outpoint.vout,\n value: Number(vtxo.amount),\n status: {\n confirmed: !vtxo.isSwept && !vtxo.isPreconfirmed,\n isLeaf: !vtxo.isPreconfirmed,\n },\n ...facts,\n virtualStatus: toVirtualStatus(facts),\n spentBy: vtxo.spentBy ?? \"\",\n settledBy: vtxo.settledBy,\n arkTxId: vtxo.arkTxid,\n createdAt: new Date(Number(vtxo.createdAt) * 1000),\n isUnrolled: vtxo.isUnrolled,\n script: vtxo.script,\n assets: vtxo.assets?.map((a) => ({\n assetId: a.assetId,\n amount: BigInt(a.amount),\n })),\n };\n}\n\n// --- provider boundary -------------------------------------------------------------------------\n\n/**\n * The only sanctioned way for SDK logic to read VTXOs from an `IndexerProvider`: a drop-in for\n * `provider.getVtxos()` that normalizes whatever came back. A cheap pass-through for the built-in\n * providers, which already populate the facts.\n */\nexport async function getNormalizedVtxos(\n provider: Pick<IndexerProvider, \"getVtxos\">,\n opts?: GetVtxosOptions,\n): Promise<{ vtxos: NormalizedVirtualCoin[]; page?: PageResponse }> {\n const { vtxos, page } = await provider.getVtxos(opts);\n return { vtxos: vtxos.map(normalizeVtxo), page };\n}\n\n/** Everything a script query can filter on, minus the cursor this reader owns. */\nexport type VtxoScriptQuery = Omit<GetVtxosOptions, \"scripts\" | \"outpoints\" | \"pageIndex\">;\n\n/**\n * Read every virtual output for an arbitrary number of scripts.\n *\n * @remarks\n * Scripts travel in the query string, so a wallet-derived list must be chunked\n * at {@link SCRIPT_QUERY_CHUNK_SIZE} or the request `414`s. Chunks run\n * sequentially — that pacing is the point, since this path can now run wide —\n * and each is paged to exhaustion, so callers cannot silently receive page one.\n */\nexport async function getAllNormalizedVtxos(\n provider: Pick<IndexerProvider, \"getVtxos\">,\n scripts: string[],\n opts: VtxoScriptQuery = {},\n): Promise<NormalizedVirtualCoin[]> {\n const { pageSize = DEFAULT_PAGE_SIZE, ...filters } = opts;\n const all: NormalizedVirtualCoin[] = [];\n\n for (let i = 0; i < scripts.length; i += SCRIPT_QUERY_CHUNK_SIZE) {\n const chunk = scripts.slice(i, i + SCRIPT_QUERY_CHUNK_SIZE);\n let pageIndex = 0;\n let hasMore = true;\n\n while (hasMore) {\n const { vtxos, page } = await getNormalizedVtxos(provider, {\n ...filters,\n scripts: chunk,\n pageIndex,\n pageSize,\n });\n all.push(...vtxos);\n\n // A short page means the last one: providers that omit `page`\n // entirely are treated as unpaged.\n hasMore = page ? vtxos.length === pageSize : false;\n pageIndex++;\n if (hasMore) await new Promise((r) => setTimeout(r, 500));\n }\n }\n\n return all;\n}\n\n/**\n * Resolve `createdAt` (epoch ms) for txids by querying each txid's output 0 as a virtual\n * outpoint, chunked at {@link OUTPOINT_QUERY_CHUNK_SIZE}. `pageSize` is explicit because the\n * provider omits `page.size` when unset and a server default below the chunk size would\n * silently short-page. Best-effort: a retryable failure drops its chunk and leaves the map\n * partial; terminal errors propagate.\n */\nexport async function fetchVtxoCreatedAtByTxid(\n provider: Pick<IndexerProvider, \"getVtxos\">,\n txids: string[],\n): Promise<Map<string, number>> {\n const unique = [...new Set(txids)].filter((txid) => txid !== \"\");\n const createdAt = new Map<string, number>();\n\n for (let i = 0; i < unique.length; i += OUTPOINT_QUERY_CHUNK_SIZE) {\n const chunk = unique.slice(i, i + OUTPOINT_QUERY_CHUNK_SIZE);\n try {\n const { vtxos } = await getNormalizedVtxos(provider, {\n outpoints: chunk.map((txid) => ({ txid, vout: 0 })),\n pageSize: DEFAULT_PAGE_SIZE,\n });\n for (const v of vtxos) {\n createdAt.set(v.txid, v.createdAt.getTime());\n }\n } catch (err) {\n if (!isRetryableProviderError(err)) throw err;\n }\n }\n\n return createdAt;\n}\n\n// --- capabilities ------------------------------------------------------------------------------\n\n/**\n * Whether a virtual output has been consumed and can never be spent again.\n *\n * @remarks\n * Unions all three spend facts rather than trusting any one of them. The wire contract permits\n * `isSpent: true` with an empty `spentBy` (settlement inputs needing no forfeit are written that\n * way), so a `spentBy || settledBy` definition would classify a spent VTXO as spendable — inflating\n * balance and selecting it for a send that must fail.\n */\nexport function hasTerminalSpend(vtxo: VirtualCoin): boolean {\n const n = normalizeVtxo(vtxo);\n return !!n.isSpent || !!n.spentBy || !!n.settledBy;\n}\n\n/**\n * Whether a virtual output's batch expiry has passed. Pure expiry — swept is a separate fact, ORed\n * in explicitly by {@link canSpendOffchain} / {@link canRecoverOnchain}.\n *\n * @remarks\n * Not named `isExpired`: the deprecated {@link isExpired} also returns `true` for a swept VTXO, and\n * two same-named predicates with different truth conditions is how a call site gets silently\n * rewired.\n *\n * Height-based expiry is only evaluated when `now.height` is supplied.\n */\nexport function isPastExpiry(vtxo: VirtualCoin, now: TimeHeight): boolean {\n const n = normalizeVtxo(vtxo);\n if (n.expiresAt !== undefined && now.timestamp.getTime() >= n.expiresAt.getTime()) return true;\n return (\n n.expiresAtHeight !== undefined &&\n now.height !== undefined &&\n now.height >= n.expiresAtHeight\n );\n}\n\n/** Whether a virtual output can be spent in an offchain transaction. The send/coin-selection test. */\nexport function canSpendOffchain(vtxo: VirtualCoin, now: TimeHeight): boolean {\n const n = normalizeVtxo(vtxo);\n return !hasTerminalSpend(n) && !(n.isSwept || isPastExpiry(n, now));\n}\n\n/**\n * Whether a virtual output must be recovered into a fresh batch rather than spent offchain. The\n * recovery/renewal test and the `recoverable` balance bucket.\n */\nexport function canRecoverOnchain(vtxo: VirtualCoin, now: TimeHeight): boolean {\n const n = normalizeVtxo(vtxo);\n return !hasTerminalSpend(n) && (n.isSwept || isPastExpiry(n, now));\n}\n\n// --- fee estimation ----------------------------------------------------------------------------\n\n/**\n * The `OffchainInput` fields that come from the VTXO itself, shared by every offchain fee estimate.\n *\n * @remarks\n * `expiry` goes through {@link toBatchExpiry} so the estimator keeps seeing exactly what the legacy\n * `batchExpiry` path fed it. Correcting the height case here would move fees, which is out of\n * scope.\n */\nexport function toOffchainInputFeeParams(vtxo: NormalizedVirtualCoin): {\n amount: bigint;\n type: \"recoverable\" | \"vtxo\";\n weight: number;\n birth: Date;\n expiry: Date | undefined;\n} {\n const batchExpiry = toBatchExpiry(vtxo);\n return {\n amount: BigInt(vtxo.value),\n type: vtxo.isSwept ? \"recoverable\" : \"vtxo\",\n weight: 0,\n birth: vtxo.createdAt,\n expiry: batchExpiry ? new Date(batchExpiry) : undefined,\n };\n}\n\n// --- discrimination ----------------------------------------------------------------------------\n\n/**\n * Narrow a settle input to a virtual output.\n *\n * @remarks\n * Keyed on `script`: it is required on `VirtualCoin` (so legacy and canonical shapes both have it)\n * and absent from `ExtendedCoin`, which the optional canonical facts cannot claim.\n *\n * The `typeof` guard is load-bearing — `settle` accepts arknote strings, and `in` throws a\n * `TypeError` on a primitive rather than returning false.\n */\nexport function isVirtualCoin<T>(input: T): input is T & VirtualCoin {\n return (\n typeof input === \"object\" &&\n input !== null &&\n typeof (input as { script?: unknown }).script === \"string\"\n );\n}\n\n// --- deprecated compatibility wrappers ---------------------------------------------------------\n\n/**\n * Return whether a virtual output is still spendable.\n *\n * @param vtxo - virtual output to inspect\n * @returns `true` when the virtual output has not been consumed\n *\n * @deprecated Ambiguous: `true` for swept or expired virtual outputs, which cannot in fact be spent\n * offchain. Use {@link canSpendOffchain}.\n */\nexport function isSpendable(vtxo: VirtualCoin): boolean {\n return !hasTerminalSpend(vtxo);\n}\n\n/**\n * Return whether a virtual output is recoverable.\n *\n * @param vtxo - virtual output to inspect\n * @returns `true` when the virtual output is swept but not yet consumed\n *\n * @deprecated Swept-only: ignores virtual outputs that are past expiry but not yet swept, which are\n * equally recoverable. Use {@link canRecoverOnchain}.\n */\nexport function isRecoverable(vtxo: VirtualCoin): boolean {\n const n = normalizeVtxo(vtxo);\n return n.isSwept && !hasTerminalSpend(n);\n}\n\n/**\n * Return whether a virtual output should be treated as expired.\n *\n * @param vtxo - virtual output to inspect\n * @returns `true` when the virtual output is swept or its wall-clock batch expiry has passed\n *\n * @deprecated Conflates swept with expired, and cannot evaluate height-based expiry — being\n * synchronous, it has no source for the current chain tip, so it ignores `expiresAtHeight` exactly\n * as it always has. For the recovery decision use {@link canRecoverOnchain}; to reproduce this\n * truth condition use `v.isSwept || isPastExpiry(v, now)`.\n */\nexport function isExpired(vtxo: VirtualCoin): boolean {\n const n = normalizeVtxo(vtxo);\n return n.isSwept || (n.expiresAt !== undefined && n.expiresAt.getTime() <= Date.now());\n}\n"]}
|