@arkade-os/sdk 0.4.73 → 0.4.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/adapters/expo.cjs +5 -5
  2. package/dist/adapters/expo.d.cts +2 -2
  3. package/dist/adapters/expo.d.ts +2 -2
  4. package/dist/adapters/expo.js +3 -3
  5. package/dist/adapters/indexedDB.cjs +5 -5
  6. package/dist/adapters/indexedDB.js +4 -4
  7. package/dist/{asyncStorageTaskQueue-DA2OdpJ0.d.cts → asyncStorageTaskQueue-D1AwLuqn.d.cts} +1 -1
  8. package/dist/{asyncStorageTaskQueue-C5IwA_Hs.d.ts → asyncStorageTaskQueue-aCaOBGTS.d.ts} +1 -1
  9. package/dist/{chunk-D5DLGVN4.cjs → chunk-AS3W34MG.cjs} +17 -17
  10. package/dist/{chunk-D5DLGVN4.cjs.map → chunk-AS3W34MG.cjs.map} +1 -1
  11. package/dist/{chunk-2D7F5IU3.cjs → chunk-DXLVCFVK.cjs} +49 -49
  12. package/dist/{chunk-2D7F5IU3.cjs.map → chunk-DXLVCFVK.cjs.map} +1 -1
  13. package/dist/{chunk-QX2M67YI.js → chunk-J3XVGWMP.js} +21 -22
  14. package/dist/chunk-J3XVGWMP.js.map +1 -0
  15. package/dist/{chunk-ZLDO4QDR.cjs → chunk-J4ZR4VEM.cjs} +31 -32
  16. package/dist/chunk-J4ZR4VEM.cjs.map +1 -0
  17. package/dist/{chunk-KJ5E646Y.cjs → chunk-KMPNH7NS.cjs} +8 -4
  18. package/dist/chunk-KMPNH7NS.cjs.map +1 -0
  19. package/dist/{chunk-5YCAC6XE.js → chunk-KPLQN4M4.js} +4 -4
  20. package/dist/{chunk-5YCAC6XE.js.map → chunk-KPLQN4M4.js.map} +1 -1
  21. package/dist/{chunk-G5RPUZJE.js → chunk-LGB65ZCO.js} +3 -3
  22. package/dist/{chunk-G5RPUZJE.js.map → chunk-LGB65ZCO.js.map} +1 -1
  23. package/dist/{chunk-L7IEXVXI.cjs → chunk-QS6AZE4F.cjs} +10 -10
  24. package/dist/{chunk-L7IEXVXI.cjs.map → chunk-QS6AZE4F.cjs.map} +1 -1
  25. package/dist/{chunk-C4RKZY7D.cjs → chunk-WIHSU3YS.cjs} +560 -476
  26. package/dist/chunk-WIHSU3YS.cjs.map +1 -0
  27. package/dist/{chunk-OV4GLPZI.js → chunk-WJVOFYTQ.js} +8 -4
  28. package/dist/chunk-WJVOFYTQ.js.map +1 -0
  29. package/dist/{chunk-M6HIWM5N.js → chunk-X5BPARRD.js} +3 -3
  30. package/dist/{chunk-M6HIWM5N.js.map → chunk-X5BPARRD.js.map} +1 -1
  31. package/dist/{chunk-YHJJSLE5.js → chunk-ZTGTQP2W.js} +115 -33
  32. package/dist/chunk-ZTGTQP2W.js.map +1 -0
  33. package/dist/contracts/handlers/index.cjs +9 -9
  34. package/dist/contracts/handlers/index.d.cts +3 -3
  35. package/dist/contracts/handlers/index.d.ts +3 -3
  36. package/dist/contracts/handlers/index.js +2 -2
  37. package/dist/{delegate-BJp8f6LT.d.cts → delegate-6N0DKdnG.d.cts} +1 -1
  38. package/dist/{delegate-Ckz_TWzM.d.ts → delegate-z6veQfLI.d.ts} +1 -1
  39. package/dist/{hdWalletCapable-DABgAD-T.d.ts → hdWalletCapable-Bncp-eF0.d.ts} +2 -2
  40. package/dist/{hdWalletCapable-DA9bJ5eB.d.cts → hdWalletCapable-DJT8E8sN.d.cts} +2 -2
  41. package/dist/{index-DSbDm0Io.d.cts → index-BVqlZJwW.d.cts} +2 -2
  42. package/dist/{index-Dg0-TvBQ.d.cts → index-Bxz3cKPA.d.cts} +13 -7
  43. package/dist/{index-Dg0-TvBQ.d.ts → index-Bxz3cKPA.d.ts} +13 -7
  44. package/dist/{index-B8xrELXY.d.ts → index-CKQQ1oOg.d.ts} +2 -2
  45. package/dist/index.cjs +308 -300
  46. package/dist/index.d.cts +47 -24
  47. package/dist/index.d.ts +47 -24
  48. package/dist/index.js +4 -4
  49. package/dist/repositories/realm/index.cjs +19 -19
  50. package/dist/repositories/realm/index.d.cts +2 -2
  51. package/dist/repositories/realm/index.d.ts +2 -2
  52. package/dist/repositories/realm/index.js +5 -5
  53. package/dist/repositories/sqlite/index.cjs +18 -18
  54. package/dist/repositories/sqlite/index.d.cts +2 -2
  55. package/dist/repositories/sqlite/index.d.ts +2 -2
  56. package/dist/repositories/sqlite/index.js +5 -5
  57. package/dist/{taskRunner-C_uAJDsn.d.cts → taskRunner-C26IIg1F.d.cts} +1 -1
  58. package/dist/{taskRunner-DARTFnZN.d.ts → taskRunner-KxtIKYLv.d.ts} +1 -1
  59. package/dist/wallet/expo/background.cjs +14 -14
  60. package/dist/wallet/expo/background.d.cts +3 -3
  61. package/dist/wallet/expo/background.d.ts +3 -3
  62. package/dist/wallet/expo/background.js +6 -6
  63. package/dist/wallet/expo/index.cjs +14 -14
  64. package/dist/wallet/expo/index.d.cts +4 -4
  65. package/dist/wallet/expo/index.d.ts +4 -4
  66. package/dist/wallet/expo/index.js +5 -5
  67. package/dist/worker/expo/index.cjs +9 -9
  68. package/dist/worker/expo/index.d.cts +4 -4
  69. package/dist/worker/expo/index.d.ts +4 -4
  70. package/dist/worker/expo/index.js +5 -5
  71. package/package.json +1 -1
  72. package/dist/chunk-C4RKZY7D.cjs.map +0 -1
  73. package/dist/chunk-KJ5E646Y.cjs.map +0 -1
  74. package/dist/chunk-OV4GLPZI.js.map +0 -1
  75. package/dist/chunk-QX2M67YI.js.map +0 -1
  76. package/dist/chunk-YHJJSLE5.js.map +0 -1
  77. package/dist/chunk-ZLDO4QDR.cjs.map +0 -1
@@ -1,6 +1,6 @@
1
- import { AssetId, AssetGroup, AssetInput, AssetOutput, Metadata, Packet, BufferReader, BufferWriter, AssetRef, RestIndexerProvider } from './chunk-M6HIWM5N.js';
2
- import { witnessRefToBytes, validateProgram, toASM, stringifyArtifact, serializeArkadeContractParams, resolveAsm, parseArtifact, getOpcodeValue, getOpcodeName, fromASM, deserializeArkadeContractParams, computeArkadeScriptPublicKey, bytesToASM, asmToBytes, arkadeWitnessHash, arkadeScriptHash, SUPPORTED_PROGRAM_VERSION, OPCODE_VALUES, OPCODE_NAMES, bignum_exports, ArkadeScript, ArkadeProgramScript, ARKADE_OPS, ARKADE_OPCODE_VALUES, ARKADE_OPCODE_NAMES, ARKADE_OPCODES, ARKADE_OP, toXOnly, inputName, contractHandlers, isMainnetDescriptor, descriptorIsOurs, deriveDescriptorLeafPubKey, deriveDescriptorLeafCompressedPubKey, parseHDDescriptor, identityDescriptor, DefaultVtxo, speculativeReceiveMetadata, DelegateVtxo, WALLET_RECEIVE_SOURCE, BoardingContractHandler } from './chunk-G5RPUZJE.js';
3
- import { VtxoScript, Transaction, isRecoverable, CSVMultisigTapscript, DEFAULT_NETWORK, resolveEmulatorPubkey, hasTerminalSpend, getNormalizedVtxos, setArkPsbtField, PrevArkTxField, ConditionWitness, craftToSpendTx, ArkAddress, isVirtualCoin, getArkPsbtFields, CosignerPublicKey, ServerResponseMismatchError, OP_RETURN_EMPTY_PKSCRIPT, canSweepOnchain, sequenceToTimelock, decodeTapscript, scriptFromTapLeafScript, CLTVMultisigTapscript, VtxoTaprootTree, timelockToSequence, assertAllowedSighashTypes, baseFetch, Intent, rateGate, DEFAULT_NETWORK_NAME, formatSighash, normalizeVtxo, getSequence, toBatchExpiry, maybeArkError, isArkError, ArkErrorName, toOffchainInputFeeParams, canRecoverOnchain, getNetwork, MultisigTapscript, isEventSourceError, isEventSourceUnavailableError, getAllNormalizedVtxos, isPastExpiry, isRetryableProviderError, DEFAULT_PAGE_SIZE, RestArkProvider, toVirtualStatus, ArkError, TapTreeCoder, resolveTimeHeight, canSpendOffchain, parseLegacyExpiry, isExpired, PrevoutTxField, fetchVtxoCreatedAtByTxid, DEFAULT_ARKADE_SERVER_URL, ProviderUnavailableError, networks as networks$1 } from './chunk-OV4GLPZI.js';
1
+ import { AssetId, AssetGroup, AssetInput, AssetOutput, Metadata, Packet, BufferReader, BufferWriter, AssetRef, RestIndexerProvider } from './chunk-X5BPARRD.js';
2
+ import { witnessRefToBytes, validateProgram, toASM, stringifyArtifact, serializeArkadeContractParams, resolveAsm, parseArtifact, getOpcodeValue, getOpcodeName, fromASM, deserializeArkadeContractParams, computeArkadeScriptPublicKey, bytesToASM, asmToBytes, arkadeWitnessHash, arkadeScriptHash, SUPPORTED_PROGRAM_VERSION, OPCODE_VALUES, OPCODE_NAMES, bignum_exports, ArkadeScript, ArkadeProgramScript, ARKADE_OPS, ARKADE_OPCODE_VALUES, ARKADE_OPCODE_NAMES, ARKADE_OPCODES, ARKADE_OP, toXOnly, inputName, contractHandlers, isMainnetDescriptor, descriptorIsOurs, deriveDescriptorLeafPubKey, deriveDescriptorLeafCompressedPubKey, parseHDDescriptor, identityDescriptor, DefaultVtxo, speculativeReceiveMetadata, DelegateVtxo, WALLET_RECEIVE_SOURCE, BoardingContractHandler } from './chunk-LGB65ZCO.js';
3
+ import { VtxoScript, Transaction, isRecoverable, CSVMultisigTapscript, DEFAULT_NETWORK, resolveEmulatorPubkey, hasTerminalSpend, getNormalizedVtxos, setArkPsbtField, PrevArkTxField, ConditionWitness, craftToSpendTx, ArkAddress, isVirtualCoin, getArkPsbtFields, CosignerPublicKey, ServerResponseMismatchError, OP_RETURN_EMPTY_PKSCRIPT, canSweepOnchain, sequenceToTimelock, decodeTapscript, scriptFromTapLeafScript, CLTVMultisigTapscript, VtxoTaprootTree, timelockToSequence, assertAllowedSighashTypes, baseFetch, Intent, rateGate, DEFAULT_NETWORK_NAME, formatSighash, normalizeVtxo, getSequence, toBatchExpiry, maybeArkError, isArkError, ArkErrorName, toOffchainInputFeeParams, canRecoverOnchain, getNetwork, MultisigTapscript, isEventSourceError, isEventSourceUnavailableError, getAllNormalizedVtxos, isPastExpiry, isRetryableProviderError, DEFAULT_PAGE_SIZE, RestArkProvider, toVirtualStatus, ArkError, TapTreeCoder, resolveTimeHeight, canSpendOffchain, parseLegacyExpiry, isExpired, PrevoutTxField, fetchVtxoCreatedAtByTxid, DEFAULT_ARKADE_SERVER_URL, ProviderUnavailableError, networks as networks$1 } from './chunk-WJVOFYTQ.js';
4
4
  import { __export } from './chunk-NSBPE2FW.js';
5
5
  import { sha256 as sha256$1, equalBytes, hash160, sha256x2, concatBytes, randomPrivateKeyBytes, pubECDSA, pubSchnorr } from '@scure/btc-signer/utils.js';
6
6
  import { SigHash, Script, OP, OutScript, Address, RawWitness, p2tr, p2wpkh, TaprootControlBlock, DEFAULT_SEQUENCE, Transaction as Transaction$2 } from '@scure/btc-signer';
@@ -9010,23 +9010,32 @@ var ContractWatcher = class {
9010
9010
  }
9011
9011
  /** @see IContractManager.watchScript for the delivery and filter contract. */
9012
9012
  async addWatchedScript(script, options) {
9013
- const existing = this.watchedScripts.get(script);
9014
- if (existing) {
9015
- if (options?.label !== void 0) existing.label = options.label;
9016
- return;
9013
+ const added = [];
9014
+ for (const one of Array.isArray(script) ? script : [script]) {
9015
+ const existing = this.watchedScripts.get(one);
9016
+ if (existing) {
9017
+ if (options?.label !== void 0) existing.label = options.label;
9018
+ continue;
9019
+ }
9020
+ this.watchedScripts.set(one, {
9021
+ label: options?.label,
9022
+ lastKnownVtxos: /* @__PURE__ */ new Map()
9023
+ });
9024
+ added.push(one);
9017
9025
  }
9018
- this.watchedScripts.set(script, {
9019
- label: options?.label,
9020
- lastKnownVtxos: /* @__PURE__ */ new Map()
9021
- });
9022
- if (this.isWatching) {
9023
- await this.pollWatchedScripts([script]);
9026
+ if (added.length === 0 || !this.isWatching) return;
9027
+ await this.withCoalescedSubscription(async () => {
9028
+ await this.pollWatchedScripts(added);
9024
9029
  await this.tryUpdateSubscription();
9025
- }
9030
+ });
9026
9031
  }
9027
9032
  /** Stop watching a script added by {@link addWatchedScript}. */
9028
9033
  async removeWatchedScript(script) {
9029
- if (!this.watchedScripts.delete(script)) return;
9034
+ let removed = false;
9035
+ for (const one of Array.isArray(script) ? script : [script]) {
9036
+ if (this.watchedScripts.delete(one)) removed = true;
9037
+ }
9038
+ if (!removed) return;
9030
9039
  if (this.isWatching) {
9031
9040
  await this.tryUpdateSubscription();
9032
9041
  }
@@ -17606,6 +17615,23 @@ function offboardDestinationScript(destinationAddress) {
17606
17615
  }
17607
17616
  throw new Error(`Failed to decode destination address: ${destinationAddress}`);
17608
17617
  }
17618
+ var CHANGE_FEE_MAX_ROUNDS = 8;
17619
+ function settleChangeAgainstFee(change, feeOn) {
17620
+ let net = change;
17621
+ for (let i = 0; i < CHANGE_FEE_MAX_ROUNDS; i++) {
17622
+ const next = change - feeOn(net > 0n ? net : 0n);
17623
+ if (next === net) return net > 0n ? net : 0n;
17624
+ net = next;
17625
+ }
17626
+ throw new Error(
17627
+ `change fee does not settle after ${CHANGE_FEE_MAX_ROUNDS} rounds (${change} sats of change); settle the full balance instead`
17628
+ );
17629
+ }
17630
+ function reportUngatedInputs(wallet, inputs) {
17631
+ if (!("logUngatedInputs" in wallet)) return;
17632
+ const logger = wallet;
17633
+ void logger.logUngatedInputs("Ramps.offboard({ vtxos })", inputs);
17634
+ }
17609
17635
  var Ramps = class {
17610
17636
  /**
17611
17637
  * Create convenience wrappers for onboarding and offboarding flows.
@@ -17659,6 +17685,19 @@ var Ramps = class {
17659
17685
  }
17660
17686
  change = totalAmount - amount;
17661
17687
  }
17688
+ let boardingAddress;
17689
+ if (change > 0n) {
17690
+ boardingAddress = await this.wallet.getBoardingAddress();
17691
+ const changeScript = hex.encode(offboardDestinationScript(boardingAddress));
17692
+ change = settleChangeAgainstFee(
17693
+ change,
17694
+ (amt) => BigInt(estimator.evalOnchainOutput({ amount: amt, script: changeScript }).satoshis)
17695
+ );
17696
+ const dustAmount = getDustAmount(this.wallet);
17697
+ if (change > 0n && change < dustAmount) {
17698
+ throw new DustChangeError(change, dustAmount);
17699
+ }
17700
+ }
17662
17701
  amount = amount ?? totalAmount;
17663
17702
  const offchainAddress = await this.wallet.getAddress();
17664
17703
  const offchainAddr = ArkAddress.decode(offchainAddress);
@@ -17680,7 +17719,6 @@ var Ramps = class {
17680
17719
  }
17681
17720
  ];
17682
17721
  if (change > 0n) {
17683
- const boardingAddress = await this.wallet.getBoardingAddress();
17684
17722
  outputs.push({
17685
17723
  address: boardingAddress,
17686
17724
  amount: change
@@ -17701,6 +17739,10 @@ var Ramps = class {
17701
17739
  * @param feeInfo - The fee info to deduct from the offboard amount.
17702
17740
  * @param amount - The amount to offboard. If not provided, the total amount of virtual outputs will be offboarded.
17703
17741
  * @param eventCallback - Optional callback that receives settlement events
17742
+ * @param vtxos - Specific virtual outputs to spend, mirroring {@link onboard}'s
17743
+ * `boardingUtxos`. Omitted, every spendable one is spent — merging the whole
17744
+ * off-chain balance into a single change output. Taken as given like
17745
+ * `settle({ inputs })`: an `amount` these cannot cover is an error, not a top-up.
17704
17746
  * @returns The Arkade transaction id created by settlement
17705
17747
  * @throws Error if no virtual outputs remain after fee deduction or the destination address cannot be decoded
17706
17748
  * @see IWallet.getSpendableVtxos
@@ -17712,8 +17754,10 @@ var Ramps = class {
17712
17754
  * await ramps.offboard('bc1q...', feeInfo);
17713
17755
  * ```
17714
17756
  */
17715
- async offboard(destinationAddress, feeInfo, amount, eventCallback) {
17716
- const vtxos = await this.wallet.getSpendableVtxos({
17757
+ async offboard(destinationAddress, feeInfo, amount, eventCallback, vtxos) {
17758
+ const named = vtxos !== void 0;
17759
+ if (vtxos) reportUngatedInputs(this.wallet, vtxos);
17760
+ vtxos ??= await this.wallet.getSpendableVtxos({
17717
17761
  withRecoverable: true,
17718
17762
  withUnrolled: false
17719
17763
  });
@@ -17723,6 +17767,11 @@ var Ramps = class {
17723
17767
  for (const vtxo of vtxos) {
17724
17768
  const inputFee = estimator.evalOffchainInput(toOffchainInputFeeParams(vtxo));
17725
17769
  if (inputFee.satoshis >= vtxo.value) {
17770
+ if (named) {
17771
+ throw new Error(
17772
+ `selected vtxo ${vtxo.txid}:${vtxo.vout} costs ${inputFee.satoshis} sats to spend and is worth ${vtxo.value} \u2014 drop it from the selection`
17773
+ );
17774
+ }
17726
17775
  continue;
17727
17776
  }
17728
17777
  filteredVtxos.push(vtxo);
@@ -17738,6 +17787,15 @@ var Ramps = class {
17738
17787
  }
17739
17788
  change = totalAmount - amount;
17740
17789
  }
17790
+ let changeAddress;
17791
+ if (change > 0n) {
17792
+ changeAddress = await this.wallet.getAddress();
17793
+ const changeScript = hex.encode(ArkAddress.decode(changeAddress).pkScript);
17794
+ change = settleChangeAgainstFee(
17795
+ change,
17796
+ (amount2) => BigInt(estimator.evalOffchainOutput({ amount: amount2, script: changeScript }).satoshis)
17797
+ );
17798
+ }
17741
17799
  const dustAmount = getDustAmount(this.wallet);
17742
17800
  if (change > 0n && change < dustAmount) {
17743
17801
  throw new DustChangeError(change, dustAmount);
@@ -17761,7 +17819,7 @@ var Ramps = class {
17761
17819
  }
17762
17820
  ];
17763
17821
  if (change > 0n) {
17764
- const offchainAddress = await this.wallet.getAddress();
17822
+ const offchainAddress = changeAddress;
17765
17823
  outputs.push({
17766
17824
  address: offchainAddress,
17767
17825
  amount: change
@@ -24159,6 +24217,16 @@ function assertNoAssets(railId, req) {
24159
24217
  );
24160
24218
  }
24161
24219
  }
24220
+ function selectionOf(req) {
24221
+ return req.selectedVtxos;
24222
+ }
24223
+ function assertNoSelection(railId, req) {
24224
+ if (selectionOf(req) !== void 0) {
24225
+ throw new Error(
24226
+ `${railId}: cannot spend a caller-chosen input set (selectedVtxos) \u2014 this rail does not choose the coins it spends`
24227
+ );
24228
+ }
24229
+ }
24162
24230
  function resolveAssetAmount(railId, req) {
24163
24231
  const assets = assetsOf(req);
24164
24232
  if (assets.length !== 1) {
@@ -24302,13 +24370,17 @@ function arkRail() {
24302
24370
  const address = arkTarget(req.raw);
24303
24371
  assertNoAssets("ark", req);
24304
24372
  const amt = resolveSendAmount("ark", req.raw, req.amount);
24373
+ const selectedVtxos = selectionOf(req);
24305
24374
  return {
24306
24375
  railId: "ark",
24307
24376
  amount: amt,
24308
24377
  fee: 0,
24309
24378
  total: amt,
24310
24379
  send: async () => makeHandle("ark", async (emit) => {
24311
- const txid = await ctx.wallet.send({ address, amount: amt });
24380
+ const txid = selectedVtxos ? await ctx.wallet.send({
24381
+ recipients: [{ address, amount: amt }],
24382
+ selectedVtxos
24383
+ }) : await ctx.wallet.send({ address, amount: amt });
24312
24384
  const result = { railId: "ark", txid };
24313
24385
  emit({ status: "settled", result });
24314
24386
  return result;
@@ -24331,6 +24403,7 @@ function arkAssetRail() {
24331
24403
  const asset = resolveAssetAmount("ark-asset", req);
24332
24404
  if (req.amount !== void 0) assertSendableAmount("ark-asset", req.amount);
24333
24405
  const carrier = tryResolveSendAmount(req.raw, req.amount) ?? ASSET_CARRIER_SATS;
24406
+ const selectedVtxos = selectionOf(req);
24334
24407
  return {
24335
24408
  railId: "ark-asset",
24336
24409
  amount: carrier,
@@ -24338,11 +24411,8 @@ function arkAssetRail() {
24338
24411
  total: carrier,
24339
24412
  assets: { delivered: asset, spent: asset },
24340
24413
  send: async () => makeHandle("ark-asset", async (emit) => {
24341
- const txid = await ctx.wallet.send({
24342
- address,
24343
- amount: carrier,
24344
- assets: [asset]
24345
- });
24414
+ const recipient = { address, amount: carrier, assets: [asset] };
24415
+ const txid = selectedVtxos ? await ctx.wallet.send({ recipients: [recipient], selectedVtxos }) : await ctx.wallet.send(recipient);
24346
24416
  const result = { railId: "ark-asset", txid };
24347
24417
  emit({ status: "settled", result });
24348
24418
  return result;
@@ -24364,6 +24434,13 @@ function grossUpOffboard(net, feeInfo, script) {
24364
24434
  }
24365
24435
  return { gross, fee: gross - net };
24366
24436
  }
24437
+ function offchainInputFees(vtxos, fees) {
24438
+ const estimator = new Estimator(fees?.intentFee ?? {});
24439
+ return vtxos.reduce(
24440
+ (total, vtxo) => total + estimator.evalOffchainInput(toOffchainInputFeeParams(vtxo)).satoshis,
24441
+ 0
24442
+ );
24443
+ }
24367
24444
  function onchainRail(deps) {
24368
24445
  if (typeof deps?.feeInfo !== "function") {
24369
24446
  throw new Error("onchain rail: a feeInfo source is required");
@@ -24380,17 +24457,22 @@ function onchainRail(deps) {
24380
24457
  const fees = await deps.feeInfo();
24381
24458
  const script = hex.encode(offboardDestinationScript(address));
24382
24459
  const { gross, fee } = grossUpOffboard(amt, fees, script);
24460
+ const selectedVtxos = selectionOf(req);
24461
+ const inputFee = selectedVtxos ? offchainInputFees(selectedVtxos, fees) : 0;
24383
24462
  return {
24384
24463
  railId: "onchain",
24385
24464
  amount: amt,
24386
- fee,
24387
- total: gross,
24465
+ fee: fee + inputFee,
24466
+ total: gross + inputFee,
24388
24467
  send: async () => makeHandle("onchain", async (emit) => {
24389
- const txid = await new Ramps(ctx.wallet).offboard(
24468
+ const ramps = new Ramps(ctx.wallet);
24469
+ const txid = selectedVtxos ? await ramps.offboard(
24390
24470
  address,
24391
24471
  fees,
24392
- BigInt(gross)
24393
- );
24472
+ BigInt(gross),
24473
+ void 0,
24474
+ selectedVtxos
24475
+ ) : await ramps.offboard(address, fees, BigInt(gross));
24394
24476
  const result = { railId: "onchain", txid };
24395
24477
  emit({ status: "settled", result });
24396
24478
  return result;
@@ -24413,6 +24495,6 @@ function createDefaultPaymentRouter(wallet) {
24413
24495
  (*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
24414
24496
  */
24415
24497
 
24416
- export { ARKADE_MAGIC, ARKADE_SALTED_PREIMAGE_TAG, ARKADE_SWAP_PREIMAGE_TAG, ASSET_CARRIER_SATS, AbortError, ActivityRegistry, AmbiguousRouteError, ArkNote, ArkadeCash, ArkadeCashCreateError, AssetManager, BIP21, BIP21Error, BIP322, BLOCKED_UPGRADE_TIMEOUT_MS, Batch, CachingArkProvider, ChainedTxType, ConnectionDisposedError, ContractManager, ContractRepositoryImpl, ContractWatcher, DB_VERSION, DEFAULT_MESSAGE_TIMEOUTS, DEFAULT_MIN_BATCH_EXPIRY_SECONDS, DEFAULT_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, DatabaseUpgradeBlockedError, DelegateManagerImpl, DelegateNotConfiguredError, DelegatorManagerImpl, DelegatorNotConfiguredError, DescriptorIdentity, DescriptorSigningProviderMissingError, DustChangeError, ELECTRUM_TCP_HOST, ELECTRUM_WS_URL, ESPLORA_URL, ElectrumOnchainProvider, EmulatorPacket, EsploraProvider, Estimator, Extension, ExtensionNotFoundError, ForeignDescriptorError, HDDescriptorProvider, INTENT_TERMINAL_STATES, InMemoryContractRepository, InMemoryIntentRepository, InMemoryVirtualTxRepository, InMemoryWalletRepository, IndexedDBContractRepository, IndexedDBIntentRepository, IndexedDBVirtualTxRepository, IndexedDBWalletRepository, MAX_USED_SIGNING_DESCRIPTORS_LOOK_AHEAD, MESSAGE_BUS_INITIALIZING, MESSAGE_BUS_NOT_INITIALIZED, MIGRATION_KEY, MUTINYNET_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, MessageBus, MessageBusInitializingError, MessageBusNotInitializedError, MissingSigningDescriptorError, MnemonicIdentity, OnchainWallet, P2A, PaymentRouter, PrevTxUnavailableError, REGTEST_MIN_BATCH_EXPIRY_SECONDS, REGTEST_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, Ramps, ReadonlyAssetManager, ReadonlyDescriptorIdentity, ReadonlySingleKey, ReadonlyWallet, ReadonlyWalletError, RestDelegateProvider, RestDelegatorProvider, RestEmulatorProvider, SIGNET_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, SeedIdentity, ServiceWorkerReadonlyWallet, ServiceWorkerTimeoutError, ServiceWorkerWallet, SingleKey, TxTree, TxType, TxWeightEstimator, UnannotatableInputError, UnilateralExit, UnknownPacket, Unroll, VtxoManager, Wallet2 as Wallet, WalletCannotAllocateAddressError, WalletCannotSignError, WalletMessageHandler, WalletNotInitializedError, WalletRepositoryImpl, WsElectrumChainSource, adoptContractDescriptor, arkAssetRail, arkRail, arkTarget, arkade_exports, assertFinalCommitmentMatchesValidated, assertIntentIdUnique, assertNoAssets, assertSendableAmount, assertSubmittedArkTxid, assertValidBatchExpiry, assertValidServerUnrollScript, assetMintResolver, assetsOf, attachPrevArkTxs, attachPrevoutTxs, awaitTransaction, boardingResolver, btcTarget, buildForfeitTx, buildOffchainTx, buildPreimageMessage, buildSaltedPreimageMessage, claimWithPreimageIdentity, classifyAgainstSignerSet, classifyContractSigner, closeDatabase, collabExitResolver, combineTapscriptSigs, contractFromArkContract, contractFromArkContractWithAddress, contractPreimage, contractSigner, createAssetPacket, createDefaultActivityRegistry, createDefaultPaymentRouter, createExitChainResolver, createManagedConnection, decodeArkContract, defaultBatchExpiryPolicy, defaultCheckpointExitDelayPolicy, deleteByIndex, deserializeAssets, deserializeExitPackage, deserializeUtxo, deserializeVtxo, encodeArkContract, exitObserverFor, extendVirtualCoinForContract, extractArkProviderUrl, gateExclusion, gatedContracts, getAllByIndexValues, getMigrationStatus, getRandomId, hasBoardingTxExpired, hasCandidates, intentMatchesFilter, intentPageBounds, invoiceTarget, isAddressAllocationCapable, isArkContract, isBatchSignable, isBtcAddress, isContractGenericallySpendable, isContractVtxoEvent, isCooperativelyMigratable, isDeterministicSigner, isDiscoverable, isHDAllocationCapable, isHDDeterministicSignCapable, isHDWalletCapable, isLightningInvoice, isLnurl, isMessageBusInitializingError, isMessageBusNotInitializedError, isPerArtifactDescriptor, isSigningIdentity, isSubdust, isTerminalIntentState, isValidArkAddress, isVtxoExpiringSoon, isVtxoForScript, isWatchedContract, logExcludedVtxos, makeHandle, matchServerCheckpoints, mergeChainedTxType, migrateWalletRepository, notifyExitObserved, onchainRail, openDatabase, outpointExclusion, outpointReasons, promisifyRequest, provisionClaimSecret, provisionRefundKey, registerWalletRestoreHook, requiresMigration, resolveAssetAmount, resolveBatchExpiryPolicy, resolveCheckpointExitDelayPolicy, resolveDescriptorSigner, resolvePrevTxs, resolveSendAmount, rollbackMigration, saveVtxosForContract, scriptFromArkAddress, selectCoinsWithAsset, selectVirtualCoins, serializeAssets, serializeExitPackage, serializeUtxo, serializeVtxo, setupServiceWorker, signAndSubmitOffchainTx, signerSetFromInfo, signingDescriptorIndex, strictSigningDescriptorIndex, toXOnlySignerHex, tryResolveSendAmount, validateBatchRecipients, validateConnectorsTxGraph, validateVtxoTxGraph, verifyTapscriptSignatures, waitForIncomingFunds, walletFeeSource, warnAndFilterVtxosForScript, withPrevTxs };
24417
- //# sourceMappingURL=chunk-YHJJSLE5.js.map
24418
- //# sourceMappingURL=chunk-YHJJSLE5.js.map
24498
+ export { ARKADE_MAGIC, ARKADE_SALTED_PREIMAGE_TAG, ARKADE_SWAP_PREIMAGE_TAG, ASSET_CARRIER_SATS, AbortError, ActivityRegistry, AmbiguousRouteError, ArkNote, ArkadeCash, ArkadeCashCreateError, AssetManager, BIP21, BIP21Error, BIP322, BLOCKED_UPGRADE_TIMEOUT_MS, Batch, CachingArkProvider, ChainedTxType, ConnectionDisposedError, ContractManager, ContractRepositoryImpl, ContractWatcher, DB_VERSION, DEFAULT_MESSAGE_TIMEOUTS, DEFAULT_MIN_BATCH_EXPIRY_SECONDS, DEFAULT_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, DatabaseUpgradeBlockedError, DelegateManagerImpl, DelegateNotConfiguredError, DelegatorManagerImpl, DelegatorNotConfiguredError, DescriptorIdentity, DescriptorSigningProviderMissingError, DustChangeError, ELECTRUM_TCP_HOST, ELECTRUM_WS_URL, ESPLORA_URL, ElectrumOnchainProvider, EmulatorPacket, EsploraProvider, Estimator, Extension, ExtensionNotFoundError, ForeignDescriptorError, HDDescriptorProvider, INTENT_TERMINAL_STATES, InMemoryContractRepository, InMemoryIntentRepository, InMemoryVirtualTxRepository, InMemoryWalletRepository, IndexedDBContractRepository, IndexedDBIntentRepository, IndexedDBVirtualTxRepository, IndexedDBWalletRepository, MAX_USED_SIGNING_DESCRIPTORS_LOOK_AHEAD, MESSAGE_BUS_INITIALIZING, MESSAGE_BUS_NOT_INITIALIZED, MIGRATION_KEY, MUTINYNET_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, MessageBus, MessageBusInitializingError, MessageBusNotInitializedError, MissingSigningDescriptorError, MnemonicIdentity, OnchainWallet, P2A, PaymentRouter, PrevTxUnavailableError, REGTEST_MIN_BATCH_EXPIRY_SECONDS, REGTEST_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, Ramps, ReadonlyAssetManager, ReadonlyDescriptorIdentity, ReadonlySingleKey, ReadonlyWallet, ReadonlyWalletError, RestDelegateProvider, RestDelegatorProvider, RestEmulatorProvider, SIGNET_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, SeedIdentity, ServiceWorkerReadonlyWallet, ServiceWorkerTimeoutError, ServiceWorkerWallet, SingleKey, TxTree, TxType, TxWeightEstimator, UnannotatableInputError, UnilateralExit, UnknownPacket, Unroll, VtxoManager, Wallet2 as Wallet, WalletCannotAllocateAddressError, WalletCannotSignError, WalletMessageHandler, WalletNotInitializedError, WalletRepositoryImpl, WsElectrumChainSource, adoptContractDescriptor, arkAssetRail, arkRail, arkTarget, arkade_exports, assertFinalCommitmentMatchesValidated, assertIntentIdUnique, assertNoAssets, assertNoSelection, assertSendableAmount, assertSubmittedArkTxid, assertValidBatchExpiry, assertValidServerUnrollScript, assetMintResolver, assetsOf, attachPrevArkTxs, attachPrevoutTxs, awaitTransaction, boardingResolver, btcTarget, buildForfeitTx, buildOffchainTx, buildPreimageMessage, buildSaltedPreimageMessage, claimWithPreimageIdentity, classifyAgainstSignerSet, classifyContractSigner, closeDatabase, collabExitResolver, combineTapscriptSigs, contractFromArkContract, contractFromArkContractWithAddress, contractPreimage, contractSigner, createAssetPacket, createDefaultActivityRegistry, createDefaultPaymentRouter, createExitChainResolver, createManagedConnection, decodeArkContract, defaultBatchExpiryPolicy, defaultCheckpointExitDelayPolicy, deleteByIndex, deserializeAssets, deserializeExitPackage, deserializeUtxo, deserializeVtxo, encodeArkContract, exitObserverFor, extendVirtualCoinForContract, extractArkProviderUrl, gateExclusion, gatedContracts, getAllByIndexValues, getMigrationStatus, getRandomId, hasBoardingTxExpired, hasCandidates, intentMatchesFilter, intentPageBounds, invoiceTarget, isAddressAllocationCapable, isArkContract, isBatchSignable, isBtcAddress, isContractGenericallySpendable, isContractVtxoEvent, isCooperativelyMigratable, isDeterministicSigner, isDiscoverable, isHDAllocationCapable, isHDDeterministicSignCapable, isHDWalletCapable, isLightningInvoice, isLnurl, isMessageBusInitializingError, isMessageBusNotInitializedError, isPerArtifactDescriptor, isSigningIdentity, isSubdust, isTerminalIntentState, isValidArkAddress, isVtxoExpiringSoon, isVtxoForScript, isWatchedContract, logExcludedVtxos, makeHandle, matchServerCheckpoints, mergeChainedTxType, migrateWalletRepository, notifyExitObserved, onchainRail, openDatabase, outpointExclusion, outpointReasons, promisifyRequest, provisionClaimSecret, provisionRefundKey, registerWalletRestoreHook, requiresMigration, resolveAssetAmount, resolveBatchExpiryPolicy, resolveCheckpointExitDelayPolicy, resolveDescriptorSigner, resolvePrevTxs, resolveSendAmount, rollbackMigration, saveVtxosForContract, scriptFromArkAddress, selectCoinsWithAsset, selectVirtualCoins, selectionOf, serializeAssets, serializeExitPackage, serializeUtxo, serializeVtxo, setupServiceWorker, signAndSubmitOffchainTx, signerSetFromInfo, signingDescriptorIndex, strictSigningDescriptorIndex, toXOnlySignerHex, tryResolveSendAmount, validateBatchRecipients, validateConnectorsTxGraph, validateVtxoTxGraph, verifyTapscriptSignatures, waitForIncomingFunds, walletFeeSource, warnAndFilterVtxosForScript, withPrevTxs };
24499
+ //# sourceMappingURL=chunk-ZTGTQP2W.js.map
24500
+ //# sourceMappingURL=chunk-ZTGTQP2W.js.map