@arkade-os/swap 0.0.4 → 0.0.5

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/index.cjs CHANGED
@@ -53,6 +53,7 @@ __export(index_exports, {
53
53
  ONCHAIN_RECEIVE_PAIR: () => ONCHAIN_RECEIVE_PAIR,
54
54
  ONCHAIN_SECONDS_PER_BLOCK: () => ONCHAIN_SECONDS_PER_BLOCK,
55
55
  ONCHAIN_SEND_PAIR: () => ONCHAIN_SEND_PAIR,
56
+ PreimageNotRecoverableError: () => PreimageNotRecoverableError,
56
57
  QUOTE_OPTIONS: () => QUOTE_OPTIONS,
57
58
  REFUND_MTP_LAG_SECONDS: () => REFUND_MTP_LAG_SECONDS,
58
59
  RFQ_RESOLVED_STATES: () => RFQ_RESOLVED_STATES,
@@ -60,6 +61,7 @@ __export(index_exports, {
60
61
  RFQ_TERMINAL_STATES: () => RFQ_TERMINAL_STATES,
61
62
  RefundNotLocallyPossibleError: () => RefundNotLocallyPossibleError,
62
63
  RfqSwapManager: () => RfqSwapManager,
64
+ SOLO_REFUND_HEADROOM_SECONDS: () => SOLO_REFUND_HEADROOM_SECONDS,
63
65
  SWAP_LOCKUP_CONTRACT_KIND: () => SWAP_LOCKUP_CONTRACT_KIND,
64
66
  SWAP_LOCKUP_CONTRACT_LABEL: () => SWAP_LOCKUP_CONTRACT_LABEL,
65
67
  SWAP_LOCKUP_CONTRACT_TYPE: () => SWAP_LOCKUP_CONTRACT_TYPE,
@@ -107,6 +109,7 @@ __export(index_exports, {
107
109
  onchainReceiveRequest: () => onchainReceiveRequest,
108
110
  onchainSendRequest: () => onchainSendRequest,
109
111
  paymentHashOf: () => paymentHashOf,
112
+ preimageForSwapRecord: () => preimageForSwapRecord,
110
113
  pushClaim: () => pushClaim,
111
114
  pushRefundWithoutReceiver: () => pushRefundWithoutReceiver,
112
115
  readLockupFate: () => readLockupFate,
@@ -142,7 +145,7 @@ module.exports = __toCommonJS(index_exports);
142
145
  // src/offer.ts
143
146
  var import_base2 = require("@scure/base");
144
147
  var import_utils = require("@scure/btc-signer/utils.js");
145
- var import_sdk = require("@arkade-os/sdk");
148
+ var import_sdk2 = require("@arkade-os/sdk");
146
149
 
147
150
  // src/swap-want-asset.program.json
148
151
  var swap_want_asset_program_default = {
@@ -273,6 +276,8 @@ async function retireSettledOfferContracts(manager, swaps) {
273
276
 
274
277
  // src/store.ts
275
278
  var import_base = require("@scure/base");
279
+ var import_sha2 = require("@noble/hashes/sha2.js");
280
+ var import_sdk = require("@arkade-os/sdk");
276
281
  var BTC_ASSET_ID = "btc";
277
282
  var byNewest = (a, b) => b.createdAt - a.createdAt;
278
283
  var getAssetSwapsOrThrow = async (repository) => {
@@ -327,13 +332,66 @@ var updateAssetSwapBestEffort = async (repository, id, changes) => {
327
332
  };
328
333
  var swapSecretsToRecord = (secrets) => ({
329
334
  signingDescriptor: secrets.descriptor,
330
- ..."mustPersistPreimage" in secrets && secrets.mustPersistPreimage ? { preimageHex: import_base.hex.encode(secrets.preimage) } : {}
335
+ ..."mustPersistPreimage" in secrets && secrets.mustPersistPreimage ? { preimageHex: import_base.hex.encode(secrets.preimage) } : {},
336
+ ..."preimageSalt" in secrets && secrets.preimageSalt ? { preimageSaltHex: import_base.hex.encode(secrets.preimageSalt) } : {}
331
337
  });
338
+ var decodeHex32 = (value, field) => {
339
+ const bytes = import_base.hex.decode(value);
340
+ if (bytes.length !== 32) {
341
+ throw new Error(`${field} must be 32 bytes, got ${bytes.length}`);
342
+ }
343
+ return bytes;
344
+ };
345
+ var PreimageNotRecoverableError = class extends Error {
346
+ constructor(reason, message, options) {
347
+ super(message, options);
348
+ this.reason = reason;
349
+ }
350
+ reason;
351
+ name = "PreimageNotRecoverableError";
352
+ };
353
+ var preimageForSwapRecord = async (wallet, record) => {
354
+ if (!record.signingDescriptor) {
355
+ throw new PreimageNotRecoverableError(
356
+ "no-secrets",
357
+ "this swap record carries no signing descriptor"
358
+ );
359
+ }
360
+ let stored;
361
+ let salt;
362
+ try {
363
+ stored = record.preimageHex ? decodeHex32(record.preimageHex, "preimageHex") : void 0;
364
+ salt = record.preimageSaltHex ? decodeHex32(record.preimageSaltHex, "preimageSaltHex") : void 0;
365
+ } catch (cause) {
366
+ throw new PreimageNotRecoverableError(
367
+ "malformed-record",
368
+ `this swap record's secrets projection is unreadable: ${String(cause)}`,
369
+ { cause }
370
+ );
371
+ }
372
+ let preimage;
373
+ try {
374
+ preimage = await (0, import_sdk.contractPreimage)(wallet, record.signingDescriptor, { stored, salt });
375
+ } catch (cause) {
376
+ throw new PreimageNotRecoverableError(
377
+ "not-derivable",
378
+ `this wallet cannot produce the preimage for ${record.signingDescriptor}`,
379
+ { cause }
380
+ );
381
+ }
382
+ if (record.paymentHash && import_base.hex.encode((0, import_sha2.sha256)(preimage)) !== record.paymentHash.toLowerCase()) {
383
+ throw new PreimageNotRecoverableError(
384
+ "hash-mismatch",
385
+ "the derived preimage does not match this swap's payment hash: wrong wallet, or a tampered salt"
386
+ );
387
+ }
388
+ return preimage;
389
+ };
332
390
 
333
391
  // src/offer.ts
334
392
  var swapPrograms = {
335
- wantAsset: import_sdk.arkade.parseArtifact(swap_want_asset_program_default),
336
- wantBtc: import_sdk.arkade.parseArtifact(swap_want_btc_program_default)
393
+ wantAsset: import_sdk2.arkade.parseArtifact(swap_want_asset_program_default),
394
+ wantBtc: import_sdk2.arkade.parseArtifact(swap_want_btc_program_default)
337
395
  };
338
396
  function swapProgramBinding(offer, serverPubkey) {
339
397
  if (offer.makerPkScript.length !== FIELDS.makerPkScript.width) {
@@ -361,7 +419,7 @@ function swapProgramBinding(offer, serverPubkey) {
361
419
  }
362
420
  function offerVtxoScript(offer, serverPubkey) {
363
421
  const { program, args, keys } = swapProgramBinding(offer, serverPubkey);
364
- return new import_sdk.arkade.ArkadeProgramScript(program, args, keys);
422
+ return new import_sdk2.arkade.ArkadeProgramScript(program, args, keys);
365
423
  }
366
424
  var OFFER_PACKET_TYPE = 3;
367
425
  var FIELDS = {
@@ -443,8 +501,8 @@ function decodeOffer(data) {
443
501
  return {
444
502
  swapPkScript: need("swapPkScript"),
445
503
  wantAmount: new DataView(amount.buffer, amount.byteOffset).getBigUint64(0, false),
446
- ...fields.wantAsset && { wantAsset: import_sdk.asset.AssetId.fromBytes(fields.wantAsset) },
447
- ...fields.offerAsset && { offerAsset: import_sdk.asset.AssetId.fromBytes(fields.offerAsset) },
504
+ ...fields.wantAsset && { wantAsset: import_sdk2.asset.AssetId.fromBytes(fields.wantAsset) },
505
+ ...fields.offerAsset && { offerAsset: import_sdk2.asset.AssetId.fromBytes(fields.offerAsset) },
448
506
  makerPkScript: need("makerPkScript"),
449
507
  makerPublicKey: need("makerPublicKey"),
450
508
  emulatorPubkey: need("emulatorPubkey")
@@ -455,17 +513,17 @@ var OFFER_CONTRACT_KIND = "asset-swap-offer";
455
513
  async function registerOfferContract(wallet, arkServerUrl, network, binding, serverPubkey, expectedPkScript) {
456
514
  const { program, args, keys } = swapProgramBinding(binding, serverPubkey);
457
515
  const contractManager = await wallet.getContractManager();
458
- const client = await import_sdk.arkade.Arkade.connect({
459
- arkade: new import_sdk.RestArkProvider(arkServerUrl),
460
- indexer: new import_sdk.RestIndexerProvider(arkServerUrl),
516
+ const client = await import_sdk2.arkade.Arkade.connect({
517
+ arkade: new import_sdk2.RestArkProvider(arkServerUrl),
518
+ indexer: new import_sdk2.RestIndexerProvider(arkServerUrl),
461
519
  identity: wallet.identity,
462
520
  // without this the row's `address` would be derived against the SDK's
463
521
  // default network while its script is right — a row that disagrees with
464
522
  // the address the user is about to fund
465
- network: (0, import_sdk.getNetwork)(network),
523
+ network: (0, import_sdk2.getNetwork)(network),
466
524
  contractManager
467
525
  });
468
- const contract = new import_sdk.arkade.ArkadeContract(client, program, args, keys);
526
+ const contract = new import_sdk2.arkade.ArkadeContract(client, program, args, keys);
469
527
  if (import_base2.hex.encode(contract.pkScript) !== import_base2.hex.encode(expectedPkScript)) {
470
528
  throw new Error("derived covenant does not match the offer's swapPkScript");
471
529
  }
@@ -480,20 +538,20 @@ async function createOffer(wallet, arkServerUrl, params) {
480
538
  throw new Error("set exactly one of wantAsset (BTC->asset) or offerAsset (asset->BTC)");
481
539
  }
482
540
  const [info, makerAddress, makerPublicKey] = await Promise.all([
483
- new import_sdk.RestArkProvider(arkServerUrl).getInfo(),
541
+ new import_sdk2.RestArkProvider(arkServerUrl).getInfo(),
484
542
  wallet.getAddress(),
485
543
  wallet.identity.xOnlyPublicKey()
486
544
  ]);
487
- const serverPubKey = import_base2.hex.decode((0, import_sdk.toXOnlySignerHex)(info.signerPubkey));
488
- const network = (0, import_sdk.getNetwork)(info.network);
545
+ const serverPubKey = import_base2.hex.decode((0, import_sdk2.toXOnlySignerHex)(info.signerPubkey));
546
+ const network = (0, import_sdk2.getNetwork)(info.network);
489
547
  const emuKey = import_base2.hex.decode(
490
- (0, import_sdk.toXOnlySignerHex)((0, import_sdk.resolveEmulatorPubkey)(network, params.emulatorPubkey))
548
+ (0, import_sdk2.toXOnlySignerHex)((0, import_sdk2.resolveEmulatorPubkey)(network, params.emulatorPubkey))
491
549
  );
492
550
  const binding = {
493
551
  wantAmount: params.wantAmount,
494
552
  wantAsset: params.wantAsset,
495
553
  offerAsset: params.offerAsset,
496
- makerPkScript: import_sdk.ArkAddress.decode(makerAddress).pkScript,
554
+ makerPkScript: import_sdk2.ArkAddress.decode(makerAddress).pkScript,
497
555
  makerPublicKey,
498
556
  emulatorPubkey: emuKey
499
557
  };
@@ -521,9 +579,9 @@ async function cancelOffer(wallet, arkServerUrl, offerHex, opts) {
521
579
  const { repository, fundingTxid, swapAddress } = opts;
522
580
  const offer = decodeOffer(import_base2.hex.decode(offerHex));
523
581
  const contractManager = await wallet.getContractManager();
524
- const client = await import_sdk.arkade.Arkade.connect({
525
- arkade: new import_sdk.RestArkProvider(arkServerUrl),
526
- indexer: new import_sdk.RestIndexerProvider(arkServerUrl),
582
+ const client = await import_sdk2.arkade.Arkade.connect({
583
+ arkade: new import_sdk2.RestArkProvider(arkServerUrl),
584
+ indexer: new import_sdk2.RestIndexerProvider(arkServerUrl),
527
585
  identity: wallet.identity,
528
586
  // registered offers resolve their VTXOs from the contract repository
529
587
  // instead of a direct indexer query; the indexer above stays as the
@@ -533,15 +591,15 @@ async function cancelOffer(wallet, arkServerUrl, offerHex, opts) {
533
591
  // script and the payout script comes from wallet.getAddress(), so the
534
592
  // client's network (which only shapes address derivation) is unused here
535
593
  });
536
- const serverKey = swapAddress ? import_sdk.ArkAddress.decode(swapAddress).serverPubKey : client.serverKey;
594
+ const serverKey = swapAddress ? import_sdk2.ArkAddress.decode(swapAddress).serverPubKey : client.serverKey;
537
595
  const { program, args, keys } = swapProgramBinding(offer, serverKey);
538
- const rebuilt = new import_sdk.arkade.ArkadeProgramScript(program, args, keys);
596
+ const rebuilt = new import_sdk2.arkade.ArkadeProgramScript(program, args, keys);
539
597
  if (import_base2.hex.encode(rebuilt.pkScript) !== import_base2.hex.encode(offer.swapPkScript)) {
540
598
  throw new Error(
541
599
  "rebuilt covenant does not match the offer's swapPkScript \u2014 the server signing key has likely rotated since funding; pass swapAddress (the funded address) to pin the original key"
542
600
  );
543
601
  }
544
- const contract = new import_sdk.arkade.ArkadeContract(client, program, args, keys);
602
+ const contract = new import_sdk2.arkade.ArkadeContract(client, program, args, keys);
545
603
  const [vtxos, makerAddress] = await Promise.all([contract.getUtxos(), wallet.getAddress()]);
546
604
  if (!fundingTxid && vtxos.length > 1) {
547
605
  throw new Error(
@@ -550,7 +608,7 @@ async function cancelOffer(wallet, arkServerUrl, offerHex, opts) {
550
608
  }
551
609
  const vtxo = fundingTxid ? vtxos.find((v) => v.txid === fundingTxid) : vtxos[0];
552
610
  if (!vtxo) throw new Error("no spendable VTXO at the swap address");
553
- const makerPkScript = import_sdk.ArkAddress.decode(makerAddress).pkScript;
611
+ const makerPkScript = import_sdk2.ArkAddress.decode(makerAddress).pkScript;
554
612
  const cancel = contract.functions.cancel().from({ txid: vtxo.txid, vout: vtxo.vout, value: vtxo.value }).to(makerPkScript, BigInt(vtxo.value));
555
613
  for (const a of vtxo.assets ?? []) {
556
614
  cancel.withAsset({
@@ -577,7 +635,7 @@ async function cancelOffer(wallet, arkServerUrl, offerHex, opts) {
577
635
 
578
636
  // src/markets.ts
579
637
  var import_solver_discovery = require("@arkade-os/solver-discovery");
580
- var import_sdk2 = require("@arkade-os/sdk");
638
+ var import_sdk3 = require("@arkade-os/sdk");
581
639
  var QUOTE_OPTIONS = { safetyBps: 0 };
582
640
  var makeCachedFeedFetch = (ttlMs = 3e4, fetchImpl = fetch) => {
583
641
  const cache = /* @__PURE__ */ new Map();
@@ -694,7 +752,7 @@ var validatePlan = (plan, giveBalance, dust) => {
694
752
  const receiveIsBtc = plan.receive.asset.id === BTC_ASSET_ID;
695
753
  if (depositIsBtc || receiveIsBtc) {
696
754
  const btcSide = depositIsBtc ? plan.deposit.atomic : plan.receive.atomic;
697
- if ((0, import_sdk2.isSubdust)(btcSide, dust)) return "below-dust";
755
+ if ((0, import_sdk3.isSubdust)(btcSide, dust)) return "below-dust";
698
756
  }
699
757
  return void 0;
700
758
  };
@@ -702,7 +760,7 @@ var validatePlan = (plan, giveBalance, dust) => {
702
760
  // src/repository.ts
703
761
  var marketsCacheKey = (network, registry) => `arkade-intents-markets-${network}-${registry}`;
704
762
  var InMemoryAssetSwapRepository = class {
705
- version = 1;
763
+ version = 2;
706
764
  swaps = /* @__PURE__ */ new Map();
707
765
  scanned = /* @__PURE__ */ new Set();
708
766
  markets = /* @__PURE__ */ new Map();
@@ -734,7 +792,7 @@ var InMemoryAssetSwapRepository = class {
734
792
  };
735
793
 
736
794
  // src/indexedDbRepository.ts
737
- var import_sdk3 = require("@arkade-os/sdk");
795
+ var import_sdk4 = require("@arkade-os/sdk");
738
796
  var DEFAULT_DB_NAME = "arkade-intents";
739
797
  var DB_VERSION = 1;
740
798
  var STORE_SWAPS = "swaps";
@@ -764,7 +822,7 @@ var IndexedDbAssetSwapRepository = class {
764
822
  this.dbName = dbName;
765
823
  }
766
824
  dbName;
767
- version = 1;
825
+ version = 2;
768
826
  // the promise, not the resolved database: openDatabase bumps a refcount on
769
827
  // every call including cache hits, while dispose closes once, so two
770
828
  // concurrent first calls would strand the refcount above zero and leak the
@@ -772,7 +830,7 @@ var IndexedDbAssetSwapRepository = class {
772
830
  // can be retried rather than cached forever.
773
831
  dbPromise = null;
774
832
  ensureDb() {
775
- return this.dbPromise ??= (0, import_sdk3.openDatabase)(this.dbName, DB_VERSION, initDatabase).catch(
833
+ return this.dbPromise ??= (0, import_sdk4.openDatabase)(this.dbName, DB_VERSION, initDatabase).catch(
776
834
  (err) => {
777
835
  this.dbPromise = null;
778
836
  throw err;
@@ -829,14 +887,14 @@ var IndexedDbAssetSwapRepository = class {
829
887
  }
830
888
  async [Symbol.asyncDispose]() {
831
889
  if (!this.dbPromise) return;
832
- await (0, import_sdk3.closeDatabase)(this.dbName);
890
+ await (0, import_sdk4.closeDatabase)(this.dbName);
833
891
  this.dbPromise = null;
834
892
  }
835
893
  };
836
894
 
837
895
  // src/restore.ts
838
896
  var import_base3 = require("@scure/base");
839
- var import_sdk4 = require("@arkade-os/sdk");
897
+ var import_sdk5 = require("@arkade-os/sdk");
840
898
  var TXS_PER_REQUEST = 50;
841
899
  async function fetchParsedTxs(indexer, txids) {
842
900
  const parsedByTxid = /* @__PURE__ */ new Map();
@@ -852,7 +910,7 @@ async function fetchParsedTxs(indexer, txids) {
852
910
  if (result.status !== "fulfilled") continue;
853
911
  for (const psbt of result.value) {
854
912
  try {
855
- const parsed = import_sdk4.Transaction.fromPSBT(import_base3.base64.decode(psbt));
913
+ const parsed = import_sdk5.Transaction.fromPSBT(import_base3.base64.decode(psbt));
856
914
  parsedByTxid.set(parsed.id, parsed);
857
915
  } catch {
858
916
  }
@@ -880,7 +938,7 @@ function classifySpend(offer, serverPubkey, spendTx, deposit) {
880
938
  if (!input.txid || input.index !== deposit.vout) continue;
881
939
  if (import_base3.hex.encode(input.txid) !== deposit.txid) continue;
882
940
  for (const leaf of input.tapLeafScript ?? []) {
883
- const spent = import_base3.hex.encode((0, import_sdk4.scriptFromTapLeafScript)(leaf));
941
+ const spent = import_base3.hex.encode((0, import_sdk5.scriptFromTapLeafScript)(leaf));
884
942
  if (leaves.cancel && spent === import_base3.hex.encode(leaves.cancel)) return "cancelled";
885
943
  if (leaves.fulfill && spent === import_base3.hex.encode(leaves.fulfill)) return "fulfilled";
886
944
  }
@@ -911,7 +969,7 @@ async function restoreAssetSwaps(indexer, txs, existingIds, opts) {
911
969
  if (!fundingTx) continue;
912
970
  fetchedTxids.push(txid);
913
971
  try {
914
- const packet = import_sdk4.Extension.fromTx(parsed).getPacketByType(OFFER_PACKET_TYPE);
972
+ const packet = import_sdk5.Extension.fromTx(parsed).getPacketByType(OFFER_PACKET_TYPE);
915
973
  if (!packet) continue;
916
974
  const payload = packet.serialize();
917
975
  found.push({
@@ -1002,7 +1060,7 @@ async function restoreAssetSwaps(indexer, txs, existingIds, opts) {
1002
1060
 
1003
1061
  // src/watch.ts
1004
1062
  var import_base4 = require("@scure/base");
1005
- var import_sdk5 = require("@arkade-os/sdk");
1063
+ var import_sdk6 = require("@arkade-os/sdk");
1006
1064
  var TERMINAL = ["fulfilled", "cancelled", "recoverable"];
1007
1065
  function spendUpdate(swap, spend) {
1008
1066
  if (TERMINAL.includes(swap.status)) return void 0;
@@ -1022,8 +1080,8 @@ async function watchOfferSwaps({
1022
1080
  onUpdate
1023
1081
  }) {
1024
1082
  const manager = await wallet.getContractManager();
1025
- const serverPubkey = import_sdk5.ArkAddress.decode(await wallet.getAddress()).serverPubKey;
1026
- const indexer = new import_sdk5.RestIndexerProvider(arkServerUrl);
1083
+ const serverPubkey = import_sdk6.ArkAddress.decode(await wallet.getAddress()).serverPubKey;
1084
+ const indexer = new import_sdk6.RestIndexerProvider(arkServerUrl);
1027
1085
  let queue = Promise.resolve();
1028
1086
  const enqueue = (task) => {
1029
1087
  queue = queue.then(task).catch(() => {
@@ -1038,7 +1096,7 @@ async function watchOfferSwaps({
1038
1096
  return classifyDepositSpend(
1039
1097
  decodeOffer(import_base4.hex.decode(swap.offerHex)),
1040
1098
  serverPubkey,
1041
- txs.map((psbt) => import_sdk5.Transaction.fromPSBT(import_base4.base64.decode(psbt))),
1099
+ txs.map((psbt) => import_sdk6.Transaction.fromPSBT(import_base4.base64.decode(psbt))),
1042
1100
  { txid: vtxo.txid, vout: vtxo.vout }
1043
1101
  );
1044
1102
  } catch {
@@ -1082,11 +1140,11 @@ async function watchOfferSwaps({
1082
1140
  // src/rfq.ts
1083
1141
  var import_base8 = require("@scure/base");
1084
1142
  var import_legacy2 = require("@noble/hashes/legacy.js");
1085
- var import_sdk7 = require("@arkade-os/sdk");
1143
+ var import_sdk8 = require("@arkade-os/sdk");
1086
1144
 
1087
1145
  // src/onchainHtlc.ts
1088
1146
  var import_base5 = require("@scure/base");
1089
- var import_sha2 = require("@noble/hashes/sha2.js");
1147
+ var import_sha22 = require("@noble/hashes/sha2.js");
1090
1148
  var import_legacy = require("@noble/hashes/legacy.js");
1091
1149
  var btc = __toESM(require("@scure/btc-signer"), 1);
1092
1150
  var ONCHAIN_ORDER_MARGIN_SECONDS = 2 * 60 * 60;
@@ -1095,7 +1153,7 @@ var MAX_MIN_CONFIRMATIONS = 6;
1095
1153
  var ONCHAIN_SECONDS_PER_BLOCK = 600;
1096
1154
  var ONCHAIN_DUST_SATS = BigInt(330);
1097
1155
  var newPreimage = () => crypto.getRandomValues(new Uint8Array(32));
1098
- var paymentHashOf = (preimage) => import_base5.hex.encode((0, import_sha2.sha256)(preimage));
1156
+ var paymentHashOf = (preimage) => import_base5.hex.encode((0, import_sha22.sha256)(preimage));
1099
1157
  var h160FromPaymentHash = (paymentHash) => (0, import_legacy.ripemd160)(import_base5.hex.decode(paymentHash));
1100
1158
  var L1_NETWORKS = {
1101
1159
  bitcoin: btc.NETWORK,
@@ -1236,7 +1294,7 @@ function extractPreimage(txHex, paymentHash) {
1236
1294
  }
1237
1295
  for (const stack of raw.witnesses ?? []) {
1238
1296
  for (const item of stack) {
1239
- if (item.length === 32 && import_base5.hex.encode((0, import_sha2.sha256)(item)) === paymentHash) return item;
1297
+ if (item.length === 32 && import_base5.hex.encode((0, import_sha22.sha256)(item)) === paymentHash) return item;
1240
1298
  }
1241
1299
  }
1242
1300
  return null;
@@ -1291,13 +1349,13 @@ async function classifyOnchainHtlc(chain, input) {
1291
1349
  }
1292
1350
 
1293
1351
  // src/rfq.ts
1294
- var import_sdk8 = require("@arkade-os/sdk");
1352
+ var import_sdk9 = require("@arkade-os/sdk");
1295
1353
 
1296
1354
  // src/claimPacket.ts
1297
1355
  var import_base6 = require("@scure/base");
1298
1356
  var import_secp256k1 = require("@noble/curves/secp256k1.js");
1299
1357
  var import_hkdf = require("@noble/hashes/hkdf.js");
1300
- var import_sha22 = require("@noble/hashes/sha2.js");
1358
+ var import_sha23 = require("@noble/hashes/sha2.js");
1301
1359
  var HKDF_INFO = new TextEncoder().encode("covclaimd/preimage/v1");
1302
1360
  async function sealClaimPacket(input) {
1303
1361
  return sealWithEntropy(
@@ -1313,7 +1371,7 @@ async function sealWithEntropy(input, ephemeralKey, nonce) {
1313
1371
  }
1314
1372
  const ephemeralPub = import_secp256k1.secp256k1.getPublicKey(ephemeralKey, true);
1315
1373
  const sharedX = import_secp256k1.secp256k1.getSharedSecret(ephemeralKey, input.covclaimdPubkey, true).subarray(1);
1316
- const key = (0, import_hkdf.hkdf)(import_sha22.sha256, sharedX, ephemeralPub, HKDF_INFO, 32);
1374
+ const key = (0, import_hkdf.hkdf)(import_sha23.sha256, sharedX, ephemeralPub, HKDF_INFO, 32);
1317
1375
  if (nonce.length !== 12) throw new Error("nonce must be 12 bytes");
1318
1376
  const aesKey = await crypto.subtle.importKey("raw", key, "AES-GCM", false, [
1319
1377
  "encrypt"
@@ -1338,7 +1396,7 @@ async function sealWithEntropy(input, ephemeralKey, nonce) {
1338
1396
 
1339
1397
  // src/lockupContract.ts
1340
1398
  var import_base7 = require("@scure/base");
1341
- var import_sdk6 = require("@arkade-os/sdk");
1399
+ var import_sdk7 = require("@arkade-os/sdk");
1342
1400
  var SWAP_LOCKUP_CONTRACT_TYPE = "vhtlc-v2";
1343
1401
  var SWAP_LOCKUP_CONTRACT_LABEL = "Arkade RFQ swap lockup";
1344
1402
  var SWAP_LOCKUP_CONTRACT_KIND = "rfq-swap-lockup";
@@ -1360,7 +1418,7 @@ async function registerLockupContract(contracts, script, address) {
1360
1418
  try {
1361
1419
  await contracts.createContract({
1362
1420
  type: SWAP_LOCKUP_CONTRACT_TYPE,
1363
- params: import_sdk6.VHTLCV2ContractHandler.serializeParams(script.options),
1421
+ params: import_sdk7.VHTLCV2ContractHandler.serializeParams(script.options),
1364
1422
  script: import_base7.hex.encode(script.pkScript),
1365
1423
  address,
1366
1424
  label: SWAP_LOCKUP_CONTRACT_LABEL,
@@ -1622,27 +1680,28 @@ var relayTransport = (relayUrl, options) => {
1622
1680
  };
1623
1681
  };
1624
1682
  var SEQUENCE_GRANULARITY_SECONDS = 512;
1683
+ var SOLO_REFUND_HEADROOM_SECONDS = 8 * SEQUENCE_GRANULARITY_SECONDS;
1625
1684
  var unilateralClaimDelay = (serverExitDelaySeconds) => {
1626
1685
  if (!Number.isFinite(serverExitDelaySeconds) || serverExitDelaySeconds < SEQUENCE_GRANULARITY_SECONDS) {
1627
1686
  throw new Error(
1628
1687
  `server exit delay must be at least ${SEQUENCE_GRANULARITY_SECONDS}s of seconds, got ${serverExitDelaySeconds}`
1629
1688
  );
1630
1689
  }
1631
- if (serverExitDelaySeconds > (65535 - 2) * SEQUENCE_GRANULARITY_SECONDS) {
1690
+ if (serverExitDelaySeconds > 65535 * SEQUENCE_GRANULARITY_SECONDS - SOLO_REFUND_HEADROOM_SECONDS) {
1632
1691
  throw new Error(
1633
- `server exit delay ${serverExitDelaySeconds}s exceeds what BIP68 can encode once the two refund tiers are stacked above it`
1692
+ `server exit delay ${serverExitDelaySeconds}s exceeds what BIP68 can encode once the solo refund's headroom is stacked above it`
1634
1693
  );
1635
1694
  }
1636
1695
  return Math.ceil(serverExitDelaySeconds / SEQUENCE_GRANULARITY_SECONDS) * SEQUENCE_GRANULARITY_SECONDS;
1637
1696
  };
1638
- var unilateralRefundDelay = (claimDelay) => claimDelay + SEQUENCE_GRANULARITY_SECONDS;
1639
- var unilateralRefundWithoutReceiverDelay = (claimDelay) => claimDelay + 2 * SEQUENCE_GRANULARITY_SECONDS;
1697
+ var unilateralRefundDelay = (claimDelay) => claimDelay;
1698
+ var unilateralRefundWithoutReceiverDelay = (claimDelay) => claimDelay + SOLO_REFUND_HEADROOM_SECONDS;
1640
1699
  function lightningSendVtxoScript(params) {
1641
1700
  const seconds = (value) => ({
1642
1701
  type: "seconds",
1643
1702
  value: BigInt(value)
1644
1703
  });
1645
- return new import_sdk7.VHTLC.ScriptV2({
1704
+ return new import_sdk8.VHTLC.ScriptV2({
1646
1705
  sender: params.senderPubkey,
1647
1706
  receiver: params.solverPubkey,
1648
1707
  server: params.serverPubkey,
@@ -1665,10 +1724,10 @@ function lightningSendVtxoScript(params) {
1665
1724
  }
1666
1725
  async function requestLightningSend(wallet, arkServerUrl, transport, params) {
1667
1726
  const rfqId = params.rfqId ?? newRfqId();
1668
- const secrets = await (0, import_sdk8.provisionRefundKey)(wallet);
1727
+ const secrets = await (0, import_sdk9.provisionRefundKey)(wallet);
1669
1728
  const senderPubkey = secrets.pubkey;
1670
1729
  const [info, refundAddress] = await Promise.all([
1671
- new import_sdk7.RestArkProvider(arkServerUrl).getInfo(),
1730
+ new import_sdk8.RestArkProvider(arkServerUrl).getInfo(),
1672
1731
  wallet.getAddress()
1673
1732
  ]);
1674
1733
  const quote = await transport.requestQuote(
@@ -1692,7 +1751,7 @@ async function requestLightningSend(wallet, arkServerUrl, transport, params) {
1692
1751
  );
1693
1752
  }
1694
1753
  const serverPubkey = xOnly(import_base8.hex.decode(info.signerPubkey), "ark signer key");
1695
- const network = (0, import_sdk7.getNetwork)(info.network);
1754
+ const network = (0, import_sdk8.getNetwork)(info.network);
1696
1755
  const script = lightningSendVtxoScript({
1697
1756
  solverPubkey: xOnly(import_base8.hex.decode(quote.solver_pubkey), "solver key"),
1698
1757
  refundLocktime: quote.refund_locktime,
@@ -1700,12 +1759,12 @@ async function requestLightningSend(wallet, arkServerUrl, transport, params) {
1700
1759
  paymentHash: params.invoice.paymentHash,
1701
1760
  claimDelay: unilateralClaimDelay(Number(info.unilateralExitDelay)),
1702
1761
  emulatorPubkey: xOnly(
1703
- import_base8.hex.decode((0, import_sdk7.resolveEmulatorPubkey)(network, params.emulatorPubkey)),
1762
+ import_base8.hex.decode((0, import_sdk8.resolveEmulatorPubkey)(network, params.emulatorPubkey)),
1704
1763
  "emulator signer key"
1705
1764
  ),
1706
1765
  senderPubkey,
1707
1766
  receiverPkScript: solverHex(receiverPkScriptHex, "profile.receiver_pk_script"),
1708
- refundPkScript: import_sdk7.ArkAddress.decode(refundAddress).pkScript
1767
+ refundPkScript: import_sdk8.ArkAddress.decode(refundAddress).pkScript
1709
1768
  });
1710
1769
  const address = script.address(network.hrp, serverPubkey).encode();
1711
1770
  verifyLockupAddress(quote, address);
@@ -1800,7 +1859,7 @@ function deriveOnchainSend(input) {
1800
1859
  emulatorPubkey: input.emulatorPubkey,
1801
1860
  senderPubkey: input.senderPubkey,
1802
1861
  receiverPkScript: solverHex(receiverPkScriptHex, "profile.receiver_pk_script"),
1803
- refundPkScript: import_sdk7.ArkAddress.decode(input.refundAddress).pkScript
1862
+ refundPkScript: import_sdk8.ArkAddress.decode(input.refundAddress).pkScript
1804
1863
  });
1805
1864
  const address = script.address(input.hrp, input.serverPubkey).encode();
1806
1865
  verifyLockupAddress(quote, address);
@@ -1826,7 +1885,7 @@ function deriveOnchainSend(input) {
1826
1885
  }
1827
1886
  async function requestOnchainSend(wallet, arkServerUrl, transport, params) {
1828
1887
  const rfqId = params.rfqId ?? newRfqId();
1829
- const secrets = await (0, import_sdk8.provisionClaimSecret)(wallet, { preimage: params.preimage });
1888
+ const secrets = await (0, import_sdk9.provisionClaimSecret)(wallet, { preimage: params.preimage });
1830
1889
  if (secrets.mustPersistPreimage) {
1831
1890
  console.warn(
1832
1891
  "[swap] this swap's preimage cannot be re-derived from the seed and MUST be persisted with the record before funding"
@@ -1835,7 +1894,7 @@ async function requestOnchainSend(wallet, arkServerUrl, transport, params) {
1835
1894
  const paymentHash = import_base8.hex.encode(secrets.paymentHash);
1836
1895
  const senderPubkey = secrets.pubkey;
1837
1896
  const [info, refundAddress] = await Promise.all([
1838
- new import_sdk7.RestArkProvider(arkServerUrl).getInfo(),
1897
+ new import_sdk8.RestArkProvider(arkServerUrl).getInfo(),
1839
1898
  wallet.getAddress()
1840
1899
  ]);
1841
1900
  const quote = await transport.requestQuote(
@@ -1849,14 +1908,14 @@ async function requestOnchainSend(wallet, arkServerUrl, transport, params) {
1849
1908
  amountSide: params.amountSide
1850
1909
  })
1851
1910
  );
1852
- const network = (0, import_sdk7.getNetwork)(info.network);
1911
+ const network = (0, import_sdk8.getNetwork)(info.network);
1853
1912
  const derived = deriveOnchainSend({
1854
1913
  quote,
1855
1914
  paymentHash,
1856
1915
  payoutPubkey: params.payoutPubkey,
1857
1916
  serverPubkey: xOnly(import_base8.hex.decode(info.signerPubkey), "ark signer key"),
1858
1917
  emulatorPubkey: xOnly(
1859
- import_base8.hex.decode((0, import_sdk7.resolveEmulatorPubkey)(network, params.emulatorPubkey)),
1918
+ import_base8.hex.decode((0, import_sdk8.resolveEmulatorPubkey)(network, params.emulatorPubkey)),
1860
1919
  "emulator signer key"
1861
1920
  ),
1862
1921
  claimDelay: unilateralClaimDelay(Number(info.unilateralExitDelay)),
@@ -1964,7 +2023,7 @@ function receiveVtxoScript(params) {
1964
2023
  type: "seconds",
1965
2024
  value: BigInt(value)
1966
2025
  });
1967
- return new import_sdk7.VHTLC.ScriptV2({
2026
+ return new import_sdk8.VHTLC.ScriptV2({
1968
2027
  sender: params.solverPubkey,
1969
2028
  receiver: params.payoutPubkey,
1970
2029
  server: params.serverPubkey,
@@ -2003,7 +2062,7 @@ function deriveLightningReceive(input) {
2003
2062
  emulatorPubkey: input.emulatorPubkey,
2004
2063
  solverRefundPkScript: solverHex(solverRefundPkScriptHex, "profile.solver_refund_pk_script"),
2005
2064
  payoutPubkey: input.payoutPubkey,
2006
- payoutPkScript: import_sdk7.ArkAddress.decode(input.payoutAddress).pkScript
2065
+ payoutPkScript: import_sdk8.ArkAddress.decode(input.payoutAddress).pkScript
2007
2066
  });
2008
2067
  const address = script.address(input.hrp, input.serverPubkey).encode();
2009
2068
  verifyLockupAddress(quote, address);
@@ -2011,7 +2070,7 @@ function deriveLightningReceive(input) {
2011
2070
  }
2012
2071
  async function requestLightningReceive(wallet, arkServerUrl, transport, params) {
2013
2072
  const rfqId = params.rfqId ?? newRfqId();
2014
- const secrets = await (0, import_sdk8.provisionClaimSecret)(wallet);
2073
+ const secrets = await (0, import_sdk9.provisionClaimSecret)(wallet);
2015
2074
  if (secrets.mustPersistPreimage) {
2016
2075
  console.warn(
2017
2076
  "[swap] this swap's preimage cannot be re-derived from the seed and MUST be persisted with the record before paying"
@@ -2021,7 +2080,7 @@ async function requestLightningReceive(wallet, arkServerUrl, transport, params)
2021
2080
  const paymentHash = import_base8.hex.encode(secrets.paymentHash);
2022
2081
  const payoutPubkey = secrets.pubkey;
2023
2082
  const [info, payoutAddress] = await Promise.all([
2024
- new import_sdk7.RestArkProvider(arkServerUrl).getInfo(),
2083
+ new import_sdk8.RestArkProvider(arkServerUrl).getInfo(),
2025
2084
  wallet.getAddress()
2026
2085
  ]);
2027
2086
  const claimPacket = await sealClaimPacket({
@@ -2040,7 +2099,7 @@ async function requestLightningReceive(wallet, arkServerUrl, transport, params)
2040
2099
  })
2041
2100
  );
2042
2101
  assertQuotedAmount(quote, params.amountSide, params.amount);
2043
- const network = (0, import_sdk7.getNetwork)(info.network);
2102
+ const network = (0, import_sdk8.getNetwork)(info.network);
2044
2103
  const derived = deriveLightningReceive({
2045
2104
  quote,
2046
2105
  paymentHash,
@@ -2048,7 +2107,7 @@ async function requestLightningReceive(wallet, arkServerUrl, transport, params)
2048
2107
  payoutAddress,
2049
2108
  serverPubkey: xOnly(import_base8.hex.decode(info.signerPubkey), "ark signer key"),
2050
2109
  emulatorPubkey: xOnly(
2051
- import_base8.hex.decode((0, import_sdk7.resolveEmulatorPubkey)(network, params.emulatorPubkey)),
2110
+ import_base8.hex.decode((0, import_sdk8.resolveEmulatorPubkey)(network, params.emulatorPubkey)),
2052
2111
  "emulator signer key"
2053
2112
  ),
2054
2113
  claimDelay: unilateralClaimDelay(Number(info.unilateralExitDelay)),
@@ -2103,7 +2162,7 @@ function deriveOnchainReceive(input) {
2103
2162
  emulatorPubkey: input.emulatorPubkey,
2104
2163
  solverRefundPkScript: solverHex(solverRefundPkScriptHex, "profile.solver_refund_pk_script"),
2105
2164
  payoutPubkey: input.payoutPubkey,
2106
- payoutPkScript: import_sdk7.ArkAddress.decode(input.payoutAddress).pkScript
2165
+ payoutPkScript: import_sdk8.ArkAddress.decode(input.payoutAddress).pkScript
2107
2166
  });
2108
2167
  const address = script.address(input.hrp, input.serverPubkey).encode();
2109
2168
  verifyLockupAddress(quote, address);
@@ -2129,7 +2188,7 @@ function deriveOnchainReceive(input) {
2129
2188
  }
2130
2189
  async function requestOnchainReceive(wallet, arkServerUrl, transport, params) {
2131
2190
  const rfqId = params.rfqId ?? newRfqId();
2132
- const secrets = await (0, import_sdk8.provisionClaimSecret)(wallet);
2191
+ const secrets = await (0, import_sdk9.provisionClaimSecret)(wallet);
2133
2192
  if (secrets.mustPersistPreimage) {
2134
2193
  console.warn(
2135
2194
  "[swap] this swap's preimage cannot be re-derived from the seed and MUST be persisted with the record before funding"
@@ -2139,7 +2198,7 @@ async function requestOnchainReceive(wallet, arkServerUrl, transport, params) {
2139
2198
  const paymentHash = import_base8.hex.encode(secrets.paymentHash);
2140
2199
  const payoutPubkey = secrets.pubkey;
2141
2200
  const [info, payoutAddress] = await Promise.all([
2142
- new import_sdk7.RestArkProvider(arkServerUrl).getInfo(),
2201
+ new import_sdk8.RestArkProvider(arkServerUrl).getInfo(),
2143
2202
  wallet.getAddress()
2144
2203
  ]);
2145
2204
  const claimPacket = await sealClaimPacket({
@@ -2159,7 +2218,7 @@ async function requestOnchainReceive(wallet, arkServerUrl, transport, params) {
2159
2218
  })
2160
2219
  );
2161
2220
  assertQuotedAmount(quote, params.amountSide, params.amount);
2162
- const network = (0, import_sdk7.getNetwork)(info.network);
2221
+ const network = (0, import_sdk8.getNetwork)(info.network);
2163
2222
  const derived = deriveOnchainReceive({
2164
2223
  quote,
2165
2224
  paymentHash,
@@ -2168,7 +2227,7 @@ async function requestOnchainReceive(wallet, arkServerUrl, transport, params) {
2168
2227
  refundPubkey: params.refundPubkey,
2169
2228
  serverPubkey: xOnly(import_base8.hex.decode(info.signerPubkey), "ark signer key"),
2170
2229
  emulatorPubkey: xOnly(
2171
- import_base8.hex.decode((0, import_sdk7.resolveEmulatorPubkey)(network, params.emulatorPubkey)),
2230
+ import_base8.hex.decode((0, import_sdk8.resolveEmulatorPubkey)(network, params.emulatorPubkey)),
2172
2231
  "emulator signer key"
2173
2232
  ),
2174
2233
  claimDelay: unilateralClaimDelay(Number(info.unilateralExitDelay)),
@@ -2207,13 +2266,13 @@ async function requestOnchainReceive(wallet, arkServerUrl, transport, params) {
2207
2266
  // src/claim.ts
2208
2267
  var import_base10 = require("@scure/base");
2209
2268
  var import_legacy3 = require("@noble/hashes/legacy.js");
2210
- var import_sha24 = require("@noble/hashes/sha2.js");
2211
- var import_sdk10 = require("@arkade-os/sdk");
2269
+ var import_sha25 = require("@noble/hashes/sha2.js");
2270
+ var import_sdk11 = require("@arkade-os/sdk");
2212
2271
 
2213
2272
  // src/refund.ts
2214
2273
  var import_base9 = require("@scure/base");
2215
- var import_sha23 = require("@noble/hashes/sha2.js");
2216
- var import_sdk9 = require("@arkade-os/sdk");
2274
+ var import_sha24 = require("@noble/hashes/sha2.js");
2275
+ var import_sdk10 = require("@arkade-os/sdk");
2217
2276
  var sleep2 = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
2218
2277
  var isRfqTerminal = (state) => RFQ_TERMINAL_STATES.includes(state);
2219
2278
  var RFQ_RESOLVED_STATES = ["settled", "refunded"];
@@ -2285,9 +2344,9 @@ async function findLockupVtxos(indexer, swapPkScript) {
2285
2344
  }
2286
2345
  return out;
2287
2346
  }
2288
- var hashesTo = (candidate, paymentHash) => import_base9.hex.encode((0, import_sha23.sha256)(candidate)) === paymentHash;
2347
+ var hashesTo = (candidate, paymentHash) => import_base9.hex.encode((0, import_sha24.sha256)(candidate)) === paymentHash;
2289
2348
  var candidateWitnessItems = (tx, inputIndex) => [
2290
- ...(0, import_sdk9.getArkPsbtFields)(tx, inputIndex, import_sdk9.ConditionWitness).flat(),
2349
+ ...(0, import_sdk10.getArkPsbtFields)(tx, inputIndex, import_sdk10.ConditionWitness).flat(),
2291
2350
  ...tx.getInput(inputIndex).finalScriptWitness ?? []
2292
2351
  ];
2293
2352
  async function readLockupFate(indexer, input) {
@@ -2306,7 +2365,7 @@ async function readLockupFate(indexer, input) {
2306
2365
  for (const raw of txs) {
2307
2366
  let tx;
2308
2367
  try {
2309
- tx = import_sdk9.Transaction.fromPSBT(import_base9.base64.decode(raw));
2368
+ tx = import_sdk10.Transaction.fromPSBT(import_base9.base64.decode(raw));
2310
2369
  } catch {
2311
2370
  continue;
2312
2371
  }
@@ -2343,14 +2402,14 @@ async function pushRefundWithoutReceiver(ark, input) {
2343
2402
  const info = await ark.getInfo();
2344
2403
  let serverUnrollScript;
2345
2404
  try {
2346
- serverUnrollScript = import_sdk9.CSVMultisigTapscript.decode(import_base9.hex.decode(info.checkpointTapscript));
2405
+ serverUnrollScript = import_sdk10.CSVMultisigTapscript.decode(import_base9.hex.decode(info.checkpointTapscript));
2347
2406
  } catch {
2348
2407
  throw new Error("invalid checkpointTapscript from the Arkade server");
2349
2408
  }
2350
2409
  const leaf = input.script.refundWithoutReceiver();
2351
2410
  const tapTree = input.script.encode();
2352
2411
  const amount = input.vtxos.reduce((sum, vtxo) => sum + vtxo.value, 0);
2353
- const { arkTx, checkpoints } = (0, import_sdk9.buildOffchainTx)(
2412
+ const { arkTx, checkpoints } = (0, import_sdk10.buildOffchainTx)(
2354
2413
  input.vtxos.map((vtxo) => ({
2355
2414
  txid: vtxo.txid,
2356
2415
  vout: vtxo.vout,
@@ -2366,8 +2425,8 @@ async function pushRefundWithoutReceiver(ark, input) {
2366
2425
  import_base9.base64.encode(signedArkTx.toPSBT()),
2367
2426
  checkpoints.map((c) => import_base9.base64.encode(c.toPSBT()))
2368
2427
  );
2369
- (0, import_sdk9.assertSubmittedArkTxid)(submitted, signedArkTx, "refundWithoutReceiver");
2370
- const matched = (0, import_sdk9.matchServerCheckpoints)(
2428
+ (0, import_sdk10.assertSubmittedArkTxid)(submitted, signedArkTx, "refundWithoutReceiver");
2429
+ const matched = (0, import_sdk10.matchServerCheckpoints)(
2371
2430
  submitted.signedCheckpointTxs,
2372
2431
  checkpoints,
2373
2432
  "refundWithoutReceiver"
@@ -2454,20 +2513,20 @@ async function pushClaim(ark, input) {
2454
2513
  }
2455
2514
  }
2456
2515
  const committed = input.script.options.preimageHash;
2457
- if (import_base10.hex.encode((0, import_legacy3.ripemd160)((0, import_sha24.sha256)(input.preimage))) !== import_base10.hex.encode(committed)) {
2516
+ if (import_base10.hex.encode((0, import_legacy3.ripemd160)((0, import_sha25.sha256)(input.preimage))) !== import_base10.hex.encode(committed)) {
2458
2517
  throw new Error("preimage does not match the covenant's payment hash");
2459
2518
  }
2460
2519
  const info = await ark.getInfo();
2461
2520
  let serverUnrollScript;
2462
2521
  try {
2463
- serverUnrollScript = import_sdk10.CSVMultisigTapscript.decode(import_base10.hex.decode(info.checkpointTapscript));
2522
+ serverUnrollScript = import_sdk11.CSVMultisigTapscript.decode(import_base10.hex.decode(info.checkpointTapscript));
2464
2523
  } catch {
2465
2524
  throw new Error("invalid checkpointTapscript from the Arkade server");
2466
2525
  }
2467
2526
  const leaf = input.script.claim();
2468
2527
  const tapTree = input.script.encode();
2469
- const arkTxid = await (0, import_sdk10.signAndSubmitOffchainTx)({
2470
- identity: (0, import_sdk10.claimWithPreimageIdentity)(input.receiver, input.preimage),
2528
+ const arkTxid = await (0, import_sdk11.signAndSubmitOffchainTx)({
2529
+ identity: (0, import_sdk11.claimWithPreimageIdentity)(input.receiver, input.preimage),
2471
2530
  provider: ark,
2472
2531
  inputs: input.vtxos.map((vtxo) => ({
2473
2532
  txid: vtxo.txid,
@@ -2514,7 +2573,7 @@ async function claimReceiveLockup(indexer, ark, input) {
2514
2573
  }
2515
2574
 
2516
2575
  // src/refundBlocked.ts
2517
- var import_sdk11 = require("@arkade-os/sdk");
2576
+ var import_sdk12 = require("@arkade-os/sdk");
2518
2577
  var RefundNotLocallyPossibleError = class extends Error {
2519
2578
  constructor(reason, message, options) {
2520
2579
  super(message, options);
@@ -2531,16 +2590,16 @@ async function senderIdentityForSwapRecord(wallet, record) {
2531
2590
  );
2532
2591
  }
2533
2592
  try {
2534
- return await (0, import_sdk11.contractSigner)(wallet, record.signingDescriptor);
2593
+ return await (0, import_sdk12.contractSigner)(wallet, record.signingDescriptor);
2535
2594
  } catch (cause) {
2536
- if (cause instanceof import_sdk11.WalletCannotSignError) {
2595
+ if (cause instanceof import_sdk12.WalletCannotSignError) {
2537
2596
  throw new RefundNotLocallyPossibleError(
2538
2597
  "unsignable-wallet",
2539
2598
  `this wallet holds ${record.signingDescriptor} but cannot sign with it; attach its signer`,
2540
2599
  { cause }
2541
2600
  );
2542
2601
  }
2543
- if (cause instanceof import_sdk11.ForeignDescriptorError) {
2602
+ if (cause instanceof import_sdk12.ForeignDescriptorError) {
2544
2603
  throw new RefundNotLocallyPossibleError(
2545
2604
  "foreign-descriptor",
2546
2605
  `this wallet cannot derive ${record.signingDescriptor}; the swap was created on another wallet`,
@@ -3342,6 +3401,7 @@ var outpointKey = (vtxo) => `${vtxo.txid}:${vtxo.vout}`;
3342
3401
  ONCHAIN_RECEIVE_PAIR,
3343
3402
  ONCHAIN_SECONDS_PER_BLOCK,
3344
3403
  ONCHAIN_SEND_PAIR,
3404
+ PreimageNotRecoverableError,
3345
3405
  QUOTE_OPTIONS,
3346
3406
  REFUND_MTP_LAG_SECONDS,
3347
3407
  RFQ_RESOLVED_STATES,
@@ -3349,6 +3409,7 @@ var outpointKey = (vtxo) => `${vtxo.txid}:${vtxo.vout}`;
3349
3409
  RFQ_TERMINAL_STATES,
3350
3410
  RefundNotLocallyPossibleError,
3351
3411
  RfqSwapManager,
3412
+ SOLO_REFUND_HEADROOM_SECONDS,
3352
3413
  SWAP_LOCKUP_CONTRACT_KIND,
3353
3414
  SWAP_LOCKUP_CONTRACT_LABEL,
3354
3415
  SWAP_LOCKUP_CONTRACT_TYPE,
@@ -3396,6 +3457,7 @@ var outpointKey = (vtxo) => `${vtxo.txid}:${vtxo.vout}`;
3396
3457
  onchainReceiveRequest,
3397
3458
  onchainSendRequest,
3398
3459
  paymentHashOf,
3460
+ preimageForSwapRecord,
3399
3461
  pushClaim,
3400
3462
  pushRefundWithoutReceiver,
3401
3463
  readLockupFate,