@arkade-os/sdk 0.4.67 → 0.4.69
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 +38 -0
- package/dist/adapters/expo.cjs +5 -5
- package/dist/adapters/expo.d.cts +2 -2
- package/dist/adapters/expo.d.ts +2 -2
- package/dist/adapters/expo.js +3 -3
- package/dist/adapters/indexedDB.cjs +5 -5
- package/dist/adapters/indexedDB.js +4 -4
- package/dist/{asyncStorageTaskQueue-Za-e_zMk.d.ts → asyncStorageTaskQueue-BgUJN-3X.d.ts} +2 -2
- package/dist/{asyncStorageTaskQueue-LTpeXYaD.d.cts → asyncStorageTaskQueue-Cstx6hS7.d.cts} +2 -2
- package/dist/{chunk-6TAQF6EV.js → chunk-2PPL3O7Z.js} +72 -120
- package/dist/chunk-2PPL3O7Z.js.map +1 -0
- package/dist/{chunk-2JV4VQ7C.cjs → chunk-5MLC2HU3.cjs} +17 -3
- package/dist/chunk-5MLC2HU3.cjs.map +1 -0
- package/dist/{chunk-MJUTO3PY.cjs → chunk-EBYCTLET.cjs} +832 -488
- package/dist/chunk-EBYCTLET.cjs.map +1 -0
- package/dist/{chunk-CO3KKSWM.cjs → chunk-GVHUHTRH.cjs} +17 -17
- package/dist/{chunk-CO3KKSWM.cjs.map → chunk-GVHUHTRH.cjs.map} +1 -1
- package/dist/{chunk-YDRZDZPP.cjs → chunk-HQ4DMGA4.cjs} +10 -10
- package/dist/{chunk-YDRZDZPP.cjs.map → chunk-HQ4DMGA4.cjs.map} +1 -1
- package/dist/{chunk-3WIWNE4P.js → chunk-L5SCQYHF.js} +16 -4
- package/dist/chunk-L5SCQYHF.js.map +1 -0
- package/dist/{chunk-MZFUZUTQ.js → chunk-MNMPGEK2.js} +4 -4
- package/dist/{chunk-MZFUZUTQ.js.map → chunk-MNMPGEK2.js.map} +1 -1
- package/dist/{chunk-AEWJU6NZ.js → chunk-TA7XLEP2.js} +411 -68
- package/dist/chunk-TA7XLEP2.js.map +1 -0
- package/dist/{chunk-OIZ2V2VD.cjs → chunk-WIFL5QYZ.cjs} +118 -166
- package/dist/chunk-WIFL5QYZ.cjs.map +1 -0
- package/dist/{chunk-EALWOVHK.js → chunk-XLWDX7QZ.js} +4 -4
- package/dist/{chunk-EALWOVHK.js.map → chunk-XLWDX7QZ.js.map} +1 -1
- package/dist/{chunk-R2YAMONM.cjs → chunk-XQPN5YP2.cjs} +17 -17
- package/dist/{chunk-R2YAMONM.cjs.map → chunk-XQPN5YP2.cjs.map} +1 -1
- package/dist/{chunk-X3VEMUVV.js → chunk-YG7T6LI3.js} +3 -3
- package/dist/{chunk-X3VEMUVV.js.map → chunk-YG7T6LI3.js.map} +1 -1
- package/dist/contracts/handlers/index.cjs +9 -9
- package/dist/contracts/handlers/index.d.cts +3 -3
- package/dist/contracts/handlers/index.d.ts +3 -3
- package/dist/contracts/handlers/index.js +2 -2
- package/dist/{delegate-cdmzb2f9.d.ts → delegate-BPdzTbwN.d.ts} +1 -1
- package/dist/{delegate-Bz2e2zXY.d.cts → delegate-DrwIar11.d.cts} +1 -1
- package/dist/{hdWalletCapable-Hi12xjCJ.d.ts → hdWalletCapable-D4WH35z0.d.cts} +49 -5
- package/dist/{hdWalletCapable-BSjuUYOO.d.cts → hdWalletCapable-DyxCiNVE.d.ts} +49 -5
- package/dist/{index-BiACuWaf.d.ts → index-BqhpAqqj.d.cts} +96 -119
- package/dist/{index-D2GjZxBr.d.cts → index-TZJvbIaA.d.ts} +96 -119
- package/dist/{index-DU5o_hz7.d.cts → index-dWRqYSdS.d.cts} +70 -2
- package/dist/{index-DU5o_hz7.d.ts → index-dWRqYSdS.d.ts} +70 -2
- package/dist/index.cjs +297 -289
- package/dist/index.d.cts +29 -8
- package/dist/index.d.ts +29 -8
- package/dist/index.js +4 -4
- package/dist/repositories/realm/index.cjs +19 -19
- package/dist/repositories/realm/index.d.cts +2 -2
- package/dist/repositories/realm/index.d.ts +2 -2
- package/dist/repositories/realm/index.js +5 -5
- package/dist/repositories/sqlite/index.cjs +18 -18
- package/dist/repositories/sqlite/index.d.cts +2 -2
- package/dist/repositories/sqlite/index.d.ts +2 -2
- package/dist/repositories/sqlite/index.js +5 -5
- package/dist/{taskRunner-BZJMLQ6g.d.cts → taskRunner-CzYKyJ9c.d.cts} +2 -2
- package/dist/{taskRunner-DATaRQus.d.ts → taskRunner-D2fnbqYw.d.ts} +2 -2
- package/dist/wallet/expo/background.cjs +14 -14
- package/dist/wallet/expo/background.d.cts +3 -3
- package/dist/wallet/expo/background.d.ts +3 -3
- package/dist/wallet/expo/background.js +6 -6
- package/dist/wallet/expo/index.cjs +14 -14
- package/dist/wallet/expo/index.d.cts +4 -4
- package/dist/wallet/expo/index.d.ts +4 -4
- package/dist/wallet/expo/index.js +5 -5
- package/dist/worker/expo/index.cjs +9 -9
- package/dist/worker/expo/index.d.cts +4 -4
- package/dist/worker/expo/index.d.ts +4 -4
- package/dist/worker/expo/index.js +5 -5
- package/package.json +1 -1
- package/dist/chunk-2JV4VQ7C.cjs.map +0 -1
- package/dist/chunk-3WIWNE4P.js.map +0 -1
- package/dist/chunk-6TAQF6EV.js.map +0 -1
- package/dist/chunk-AEWJU6NZ.js.map +0 -1
- package/dist/chunk-MJUTO3PY.cjs.map +0 -1
- package/dist/chunk-OIZ2V2VD.cjs.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var chunkGVHUHTRH_cjs = require('./chunk-GVHUHTRH.cjs');
|
|
4
|
+
var chunkWIFL5QYZ_cjs = require('./chunk-WIFL5QYZ.cjs');
|
|
5
|
+
var chunk5MLC2HU3_cjs = require('./chunk-5MLC2HU3.cjs');
|
|
6
6
|
var chunk5BLDMQED_cjs = require('./chunk-5BLDMQED.cjs');
|
|
7
7
|
var utils_js = require('@scure/btc-signer/utils.js');
|
|
8
8
|
var btcSigner = require('@scure/btc-signer');
|
|
@@ -188,7 +188,7 @@ var TreeSignerSession = class _TreeSignerSession {
|
|
|
188
188
|
noncesByPubkey.set(base.hex.encode(myPublicKey.subarray(1)), myNonce);
|
|
189
189
|
const tx = this.graph.find(txid);
|
|
190
190
|
if (!tx) throw new Error(`missing tx for txid ${txid}`);
|
|
191
|
-
const cosigners =
|
|
191
|
+
const cosigners = chunk5MLC2HU3_cjs.getArkPsbtFields(tx.root, 0, chunk5MLC2HU3_cjs.CosignerPublicKey).map(
|
|
192
192
|
(c) => base.hex.encode(c.key.subarray(1))
|
|
193
193
|
// xonly pubkey
|
|
194
194
|
);
|
|
@@ -240,7 +240,7 @@ var TreeSignerSession = class _TreeSignerSession {
|
|
|
240
240
|
if (!aggNonce) throw new Error("missing aggregate nonce");
|
|
241
241
|
const prevoutAmounts = [];
|
|
242
242
|
const prevoutScripts = [];
|
|
243
|
-
const cosigners =
|
|
243
|
+
const cosigners = chunk5MLC2HU3_cjs.getArkPsbtFields(g.root, 0, chunk5MLC2HU3_cjs.CosignerPublicKey).map((c) => c.key);
|
|
244
244
|
const { finalKey } = aggregateKeys(cosigners, true, {
|
|
245
245
|
taprootTweak: this.scriptRoot
|
|
246
246
|
});
|
|
@@ -294,7 +294,7 @@ function getPrevOutput(finalKey, graph, sharedOutputAmount, tx) {
|
|
|
294
294
|
script: pkScript
|
|
295
295
|
};
|
|
296
296
|
}
|
|
297
|
-
var
|
|
297
|
+
var ALLOWED_SIGHASH = [btcSigner.SigHash.DEFAULT, btcSigner.SigHash.ALL, btcSigner.SigHash.ALL_ANYONECANPAY];
|
|
298
298
|
var SingleKey = class _SingleKey {
|
|
299
299
|
key;
|
|
300
300
|
constructor(key) {
|
|
@@ -323,8 +323,9 @@ var SingleKey = class _SingleKey {
|
|
|
323
323
|
async sign(tx, inputIndexes) {
|
|
324
324
|
const txCpy = tx.clone();
|
|
325
325
|
if (!inputIndexes) {
|
|
326
|
+
chunk5MLC2HU3_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH);
|
|
326
327
|
try {
|
|
327
|
-
if (!txCpy.sign(this.key,
|
|
328
|
+
if (!txCpy.sign(this.key, ALLOWED_SIGHASH)) {
|
|
328
329
|
throw new Error("Failed to sign transaction");
|
|
329
330
|
}
|
|
330
331
|
} catch (e) {
|
|
@@ -335,7 +336,7 @@ var SingleKey = class _SingleKey {
|
|
|
335
336
|
return txCpy;
|
|
336
337
|
}
|
|
337
338
|
for (const inputIndex of inputIndexes) {
|
|
338
|
-
if (!txCpy.signIdx(this.key, inputIndex,
|
|
339
|
+
if (!txCpy.signIdx(this.key, inputIndex, ALLOWED_SIGHASH)) {
|
|
339
340
|
throw new Error(`Failed to sign input #${inputIndex}`);
|
|
340
341
|
}
|
|
341
342
|
}
|
|
@@ -400,7 +401,7 @@ var ReadonlySingleKey = class _ReadonlySingleKey {
|
|
|
400
401
|
return Promise.resolve(this.publicKey);
|
|
401
402
|
}
|
|
402
403
|
};
|
|
403
|
-
var
|
|
404
|
+
var ALLOWED_SIGHASH2 = [btcSigner.SigHash.DEFAULT, btcSigner.SigHash.ALL, btcSigner.SigHash.ALL_ANYONECANPAY];
|
|
404
405
|
var seedBytes = /* @__PURE__ */ new WeakMap();
|
|
405
406
|
var mnemonicMeta = /* @__PURE__ */ new WeakMap();
|
|
406
407
|
var SeedIdentity = class _SeedIdentity {
|
|
@@ -431,7 +432,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
431
432
|
let network;
|
|
432
433
|
if ("descriptor" in opts && typeof opts.descriptor === "string") {
|
|
433
434
|
descriptor = opts.descriptor;
|
|
434
|
-
network =
|
|
435
|
+
network = chunkWIFL5QYZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
435
436
|
} else {
|
|
436
437
|
network = opts.isMainnet ?? true ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
437
438
|
descriptor = descriptorsScure.scriptExpressions.trBIP32({
|
|
@@ -529,7 +530,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
529
530
|
* `StaticDescriptorProvider` for legacy single-key wallets.
|
|
530
531
|
*/
|
|
531
532
|
isOurs(descriptor) {
|
|
532
|
-
return
|
|
533
|
+
return chunkWIFL5QYZ_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
|
|
533
534
|
}
|
|
534
535
|
/**
|
|
535
536
|
* Signs each request with the key derived from its descriptor.
|
|
@@ -578,7 +579,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
578
579
|
}
|
|
579
580
|
// ── internal helpers ─────────────────────────────────────────────
|
|
580
581
|
derivePrivateKeyForDescriptor(descriptor) {
|
|
581
|
-
const network =
|
|
582
|
+
const network = chunkWIFL5QYZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
582
583
|
const expansion = descriptorsScure.expand({ descriptor, network });
|
|
583
584
|
if (expansion.isRanged) {
|
|
584
585
|
throw new Error(
|
|
@@ -603,8 +604,9 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
603
604
|
signTxWithKey(tx, key, inputIndexes) {
|
|
604
605
|
const txCpy = tx.clone();
|
|
605
606
|
if (!inputIndexes) {
|
|
607
|
+
chunk5MLC2HU3_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH2);
|
|
606
608
|
try {
|
|
607
|
-
if (!txCpy.sign(key,
|
|
609
|
+
if (!txCpy.sign(key, ALLOWED_SIGHASH2)) {
|
|
608
610
|
throw new Error("Failed to sign transaction");
|
|
609
611
|
}
|
|
610
612
|
} catch (e) {
|
|
@@ -614,7 +616,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
614
616
|
}
|
|
615
617
|
} else {
|
|
616
618
|
for (const idx of inputIndexes) {
|
|
617
|
-
if (!txCpy.signIdx(key, idx,
|
|
619
|
+
if (!txCpy.signIdx(key, idx, ALLOWED_SIGHASH2)) {
|
|
618
620
|
throw new Error(`Failed to sign input #${idx}`);
|
|
619
621
|
}
|
|
620
622
|
}
|
|
@@ -664,7 +666,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
|
|
|
664
666
|
*/
|
|
665
667
|
descriptor;
|
|
666
668
|
constructor(descriptor) {
|
|
667
|
-
const network =
|
|
669
|
+
const network = chunkWIFL5QYZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
668
670
|
let expansion;
|
|
669
671
|
try {
|
|
670
672
|
expansion = descriptorsScure.expand({ descriptor, network, index: 0 });
|
|
@@ -714,7 +716,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
|
|
|
714
716
|
* `StaticDescriptorProvider` for legacy single-key wallets.
|
|
715
717
|
*/
|
|
716
718
|
isOurs(descriptor) {
|
|
717
|
-
return
|
|
719
|
+
return chunkWIFL5QYZ_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
|
|
718
720
|
}
|
|
719
721
|
};
|
|
720
722
|
function serializeSeedOwnedSigningIdentity(identity) {
|
|
@@ -876,10 +878,10 @@ var DescriptorIdentity = class {
|
|
|
876
878
|
this.base = base;
|
|
877
879
|
}
|
|
878
880
|
async xOnlyPublicKey() {
|
|
879
|
-
return
|
|
881
|
+
return chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(this.descriptor);
|
|
880
882
|
}
|
|
881
883
|
async compressedPublicKey() {
|
|
882
|
-
return
|
|
884
|
+
return chunkWIFL5QYZ_cjs.deriveDescriptorLeafCompressedPubKey(this.descriptor);
|
|
883
885
|
}
|
|
884
886
|
async sign(tx, inputIndexes) {
|
|
885
887
|
const [signed] = await this.signer.signWithDescriptor([
|
|
@@ -947,12 +949,12 @@ var WalletCannotAllocateAddressError = class extends Error {
|
|
|
947
949
|
};
|
|
948
950
|
async function resolveDescriptorSigner(descriptor, identity, provider) {
|
|
949
951
|
const owner = provider?.isOurs(descriptor) ? provider : isHDCapableIdentity(identity) && identity.isOurs(descriptor) ? identity : void 0;
|
|
950
|
-
if (owner &&
|
|
952
|
+
if (owner && chunkWIFL5QYZ_cjs.parseHDDescriptor(descriptor)) {
|
|
951
953
|
return new DescriptorIdentity({ descriptor, signer: owner, base: identity });
|
|
952
954
|
}
|
|
953
955
|
let key;
|
|
954
956
|
try {
|
|
955
|
-
key =
|
|
957
|
+
key = chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
956
958
|
} catch {
|
|
957
959
|
throw new ForeignDescriptorError(descriptor);
|
|
958
960
|
}
|
|
@@ -1327,14 +1329,14 @@ function buildSaltedPreimageMessage(xonly, salt) {
|
|
|
1327
1329
|
}
|
|
1328
1330
|
var PREIMAGE_INDEX = 0;
|
|
1329
1331
|
function isPerArtifactDescriptor(descriptor) {
|
|
1330
|
-
return
|
|
1332
|
+
return chunkWIFL5QYZ_cjs.parseHDDescriptor(descriptor) !== null;
|
|
1331
1333
|
}
|
|
1332
1334
|
async function provisionDescriptor(wallet) {
|
|
1333
1335
|
const allocated = isHDAllocationCapable(wallet) ? await wallet.getNextSigningDescriptor() : void 0;
|
|
1334
|
-
return allocated ?? await
|
|
1336
|
+
return allocated ?? await chunkWIFL5QYZ_cjs.identityDescriptor(wallet.identity);
|
|
1335
1337
|
}
|
|
1336
1338
|
async function provisionRefundKey(wallet) {
|
|
1337
|
-
const descriptor = await
|
|
1339
|
+
const descriptor = await chunkWIFL5QYZ_cjs.identityDescriptor(wallet.identity);
|
|
1338
1340
|
const signer = await contractSigner(wallet, descriptor);
|
|
1339
1341
|
const pubkey = await signer.xOnlyPublicKey();
|
|
1340
1342
|
const identityPubkey = await wallet.identity.xOnlyPublicKey();
|
|
@@ -1344,7 +1346,7 @@ async function provisionRefundKey(wallet) {
|
|
|
1344
1346
|
);
|
|
1345
1347
|
}
|
|
1346
1348
|
const address = await wallet.getAddress();
|
|
1347
|
-
const { pkScript } =
|
|
1349
|
+
const { pkScript } = chunk5MLC2HU3_cjs.ArkAddress.decode(address);
|
|
1348
1350
|
return { descriptor, pubkey, pkScript, address };
|
|
1349
1351
|
}
|
|
1350
1352
|
async function provisionClaimSecret(wallet, opts = {}) {
|
|
@@ -1390,7 +1392,7 @@ async function contractSigner(wallet, descriptor) {
|
|
|
1390
1392
|
const signer = isHDWalletCapable(wallet) ? await wallet.signerForDescriptor(descriptor) : wallet.identity;
|
|
1391
1393
|
let expected;
|
|
1392
1394
|
try {
|
|
1393
|
-
expected =
|
|
1395
|
+
expected = chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
1394
1396
|
} catch (cause) {
|
|
1395
1397
|
throw new ForeignDescriptorError(descriptor, { cause });
|
|
1396
1398
|
}
|
|
@@ -1609,14 +1611,14 @@ var RestDelegateProvider = class {
|
|
|
1609
1611
|
*/
|
|
1610
1612
|
async delegate(intent, forfeitTxs, options) {
|
|
1611
1613
|
const url = `${this.url}/v1/delegate`;
|
|
1612
|
-
const response = await
|
|
1614
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(url, {
|
|
1613
1615
|
method: "POST",
|
|
1614
1616
|
headers: {
|
|
1615
1617
|
"Content-Type": "application/json"
|
|
1616
1618
|
},
|
|
1617
1619
|
body: JSON.stringify({
|
|
1618
1620
|
intent: {
|
|
1619
|
-
message:
|
|
1621
|
+
message: chunk5MLC2HU3_cjs.Intent.encodeMessage(intent.message),
|
|
1620
1622
|
proof: intent.proof
|
|
1621
1623
|
},
|
|
1622
1624
|
forfeit_txs: forfeitTxs,
|
|
@@ -1636,7 +1638,7 @@ var RestDelegateProvider = class {
|
|
|
1636
1638
|
*/
|
|
1637
1639
|
async getDelegateInfo() {
|
|
1638
1640
|
const url = `${this.url}/v1/delegator/info`;
|
|
1639
|
-
const response = await
|
|
1641
|
+
const response = await chunk5MLC2HU3_cjs.rateGate.runHttp(url, () => chunk5MLC2HU3_cjs.baseFetch(url));
|
|
1640
1642
|
if (!response.ok) {
|
|
1641
1643
|
const errorText2 = await response.text();
|
|
1642
1644
|
throw new Error(`Failed to get delegate info: ${errorText2}`);
|
|
@@ -1661,7 +1663,7 @@ var ESPLORA_URL = {
|
|
|
1661
1663
|
regtest: "http://localhost:3000/api"
|
|
1662
1664
|
};
|
|
1663
1665
|
var EsploraProvider = class {
|
|
1664
|
-
constructor(baseUrl = ESPLORA_URL[
|
|
1666
|
+
constructor(baseUrl = ESPLORA_URL[chunk5MLC2HU3_cjs.DEFAULT_NETWORK_NAME], opts) {
|
|
1665
1667
|
this.baseUrl = baseUrl;
|
|
1666
1668
|
this.pollingInterval = opts?.pollingInterval ?? 15e3;
|
|
1667
1669
|
this.forcePolling = opts?.forcePolling ?? false;
|
|
@@ -1669,15 +1671,25 @@ var EsploraProvider = class {
|
|
|
1669
1671
|
baseUrl;
|
|
1670
1672
|
pollingInterval;
|
|
1671
1673
|
forcePolling;
|
|
1674
|
+
/**
|
|
1675
|
+
* Live {@link watchAddresses} subscriptions, keyed by their address set.
|
|
1676
|
+
*
|
|
1677
|
+
* Concurrent watchers over the same addresses share one transport, so a
|
|
1678
|
+
* caller that opens watchers in a loop — or leaks them by abandoning
|
|
1679
|
+
* {@link waitForIncomingFunds} — costs one entry in a `Set` rather than
|
|
1680
|
+
* another WebSocket plus another full-history polling loop. Entries are
|
|
1681
|
+
* dropped once their last subscriber stops.
|
|
1682
|
+
*/
|
|
1683
|
+
addressWatches = /* @__PURE__ */ new Map();
|
|
1672
1684
|
async getCoins(address) {
|
|
1673
|
-
const response = await
|
|
1685
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
|
|
1674
1686
|
if (!response.ok) {
|
|
1675
1687
|
throw new Error(`Failed to fetch UTXOs: ${response.statusText}`);
|
|
1676
1688
|
}
|
|
1677
1689
|
return response.json();
|
|
1678
1690
|
}
|
|
1679
1691
|
async getFeeRate() {
|
|
1680
|
-
const response = await
|
|
1692
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
|
|
1681
1693
|
if (response.status === 404) {
|
|
1682
1694
|
return void 0;
|
|
1683
1695
|
}
|
|
@@ -1698,7 +1710,7 @@ var EsploraProvider = class {
|
|
|
1698
1710
|
}
|
|
1699
1711
|
}
|
|
1700
1712
|
async getTxOutspends(txid) {
|
|
1701
|
-
const response = await
|
|
1713
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
|
|
1702
1714
|
if (!response.ok) {
|
|
1703
1715
|
const error = await response.text();
|
|
1704
1716
|
throw new Error(`Failed to get transaction outspends: ${error}`);
|
|
@@ -1706,15 +1718,27 @@ var EsploraProvider = class {
|
|
|
1706
1718
|
return response.json();
|
|
1707
1719
|
}
|
|
1708
1720
|
async getTransactions(address) {
|
|
1709
|
-
const response = await
|
|
1721
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
|
|
1710
1722
|
if (!response.ok) {
|
|
1711
1723
|
const error = await response.text();
|
|
1712
1724
|
throw new Error(`Failed to get transactions: ${error}`);
|
|
1713
1725
|
}
|
|
1714
1726
|
return response.json();
|
|
1715
1727
|
}
|
|
1728
|
+
/**
|
|
1729
|
+
* Activity counts for an address, without its transactions — orders of
|
|
1730
|
+
* magnitude smaller than `/address/{addr}/txs`, which is what makes it
|
|
1731
|
+
* usable as a change probe for the polling fallback.
|
|
1732
|
+
*/
|
|
1733
|
+
async getAddressStats(address) {
|
|
1734
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/address/${address}`);
|
|
1735
|
+
if (!response.ok) {
|
|
1736
|
+
throw new Error(`Failed to get address stats: ${response.statusText}`);
|
|
1737
|
+
}
|
|
1738
|
+
return response.json();
|
|
1739
|
+
}
|
|
1716
1740
|
async getRawTransaction(txid) {
|
|
1717
|
-
const response = await
|
|
1741
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/hex`);
|
|
1718
1742
|
if (!response.ok) {
|
|
1719
1743
|
const error = await response.text();
|
|
1720
1744
|
throw new Error(`Failed to get raw transaction ${txid}: ${error}`);
|
|
@@ -1722,7 +1746,7 @@ var EsploraProvider = class {
|
|
|
1722
1746
|
return base.hex.decode((await response.text()).trim());
|
|
1723
1747
|
}
|
|
1724
1748
|
async getTxStatus(txid) {
|
|
1725
|
-
const txresponse = await
|
|
1749
|
+
const txresponse = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
|
|
1726
1750
|
if (!txresponse.ok) {
|
|
1727
1751
|
throw new Error(txresponse.statusText);
|
|
1728
1752
|
}
|
|
@@ -1730,7 +1754,7 @@ var EsploraProvider = class {
|
|
|
1730
1754
|
if (!tx.status.confirmed) {
|
|
1731
1755
|
return { confirmed: false };
|
|
1732
1756
|
}
|
|
1733
|
-
const response = await
|
|
1757
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
|
|
1734
1758
|
if (!response.ok) {
|
|
1735
1759
|
throw new Error(`Failed to get transaction status: ${response.statusText}`);
|
|
1736
1760
|
}
|
|
@@ -1744,50 +1768,227 @@ var EsploraProvider = class {
|
|
|
1744
1768
|
blockHeight: data.block_height
|
|
1745
1769
|
};
|
|
1746
1770
|
}
|
|
1771
|
+
/**
|
|
1772
|
+
* Watch a set of addresses over the explorer's WebSocket, degrading to HTTP
|
|
1773
|
+
* polling whenever the socket is unavailable and returning to the socket as
|
|
1774
|
+
* soon as it can be re-established.
|
|
1775
|
+
*
|
|
1776
|
+
* Concurrent calls covering the same address set share one transport. The
|
|
1777
|
+
* returned function releases **this** subscription only; the transport is
|
|
1778
|
+
* torn down when the last subscriber releases it. Calling it more than once
|
|
1779
|
+
* is a no-op.
|
|
1780
|
+
*
|
|
1781
|
+
* @param addresses - Addresses to monitor; order is not significant
|
|
1782
|
+
* @param callback - Invoked with transactions seen after the watch started
|
|
1783
|
+
* @returns A function releasing this subscription
|
|
1784
|
+
* @remarks
|
|
1785
|
+
* The HTTP fallback fetches full address history per address per cycle,
|
|
1786
|
+
* which is dramatically more expensive than the socket — so callers should
|
|
1787
|
+
* release watches they no longer need rather than relying on sharing.
|
|
1788
|
+
* @see {@link waitForIncomingFunds} for the cancellation-aware wallet-level helper
|
|
1789
|
+
*/
|
|
1747
1790
|
async watchAddresses(addresses, callback) {
|
|
1748
|
-
|
|
1791
|
+
const key = [...addresses].sort().join("\0");
|
|
1792
|
+
let watch = this.addressWatches.get(key);
|
|
1793
|
+
if (!watch) {
|
|
1794
|
+
watch = this.createAddressWatch(addresses, () => this.addressWatches.delete(key));
|
|
1795
|
+
this.addressWatches.set(key, watch);
|
|
1796
|
+
}
|
|
1797
|
+
const subscriber = { callback };
|
|
1798
|
+
watch.subscribers.add(subscriber);
|
|
1799
|
+
const shared = watch;
|
|
1800
|
+
await shared.started;
|
|
1801
|
+
let released = false;
|
|
1802
|
+
return () => {
|
|
1803
|
+
if (released) return;
|
|
1804
|
+
released = true;
|
|
1805
|
+
shared.subscribers.delete(subscriber);
|
|
1806
|
+
if (shared.subscribers.size === 0) shared.teardown();
|
|
1807
|
+
};
|
|
1808
|
+
}
|
|
1809
|
+
/**
|
|
1810
|
+
* Bring up one shared address watch: a WebSocket subscription where the
|
|
1811
|
+
* explorer supports it, degrading to HTTP polling when it doesn't.
|
|
1812
|
+
*
|
|
1813
|
+
* @param addresses - Addresses this watch covers
|
|
1814
|
+
* @param onTeardown - Invoked when the watch retires, to drop the registry entry
|
|
1815
|
+
*/
|
|
1816
|
+
createAddressWatch(addresses, onTeardown) {
|
|
1817
|
+
const subscribers = /* @__PURE__ */ new Set();
|
|
1749
1818
|
const wsUrl = this.baseUrl.replace(/^http(s)?:/, "ws$1:") + "/v1/ws";
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1819
|
+
let stopped = false;
|
|
1820
|
+
let timer = null;
|
|
1821
|
+
let pollStarted = false;
|
|
1822
|
+
let ws = null;
|
|
1823
|
+
let reconnectTimer = null;
|
|
1824
|
+
let reconnectFailures = 0;
|
|
1825
|
+
let pollSession = 0;
|
|
1826
|
+
const emit = (txs) => {
|
|
1827
|
+
if (stopped || txs.length === 0) return;
|
|
1828
|
+
for (const subscriber of [...subscribers]) {
|
|
1829
|
+
try {
|
|
1830
|
+
subscriber.callback(txs);
|
|
1831
|
+
} catch (error) {
|
|
1832
|
+
console.error("Address watch subscriber threw:", error);
|
|
1833
|
+
}
|
|
1834
|
+
}
|
|
1835
|
+
};
|
|
1836
|
+
const txKey2 = (tx) => `${tx.txid}_${tx.status.block_time}`;
|
|
1837
|
+
const getAllTxs = async () => {
|
|
1838
|
+
const txArrays = await Promise.all(
|
|
1839
|
+
addresses.map((address) => this.getTransactions(address))
|
|
1840
|
+
);
|
|
1841
|
+
return txArrays.flat();
|
|
1842
|
+
};
|
|
1843
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1844
|
+
let baselined = false;
|
|
1845
|
+
let anchorHeight;
|
|
1846
|
+
const baseline = (async () => {
|
|
1847
|
+
const [history, tip] = await Promise.allSettled([getAllTxs(), this.getChainTip()]);
|
|
1848
|
+
if (history.status === "fulfilled") {
|
|
1849
|
+
for (const tx of history.value) seen.add(txKey2(tx));
|
|
1850
|
+
baselined = true;
|
|
1851
|
+
return;
|
|
1852
|
+
}
|
|
1853
|
+
console.warn(
|
|
1854
|
+
"Could not baseline watched addresses; the first poll pass will establish it instead:",
|
|
1855
|
+
history.reason
|
|
1856
|
+
);
|
|
1857
|
+
if (tip.status === "fulfilled") anchorHeight = tip.value.height;
|
|
1858
|
+
})();
|
|
1859
|
+
const report = (txs) => {
|
|
1860
|
+
const fresh = [];
|
|
1861
|
+
for (const tx of txs) {
|
|
1862
|
+
const key = txKey2(tx);
|
|
1863
|
+
if (seen.has(key)) continue;
|
|
1864
|
+
seen.add(key);
|
|
1865
|
+
fresh.push(tx);
|
|
1866
|
+
}
|
|
1867
|
+
if (fresh.length === 0) return;
|
|
1868
|
+
emit(fresh);
|
|
1869
|
+
};
|
|
1870
|
+
const startPolling = async () => {
|
|
1871
|
+
if (stopped || pollStarted) return;
|
|
1872
|
+
pollStarted = true;
|
|
1873
|
+
console.warn(
|
|
1874
|
+
`Esplora websocket unavailable (${wsUrl}); falling back to HTTP polling every ${this.pollingInterval}ms for ${addresses.length} address(es) while retrying the socket`
|
|
1875
|
+
);
|
|
1876
|
+
let failures = 0;
|
|
1877
|
+
const activityFingerprint = async () => {
|
|
1878
|
+
try {
|
|
1879
|
+
const stats = await Promise.all(
|
|
1880
|
+
addresses.map((address) => this.getAddressStats(address))
|
|
1881
|
+
);
|
|
1882
|
+
const counted = (activity) => typeof activity?.tx_count === "number" && typeof activity.funded_txo_count === "number" && typeof activity.spent_txo_count === "number";
|
|
1883
|
+
const usable = stats.every(
|
|
1884
|
+
(s) => counted(s?.chain_stats) && counted(s?.mempool_stats)
|
|
1885
|
+
);
|
|
1886
|
+
if (!usable) return void 0;
|
|
1887
|
+
if (stats.some((s) => s.mempool_stats.tx_count > 0)) return void 0;
|
|
1888
|
+
return stats.map(
|
|
1889
|
+
({ chain_stats: chain }) => `${chain.tx_count}:${chain.funded_txo_count}:${chain.spent_txo_count}`
|
|
1890
|
+
).join(",");
|
|
1891
|
+
} catch {
|
|
1892
|
+
return void 0;
|
|
1893
|
+
}
|
|
1894
|
+
};
|
|
1895
|
+
let lastFingerprint;
|
|
1896
|
+
const session = pollSession;
|
|
1897
|
+
const isCurrentLoop = () => !stopped && session === pollSession;
|
|
1898
|
+
const schedule = () => {
|
|
1899
|
+
if (!isCurrentLoop()) return;
|
|
1900
|
+
timer = setTimeout(tick, this.pollingInterval * 2 ** failures);
|
|
1756
1901
|
};
|
|
1757
|
-
const
|
|
1758
|
-
const txKey2 = (tx) => `${tx.txid}_${tx.status.block_time}`;
|
|
1759
|
-
const existingTxs = new Set(initialTxs.map(txKey2));
|
|
1760
|
-
intervalId = setInterval(async () => {
|
|
1902
|
+
const tick = async () => {
|
|
1761
1903
|
try {
|
|
1904
|
+
const fingerprint = await activityFingerprint();
|
|
1905
|
+
if (!isCurrentLoop()) return;
|
|
1906
|
+
if (fingerprint !== void 0 && fingerprint === lastFingerprint) {
|
|
1907
|
+
failures = 0;
|
|
1908
|
+
schedule();
|
|
1909
|
+
return;
|
|
1910
|
+
}
|
|
1762
1911
|
const currentTxs = await getAllTxs();
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1912
|
+
if (!isCurrentLoop()) return;
|
|
1913
|
+
lastFingerprint = fingerprint;
|
|
1914
|
+
if (baselined) {
|
|
1915
|
+
report(currentTxs);
|
|
1916
|
+
} else if (anchorHeight !== void 0) {
|
|
1917
|
+
const arrivedAfterStart = (tx) => !tx.status.confirmed || tx.status.block_height === void 0 || tx.status.block_height > anchorHeight;
|
|
1918
|
+
for (const tx of currentTxs) {
|
|
1919
|
+
if (!arrivedAfterStart(tx)) seen.add(txKey2(tx));
|
|
1920
|
+
}
|
|
1921
|
+
baselined = true;
|
|
1922
|
+
report(currentTxs);
|
|
1923
|
+
} else {
|
|
1924
|
+
console.warn(
|
|
1925
|
+
`Esplora address watch established its baseline late for ${addresses.length} address(es); deposits arriving before now may not have been reported`
|
|
1926
|
+
);
|
|
1927
|
+
for (const tx of currentTxs) seen.add(txKey2(tx));
|
|
1928
|
+
baselined = true;
|
|
1767
1929
|
}
|
|
1930
|
+
failures = 0;
|
|
1768
1931
|
} catch (error) {
|
|
1769
|
-
|
|
1932
|
+
failures = Math.min(failures + 1, MAX_POLL_BACKOFF_EXPONENT);
|
|
1933
|
+
console.error("Error polling watched addresses:", error);
|
|
1770
1934
|
}
|
|
1771
|
-
|
|
1935
|
+
schedule();
|
|
1936
|
+
};
|
|
1937
|
+
await baseline;
|
|
1938
|
+
if (!isCurrentLoop()) return;
|
|
1939
|
+
await tick();
|
|
1772
1940
|
};
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
if (
|
|
1776
|
-
|
|
1941
|
+
const stopPolling = () => {
|
|
1942
|
+
pollSession++;
|
|
1943
|
+
if (timer) {
|
|
1944
|
+
clearTimeout(timer);
|
|
1945
|
+
timer = null;
|
|
1946
|
+
}
|
|
1947
|
+
pollStarted = false;
|
|
1777
1948
|
};
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1949
|
+
const handleSocketFailure = () => {
|
|
1950
|
+
if (stopped) return Promise.resolve();
|
|
1951
|
+
scheduleReconnect();
|
|
1952
|
+
return startPolling();
|
|
1953
|
+
};
|
|
1954
|
+
const scheduleReconnect = () => {
|
|
1955
|
+
if (stopped || reconnectTimer !== null) return;
|
|
1956
|
+
const delay = RECONNECT_BASE_DELAY_MS * 2 ** Math.min(reconnectFailures, MAX_RECONNECT_BACKOFF_EXPONENT);
|
|
1957
|
+
reconnectFailures++;
|
|
1958
|
+
reconnectTimer = setTimeout(() => {
|
|
1959
|
+
reconnectTimer = null;
|
|
1960
|
+
connect();
|
|
1961
|
+
}, delay);
|
|
1962
|
+
};
|
|
1963
|
+
const connect = () => {
|
|
1964
|
+
if (stopped) return Promise.resolve();
|
|
1965
|
+
const previous = ws;
|
|
1966
|
+
ws = null;
|
|
1967
|
+
if (previous) {
|
|
1968
|
+
try {
|
|
1969
|
+
previous.close();
|
|
1970
|
+
} catch {
|
|
1971
|
+
}
|
|
1972
|
+
}
|
|
1973
|
+
let socket;
|
|
1974
|
+
try {
|
|
1975
|
+
socket = new WebSocket(wsUrl);
|
|
1976
|
+
} catch {
|
|
1977
|
+
return handleSocketFailure();
|
|
1978
|
+
}
|
|
1979
|
+
ws = socket;
|
|
1980
|
+
const isCurrent = () => !stopped && ws === socket;
|
|
1981
|
+
socket.addEventListener("open", () => {
|
|
1982
|
+
if (!isCurrent()) return;
|
|
1983
|
+
reconnectFailures = 0;
|
|
1785
1984
|
const subscribeMsg = {
|
|
1786
1985
|
"track-addresses": addresses
|
|
1787
1986
|
};
|
|
1788
|
-
|
|
1987
|
+
socket.send(JSON.stringify(subscribeMsg));
|
|
1988
|
+
stopPolling();
|
|
1789
1989
|
});
|
|
1790
|
-
|
|
1990
|
+
socket.addEventListener("message", (event) => {
|
|
1991
|
+
if (!isCurrent()) return;
|
|
1791
1992
|
try {
|
|
1792
1993
|
const newTxs = [];
|
|
1793
1994
|
const message = JSON.parse(event.data.toString());
|
|
@@ -1799,22 +2000,45 @@ var EsploraProvider = class {
|
|
|
1799
2000
|
newTxs.push(...aux[address][type].filter(isExplorerTransaction));
|
|
1800
2001
|
}
|
|
1801
2002
|
}
|
|
1802
|
-
|
|
2003
|
+
report(newTxs);
|
|
1803
2004
|
} catch (error) {
|
|
1804
2005
|
console.error("Failed to process WebSocket message:", error);
|
|
1805
2006
|
}
|
|
1806
2007
|
});
|
|
1807
|
-
|
|
1808
|
-
|
|
2008
|
+
socket.addEventListener("error", () => {
|
|
2009
|
+
if (isCurrent()) void handleSocketFailure();
|
|
1809
2010
|
});
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
2011
|
+
socket.addEventListener("close", () => {
|
|
2012
|
+
if (isCurrent()) void handleSocketFailure();
|
|
2013
|
+
});
|
|
2014
|
+
return Promise.resolve();
|
|
2015
|
+
};
|
|
2016
|
+
const teardown = () => {
|
|
2017
|
+
if (stopped) return;
|
|
2018
|
+
stopped = true;
|
|
2019
|
+
onTeardown();
|
|
2020
|
+
if (timer) {
|
|
2021
|
+
clearTimeout(timer);
|
|
2022
|
+
timer = null;
|
|
2023
|
+
}
|
|
2024
|
+
if (reconnectTimer !== null) {
|
|
2025
|
+
clearTimeout(reconnectTimer);
|
|
2026
|
+
reconnectTimer = null;
|
|
2027
|
+
}
|
|
2028
|
+
if (ws) {
|
|
2029
|
+
try {
|
|
2030
|
+
ws.close();
|
|
2031
|
+
} catch {
|
|
2032
|
+
}
|
|
2033
|
+
ws = null;
|
|
2034
|
+
}
|
|
2035
|
+
subscribers.clear();
|
|
2036
|
+
};
|
|
2037
|
+
const started = this.forcePolling ? startPolling() : connect().then(() => baseline);
|
|
2038
|
+
return { subscribers, teardown, started };
|
|
1815
2039
|
}
|
|
1816
2040
|
async getChainTip() {
|
|
1817
|
-
const tipBlocks = await
|
|
2041
|
+
const tipBlocks = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/blocks`);
|
|
1818
2042
|
if (!tipBlocks.ok) {
|
|
1819
2043
|
throw new Error(`Failed to get chain tip: ${tipBlocks.statusText}`);
|
|
1820
2044
|
}
|
|
@@ -1828,12 +2052,14 @@ var EsploraProvider = class {
|
|
|
1828
2052
|
const hash = tip[0].id;
|
|
1829
2053
|
return {
|
|
1830
2054
|
height: tip[0].height,
|
|
2055
|
+
// `mediantime`, never `timestamp`: the latter is the header's own
|
|
2056
|
+
// `nTime`, and this field is specified as MTP.
|
|
1831
2057
|
time: tip[0].mediantime,
|
|
1832
2058
|
hash
|
|
1833
2059
|
};
|
|
1834
2060
|
}
|
|
1835
2061
|
async broadcastPackage(parent, child) {
|
|
1836
|
-
const response = await
|
|
2062
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
|
|
1837
2063
|
method: "POST",
|
|
1838
2064
|
headers: {
|
|
1839
2065
|
"Content-Type": "application/json"
|
|
@@ -1849,7 +2075,7 @@ var EsploraProvider = class {
|
|
|
1849
2075
|
return result;
|
|
1850
2076
|
}
|
|
1851
2077
|
async broadcastTx(tx) {
|
|
1852
|
-
const response = await
|
|
2078
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx`, {
|
|
1853
2079
|
method: "POST",
|
|
1854
2080
|
headers: {
|
|
1855
2081
|
"Content-Type": "text/plain"
|
|
@@ -1893,6 +2119,9 @@ var isExplorerTransaction = (tx) => {
|
|
|
1893
2119
|
(vout) => typeof vout.scriptpubkey_address === "string" && typeof vout.value === "number"
|
|
1894
2120
|
) && typeof tx.status === "object" && typeof tx.status.confirmed === "boolean";
|
|
1895
2121
|
};
|
|
2122
|
+
var MAX_POLL_BACKOFF_EXPONENT = 4;
|
|
2123
|
+
var RECONNECT_BASE_DELAY_MS = 1e3;
|
|
2124
|
+
var MAX_RECONNECT_BACKOFF_EXPONENT = 5;
|
|
1896
2125
|
var getVarIntSize = (n) => {
|
|
1897
2126
|
if (n < 253) return 1;
|
|
1898
2127
|
if (n <= 65535) return 3;
|
|
@@ -2029,7 +2258,7 @@ function findP2AOutput(tx) {
|
|
|
2029
2258
|
var CHILD_DUST_AMOUNT = 546;
|
|
2030
2259
|
function buildAnchorChild(params) {
|
|
2031
2260
|
const { parent, feeRate, fundingCoins, changeAddress, tapInternalKey, network } = params;
|
|
2032
|
-
const child = new
|
|
2261
|
+
const child = new chunk5MLC2HU3_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
|
|
2033
2262
|
child.addInput(findP2AOutput(parent));
|
|
2034
2263
|
const estimator = TxWeightEstimator.create().addP2AInput();
|
|
2035
2264
|
for (const _ of fundingCoins) {
|
|
@@ -2077,7 +2306,7 @@ function buildForfeitTx(inputs, forfeitPkScript, txLocktime) {
|
|
|
2077
2306
|
);
|
|
2078
2307
|
}
|
|
2079
2308
|
function buildForfeitTxWithOutput(inputs, output, txLocktime) {
|
|
2080
|
-
const tx = new
|
|
2309
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction({
|
|
2081
2310
|
version: 3,
|
|
2082
2311
|
lockTime: txLocktime
|
|
2083
2312
|
});
|
|
@@ -2153,7 +2382,7 @@ function validateVtxoTxGraph(graph, roundTransaction, sweepTapTreeRoot) {
|
|
|
2153
2382
|
if (previousScriptKey.length !== 32) {
|
|
2154
2383
|
throw new Error(`parent output ${childIndex} has invalid script`);
|
|
2155
2384
|
}
|
|
2156
|
-
const cosigners =
|
|
2385
|
+
const cosigners = chunk5MLC2HU3_cjs.getArkPsbtFields(child.root, 0, chunk5MLC2HU3_cjs.CosignerPublicKey);
|
|
2157
2386
|
if (cosigners.length === 0) {
|
|
2158
2387
|
throw ErrMissingCosignersPublicKeys;
|
|
2159
2388
|
}
|
|
@@ -2211,7 +2440,7 @@ var EmulatorPacket = class _EmulatorPacket {
|
|
|
2211
2440
|
return new _EmulatorPacket(entries);
|
|
2212
2441
|
}
|
|
2213
2442
|
static fromBytes(data) {
|
|
2214
|
-
const reader = new
|
|
2443
|
+
const reader = new chunkGVHUHTRH_cjs.BufferReader(data);
|
|
2215
2444
|
const entryCount = reader.readCompactSize();
|
|
2216
2445
|
const entries = [];
|
|
2217
2446
|
for (let i = 0; i < entryCount; i++) {
|
|
@@ -2229,7 +2458,7 @@ var EmulatorPacket = class _EmulatorPacket {
|
|
|
2229
2458
|
return _EmulatorPacket.PACKET_TYPE;
|
|
2230
2459
|
}
|
|
2231
2460
|
serialize() {
|
|
2232
|
-
const writer = new
|
|
2461
|
+
const writer = new chunkGVHUHTRH_cjs.BufferWriter();
|
|
2233
2462
|
writer.writeCompactSize(this.entries.length);
|
|
2234
2463
|
for (const entry of this.entries) {
|
|
2235
2464
|
writer.writeUint16LE(entry.vin);
|
|
@@ -2316,7 +2545,7 @@ var Extension = class _Extension {
|
|
|
2316
2545
|
`expected magic prefix ${base.hex.encode(ARKADE_MAGIC)}, got ${base.hex.encode(payload.slice(0, Math.min(payload.length, ARKADE_MAGIC.length)))}`
|
|
2317
2546
|
);
|
|
2318
2547
|
}
|
|
2319
|
-
const reader = new
|
|
2548
|
+
const reader = new chunkGVHUHTRH_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
|
|
2320
2549
|
const packets = [];
|
|
2321
2550
|
while (reader.remaining() > 0) {
|
|
2322
2551
|
const packetType = reader.readByte();
|
|
@@ -2390,7 +2619,7 @@ var Extension = class _Extension {
|
|
|
2390
2619
|
*/
|
|
2391
2620
|
getAssetPacket() {
|
|
2392
2621
|
for (const p of this.packets) {
|
|
2393
|
-
if (p instanceof
|
|
2622
|
+
if (p instanceof chunkGVHUHTRH_cjs.Packet) {
|
|
2394
2623
|
return p;
|
|
2395
2624
|
}
|
|
2396
2625
|
}
|
|
@@ -2428,8 +2657,8 @@ var Extension = class _Extension {
|
|
|
2428
2657
|
};
|
|
2429
2658
|
function parsePacket(packetType, data) {
|
|
2430
2659
|
switch (packetType) {
|
|
2431
|
-
case
|
|
2432
|
-
return
|
|
2660
|
+
case chunkGVHUHTRH_cjs.Packet.PACKET_TYPE:
|
|
2661
|
+
return chunkGVHUHTRH_cjs.Packet.fromBytes(data);
|
|
2433
2662
|
case EmulatorPacket.PACKET_TYPE:
|
|
2434
2663
|
return EmulatorPacket.fromBytes(data);
|
|
2435
2664
|
default:
|
|
@@ -2476,16 +2705,16 @@ function buildOpReturnScript(data) {
|
|
|
2476
2705
|
}
|
|
2477
2706
|
return script;
|
|
2478
2707
|
}
|
|
2479
|
-
var ErrOffchainOutputNotFound = (address) => new
|
|
2480
|
-
var ErrInvalidAssetOutputAmount = (got, want, assetId) => new
|
|
2708
|
+
var ErrOffchainOutputNotFound = (address) => new chunk5MLC2HU3_cjs.ServerResponseMismatchError(`offchain send output not found: ${address}`);
|
|
2709
|
+
var ErrInvalidAssetOutputAmount = (got, want, assetId) => new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2481
2710
|
`invalid asset output amount for ${assetId}: got ${got}, want ${want}`
|
|
2482
2711
|
);
|
|
2483
|
-
var ErrAssetGroupNotFound = (assetId) => new
|
|
2484
|
-
var ErrAssetOutputNotFound = (assetId, outputIndex) => new
|
|
2712
|
+
var ErrAssetGroupNotFound = (assetId) => new chunk5MLC2HU3_cjs.ServerResponseMismatchError(`asset group not found in batch leaf: ${assetId}`);
|
|
2713
|
+
var ErrAssetOutputNotFound = (assetId, outputIndex) => new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2485
2714
|
`asset output not found in asset group ${assetId} at index ${outputIndex}`
|
|
2486
2715
|
);
|
|
2487
|
-
var ErrOnchainOutputNotFound = (address) => new
|
|
2488
|
-
var ErrUnvalidatedOffchainOutput = (address) => new
|
|
2716
|
+
var ErrOnchainOutputNotFound = (address) => new chunk5MLC2HU3_cjs.ServerResponseMismatchError(`onchain output not found: ${address}`);
|
|
2717
|
+
var ErrUnvalidatedOffchainOutput = (address) => new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2489
2718
|
`offchain output ${address} cannot be validated: virtual output tree signing did not run`
|
|
2490
2719
|
);
|
|
2491
2720
|
var ErrInvalidOnchainOutputAmount = (address) => new Error(`invalid onchain output amount: ${address}`);
|
|
@@ -2494,7 +2723,7 @@ var ErrInvalidOffchainOutputAmount = (address) => new Error(`invalid offchain ou
|
|
|
2494
2723
|
function assertFinalCommitmentMatchesValidated(finalCommitmentTx, validatedCommitmentTxid, context) {
|
|
2495
2724
|
if (!validatedCommitmentTxid) return;
|
|
2496
2725
|
if (finalCommitmentTx.id === validatedCommitmentTxid) return;
|
|
2497
|
-
throw new
|
|
2726
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2498
2727
|
`${context}: finalization commitment tx ${finalCommitmentTx.id} differs from the validated commitment tx ${validatedCommitmentTxid}`
|
|
2499
2728
|
);
|
|
2500
2729
|
}
|
|
@@ -2504,7 +2733,7 @@ function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, netwo
|
|
|
2504
2733
|
for (const recipient of recipients) {
|
|
2505
2734
|
let arkAddress;
|
|
2506
2735
|
try {
|
|
2507
|
-
arkAddress =
|
|
2736
|
+
arkAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(recipient.address);
|
|
2508
2737
|
} catch {
|
|
2509
2738
|
validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
|
|
2510
2739
|
continue;
|
|
@@ -2516,7 +2745,7 @@ function validateBatchRecipientsWithoutTree(commitmentTx, recipients, network) {
|
|
|
2516
2745
|
const usedOnchainOutputs = /* @__PURE__ */ new Set();
|
|
2517
2746
|
for (const recipient of recipients) {
|
|
2518
2747
|
try {
|
|
2519
|
-
|
|
2748
|
+
chunk5MLC2HU3_cjs.ArkAddress.decode(recipient.address);
|
|
2520
2749
|
} catch {
|
|
2521
2750
|
validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
|
|
2522
2751
|
continue;
|
|
@@ -2749,7 +2978,7 @@ function assetMintResolver() {
|
|
|
2749
2978
|
if (!tx.assets?.length || !tx.key.arkTxid) return void 0;
|
|
2750
2979
|
const minted = tx.assets.filter((a) => {
|
|
2751
2980
|
try {
|
|
2752
|
-
return base.hex.encode(
|
|
2981
|
+
return base.hex.encode(chunkGVHUHTRH_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
|
|
2753
2982
|
} catch {
|
|
2754
2983
|
return false;
|
|
2755
2984
|
}
|
|
@@ -2792,7 +3021,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2792
3021
|
const existing = inputsByAssetId.get(asset.assetId);
|
|
2793
3022
|
inputsByAssetId.set(asset.assetId, [
|
|
2794
3023
|
...existing ?? [],
|
|
2795
|
-
|
|
3024
|
+
chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount)
|
|
2796
3025
|
]);
|
|
2797
3026
|
}
|
|
2798
3027
|
}
|
|
@@ -2804,7 +3033,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2804
3033
|
const existing = outputsByAssetId.get(asset.assetId);
|
|
2805
3034
|
outputsByAssetId.set(asset.assetId, [
|
|
2806
3035
|
...existing ?? [],
|
|
2807
|
-
|
|
3036
|
+
chunkGVHUHTRH_cjs.AssetOutput.create(outputIndex, asset.amount)
|
|
2808
3037
|
]);
|
|
2809
3038
|
}
|
|
2810
3039
|
}
|
|
@@ -2815,7 +3044,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2815
3044
|
const existing = outputsByAssetId.get(asset.assetId);
|
|
2816
3045
|
outputsByAssetId.set(asset.assetId, [
|
|
2817
3046
|
...existing ?? [],
|
|
2818
|
-
|
|
3047
|
+
chunkGVHUHTRH_cjs.AssetOutput.create(outputIndex, asset.amount)
|
|
2819
3048
|
]);
|
|
2820
3049
|
}
|
|
2821
3050
|
}
|
|
@@ -2824,11 +3053,11 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2824
3053
|
for (const assetIdStr of allAssetIds) {
|
|
2825
3054
|
const inputs = inputsByAssetId.get(assetIdStr);
|
|
2826
3055
|
const outputs = outputsByAssetId.get(assetIdStr);
|
|
2827
|
-
const assetId =
|
|
2828
|
-
const group =
|
|
3056
|
+
const assetId = chunkGVHUHTRH_cjs.AssetId.fromString(assetIdStr);
|
|
3057
|
+
const group = chunkGVHUHTRH_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
|
|
2829
3058
|
groups.push(group);
|
|
2830
3059
|
}
|
|
2831
|
-
return
|
|
3060
|
+
return chunkGVHUHTRH_cjs.Packet.create(groups);
|
|
2832
3061
|
}
|
|
2833
3062
|
function selectCoinsWithAsset(coins, assetId, requiredAmount) {
|
|
2834
3063
|
const coinsWithAsset = coins.filter((coin) => coin.assets?.some((a) => a.assetId === assetId));
|
|
@@ -2865,7 +3094,7 @@ function selectedCoinsToAssetInputs(selectedCoins) {
|
|
|
2865
3094
|
}
|
|
2866
3095
|
function toXOnlySignerHex(pubkeyHex) {
|
|
2867
3096
|
const bytes = base.hex.decode(pubkeyHex);
|
|
2868
|
-
if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(
|
|
3097
|
+
if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(chunkWIFL5QYZ_cjs.toXOnly(bytes, "signer key"));
|
|
2869
3098
|
throw new Error(`invalid signer pubkey length: expected 32 or 33 bytes, got ${bytes.length}`);
|
|
2870
3099
|
}
|
|
2871
3100
|
function signerSetFromInfo(info) {
|
|
@@ -2912,13 +3141,13 @@ var toTimelock = (value) => ({
|
|
|
2912
3141
|
var toSeconds = (t) => t.type === "seconds" ? t.value : t.value * NOMINAL_BLOCK_SECONDS;
|
|
2913
3142
|
function assertTimelockInPolicy(timelock, policy, label, overrideOption) {
|
|
2914
3143
|
if (policy.requireSeconds && timelock.type === "blocks") {
|
|
2915
|
-
throw new
|
|
3144
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2916
3145
|
`${label} rejected: block-typed timelocks are not accepted (got ${timelock.value})`
|
|
2917
3146
|
);
|
|
2918
3147
|
}
|
|
2919
3148
|
const seconds = toSeconds(timelock);
|
|
2920
3149
|
if (seconds < policy.minSeconds) {
|
|
2921
|
-
throw new
|
|
3150
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2922
3151
|
`${label} rejected: ${timelock.value} ${timelock.type} is below the ${policy.minSeconds}s floor; pass ${overrideOption}: ${seconds}n to Wallet.create to lower it`
|
|
2923
3152
|
);
|
|
2924
3153
|
}
|
|
@@ -2939,7 +3168,7 @@ function resolveBatchExpiryPolicy(network, overrides) {
|
|
|
2939
3168
|
}
|
|
2940
3169
|
function assertValidBatchExpiry(batchExpiry, policy) {
|
|
2941
3170
|
if (policy.advertisedVtxoTreeExpiry !== void 0 && batchExpiry !== policy.advertisedVtxoTreeExpiry) {
|
|
2942
|
-
throw new
|
|
3171
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2943
3172
|
`batch expiry rejected: ${batchExpiry} does not match the advertised vtxoTreeExpiry ${policy.advertisedVtxoTreeExpiry}`
|
|
2944
3173
|
);
|
|
2945
3174
|
}
|
|
@@ -2969,21 +3198,21 @@ function resolveCheckpointExitDelayPolicy(network, overrides) {
|
|
|
2969
3198
|
function assertValidServerUnrollScript(checkpointTapscript, policy) {
|
|
2970
3199
|
let script;
|
|
2971
3200
|
try {
|
|
2972
|
-
script =
|
|
3201
|
+
script = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
|
|
2973
3202
|
} catch (e) {
|
|
2974
|
-
throw new
|
|
3203
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2975
3204
|
`checkpoint exit delay rejected: invalid checkpointTapscript from server (${e instanceof Error ? e.message : String(e)})`
|
|
2976
3205
|
);
|
|
2977
3206
|
}
|
|
2978
3207
|
if (policy.advertisedForfeitPubkey !== void 0) {
|
|
2979
3208
|
const { pubkeys } = script.params;
|
|
2980
3209
|
if (pubkeys.length !== 1) {
|
|
2981
|
-
throw new
|
|
3210
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2982
3211
|
`checkpoint exit delay rejected: checkpointTapscript must commit to exactly one pubkey, got ${pubkeys.length} [${pubkeys.map(base.hex.encode).join(", ")}]`
|
|
2983
3212
|
);
|
|
2984
3213
|
}
|
|
2985
3214
|
if (!utils_js.equalBytes(pubkeys[0], policy.advertisedForfeitPubkey)) {
|
|
2986
|
-
throw new
|
|
3215
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2987
3216
|
`checkpoint exit delay rejected: checkpointTapscript pubkey ${base.hex.encode(pubkeys[0])} does not match the advertised forfeitPubkey ${base.hex.encode(policy.advertisedForfeitPubkey)}`
|
|
2988
3217
|
);
|
|
2989
3218
|
}
|
|
@@ -3027,8 +3256,8 @@ function buildOffchainTx(inputs, outputs, serverUnrollScript) {
|
|
|
3027
3256
|
function buildVirtualTx(inputs, outputs) {
|
|
3028
3257
|
let lockTime = 0n;
|
|
3029
3258
|
for (const input of inputs) {
|
|
3030
|
-
const tapscript =
|
|
3031
|
-
if (
|
|
3259
|
+
const tapscript = chunk5MLC2HU3_cjs.decodeTapscript(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(input.tapLeafScript));
|
|
3260
|
+
if (chunk5MLC2HU3_cjs.CLTVMultisigTapscript.is(tapscript)) {
|
|
3032
3261
|
if (lockTime !== 0n) {
|
|
3033
3262
|
if (isSeconds(lockTime) !== isSeconds(tapscript.params.absoluteTimelock)) {
|
|
3034
3263
|
throw new Error("cannot mix seconds and blocks locktime");
|
|
@@ -3039,7 +3268,7 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3039
3268
|
}
|
|
3040
3269
|
}
|
|
3041
3270
|
}
|
|
3042
|
-
const tx = new
|
|
3271
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction({
|
|
3043
3272
|
version: 3,
|
|
3044
3273
|
lockTime: Number(lockTime)
|
|
3045
3274
|
});
|
|
@@ -3049,12 +3278,12 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3049
3278
|
index: input.vout,
|
|
3050
3279
|
sequence: lockTime ? btcSigner.DEFAULT_SEQUENCE - 1 : void 0,
|
|
3051
3280
|
witnessUtxo: {
|
|
3052
|
-
script:
|
|
3281
|
+
script: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript,
|
|
3053
3282
|
amount: BigInt(input.value)
|
|
3054
3283
|
},
|
|
3055
3284
|
tapLeafScript: [input.tapLeafScript]
|
|
3056
3285
|
});
|
|
3057
|
-
|
|
3286
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(tx, i, chunk5MLC2HU3_cjs.VtxoTaprootTree, input.tapTree);
|
|
3058
3287
|
}
|
|
3059
3288
|
for (const output of outputs) {
|
|
3060
3289
|
tx.addOutput(output);
|
|
@@ -3063,8 +3292,8 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3063
3292
|
return tx;
|
|
3064
3293
|
}
|
|
3065
3294
|
function buildCheckpointTx(vtxo, serverUnrollScript) {
|
|
3066
|
-
const collaborativeClosure =
|
|
3067
|
-
const checkpointVtxoScript = new
|
|
3295
|
+
const collaborativeClosure = chunk5MLC2HU3_cjs.decodeTapscript(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
|
|
3296
|
+
const checkpointVtxoScript = new chunk5MLC2HU3_cjs.VtxoScript([
|
|
3068
3297
|
serverUnrollScript.script,
|
|
3069
3298
|
collaborativeClosure.script
|
|
3070
3299
|
]);
|
|
@@ -3107,9 +3336,6 @@ function hasBoardingTxExpired(coin, boardingTimelock, chainTipHeight) {
|
|
|
3107
3336
|
const blockTime = BigInt(Math.floor(coin.status.block_time));
|
|
3108
3337
|
return blockTime + boardingTimelock.value <= now;
|
|
3109
3338
|
}
|
|
3110
|
-
function formatSighash(type) {
|
|
3111
|
-
return `0x${type.toString(16).padStart(2, "0")}`;
|
|
3112
|
-
}
|
|
3113
3339
|
function verifyTapscriptSignatures(tx, inputIndex, requiredSigners, excludePubkeys = [], allowedSighashTypes = [btcSigner.SigHash.DEFAULT], expectedLeafHash) {
|
|
3114
3340
|
const input = tx.getInput(inputIndex);
|
|
3115
3341
|
const prevoutScripts = [];
|
|
@@ -3143,7 +3369,7 @@ function verifyTapscriptSignatures(tx, inputIndex, requiredSigners, excludePubke
|
|
|
3143
3369
|
const sighashType = signature.length === 65 ? signature[64] : btcSigner.SigHash.DEFAULT;
|
|
3144
3370
|
const sig = signature.subarray(0, 64);
|
|
3145
3371
|
if (!allowedSighashTypes.includes(sighashType)) {
|
|
3146
|
-
const sighashName = formatSighash(sighashType);
|
|
3372
|
+
const sighashName = chunk5MLC2HU3_cjs.formatSighash(sighashType);
|
|
3147
3373
|
throw new Error(
|
|
3148
3374
|
`Unallowed sighash type ${sighashName} for input ${inputIndex}, pubkey ${pubKeyHex}.`
|
|
3149
3375
|
);
|
|
@@ -3217,7 +3443,7 @@ function combineTapscriptSigs(signedTx, originalTx) {
|
|
|
3217
3443
|
}
|
|
3218
3444
|
function isValidArkAddress(address) {
|
|
3219
3445
|
try {
|
|
3220
|
-
|
|
3446
|
+
chunk5MLC2HU3_cjs.ArkAddress.decode(address);
|
|
3221
3447
|
return true;
|
|
3222
3448
|
} catch (e) {
|
|
3223
3449
|
return false;
|
|
@@ -3225,16 +3451,16 @@ function isValidArkAddress(address) {
|
|
|
3225
3451
|
}
|
|
3226
3452
|
function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, context) {
|
|
3227
3453
|
if (serverCheckpointTxs.length !== expectedCheckpoints.length) {
|
|
3228
|
-
throw new
|
|
3454
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3229
3455
|
`${context} returned ${serverCheckpointTxs.length} checkpoints, expected ${expectedCheckpoints.length}`
|
|
3230
3456
|
);
|
|
3231
3457
|
}
|
|
3232
3458
|
const byTxid = new Map(expectedCheckpoints.map((c) => [c.id, c]));
|
|
3233
3459
|
return serverCheckpointTxs.map((encoded, index) => {
|
|
3234
|
-
const server =
|
|
3460
|
+
const server = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
|
|
3235
3461
|
const local = byTxid.get(server.id);
|
|
3236
3462
|
if (!local) {
|
|
3237
|
-
throw new
|
|
3463
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3238
3464
|
`${context} checkpoint ${index} txid ${server.id} does not match any submitted checkpoint`
|
|
3239
3465
|
);
|
|
3240
3466
|
}
|
|
@@ -3244,14 +3470,14 @@ function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, contex
|
|
|
3244
3470
|
}
|
|
3245
3471
|
function assertSubmittedArkTxid(response, signedArkTx, context) {
|
|
3246
3472
|
if (response.arkTxid !== signedArkTx.id) {
|
|
3247
|
-
throw new
|
|
3473
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3248
3474
|
`${context} returned ark txid ${response.arkTxid}, expected ${signedArkTx.id}`
|
|
3249
3475
|
);
|
|
3250
3476
|
}
|
|
3251
3477
|
if (response.finalArkTx === void 0) return;
|
|
3252
|
-
const finalTxid =
|
|
3478
|
+
const finalTxid = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
|
|
3253
3479
|
if (finalTxid !== signedArkTx.id) {
|
|
3254
|
-
throw new
|
|
3480
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3255
3481
|
`${context} returned final ark tx ${finalTxid}, expected ${signedArkTx.id}`
|
|
3256
3482
|
);
|
|
3257
3483
|
}
|
|
@@ -3270,10 +3496,10 @@ function assertServerSignedLeaf(serverTx, localTx, inputIndex, serverPubkeyHex,
|
|
|
3270
3496
|
[serverPubkeyHex],
|
|
3271
3497
|
void 0,
|
|
3272
3498
|
void 0,
|
|
3273
|
-
payment_js.tapLeafHash(
|
|
3499
|
+
payment_js.tapLeafHash(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(leaf))
|
|
3274
3500
|
);
|
|
3275
3501
|
} catch (error) {
|
|
3276
|
-
throw new
|
|
3502
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3277
3503
|
`${context}: input ${inputIndex} is not signed by the server on the leaf being spent (${error instanceof Error ? error.message : String(error)})`
|
|
3278
3504
|
);
|
|
3279
3505
|
}
|
|
@@ -3282,20 +3508,20 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
|
|
|
3282
3508
|
const byOutpoint = new Map(inputs.map((input) => [`${input.txid}:${input.vout}`, input]));
|
|
3283
3509
|
for (const [index, checkpoint] of checkpoints.entries()) {
|
|
3284
3510
|
if (checkpoint.inputsLength !== 1) {
|
|
3285
|
-
throw new
|
|
3511
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3286
3512
|
`${context}: checkpoint ${index} spends ${checkpoint.inputsLength} inputs, expected 1`
|
|
3287
3513
|
);
|
|
3288
3514
|
}
|
|
3289
3515
|
const spent = checkpoint.getInput(0);
|
|
3290
3516
|
if (!spent.txid || spent.index === void 0) {
|
|
3291
|
-
throw new
|
|
3517
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3292
3518
|
`${context}: checkpoint ${index} has no input outpoint`
|
|
3293
3519
|
);
|
|
3294
3520
|
}
|
|
3295
3521
|
const outpoint = `${base.hex.encode(spent.txid)}:${spent.index}`;
|
|
3296
3522
|
const input = byOutpoint.get(outpoint);
|
|
3297
3523
|
if (!input) {
|
|
3298
|
-
throw new
|
|
3524
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3299
3525
|
`${context}: checkpoint ${index} spends ${outpoint}, which is not one of the requested virtual outputs`
|
|
3300
3526
|
);
|
|
3301
3527
|
}
|
|
@@ -3303,7 +3529,7 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
|
|
|
3303
3529
|
(unroll) => buildCheckpointTx(input, unroll).tx.id === checkpoint.id
|
|
3304
3530
|
);
|
|
3305
3531
|
if (!rebuilt) {
|
|
3306
|
-
throw new
|
|
3532
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3307
3533
|
`${context}: checkpoint ${index} txid ${checkpoint.id} differs from the checkpoint built locally for ${outpoint}`
|
|
3308
3534
|
);
|
|
3309
3535
|
}
|
|
@@ -3327,15 +3553,24 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
|
|
|
3327
3553
|
assertSubmittedArkTxid(response, signedArkTx, "submitTx");
|
|
3328
3554
|
const { arkTxid, signedCheckpointTxs } = response;
|
|
3329
3555
|
const matched = matchServerCheckpoints(signedCheckpointTxs, offchainTx.checkpoints, "submitTx");
|
|
3556
|
+
matched.forEach(({ server }, index) => {
|
|
3557
|
+
try {
|
|
3558
|
+
chunk5MLC2HU3_cjs.assertAllowedSighashTypes(server);
|
|
3559
|
+
} catch (error) {
|
|
3560
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3561
|
+
`submitTx checkpoint ${index}: ${error instanceof Error ? error.message : String(error)}`
|
|
3562
|
+
);
|
|
3563
|
+
}
|
|
3564
|
+
});
|
|
3330
3565
|
const verify = options?.verifyServerSignatures;
|
|
3331
3566
|
if (verify) {
|
|
3332
3567
|
if (response.finalArkTx === void 0) {
|
|
3333
|
-
throw new
|
|
3568
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3334
3569
|
"submitTx: server returned no final ark tx to verify its signatures against"
|
|
3335
3570
|
);
|
|
3336
3571
|
}
|
|
3337
|
-
const finalArkTx =
|
|
3338
|
-
const serverPubkeyHex = base.hex.encode(
|
|
3572
|
+
const finalArkTx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx));
|
|
3573
|
+
const serverPubkeyHex = base.hex.encode(chunkWIFL5QYZ_cjs.toXOnly(verify.serverPubkey, "server key"));
|
|
3339
3574
|
for (let i = 0; i < offchainTx.arkTx.inputsLength; i++) {
|
|
3340
3575
|
assertServerSignedLeaf(
|
|
3341
3576
|
finalArkTx,
|
|
@@ -3391,12 +3626,12 @@ function claimWithPreimageIdentity(identity, preimage) {
|
|
|
3391
3626
|
return {
|
|
3392
3627
|
...identity,
|
|
3393
3628
|
sign: async (tx, inputIndexes) => {
|
|
3394
|
-
const signed =
|
|
3629
|
+
const signed = chunk5MLC2HU3_cjs.Transaction.fromPSBT(
|
|
3395
3630
|
(await identity.sign(tx.clone(), inputIndexes)).toPSBT()
|
|
3396
3631
|
);
|
|
3397
3632
|
const indexes = inputIndexes ?? Array.from({ length: signed.inputsLength }, (_, i) => i);
|
|
3398
3633
|
for (const index of indexes) {
|
|
3399
|
-
|
|
3634
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(signed, index, chunk5MLC2HU3_cjs.ConditionWitness, [preimage]);
|
|
3400
3635
|
}
|
|
3401
3636
|
return signed;
|
|
3402
3637
|
}
|
|
@@ -3588,7 +3823,7 @@ function extendCoinWithTapscript(boardingTapscript, utxo) {
|
|
|
3588
3823
|
};
|
|
3589
3824
|
}
|
|
3590
3825
|
function deriveContractTapscripts(contract) {
|
|
3591
|
-
const handler =
|
|
3826
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
3592
3827
|
if (!handler) {
|
|
3593
3828
|
throw new Error(`No handler for contract type '${contract.type}'`);
|
|
3594
3829
|
}
|
|
@@ -3659,7 +3894,7 @@ function getRandomId() {
|
|
|
3659
3894
|
}
|
|
3660
3895
|
function isValidArkAddress2(address) {
|
|
3661
3896
|
try {
|
|
3662
|
-
|
|
3897
|
+
chunk5MLC2HU3_cjs.ArkAddress.decode(address);
|
|
3663
3898
|
return true;
|
|
3664
3899
|
} catch (e) {
|
|
3665
3900
|
return false;
|
|
@@ -3687,7 +3922,7 @@ function assertRecipientArkAddress(encoded, address, context) {
|
|
|
3687
3922
|
function assertTapTreeDerivesAddress(encoded, tapTree, address) {
|
|
3688
3923
|
let derived;
|
|
3689
3924
|
try {
|
|
3690
|
-
derived =
|
|
3925
|
+
derived = chunk5MLC2HU3_cjs.VtxoScript.decode(tapTree).pkScript;
|
|
3691
3926
|
} catch (e) {
|
|
3692
3927
|
throw new Error(
|
|
3693
3928
|
`Invalid tapTree for ${encoded}: ${e instanceof Error ? e.message : String(e)}`
|
|
@@ -3704,7 +3939,7 @@ function validateRecipients(recipients, dustAmount, context) {
|
|
|
3704
3939
|
for (const recipient of recipients) {
|
|
3705
3940
|
let address;
|
|
3706
3941
|
try {
|
|
3707
|
-
address =
|
|
3942
|
+
address = chunk5MLC2HU3_cjs.ArkAddress.decode(recipient.address);
|
|
3708
3943
|
} catch (e) {
|
|
3709
3944
|
throw new Error(`Invalid Arkade address: ${recipient.address}`);
|
|
3710
3945
|
}
|
|
@@ -3729,7 +3964,7 @@ function validateRecipients(recipients, dustAmount, context) {
|
|
|
3729
3964
|
|
|
3730
3965
|
// src/contracts/spendability.ts
|
|
3731
3966
|
function isContractGenericallySpendable(contract) {
|
|
3732
|
-
return
|
|
3967
|
+
return chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type)?.isGenericallySpendable?.(contract) === true;
|
|
3733
3968
|
}
|
|
3734
3969
|
function gatedContracts(contracts) {
|
|
3735
3970
|
const gated = /* @__PURE__ */ new Map();
|
|
@@ -3742,7 +3977,7 @@ function gateExclusion(gated) {
|
|
|
3742
3977
|
return (vtxo) => {
|
|
3743
3978
|
const type = vtxo.script === void 0 ? void 0 : gated.get(vtxo.script);
|
|
3744
3979
|
if (type === void 0) return void 0;
|
|
3745
|
-
if (!
|
|
3980
|
+
if (!chunkWIFL5QYZ_cjs.contractHandlers.has(type)) {
|
|
3746
3981
|
return `at ${vtxo.script} (contract type '${type}') has no handler registered in this build`;
|
|
3747
3982
|
}
|
|
3748
3983
|
return `at ${vtxo.script} (contract type '${type}') is not generically spendable`;
|
|
@@ -3778,7 +4013,7 @@ function selectPendingRecoveryOutpoints(contractsWithVtxos, signerSet, nowSecond
|
|
|
3778
4013
|
continue;
|
|
3779
4014
|
}
|
|
3780
4015
|
for (const v of vtxos) {
|
|
3781
|
-
if (!
|
|
4016
|
+
if (!chunk5MLC2HU3_cjs.hasTerminalSpend(v) && !v.isSwept && !v.isUnrolled) {
|
|
3782
4017
|
out.add(`${v.txid}:${v.vout}`);
|
|
3783
4018
|
}
|
|
3784
4019
|
}
|
|
@@ -3813,10 +4048,10 @@ function byValueDescending(vtxos) {
|
|
|
3813
4048
|
return [...vtxos].sort((a, b) => b.value - a.value);
|
|
3814
4049
|
}
|
|
3815
4050
|
async function fetchTimeHeight(wallet) {
|
|
3816
|
-
return
|
|
4051
|
+
return chunk5MLC2HU3_cjs.resolveTimeHeight(wallet.onchainProvider);
|
|
3817
4052
|
}
|
|
3818
4053
|
function canMigrateBySend(vtxo, now) {
|
|
3819
|
-
if (!
|
|
4054
|
+
if (!chunk5MLC2HU3_cjs.canSpendOffchain(vtxo, now)) return false;
|
|
3820
4055
|
return vtxo.expiresAt !== void 0 || vtxo.expiresAtHeight !== void 0;
|
|
3821
4056
|
}
|
|
3822
4057
|
function byExpiryAscending(vtxos, now) {
|
|
@@ -3824,7 +4059,7 @@ function byExpiryAscending(vtxos, now) {
|
|
|
3824
4059
|
if (vtxo.isSwept) return -Infinity;
|
|
3825
4060
|
if (vtxo.expiresAt !== void 0) return vtxo.expiresAt.getTime();
|
|
3826
4061
|
if (vtxo.expiresAtHeight !== void 0) {
|
|
3827
|
-
return
|
|
4062
|
+
return chunk5MLC2HU3_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
|
|
3828
4063
|
}
|
|
3829
4064
|
return Infinity;
|
|
3830
4065
|
};
|
|
@@ -3851,7 +4086,7 @@ function priceSettlementInputs(vtxos, estimator) {
|
|
|
3851
4086
|
const payable = [];
|
|
3852
4087
|
const net = /* @__PURE__ */ new Map();
|
|
3853
4088
|
for (const vtxo of vtxos) {
|
|
3854
|
-
const inputFee = estimator.evalOffchainInput(
|
|
4089
|
+
const inputFee = estimator.evalOffchainInput(chunk5MLC2HU3_cjs.toOffchainInputFeeParams(vtxo));
|
|
3855
4090
|
if (inputFee.satoshis >= vtxo.value) {
|
|
3856
4091
|
continue;
|
|
3857
4092
|
}
|
|
@@ -3877,7 +4112,7 @@ function deductOffchainOutputFee(subtotal, estimator, arkAddress) {
|
|
|
3877
4112
|
}
|
|
3878
4113
|
const outputFee = estimator.evalOffchainOutput({
|
|
3879
4114
|
amount: subtotal,
|
|
3880
|
-
script: base.hex.encode(
|
|
4115
|
+
script: base.hex.encode(chunk5MLC2HU3_cjs.ArkAddress.decode(arkAddress).pkScript)
|
|
3881
4116
|
});
|
|
3882
4117
|
return subtotal - BigInt(outputFee.satoshis);
|
|
3883
4118
|
}
|
|
@@ -3895,10 +4130,10 @@ var DEFAULT_SETTLEMENT_CONFIG = {
|
|
|
3895
4130
|
};
|
|
3896
4131
|
function getRecoverableVtxos(vtxos, dustAmount, now) {
|
|
3897
4132
|
return vtxos.filter((vtxo) => {
|
|
3898
|
-
if (
|
|
4133
|
+
if (chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now)) {
|
|
3899
4134
|
return true;
|
|
3900
4135
|
}
|
|
3901
|
-
if (
|
|
4136
|
+
if (chunk5MLC2HU3_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
|
|
3902
4137
|
return true;
|
|
3903
4138
|
}
|
|
3904
4139
|
return false;
|
|
@@ -3928,8 +4163,9 @@ function getRecoverableWithSubdust(vtxos, dustAmount, now) {
|
|
|
3928
4163
|
};
|
|
3929
4164
|
}
|
|
3930
4165
|
function isVtxoExpiringSoon(vtxo, thresholdMs) {
|
|
4166
|
+
if (vtxo.isUnrolled) return false;
|
|
3931
4167
|
const realThresholdMs = thresholdMs <= 100 ? DEFAULT_THRESHOLD_MS : thresholdMs;
|
|
3932
|
-
const expiresAt =
|
|
4168
|
+
const expiresAt = chunk5MLC2HU3_cjs.normalizeVtxo(vtxo).expiresAt;
|
|
3933
4169
|
if (expiresAt === void 0) return false;
|
|
3934
4170
|
const now = Date.now();
|
|
3935
4171
|
const batchExpiry = expiresAt.getTime();
|
|
@@ -3938,7 +4174,9 @@ function isVtxoExpiringSoon(vtxo, thresholdMs) {
|
|
|
3938
4174
|
}
|
|
3939
4175
|
function getExpiringAndRecoverableVtxos(vtxos, thresholdMs, dustAmount, now) {
|
|
3940
4176
|
return vtxos.filter(
|
|
3941
|
-
|
|
4177
|
+
// The leading exclusion covers the `isSubdust` arm too, which is a value
|
|
4178
|
+
// property and would otherwise re-admit an exited coin on its own.
|
|
4179
|
+
(vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) || chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount))
|
|
3942
4180
|
);
|
|
3943
4181
|
}
|
|
3944
4182
|
function isMigrationCapable(wallet) {
|
|
@@ -4537,11 +4775,11 @@ var VtxoManager = class _VtxoManager {
|
|
|
4537
4775
|
`Sweep not economical: output ${outputAmount} sats after ${fee} sats fee is below dust (${dustAmount} sats)`
|
|
4538
4776
|
);
|
|
4539
4777
|
}
|
|
4540
|
-
const tx = new
|
|
4778
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction();
|
|
4541
4779
|
for (const utxo of expiredUtxos) {
|
|
4542
|
-
const utxoScript =
|
|
4780
|
+
const utxoScript = chunk5MLC2HU3_cjs.VtxoScript.decode(utxo.tapTree);
|
|
4543
4781
|
const utxoExitLeaf = utxoScript.leaves.find(
|
|
4544
|
-
(leaf) =>
|
|
4782
|
+
(leaf) => chunk5MLC2HU3_cjs.CSVMultisigTapscript.isScriptValid(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(leaf)) === true
|
|
4545
4783
|
);
|
|
4546
4784
|
if (!utxoExitLeaf) {
|
|
4547
4785
|
throw new Error(
|
|
@@ -4556,7 +4794,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
4556
4794
|
amount: BigInt(utxo.value)
|
|
4557
4795
|
},
|
|
4558
4796
|
tapLeafScript: [utxoExitLeaf],
|
|
4559
|
-
sequence:
|
|
4797
|
+
sequence: chunk5MLC2HU3_cjs.getSequence(utxoExitLeaf)
|
|
4560
4798
|
});
|
|
4561
4799
|
}
|
|
4562
4800
|
tx.addOutputAddress(boardingAddress, outputAmount, this.getNetwork());
|
|
@@ -4799,8 +5037,8 @@ var VtxoManager = class _VtxoManager {
|
|
|
4799
5037
|
const cls = classifyAgainstSignerSet(serverPubKey, signerSet, nowSeconds);
|
|
4800
5038
|
if (cls.status === "CURRENT") continue;
|
|
4801
5039
|
const live = vtxos.filter((v) => !v.isUnrolled);
|
|
4802
|
-
const recoverable = live.filter((v) => v.isSwept && !
|
|
4803
|
-
const spendable = live.filter((v) => !
|
|
5040
|
+
const recoverable = live.filter((v) => v.isSwept && !chunk5MLC2HU3_cjs.hasTerminalSpend(v));
|
|
5041
|
+
const spendable = live.filter((v) => !chunk5MLC2HU3_cjs.hasTerminalSpend(v) && !v.isSwept);
|
|
4804
5042
|
const value = spendable.reduce((sum, v) => sum + v.value, 0);
|
|
4805
5043
|
let recoverableCount = 0;
|
|
4806
5044
|
let recoverableValue = 0;
|
|
@@ -4813,7 +5051,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
4813
5051
|
awaitingSweepCount = spendable.length;
|
|
4814
5052
|
awaitingSweepValue = value;
|
|
4815
5053
|
for (const v of spendable) {
|
|
4816
|
-
const exp =
|
|
5054
|
+
const exp = chunk5MLC2HU3_cjs.toBatchExpiry(v);
|
|
4817
5055
|
if (exp !== void 0 && (nextSweepEta === void 0 || exp < nextSweepEta)) {
|
|
4818
5056
|
nextSweepEta = exp;
|
|
4819
5057
|
}
|
|
@@ -5074,7 +5312,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5074
5312
|
/** Decodes the boarding tapscript exit path to extract the CSV timelock. */
|
|
5075
5313
|
getBoardingTimelock() {
|
|
5076
5314
|
const wallet = this.getSweepWallet();
|
|
5077
|
-
const exitScript =
|
|
5315
|
+
const exitScript = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(
|
|
5078
5316
|
base.hex.decode(wallet.boardingTapscript.exitScript)
|
|
5079
5317
|
);
|
|
5080
5318
|
return exitScript.params.timelock;
|
|
@@ -5205,8 +5443,8 @@ var VtxoManager = class _VtxoManager {
|
|
|
5205
5443
|
* or doesn't carry the metadata.
|
|
5206
5444
|
*/
|
|
5207
5445
|
extractSpentOutpoint(error) {
|
|
5208
|
-
const ark =
|
|
5209
|
-
if (!
|
|
5446
|
+
const ark = chunk5MLC2HU3_cjs.maybeArkError(error);
|
|
5447
|
+
if (!chunk5MLC2HU3_cjs.isArkError(ark, chunk5MLC2HU3_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
|
|
5210
5448
|
const raw = ark.metadata?.vtxo_outpoint;
|
|
5211
5449
|
if (typeof raw !== "string") return void 0;
|
|
5212
5450
|
const [txid, voutStr] = raw.split(":");
|
|
@@ -5396,7 +5634,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5396
5634
|
if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
|
|
5397
5635
|
break;
|
|
5398
5636
|
}
|
|
5399
|
-
const inputFee = estimator.evalOffchainInput(
|
|
5637
|
+
const inputFee = estimator.evalOffchainInput(chunk5MLC2HU3_cjs.toOffchainInputFeeParams(v));
|
|
5400
5638
|
if (inputFee.satoshis >= v.value) {
|
|
5401
5639
|
continue;
|
|
5402
5640
|
}
|
|
@@ -5416,7 +5654,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5416
5654
|
const arkAddress = await this.wallet.getAddress();
|
|
5417
5655
|
const outputFee = estimator.evalOffchainOutput({
|
|
5418
5656
|
amount: totalAmount,
|
|
5419
|
-
script: base.hex.encode(
|
|
5657
|
+
script: base.hex.encode(chunk5MLC2HU3_cjs.ArkAddress.decode(arkAddress).pkScript)
|
|
5420
5658
|
});
|
|
5421
5659
|
totalAmount -= BigInt(outputFee.satoshis);
|
|
5422
5660
|
if (totalAmount < dustAmount) return;
|
|
@@ -5496,7 +5734,7 @@ var ArkNote = class _ArkNote {
|
|
|
5496
5734
|
this.value = value;
|
|
5497
5735
|
this.HRP = HRP;
|
|
5498
5736
|
const preimageHash = utils_js.sha256(this.preimage);
|
|
5499
|
-
this.vtxoScript = new
|
|
5737
|
+
this.vtxoScript = new chunk5MLC2HU3_cjs.VtxoScript([noteTapscript(preimageHash)]);
|
|
5500
5738
|
const leaf = this.vtxoScript.leaves[0];
|
|
5501
5739
|
this.txid = base.hex.encode(new Uint8Array(preimageHash).reverse());
|
|
5502
5740
|
this.tapTree = this.vtxoScript.encode();
|
|
@@ -5663,7 +5901,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
5663
5901
|
const privateKey = data.slice(1, 33);
|
|
5664
5902
|
const serverPubKey = data.slice(33, 65);
|
|
5665
5903
|
const sequence = new DataView(data.buffer, data.byteOffset + 65, 4).getUint32(0, false);
|
|
5666
|
-
const csvTimelock =
|
|
5904
|
+
const csvTimelock = chunk5MLC2HU3_cjs.sequenceToTimelock(sequence);
|
|
5667
5905
|
return new _ArkadeCash(privateKey, serverPubKey, csvTimelock, decoded.prefix);
|
|
5668
5906
|
}
|
|
5669
5907
|
toString() {
|
|
@@ -5671,7 +5909,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
5671
5909
|
data[0] = _ArkadeCash.Version;
|
|
5672
5910
|
data.set(this._privateKey, 1);
|
|
5673
5911
|
data.set(this._serverPubKey, 33);
|
|
5674
|
-
const sequence =
|
|
5912
|
+
const sequence = chunk5MLC2HU3_cjs.timelockToSequence(this.csvTimelock);
|
|
5675
5913
|
new DataView(data.buffer, data.byteOffset + 65, 4).setUint32(0, sequence, false);
|
|
5676
5914
|
const words = base.bech32m.toWords(data);
|
|
5677
5915
|
return base.bech32m.encode(this.hrp, words, 1023);
|
|
@@ -5680,7 +5918,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
5680
5918
|
return SingleKey.fromPrivateKey(this._privateKey);
|
|
5681
5919
|
}
|
|
5682
5920
|
get vtxoScript() {
|
|
5683
|
-
return new
|
|
5921
|
+
return new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
5684
5922
|
pubKey: this._publicKey,
|
|
5685
5923
|
serverPubKey: this._serverPubKey,
|
|
5686
5924
|
csvTimelock: this.csvTimelock
|
|
@@ -5941,7 +6179,7 @@ async function captureExitBranch(params) {
|
|
|
5941
6179
|
const nonCommitment = ordered.filter((c) => chainTxTypeToChainedExit(c.type) !== 1 /* Commitment */).map((c) => c.txid);
|
|
5942
6180
|
if (nonCommitment.length > 0) {
|
|
5943
6181
|
for (const psbt of await resolver.getVirtualTxs(nonCommitment)) {
|
|
5944
|
-
psbtByTxid.set(
|
|
6182
|
+
psbtByTxid.set(chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
5945
6183
|
}
|
|
5946
6184
|
}
|
|
5947
6185
|
}
|
|
@@ -5984,10 +6222,10 @@ var IndexerExitDataSource = class {
|
|
|
5984
6222
|
while (hasMore) {
|
|
5985
6223
|
const { chain: page, page: meta } = await this.indexer.getVtxoChain(
|
|
5986
6224
|
{ txid: vtxo.txid, vout: vtxo.vout },
|
|
5987
|
-
{ pageIndex, pageSize:
|
|
6225
|
+
{ pageIndex, pageSize: chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE }
|
|
5988
6226
|
);
|
|
5989
6227
|
chain.push(...page);
|
|
5990
|
-
hasMore = meta ? page.length ===
|
|
6228
|
+
hasMore = meta ? page.length === chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE : false;
|
|
5991
6229
|
pageIndex++;
|
|
5992
6230
|
}
|
|
5993
6231
|
return chain;
|
|
@@ -5999,12 +6237,12 @@ var IndexerExitDataSource = class {
|
|
|
5999
6237
|
while (hasMore) {
|
|
6000
6238
|
const { txs, page } = await this.indexer.getVirtualTxs(txids, {
|
|
6001
6239
|
pageIndex,
|
|
6002
|
-
pageSize:
|
|
6240
|
+
pageSize: chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE
|
|
6003
6241
|
});
|
|
6004
6242
|
for (const psbt of txs) {
|
|
6005
|
-
out.set(
|
|
6243
|
+
out.set(chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
6006
6244
|
}
|
|
6007
|
-
hasMore = page ? txs.length ===
|
|
6245
|
+
hasMore = page ? txs.length === chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE : false;
|
|
6008
6246
|
pageIndex++;
|
|
6009
6247
|
}
|
|
6010
6248
|
return out;
|
|
@@ -6025,7 +6263,7 @@ function chainedTxTypeToChainTxType(t) {
|
|
|
6025
6263
|
}
|
|
6026
6264
|
}
|
|
6027
6265
|
function psbtInputTxids(psbtBase64) {
|
|
6028
|
-
const tx =
|
|
6266
|
+
const tx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
|
|
6029
6267
|
const ids = [];
|
|
6030
6268
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
6031
6269
|
const txid = tx.getInput(i).txid;
|
|
@@ -6384,10 +6622,10 @@ async function resolveArkInfo(arkProvider, walletRepository) {
|
|
|
6384
6622
|
try {
|
|
6385
6623
|
info = await arkProvider.getInfo();
|
|
6386
6624
|
} catch (err) {
|
|
6387
|
-
if (!
|
|
6625
|
+
if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
|
|
6388
6626
|
const snapshot = await loadArkInfoSnapshot(walletRepository);
|
|
6389
6627
|
if (!snapshot) {
|
|
6390
|
-
throw new
|
|
6628
|
+
throw new chunk5MLC2HU3_cjs.ProviderUnavailableError(
|
|
6391
6629
|
"Arkade server info is unavailable and no cached snapshot exists",
|
|
6392
6630
|
{ cause: err }
|
|
6393
6631
|
);
|
|
@@ -6470,6 +6708,13 @@ var TxTree = class {
|
|
|
6470
6708
|
if (nbOfInputs !== 1) {
|
|
6471
6709
|
throw new Error(`unexpected number of inputs: ${nbOfInputs}, expected 1`);
|
|
6472
6710
|
}
|
|
6711
|
+
if (this.root.lockTime !== 0) {
|
|
6712
|
+
throw new Error(`unexpected locktime: ${this.root.lockTime}, expected 0`);
|
|
6713
|
+
}
|
|
6714
|
+
const sequence = this.root.getInput(0).sequence;
|
|
6715
|
+
if (sequence !== void 0 && sequence !== btcSigner.DEFAULT_SEQUENCE) {
|
|
6716
|
+
throw new Error(`unexpected sequence: ${sequence}, expected ${btcSigner.DEFAULT_SEQUENCE}`);
|
|
6717
|
+
}
|
|
6473
6718
|
if (this.children.size > nbOfOutputs - 1) {
|
|
6474
6719
|
throw new Error(
|
|
6475
6720
|
`unexpected number of children: ${this.children.size}, expected maximum ${nbOfOutputs - 1}`
|
|
@@ -6770,7 +7015,7 @@ function collectArkTxidsNeedingCreatedAt(vtxos) {
|
|
|
6770
7015
|
return [...txids];
|
|
6771
7016
|
}
|
|
6772
7017
|
async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnore, resolveTxCreatedAt) {
|
|
6773
|
-
const fromOldestVtxo = vtxos.map(
|
|
7018
|
+
const fromOldestVtxo = vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
|
|
6774
7019
|
const txidsNeedingCreatedAt = resolveTxCreatedAt ? collectArkTxidsNeedingCreatedAt(fromOldestVtxo) : [];
|
|
6775
7020
|
const resolvedCreatedAt = resolveTxCreatedAt && txidsNeedingCreatedAt.length > 0 ? await resolveTxCreatedAt(txidsNeedingCreatedAt) : /* @__PURE__ */ new Map();
|
|
6776
7021
|
const unmatchedSettledBoardingTxs = allBoardingTxs.filter(isSettledBoardingReceive).sort((a, b) => a.createdAt - b.createdAt);
|
|
@@ -6934,7 +7179,7 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
6934
7179
|
const virtualCoins = await this.wallet.getSpendableVtxos({
|
|
6935
7180
|
withRecoverable: false
|
|
6936
7181
|
});
|
|
6937
|
-
const controlAssetRef = params.controlAssetId ?
|
|
7182
|
+
const controlAssetRef = params.controlAssetId ? chunkGVHUHTRH_cjs.AssetRef.fromId(chunkGVHUHTRH_cjs.AssetId.fromString(params.controlAssetId)) : null;
|
|
6938
7183
|
const coinSelection = selectVirtualCoins(virtualCoins, Number(this.wallet.dustAmount));
|
|
6939
7184
|
let totalBtcSelected = 0n;
|
|
6940
7185
|
const assetChanges = /* @__PURE__ */ new Map();
|
|
@@ -6947,8 +7192,8 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
6947
7192
|
}
|
|
6948
7193
|
}
|
|
6949
7194
|
const groups = [];
|
|
6950
|
-
const issuedAssetOutput =
|
|
6951
|
-
const issuedAssetGroup =
|
|
7195
|
+
const issuedAssetOutput = chunkGVHUHTRH_cjs.AssetOutput.create(0, params.amount);
|
|
7196
|
+
const issuedAssetGroup = chunkGVHUHTRH_cjs.AssetGroup.create(
|
|
6952
7197
|
null,
|
|
6953
7198
|
controlAssetRef,
|
|
6954
7199
|
[],
|
|
@@ -6963,28 +7208,28 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
6963
7208
|
for (const [inputIndex, assets] of assetInputs) {
|
|
6964
7209
|
for (const asset of assets) {
|
|
6965
7210
|
if (asset.assetId !== assetId) continue;
|
|
6966
|
-
changeInputs.push(
|
|
7211
|
+
changeInputs.push(chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
6967
7212
|
}
|
|
6968
7213
|
}
|
|
6969
7214
|
groups.push(
|
|
6970
|
-
|
|
6971
|
-
|
|
7215
|
+
chunkGVHUHTRH_cjs.AssetGroup.create(
|
|
7216
|
+
chunkGVHUHTRH_cjs.AssetId.fromString(assetId),
|
|
6972
7217
|
null,
|
|
6973
7218
|
changeInputs,
|
|
6974
|
-
[
|
|
7219
|
+
[chunkGVHUHTRH_cjs.AssetOutput.create(0, amount)],
|
|
6975
7220
|
[]
|
|
6976
7221
|
)
|
|
6977
7222
|
);
|
|
6978
7223
|
}
|
|
6979
7224
|
}
|
|
6980
7225
|
const address = await this.wallet.getAddress();
|
|
6981
|
-
const outputAddress =
|
|
7226
|
+
const outputAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(address);
|
|
6982
7227
|
const outputs = [
|
|
6983
7228
|
{
|
|
6984
7229
|
script: outputAddress.pkScript,
|
|
6985
7230
|
amount: BigInt(totalBtcSelected)
|
|
6986
7231
|
},
|
|
6987
|
-
Extension.create([
|
|
7232
|
+
Extension.create([chunkGVHUHTRH_cjs.Packet.create(groups)]).txOut()
|
|
6988
7233
|
];
|
|
6989
7234
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(
|
|
6990
7235
|
coinSelection.inputs,
|
|
@@ -6992,7 +7237,7 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
6992
7237
|
);
|
|
6993
7238
|
return {
|
|
6994
7239
|
arkTxId: arkTxid,
|
|
6995
|
-
assetId:
|
|
7240
|
+
assetId: chunkGVHUHTRH_cjs.AssetId.create(arkTxid, 0).toString()
|
|
6996
7241
|
};
|
|
6997
7242
|
}
|
|
6998
7243
|
/**
|
|
@@ -7064,16 +7309,16 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7064
7309
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7065
7310
|
for (const asset of assets) {
|
|
7066
7311
|
if (asset.assetId !== params.assetId) continue;
|
|
7067
|
-
reissueInputs.push(
|
|
7312
|
+
reissueInputs.push(chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7068
7313
|
}
|
|
7069
7314
|
}
|
|
7070
7315
|
const totalAssetAmount = assetToReissueAmount + params.amount;
|
|
7071
|
-
const reissueAssetIdObj =
|
|
7072
|
-
const reissueAssetGroup =
|
|
7316
|
+
const reissueAssetIdObj = chunkGVHUHTRH_cjs.AssetId.fromString(params.assetId);
|
|
7317
|
+
const reissueAssetGroup = chunkGVHUHTRH_cjs.AssetGroup.create(
|
|
7073
7318
|
reissueAssetIdObj,
|
|
7074
7319
|
null,
|
|
7075
7320
|
reissueInputs,
|
|
7076
|
-
[
|
|
7321
|
+
[chunkGVHUHTRH_cjs.AssetOutput.create(0, totalAssetAmount)],
|
|
7077
7322
|
[]
|
|
7078
7323
|
);
|
|
7079
7324
|
const groups = [reissueAssetGroup];
|
|
@@ -7082,27 +7327,27 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7082
7327
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7083
7328
|
for (const asset of assets) {
|
|
7084
7329
|
if (asset.assetId !== assetId) continue;
|
|
7085
|
-
changeInputs.push(
|
|
7330
|
+
changeInputs.push(chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7086
7331
|
}
|
|
7087
7332
|
}
|
|
7088
7333
|
groups.push(
|
|
7089
|
-
|
|
7090
|
-
|
|
7334
|
+
chunkGVHUHTRH_cjs.AssetGroup.create(
|
|
7335
|
+
chunkGVHUHTRH_cjs.AssetId.fromString(assetId),
|
|
7091
7336
|
null,
|
|
7092
7337
|
changeInputs,
|
|
7093
|
-
[
|
|
7338
|
+
[chunkGVHUHTRH_cjs.AssetOutput.create(0, amount)],
|
|
7094
7339
|
[]
|
|
7095
7340
|
)
|
|
7096
7341
|
);
|
|
7097
7342
|
}
|
|
7098
7343
|
const address = await this.wallet.getAddress();
|
|
7099
|
-
const outputAddress =
|
|
7344
|
+
const outputAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(address);
|
|
7100
7345
|
const outputs = [
|
|
7101
7346
|
{
|
|
7102
7347
|
script: outputAddress.pkScript,
|
|
7103
7348
|
amount: BigInt(totalBtcSelected)
|
|
7104
7349
|
},
|
|
7105
|
-
Extension.create([
|
|
7350
|
+
Extension.create([chunkGVHUHTRH_cjs.Packet.create(groups)]).txOut()
|
|
7106
7351
|
];
|
|
7107
7352
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
|
|
7108
7353
|
return arkTxid;
|
|
@@ -7169,27 +7414,27 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7169
7414
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7170
7415
|
for (const asset of assets) {
|
|
7171
7416
|
if (asset.assetId !== assetId) continue;
|
|
7172
|
-
changeInputs.push(
|
|
7417
|
+
changeInputs.push(chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7173
7418
|
}
|
|
7174
7419
|
}
|
|
7175
7420
|
groups.push(
|
|
7176
|
-
|
|
7177
|
-
|
|
7421
|
+
chunkGVHUHTRH_cjs.AssetGroup.create(
|
|
7422
|
+
chunkGVHUHTRH_cjs.AssetId.fromString(assetId),
|
|
7178
7423
|
null,
|
|
7179
7424
|
changeInputs,
|
|
7180
|
-
amount > 0n ? [
|
|
7425
|
+
amount > 0n ? [chunkGVHUHTRH_cjs.AssetOutput.create(0, amount)] : [],
|
|
7181
7426
|
[]
|
|
7182
7427
|
)
|
|
7183
7428
|
);
|
|
7184
7429
|
}
|
|
7185
7430
|
const address = await this.wallet.getAddress();
|
|
7186
|
-
const outputAddress =
|
|
7431
|
+
const outputAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(address);
|
|
7187
7432
|
const outputs = [
|
|
7188
7433
|
{
|
|
7189
7434
|
script: outputAddress.pkScript,
|
|
7190
7435
|
amount: BigInt(totalBtcSelected)
|
|
7191
7436
|
},
|
|
7192
|
-
Extension.create([
|
|
7437
|
+
Extension.create([chunkGVHUHTRH_cjs.Packet.create(groups)]).txOut()
|
|
7193
7438
|
];
|
|
7194
7439
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
|
|
7195
7440
|
return arkTxid;
|
|
@@ -7214,7 +7459,7 @@ function castMetadata(metadata) {
|
|
|
7214
7459
|
} else {
|
|
7215
7460
|
throw new Error("Invalid metadata value type");
|
|
7216
7461
|
}
|
|
7217
|
-
md.push(
|
|
7462
|
+
md.push(chunkGVHUHTRH_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
|
|
7218
7463
|
}
|
|
7219
7464
|
return md;
|
|
7220
7465
|
}
|
|
@@ -7235,10 +7480,10 @@ var DelegateManagerImpl = class {
|
|
|
7235
7480
|
if (vtxos.length === 0) {
|
|
7236
7481
|
return { delegated: [], failed: [] };
|
|
7237
7482
|
}
|
|
7238
|
-
const destinationScript =
|
|
7483
|
+
const destinationScript = chunk5MLC2HU3_cjs.ArkAddress.decode(destination).pkScript;
|
|
7239
7484
|
const arkInfo = await this.arkInfoProvider.getInfo();
|
|
7240
7485
|
const delegateInfo = await this.delegateProvider.getDelegateInfo();
|
|
7241
|
-
const eligible = vtxos.map(
|
|
7486
|
+
const eligible = vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo).filter(
|
|
7242
7487
|
(v) => isAnnotated(v) && findDelegateTapLeaf(v, delegateInfo.pubkey) !== void 0
|
|
7243
7488
|
);
|
|
7244
7489
|
if (eligible.length === 0) {
|
|
@@ -7267,11 +7512,11 @@ var DelegateManagerImpl = class {
|
|
|
7267
7512
|
const groupByExpiry = /* @__PURE__ */ new Map();
|
|
7268
7513
|
let recoverableVtxos = [];
|
|
7269
7514
|
for (const vtxo of eligible) {
|
|
7270
|
-
if (
|
|
7515
|
+
if (chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now)) {
|
|
7271
7516
|
recoverableVtxos.push(vtxo);
|
|
7272
7517
|
continue;
|
|
7273
7518
|
}
|
|
7274
|
-
const expiry =
|
|
7519
|
+
const expiry = chunk5MLC2HU3_cjs.toBatchExpiry(vtxo);
|
|
7275
7520
|
if (!expiry) continue;
|
|
7276
7521
|
const dayKey = getDayTimestamp(expiry);
|
|
7277
7522
|
groupByExpiry.set(dayKey, [...groupByExpiry.get(dayKey) ?? [], vtxo]);
|
|
@@ -7336,7 +7581,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7336
7581
|
}
|
|
7337
7582
|
if (!delegateAt) {
|
|
7338
7583
|
const now = { timestamp: /* @__PURE__ */ new Date() };
|
|
7339
|
-
const expiryTimestamp = vtxos.filter((coin) => !
|
|
7584
|
+
const expiryTimestamp = vtxos.filter((coin) => !chunk5MLC2HU3_cjs.canRecoverOnchain(coin, now) && chunk5MLC2HU3_cjs.toBatchExpiry(coin)).reduce((min, coin) => Math.min(min, chunk5MLC2HU3_cjs.toBatchExpiry(coin)), Number.MAX_SAFE_INTEGER);
|
|
7340
7585
|
if (!expiryTimestamp || expiryTimestamp === Number.MAX_SAFE_INTEGER) {
|
|
7341
7586
|
delegateAt = new Date(Date.now() + 1 * 60 * 1e3);
|
|
7342
7587
|
} else {
|
|
@@ -7365,7 +7610,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7365
7610
|
let amount = 0n;
|
|
7366
7611
|
for (const coin of vtxos) {
|
|
7367
7612
|
const inputFee = estimator.evalOffchainInput({
|
|
7368
|
-
...
|
|
7613
|
+
...chunk5MLC2HU3_cjs.toOffchainInputFeeParams(coin),
|
|
7369
7614
|
type: "vtxo"
|
|
7370
7615
|
});
|
|
7371
7616
|
if (inputFee.value >= coin.value) {
|
|
@@ -7379,7 +7624,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7379
7624
|
const delegateFee = BigInt(Number(fee));
|
|
7380
7625
|
if (delegateFee > 0n) {
|
|
7381
7626
|
outputs.push({
|
|
7382
|
-
script:
|
|
7627
|
+
script: chunk5MLC2HU3_cjs.ArkAddress.decode(delegateAddress).pkScript,
|
|
7383
7628
|
amount: delegateFee
|
|
7384
7629
|
});
|
|
7385
7630
|
}
|
|
@@ -7412,10 +7657,10 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7412
7657
|
destinationScript
|
|
7413
7658
|
);
|
|
7414
7659
|
const forfeitOutputScript = btcSigner.OutScript.encode(
|
|
7415
|
-
btcSigner.Address(
|
|
7660
|
+
btcSigner.Address(chunk5MLC2HU3_cjs.getNetwork(network)).decode(forfeitAddress)
|
|
7416
7661
|
);
|
|
7417
7662
|
const forfeits = await Promise.all(
|
|
7418
|
-
vtxos.filter((v) => !
|
|
7663
|
+
vtxos.filter((v) => !chunk5MLC2HU3_cjs.canRecoverOnchain(v, { timestamp: /* @__PURE__ */ new Date() })).map(async (coin) => {
|
|
7419
7664
|
const forfeit = await makeDelegateForfeitTx(
|
|
7420
7665
|
coin,
|
|
7421
7666
|
dust,
|
|
@@ -7440,7 +7685,7 @@ async function makeDelegateForfeitTx(input, connectorAmount, delegatePubkey, for
|
|
|
7440
7685
|
index: input.vout,
|
|
7441
7686
|
witnessUtxo: {
|
|
7442
7687
|
amount: BigInt(input.value),
|
|
7443
|
-
script:
|
|
7688
|
+
script: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
7444
7689
|
},
|
|
7445
7690
|
sighashType: btcSigner.SigHash.ALL_ANYONECANPAY,
|
|
7446
7691
|
tapLeafScript: [delegateTapLeaf]
|
|
@@ -7498,7 +7743,7 @@ async function makeSignedDelegateIntent(identity, coins, outputs, onchainOutputs
|
|
|
7498
7743
|
expire_at: 0,
|
|
7499
7744
|
cosigners_public_keys: cosignerPubKeys
|
|
7500
7745
|
};
|
|
7501
|
-
const proof =
|
|
7746
|
+
const proof = chunk5MLC2HU3_cjs.Intent.create(message, coins, outputs);
|
|
7502
7747
|
const signedProof = await identity.sign(proof);
|
|
7503
7748
|
return {
|
|
7504
7749
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -7516,10 +7761,10 @@ function getDayTimestamp(timestamp) {
|
|
|
7516
7761
|
function findDelegateTapLeaf(vtxo, delegatePubkey) {
|
|
7517
7762
|
if (!vtxo.tapTree) return void 0;
|
|
7518
7763
|
const pk = delegatePubkey.length === 66 ? delegatePubkey.slice(2) : delegatePubkey;
|
|
7519
|
-
const vtxoScript =
|
|
7764
|
+
const vtxoScript = chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree);
|
|
7520
7765
|
return vtxoScript.leaves.find((tapLeaf) => {
|
|
7521
|
-
const arkTapscript =
|
|
7522
|
-
if (!
|
|
7766
|
+
const arkTapscript = chunk5MLC2HU3_cjs.decodeTapscript(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(tapLeaf));
|
|
7767
|
+
if (!chunk5MLC2HU3_cjs.MultisigTapscript.is(arkTapscript)) return false;
|
|
7523
7768
|
return arkTapscript.params.pubkeys.map(base.hex.encode).includes(pk);
|
|
7524
7769
|
});
|
|
7525
7770
|
}
|
|
@@ -7800,7 +8045,7 @@ function createManagedConnection(dbName, version, initDatabase2) {
|
|
|
7800
8045
|
};
|
|
7801
8046
|
}
|
|
7802
8047
|
function scriptFromArkAddress(address) {
|
|
7803
|
-
return base.hex.encode(
|
|
8048
|
+
return base.hex.encode(chunk5MLC2HU3_cjs.ArkAddress.decode(address).pkScript);
|
|
7804
8049
|
}
|
|
7805
8050
|
|
|
7806
8051
|
// src/repositories/indexedDB/schema.ts
|
|
@@ -8295,7 +8540,7 @@ function validateVtxosForScript(vtxos, script, context) {
|
|
|
8295
8540
|
}
|
|
8296
8541
|
async function getVtxosForContract(repo, contract) {
|
|
8297
8542
|
const vtxos = repo.getVtxosForScript ? await repo.getVtxosForScript(contract.script) : filterVtxosForScript(await repo.getVtxos(contract.address), contract.script);
|
|
8298
|
-
return vtxos.map(
|
|
8543
|
+
return vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
|
|
8299
8544
|
}
|
|
8300
8545
|
async function saveVtxosForContract(repo, contract, vtxos) {
|
|
8301
8546
|
if (repo.saveVtxosForScript) {
|
|
@@ -8437,7 +8682,7 @@ function decodeArkContract(encoded) {
|
|
|
8437
8682
|
}
|
|
8438
8683
|
function contractFromArkContract(encoded, options = {}) {
|
|
8439
8684
|
const parsed = decodeArkContract(encoded);
|
|
8440
|
-
const handler =
|
|
8685
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(parsed.type);
|
|
8441
8686
|
if (!handler) {
|
|
8442
8687
|
throw new Error(`No handler registered for contract type '${parsed.type}'`);
|
|
8443
8688
|
}
|
|
@@ -8451,9 +8696,9 @@ function contractFromArkContract(encoded, options = {}) {
|
|
|
8451
8696
|
metadata: options.metadata
|
|
8452
8697
|
};
|
|
8453
8698
|
}
|
|
8454
|
-
function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix =
|
|
8699
|
+
function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunk5MLC2HU3_cjs.DEFAULT_NETWORK.hrp, options = {}) {
|
|
8455
8700
|
const parsed = decodeArkContract(encoded);
|
|
8456
|
-
const handler =
|
|
8701
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.getOrThrow(parsed.type);
|
|
8457
8702
|
const params = parsed.data;
|
|
8458
8703
|
const vtxoScript = handler.createScript(params);
|
|
8459
8704
|
return {
|
|
@@ -8707,9 +8952,9 @@ var ContractWatcher = class {
|
|
|
8707
8952
|
this.connectionState = "connected";
|
|
8708
8953
|
this.reconnectAttempts = 0;
|
|
8709
8954
|
this.listenLoop().catch((e) => {
|
|
8710
|
-
if (
|
|
8955
|
+
if (chunk5MLC2HU3_cjs.isEventSourceError(e)) {
|
|
8711
8956
|
console.debug("ContractWatcher subscription disconnected; reconnecting");
|
|
8712
|
-
} else if (!
|
|
8957
|
+
} else if (!chunk5MLC2HU3_cjs.isEventSourceUnavailableError(e)) {
|
|
8713
8958
|
console.error(e);
|
|
8714
8959
|
}
|
|
8715
8960
|
this.connectionState = "disconnected";
|
|
@@ -8721,7 +8966,7 @@ var ContractWatcher = class {
|
|
|
8721
8966
|
this.scheduleReconnect();
|
|
8722
8967
|
});
|
|
8723
8968
|
} catch (error) {
|
|
8724
|
-
if (!
|
|
8969
|
+
if (!chunk5MLC2HU3_cjs.isEventSourceUnavailableError(error)) {
|
|
8725
8970
|
console.error("ContractWatcher connection failed:", error);
|
|
8726
8971
|
}
|
|
8727
8972
|
this.connectionState = "disconnected";
|
|
@@ -8747,7 +8992,7 @@ var ContractWatcher = class {
|
|
|
8747
8992
|
* slower; what it loses is push latency.
|
|
8748
8993
|
*/
|
|
8749
8994
|
reportEventSourceUnavailable(error) {
|
|
8750
|
-
if (!
|
|
8995
|
+
if (!chunk5MLC2HU3_cjs.isEventSourceUnavailableError(error)) return false;
|
|
8751
8996
|
if (!this.eventSourceReported) {
|
|
8752
8997
|
this.eventSourceReported = true;
|
|
8753
8998
|
console.warn(
|
|
@@ -8963,14 +9208,14 @@ var ContractWatcher = class {
|
|
|
8963
9208
|
const timestamp = Date.now();
|
|
8964
9209
|
if (update.newVtxos?.length) {
|
|
8965
9210
|
this.processSubscriptionVtxos(
|
|
8966
|
-
update.newVtxos.map(
|
|
9211
|
+
update.newVtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo),
|
|
8967
9212
|
"vtxo_received",
|
|
8968
9213
|
timestamp
|
|
8969
9214
|
);
|
|
8970
9215
|
}
|
|
8971
9216
|
if (update.spentVtxos?.length) {
|
|
8972
9217
|
this.processSubscriptionVtxos(
|
|
8973
|
-
update.spentVtxos.map(
|
|
9218
|
+
update.spentVtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo),
|
|
8974
9219
|
"vtxo_spent",
|
|
8975
9220
|
timestamp
|
|
8976
9221
|
);
|
|
@@ -9065,7 +9310,7 @@ var NON_TERMINAL_INTENT_STATES = ALL_INTENT_STATES.filter(
|
|
|
9065
9310
|
(s) => !isTerminalIntentState(s)
|
|
9066
9311
|
);
|
|
9067
9312
|
function isConsumed(vtxo) {
|
|
9068
|
-
return vtxo !== void 0 &&
|
|
9313
|
+
return vtxo !== void 0 && chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo);
|
|
9069
9314
|
}
|
|
9070
9315
|
async function classifyIntent(intent, vtxosByOutpoint, now) {
|
|
9071
9316
|
if (isTerminalIntentState(intent.state)) return void 0;
|
|
@@ -9108,7 +9353,7 @@ async function reconcileIntents(deps) {
|
|
|
9108
9353
|
let vtxosByOutpoint = /* @__PURE__ */ new Map();
|
|
9109
9354
|
if (outpoints.length > 0) {
|
|
9110
9355
|
try {
|
|
9111
|
-
const { vtxos } = await
|
|
9356
|
+
const { vtxos } = await chunk5MLC2HU3_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
|
|
9112
9357
|
vtxosByOutpoint = new Map(vtxos.map((v) => [outpointKey(v), v]));
|
|
9113
9358
|
} catch (e) {
|
|
9114
9359
|
console.error("reconcileIntents: failed to fetch input VTXO state", e);
|
|
@@ -9282,7 +9527,7 @@ var ContractManager = class _ContractManager {
|
|
|
9282
9527
|
await this.reconcileWatched();
|
|
9283
9528
|
this.markSyncOnline();
|
|
9284
9529
|
} catch (err) {
|
|
9285
|
-
if (!
|
|
9530
|
+
if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
|
|
9286
9531
|
this.markSyncDegraded(err);
|
|
9287
9532
|
}
|
|
9288
9533
|
this.initialized = true;
|
|
@@ -9414,7 +9659,7 @@ var ContractManager = class _ContractManager {
|
|
|
9414
9659
|
const from = Math.max(0, watermark - lookAhead.size);
|
|
9415
9660
|
const to = watermark + lookAhead.size;
|
|
9416
9661
|
const deps = lookAhead.candidateDeps();
|
|
9417
|
-
const handlers =
|
|
9662
|
+
const handlers = chunkWIFL5QYZ_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkWIFL5QYZ_cjs.contractHandlers.get(t)).filter(hasCandidates);
|
|
9418
9663
|
const band = /* @__PURE__ */ new Map();
|
|
9419
9664
|
for (let index = from; index <= to; index++) {
|
|
9420
9665
|
const descriptor = lookAhead.materialize(index);
|
|
@@ -9425,7 +9670,7 @@ var ContractManager = class _ContractManager {
|
|
|
9425
9670
|
index,
|
|
9426
9671
|
params: {
|
|
9427
9672
|
...candidate,
|
|
9428
|
-
...
|
|
9673
|
+
...chunkWIFL5QYZ_cjs.speculativeReceiveMetadata(descriptor)
|
|
9429
9674
|
}
|
|
9430
9675
|
});
|
|
9431
9676
|
}
|
|
@@ -9487,7 +9732,7 @@ var ContractManager = class _ContractManager {
|
|
|
9487
9732
|
});
|
|
9488
9733
|
for (const entry of pending) entry.catchUpPending = false;
|
|
9489
9734
|
} catch (err) {
|
|
9490
|
-
if (!
|
|
9735
|
+
if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
|
|
9491
9736
|
this.markSyncDegraded(err);
|
|
9492
9737
|
}
|
|
9493
9738
|
}
|
|
@@ -9537,7 +9782,7 @@ var ContractManager = class _ContractManager {
|
|
|
9537
9782
|
await this.fetchContractVxosFromIndexer([contract]);
|
|
9538
9783
|
this.markSyncOnline();
|
|
9539
9784
|
} catch (err) {
|
|
9540
|
-
if (!
|
|
9785
|
+
if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
|
|
9541
9786
|
this.markSyncDegraded(err);
|
|
9542
9787
|
}
|
|
9543
9788
|
await this.watcher.addContract(contract);
|
|
@@ -9574,7 +9819,7 @@ var ContractManager = class _ContractManager {
|
|
|
9574
9819
|
return result;
|
|
9575
9820
|
}
|
|
9576
9821
|
async upsertContractRow(params) {
|
|
9577
|
-
const handler =
|
|
9822
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(params.type);
|
|
9578
9823
|
if (!handler) {
|
|
9579
9824
|
throw new Error(`No handler registered for contract type '${params.type}'`);
|
|
9580
9825
|
}
|
|
@@ -9674,7 +9919,7 @@ var ContractManager = class _ContractManager {
|
|
|
9674
9919
|
`scanContracts: batchSize must be a positive integer (got ${String(opts.batchSize)})`
|
|
9675
9920
|
);
|
|
9676
9921
|
}
|
|
9677
|
-
const registered =
|
|
9922
|
+
const registered = chunkWIFL5QYZ_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkWIFL5QYZ_cjs.contractHandlers.get(t)).filter(isDiscoverable);
|
|
9678
9923
|
const discoverables = [
|
|
9679
9924
|
...registered.filter((h) => h.type === "boarding"),
|
|
9680
9925
|
...registered.filter((h) => h.type !== "boarding")
|
|
@@ -9809,7 +10054,7 @@ var ContractManager = class _ContractManager {
|
|
|
9809
10054
|
await this.syncContracts({ contracts, pageSize });
|
|
9810
10055
|
this.markSyncOnline();
|
|
9811
10056
|
} catch (err) {
|
|
9812
|
-
if (!
|
|
10057
|
+
if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
|
|
9813
10058
|
this.markSyncDegraded(err);
|
|
9814
10059
|
}
|
|
9815
10060
|
const vtxos = await this.getVtxosForContracts(contracts);
|
|
@@ -9830,7 +10075,7 @@ var ContractManager = class _ContractManager {
|
|
|
9830
10075
|
}
|
|
9831
10076
|
const tapscriptCache = tapscripts ?? /* @__PURE__ */ new Map();
|
|
9832
10077
|
return vtxos.map(
|
|
9833
|
-
(vtxo) => extendVirtualCoinForContract(
|
|
10078
|
+
(vtxo) => extendVirtualCoinForContract(chunk5MLC2HU3_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
|
|
9834
10079
|
);
|
|
9835
10080
|
}
|
|
9836
10081
|
/** @inheritdoc */
|
|
@@ -9874,14 +10119,14 @@ var ContractManager = class _ContractManager {
|
|
|
9874
10119
|
const byScript = new Map(contracts.map((contract) => [contract.script, contract]));
|
|
9875
10120
|
const asking = vtxos.filter((vtxo) => {
|
|
9876
10121
|
const contract = byScript.get(vtxo.script);
|
|
9877
|
-
return contract !== void 0 &&
|
|
10122
|
+
return contract !== void 0 && chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type)?.assertSpendableNow !== void 0;
|
|
9878
10123
|
});
|
|
9879
10124
|
if (asking.length === 0) return refused;
|
|
9880
10125
|
const tip = await this.currentChainTip();
|
|
9881
10126
|
const walletKey = await walletPubKey?.();
|
|
9882
10127
|
for (const vtxo of asking) {
|
|
9883
10128
|
const contract = byScript.get(vtxo.script);
|
|
9884
|
-
const handler =
|
|
10129
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
9885
10130
|
if (!handler?.assertSpendableNow) continue;
|
|
9886
10131
|
const context = {
|
|
9887
10132
|
collaborative: true,
|
|
@@ -9896,7 +10141,7 @@ var ContractManager = class _ContractManager {
|
|
|
9896
10141
|
// the next handler to answer a CSV question would meet a
|
|
9897
10142
|
// TypeError instead of a `false`. Carry the coin only when it
|
|
9898
10143
|
// really is one.
|
|
9899
|
-
vtxo:
|
|
10144
|
+
vtxo: chunk5MLC2HU3_cjs.isVirtualCoin(vtxo) && "status" in vtxo ? vtxo : void 0
|
|
9900
10145
|
};
|
|
9901
10146
|
try {
|
|
9902
10147
|
await handler.assertSpendableNow(
|
|
@@ -10052,7 +10297,7 @@ var ContractManager = class _ContractManager {
|
|
|
10052
10297
|
const { contractScript, collaborative = true, walletPubKey, vtxo } = options;
|
|
10053
10298
|
const [contract] = await this.getContracts({ script: contractScript });
|
|
10054
10299
|
if (!contract) return [];
|
|
10055
|
-
const handler =
|
|
10300
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
10056
10301
|
if (!handler) return [];
|
|
10057
10302
|
const script = handler.createScript(contract.params);
|
|
10058
10303
|
const tip = await this.currentChainTip();
|
|
@@ -10080,7 +10325,7 @@ var ContractManager = class _ContractManager {
|
|
|
10080
10325
|
const { contractScript, collaborative = true, walletPubKey } = options;
|
|
10081
10326
|
const [contract] = await this.getContracts({ script: contractScript });
|
|
10082
10327
|
if (!contract) return [];
|
|
10083
|
-
const handler =
|
|
10328
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
10084
10329
|
if (!handler) return [];
|
|
10085
10330
|
const script = handler.createScript(contract.params);
|
|
10086
10331
|
const context = {
|
|
@@ -10136,7 +10381,7 @@ var ContractManager = class _ContractManager {
|
|
|
10136
10381
|
}
|
|
10137
10382
|
async refreshOutpoints(outpoints) {
|
|
10138
10383
|
if (outpoints.length === 0) return;
|
|
10139
|
-
const { vtxos } = await
|
|
10384
|
+
const { vtxos } = await chunk5MLC2HU3_cjs.getNormalizedVtxos(this.config.indexerProvider, {
|
|
10140
10385
|
outpoints
|
|
10141
10386
|
});
|
|
10142
10387
|
if (vtxos.length === 0) return;
|
|
@@ -10215,7 +10460,7 @@ var ContractManager = class _ContractManager {
|
|
|
10215
10460
|
break;
|
|
10216
10461
|
}
|
|
10217
10462
|
} catch (err) {
|
|
10218
|
-
if (!
|
|
10463
|
+
if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
|
|
10219
10464
|
this.markSyncDegraded(err);
|
|
10220
10465
|
}
|
|
10221
10466
|
this.emitEvent(event);
|
|
@@ -10294,7 +10539,7 @@ var ContractManager = class _ContractManager {
|
|
|
10294
10539
|
*/
|
|
10295
10540
|
async reconcilePendingFrontier(contracts) {
|
|
10296
10541
|
const scriptToContract = new Map(contracts.map((c) => [c.script, c]));
|
|
10297
|
-
const vtxos = await
|
|
10542
|
+
const vtxos = await chunk5MLC2HU3_cjs.getAllNormalizedVtxos(
|
|
10298
10543
|
this.config.indexerProvider,
|
|
10299
10544
|
contracts.map((c) => c.script),
|
|
10300
10545
|
{ pendingOnly: true }
|
|
@@ -10377,7 +10622,7 @@ var ContractManager = class _ContractManager {
|
|
|
10377
10622
|
}
|
|
10378
10623
|
return result;
|
|
10379
10624
|
}
|
|
10380
|
-
async fetchContractVtxosBulk(contracts, pageSize =
|
|
10625
|
+
async fetchContractVtxosBulk(contracts, pageSize = chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
|
|
10381
10626
|
if (contracts.length === 0) {
|
|
10382
10627
|
return { vtxosByScript: /* @__PURE__ */ new Map(), promoted: /* @__PURE__ */ new Map() };
|
|
10383
10628
|
}
|
|
@@ -10393,7 +10638,7 @@ var ContractManager = class _ContractManager {
|
|
|
10393
10638
|
before: syncWindow.before
|
|
10394
10639
|
}
|
|
10395
10640
|
} : {};
|
|
10396
|
-
const vtxos = await
|
|
10641
|
+
const vtxos = await chunk5MLC2HU3_cjs.getAllNormalizedVtxos(
|
|
10397
10642
|
this.config.indexerProvider,
|
|
10398
10643
|
contracts.map((c) => c.script),
|
|
10399
10644
|
{ ...windowOpts, pageSize }
|
|
@@ -10538,7 +10783,7 @@ var deserializeTapLeaf = (t) => {
|
|
|
10538
10783
|
const s = base.hex.decode(t.s);
|
|
10539
10784
|
return [cb, s];
|
|
10540
10785
|
};
|
|
10541
|
-
var deserializeVtxo = (o) =>
|
|
10786
|
+
var deserializeVtxo = (o) => chunk5MLC2HU3_cjs.normalizeVtxo({
|
|
10542
10787
|
...o,
|
|
10543
10788
|
createdAt: new Date(o.createdAt),
|
|
10544
10789
|
tapTree: base.hex.decode(o.tapTree),
|
|
@@ -11361,7 +11606,7 @@ var HDDescriptorProvider = class _HDDescriptorProvider {
|
|
|
11361
11606
|
*/
|
|
11362
11607
|
materializeDescriptorAt(index) {
|
|
11363
11608
|
const descriptor = this.identity.descriptor;
|
|
11364
|
-
const network =
|
|
11609
|
+
const network = chunkWIFL5QYZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
11365
11610
|
const expansion = descriptorsScure.expand({ descriptor, network, index });
|
|
11366
11611
|
const keyInfo = expansion.expansionMap?.["@0"];
|
|
11367
11612
|
if (!keyInfo?.keyExpression) {
|
|
@@ -11509,7 +11754,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
|
|
|
11509
11754
|
const provider = await resolveDescriptorProvider(config, setup.walletRepository);
|
|
11510
11755
|
if (!provider) return void 0;
|
|
11511
11756
|
const allowSilentFallback = (config.walletMode ?? "auto") === "auto";
|
|
11512
|
-
const expectedContractType = setup.offchainTapscript instanceof
|
|
11757
|
+
const expectedContractType = setup.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? "delegate" : "default";
|
|
11513
11758
|
const factoryOpts = {
|
|
11514
11759
|
walletRepository: setup.walletRepository,
|
|
11515
11760
|
contractRepository: setup.contractRepository,
|
|
@@ -11710,7 +11955,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
|
|
|
11710
11955
|
};
|
|
11711
11956
|
function deriveLeafPubkey(descriptor) {
|
|
11712
11957
|
try {
|
|
11713
|
-
return
|
|
11958
|
+
return chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
11714
11959
|
} catch (e) {
|
|
11715
11960
|
throw new NonRangeableDescriptorError(
|
|
11716
11961
|
"Cannot derive leaf pubkey: descriptor is not a materialized, parsable tr(...) shape.",
|
|
@@ -11722,7 +11967,7 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
11722
11967
|
const pubKey = deriveLeafPubkey(descriptor);
|
|
11723
11968
|
const tapscript = rebuildTapscript(current, pubKey);
|
|
11724
11969
|
const serverPubKey = tapscript.options.serverPubKey;
|
|
11725
|
-
const csvTimelock =
|
|
11970
|
+
const csvTimelock = chunk5MLC2HU3_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
|
|
11726
11971
|
const base$1 = {
|
|
11727
11972
|
script: base.hex.encode(tapscript.pkScript),
|
|
11728
11973
|
address: tapscript.address(hrp, serverPubKey).encode(),
|
|
@@ -11733,11 +11978,11 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
11733
11978
|
// index-0 key. Without it, spends produce unsigned PSBTs that the
|
|
11734
11979
|
// server rejects with `INVALID_PSBT_INPUT (5): missing tapscript spend sig`.
|
|
11735
11980
|
metadata: {
|
|
11736
|
-
...tagSource && { source:
|
|
11981
|
+
...tagSource && { source: chunkWIFL5QYZ_cjs.WALLET_RECEIVE_SOURCE },
|
|
11737
11982
|
signingDescriptor: descriptor
|
|
11738
11983
|
}
|
|
11739
11984
|
};
|
|
11740
|
-
const params = tapscript instanceof
|
|
11985
|
+
const params = tapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? {
|
|
11741
11986
|
...base$1,
|
|
11742
11987
|
type: "delegate",
|
|
11743
11988
|
params: {
|
|
@@ -11758,10 +12003,10 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
11758
12003
|
return { tapscript, params };
|
|
11759
12004
|
}
|
|
11760
12005
|
function rebuildTapscript(current, pubKey) {
|
|
11761
|
-
if (current instanceof
|
|
11762
|
-
return new
|
|
12006
|
+
if (current instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script) {
|
|
12007
|
+
return new chunkWIFL5QYZ_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
|
|
11763
12008
|
}
|
|
11764
|
-
return new
|
|
12009
|
+
return new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
|
|
11765
12010
|
}
|
|
11766
12011
|
async function pickActiveReceive(contractRepository, serverPubKey, expectedType) {
|
|
11767
12012
|
const candidates = await contractRepository.getContracts({
|
|
@@ -11770,7 +12015,7 @@ async function pickActiveReceive(contractRepository, serverPubKey, expectedType)
|
|
|
11770
12015
|
});
|
|
11771
12016
|
const serverPubKeyHex = base.hex.encode(serverPubKey);
|
|
11772
12017
|
const matching = candidates.filter(
|
|
11773
|
-
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source ===
|
|
12018
|
+
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkWIFL5QYZ_cjs.WALLET_RECEIVE_SOURCE
|
|
11774
12019
|
).sort((a, b) => {
|
|
11775
12020
|
if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
|
|
11776
12021
|
return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
|
|
@@ -11826,7 +12071,7 @@ function computeOffchainBalance(vtxos, caps) {
|
|
|
11826
12071
|
}
|
|
11827
12072
|
};
|
|
11828
12073
|
for (const vtxo of vtxos) {
|
|
11829
|
-
if (
|
|
12074
|
+
if (chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo)) continue;
|
|
11830
12075
|
addAssets(owned, vtxo);
|
|
11831
12076
|
if (vtxo.isUnrolled) {
|
|
11832
12077
|
unrolled += vtxo.value;
|
|
@@ -11836,11 +12081,11 @@ function computeOffchainBalance(vtxos, caps) {
|
|
|
11836
12081
|
pendingRecovery += vtxo.value;
|
|
11837
12082
|
continue;
|
|
11838
12083
|
}
|
|
11839
|
-
if (
|
|
12084
|
+
if (chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now)) {
|
|
11840
12085
|
recoverable += vtxo.value;
|
|
11841
12086
|
continue;
|
|
11842
12087
|
}
|
|
11843
|
-
if (!
|
|
12088
|
+
if (!chunk5MLC2HU3_cjs.canSpendOffchain(vtxo, now)) continue;
|
|
11844
12089
|
if (vtxo.isPreconfirmed) {
|
|
11845
12090
|
preconfirmed += vtxo.value;
|
|
11846
12091
|
} else {
|
|
@@ -12010,12 +12255,12 @@ var InputSignerRouter = class {
|
|
|
12010
12255
|
};
|
|
12011
12256
|
|
|
12012
12257
|
// src/wallet/wallet.ts
|
|
12013
|
-
var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl ||
|
|
12258
|
+
var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunk5MLC2HU3_cjs.DEFAULT_ARKADE_SERVER_URL;
|
|
12014
12259
|
function intentProofJobs(coins) {
|
|
12015
12260
|
if (coins.length === 0) return [];
|
|
12016
12261
|
const coinJobs = coins.map((coin, i) => ({
|
|
12017
12262
|
index: i + 1,
|
|
12018
|
-
lookupScript:
|
|
12263
|
+
lookupScript: chunk5MLC2HU3_cjs.VtxoScript.decode(coin.tapTree).pkScript
|
|
12019
12264
|
}));
|
|
12020
12265
|
return [{ index: 0, lookupScript: coinJobs[0].lookupScript }, ...coinJobs];
|
|
12021
12266
|
}
|
|
@@ -12047,7 +12292,7 @@ function dedupeTimelocks(timelocks) {
|
|
|
12047
12292
|
const seen = /* @__PURE__ */ new Set();
|
|
12048
12293
|
const deduped = [];
|
|
12049
12294
|
for (const timelock of timelocks) {
|
|
12050
|
-
const sequence =
|
|
12295
|
+
const sequence = chunk5MLC2HU3_cjs.timelockToSequence(timelock).toString();
|
|
12051
12296
|
if (seen.has(sequence)) continue;
|
|
12052
12297
|
seen.add(sequence);
|
|
12053
12298
|
deduped.push(timelock);
|
|
@@ -12064,7 +12309,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
|
|
|
12064
12309
|
state: "active"
|
|
12065
12310
|
});
|
|
12066
12311
|
const newest = candidates.filter(
|
|
12067
|
-
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source ===
|
|
12312
|
+
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkWIFL5QYZ_cjs.WALLET_RECEIVE_SOURCE
|
|
12068
12313
|
).sort((a, b) => {
|
|
12069
12314
|
if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
|
|
12070
12315
|
return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
|
|
@@ -12072,7 +12317,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
|
|
|
12072
12317
|
if (!newest?.params.pubKey) return baseline;
|
|
12073
12318
|
try {
|
|
12074
12319
|
const pubKey = base.hex.decode(newest.params.pubKey);
|
|
12075
|
-
return new
|
|
12320
|
+
return new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
|
|
12076
12321
|
} catch (e) {
|
|
12077
12322
|
console.warn("Skipping malformed boarding contract at boot", newest.script, e);
|
|
12078
12323
|
return baseline;
|
|
@@ -12091,16 +12336,17 @@ function filterSnapshotVtxos(snapshot, filter, pendingSpendOutpoints) {
|
|
|
12091
12336
|
if (vtxo.isUnrolled) {
|
|
12092
12337
|
return !!f.withUnrolled;
|
|
12093
12338
|
}
|
|
12094
|
-
if (
|
|
12339
|
+
if (chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo)) {
|
|
12095
12340
|
return false;
|
|
12096
12341
|
}
|
|
12097
|
-
if (!f.withRecoverable &&
|
|
12342
|
+
if (!f.withRecoverable && chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now)) {
|
|
12098
12343
|
return false;
|
|
12099
12344
|
}
|
|
12100
12345
|
return true;
|
|
12101
12346
|
});
|
|
12102
12347
|
}
|
|
12103
12348
|
var PENDING_RECOVERY_REASON = "is past its operator signer's rotation cutoff \u2014 the operator will not co-sign it until it recovers";
|
|
12349
|
+
var UNROLLED_REASON = "was unilaterally exited and lives onchain \u2014 `Unroll.completeUnroll` is the only spend that reaches it";
|
|
12104
12350
|
function omittedOutpoints(before, after) {
|
|
12105
12351
|
if (before.length === after.length) return /* @__PURE__ */ new Set();
|
|
12106
12352
|
const kept = new Set(after.map((vtxo) => `${vtxo.txid}:${vtxo.vout}`));
|
|
@@ -12433,7 +12679,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12433
12679
|
*/
|
|
12434
12680
|
static async setupWalletConfig(config, pubKey) {
|
|
12435
12681
|
const arkadeServerUrl = getArkadeServerUrl(config);
|
|
12436
|
-
const arkProvider = config.arkProvider || new
|
|
12682
|
+
const arkProvider = config.arkProvider || new chunk5MLC2HU3_cjs.RestArkProvider(arkadeServerUrl);
|
|
12437
12683
|
let indexerProvider = config.indexerProvider;
|
|
12438
12684
|
if (!indexerProvider) {
|
|
12439
12685
|
let indexerUrl = config.indexerUrl;
|
|
@@ -12450,7 +12696,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12450
12696
|
indexerUrl = arkadeServerUrl;
|
|
12451
12697
|
}
|
|
12452
12698
|
}
|
|
12453
|
-
indexerProvider = new
|
|
12699
|
+
indexerProvider = new chunkGVHUHTRH_cjs.RestIndexerProvider(indexerUrl);
|
|
12454
12700
|
}
|
|
12455
12701
|
const walletRepository = config.storage?.walletRepository ?? new IndexedDBWalletRepository();
|
|
12456
12702
|
const contractRepository = config.storage?.contractRepository ?? new IndexedDBContractRepository();
|
|
@@ -12459,7 +12705,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12459
12705
|
source: serverInfoSource,
|
|
12460
12706
|
lastOnlineAt: serverInfoLastOnlineAt
|
|
12461
12707
|
} = await resolveArkInfo(arkProvider, walletRepository);
|
|
12462
|
-
const network =
|
|
12708
|
+
const network = chunk5MLC2HU3_cjs.getNetwork(info.network);
|
|
12463
12709
|
if ("descriptor" in config.identity) {
|
|
12464
12710
|
const descriptor = config.identity.descriptor;
|
|
12465
12711
|
const identityIsMainnet = !descriptor.includes("tpub");
|
|
@@ -12499,18 +12745,18 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12499
12745
|
value: info.boardingExitDelay,
|
|
12500
12746
|
type: info.boardingExitDelay < 512n ? "blocks" : "seconds"
|
|
12501
12747
|
};
|
|
12502
|
-
const serverPubKey =
|
|
12503
|
-
const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) =>
|
|
12748
|
+
const serverPubKey = chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
|
|
12749
|
+
const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : config.delegatorProvider ? await config.delegatorProvider.getDelegateInfo().then((info2) => chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : void 0;
|
|
12504
12750
|
const offchainOptions = {
|
|
12505
12751
|
pubKey,
|
|
12506
12752
|
serverPubKey,
|
|
12507
12753
|
csvTimelock: exitTimelock
|
|
12508
12754
|
};
|
|
12509
|
-
const offchainTapscript = !delegatePubKey ? new
|
|
12510
|
-
const boardingTapscript =
|
|
12755
|
+
const offchainTapscript = !delegatePubKey ? new chunkWIFL5QYZ_cjs.DefaultVtxo.Script(offchainOptions) : new chunkWIFL5QYZ_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
|
|
12756
|
+
const boardingTapscript = chunkWIFL5QYZ_cjs.BoardingContractHandler.createScript({
|
|
12511
12757
|
pubKey: base.hex.encode(pubKey),
|
|
12512
12758
|
serverPubKey: base.hex.encode(serverPubKey),
|
|
12513
|
-
csvTimelock:
|
|
12759
|
+
csvTimelock: chunk5MLC2HU3_cjs.timelockToSequence(boardingTimelock).toString()
|
|
12514
12760
|
});
|
|
12515
12761
|
return {
|
|
12516
12762
|
arkProvider,
|
|
@@ -12673,6 +12919,13 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12673
12919
|
"is locked by an in-flight settlement intent"
|
|
12674
12920
|
)
|
|
12675
12921
|
]);
|
|
12922
|
+
if (!filter?.withUnrolled) {
|
|
12923
|
+
logExcludedVtxos(
|
|
12924
|
+
"getSpendableVtxos",
|
|
12925
|
+
snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo)),
|
|
12926
|
+
[() => UNROLLED_REASON]
|
|
12927
|
+
);
|
|
12928
|
+
}
|
|
12676
12929
|
return unlocked;
|
|
12677
12930
|
}
|
|
12678
12931
|
/**
|
|
@@ -12812,7 +13065,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12812
13065
|
const response = await contractManager.getContractsWithVtxos();
|
|
12813
13066
|
const allVtxos = response.flatMap((_) => _.vtxos);
|
|
12814
13067
|
const { boardingTxs, commitmentsToIgnore } = await this.getBoardingTxs();
|
|
12815
|
-
const resolveTxCreatedAt = (txids) =>
|
|
13068
|
+
const resolveTxCreatedAt = (txids) => chunk5MLC2HU3_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
|
|
12816
13069
|
return buildTransactionHistory(
|
|
12817
13070
|
allVtxos,
|
|
12818
13071
|
boardingTxs,
|
|
@@ -12906,7 +13159,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12906
13159
|
},
|
|
12907
13160
|
isUnrolled: true,
|
|
12908
13161
|
...boardingFacts,
|
|
12909
|
-
virtualStatus:
|
|
13162
|
+
virtualStatus: chunk5MLC2HU3_cjs.toVirtualStatus(boardingFacts),
|
|
12910
13163
|
spentBy: "",
|
|
12911
13164
|
createdAt: tx.status.confirmed ? new Date(tx.status.block_time * 1e3) : /* @__PURE__ */ new Date(0),
|
|
12912
13165
|
script: scriptHex
|
|
@@ -12962,9 +13215,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12962
13215
|
async getBoardingTapscripts(allowedSigners) {
|
|
12963
13216
|
const byScript = /* @__PURE__ */ new Map();
|
|
12964
13217
|
const add = (s) => byScript.set(base.hex.encode(s.pkScript), s);
|
|
12965
|
-
const boardingCsv = this.boardingTapscript.options.csvTimelock ??
|
|
13218
|
+
const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
12966
13219
|
add(
|
|
12967
|
-
new
|
|
13220
|
+
new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
12968
13221
|
pubKey: await this.identity.xOnlyPublicKey(),
|
|
12969
13222
|
serverPubKey: this.boardingTapscript.options.serverPubKey,
|
|
12970
13223
|
csvTimelock: boardingCsv
|
|
@@ -12979,7 +13232,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12979
13232
|
for (const c of boardingContracts) {
|
|
12980
13233
|
if (!allowed.has(toXOnlySignerHex(c.params.serverPubKey))) continue;
|
|
12981
13234
|
try {
|
|
12982
|
-
add(
|
|
13235
|
+
add(chunkWIFL5QYZ_cjs.BoardingContractHandler.createScript(c.params));
|
|
12983
13236
|
} catch (e) {
|
|
12984
13237
|
console.warn("Skipping malformed boarding contract", c.script, e);
|
|
12985
13238
|
}
|
|
@@ -13017,7 +13270,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13017
13270
|
// Per-row CSV delay decoded from THIS tapscript's exit leaf —
|
|
13018
13271
|
// not the wallet's current boarding timelock, which a signer
|
|
13019
13272
|
// rotation may have changed.
|
|
13020
|
-
csvTimelock:
|
|
13273
|
+
csvTimelock: chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
|
|
13021
13274
|
coins: utxos
|
|
13022
13275
|
});
|
|
13023
13276
|
}
|
|
@@ -13150,7 +13403,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13150
13403
|
/** Fetch Arkade transaction ids that are still pending final settlement. */
|
|
13151
13404
|
async fetchPendingTxs() {
|
|
13152
13405
|
const scripts = await this.getWalletScripts();
|
|
13153
|
-
const vtxos = await
|
|
13406
|
+
const vtxos = await chunk5MLC2HU3_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
|
|
13154
13407
|
return vtxos.filter(
|
|
13155
13408
|
(vtxo) => (vtxo.isSpent || vtxo.isPreconfirmed && !vtxo.isSwept) && vtxo.arkTxId !== void 0
|
|
13156
13409
|
).map((_) => _.arkTxId);
|
|
@@ -13181,7 +13434,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13181
13434
|
});
|
|
13182
13435
|
for (const contract of contracts) {
|
|
13183
13436
|
if (map.has(contract.script)) continue;
|
|
13184
|
-
const handler =
|
|
13437
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
13185
13438
|
if (handler) {
|
|
13186
13439
|
const script = handler.createScript(contract.params);
|
|
13187
13440
|
map.set(contract.script, script);
|
|
@@ -13293,7 +13546,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13293
13546
|
}
|
|
13294
13547
|
});
|
|
13295
13548
|
const baselinePubkey = await this.identity.xOnlyPublicKey();
|
|
13296
|
-
const delegatePubKey = this.offchainTapscript instanceof
|
|
13549
|
+
const delegatePubKey = this.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
|
|
13297
13550
|
const baselineSigners = [
|
|
13298
13551
|
this.offchainTapscript.options.serverPubKey,
|
|
13299
13552
|
...[...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h))
|
|
@@ -13301,8 +13554,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13301
13554
|
const seenBaselineScripts = /* @__PURE__ */ new Set();
|
|
13302
13555
|
for (const serverPubKey of baselineSigners) {
|
|
13303
13556
|
for (const csvTimelock of this.walletContractTimelocks) {
|
|
13304
|
-
const csvTimelockStr =
|
|
13305
|
-
const defaultScript = new
|
|
13557
|
+
const csvTimelockStr = chunk5MLC2HU3_cjs.timelockToSequence(csvTimelock).toString();
|
|
13558
|
+
const defaultScript = new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
13306
13559
|
pubKey: baselinePubkey,
|
|
13307
13560
|
serverPubKey,
|
|
13308
13561
|
csvTimelock
|
|
@@ -13323,7 +13576,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13323
13576
|
});
|
|
13324
13577
|
}
|
|
13325
13578
|
if (delegatePubKey) {
|
|
13326
|
-
const delegateScript = new
|
|
13579
|
+
const delegateScript = new chunkWIFL5QYZ_cjs.DelegateVtxo.Script({
|
|
13327
13580
|
pubKey: baselinePubkey,
|
|
13328
13581
|
serverPubKey,
|
|
13329
13582
|
delegatePubKey,
|
|
@@ -13347,9 +13600,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13347
13600
|
}
|
|
13348
13601
|
}
|
|
13349
13602
|
}
|
|
13350
|
-
const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ??
|
|
13603
|
+
const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
13351
13604
|
for (const serverPubKey of baselineSigners) {
|
|
13352
|
-
const baselineBoarding = new
|
|
13605
|
+
const baselineBoarding = new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
13353
13606
|
pubKey: baselinePubkey,
|
|
13354
13607
|
serverPubKey,
|
|
13355
13608
|
csvTimelock: boardingCsvTimelock
|
|
@@ -13362,7 +13615,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13362
13615
|
params: {
|
|
13363
13616
|
pubKey: base.hex.encode(baselineBoarding.options.pubKey),
|
|
13364
13617
|
serverPubKey: base.hex.encode(serverPubKey),
|
|
13365
|
-
csvTimelock:
|
|
13618
|
+
csvTimelock: chunk5MLC2HU3_cjs.timelockToSequence(boardingCsvTimelock).toString()
|
|
13366
13619
|
},
|
|
13367
13620
|
script: boardingScriptHex,
|
|
13368
13621
|
address: baselineBoarding.address(this.network.hrp, serverPubKey).encode(),
|
|
@@ -13562,7 +13815,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13562
13815
|
serverPubKey: this.offchainTapscript.options.serverPubKey,
|
|
13563
13816
|
deprecatedSignerPubKeys: [...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h)),
|
|
13564
13817
|
csvTimelocks: this.walletContractTimelocks,
|
|
13565
|
-
delegatePubKey: this.offchainTapscript instanceof
|
|
13818
|
+
delegatePubKey: this.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
|
|
13566
13819
|
};
|
|
13567
13820
|
}
|
|
13568
13821
|
_signerRouter;
|
|
@@ -13807,7 +14060,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13807
14060
|
const [row] = await manager.getContracts({ script: base.hex.encode(display.pkScript) });
|
|
13808
14061
|
const persisted = row?.metadata?.signingDescriptor;
|
|
13809
14062
|
if (typeof persisted === "string") return persisted;
|
|
13810
|
-
return
|
|
14063
|
+
return chunkWIFL5QYZ_cjs.identityDescriptor(this.identity);
|
|
13811
14064
|
}
|
|
13812
14065
|
/**
|
|
13813
14066
|
* Build, persist and shape one address of `type` owned by `descriptor` —
|
|
@@ -13823,7 +14076,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13823
14076
|
async mintAddress(manager, type, descriptor, tagSource, allocated) {
|
|
13824
14077
|
if (type === "boarding") {
|
|
13825
14078
|
const built2 = this.buildBoardingContract(
|
|
13826
|
-
|
|
14079
|
+
chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(descriptor),
|
|
13827
14080
|
descriptor,
|
|
13828
14081
|
tagSource
|
|
13829
14082
|
);
|
|
@@ -13868,11 +14121,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13868
14121
|
* {@link buildReceiveContract}.
|
|
13869
14122
|
*/
|
|
13870
14123
|
buildBoardingContract(pubKey, descriptor, tagSource) {
|
|
13871
|
-
const tapscript = new
|
|
14124
|
+
const tapscript = new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
13872
14125
|
...this._boardingTapscript.options,
|
|
13873
14126
|
pubKey
|
|
13874
14127
|
});
|
|
13875
|
-
const csvTimelock = tapscript.options.csvTimelock ??
|
|
14128
|
+
const csvTimelock = tapscript.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
13876
14129
|
return {
|
|
13877
14130
|
tapscript,
|
|
13878
14131
|
params: {
|
|
@@ -13880,13 +14133,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13880
14133
|
params: {
|
|
13881
14134
|
pubKey: base.hex.encode(pubKey),
|
|
13882
14135
|
serverPubKey: base.hex.encode(tapscript.options.serverPubKey),
|
|
13883
|
-
csvTimelock:
|
|
14136
|
+
csvTimelock: chunk5MLC2HU3_cjs.timelockToSequence(csvTimelock).toString()
|
|
13884
14137
|
},
|
|
13885
14138
|
script: base.hex.encode(tapscript.pkScript),
|
|
13886
14139
|
address: tapscript.address(this.network.hrp, this.arkServerPublicKey).encode(),
|
|
13887
14140
|
state: "active",
|
|
13888
14141
|
metadata: {
|
|
13889
|
-
...tagSource && { source:
|
|
14142
|
+
...tagSource && { source: chunkWIFL5QYZ_cjs.WALLET_RECEIVE_SOURCE },
|
|
13890
14143
|
signingDescriptor: descriptor
|
|
13891
14144
|
}
|
|
13892
14145
|
}
|
|
@@ -13915,7 +14168,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13915
14168
|
if (this._descriptorProvider instanceof HDDescriptorProvider) {
|
|
13916
14169
|
return (await this.getContractManager()).getNextSigningDescriptor();
|
|
13917
14170
|
}
|
|
13918
|
-
return
|
|
14171
|
+
return chunkWIFL5QYZ_cjs.identityDescriptor(this.identity);
|
|
13919
14172
|
}
|
|
13920
14173
|
/**
|
|
13921
14174
|
* @see HDAllocationCapable.advanceSigningDescriptorWatermark
|
|
@@ -14011,7 +14264,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14011
14264
|
* the stable public API.
|
|
14012
14265
|
*/
|
|
14013
14266
|
async rotateServerSigner(newServerPubKey, checkpointTapscript) {
|
|
14014
|
-
const xonly =
|
|
14267
|
+
const xonly = chunkWIFL5QYZ_cjs.toXOnly(newServerPubKey, "ark signer key");
|
|
14015
14268
|
const newServerUnrollScript = assertValidServerUnrollScript(
|
|
14016
14269
|
checkpointTapscript,
|
|
14017
14270
|
resolveCheckpointExitDelayPolicy(this.network, this.checkpointExitDelayPolicy)
|
|
@@ -14040,21 +14293,21 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14040
14293
|
const [currentBoardingRow] = await manager.getContracts({
|
|
14041
14294
|
script: currentBoardingScript
|
|
14042
14295
|
});
|
|
14043
|
-
const newOffchain = this.offchainTapscript instanceof
|
|
14296
|
+
const newOffchain = this.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? new chunkWIFL5QYZ_cjs.DelegateVtxo.Script({
|
|
14044
14297
|
...this.offchainTapscript.options,
|
|
14045
14298
|
serverPubKey: xonly
|
|
14046
|
-
}) : new
|
|
14299
|
+
}) : new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
14047
14300
|
...this.offchainTapscript.options,
|
|
14048
14301
|
serverPubKey: xonly
|
|
14049
14302
|
});
|
|
14050
|
-
const newBoarding = new
|
|
14303
|
+
const newBoarding = new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
14051
14304
|
...this._boardingTapscript.options,
|
|
14052
14305
|
serverPubKey: xonly
|
|
14053
14306
|
});
|
|
14054
|
-
const offchainCsv =
|
|
14307
|
+
const offchainCsv = chunk5MLC2HU3_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
|
|
14055
14308
|
const newOffchainScript = base.hex.encode(newOffchain.pkScript);
|
|
14056
14309
|
const newOffchainAddress = newOffchain.address(this.network.hrp, xonly).encode();
|
|
14057
|
-
if (newOffchain instanceof
|
|
14310
|
+
if (newOffchain instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script) {
|
|
14058
14311
|
await manager.createContract({
|
|
14059
14312
|
type: "delegate",
|
|
14060
14313
|
params: {
|
|
@@ -14082,13 +14335,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14082
14335
|
metadata: currentOffchainRow?.metadata
|
|
14083
14336
|
});
|
|
14084
14337
|
}
|
|
14085
|
-
const boardingCsv = newBoarding.options.csvTimelock ??
|
|
14338
|
+
const boardingCsv = newBoarding.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
14086
14339
|
await manager.createContract({
|
|
14087
14340
|
type: "boarding",
|
|
14088
14341
|
params: {
|
|
14089
14342
|
pubKey: base.hex.encode(newBoarding.options.pubKey),
|
|
14090
14343
|
serverPubKey: base.hex.encode(xonly),
|
|
14091
|
-
csvTimelock:
|
|
14344
|
+
csvTimelock: chunk5MLC2HU3_cjs.timelockToSequence(boardingCsv).toString()
|
|
14092
14345
|
},
|
|
14093
14346
|
script: base.hex.encode(newBoarding.pkScript),
|
|
14094
14347
|
address: newBoarding.address(this.network.hrp, xonly).encode(),
|
|
@@ -14121,14 +14374,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14121
14374
|
_restoreInFlight;
|
|
14122
14375
|
_addPendingSpends(inputs) {
|
|
14123
14376
|
for (const input of inputs) {
|
|
14124
|
-
if (
|
|
14377
|
+
if (chunk5MLC2HU3_cjs.isVirtualCoin(input)) {
|
|
14125
14378
|
this._pendingSpendOutpoints.add(`${input.txid}:${input.vout}`);
|
|
14126
14379
|
}
|
|
14127
14380
|
}
|
|
14128
14381
|
}
|
|
14129
14382
|
_removePendingSpends(inputs) {
|
|
14130
14383
|
for (const input of inputs) {
|
|
14131
|
-
if (
|
|
14384
|
+
if (chunk5MLC2HU3_cjs.isVirtualCoin(input)) {
|
|
14132
14385
|
this._pendingSpendOutpoints.delete(`${input.txid}:${input.vout}`);
|
|
14133
14386
|
}
|
|
14134
14387
|
}
|
|
@@ -14186,13 +14439,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14186
14439
|
const manager = await this.getContractManager();
|
|
14187
14440
|
const provider = this._descriptorProvider;
|
|
14188
14441
|
const hd = provider instanceof HDDescriptorProvider;
|
|
14189
|
-
const staticDescriptor = hd ? void 0 : await
|
|
14442
|
+
const staticDescriptor = hd ? void 0 : await chunkWIFL5QYZ_cjs.identityDescriptor(this.identity);
|
|
14190
14443
|
const materialize = (index) => hd ? provider.materializeDescriptorAt(index) : staticDescriptor;
|
|
14191
|
-
const delegatePubKey = this.offchainTapscript instanceof
|
|
14444
|
+
const delegatePubKey = this.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
|
|
14192
14445
|
const arkInfo = await this.arkProvider.getInfo();
|
|
14193
|
-
const currentSignerPubKey =
|
|
14446
|
+
const currentSignerPubKey = chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(arkInfo.signerPubkey), "ark signer key");
|
|
14194
14447
|
const deprecatedSignerPubKeys = arkInfo.deprecatedSigners.map(
|
|
14195
|
-
(s) =>
|
|
14448
|
+
(s) => chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(s.pubkey), "deprecated signer key")
|
|
14196
14449
|
);
|
|
14197
14450
|
const deps = {
|
|
14198
14451
|
indexerProvider: this.indexerProvider,
|
|
@@ -14207,7 +14460,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14207
14460
|
csvTimelocks: this.walletContractTimelocks,
|
|
14208
14461
|
// Boarding-exit CSV so the boarding handler can build its
|
|
14209
14462
|
// candidate script (distinct from the unilateral-exit matrix).
|
|
14210
|
-
boardingTimelock: this.boardingTapscript.options.csvTimelock ??
|
|
14463
|
+
boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
|
|
14211
14464
|
delegatePubKey
|
|
14212
14465
|
};
|
|
14213
14466
|
const result = await manager.scanContracts({
|
|
@@ -14321,7 +14574,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14321
14574
|
throw new Error("Invalid configured public key");
|
|
14322
14575
|
}
|
|
14323
14576
|
const setup = await ReadonlyWallet.setupWalletConfig(config, pubkey);
|
|
14324
|
-
const forfeitPubkey =
|
|
14577
|
+
const forfeitPubkey = chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(setup.info.forfeitPubkey), "forfeit key");
|
|
14325
14578
|
const forfeitAddress = btcSigner.Address(setup.network).decode(setup.info.forfeitAddress);
|
|
14326
14579
|
const forfeitOutputScript = btcSigner.OutScript.encode(forfeitAddress);
|
|
14327
14580
|
const checkpointExitDelayOverrides = {
|
|
@@ -14470,7 +14723,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14470
14723
|
inputs: params.selectedVtxos,
|
|
14471
14724
|
changeAmount: BigInt(changeAmount)
|
|
14472
14725
|
};
|
|
14473
|
-
const outputAddress =
|
|
14726
|
+
const outputAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(params.address);
|
|
14474
14727
|
assertRecipientArkAddress(
|
|
14475
14728
|
params.address,
|
|
14476
14729
|
outputAddress,
|
|
@@ -14536,13 +14789,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14536
14789
|
void this.logUngatedInputs("settle({ inputs })", params.inputs);
|
|
14537
14790
|
}
|
|
14538
14791
|
const offchainAddress = await this.getAddress();
|
|
14539
|
-
const offchainPkScript =
|
|
14792
|
+
const offchainPkScript = chunk5MLC2HU3_cjs.ArkAddress.decode(offchainAddress).pkScript;
|
|
14540
14793
|
const offchainOutputScript = base.hex.encode(offchainPkScript);
|
|
14541
14794
|
if (!params) {
|
|
14542
14795
|
const { fees, vtxoMaxAmount } = await this.arkProvider.getInfo();
|
|
14543
14796
|
const estimator = new Estimator(fees.intentFee);
|
|
14544
14797
|
let amount = 0;
|
|
14545
|
-
const exitScript =
|
|
14798
|
+
const exitScript = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(
|
|
14546
14799
|
base.hex.decode(this.boardingTapscript.exitScript)
|
|
14547
14800
|
);
|
|
14548
14801
|
const boardingTimelock = exitScript.params.timelock;
|
|
@@ -14571,7 +14824,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14571
14824
|
if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
|
|
14572
14825
|
break;
|
|
14573
14826
|
}
|
|
14574
|
-
const inputFee = estimator.evalOffchainInput(
|
|
14827
|
+
const inputFee = estimator.evalOffchainInput(chunk5MLC2HU3_cjs.toOffchainInputFeeParams(vtxo));
|
|
14575
14828
|
if (inputFee.satoshis >= vtxo.value) {
|
|
14576
14829
|
continue;
|
|
14577
14830
|
}
|
|
@@ -14618,7 +14871,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14618
14871
|
let script;
|
|
14619
14872
|
let arkAddress;
|
|
14620
14873
|
try {
|
|
14621
|
-
arkAddress =
|
|
14874
|
+
arkAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(output.address);
|
|
14622
14875
|
} catch {
|
|
14623
14876
|
arkAddress = void 0;
|
|
14624
14877
|
}
|
|
@@ -14708,7 +14961,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14708
14961
|
const abortController = new AbortController();
|
|
14709
14962
|
let stream;
|
|
14710
14963
|
let committedTxid;
|
|
14711
|
-
const settleInputVtxos = params.inputs.filter(
|
|
14964
|
+
const settleInputVtxos = params.inputs.filter(chunk5MLC2HU3_cjs.isVirtualCoin);
|
|
14712
14965
|
const contractManager = await this.getContractManager();
|
|
14713
14966
|
await contractManager.assertAnnotatable(settleInputVtxos);
|
|
14714
14967
|
await contractManager.assertSpendableNow?.(
|
|
@@ -14820,7 +15073,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14820
15073
|
async maybeRotateBoardingAfterBoard(inputs) {
|
|
14821
15074
|
if (!this._descriptorProvider) return;
|
|
14822
15075
|
const consumedBoarding = inputs.some(
|
|
14823
|
-
(input) => typeof input !== "string" && !
|
|
15076
|
+
(input) => typeof input !== "string" && !chunk5MLC2HU3_cjs.isVirtualCoin(input)
|
|
14824
15077
|
);
|
|
14825
15078
|
if (!consumedBoarding) return;
|
|
14826
15079
|
try {
|
|
@@ -14844,7 +15097,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14844
15097
|
let connectorIndex = 0;
|
|
14845
15098
|
const connectorsLeaves = connectorsGraph?.leaves() || [];
|
|
14846
15099
|
for (const input of inputs) {
|
|
14847
|
-
if (!
|
|
15100
|
+
if (!chunk5MLC2HU3_cjs.isVirtualCoin(input)) {
|
|
14848
15101
|
for (let i = 0; i < settlementPsbt.inputsLength; i++) {
|
|
14849
15102
|
const settlementInput = settlementPsbt.getInput(i);
|
|
14850
15103
|
if (!settlementInput.txid || settlementInput.index === void 0) {
|
|
@@ -14875,7 +15128,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14875
15128
|
}
|
|
14876
15129
|
continue;
|
|
14877
15130
|
}
|
|
14878
|
-
if (
|
|
15131
|
+
if (chunk5MLC2HU3_cjs.canRecoverOnchain(input, { timestamp: /* @__PURE__ */ new Date() }) || isSubdust({ value: input.value }, this.dustAmount)) {
|
|
14879
15132
|
continue;
|
|
14880
15133
|
}
|
|
14881
15134
|
if (connectorsLeaves.length === 0) {
|
|
@@ -14903,7 +15156,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14903
15156
|
index: input.vout,
|
|
14904
15157
|
witnessUtxo: {
|
|
14905
15158
|
amount: BigInt(input.value),
|
|
14906
|
-
script:
|
|
15159
|
+
script: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
14907
15160
|
},
|
|
14908
15161
|
sighashType: btcSigner.SigHash.DEFAULT,
|
|
14909
15162
|
tapLeafScript: [input.forfeitTapLeafScript]
|
|
@@ -14922,7 +15175,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14922
15175
|
forfeitTx = await this._signerRouter.sign(forfeitTx, [
|
|
14923
15176
|
{
|
|
14924
15177
|
index: 0,
|
|
14925
|
-
lookupScript:
|
|
15178
|
+
lookupScript: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
14926
15179
|
}
|
|
14927
15180
|
]);
|
|
14928
15181
|
signedForfeits.push(base.base64.encode(forfeitTx.toPSBT()));
|
|
@@ -14980,7 +15233,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14980
15233
|
resolveBatchExpiryPolicy(this.network, this.batchExpiryPolicy)
|
|
14981
15234
|
);
|
|
14982
15235
|
await this.arkProvider.confirmRegistration(intentId);
|
|
14983
|
-
const sweepTapscript =
|
|
15236
|
+
const sweepTapscript = chunk5MLC2HU3_cjs.CSVMultisigTapscript.encode({
|
|
14984
15237
|
timelock,
|
|
14985
15238
|
pubkeys: [this.forfeitPubkey]
|
|
14986
15239
|
}).script;
|
|
@@ -14995,10 +15248,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14995
15248
|
throw new Error("Sweep tap tree root not set");
|
|
14996
15249
|
}
|
|
14997
15250
|
const xOnlyPublicKeys = event.cosignersPublicKeys.map(
|
|
14998
|
-
(k) => base.hex.encode(
|
|
15251
|
+
(k) => base.hex.encode(chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
|
|
14999
15252
|
);
|
|
15000
15253
|
const signerPublicKey = await session.getPublicKey();
|
|
15001
|
-
const xonlySignerPublicKey =
|
|
15254
|
+
const xonlySignerPublicKey = chunkWIFL5QYZ_cjs.toXOnly(signerPublicKey, "signer key");
|
|
15002
15255
|
if (!xOnlyPublicKeys.includes(base.hex.encode(xonlySignerPublicKey))) {
|
|
15003
15256
|
return { skip: true };
|
|
15004
15257
|
}
|
|
@@ -15088,9 +15341,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15088
15341
|
...existing ?? {},
|
|
15089
15342
|
intentTxId,
|
|
15090
15343
|
registerProof: intent.proof,
|
|
15091
|
-
registerProofMessage:
|
|
15344
|
+
registerProofMessage: chunk5MLC2HU3_cjs.Intent.encodeMessage(intent.message),
|
|
15092
15345
|
deleteProof: deleteIntent.proof,
|
|
15093
|
-
deleteProofMessage:
|
|
15346
|
+
deleteProofMessage: chunk5MLC2HU3_cjs.Intent.encodeMessage(deleteIntent.message),
|
|
15094
15347
|
intentVtxos: inputs.map((i) => ({
|
|
15095
15348
|
txid: i.txid,
|
|
15096
15349
|
vout: i.vout
|
|
@@ -15122,7 +15375,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15122
15375
|
try {
|
|
15123
15376
|
return await this.arkProvider.registerIntent(intent);
|
|
15124
15377
|
} catch (error) {
|
|
15125
|
-
if (error instanceof
|
|
15378
|
+
if (error instanceof chunk5MLC2HU3_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
|
|
15126
15379
|
const deleteIntent = await this.makeDeleteIntentSignature(inputs);
|
|
15127
15380
|
await this.arkProvider.deleteIntent(deleteIntent);
|
|
15128
15381
|
return this.arkProvider.registerIntent(intent);
|
|
@@ -15138,7 +15391,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15138
15391
|
expire_at: 0,
|
|
15139
15392
|
cosigners_public_keys: cosignerPubKeys
|
|
15140
15393
|
};
|
|
15141
|
-
const proof =
|
|
15394
|
+
const proof = chunk5MLC2HU3_cjs.Intent.create(message, coins, outputs);
|
|
15142
15395
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15143
15396
|
return {
|
|
15144
15397
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15150,7 +15403,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15150
15403
|
type: "delete",
|
|
15151
15404
|
expire_at: 0
|
|
15152
15405
|
};
|
|
15153
|
-
const proof =
|
|
15406
|
+
const proof = chunk5MLC2HU3_cjs.Intent.create(message, coins, []);
|
|
15154
15407
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15155
15408
|
return {
|
|
15156
15409
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15162,7 +15415,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15162
15415
|
type: "get-pending-tx",
|
|
15163
15416
|
expire_at: 0
|
|
15164
15417
|
};
|
|
15165
|
-
const proof =
|
|
15418
|
+
const proof = chunk5MLC2HU3_cjs.Intent.create(message, coins, []);
|
|
15166
15419
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15167
15420
|
return {
|
|
15168
15421
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15183,7 +15436,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15183
15436
|
if (!vtxos || vtxos.length === 0) {
|
|
15184
15437
|
const scriptMap = await this.getScriptMap();
|
|
15185
15438
|
const allExtended = [];
|
|
15186
|
-
const fetchedVtxos = await
|
|
15439
|
+
const fetchedVtxos = await chunk5MLC2HU3_cjs.getAllNormalizedVtxos(this.indexerProvider, [
|
|
15187
15440
|
...scriptMap.keys()
|
|
15188
15441
|
]);
|
|
15189
15442
|
for (const vtxo of fetchedVtxos) {
|
|
@@ -15225,9 +15478,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15225
15478
|
seen.add(pendingTx.arkTxid);
|
|
15226
15479
|
batchPending.push(pendingTx.arkTxid);
|
|
15227
15480
|
try {
|
|
15228
|
-
const checkpointTxs = pendingTx.signedCheckpointTxs.map(
|
|
15229
|
-
|
|
15230
|
-
|
|
15481
|
+
const checkpointTxs = pendingTx.signedCheckpointTxs.map((c) => {
|
|
15482
|
+
const tx = btcSigner.Transaction.fromPSBT(base.base64.decode(c));
|
|
15483
|
+
chunk5MLC2HU3_cjs.assertAllowedSighashTypes(tx);
|
|
15484
|
+
return tx;
|
|
15485
|
+
});
|
|
15231
15486
|
assertCheckpointsMatchInputs(
|
|
15232
15487
|
checkpointTxs,
|
|
15233
15488
|
checkpointInputs,
|
|
@@ -15297,11 +15552,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15297
15552
|
* against the current key alone would leave it pending forever.
|
|
15298
15553
|
*/
|
|
15299
15554
|
checkpointUnrollCandidates(info) {
|
|
15300
|
-
const current =
|
|
15555
|
+
const current = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
|
|
15301
15556
|
const candidates = [this._serverUnrollScript, current];
|
|
15302
15557
|
for (const deprecated of signerSetFromInfo(info).deprecated.keys()) {
|
|
15303
15558
|
candidates.push(
|
|
15304
|
-
|
|
15559
|
+
chunk5MLC2HU3_cjs.CSVMultisigTapscript.encode({
|
|
15305
15560
|
...current.params,
|
|
15306
15561
|
pubkeys: [base.hex.decode(deprecated)]
|
|
15307
15562
|
})
|
|
@@ -15392,10 +15647,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15392
15647
|
if (vtxos.length === 0) {
|
|
15393
15648
|
throw new Error("No VTXOs found for this arkadeCash");
|
|
15394
15649
|
}
|
|
15395
|
-
const myPkScript =
|
|
15650
|
+
const myPkScript = chunk5MLC2HU3_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
|
|
15396
15651
|
let { spendable, unclaimed } = this.classifyCashVtxos(vtxos);
|
|
15397
15652
|
let swept = 0;
|
|
15398
|
-
const drainable = vtxos.filter(
|
|
15653
|
+
const drainable = vtxos.filter(
|
|
15654
|
+
(vtxo) => !isSubdust(vtxo, this.dustAmount) && !vtxo.isUnrolled
|
|
15655
|
+
);
|
|
15399
15656
|
if (drainable.length > 0) {
|
|
15400
15657
|
let drained = { count: 0, swept: 0, claimed: /* @__PURE__ */ new Set() };
|
|
15401
15658
|
try {
|
|
@@ -15466,7 +15723,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15466
15723
|
const spendable = [];
|
|
15467
15724
|
const unclaimed = [];
|
|
15468
15725
|
for (const vtxo of vtxos) {
|
|
15469
|
-
if (
|
|
15726
|
+
if (chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo)) {
|
|
15470
15727
|
unclaimed.push(cashReport(vtxo, "already-spent"));
|
|
15471
15728
|
} else if (vtxo.isUnrolled) {
|
|
15472
15729
|
unclaimed.push(cashReport(vtxo, "exited"));
|
|
@@ -15488,7 +15745,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15488
15745
|
const all = [];
|
|
15489
15746
|
const seen = /* @__PURE__ */ new Set();
|
|
15490
15747
|
for (let pageIndex = 0; ; pageIndex++) {
|
|
15491
|
-
const { vtxos, page } = await
|
|
15748
|
+
const { vtxos, page } = await chunk5MLC2HU3_cjs.getNormalizedVtxos(this.indexerProvider, {
|
|
15492
15749
|
scripts,
|
|
15493
15750
|
pageIndex,
|
|
15494
15751
|
pageSize
|
|
@@ -15535,7 +15792,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15535
15792
|
for (let i = 0; i < inputs.length; i += MAX_INPUTS_PER_INTENT) {
|
|
15536
15793
|
const batch = inputs.slice(i, i + MAX_INPUTS_PER_INTENT);
|
|
15537
15794
|
const message = { type: "get-pending-tx", expire_at: 0 };
|
|
15538
|
-
const proof =
|
|
15795
|
+
const proof = chunk5MLC2HU3_cjs.Intent.create(message, batch, []);
|
|
15539
15796
|
const signedProof = await identity.sign(
|
|
15540
15797
|
proof,
|
|
15541
15798
|
Array.from({ length: batch.length + 1 }, (_, j) => j)
|
|
@@ -15555,9 +15812,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15555
15812
|
const unrollCandidates = this.checkpointUnrollCandidates(await this.arkProvider.getInfo());
|
|
15556
15813
|
for (const pendingTx of pendingTxs) {
|
|
15557
15814
|
try {
|
|
15558
|
-
const checkpointTxs = pendingTx.signedCheckpointTxs.map(
|
|
15559
|
-
|
|
15560
|
-
|
|
15815
|
+
const checkpointTxs = pendingTx.signedCheckpointTxs.map((checkpoint) => {
|
|
15816
|
+
const tx = btcSigner.Transaction.fromPSBT(base.base64.decode(checkpoint));
|
|
15817
|
+
chunk5MLC2HU3_cjs.assertAllowedSighashTypes(tx);
|
|
15818
|
+
return tx;
|
|
15819
|
+
});
|
|
15561
15820
|
assertCheckpointsMatchInputs(
|
|
15562
15821
|
checkpointTxs,
|
|
15563
15822
|
inputs.map((input) => ({
|
|
@@ -15754,7 +16013,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15754
16013
|
script: recipient.script,
|
|
15755
16014
|
amount: BigInt(recipient.amount),
|
|
15756
16015
|
// Already checked against the recipient address in `validateRecipients`.
|
|
15757
|
-
...recipient.tapTree ? { tapTree:
|
|
16016
|
+
...recipient.tapTree ? { tapTree: chunk5MLC2HU3_cjs.TapTreeCoder.decode(recipient.tapTree) } : {}
|
|
15758
16017
|
}));
|
|
15759
16018
|
const totalBtcOutput = outputs.reduce((sum, o) => sum + Number(o.amount), 0);
|
|
15760
16019
|
let changeAmount = totalBtcSelected - totalBtcOutput;
|
|
@@ -15898,10 +16157,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15898
16157
|
const serverPubKey = this.arkServerPublicKey;
|
|
15899
16158
|
const serverUnrollScript = this.serverUnrollScript;
|
|
15900
16159
|
const arkAddress = offchainTapscript.address(this.network.hrp, serverPubKey);
|
|
15901
|
-
const normalizedInputs = inputs.map(
|
|
15902
|
-
const at = now ?? await
|
|
16160
|
+
const normalizedInputs = inputs.map(chunk5MLC2HU3_cjs.normalizeVtxo);
|
|
16161
|
+
const at = now ?? await chunk5MLC2HU3_cjs.resolveTimeHeight(this.onchainProvider);
|
|
15903
16162
|
for (const input of normalizedInputs) {
|
|
15904
|
-
if (!
|
|
16163
|
+
if (!chunk5MLC2HU3_cjs.canSpendOffchain(input, at)) {
|
|
15905
16164
|
throw new Error(
|
|
15906
16165
|
`sendSelectedVtxosToSelf: input ${input.txid}:${input.vout} is not cooperatively spendable`
|
|
15907
16166
|
);
|
|
@@ -15971,7 +16230,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15971
16230
|
);
|
|
15972
16231
|
const arkTxJobs = inputs.map((input, index) => ({
|
|
15973
16232
|
index,
|
|
15974
|
-
lookupScript:
|
|
16233
|
+
lookupScript: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
15975
16234
|
}));
|
|
15976
16235
|
const identity = this.identity;
|
|
15977
16236
|
const signer = {
|
|
@@ -16057,14 +16316,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16057
16316
|
const spentBy = checkpointIdByOutpoint.get(`${vtxo.txid}:${vtxo.vout}`);
|
|
16058
16317
|
spentVtxos.push({
|
|
16059
16318
|
...spentFacts,
|
|
16060
|
-
virtualStatus:
|
|
16319
|
+
virtualStatus: chunk5MLC2HU3_cjs.toVirtualStatus(spentFacts),
|
|
16061
16320
|
...spentBy ? { spentBy } : {},
|
|
16062
16321
|
arkTxId: arkTxid
|
|
16063
16322
|
});
|
|
16064
16323
|
for (const id of vtxo.commitmentTxIds) {
|
|
16065
16324
|
commitmentTxIds.add(id);
|
|
16066
16325
|
}
|
|
16067
|
-
const vtxoExpiry =
|
|
16326
|
+
const vtxoExpiry = chunk5MLC2HU3_cjs.toBatchExpiry(vtxo);
|
|
16068
16327
|
if (vtxoExpiry) {
|
|
16069
16328
|
batchExpiry = Math.min(batchExpiry, vtxoExpiry);
|
|
16070
16329
|
}
|
|
@@ -16077,7 +16336,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16077
16336
|
isSwept: false,
|
|
16078
16337
|
isPreconfirmed: true,
|
|
16079
16338
|
commitmentTxIds: Array.from(commitmentTxIds),
|
|
16080
|
-
...
|
|
16339
|
+
...chunk5MLC2HU3_cjs.parseLegacyExpiry(batchExpiry)
|
|
16081
16340
|
};
|
|
16082
16341
|
changeVtxo = {
|
|
16083
16342
|
txid: arkTxid,
|
|
@@ -16089,7 +16348,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16089
16348
|
tapTree: offchainTapscript.encode(),
|
|
16090
16349
|
value: Number(changeAmount),
|
|
16091
16350
|
...changeFacts,
|
|
16092
|
-
virtualStatus:
|
|
16351
|
+
virtualStatus: chunk5MLC2HU3_cjs.toVirtualStatus(changeFacts),
|
|
16093
16352
|
spentBy: "",
|
|
16094
16353
|
status: {
|
|
16095
16354
|
confirmed: false
|
|
@@ -16158,12 +16417,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16158
16417
|
const spentVtxos = [];
|
|
16159
16418
|
const inputArkTxIds = /* @__PURE__ */ new Set();
|
|
16160
16419
|
const boardingRemovalsByAddress = /* @__PURE__ */ new Map();
|
|
16161
|
-
const vtxoInputs = inputs.filter(
|
|
16420
|
+
const vtxoInputs = inputs.filter(chunk5MLC2HU3_cjs.isVirtualCoin);
|
|
16162
16421
|
const cm = await this.getContractManager();
|
|
16163
16422
|
const annotatedVtxos = await cm.annotateVtxos(vtxoInputs);
|
|
16164
16423
|
const annotatedByKey = new Map(annotatedVtxos.map((v) => [`${v.txid}:${v.vout}`, v]));
|
|
16165
16424
|
for (const input of inputs) {
|
|
16166
|
-
if (
|
|
16425
|
+
if (chunk5MLC2HU3_cjs.isVirtualCoin(input)) {
|
|
16167
16426
|
const outpoint = `${input.txid}:${input.vout}`;
|
|
16168
16427
|
const vtxo = annotatedByKey.get(outpoint);
|
|
16169
16428
|
if (!vtxo) {
|
|
@@ -16175,13 +16434,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16175
16434
|
const settledFacts = { ...vtxo, isSpent: true };
|
|
16176
16435
|
spentVtxos.push({
|
|
16177
16436
|
...settledFacts,
|
|
16178
|
-
virtualStatus:
|
|
16437
|
+
virtualStatus: chunk5MLC2HU3_cjs.toVirtualStatus(settledFacts),
|
|
16179
16438
|
settledBy: commitmentTxid
|
|
16180
16439
|
});
|
|
16181
16440
|
} else {
|
|
16182
16441
|
let sourceAddress;
|
|
16183
16442
|
try {
|
|
16184
|
-
sourceAddress =
|
|
16443
|
+
sourceAddress = chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
|
|
16185
16444
|
this.network
|
|
16186
16445
|
);
|
|
16187
16446
|
} catch {
|
|
@@ -16239,9 +16498,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16239
16498
|
}
|
|
16240
16499
|
};
|
|
16241
16500
|
function selectVirtualCoins(coins, targetAmount) {
|
|
16242
|
-
const sortedCoins = coins.map(
|
|
16243
|
-
const expiryA =
|
|
16244
|
-
const expiryB =
|
|
16501
|
+
const sortedCoins = coins.map(chunk5MLC2HU3_cjs.normalizeVtxo).sort((a, b) => {
|
|
16502
|
+
const expiryA = chunk5MLC2HU3_cjs.toBatchExpiry(a) || Number.MAX_SAFE_INTEGER;
|
|
16503
|
+
const expiryB = chunk5MLC2HU3_cjs.toBatchExpiry(b) || Number.MAX_SAFE_INTEGER;
|
|
16245
16504
|
if (expiryA !== expiryB) {
|
|
16246
16505
|
return expiryA - expiryB;
|
|
16247
16506
|
}
|
|
@@ -16268,19 +16527,53 @@ function selectVirtualCoins(coins, targetAmount) {
|
|
|
16268
16527
|
changeAmount
|
|
16269
16528
|
};
|
|
16270
16529
|
}
|
|
16271
|
-
|
|
16530
|
+
var AbortError = class extends Error {
|
|
16531
|
+
constructor(message = "Operation aborted") {
|
|
16532
|
+
super(message);
|
|
16533
|
+
this.name = "AbortError";
|
|
16534
|
+
}
|
|
16535
|
+
};
|
|
16536
|
+
function abortReason(signal) {
|
|
16537
|
+
const { reason } = signal;
|
|
16538
|
+
if (reason instanceof Error) return reason;
|
|
16539
|
+
return new AbortError(typeof reason === "string" ? reason : void 0);
|
|
16540
|
+
}
|
|
16541
|
+
async function waitForIncomingFunds(wallet, options) {
|
|
16542
|
+
const { signal, timeoutMs } = options ?? {};
|
|
16543
|
+
if (signal?.aborted) throw abortReason(signal);
|
|
16272
16544
|
let stopFunc;
|
|
16273
16545
|
let settled = false;
|
|
16274
|
-
|
|
16546
|
+
let timeoutId;
|
|
16547
|
+
let onAbort;
|
|
16548
|
+
return new Promise((resolve, reject) => {
|
|
16549
|
+
const settle = (deliver) => {
|
|
16550
|
+
if (settled) return;
|
|
16551
|
+
settled = true;
|
|
16552
|
+
if (timeoutId !== void 0) clearTimeout(timeoutId);
|
|
16553
|
+
if (onAbort) signal?.removeEventListener("abort", onAbort);
|
|
16554
|
+
stopFunc?.();
|
|
16555
|
+
deliver();
|
|
16556
|
+
};
|
|
16557
|
+
const cancel = (reason) => settle(() => reject(reason));
|
|
16558
|
+
if (signal) {
|
|
16559
|
+
onAbort = () => cancel(abortReason(signal));
|
|
16560
|
+
signal.addEventListener("abort", onAbort);
|
|
16561
|
+
}
|
|
16562
|
+
if (timeoutMs !== void 0) {
|
|
16563
|
+
timeoutId = setTimeout(
|
|
16564
|
+
() => cancel(new AbortError(`waitForIncomingFunds timed out after ${timeoutMs}ms`)),
|
|
16565
|
+
timeoutMs
|
|
16566
|
+
);
|
|
16567
|
+
}
|
|
16275
16568
|
wallet.notifyIncomingFunds((funds) => {
|
|
16276
16569
|
const hasFunds = funds.type === "utxo" ? funds.coins.length > 0 : funds.newVtxos.length > 0;
|
|
16277
16570
|
if (settled || !hasFunds) return;
|
|
16278
|
-
|
|
16279
|
-
resolve(funds);
|
|
16280
|
-
stopFunc?.();
|
|
16571
|
+
settle(() => resolve(funds));
|
|
16281
16572
|
}).then((stop) => {
|
|
16282
16573
|
stopFunc = stop;
|
|
16283
16574
|
if (settled) stop();
|
|
16575
|
+
}).catch((error) => {
|
|
16576
|
+
cancel(error);
|
|
16284
16577
|
});
|
|
16285
16578
|
});
|
|
16286
16579
|
}
|
|
@@ -16576,7 +16869,7 @@ var MessageBus = class {
|
|
|
16576
16869
|
this.initialized = true;
|
|
16577
16870
|
}
|
|
16578
16871
|
async buildServices(config) {
|
|
16579
|
-
const arkProvider = new
|
|
16872
|
+
const arkProvider = new chunk5MLC2HU3_cjs.RestArkProvider(config.arkServer.url);
|
|
16580
16873
|
const storage = {
|
|
16581
16874
|
walletRepository: this.walletRepository,
|
|
16582
16875
|
contractRepository: this.contractRepository,
|
|
@@ -16918,7 +17211,7 @@ var offboardNetworkNames = [
|
|
|
16918
17211
|
function offboardDestinationScript(destinationAddress) {
|
|
16919
17212
|
for (const networkName of offboardNetworkNames) {
|
|
16920
17213
|
try {
|
|
16921
|
-
const network =
|
|
17214
|
+
const network = chunk5MLC2HU3_cjs.networks[networkName];
|
|
16922
17215
|
const addr = btcSigner.Address(network).decode(destinationAddress);
|
|
16923
17216
|
return btcSigner.OutScript.encode(addr);
|
|
16924
17217
|
} catch {
|
|
@@ -16982,7 +17275,7 @@ var Ramps = class {
|
|
|
16982
17275
|
}
|
|
16983
17276
|
amount = amount ?? totalAmount;
|
|
16984
17277
|
const offchainAddress = await this.wallet.getAddress();
|
|
16985
|
-
const offchainAddr =
|
|
17278
|
+
const offchainAddr = chunk5MLC2HU3_cjs.ArkAddress.decode(offchainAddress);
|
|
16986
17279
|
const offchainScript = base.hex.encode(offchainAddr.pkScript);
|
|
16987
17280
|
const outputFee = estimator.evalOffchainOutput({
|
|
16988
17281
|
amount,
|
|
@@ -17042,7 +17335,7 @@ var Ramps = class {
|
|
|
17042
17335
|
const filteredVtxos = [];
|
|
17043
17336
|
let totalAmount = 0n;
|
|
17044
17337
|
for (const vtxo of vtxos) {
|
|
17045
|
-
const inputFee = estimator.evalOffchainInput(
|
|
17338
|
+
const inputFee = estimator.evalOffchainInput(chunk5MLC2HU3_cjs.toOffchainInputFeeParams(vtxo));
|
|
17046
17339
|
if (inputFee.satoshis >= vtxo.value) {
|
|
17047
17340
|
continue;
|
|
17048
17341
|
}
|
|
@@ -17878,7 +18171,7 @@ var WalletMessageHandler = class {
|
|
|
17878
18171
|
// Wallet methods
|
|
17879
18172
|
async handleInitWallet({ payload }) {
|
|
17880
18173
|
const { arkServerUrl } = payload;
|
|
17881
|
-
this.indexerProvider = new
|
|
18174
|
+
this.indexerProvider = new chunkGVHUHTRH_cjs.RestIndexerProvider(arkServerUrl);
|
|
17882
18175
|
await this.onWalletInitialized();
|
|
17883
18176
|
}
|
|
17884
18177
|
/**
|
|
@@ -18167,7 +18460,7 @@ var WalletMessageHandler = class {
|
|
|
18167
18460
|
if (v.isUnrolled) {
|
|
18168
18461
|
return withUnrolled;
|
|
18169
18462
|
}
|
|
18170
|
-
if (
|
|
18463
|
+
if (chunk5MLC2HU3_cjs.hasTerminalSpend(v)) {
|
|
18171
18464
|
return false;
|
|
18172
18465
|
}
|
|
18173
18466
|
if (includeRecoverable) {
|
|
@@ -18176,10 +18469,10 @@ var WalletMessageHandler = class {
|
|
|
18176
18469
|
if (dustAmount != null && isSubdust(v, dustAmount)) {
|
|
18177
18470
|
return false;
|
|
18178
18471
|
}
|
|
18179
|
-
if (
|
|
18472
|
+
if (chunk5MLC2HU3_cjs.isRecoverable(v)) {
|
|
18180
18473
|
return false;
|
|
18181
18474
|
}
|
|
18182
|
-
if (
|
|
18475
|
+
if (chunk5MLC2HU3_cjs.isExpired(v)) {
|
|
18183
18476
|
return false;
|
|
18184
18477
|
}
|
|
18185
18478
|
return true;
|
|
@@ -18277,7 +18570,7 @@ var WalletMessageHandler = class {
|
|
|
18277
18570
|
if (!this.readonlyWallet) return null;
|
|
18278
18571
|
const { boardingTxs, commitmentsToIgnore } = await this.readonlyWallet.getBoardingTxs();
|
|
18279
18572
|
const indexerProvider = this.indexerProvider;
|
|
18280
|
-
const resolveTxCreatedAt = indexerProvider ? (txids) =>
|
|
18573
|
+
const resolveTxCreatedAt = indexerProvider ? (txids) => chunk5MLC2HU3_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
|
|
18281
18574
|
return buildTransactionHistory(vtxos, boardingTxs, commitmentsToIgnore, resolveTxCreatedAt);
|
|
18282
18575
|
}
|
|
18283
18576
|
async ensureContractEventBroadcasting() {
|
|
@@ -18973,7 +19266,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
18973
19266
|
};
|
|
18974
19267
|
try {
|
|
18975
19268
|
const response = await this.sendMessage(message);
|
|
18976
|
-
return response.payload.vtxos.map(
|
|
19269
|
+
return response.payload.vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
|
|
18977
19270
|
} catch (error) {
|
|
18978
19271
|
throw new Error(`Failed to get vtxos: ${error}`);
|
|
18979
19272
|
}
|
|
@@ -18998,7 +19291,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
18998
19291
|
};
|
|
18999
19292
|
try {
|
|
19000
19293
|
const response = await this.sendMessage(message);
|
|
19001
|
-
return response.payload.vtxos.map(
|
|
19294
|
+
return response.payload.vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
|
|
19002
19295
|
} catch (error) {
|
|
19003
19296
|
throw new Error(`Failed to get spendable vtxos: ${error}`);
|
|
19004
19297
|
}
|
|
@@ -19129,7 +19422,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19129
19422
|
};
|
|
19130
19423
|
try {
|
|
19131
19424
|
const response = await sendContractMessage(message);
|
|
19132
|
-
return response.payload.vtxos.map(
|
|
19425
|
+
return response.payload.vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
|
|
19133
19426
|
} catch (e) {
|
|
19134
19427
|
throw new Error("Failed to annotate vtxos");
|
|
19135
19428
|
}
|
|
@@ -19730,7 +20023,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
|
|
|
19730
20023
|
};
|
|
19731
20024
|
try {
|
|
19732
20025
|
const response = await wallet.sendMessage(message);
|
|
19733
|
-
return response.payload.vtxos.map(
|
|
20026
|
+
return response.payload.vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
|
|
19734
20027
|
} catch (e) {
|
|
19735
20028
|
throw new Error(`Failed to get expiring vtxos: ${e}`);
|
|
19736
20029
|
}
|
|
@@ -19842,12 +20135,12 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
19842
20135
|
* @returns Configured onchain wallet
|
|
19843
20136
|
* @throws Error if the configured identity cannot produce a valid x-only public key
|
|
19844
20137
|
*/
|
|
19845
|
-
static async create(identity, networkName =
|
|
20138
|
+
static async create(identity, networkName = chunk5MLC2HU3_cjs.DEFAULT_NETWORK_NAME, provider) {
|
|
19846
20139
|
const pubkey = await identity.xOnlyPublicKey();
|
|
19847
20140
|
if (!pubkey) {
|
|
19848
20141
|
throw new Error("Invalid configured public key");
|
|
19849
20142
|
}
|
|
19850
|
-
const network =
|
|
20143
|
+
const network = chunk5MLC2HU3_cjs.getNetwork(networkName);
|
|
19851
20144
|
const onchainProvider = provider || new EsploraProvider(ESPLORA_URL[networkName]);
|
|
19852
20145
|
const onchainP2TR = btcSigner.p2tr(pubkey, void 0, network);
|
|
19853
20146
|
return new _OnchainWallet(identity, network, onchainP2TR, onchainProvider);
|
|
@@ -19953,7 +20246,7 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
19953
20246
|
if (!inputs) {
|
|
19954
20247
|
throw new Error("Fee estimation failed");
|
|
19955
20248
|
}
|
|
19956
|
-
let tx = new
|
|
20249
|
+
let tx = new chunk5MLC2HU3_cjs.Transaction();
|
|
19957
20250
|
for (const input of inputs) {
|
|
19958
20251
|
tx.addInput({
|
|
19959
20252
|
txid: input.txid,
|
|
@@ -20011,7 +20304,7 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
20011
20304
|
* @throws If the parent has no anchor, or funding cannot be selected/signed
|
|
20012
20305
|
*/
|
|
20013
20306
|
async bumpAnchor(parentHex, feeRate) {
|
|
20014
|
-
const parent =
|
|
20307
|
+
const parent = chunk5MLC2HU3_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
|
|
20015
20308
|
const coins = (await this.getCoins()).filter((c) => c.status.confirmed);
|
|
20016
20309
|
const child = await this.buildBumpPackage(parent, feeRate, coins);
|
|
20017
20310
|
return [parent.hex, child.hex];
|
|
@@ -20110,6 +20403,7 @@ var ListUnspentMethod = "blockchain.scripthash.listunspent";
|
|
|
20110
20403
|
var MISSING_TRANSACTION = "missingtransaction";
|
|
20111
20404
|
var MAX_FETCH_TRANSACTIONS_ATTEMPTS = 5;
|
|
20112
20405
|
var BLOCK_HEADER_SIZE = 80;
|
|
20406
|
+
var MTP_WINDOW = 11;
|
|
20113
20407
|
function parseBlockHeader(headerHex) {
|
|
20114
20408
|
const headerBytes = base.hex.decode(headerHex);
|
|
20115
20409
|
if (headerBytes.length !== BLOCK_HEADER_SIZE) {
|
|
@@ -20416,6 +20710,8 @@ var ElectrumOnchainProvider = class {
|
|
|
20416
20710
|
ws;
|
|
20417
20711
|
network;
|
|
20418
20712
|
chain;
|
|
20713
|
+
mtpCache;
|
|
20714
|
+
mtpInflight;
|
|
20419
20715
|
async getCoins(address) {
|
|
20420
20716
|
const script = this.encodeAddress(address);
|
|
20421
20717
|
const scriptHash = toScriptHash(script);
|
|
@@ -20671,15 +20967,58 @@ var ElectrumOnchainProvider = class {
|
|
|
20671
20967
|
blockTime
|
|
20672
20968
|
};
|
|
20673
20969
|
}
|
|
20970
|
+
/** `time` is median-time-past, per {@link OnchainProvider.getChainTip};
|
|
20971
|
+
* Electrum serves raw headers and no MTP, so it is computed here. */
|
|
20674
20972
|
async getChainTip() {
|
|
20675
20973
|
const tip = await this.chain.subscribeHeaders();
|
|
20676
20974
|
const { hash, timestamp } = parseBlockHeader(tip.hex);
|
|
20677
20975
|
return {
|
|
20678
20976
|
height: tip.height,
|
|
20679
|
-
time: timestamp,
|
|
20977
|
+
time: await this.medianTimePast(tip.height, timestamp, hash),
|
|
20680
20978
|
hash
|
|
20681
20979
|
};
|
|
20682
20980
|
}
|
|
20981
|
+
/**
|
|
20982
|
+
* Consensus's `GetMedianTimePast`, ending at and including `height`.
|
|
20983
|
+
*
|
|
20984
|
+
* Cached per tip HASH, not height: this runs on every balance read, and
|
|
20985
|
+
* hashing means a reorg at the same height recomputes rather than serving
|
|
20986
|
+
* the orphaned chain's median.
|
|
20987
|
+
*/
|
|
20988
|
+
async medianTimePast(height, tipTime, hash) {
|
|
20989
|
+
if (this.mtpCache?.hash === hash) return this.mtpCache.mtp;
|
|
20990
|
+
if (this.mtpInflight?.hash === hash) return this.mtpInflight.mtp;
|
|
20991
|
+
const mtp = this.readMedianTimePast(height, tipTime, hash).finally(() => {
|
|
20992
|
+
this.mtpInflight = void 0;
|
|
20993
|
+
});
|
|
20994
|
+
this.mtpInflight = { hash, mtp };
|
|
20995
|
+
return mtp;
|
|
20996
|
+
}
|
|
20997
|
+
/** Degrades to the tip's `nTime` rather than throwing — a caller that
|
|
20998
|
+
* cannot read the tip at all is worse off. */
|
|
20999
|
+
async readMedianTimePast(height, tipTime, hash) {
|
|
21000
|
+
const heights = [];
|
|
21001
|
+
for (let h = height - 1; h >= 0 && heights.length < MTP_WINDOW - 1; h--) heights.push(h);
|
|
21002
|
+
if (heights.length === 0) return tipTime;
|
|
21003
|
+
let timestamps;
|
|
21004
|
+
try {
|
|
21005
|
+
const headers = await this.chain.fetchBlockHeaders(heights);
|
|
21006
|
+
timestamps = [
|
|
21007
|
+
tipTime,
|
|
21008
|
+
...headers.map((header) => parseBlockHeader(header.hex).timestamp)
|
|
21009
|
+
];
|
|
21010
|
+
} catch (e) {
|
|
21011
|
+
console.warn(
|
|
21012
|
+
"Failed to fetch the median-time-past window; using the tip's own time",
|
|
21013
|
+
e
|
|
21014
|
+
);
|
|
21015
|
+
return tipTime;
|
|
21016
|
+
}
|
|
21017
|
+
timestamps.sort((a, b) => a - b);
|
|
21018
|
+
const mtp = timestamps[Math.floor(timestamps.length / 2)];
|
|
21019
|
+
this.mtpCache = { hash, mtp };
|
|
21020
|
+
return mtp;
|
|
21021
|
+
}
|
|
20683
21022
|
async watchAddresses(addresses, eventCallback) {
|
|
20684
21023
|
const scripts = addresses.map((addr) => this.encodeAddress(addr));
|
|
20685
21024
|
const scriptHashes = scripts.map(toScriptHash);
|
|
@@ -20872,7 +21211,7 @@ async function resolvePrevTxs(txids, source, onchain) {
|
|
|
20872
21211
|
try {
|
|
20873
21212
|
const { txs } = await source.getVirtualTxs(wanted);
|
|
20874
21213
|
for (const psbt of txs) {
|
|
20875
|
-
const tx =
|
|
21214
|
+
const tx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbt));
|
|
20876
21215
|
resolved.set(tx.id, tx.toBytes());
|
|
20877
21216
|
}
|
|
20878
21217
|
} catch (err) {
|
|
@@ -20905,7 +21244,7 @@ async function resolvePrevTxs(txids, source, onchain) {
|
|
|
20905
21244
|
async function attachPrevArkTxs(tx, txids, source, onchain) {
|
|
20906
21245
|
const pending = [];
|
|
20907
21246
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
20908
|
-
if (
|
|
21247
|
+
if (chunk5MLC2HU3_cjs.getArkPsbtFields(tx, i, chunk5MLC2HU3_cjs.PrevArkTxField).length === 0) pending.push(i);
|
|
20909
21248
|
}
|
|
20910
21249
|
if (pending.length === 0) return;
|
|
20911
21250
|
const resolved = await resolvePrevTxs(
|
|
@@ -20914,13 +21253,13 @@ async function attachPrevArkTxs(tx, txids, source, onchain) {
|
|
|
20914
21253
|
onchain
|
|
20915
21254
|
);
|
|
20916
21255
|
for (const i of pending) {
|
|
20917
|
-
|
|
21256
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(tx, i, chunk5MLC2HU3_cjs.PrevArkTxField, resolved.get(txidAt(txids, i)));
|
|
20918
21257
|
}
|
|
20919
21258
|
}
|
|
20920
21259
|
async function attachPrevoutTxs(tx, source) {
|
|
20921
21260
|
const pending = [];
|
|
20922
21261
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
20923
|
-
if (
|
|
21262
|
+
if (chunk5MLC2HU3_cjs.getArkPsbtFields(tx, i, chunk5MLC2HU3_cjs.PrevoutTxField).length > 0) continue;
|
|
20924
21263
|
const input = tx.getInput(i);
|
|
20925
21264
|
if (!input?.txid) throw new PrevTxUnavailableError(`input ${i} has no outpoint`);
|
|
20926
21265
|
pending.push({ index: i, txid: base.hex.encode(input.txid) });
|
|
@@ -20931,7 +21270,7 @@ async function attachPrevoutTxs(tx, source) {
|
|
|
20931
21270
|
resolved.set(txid, await source.getRawTransaction(txid));
|
|
20932
21271
|
}
|
|
20933
21272
|
for (const { index, txid } of pending) {
|
|
20934
|
-
|
|
21273
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(tx, index, chunk5MLC2HU3_cjs.PrevoutTxField, resolved.get(txid));
|
|
20935
21274
|
}
|
|
20936
21275
|
}
|
|
20937
21276
|
async function withPrevTxs(coins, source, onchain) {
|
|
@@ -20957,7 +21296,7 @@ exports.BIP322 = void 0;
|
|
|
20957
21296
|
async function sign2(message, identity, network) {
|
|
20958
21297
|
const xOnlyPubKey = await identity.xOnlyPublicKey();
|
|
20959
21298
|
const payment = btcSigner.p2tr(xOnlyPubKey, void 0, network);
|
|
20960
|
-
const toSpend =
|
|
21299
|
+
const toSpend = chunk5MLC2HU3_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
|
|
20961
21300
|
const toSign = craftBIP322ToSignP2TR(toSpend, payment.script, xOnlyPubKey);
|
|
20962
21301
|
const signed = await identity.sign(toSign, [0]);
|
|
20963
21302
|
signed.finalizeIdx(0);
|
|
@@ -21015,7 +21354,7 @@ function verifyP2TR(message, witnessItems, pkScript, pubkey) {
|
|
|
21015
21354
|
if (sighashType !== btcSigner.SigHash.DEFAULT && sighashType !== btcSigner.SigHash.ALL) {
|
|
21016
21355
|
return false;
|
|
21017
21356
|
}
|
|
21018
|
-
const toSpend =
|
|
21357
|
+
const toSpend = chunk5MLC2HU3_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
|
|
21019
21358
|
const toSign = craftBIP322ToSignP2TR(toSpend, pkScript, pubkey);
|
|
21020
21359
|
const sighash = toSign.preimageWitnessV1(0, [pkScript], sighashType, [0n]);
|
|
21021
21360
|
const rawSig = sig.length === 65 ? sig.subarray(0, 64) : sig;
|
|
@@ -21036,7 +21375,7 @@ function verifyP2WPKH(message, witnessItems, pkScript, addressHash) {
|
|
|
21036
21375
|
}
|
|
21037
21376
|
const sighashType = sigWithHash[sigWithHash.length - 1];
|
|
21038
21377
|
const derSig = sigWithHash.subarray(0, sigWithHash.length - 1);
|
|
21039
|
-
const toSpend =
|
|
21378
|
+
const toSpend = chunk5MLC2HU3_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
|
|
21040
21379
|
const toSign = craftBIP322ToSignSimple(toSpend, pkScript);
|
|
21041
21380
|
const scriptCode = btcSigner.OutScript.encode({ type: "pkh", hash: addressHash });
|
|
21042
21381
|
const sighash = toSign.preimageWitnessV0(0, scriptCode, sighashType, 0n);
|
|
@@ -21089,7 +21428,7 @@ function encodeCompactSize(n) {
|
|
|
21089
21428
|
return buf;
|
|
21090
21429
|
}
|
|
21091
21430
|
function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
|
|
21092
|
-
const tx = new
|
|
21431
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction({ version: 0 });
|
|
21093
21432
|
tx.addInput({
|
|
21094
21433
|
txid: toSpend.id,
|
|
21095
21434
|
index: 0,
|
|
@@ -21103,12 +21442,12 @@ function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
|
|
|
21103
21442
|
});
|
|
21104
21443
|
tx.addOutput({
|
|
21105
21444
|
amount: 0n,
|
|
21106
|
-
script:
|
|
21445
|
+
script: chunk5MLC2HU3_cjs.OP_RETURN_EMPTY_PKSCRIPT
|
|
21107
21446
|
});
|
|
21108
21447
|
return tx;
|
|
21109
21448
|
}
|
|
21110
21449
|
function craftBIP322ToSignSimple(toSpend, pkScript) {
|
|
21111
|
-
const tx = new
|
|
21450
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction({ version: 0 });
|
|
21112
21451
|
tx.addInput({
|
|
21113
21452
|
txid: toSpend.id,
|
|
21114
21453
|
index: 0,
|
|
@@ -21120,7 +21459,7 @@ function craftBIP322ToSignSimple(toSpend, pkScript) {
|
|
|
21120
21459
|
});
|
|
21121
21460
|
tx.addOutput({
|
|
21122
21461
|
amount: 0n,
|
|
21123
|
-
script:
|
|
21462
|
+
script: chunk5MLC2HU3_cjs.OP_RETURN_EMPTY_PKSCRIPT
|
|
21124
21463
|
});
|
|
21125
21464
|
return tx;
|
|
21126
21465
|
}
|
|
@@ -21251,7 +21590,7 @@ var RestEmulatorProvider = class {
|
|
|
21251
21590
|
}
|
|
21252
21591
|
};
|
|
21253
21592
|
function finalizeVirtualTx(type, psbtBase64) {
|
|
21254
|
-
const tx =
|
|
21593
|
+
const tx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
|
|
21255
21594
|
if (type === "INDEXER_CHAINED_TX_TYPE_TREE" /* TREE */) {
|
|
21256
21595
|
const input = tx.getInput(0);
|
|
21257
21596
|
if (!input) {
|
|
@@ -21278,14 +21617,14 @@ var ExitPathError = class extends Error {
|
|
|
21278
21617
|
reason;
|
|
21279
21618
|
};
|
|
21280
21619
|
function delayWeight(sequence) {
|
|
21281
|
-
const t =
|
|
21620
|
+
const t = chunk5MLC2HU3_cjs.sequenceToTimelock(sequence);
|
|
21282
21621
|
return t.type === "blocks" ? Number(t.value) : Number(t.value) / 600;
|
|
21283
21622
|
}
|
|
21284
21623
|
async function resolveUnilateralPath(params) {
|
|
21285
21624
|
const { vtxo, scriptHex, contractRepository } = params;
|
|
21286
21625
|
const contract = contractRepository ? (await contractRepository.getContracts({ script: scriptHex }))[0] : void 0;
|
|
21287
21626
|
if (contract) {
|
|
21288
|
-
const handler =
|
|
21627
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
21289
21628
|
if (!handler) {
|
|
21290
21629
|
throw new ExitPathError(
|
|
21291
21630
|
"no-handler",
|
|
@@ -21308,12 +21647,12 @@ async function resolveUnilateralPath(params) {
|
|
|
21308
21647
|
paths.sort((a, b) => delayWeight(a.sequence) - delayWeight(b.sequence));
|
|
21309
21648
|
return { selection: paths[0], label: `${contract.type}:unilateral` };
|
|
21310
21649
|
}
|
|
21311
|
-
const decoded =
|
|
21650
|
+
const decoded = chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree);
|
|
21312
21651
|
let best;
|
|
21313
21652
|
for (const exit of decoded.exitPaths()) {
|
|
21314
21653
|
const leaf = decoded.findLeaf(base.hex.encode(exit.script));
|
|
21315
21654
|
if (!leaf) continue;
|
|
21316
|
-
const sequence =
|
|
21655
|
+
const sequence = chunk5MLC2HU3_cjs.timelockToSequence(exit.params.timelock);
|
|
21317
21656
|
const weight = delayWeight(sequence);
|
|
21318
21657
|
if (!best || weight < best.weight) {
|
|
21319
21658
|
best = { selection: { leaf, sequence }, weight };
|
|
@@ -21533,7 +21872,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
21533
21872
|
let totalAmount = 0n;
|
|
21534
21873
|
const txWeightEstimator = TxWeightEstimator.create();
|
|
21535
21874
|
for (const vtxo of vtxos) {
|
|
21536
|
-
if (!
|
|
21875
|
+
if (!chunk5MLC2HU3_cjs.canSweepOnchain(vtxo)) {
|
|
21537
21876
|
throw new Error(
|
|
21538
21877
|
`Vtxo ${vtxo.txid}:${vtxo.vout} cannot be swept onchain: it is not fully unrolled (use unroll first), or its exit output was already spent`
|
|
21539
21878
|
);
|
|
@@ -21544,14 +21883,14 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
21544
21883
|
}
|
|
21545
21884
|
const resolved = await resolveUnilateralPath({
|
|
21546
21885
|
vtxo,
|
|
21547
|
-
scriptHex: base.hex.encode(
|
|
21886
|
+
scriptHex: base.hex.encode(chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
|
|
21548
21887
|
contractRepository: wallet.contractRepository,
|
|
21549
21888
|
walletPubKeyHex: base.hex.encode(await wallet.identity.xOnlyPublicKey()),
|
|
21550
21889
|
currentTime: Date.now()
|
|
21551
21890
|
});
|
|
21552
21891
|
const spendingLeaf = resolved.selection.leaf;
|
|
21553
21892
|
const sequence = resolved.selection.sequence;
|
|
21554
|
-
const timelock =
|
|
21893
|
+
const timelock = chunk5MLC2HU3_cjs.sequenceToTimelock(sequence);
|
|
21555
21894
|
const elapsed = timelock.type === "blocks" ? chainTip.height >= txStatus.blockHeight + Number(timelock.value) : chainTip.time >= txStatus.blockTime + Number(timelock.value);
|
|
21556
21895
|
if (!elapsed) {
|
|
21557
21896
|
throw new Error(`no available exit path found for vtxo ${vtxo.txid}:${vtxo.vout}`);
|
|
@@ -21564,7 +21903,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
21564
21903
|
sequence,
|
|
21565
21904
|
witnessUtxo: {
|
|
21566
21905
|
amount: BigInt(vtxo.value),
|
|
21567
|
-
script:
|
|
21906
|
+
script: chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
|
|
21568
21907
|
},
|
|
21569
21908
|
sighashType: btcSigner.SigHash.DEFAULT
|
|
21570
21909
|
});
|
|
@@ -21574,7 +21913,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
21574
21913
|
btcSigner.TaprootControlBlock.encode(spendingLeaf[0]).length
|
|
21575
21914
|
);
|
|
21576
21915
|
}
|
|
21577
|
-
const tx = new
|
|
21916
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction({ version: 2 });
|
|
21578
21917
|
for (const input of inputs) {
|
|
21579
21918
|
tx.addInput(input);
|
|
21580
21919
|
}
|
|
@@ -21657,7 +21996,7 @@ async function buildSignedSweep(params) {
|
|
|
21657
21996
|
`uneconomic vtxo ${vtxo.txid}:${vtxo.vout}: value ${vtxo.value} - fee ${fee} < dust`
|
|
21658
21997
|
);
|
|
21659
21998
|
}
|
|
21660
|
-
const tx = new
|
|
21999
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction({ version: 2 });
|
|
21661
22000
|
tx.addInput({
|
|
21662
22001
|
txid: vtxo.txid,
|
|
21663
22002
|
index: vtxo.vout,
|
|
@@ -21682,7 +22021,7 @@ async function buildSignedSweep(params) {
|
|
|
21682
22021
|
finalScriptWitness: [
|
|
21683
22022
|
tapScriptSig[0][1],
|
|
21684
22023
|
...path.extraWitness,
|
|
21685
|
-
|
|
22024
|
+
chunk5MLC2HU3_cjs.scriptFromTapLeafScript(path.leaf),
|
|
21686
22025
|
btcSigner.TaprootControlBlock.encode(controlBlock)
|
|
21687
22026
|
]
|
|
21688
22027
|
});
|
|
@@ -21712,7 +22051,7 @@ async function resolveFeeRate(opts) {
|
|
|
21712
22051
|
}
|
|
21713
22052
|
async function selectExitVtxos(opts) {
|
|
21714
22053
|
if (!opts.vtxos) return opts.wallet.getVtxos();
|
|
21715
|
-
const res = await
|
|
22054
|
+
const res = await chunk5MLC2HU3_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
|
|
21716
22055
|
const tapTrees = /* @__PURE__ */ new Map();
|
|
21717
22056
|
const out = [];
|
|
21718
22057
|
for (const vtxo of res.vtxos) {
|
|
@@ -21727,7 +22066,7 @@ async function selectExitVtxos(opts) {
|
|
|
21727
22066
|
`no contract registered for vtxo script ${vtxo.script} \u2014 register the contract before exiting`
|
|
21728
22067
|
);
|
|
21729
22068
|
}
|
|
21730
|
-
const handler =
|
|
22069
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
21731
22070
|
if (!handler) {
|
|
21732
22071
|
throw new Error(`no contract handler registered for type '${contract.type}'`);
|
|
21733
22072
|
}
|
|
@@ -21757,7 +22096,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
21757
22096
|
if (pendingNodes.length > 0) {
|
|
21758
22097
|
const txs = await resolver.getVirtualTxs(pendingNodes.map((n) => n.txid));
|
|
21759
22098
|
for (const psbt of txs) {
|
|
21760
|
-
psbts.set(
|
|
22099
|
+
psbts.set(chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
21761
22100
|
}
|
|
21762
22101
|
}
|
|
21763
22102
|
const childVsize = Number(
|
|
@@ -21793,7 +22132,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
21793
22132
|
try {
|
|
21794
22133
|
const resolved = await resolveUnilateralPath({
|
|
21795
22134
|
vtxo,
|
|
21796
|
-
scriptHex: base.hex.encode(
|
|
22135
|
+
scriptHex: base.hex.encode(chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
|
|
21797
22136
|
contractRepository: wallet.contractRepository,
|
|
21798
22137
|
walletPubKeyHex,
|
|
21799
22138
|
currentTime: Date.now()
|
|
@@ -21812,7 +22151,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
21812
22151
|
});
|
|
21813
22152
|
continue;
|
|
21814
22153
|
}
|
|
21815
|
-
const t =
|
|
22154
|
+
const t = chunk5MLC2HU3_cjs.sequenceToTimelock(resolved.selection.sequence);
|
|
21816
22155
|
const delay = { type: t.type, value: Number(t.value) };
|
|
21817
22156
|
infos.push({ outpoint, value: vtxo.value, sweepFee, path: resolved.label, delay });
|
|
21818
22157
|
sweeps.push({ vtxo, resolved, sweepFee, delay });
|
|
@@ -22213,7 +22552,7 @@ async function prepare(opts) {
|
|
|
22213
22552
|
txid: sweep.vtxo.txid,
|
|
22214
22553
|
vout: sweep.vtxo.vout,
|
|
22215
22554
|
value: sweep.vtxo.value,
|
|
22216
|
-
pkScript:
|
|
22555
|
+
pkScript: chunk5MLC2HU3_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
|
|
22217
22556
|
},
|
|
22218
22557
|
path: sweep.resolved.selection,
|
|
22219
22558
|
outputAddress: opts.sweepAddress,
|
|
@@ -22301,7 +22640,7 @@ async function prepare(opts) {
|
|
|
22301
22640
|
if (newFee <= splitterFee) break;
|
|
22302
22641
|
splitterFee = newFee;
|
|
22303
22642
|
}
|
|
22304
|
-
const splitter = new
|
|
22643
|
+
const splitter = new chunk5MLC2HU3_cjs.Transaction({ version: 2 });
|
|
22305
22644
|
for (const coin of selected.inputs) {
|
|
22306
22645
|
splitter.addInput({
|
|
22307
22646
|
txid: coin.txid,
|
|
@@ -22445,41 +22784,41 @@ var UnilateralExit = {
|
|
|
22445
22784
|
// src/arkade/index.ts
|
|
22446
22785
|
var arkade_exports = {};
|
|
22447
22786
|
chunk5BLDMQED_cjs.__export(arkade_exports, {
|
|
22448
|
-
ARKADE_OP: () =>
|
|
22449
|
-
ARKADE_OPCODES: () =>
|
|
22450
|
-
ARKADE_OPCODE_NAMES: () =>
|
|
22451
|
-
ARKADE_OPCODE_VALUES: () =>
|
|
22452
|
-
ARKADE_OPS: () =>
|
|
22787
|
+
ARKADE_OP: () => chunkWIFL5QYZ_cjs.ARKADE_OP,
|
|
22788
|
+
ARKADE_OPCODES: () => chunkWIFL5QYZ_cjs.ARKADE_OPCODES,
|
|
22789
|
+
ARKADE_OPCODE_NAMES: () => chunkWIFL5QYZ_cjs.ARKADE_OPCODE_NAMES,
|
|
22790
|
+
ARKADE_OPCODE_VALUES: () => chunkWIFL5QYZ_cjs.ARKADE_OPCODE_VALUES,
|
|
22791
|
+
ARKADE_OPS: () => chunkWIFL5QYZ_cjs.ARKADE_OPS,
|
|
22453
22792
|
Arkade: () => Arkade,
|
|
22454
22793
|
ArkadeContract: () => ArkadeContract,
|
|
22455
|
-
ArkadeProgramScript: () =>
|
|
22456
|
-
ArkadeScript: () =>
|
|
22794
|
+
ArkadeProgramScript: () => chunkWIFL5QYZ_cjs.ArkadeProgramScript,
|
|
22795
|
+
ArkadeScript: () => chunkWIFL5QYZ_cjs.ArkadeScript,
|
|
22457
22796
|
ArkadeTransactionBuilder: () => ArkadeTransactionBuilder,
|
|
22458
|
-
BigNum: () =>
|
|
22797
|
+
BigNum: () => chunkWIFL5QYZ_cjs.bignum_exports,
|
|
22459
22798
|
OP: () => btcSigner.OP,
|
|
22460
|
-
OPCODE_NAMES: () =>
|
|
22461
|
-
OPCODE_VALUES: () =>
|
|
22462
|
-
SUPPORTED_PROGRAM_VERSION: () =>
|
|
22799
|
+
OPCODE_NAMES: () => chunkWIFL5QYZ_cjs.OPCODE_NAMES,
|
|
22800
|
+
OPCODE_VALUES: () => chunkWIFL5QYZ_cjs.OPCODE_VALUES,
|
|
22801
|
+
SUPPORTED_PROGRAM_VERSION: () => chunkWIFL5QYZ_cjs.SUPPORTED_PROGRAM_VERSION,
|
|
22463
22802
|
Script: () => btcSigner.Script,
|
|
22464
|
-
arkadeScriptHash: () =>
|
|
22465
|
-
arkadeWitnessHash: () =>
|
|
22466
|
-
asmToBytes: () =>
|
|
22467
|
-
bytesToASM: () =>
|
|
22468
|
-
computeArkadeScriptPublicKey: () =>
|
|
22803
|
+
arkadeScriptHash: () => chunkWIFL5QYZ_cjs.arkadeScriptHash,
|
|
22804
|
+
arkadeWitnessHash: () => chunkWIFL5QYZ_cjs.arkadeWitnessHash,
|
|
22805
|
+
asmToBytes: () => chunkWIFL5QYZ_cjs.asmToBytes,
|
|
22806
|
+
bytesToASM: () => chunkWIFL5QYZ_cjs.bytesToASM,
|
|
22807
|
+
computeArkadeScriptPublicKey: () => chunkWIFL5QYZ_cjs.computeArkadeScriptPublicKey,
|
|
22469
22808
|
createArkadeBatchHandler: () => createArkadeBatchHandler,
|
|
22470
|
-
deserializeArkadeContractParams: () =>
|
|
22471
|
-
fromASM: () =>
|
|
22472
|
-
getOpcodeName: () =>
|
|
22473
|
-
getOpcodeValue: () =>
|
|
22474
|
-
parseArtifact: () =>
|
|
22475
|
-
resolveAsm: () =>
|
|
22476
|
-
serializeArkadeContractParams: () =>
|
|
22477
|
-
stringifyArtifact: () =>
|
|
22478
|
-
toASM: () =>
|
|
22479
|
-
validateProgram: () =>
|
|
22480
|
-
witnessRefToBytes: () =>
|
|
22809
|
+
deserializeArkadeContractParams: () => chunkWIFL5QYZ_cjs.deserializeArkadeContractParams,
|
|
22810
|
+
fromASM: () => chunkWIFL5QYZ_cjs.fromASM,
|
|
22811
|
+
getOpcodeName: () => chunkWIFL5QYZ_cjs.getOpcodeName,
|
|
22812
|
+
getOpcodeValue: () => chunkWIFL5QYZ_cjs.getOpcodeValue,
|
|
22813
|
+
parseArtifact: () => chunkWIFL5QYZ_cjs.parseArtifact,
|
|
22814
|
+
resolveAsm: () => chunkWIFL5QYZ_cjs.resolveAsm,
|
|
22815
|
+
serializeArkadeContractParams: () => chunkWIFL5QYZ_cjs.serializeArkadeContractParams,
|
|
22816
|
+
stringifyArtifact: () => chunkWIFL5QYZ_cjs.stringifyArtifact,
|
|
22817
|
+
toASM: () => chunkWIFL5QYZ_cjs.toASM,
|
|
22818
|
+
validateProgram: () => chunkWIFL5QYZ_cjs.validateProgram,
|
|
22819
|
+
witnessRefToBytes: () => chunkWIFL5QYZ_cjs.witnessRefToBytes
|
|
22481
22820
|
});
|
|
22482
|
-
var isVtxoCoin = (input) =>
|
|
22821
|
+
var isVtxoCoin = (input) => chunk5MLC2HU3_cjs.isVirtualCoin(input);
|
|
22483
22822
|
function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message, session, arkProvider, emulator, network, recipients, batchExpiryPolicy) {
|
|
22484
22823
|
let batchId;
|
|
22485
22824
|
let sweepTapTreeRoot;
|
|
@@ -22500,23 +22839,23 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
22500
22839
|
);
|
|
22501
22840
|
await arkProvider.confirmRegistration(intentId);
|
|
22502
22841
|
batchId = event.id;
|
|
22503
|
-
const sweepTapscript =
|
|
22842
|
+
const sweepTapscript = chunk5MLC2HU3_cjs.CSVMultisigTapscript.encode({
|
|
22504
22843
|
timelock,
|
|
22505
|
-
pubkeys: [
|
|
22844
|
+
pubkeys: [chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(info.forfeitPubkey), "forfeit key")]
|
|
22506
22845
|
}).script;
|
|
22507
22846
|
sweepTapTreeRoot = payment_js.tapLeafHash(sweepTapscript);
|
|
22508
22847
|
return { skip: false };
|
|
22509
22848
|
},
|
|
22510
22849
|
onTreeSigningStarted: async (event, vtxoTree) => {
|
|
22511
22850
|
const signerPubKey = await session.getPublicKey();
|
|
22512
|
-
const xonlySignerPubKey =
|
|
22851
|
+
const xonlySignerPubKey = chunkWIFL5QYZ_cjs.toXOnly(signerPubKey, "signer key");
|
|
22513
22852
|
const xOnlyPubkeys = event.cosignersPublicKeys.map(
|
|
22514
|
-
(k) => base.hex.encode(
|
|
22853
|
+
(k) => base.hex.encode(chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
|
|
22515
22854
|
);
|
|
22516
22855
|
if (!xOnlyPubkeys.includes(base.hex.encode(xonlySignerPubKey))) {
|
|
22517
22856
|
return { skip: true };
|
|
22518
22857
|
}
|
|
22519
|
-
const commitmentTx =
|
|
22858
|
+
const commitmentTx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
|
|
22520
22859
|
validateVtxoTxGraph(vtxoTree, commitmentTx, sweepTapTreeRoot);
|
|
22521
22860
|
if (recipients && recipients.length > 0) {
|
|
22522
22861
|
validateBatchRecipients(commitmentTx, vtxoTree.leaves(), recipients, network);
|
|
@@ -22548,7 +22887,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
22548
22887
|
if (connectorTree) {
|
|
22549
22888
|
validateConnectorsTxGraph(event.commitmentTx, connectorTree);
|
|
22550
22889
|
}
|
|
22551
|
-
let commitmentPsbt =
|
|
22890
|
+
let commitmentPsbt = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
|
|
22552
22891
|
assertFinalCommitmentMatchesValidated(
|
|
22553
22892
|
commitmentPsbt,
|
|
22554
22893
|
validatedCommitmentTxid,
|
|
@@ -22583,7 +22922,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
22583
22922
|
boardingIndices.push(boardingIdx);
|
|
22584
22923
|
continue;
|
|
22585
22924
|
}
|
|
22586
|
-
if (
|
|
22925
|
+
if (chunk5MLC2HU3_cjs.isRecoverable(input) || isSubdust(input, info.dust)) {
|
|
22587
22926
|
continue;
|
|
22588
22927
|
}
|
|
22589
22928
|
if (connectorIndex >= connectorLeaves.length) {
|
|
@@ -22604,7 +22943,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
22604
22943
|
index: input.vout,
|
|
22605
22944
|
witnessUtxo: {
|
|
22606
22945
|
amount: BigInt(input.value),
|
|
22607
|
-
script:
|
|
22946
|
+
script: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
22608
22947
|
},
|
|
22609
22948
|
sighashType: btcSigner.SigHash.DEFAULT,
|
|
22610
22949
|
tapLeafScript: [input.forfeitTapLeafScript]
|
|
@@ -22695,16 +23034,16 @@ var Arkade = class _Arkade {
|
|
|
22695
23034
|
/** Connect and resolve the server key, checkpoint closure and (if present) the co-signer key. */
|
|
22696
23035
|
static async connect(opts) {
|
|
22697
23036
|
const info = await opts.arkade.getInfo();
|
|
22698
|
-
const serverKey =
|
|
22699
|
-
const checkpoint =
|
|
22700
|
-
const network = opts.network ??
|
|
23037
|
+
const serverKey = chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
|
|
23038
|
+
const checkpoint = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
|
|
23039
|
+
const network = opts.network ?? chunk5MLC2HU3_cjs.DEFAULT_NETWORK;
|
|
22701
23040
|
let emulatorKey;
|
|
22702
23041
|
if (opts.emulator) {
|
|
22703
|
-
emulatorKey = base.hex.decode(
|
|
23042
|
+
emulatorKey = base.hex.decode(chunk5MLC2HU3_cjs.resolveEmulatorPubkey(network, opts.emulatorPubkey));
|
|
22704
23043
|
}
|
|
22705
23044
|
let userKey;
|
|
22706
23045
|
if (opts.identity) {
|
|
22707
|
-
userKey =
|
|
23046
|
+
userKey = chunkWIFL5QYZ_cjs.toXOnly(await opts.identity.xOnlyPublicKey(), "identity key");
|
|
22708
23047
|
}
|
|
22709
23048
|
return new _Arkade({
|
|
22710
23049
|
arkProvider: opts.arkade,
|
|
@@ -22730,7 +23069,7 @@ var Arkade = class _Arkade {
|
|
|
22730
23069
|
* key respectively; explicit args always win.
|
|
22731
23070
|
*/
|
|
22732
23071
|
contract(program, args = {}) {
|
|
22733
|
-
const declared = (program.params ?? []).map(
|
|
23072
|
+
const declared = (program.params ?? []).map(chunkWIFL5QYZ_cjs.inputName);
|
|
22734
23073
|
if (declared.includes("server") && args.server === void 0) {
|
|
22735
23074
|
args = { ...args, server: this.serverKey };
|
|
22736
23075
|
}
|
|
@@ -22750,7 +23089,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
22750
23089
|
userKey: client.userKey,
|
|
22751
23090
|
emulatorKey: client.emulatorKey
|
|
22752
23091
|
};
|
|
22753
|
-
this.vtxoScript = new
|
|
23092
|
+
this.vtxoScript = new chunkWIFL5QYZ_cjs.ArkadeProgramScript(program, args, this.keys);
|
|
22754
23093
|
this.tapTree = this.vtxoScript.encode();
|
|
22755
23094
|
this.compiled = this.vtxoScript.compiled;
|
|
22756
23095
|
}
|
|
@@ -22778,7 +23117,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
22778
23117
|
`ArkadeContract.fromContract: expected contract type 'arkade', got '${contract.type}'`
|
|
22779
23118
|
);
|
|
22780
23119
|
}
|
|
22781
|
-
const typed =
|
|
23120
|
+
const typed = chunkWIFL5QYZ_cjs.deserializeArkadeContractParams(contract.params);
|
|
22782
23121
|
return new _ArkadeContract(client, typed.program, typed.args, {
|
|
22783
23122
|
serverKey: typed.serverKey,
|
|
22784
23123
|
userKey: typed.userKey,
|
|
@@ -22819,7 +23158,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
22819
23158
|
toContractParams() {
|
|
22820
23159
|
return {
|
|
22821
23160
|
type: "arkade",
|
|
22822
|
-
params:
|
|
23161
|
+
params: chunkWIFL5QYZ_cjs.serializeArkadeContractParams({
|
|
22823
23162
|
program: this.program,
|
|
22824
23163
|
args: this.args,
|
|
22825
23164
|
serverKey: this.keys.serverKey,
|
|
@@ -22856,6 +23195,10 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
22856
23195
|
* When a `contractManager` is configured and this contract is registered,
|
|
22857
23196
|
* reads the repository-backed state (offline-first, kept fresh by the
|
|
22858
23197
|
* contract watcher). Otherwise falls back to a direct indexer query.
|
|
23198
|
+
*
|
|
23199
|
+
* Both branches refuse a spent or unilaterally exited output. They are not
|
|
23200
|
+
* otherwise interchangeable: the fallback asks `spendableOnly`, which also
|
|
23201
|
+
* drops swept coins — the manager branch keeps those.
|
|
22859
23202
|
*/
|
|
22860
23203
|
async getUtxos() {
|
|
22861
23204
|
const manager = this.client.contractManager;
|
|
@@ -22865,18 +23208,18 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
22865
23208
|
if (registered) {
|
|
22866
23209
|
const [withVtxos] = await manager.getContractsWithVtxos({ script: scriptHex });
|
|
22867
23210
|
return (withVtxos?.vtxos ?? []).filter(
|
|
22868
|
-
(v) => !
|
|
23211
|
+
(v) => !chunk5MLC2HU3_cjs.hasTerminalSpend(v) && !v.isUnrolled
|
|
22869
23212
|
);
|
|
22870
23213
|
}
|
|
22871
23214
|
}
|
|
22872
23215
|
if (!this.client.indexer) {
|
|
22873
23216
|
throw new Error("ArkadeContract.getUtxos: an indexer is required");
|
|
22874
23217
|
}
|
|
22875
|
-
const { vtxos } = await
|
|
23218
|
+
const { vtxos } = await chunk5MLC2HU3_cjs.getNormalizedVtxos(this.client.indexer, {
|
|
22876
23219
|
scripts: [scriptHex],
|
|
22877
23220
|
spendableOnly: true
|
|
22878
23221
|
});
|
|
22879
|
-
return vtxos;
|
|
23222
|
+
return vtxos.filter((v) => !chunk5MLC2HU3_cjs.hasTerminalSpend(v) && !v.isUnrolled);
|
|
22880
23223
|
}
|
|
22881
23224
|
/** Total spendable balance (requires an indexer). */
|
|
22882
23225
|
async getBalance() {
|
|
@@ -22974,7 +23317,7 @@ var ArkadeTransactionBuilder = class {
|
|
|
22974
23317
|
this.contract.client.checkpoint
|
|
22975
23318
|
);
|
|
22976
23319
|
if (coin.sourceTx) {
|
|
22977
|
-
|
|
23320
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(arkTx, 0, chunk5MLC2HU3_cjs.PrevArkTxField, coin.sourceTx);
|
|
22978
23321
|
}
|
|
22979
23322
|
if (this.fn.arkadeScript) {
|
|
22980
23323
|
const indexer = this.contract.client.indexer;
|
|
@@ -22991,8 +23334,8 @@ var ArkadeTransactionBuilder = class {
|
|
|
22991
23334
|
}
|
|
22992
23335
|
const condition = (def.tapscript.witness ?? []).map((w) => this.witnessBytes(w));
|
|
22993
23336
|
if (condition.length > 0) {
|
|
22994
|
-
|
|
22995
|
-
|
|
23337
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(arkTx, 0, chunk5MLC2HU3_cjs.ConditionWitness, condition);
|
|
23338
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(checkpoints[0], 0, chunk5MLC2HU3_cjs.ConditionWitness, condition);
|
|
22996
23339
|
}
|
|
22997
23340
|
const packets = [];
|
|
22998
23341
|
if (this.assetSpecs.length > 0) {
|
|
@@ -23031,7 +23374,7 @@ var ArkadeTransactionBuilder = class {
|
|
|
23031
23374
|
base.base64.encode(signedArk2.toPSBT()),
|
|
23032
23375
|
signedCps.map((c) => base.base64.encode(c.toPSBT()))
|
|
23033
23376
|
);
|
|
23034
|
-
const txid =
|
|
23377
|
+
const txid = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
|
|
23035
23378
|
return {
|
|
23036
23379
|
txid,
|
|
23037
23380
|
signedArkTx: res2.signedArkTx,
|
|
@@ -23090,23 +23433,23 @@ var ArkadeTransactionBuilder = class {
|
|
|
23090
23433
|
}
|
|
23091
23434
|
buildAssetPacket() {
|
|
23092
23435
|
const groups = this.assetSpecs.map((s) => {
|
|
23093
|
-
const id = typeof s.assetId === "string" ?
|
|
23094
|
-
return
|
|
23436
|
+
const id = typeof s.assetId === "string" ? chunkGVHUHTRH_cjs.AssetId.fromString(s.assetId) : chunkGVHUHTRH_cjs.AssetId.fromBytes(s.assetId);
|
|
23437
|
+
return chunkGVHUHTRH_cjs.AssetGroup.create(
|
|
23095
23438
|
id,
|
|
23096
23439
|
null,
|
|
23097
|
-
s.inputs.map((i) =>
|
|
23098
|
-
s.outputs.map((o) =>
|
|
23099
|
-
(s.metadata ?? []).map((m) =>
|
|
23440
|
+
s.inputs.map((i) => chunkGVHUHTRH_cjs.AssetInput.create(i.vin, i.amount)),
|
|
23441
|
+
s.outputs.map((o) => chunkGVHUHTRH_cjs.AssetOutput.create(o.vout, o.amount)),
|
|
23442
|
+
(s.metadata ?? []).map((m) => chunkGVHUHTRH_cjs.Metadata.create(m.key, m.value))
|
|
23100
23443
|
);
|
|
23101
23444
|
});
|
|
23102
|
-
return
|
|
23445
|
+
return chunkGVHUHTRH_cjs.Packet.create(groups);
|
|
23103
23446
|
}
|
|
23104
23447
|
witnessBytes(ref) {
|
|
23105
|
-
return
|
|
23448
|
+
return chunkWIFL5QYZ_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
|
|
23106
23449
|
}
|
|
23107
23450
|
};
|
|
23108
23451
|
function bindInputs(fn, callArgs) {
|
|
23109
|
-
const names = (fn.def.inputs ?? []).map(
|
|
23452
|
+
const names = (fn.def.inputs ?? []).map(chunkWIFL5QYZ_cjs.inputName);
|
|
23110
23453
|
if (callArgs.length !== names.length) {
|
|
23111
23454
|
throw new Error(`${fn.name}: expected ${names.length} argument(s), got ${callArgs.length}`);
|
|
23112
23455
|
}
|
|
@@ -23497,6 +23840,7 @@ function createDefaultPaymentRouter(wallet) {
|
|
|
23497
23840
|
exports.ARKADE_MAGIC = ARKADE_MAGIC;
|
|
23498
23841
|
exports.ARKADE_SALTED_PREIMAGE_TAG = ARKADE_SALTED_PREIMAGE_TAG;
|
|
23499
23842
|
exports.ARKADE_SWAP_PREIMAGE_TAG = ARKADE_SWAP_PREIMAGE_TAG;
|
|
23843
|
+
exports.AbortError = AbortError;
|
|
23500
23844
|
exports.ActivityRegistry = ActivityRegistry;
|
|
23501
23845
|
exports.AmbiguousRouteError = AmbiguousRouteError;
|
|
23502
23846
|
exports.ArkNote = ArkNote;
|
|
@@ -23711,5 +24055,5 @@ exports.verifyTapscriptSignatures = verifyTapscriptSignatures;
|
|
|
23711
24055
|
exports.waitForIncomingFunds = waitForIncomingFunds;
|
|
23712
24056
|
exports.warnAndFilterVtxosForScript = warnAndFilterVtxosForScript;
|
|
23713
24057
|
exports.withPrevTxs = withPrevTxs;
|
|
23714
|
-
//# sourceMappingURL=chunk-
|
|
23715
|
-
//# sourceMappingURL=chunk-
|
|
24058
|
+
//# sourceMappingURL=chunk-EBYCTLET.cjs.map
|
|
24059
|
+
//# sourceMappingURL=chunk-EBYCTLET.cjs.map
|