@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/README.md +125 -31
- package/dist/{chunk-DLM6BVTB.js → chunk-Q4FAYBXS.js} +6 -4
- package/dist/index.cjs +155 -93
- package/dist/index.d.cts +106 -25
- package/dist/index.d.ts +106 -25
- package/dist/index.js +67 -8
- package/dist/nostr.cjs +11 -0
- package/dist/nostr.d.cts +14 -2
- package/dist/nostr.d.ts +14 -2
- package/dist/nostr.js +9 -1
- package/dist/{rfq-DjZlesr4.d.cts → rfq-BH2yvo3O.d.cts} +36 -13
- package/dist/{rfq-DjZlesr4.d.ts → rfq-BH2yvo3O.d.ts} +36 -13
- package/package.json +2 -2
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
|
|
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:
|
|
336
|
-
wantBtc:
|
|
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
|
|
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:
|
|
447
|
-
...fields.offerAsset && { 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
|
|
459
|
-
arkade: new
|
|
460
|
-
indexer: new
|
|
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,
|
|
523
|
+
network: (0, import_sdk2.getNetwork)(network),
|
|
466
524
|
contractManager
|
|
467
525
|
});
|
|
468
|
-
const contract = new
|
|
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
|
|
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,
|
|
488
|
-
const network = (0,
|
|
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,
|
|
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:
|
|
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
|
|
525
|
-
arkade: new
|
|
526
|
-
indexer: new
|
|
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 ?
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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,
|
|
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 =
|
|
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
|
|
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 =
|
|
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,
|
|
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,
|
|
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
|
|
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 =
|
|
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,
|
|
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 =
|
|
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
|
|
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 =
|
|
1026
|
-
const indexer = new
|
|
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) =>
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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)(
|
|
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
|
|
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:
|
|
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 >
|
|
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
|
|
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
|
|
1639
|
-
var unilateralRefundWithoutReceiverDelay = (claimDelay) => claimDelay +
|
|
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
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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:
|
|
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:
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
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:
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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:
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
2211
|
-
var
|
|
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
|
|
2216
|
-
var
|
|
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,
|
|
2347
|
+
var hashesTo = (candidate, paymentHash) => import_base9.hex.encode((0, import_sha24.sha256)(candidate)) === paymentHash;
|
|
2289
2348
|
var candidateWitnessItems = (tx, inputIndex) => [
|
|
2290
|
-
...(0,
|
|
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 =
|
|
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 =
|
|
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,
|
|
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,
|
|
2370
|
-
const matched = (0,
|
|
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,
|
|
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 =
|
|
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,
|
|
2470
|
-
identity: (0,
|
|
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
|
|
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,
|
|
2593
|
+
return await (0, import_sdk12.contractSigner)(wallet, record.signingDescriptor);
|
|
2535
2594
|
} catch (cause) {
|
|
2536
|
-
if (cause instanceof
|
|
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
|
|
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,
|