@arkade-os/sdk 0.4.68 → 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 +33 -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-DaZlVTbM.d.ts → asyncStorageTaskQueue-BgUJN-3X.d.ts} +1 -1
- package/dist/{asyncStorageTaskQueue-B2CcXIHU.d.cts → asyncStorageTaskQueue-Cstx6hS7.d.cts} +1 -1
- package/dist/{chunk-45FKMOJH.js → chunk-2PPL3O7Z.js} +3 -3
- package/dist/{chunk-45FKMOJH.js.map → chunk-2PPL3O7Z.js.map} +1 -1
- package/dist/{chunk-EJOFL5WH.cjs → chunk-5MLC2HU3.cjs} +3 -3
- package/dist/{chunk-EJOFL5WH.cjs.map → chunk-5MLC2HU3.cjs.map} +1 -1
- package/dist/{chunk-WCJVKFAP.cjs → chunk-EBYCTLET.cjs} +787 -479
- package/dist/chunk-EBYCTLET.cjs.map +1 -0
- package/dist/{chunk-PJR63FTK.cjs → chunk-GVHUHTRH.cjs} +17 -17
- package/dist/{chunk-PJR63FTK.cjs.map → chunk-GVHUHTRH.cjs.map} +1 -1
- package/dist/{chunk-4KCVS4ZN.cjs → chunk-HQ4DMGA4.cjs} +10 -10
- package/dist/{chunk-4KCVS4ZN.cjs.map → chunk-HQ4DMGA4.cjs.map} +1 -1
- package/dist/{chunk-4CMXV5SF.js → chunk-L5SCQYHF.js} +3 -3
- package/dist/{chunk-4CMXV5SF.js.map → chunk-L5SCQYHF.js.map} +1 -1
- package/dist/{chunk-G4I6PU5H.js → chunk-MNMPGEK2.js} +4 -4
- package/dist/{chunk-G4I6PU5H.js.map → chunk-MNMPGEK2.js.map} +1 -1
- package/dist/{chunk-VBHXBI7F.js → chunk-TA7XLEP2.js} +357 -50
- package/dist/chunk-TA7XLEP2.js.map +1 -0
- package/dist/{chunk-6YUACVX4.cjs → chunk-WIFL5QYZ.cjs} +49 -49
- package/dist/{chunk-6YUACVX4.cjs.map → chunk-WIFL5QYZ.cjs.map} +1 -1
- package/dist/{chunk-GQ4NMQGR.js → chunk-XLWDX7QZ.js} +4 -4
- package/dist/{chunk-GQ4NMQGR.js.map → chunk-XLWDX7QZ.js.map} +1 -1
- package/dist/{chunk-JGMSZIE4.cjs → chunk-XQPN5YP2.cjs} +17 -17
- package/dist/{chunk-JGMSZIE4.cjs.map → chunk-XQPN5YP2.cjs.map} +1 -1
- package/dist/{chunk-33Q2RFET.js → chunk-YG7T6LI3.js} +3 -3
- package/dist/{chunk-33Q2RFET.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-AomVWxO_.d.ts → delegate-BPdzTbwN.d.ts} +1 -1
- package/dist/{delegate-Bffc5f54.d.cts → delegate-DrwIar11.d.cts} +1 -1
- package/dist/{hdWalletCapable-DZdIVa23.d.ts → hdWalletCapable-D4WH35z0.d.cts} +49 -5
- package/dist/{hdWalletCapable-B5nRs3RH.d.cts → hdWalletCapable-DyxCiNVE.d.ts} +49 -5
- package/dist/{index-nfyQM33h.d.cts → index-BqhpAqqj.d.cts} +2 -2
- package/dist/{index-jouvy8FD.d.ts → index-TZJvbIaA.d.ts} +2 -2
- package/dist/{index-C7RZCfoY.d.cts → index-dWRqYSdS.d.cts} +53 -1
- package/dist/{index-C7RZCfoY.d.ts → index-dWRqYSdS.d.ts} +53 -1
- package/dist/index.cjs +294 -290
- package/dist/index.d.cts +25 -8
- package/dist/index.d.ts +25 -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-D2vnpPBT.d.cts → taskRunner-CzYKyJ9c.d.cts} +1 -1
- package/dist/{taskRunner-DuwK9t8O.d.ts → taskRunner-D2fnbqYw.d.ts} +1 -1
- 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-VBHXBI7F.js.map +0 -1
- package/dist/chunk-WCJVKFAP.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
|
});
|
|
@@ -323,7 +323,7 @@ var SingleKey = class _SingleKey {
|
|
|
323
323
|
async sign(tx, inputIndexes) {
|
|
324
324
|
const txCpy = tx.clone();
|
|
325
325
|
if (!inputIndexes) {
|
|
326
|
-
|
|
326
|
+
chunk5MLC2HU3_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH);
|
|
327
327
|
try {
|
|
328
328
|
if (!txCpy.sign(this.key, ALLOWED_SIGHASH)) {
|
|
329
329
|
throw new Error("Failed to sign transaction");
|
|
@@ -432,7 +432,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
432
432
|
let network;
|
|
433
433
|
if ("descriptor" in opts && typeof opts.descriptor === "string") {
|
|
434
434
|
descriptor = opts.descriptor;
|
|
435
|
-
network =
|
|
435
|
+
network = chunkWIFL5QYZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
436
436
|
} else {
|
|
437
437
|
network = opts.isMainnet ?? true ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
438
438
|
descriptor = descriptorsScure.scriptExpressions.trBIP32({
|
|
@@ -530,7 +530,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
530
530
|
* `StaticDescriptorProvider` for legacy single-key wallets.
|
|
531
531
|
*/
|
|
532
532
|
isOurs(descriptor) {
|
|
533
|
-
return
|
|
533
|
+
return chunkWIFL5QYZ_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
|
|
534
534
|
}
|
|
535
535
|
/**
|
|
536
536
|
* Signs each request with the key derived from its descriptor.
|
|
@@ -579,7 +579,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
579
579
|
}
|
|
580
580
|
// ── internal helpers ─────────────────────────────────────────────
|
|
581
581
|
derivePrivateKeyForDescriptor(descriptor) {
|
|
582
|
-
const network =
|
|
582
|
+
const network = chunkWIFL5QYZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
583
583
|
const expansion = descriptorsScure.expand({ descriptor, network });
|
|
584
584
|
if (expansion.isRanged) {
|
|
585
585
|
throw new Error(
|
|
@@ -604,7 +604,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
604
604
|
signTxWithKey(tx, key, inputIndexes) {
|
|
605
605
|
const txCpy = tx.clone();
|
|
606
606
|
if (!inputIndexes) {
|
|
607
|
-
|
|
607
|
+
chunk5MLC2HU3_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH2);
|
|
608
608
|
try {
|
|
609
609
|
if (!txCpy.sign(key, ALLOWED_SIGHASH2)) {
|
|
610
610
|
throw new Error("Failed to sign transaction");
|
|
@@ -666,7 +666,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
|
|
|
666
666
|
*/
|
|
667
667
|
descriptor;
|
|
668
668
|
constructor(descriptor) {
|
|
669
|
-
const network =
|
|
669
|
+
const network = chunkWIFL5QYZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
670
670
|
let expansion;
|
|
671
671
|
try {
|
|
672
672
|
expansion = descriptorsScure.expand({ descriptor, network, index: 0 });
|
|
@@ -716,7 +716,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
|
|
|
716
716
|
* `StaticDescriptorProvider` for legacy single-key wallets.
|
|
717
717
|
*/
|
|
718
718
|
isOurs(descriptor) {
|
|
719
|
-
return
|
|
719
|
+
return chunkWIFL5QYZ_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
|
|
720
720
|
}
|
|
721
721
|
};
|
|
722
722
|
function serializeSeedOwnedSigningIdentity(identity) {
|
|
@@ -878,10 +878,10 @@ var DescriptorIdentity = class {
|
|
|
878
878
|
this.base = base;
|
|
879
879
|
}
|
|
880
880
|
async xOnlyPublicKey() {
|
|
881
|
-
return
|
|
881
|
+
return chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(this.descriptor);
|
|
882
882
|
}
|
|
883
883
|
async compressedPublicKey() {
|
|
884
|
-
return
|
|
884
|
+
return chunkWIFL5QYZ_cjs.deriveDescriptorLeafCompressedPubKey(this.descriptor);
|
|
885
885
|
}
|
|
886
886
|
async sign(tx, inputIndexes) {
|
|
887
887
|
const [signed] = await this.signer.signWithDescriptor([
|
|
@@ -949,12 +949,12 @@ var WalletCannotAllocateAddressError = class extends Error {
|
|
|
949
949
|
};
|
|
950
950
|
async function resolveDescriptorSigner(descriptor, identity, provider) {
|
|
951
951
|
const owner = provider?.isOurs(descriptor) ? provider : isHDCapableIdentity(identity) && identity.isOurs(descriptor) ? identity : void 0;
|
|
952
|
-
if (owner &&
|
|
952
|
+
if (owner && chunkWIFL5QYZ_cjs.parseHDDescriptor(descriptor)) {
|
|
953
953
|
return new DescriptorIdentity({ descriptor, signer: owner, base: identity });
|
|
954
954
|
}
|
|
955
955
|
let key;
|
|
956
956
|
try {
|
|
957
|
-
key =
|
|
957
|
+
key = chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
958
958
|
} catch {
|
|
959
959
|
throw new ForeignDescriptorError(descriptor);
|
|
960
960
|
}
|
|
@@ -1329,14 +1329,14 @@ function buildSaltedPreimageMessage(xonly, salt) {
|
|
|
1329
1329
|
}
|
|
1330
1330
|
var PREIMAGE_INDEX = 0;
|
|
1331
1331
|
function isPerArtifactDescriptor(descriptor) {
|
|
1332
|
-
return
|
|
1332
|
+
return chunkWIFL5QYZ_cjs.parseHDDescriptor(descriptor) !== null;
|
|
1333
1333
|
}
|
|
1334
1334
|
async function provisionDescriptor(wallet) {
|
|
1335
1335
|
const allocated = isHDAllocationCapable(wallet) ? await wallet.getNextSigningDescriptor() : void 0;
|
|
1336
|
-
return allocated ?? await
|
|
1336
|
+
return allocated ?? await chunkWIFL5QYZ_cjs.identityDescriptor(wallet.identity);
|
|
1337
1337
|
}
|
|
1338
1338
|
async function provisionRefundKey(wallet) {
|
|
1339
|
-
const descriptor = await
|
|
1339
|
+
const descriptor = await chunkWIFL5QYZ_cjs.identityDescriptor(wallet.identity);
|
|
1340
1340
|
const signer = await contractSigner(wallet, descriptor);
|
|
1341
1341
|
const pubkey = await signer.xOnlyPublicKey();
|
|
1342
1342
|
const identityPubkey = await wallet.identity.xOnlyPublicKey();
|
|
@@ -1346,7 +1346,7 @@ async function provisionRefundKey(wallet) {
|
|
|
1346
1346
|
);
|
|
1347
1347
|
}
|
|
1348
1348
|
const address = await wallet.getAddress();
|
|
1349
|
-
const { pkScript } =
|
|
1349
|
+
const { pkScript } = chunk5MLC2HU3_cjs.ArkAddress.decode(address);
|
|
1350
1350
|
return { descriptor, pubkey, pkScript, address };
|
|
1351
1351
|
}
|
|
1352
1352
|
async function provisionClaimSecret(wallet, opts = {}) {
|
|
@@ -1392,7 +1392,7 @@ async function contractSigner(wallet, descriptor) {
|
|
|
1392
1392
|
const signer = isHDWalletCapable(wallet) ? await wallet.signerForDescriptor(descriptor) : wallet.identity;
|
|
1393
1393
|
let expected;
|
|
1394
1394
|
try {
|
|
1395
|
-
expected =
|
|
1395
|
+
expected = chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
1396
1396
|
} catch (cause) {
|
|
1397
1397
|
throw new ForeignDescriptorError(descriptor, { cause });
|
|
1398
1398
|
}
|
|
@@ -1611,14 +1611,14 @@ var RestDelegateProvider = class {
|
|
|
1611
1611
|
*/
|
|
1612
1612
|
async delegate(intent, forfeitTxs, options) {
|
|
1613
1613
|
const url = `${this.url}/v1/delegate`;
|
|
1614
|
-
const response = await
|
|
1614
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(url, {
|
|
1615
1615
|
method: "POST",
|
|
1616
1616
|
headers: {
|
|
1617
1617
|
"Content-Type": "application/json"
|
|
1618
1618
|
},
|
|
1619
1619
|
body: JSON.stringify({
|
|
1620
1620
|
intent: {
|
|
1621
|
-
message:
|
|
1621
|
+
message: chunk5MLC2HU3_cjs.Intent.encodeMessage(intent.message),
|
|
1622
1622
|
proof: intent.proof
|
|
1623
1623
|
},
|
|
1624
1624
|
forfeit_txs: forfeitTxs,
|
|
@@ -1638,7 +1638,7 @@ var RestDelegateProvider = class {
|
|
|
1638
1638
|
*/
|
|
1639
1639
|
async getDelegateInfo() {
|
|
1640
1640
|
const url = `${this.url}/v1/delegator/info`;
|
|
1641
|
-
const response = await
|
|
1641
|
+
const response = await chunk5MLC2HU3_cjs.rateGate.runHttp(url, () => chunk5MLC2HU3_cjs.baseFetch(url));
|
|
1642
1642
|
if (!response.ok) {
|
|
1643
1643
|
const errorText2 = await response.text();
|
|
1644
1644
|
throw new Error(`Failed to get delegate info: ${errorText2}`);
|
|
@@ -1663,7 +1663,7 @@ var ESPLORA_URL = {
|
|
|
1663
1663
|
regtest: "http://localhost:3000/api"
|
|
1664
1664
|
};
|
|
1665
1665
|
var EsploraProvider = class {
|
|
1666
|
-
constructor(baseUrl = ESPLORA_URL[
|
|
1666
|
+
constructor(baseUrl = ESPLORA_URL[chunk5MLC2HU3_cjs.DEFAULT_NETWORK_NAME], opts) {
|
|
1667
1667
|
this.baseUrl = baseUrl;
|
|
1668
1668
|
this.pollingInterval = opts?.pollingInterval ?? 15e3;
|
|
1669
1669
|
this.forcePolling = opts?.forcePolling ?? false;
|
|
@@ -1671,15 +1671,25 @@ var EsploraProvider = class {
|
|
|
1671
1671
|
baseUrl;
|
|
1672
1672
|
pollingInterval;
|
|
1673
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();
|
|
1674
1684
|
async getCoins(address) {
|
|
1675
|
-
const response = await
|
|
1685
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
|
|
1676
1686
|
if (!response.ok) {
|
|
1677
1687
|
throw new Error(`Failed to fetch UTXOs: ${response.statusText}`);
|
|
1678
1688
|
}
|
|
1679
1689
|
return response.json();
|
|
1680
1690
|
}
|
|
1681
1691
|
async getFeeRate() {
|
|
1682
|
-
const response = await
|
|
1692
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
|
|
1683
1693
|
if (response.status === 404) {
|
|
1684
1694
|
return void 0;
|
|
1685
1695
|
}
|
|
@@ -1700,7 +1710,7 @@ var EsploraProvider = class {
|
|
|
1700
1710
|
}
|
|
1701
1711
|
}
|
|
1702
1712
|
async getTxOutspends(txid) {
|
|
1703
|
-
const response = await
|
|
1713
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
|
|
1704
1714
|
if (!response.ok) {
|
|
1705
1715
|
const error = await response.text();
|
|
1706
1716
|
throw new Error(`Failed to get transaction outspends: ${error}`);
|
|
@@ -1708,15 +1718,27 @@ var EsploraProvider = class {
|
|
|
1708
1718
|
return response.json();
|
|
1709
1719
|
}
|
|
1710
1720
|
async getTransactions(address) {
|
|
1711
|
-
const response = await
|
|
1721
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
|
|
1712
1722
|
if (!response.ok) {
|
|
1713
1723
|
const error = await response.text();
|
|
1714
1724
|
throw new Error(`Failed to get transactions: ${error}`);
|
|
1715
1725
|
}
|
|
1716
1726
|
return response.json();
|
|
1717
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
|
+
}
|
|
1718
1740
|
async getRawTransaction(txid) {
|
|
1719
|
-
const response = await
|
|
1741
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/hex`);
|
|
1720
1742
|
if (!response.ok) {
|
|
1721
1743
|
const error = await response.text();
|
|
1722
1744
|
throw new Error(`Failed to get raw transaction ${txid}: ${error}`);
|
|
@@ -1724,7 +1746,7 @@ var EsploraProvider = class {
|
|
|
1724
1746
|
return base.hex.decode((await response.text()).trim());
|
|
1725
1747
|
}
|
|
1726
1748
|
async getTxStatus(txid) {
|
|
1727
|
-
const txresponse = await
|
|
1749
|
+
const txresponse = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
|
|
1728
1750
|
if (!txresponse.ok) {
|
|
1729
1751
|
throw new Error(txresponse.statusText);
|
|
1730
1752
|
}
|
|
@@ -1732,7 +1754,7 @@ var EsploraProvider = class {
|
|
|
1732
1754
|
if (!tx.status.confirmed) {
|
|
1733
1755
|
return { confirmed: false };
|
|
1734
1756
|
}
|
|
1735
|
-
const response = await
|
|
1757
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
|
|
1736
1758
|
if (!response.ok) {
|
|
1737
1759
|
throw new Error(`Failed to get transaction status: ${response.statusText}`);
|
|
1738
1760
|
}
|
|
@@ -1746,50 +1768,227 @@ var EsploraProvider = class {
|
|
|
1746
1768
|
blockHeight: data.block_height
|
|
1747
1769
|
};
|
|
1748
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
|
+
*/
|
|
1749
1790
|
async watchAddresses(addresses, callback) {
|
|
1750
|
-
|
|
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();
|
|
1751
1818
|
const wsUrl = this.baseUrl.replace(/^http(s)?:/, "ws$1:") + "/v1/ws";
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
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);
|
|
1758
1901
|
};
|
|
1759
|
-
const
|
|
1760
|
-
const txKey2 = (tx) => `${tx.txid}_${tx.status.block_time}`;
|
|
1761
|
-
const existingTxs = new Set(initialTxs.map(txKey2));
|
|
1762
|
-
intervalId = setInterval(async () => {
|
|
1902
|
+
const tick = async () => {
|
|
1763
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
|
+
}
|
|
1764
1911
|
const currentTxs = await getAllTxs();
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
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;
|
|
1769
1929
|
}
|
|
1930
|
+
failures = 0;
|
|
1770
1931
|
} catch (error) {
|
|
1771
|
-
|
|
1932
|
+
failures = Math.min(failures + 1, MAX_POLL_BACKOFF_EXPONENT);
|
|
1933
|
+
console.error("Error polling watched addresses:", error);
|
|
1772
1934
|
}
|
|
1773
|
-
|
|
1935
|
+
schedule();
|
|
1936
|
+
};
|
|
1937
|
+
await baseline;
|
|
1938
|
+
if (!isCurrentLoop()) return;
|
|
1939
|
+
await tick();
|
|
1774
1940
|
};
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
if (
|
|
1778
|
-
|
|
1941
|
+
const stopPolling = () => {
|
|
1942
|
+
pollSession++;
|
|
1943
|
+
if (timer) {
|
|
1944
|
+
clearTimeout(timer);
|
|
1945
|
+
timer = null;
|
|
1946
|
+
}
|
|
1947
|
+
pollStarted = false;
|
|
1779
1948
|
};
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
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;
|
|
1787
1984
|
const subscribeMsg = {
|
|
1788
1985
|
"track-addresses": addresses
|
|
1789
1986
|
};
|
|
1790
|
-
|
|
1987
|
+
socket.send(JSON.stringify(subscribeMsg));
|
|
1988
|
+
stopPolling();
|
|
1791
1989
|
});
|
|
1792
|
-
|
|
1990
|
+
socket.addEventListener("message", (event) => {
|
|
1991
|
+
if (!isCurrent()) return;
|
|
1793
1992
|
try {
|
|
1794
1993
|
const newTxs = [];
|
|
1795
1994
|
const message = JSON.parse(event.data.toString());
|
|
@@ -1801,22 +2000,45 @@ var EsploraProvider = class {
|
|
|
1801
2000
|
newTxs.push(...aux[address][type].filter(isExplorerTransaction));
|
|
1802
2001
|
}
|
|
1803
2002
|
}
|
|
1804
|
-
|
|
2003
|
+
report(newTxs);
|
|
1805
2004
|
} catch (error) {
|
|
1806
2005
|
console.error("Failed to process WebSocket message:", error);
|
|
1807
2006
|
}
|
|
1808
2007
|
});
|
|
1809
|
-
|
|
1810
|
-
|
|
2008
|
+
socket.addEventListener("error", () => {
|
|
2009
|
+
if (isCurrent()) void handleSocketFailure();
|
|
1811
2010
|
});
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
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 };
|
|
1817
2039
|
}
|
|
1818
2040
|
async getChainTip() {
|
|
1819
|
-
const tipBlocks = await
|
|
2041
|
+
const tipBlocks = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/blocks`);
|
|
1820
2042
|
if (!tipBlocks.ok) {
|
|
1821
2043
|
throw new Error(`Failed to get chain tip: ${tipBlocks.statusText}`);
|
|
1822
2044
|
}
|
|
@@ -1830,12 +2052,14 @@ var EsploraProvider = class {
|
|
|
1830
2052
|
const hash = tip[0].id;
|
|
1831
2053
|
return {
|
|
1832
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.
|
|
1833
2057
|
time: tip[0].mediantime,
|
|
1834
2058
|
hash
|
|
1835
2059
|
};
|
|
1836
2060
|
}
|
|
1837
2061
|
async broadcastPackage(parent, child) {
|
|
1838
|
-
const response = await
|
|
2062
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
|
|
1839
2063
|
method: "POST",
|
|
1840
2064
|
headers: {
|
|
1841
2065
|
"Content-Type": "application/json"
|
|
@@ -1851,7 +2075,7 @@ var EsploraProvider = class {
|
|
|
1851
2075
|
return result;
|
|
1852
2076
|
}
|
|
1853
2077
|
async broadcastTx(tx) {
|
|
1854
|
-
const response = await
|
|
2078
|
+
const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx`, {
|
|
1855
2079
|
method: "POST",
|
|
1856
2080
|
headers: {
|
|
1857
2081
|
"Content-Type": "text/plain"
|
|
@@ -1895,6 +2119,9 @@ var isExplorerTransaction = (tx) => {
|
|
|
1895
2119
|
(vout) => typeof vout.scriptpubkey_address === "string" && typeof vout.value === "number"
|
|
1896
2120
|
) && typeof tx.status === "object" && typeof tx.status.confirmed === "boolean";
|
|
1897
2121
|
};
|
|
2122
|
+
var MAX_POLL_BACKOFF_EXPONENT = 4;
|
|
2123
|
+
var RECONNECT_BASE_DELAY_MS = 1e3;
|
|
2124
|
+
var MAX_RECONNECT_BACKOFF_EXPONENT = 5;
|
|
1898
2125
|
var getVarIntSize = (n) => {
|
|
1899
2126
|
if (n < 253) return 1;
|
|
1900
2127
|
if (n <= 65535) return 3;
|
|
@@ -2031,7 +2258,7 @@ function findP2AOutput(tx) {
|
|
|
2031
2258
|
var CHILD_DUST_AMOUNT = 546;
|
|
2032
2259
|
function buildAnchorChild(params) {
|
|
2033
2260
|
const { parent, feeRate, fundingCoins, changeAddress, tapInternalKey, network } = params;
|
|
2034
|
-
const child = new
|
|
2261
|
+
const child = new chunk5MLC2HU3_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
|
|
2035
2262
|
child.addInput(findP2AOutput(parent));
|
|
2036
2263
|
const estimator = TxWeightEstimator.create().addP2AInput();
|
|
2037
2264
|
for (const _ of fundingCoins) {
|
|
@@ -2079,7 +2306,7 @@ function buildForfeitTx(inputs, forfeitPkScript, txLocktime) {
|
|
|
2079
2306
|
);
|
|
2080
2307
|
}
|
|
2081
2308
|
function buildForfeitTxWithOutput(inputs, output, txLocktime) {
|
|
2082
|
-
const tx = new
|
|
2309
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction({
|
|
2083
2310
|
version: 3,
|
|
2084
2311
|
lockTime: txLocktime
|
|
2085
2312
|
});
|
|
@@ -2155,7 +2382,7 @@ function validateVtxoTxGraph(graph, roundTransaction, sweepTapTreeRoot) {
|
|
|
2155
2382
|
if (previousScriptKey.length !== 32) {
|
|
2156
2383
|
throw new Error(`parent output ${childIndex} has invalid script`);
|
|
2157
2384
|
}
|
|
2158
|
-
const cosigners =
|
|
2385
|
+
const cosigners = chunk5MLC2HU3_cjs.getArkPsbtFields(child.root, 0, chunk5MLC2HU3_cjs.CosignerPublicKey);
|
|
2159
2386
|
if (cosigners.length === 0) {
|
|
2160
2387
|
throw ErrMissingCosignersPublicKeys;
|
|
2161
2388
|
}
|
|
@@ -2213,7 +2440,7 @@ var EmulatorPacket = class _EmulatorPacket {
|
|
|
2213
2440
|
return new _EmulatorPacket(entries);
|
|
2214
2441
|
}
|
|
2215
2442
|
static fromBytes(data) {
|
|
2216
|
-
const reader = new
|
|
2443
|
+
const reader = new chunkGVHUHTRH_cjs.BufferReader(data);
|
|
2217
2444
|
const entryCount = reader.readCompactSize();
|
|
2218
2445
|
const entries = [];
|
|
2219
2446
|
for (let i = 0; i < entryCount; i++) {
|
|
@@ -2231,7 +2458,7 @@ var EmulatorPacket = class _EmulatorPacket {
|
|
|
2231
2458
|
return _EmulatorPacket.PACKET_TYPE;
|
|
2232
2459
|
}
|
|
2233
2460
|
serialize() {
|
|
2234
|
-
const writer = new
|
|
2461
|
+
const writer = new chunkGVHUHTRH_cjs.BufferWriter();
|
|
2235
2462
|
writer.writeCompactSize(this.entries.length);
|
|
2236
2463
|
for (const entry of this.entries) {
|
|
2237
2464
|
writer.writeUint16LE(entry.vin);
|
|
@@ -2318,7 +2545,7 @@ var Extension = class _Extension {
|
|
|
2318
2545
|
`expected magic prefix ${base.hex.encode(ARKADE_MAGIC)}, got ${base.hex.encode(payload.slice(0, Math.min(payload.length, ARKADE_MAGIC.length)))}`
|
|
2319
2546
|
);
|
|
2320
2547
|
}
|
|
2321
|
-
const reader = new
|
|
2548
|
+
const reader = new chunkGVHUHTRH_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
|
|
2322
2549
|
const packets = [];
|
|
2323
2550
|
while (reader.remaining() > 0) {
|
|
2324
2551
|
const packetType = reader.readByte();
|
|
@@ -2392,7 +2619,7 @@ var Extension = class _Extension {
|
|
|
2392
2619
|
*/
|
|
2393
2620
|
getAssetPacket() {
|
|
2394
2621
|
for (const p of this.packets) {
|
|
2395
|
-
if (p instanceof
|
|
2622
|
+
if (p instanceof chunkGVHUHTRH_cjs.Packet) {
|
|
2396
2623
|
return p;
|
|
2397
2624
|
}
|
|
2398
2625
|
}
|
|
@@ -2430,8 +2657,8 @@ var Extension = class _Extension {
|
|
|
2430
2657
|
};
|
|
2431
2658
|
function parsePacket(packetType, data) {
|
|
2432
2659
|
switch (packetType) {
|
|
2433
|
-
case
|
|
2434
|
-
return
|
|
2660
|
+
case chunkGVHUHTRH_cjs.Packet.PACKET_TYPE:
|
|
2661
|
+
return chunkGVHUHTRH_cjs.Packet.fromBytes(data);
|
|
2435
2662
|
case EmulatorPacket.PACKET_TYPE:
|
|
2436
2663
|
return EmulatorPacket.fromBytes(data);
|
|
2437
2664
|
default:
|
|
@@ -2478,16 +2705,16 @@ function buildOpReturnScript(data) {
|
|
|
2478
2705
|
}
|
|
2479
2706
|
return script;
|
|
2480
2707
|
}
|
|
2481
|
-
var ErrOffchainOutputNotFound = (address) => new
|
|
2482
|
-
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(
|
|
2483
2710
|
`invalid asset output amount for ${assetId}: got ${got}, want ${want}`
|
|
2484
2711
|
);
|
|
2485
|
-
var ErrAssetGroupNotFound = (assetId) => new
|
|
2486
|
-
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(
|
|
2487
2714
|
`asset output not found in asset group ${assetId} at index ${outputIndex}`
|
|
2488
2715
|
);
|
|
2489
|
-
var ErrOnchainOutputNotFound = (address) => new
|
|
2490
|
-
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(
|
|
2491
2718
|
`offchain output ${address} cannot be validated: virtual output tree signing did not run`
|
|
2492
2719
|
);
|
|
2493
2720
|
var ErrInvalidOnchainOutputAmount = (address) => new Error(`invalid onchain output amount: ${address}`);
|
|
@@ -2496,7 +2723,7 @@ var ErrInvalidOffchainOutputAmount = (address) => new Error(`invalid offchain ou
|
|
|
2496
2723
|
function assertFinalCommitmentMatchesValidated(finalCommitmentTx, validatedCommitmentTxid, context) {
|
|
2497
2724
|
if (!validatedCommitmentTxid) return;
|
|
2498
2725
|
if (finalCommitmentTx.id === validatedCommitmentTxid) return;
|
|
2499
|
-
throw new
|
|
2726
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2500
2727
|
`${context}: finalization commitment tx ${finalCommitmentTx.id} differs from the validated commitment tx ${validatedCommitmentTxid}`
|
|
2501
2728
|
);
|
|
2502
2729
|
}
|
|
@@ -2506,7 +2733,7 @@ function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, netwo
|
|
|
2506
2733
|
for (const recipient of recipients) {
|
|
2507
2734
|
let arkAddress;
|
|
2508
2735
|
try {
|
|
2509
|
-
arkAddress =
|
|
2736
|
+
arkAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(recipient.address);
|
|
2510
2737
|
} catch {
|
|
2511
2738
|
validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
|
|
2512
2739
|
continue;
|
|
@@ -2518,7 +2745,7 @@ function validateBatchRecipientsWithoutTree(commitmentTx, recipients, network) {
|
|
|
2518
2745
|
const usedOnchainOutputs = /* @__PURE__ */ new Set();
|
|
2519
2746
|
for (const recipient of recipients) {
|
|
2520
2747
|
try {
|
|
2521
|
-
|
|
2748
|
+
chunk5MLC2HU3_cjs.ArkAddress.decode(recipient.address);
|
|
2522
2749
|
} catch {
|
|
2523
2750
|
validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
|
|
2524
2751
|
continue;
|
|
@@ -2751,7 +2978,7 @@ function assetMintResolver() {
|
|
|
2751
2978
|
if (!tx.assets?.length || !tx.key.arkTxid) return void 0;
|
|
2752
2979
|
const minted = tx.assets.filter((a) => {
|
|
2753
2980
|
try {
|
|
2754
|
-
return base.hex.encode(
|
|
2981
|
+
return base.hex.encode(chunkGVHUHTRH_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
|
|
2755
2982
|
} catch {
|
|
2756
2983
|
return false;
|
|
2757
2984
|
}
|
|
@@ -2794,7 +3021,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2794
3021
|
const existing = inputsByAssetId.get(asset.assetId);
|
|
2795
3022
|
inputsByAssetId.set(asset.assetId, [
|
|
2796
3023
|
...existing ?? [],
|
|
2797
|
-
|
|
3024
|
+
chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount)
|
|
2798
3025
|
]);
|
|
2799
3026
|
}
|
|
2800
3027
|
}
|
|
@@ -2806,7 +3033,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2806
3033
|
const existing = outputsByAssetId.get(asset.assetId);
|
|
2807
3034
|
outputsByAssetId.set(asset.assetId, [
|
|
2808
3035
|
...existing ?? [],
|
|
2809
|
-
|
|
3036
|
+
chunkGVHUHTRH_cjs.AssetOutput.create(outputIndex, asset.amount)
|
|
2810
3037
|
]);
|
|
2811
3038
|
}
|
|
2812
3039
|
}
|
|
@@ -2817,7 +3044,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2817
3044
|
const existing = outputsByAssetId.get(asset.assetId);
|
|
2818
3045
|
outputsByAssetId.set(asset.assetId, [
|
|
2819
3046
|
...existing ?? [],
|
|
2820
|
-
|
|
3047
|
+
chunkGVHUHTRH_cjs.AssetOutput.create(outputIndex, asset.amount)
|
|
2821
3048
|
]);
|
|
2822
3049
|
}
|
|
2823
3050
|
}
|
|
@@ -2826,11 +3053,11 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2826
3053
|
for (const assetIdStr of allAssetIds) {
|
|
2827
3054
|
const inputs = inputsByAssetId.get(assetIdStr);
|
|
2828
3055
|
const outputs = outputsByAssetId.get(assetIdStr);
|
|
2829
|
-
const assetId =
|
|
2830
|
-
const group =
|
|
3056
|
+
const assetId = chunkGVHUHTRH_cjs.AssetId.fromString(assetIdStr);
|
|
3057
|
+
const group = chunkGVHUHTRH_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
|
|
2831
3058
|
groups.push(group);
|
|
2832
3059
|
}
|
|
2833
|
-
return
|
|
3060
|
+
return chunkGVHUHTRH_cjs.Packet.create(groups);
|
|
2834
3061
|
}
|
|
2835
3062
|
function selectCoinsWithAsset(coins, assetId, requiredAmount) {
|
|
2836
3063
|
const coinsWithAsset = coins.filter((coin) => coin.assets?.some((a) => a.assetId === assetId));
|
|
@@ -2867,7 +3094,7 @@ function selectedCoinsToAssetInputs(selectedCoins) {
|
|
|
2867
3094
|
}
|
|
2868
3095
|
function toXOnlySignerHex(pubkeyHex) {
|
|
2869
3096
|
const bytes = base.hex.decode(pubkeyHex);
|
|
2870
|
-
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"));
|
|
2871
3098
|
throw new Error(`invalid signer pubkey length: expected 32 or 33 bytes, got ${bytes.length}`);
|
|
2872
3099
|
}
|
|
2873
3100
|
function signerSetFromInfo(info) {
|
|
@@ -2914,13 +3141,13 @@ var toTimelock = (value) => ({
|
|
|
2914
3141
|
var toSeconds = (t) => t.type === "seconds" ? t.value : t.value * NOMINAL_BLOCK_SECONDS;
|
|
2915
3142
|
function assertTimelockInPolicy(timelock, policy, label, overrideOption) {
|
|
2916
3143
|
if (policy.requireSeconds && timelock.type === "blocks") {
|
|
2917
|
-
throw new
|
|
3144
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2918
3145
|
`${label} rejected: block-typed timelocks are not accepted (got ${timelock.value})`
|
|
2919
3146
|
);
|
|
2920
3147
|
}
|
|
2921
3148
|
const seconds = toSeconds(timelock);
|
|
2922
3149
|
if (seconds < policy.minSeconds) {
|
|
2923
|
-
throw new
|
|
3150
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2924
3151
|
`${label} rejected: ${timelock.value} ${timelock.type} is below the ${policy.minSeconds}s floor; pass ${overrideOption}: ${seconds}n to Wallet.create to lower it`
|
|
2925
3152
|
);
|
|
2926
3153
|
}
|
|
@@ -2941,7 +3168,7 @@ function resolveBatchExpiryPolicy(network, overrides) {
|
|
|
2941
3168
|
}
|
|
2942
3169
|
function assertValidBatchExpiry(batchExpiry, policy) {
|
|
2943
3170
|
if (policy.advertisedVtxoTreeExpiry !== void 0 && batchExpiry !== policy.advertisedVtxoTreeExpiry) {
|
|
2944
|
-
throw new
|
|
3171
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2945
3172
|
`batch expiry rejected: ${batchExpiry} does not match the advertised vtxoTreeExpiry ${policy.advertisedVtxoTreeExpiry}`
|
|
2946
3173
|
);
|
|
2947
3174
|
}
|
|
@@ -2971,21 +3198,21 @@ function resolveCheckpointExitDelayPolicy(network, overrides) {
|
|
|
2971
3198
|
function assertValidServerUnrollScript(checkpointTapscript, policy) {
|
|
2972
3199
|
let script;
|
|
2973
3200
|
try {
|
|
2974
|
-
script =
|
|
3201
|
+
script = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
|
|
2975
3202
|
} catch (e) {
|
|
2976
|
-
throw new
|
|
3203
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2977
3204
|
`checkpoint exit delay rejected: invalid checkpointTapscript from server (${e instanceof Error ? e.message : String(e)})`
|
|
2978
3205
|
);
|
|
2979
3206
|
}
|
|
2980
3207
|
if (policy.advertisedForfeitPubkey !== void 0) {
|
|
2981
3208
|
const { pubkeys } = script.params;
|
|
2982
3209
|
if (pubkeys.length !== 1) {
|
|
2983
|
-
throw new
|
|
3210
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2984
3211
|
`checkpoint exit delay rejected: checkpointTapscript must commit to exactly one pubkey, got ${pubkeys.length} [${pubkeys.map(base.hex.encode).join(", ")}]`
|
|
2985
3212
|
);
|
|
2986
3213
|
}
|
|
2987
3214
|
if (!utils_js.equalBytes(pubkeys[0], policy.advertisedForfeitPubkey)) {
|
|
2988
|
-
throw new
|
|
3215
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
2989
3216
|
`checkpoint exit delay rejected: checkpointTapscript pubkey ${base.hex.encode(pubkeys[0])} does not match the advertised forfeitPubkey ${base.hex.encode(policy.advertisedForfeitPubkey)}`
|
|
2990
3217
|
);
|
|
2991
3218
|
}
|
|
@@ -3029,8 +3256,8 @@ function buildOffchainTx(inputs, outputs, serverUnrollScript) {
|
|
|
3029
3256
|
function buildVirtualTx(inputs, outputs) {
|
|
3030
3257
|
let lockTime = 0n;
|
|
3031
3258
|
for (const input of inputs) {
|
|
3032
|
-
const tapscript =
|
|
3033
|
-
if (
|
|
3259
|
+
const tapscript = chunk5MLC2HU3_cjs.decodeTapscript(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(input.tapLeafScript));
|
|
3260
|
+
if (chunk5MLC2HU3_cjs.CLTVMultisigTapscript.is(tapscript)) {
|
|
3034
3261
|
if (lockTime !== 0n) {
|
|
3035
3262
|
if (isSeconds(lockTime) !== isSeconds(tapscript.params.absoluteTimelock)) {
|
|
3036
3263
|
throw new Error("cannot mix seconds and blocks locktime");
|
|
@@ -3041,7 +3268,7 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3041
3268
|
}
|
|
3042
3269
|
}
|
|
3043
3270
|
}
|
|
3044
|
-
const tx = new
|
|
3271
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction({
|
|
3045
3272
|
version: 3,
|
|
3046
3273
|
lockTime: Number(lockTime)
|
|
3047
3274
|
});
|
|
@@ -3051,12 +3278,12 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3051
3278
|
index: input.vout,
|
|
3052
3279
|
sequence: lockTime ? btcSigner.DEFAULT_SEQUENCE - 1 : void 0,
|
|
3053
3280
|
witnessUtxo: {
|
|
3054
|
-
script:
|
|
3281
|
+
script: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript,
|
|
3055
3282
|
amount: BigInt(input.value)
|
|
3056
3283
|
},
|
|
3057
3284
|
tapLeafScript: [input.tapLeafScript]
|
|
3058
3285
|
});
|
|
3059
|
-
|
|
3286
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(tx, i, chunk5MLC2HU3_cjs.VtxoTaprootTree, input.tapTree);
|
|
3060
3287
|
}
|
|
3061
3288
|
for (const output of outputs) {
|
|
3062
3289
|
tx.addOutput(output);
|
|
@@ -3065,8 +3292,8 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3065
3292
|
return tx;
|
|
3066
3293
|
}
|
|
3067
3294
|
function buildCheckpointTx(vtxo, serverUnrollScript) {
|
|
3068
|
-
const collaborativeClosure =
|
|
3069
|
-
const checkpointVtxoScript = new
|
|
3295
|
+
const collaborativeClosure = chunk5MLC2HU3_cjs.decodeTapscript(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
|
|
3296
|
+
const checkpointVtxoScript = new chunk5MLC2HU3_cjs.VtxoScript([
|
|
3070
3297
|
serverUnrollScript.script,
|
|
3071
3298
|
collaborativeClosure.script
|
|
3072
3299
|
]);
|
|
@@ -3142,7 +3369,7 @@ function verifyTapscriptSignatures(tx, inputIndex, requiredSigners, excludePubke
|
|
|
3142
3369
|
const sighashType = signature.length === 65 ? signature[64] : btcSigner.SigHash.DEFAULT;
|
|
3143
3370
|
const sig = signature.subarray(0, 64);
|
|
3144
3371
|
if (!allowedSighashTypes.includes(sighashType)) {
|
|
3145
|
-
const sighashName =
|
|
3372
|
+
const sighashName = chunk5MLC2HU3_cjs.formatSighash(sighashType);
|
|
3146
3373
|
throw new Error(
|
|
3147
3374
|
`Unallowed sighash type ${sighashName} for input ${inputIndex}, pubkey ${pubKeyHex}.`
|
|
3148
3375
|
);
|
|
@@ -3216,7 +3443,7 @@ function combineTapscriptSigs(signedTx, originalTx) {
|
|
|
3216
3443
|
}
|
|
3217
3444
|
function isValidArkAddress(address) {
|
|
3218
3445
|
try {
|
|
3219
|
-
|
|
3446
|
+
chunk5MLC2HU3_cjs.ArkAddress.decode(address);
|
|
3220
3447
|
return true;
|
|
3221
3448
|
} catch (e) {
|
|
3222
3449
|
return false;
|
|
@@ -3224,16 +3451,16 @@ function isValidArkAddress(address) {
|
|
|
3224
3451
|
}
|
|
3225
3452
|
function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, context) {
|
|
3226
3453
|
if (serverCheckpointTxs.length !== expectedCheckpoints.length) {
|
|
3227
|
-
throw new
|
|
3454
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3228
3455
|
`${context} returned ${serverCheckpointTxs.length} checkpoints, expected ${expectedCheckpoints.length}`
|
|
3229
3456
|
);
|
|
3230
3457
|
}
|
|
3231
3458
|
const byTxid = new Map(expectedCheckpoints.map((c) => [c.id, c]));
|
|
3232
3459
|
return serverCheckpointTxs.map((encoded, index) => {
|
|
3233
|
-
const server =
|
|
3460
|
+
const server = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
|
|
3234
3461
|
const local = byTxid.get(server.id);
|
|
3235
3462
|
if (!local) {
|
|
3236
|
-
throw new
|
|
3463
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3237
3464
|
`${context} checkpoint ${index} txid ${server.id} does not match any submitted checkpoint`
|
|
3238
3465
|
);
|
|
3239
3466
|
}
|
|
@@ -3243,14 +3470,14 @@ function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, contex
|
|
|
3243
3470
|
}
|
|
3244
3471
|
function assertSubmittedArkTxid(response, signedArkTx, context) {
|
|
3245
3472
|
if (response.arkTxid !== signedArkTx.id) {
|
|
3246
|
-
throw new
|
|
3473
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3247
3474
|
`${context} returned ark txid ${response.arkTxid}, expected ${signedArkTx.id}`
|
|
3248
3475
|
);
|
|
3249
3476
|
}
|
|
3250
3477
|
if (response.finalArkTx === void 0) return;
|
|
3251
|
-
const finalTxid =
|
|
3478
|
+
const finalTxid = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
|
|
3252
3479
|
if (finalTxid !== signedArkTx.id) {
|
|
3253
|
-
throw new
|
|
3480
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3254
3481
|
`${context} returned final ark tx ${finalTxid}, expected ${signedArkTx.id}`
|
|
3255
3482
|
);
|
|
3256
3483
|
}
|
|
@@ -3269,10 +3496,10 @@ function assertServerSignedLeaf(serverTx, localTx, inputIndex, serverPubkeyHex,
|
|
|
3269
3496
|
[serverPubkeyHex],
|
|
3270
3497
|
void 0,
|
|
3271
3498
|
void 0,
|
|
3272
|
-
payment_js.tapLeafHash(
|
|
3499
|
+
payment_js.tapLeafHash(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(leaf))
|
|
3273
3500
|
);
|
|
3274
3501
|
} catch (error) {
|
|
3275
|
-
throw new
|
|
3502
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3276
3503
|
`${context}: input ${inputIndex} is not signed by the server on the leaf being spent (${error instanceof Error ? error.message : String(error)})`
|
|
3277
3504
|
);
|
|
3278
3505
|
}
|
|
@@ -3281,20 +3508,20 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
|
|
|
3281
3508
|
const byOutpoint = new Map(inputs.map((input) => [`${input.txid}:${input.vout}`, input]));
|
|
3282
3509
|
for (const [index, checkpoint] of checkpoints.entries()) {
|
|
3283
3510
|
if (checkpoint.inputsLength !== 1) {
|
|
3284
|
-
throw new
|
|
3511
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3285
3512
|
`${context}: checkpoint ${index} spends ${checkpoint.inputsLength} inputs, expected 1`
|
|
3286
3513
|
);
|
|
3287
3514
|
}
|
|
3288
3515
|
const spent = checkpoint.getInput(0);
|
|
3289
3516
|
if (!spent.txid || spent.index === void 0) {
|
|
3290
|
-
throw new
|
|
3517
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3291
3518
|
`${context}: checkpoint ${index} has no input outpoint`
|
|
3292
3519
|
);
|
|
3293
3520
|
}
|
|
3294
3521
|
const outpoint = `${base.hex.encode(spent.txid)}:${spent.index}`;
|
|
3295
3522
|
const input = byOutpoint.get(outpoint);
|
|
3296
3523
|
if (!input) {
|
|
3297
|
-
throw new
|
|
3524
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3298
3525
|
`${context}: checkpoint ${index} spends ${outpoint}, which is not one of the requested virtual outputs`
|
|
3299
3526
|
);
|
|
3300
3527
|
}
|
|
@@ -3302,7 +3529,7 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
|
|
|
3302
3529
|
(unroll) => buildCheckpointTx(input, unroll).tx.id === checkpoint.id
|
|
3303
3530
|
);
|
|
3304
3531
|
if (!rebuilt) {
|
|
3305
|
-
throw new
|
|
3532
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3306
3533
|
`${context}: checkpoint ${index} txid ${checkpoint.id} differs from the checkpoint built locally for ${outpoint}`
|
|
3307
3534
|
);
|
|
3308
3535
|
}
|
|
@@ -3328,9 +3555,9 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
|
|
|
3328
3555
|
const matched = matchServerCheckpoints(signedCheckpointTxs, offchainTx.checkpoints, "submitTx");
|
|
3329
3556
|
matched.forEach(({ server }, index) => {
|
|
3330
3557
|
try {
|
|
3331
|
-
|
|
3558
|
+
chunk5MLC2HU3_cjs.assertAllowedSighashTypes(server);
|
|
3332
3559
|
} catch (error) {
|
|
3333
|
-
throw new
|
|
3560
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3334
3561
|
`submitTx checkpoint ${index}: ${error instanceof Error ? error.message : String(error)}`
|
|
3335
3562
|
);
|
|
3336
3563
|
}
|
|
@@ -3338,12 +3565,12 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
|
|
|
3338
3565
|
const verify = options?.verifyServerSignatures;
|
|
3339
3566
|
if (verify) {
|
|
3340
3567
|
if (response.finalArkTx === void 0) {
|
|
3341
|
-
throw new
|
|
3568
|
+
throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
|
|
3342
3569
|
"submitTx: server returned no final ark tx to verify its signatures against"
|
|
3343
3570
|
);
|
|
3344
3571
|
}
|
|
3345
|
-
const finalArkTx =
|
|
3346
|
-
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"));
|
|
3347
3574
|
for (let i = 0; i < offchainTx.arkTx.inputsLength; i++) {
|
|
3348
3575
|
assertServerSignedLeaf(
|
|
3349
3576
|
finalArkTx,
|
|
@@ -3399,12 +3626,12 @@ function claimWithPreimageIdentity(identity, preimage) {
|
|
|
3399
3626
|
return {
|
|
3400
3627
|
...identity,
|
|
3401
3628
|
sign: async (tx, inputIndexes) => {
|
|
3402
|
-
const signed =
|
|
3629
|
+
const signed = chunk5MLC2HU3_cjs.Transaction.fromPSBT(
|
|
3403
3630
|
(await identity.sign(tx.clone(), inputIndexes)).toPSBT()
|
|
3404
3631
|
);
|
|
3405
3632
|
const indexes = inputIndexes ?? Array.from({ length: signed.inputsLength }, (_, i) => i);
|
|
3406
3633
|
for (const index of indexes) {
|
|
3407
|
-
|
|
3634
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(signed, index, chunk5MLC2HU3_cjs.ConditionWitness, [preimage]);
|
|
3408
3635
|
}
|
|
3409
3636
|
return signed;
|
|
3410
3637
|
}
|
|
@@ -3596,7 +3823,7 @@ function extendCoinWithTapscript(boardingTapscript, utxo) {
|
|
|
3596
3823
|
};
|
|
3597
3824
|
}
|
|
3598
3825
|
function deriveContractTapscripts(contract) {
|
|
3599
|
-
const handler =
|
|
3826
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
3600
3827
|
if (!handler) {
|
|
3601
3828
|
throw new Error(`No handler for contract type '${contract.type}'`);
|
|
3602
3829
|
}
|
|
@@ -3667,7 +3894,7 @@ function getRandomId() {
|
|
|
3667
3894
|
}
|
|
3668
3895
|
function isValidArkAddress2(address) {
|
|
3669
3896
|
try {
|
|
3670
|
-
|
|
3897
|
+
chunk5MLC2HU3_cjs.ArkAddress.decode(address);
|
|
3671
3898
|
return true;
|
|
3672
3899
|
} catch (e) {
|
|
3673
3900
|
return false;
|
|
@@ -3695,7 +3922,7 @@ function assertRecipientArkAddress(encoded, address, context) {
|
|
|
3695
3922
|
function assertTapTreeDerivesAddress(encoded, tapTree, address) {
|
|
3696
3923
|
let derived;
|
|
3697
3924
|
try {
|
|
3698
|
-
derived =
|
|
3925
|
+
derived = chunk5MLC2HU3_cjs.VtxoScript.decode(tapTree).pkScript;
|
|
3699
3926
|
} catch (e) {
|
|
3700
3927
|
throw new Error(
|
|
3701
3928
|
`Invalid tapTree for ${encoded}: ${e instanceof Error ? e.message : String(e)}`
|
|
@@ -3712,7 +3939,7 @@ function validateRecipients(recipients, dustAmount, context) {
|
|
|
3712
3939
|
for (const recipient of recipients) {
|
|
3713
3940
|
let address;
|
|
3714
3941
|
try {
|
|
3715
|
-
address =
|
|
3942
|
+
address = chunk5MLC2HU3_cjs.ArkAddress.decode(recipient.address);
|
|
3716
3943
|
} catch (e) {
|
|
3717
3944
|
throw new Error(`Invalid Arkade address: ${recipient.address}`);
|
|
3718
3945
|
}
|
|
@@ -3737,7 +3964,7 @@ function validateRecipients(recipients, dustAmount, context) {
|
|
|
3737
3964
|
|
|
3738
3965
|
// src/contracts/spendability.ts
|
|
3739
3966
|
function isContractGenericallySpendable(contract) {
|
|
3740
|
-
return
|
|
3967
|
+
return chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type)?.isGenericallySpendable?.(contract) === true;
|
|
3741
3968
|
}
|
|
3742
3969
|
function gatedContracts(contracts) {
|
|
3743
3970
|
const gated = /* @__PURE__ */ new Map();
|
|
@@ -3750,7 +3977,7 @@ function gateExclusion(gated) {
|
|
|
3750
3977
|
return (vtxo) => {
|
|
3751
3978
|
const type = vtxo.script === void 0 ? void 0 : gated.get(vtxo.script);
|
|
3752
3979
|
if (type === void 0) return void 0;
|
|
3753
|
-
if (!
|
|
3980
|
+
if (!chunkWIFL5QYZ_cjs.contractHandlers.has(type)) {
|
|
3754
3981
|
return `at ${vtxo.script} (contract type '${type}') has no handler registered in this build`;
|
|
3755
3982
|
}
|
|
3756
3983
|
return `at ${vtxo.script} (contract type '${type}') is not generically spendable`;
|
|
@@ -3786,7 +4013,7 @@ function selectPendingRecoveryOutpoints(contractsWithVtxos, signerSet, nowSecond
|
|
|
3786
4013
|
continue;
|
|
3787
4014
|
}
|
|
3788
4015
|
for (const v of vtxos) {
|
|
3789
|
-
if (!
|
|
4016
|
+
if (!chunk5MLC2HU3_cjs.hasTerminalSpend(v) && !v.isSwept && !v.isUnrolled) {
|
|
3790
4017
|
out.add(`${v.txid}:${v.vout}`);
|
|
3791
4018
|
}
|
|
3792
4019
|
}
|
|
@@ -3821,10 +4048,10 @@ function byValueDescending(vtxos) {
|
|
|
3821
4048
|
return [...vtxos].sort((a, b) => b.value - a.value);
|
|
3822
4049
|
}
|
|
3823
4050
|
async function fetchTimeHeight(wallet) {
|
|
3824
|
-
return
|
|
4051
|
+
return chunk5MLC2HU3_cjs.resolveTimeHeight(wallet.onchainProvider);
|
|
3825
4052
|
}
|
|
3826
4053
|
function canMigrateBySend(vtxo, now) {
|
|
3827
|
-
if (!
|
|
4054
|
+
if (!chunk5MLC2HU3_cjs.canSpendOffchain(vtxo, now)) return false;
|
|
3828
4055
|
return vtxo.expiresAt !== void 0 || vtxo.expiresAtHeight !== void 0;
|
|
3829
4056
|
}
|
|
3830
4057
|
function byExpiryAscending(vtxos, now) {
|
|
@@ -3832,7 +4059,7 @@ function byExpiryAscending(vtxos, now) {
|
|
|
3832
4059
|
if (vtxo.isSwept) return -Infinity;
|
|
3833
4060
|
if (vtxo.expiresAt !== void 0) return vtxo.expiresAt.getTime();
|
|
3834
4061
|
if (vtxo.expiresAtHeight !== void 0) {
|
|
3835
|
-
return
|
|
4062
|
+
return chunk5MLC2HU3_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
|
|
3836
4063
|
}
|
|
3837
4064
|
return Infinity;
|
|
3838
4065
|
};
|
|
@@ -3859,7 +4086,7 @@ function priceSettlementInputs(vtxos, estimator) {
|
|
|
3859
4086
|
const payable = [];
|
|
3860
4087
|
const net = /* @__PURE__ */ new Map();
|
|
3861
4088
|
for (const vtxo of vtxos) {
|
|
3862
|
-
const inputFee = estimator.evalOffchainInput(
|
|
4089
|
+
const inputFee = estimator.evalOffchainInput(chunk5MLC2HU3_cjs.toOffchainInputFeeParams(vtxo));
|
|
3863
4090
|
if (inputFee.satoshis >= vtxo.value) {
|
|
3864
4091
|
continue;
|
|
3865
4092
|
}
|
|
@@ -3885,7 +4112,7 @@ function deductOffchainOutputFee(subtotal, estimator, arkAddress) {
|
|
|
3885
4112
|
}
|
|
3886
4113
|
const outputFee = estimator.evalOffchainOutput({
|
|
3887
4114
|
amount: subtotal,
|
|
3888
|
-
script: base.hex.encode(
|
|
4115
|
+
script: base.hex.encode(chunk5MLC2HU3_cjs.ArkAddress.decode(arkAddress).pkScript)
|
|
3889
4116
|
});
|
|
3890
4117
|
return subtotal - BigInt(outputFee.satoshis);
|
|
3891
4118
|
}
|
|
@@ -3903,10 +4130,10 @@ var DEFAULT_SETTLEMENT_CONFIG = {
|
|
|
3903
4130
|
};
|
|
3904
4131
|
function getRecoverableVtxos(vtxos, dustAmount, now) {
|
|
3905
4132
|
return vtxos.filter((vtxo) => {
|
|
3906
|
-
if (
|
|
4133
|
+
if (chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now)) {
|
|
3907
4134
|
return true;
|
|
3908
4135
|
}
|
|
3909
|
-
if (
|
|
4136
|
+
if (chunk5MLC2HU3_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
|
|
3910
4137
|
return true;
|
|
3911
4138
|
}
|
|
3912
4139
|
return false;
|
|
@@ -3938,7 +4165,7 @@ function getRecoverableWithSubdust(vtxos, dustAmount, now) {
|
|
|
3938
4165
|
function isVtxoExpiringSoon(vtxo, thresholdMs) {
|
|
3939
4166
|
if (vtxo.isUnrolled) return false;
|
|
3940
4167
|
const realThresholdMs = thresholdMs <= 100 ? DEFAULT_THRESHOLD_MS : thresholdMs;
|
|
3941
|
-
const expiresAt =
|
|
4168
|
+
const expiresAt = chunk5MLC2HU3_cjs.normalizeVtxo(vtxo).expiresAt;
|
|
3942
4169
|
if (expiresAt === void 0) return false;
|
|
3943
4170
|
const now = Date.now();
|
|
3944
4171
|
const batchExpiry = expiresAt.getTime();
|
|
@@ -3949,7 +4176,7 @@ function getExpiringAndRecoverableVtxos(vtxos, thresholdMs, dustAmount, now) {
|
|
|
3949
4176
|
return vtxos.filter(
|
|
3950
4177
|
// The leading exclusion covers the `isSubdust` arm too, which is a value
|
|
3951
4178
|
// property and would otherwise re-admit an exited coin on its own.
|
|
3952
|
-
(vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) ||
|
|
4179
|
+
(vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) || chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount))
|
|
3953
4180
|
);
|
|
3954
4181
|
}
|
|
3955
4182
|
function isMigrationCapable(wallet) {
|
|
@@ -4548,11 +4775,11 @@ var VtxoManager = class _VtxoManager {
|
|
|
4548
4775
|
`Sweep not economical: output ${outputAmount} sats after ${fee} sats fee is below dust (${dustAmount} sats)`
|
|
4549
4776
|
);
|
|
4550
4777
|
}
|
|
4551
|
-
const tx = new
|
|
4778
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction();
|
|
4552
4779
|
for (const utxo of expiredUtxos) {
|
|
4553
|
-
const utxoScript =
|
|
4780
|
+
const utxoScript = chunk5MLC2HU3_cjs.VtxoScript.decode(utxo.tapTree);
|
|
4554
4781
|
const utxoExitLeaf = utxoScript.leaves.find(
|
|
4555
|
-
(leaf) =>
|
|
4782
|
+
(leaf) => chunk5MLC2HU3_cjs.CSVMultisigTapscript.isScriptValid(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(leaf)) === true
|
|
4556
4783
|
);
|
|
4557
4784
|
if (!utxoExitLeaf) {
|
|
4558
4785
|
throw new Error(
|
|
@@ -4567,7 +4794,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
4567
4794
|
amount: BigInt(utxo.value)
|
|
4568
4795
|
},
|
|
4569
4796
|
tapLeafScript: [utxoExitLeaf],
|
|
4570
|
-
sequence:
|
|
4797
|
+
sequence: chunk5MLC2HU3_cjs.getSequence(utxoExitLeaf)
|
|
4571
4798
|
});
|
|
4572
4799
|
}
|
|
4573
4800
|
tx.addOutputAddress(boardingAddress, outputAmount, this.getNetwork());
|
|
@@ -4810,8 +5037,8 @@ var VtxoManager = class _VtxoManager {
|
|
|
4810
5037
|
const cls = classifyAgainstSignerSet(serverPubKey, signerSet, nowSeconds);
|
|
4811
5038
|
if (cls.status === "CURRENT") continue;
|
|
4812
5039
|
const live = vtxos.filter((v) => !v.isUnrolled);
|
|
4813
|
-
const recoverable = live.filter((v) => v.isSwept && !
|
|
4814
|
-
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);
|
|
4815
5042
|
const value = spendable.reduce((sum, v) => sum + v.value, 0);
|
|
4816
5043
|
let recoverableCount = 0;
|
|
4817
5044
|
let recoverableValue = 0;
|
|
@@ -4824,7 +5051,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
4824
5051
|
awaitingSweepCount = spendable.length;
|
|
4825
5052
|
awaitingSweepValue = value;
|
|
4826
5053
|
for (const v of spendable) {
|
|
4827
|
-
const exp =
|
|
5054
|
+
const exp = chunk5MLC2HU3_cjs.toBatchExpiry(v);
|
|
4828
5055
|
if (exp !== void 0 && (nextSweepEta === void 0 || exp < nextSweepEta)) {
|
|
4829
5056
|
nextSweepEta = exp;
|
|
4830
5057
|
}
|
|
@@ -5085,7 +5312,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5085
5312
|
/** Decodes the boarding tapscript exit path to extract the CSV timelock. */
|
|
5086
5313
|
getBoardingTimelock() {
|
|
5087
5314
|
const wallet = this.getSweepWallet();
|
|
5088
|
-
const exitScript =
|
|
5315
|
+
const exitScript = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(
|
|
5089
5316
|
base.hex.decode(wallet.boardingTapscript.exitScript)
|
|
5090
5317
|
);
|
|
5091
5318
|
return exitScript.params.timelock;
|
|
@@ -5216,8 +5443,8 @@ var VtxoManager = class _VtxoManager {
|
|
|
5216
5443
|
* or doesn't carry the metadata.
|
|
5217
5444
|
*/
|
|
5218
5445
|
extractSpentOutpoint(error) {
|
|
5219
|
-
const ark =
|
|
5220
|
-
if (!
|
|
5446
|
+
const ark = chunk5MLC2HU3_cjs.maybeArkError(error);
|
|
5447
|
+
if (!chunk5MLC2HU3_cjs.isArkError(ark, chunk5MLC2HU3_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
|
|
5221
5448
|
const raw = ark.metadata?.vtxo_outpoint;
|
|
5222
5449
|
if (typeof raw !== "string") return void 0;
|
|
5223
5450
|
const [txid, voutStr] = raw.split(":");
|
|
@@ -5407,7 +5634,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5407
5634
|
if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
|
|
5408
5635
|
break;
|
|
5409
5636
|
}
|
|
5410
|
-
const inputFee = estimator.evalOffchainInput(
|
|
5637
|
+
const inputFee = estimator.evalOffchainInput(chunk5MLC2HU3_cjs.toOffchainInputFeeParams(v));
|
|
5411
5638
|
if (inputFee.satoshis >= v.value) {
|
|
5412
5639
|
continue;
|
|
5413
5640
|
}
|
|
@@ -5427,7 +5654,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5427
5654
|
const arkAddress = await this.wallet.getAddress();
|
|
5428
5655
|
const outputFee = estimator.evalOffchainOutput({
|
|
5429
5656
|
amount: totalAmount,
|
|
5430
|
-
script: base.hex.encode(
|
|
5657
|
+
script: base.hex.encode(chunk5MLC2HU3_cjs.ArkAddress.decode(arkAddress).pkScript)
|
|
5431
5658
|
});
|
|
5432
5659
|
totalAmount -= BigInt(outputFee.satoshis);
|
|
5433
5660
|
if (totalAmount < dustAmount) return;
|
|
@@ -5507,7 +5734,7 @@ var ArkNote = class _ArkNote {
|
|
|
5507
5734
|
this.value = value;
|
|
5508
5735
|
this.HRP = HRP;
|
|
5509
5736
|
const preimageHash = utils_js.sha256(this.preimage);
|
|
5510
|
-
this.vtxoScript = new
|
|
5737
|
+
this.vtxoScript = new chunk5MLC2HU3_cjs.VtxoScript([noteTapscript(preimageHash)]);
|
|
5511
5738
|
const leaf = this.vtxoScript.leaves[0];
|
|
5512
5739
|
this.txid = base.hex.encode(new Uint8Array(preimageHash).reverse());
|
|
5513
5740
|
this.tapTree = this.vtxoScript.encode();
|
|
@@ -5674,7 +5901,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
5674
5901
|
const privateKey = data.slice(1, 33);
|
|
5675
5902
|
const serverPubKey = data.slice(33, 65);
|
|
5676
5903
|
const sequence = new DataView(data.buffer, data.byteOffset + 65, 4).getUint32(0, false);
|
|
5677
|
-
const csvTimelock =
|
|
5904
|
+
const csvTimelock = chunk5MLC2HU3_cjs.sequenceToTimelock(sequence);
|
|
5678
5905
|
return new _ArkadeCash(privateKey, serverPubKey, csvTimelock, decoded.prefix);
|
|
5679
5906
|
}
|
|
5680
5907
|
toString() {
|
|
@@ -5682,7 +5909,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
5682
5909
|
data[0] = _ArkadeCash.Version;
|
|
5683
5910
|
data.set(this._privateKey, 1);
|
|
5684
5911
|
data.set(this._serverPubKey, 33);
|
|
5685
|
-
const sequence =
|
|
5912
|
+
const sequence = chunk5MLC2HU3_cjs.timelockToSequence(this.csvTimelock);
|
|
5686
5913
|
new DataView(data.buffer, data.byteOffset + 65, 4).setUint32(0, sequence, false);
|
|
5687
5914
|
const words = base.bech32m.toWords(data);
|
|
5688
5915
|
return base.bech32m.encode(this.hrp, words, 1023);
|
|
@@ -5691,7 +5918,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
5691
5918
|
return SingleKey.fromPrivateKey(this._privateKey);
|
|
5692
5919
|
}
|
|
5693
5920
|
get vtxoScript() {
|
|
5694
|
-
return new
|
|
5921
|
+
return new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
5695
5922
|
pubKey: this._publicKey,
|
|
5696
5923
|
serverPubKey: this._serverPubKey,
|
|
5697
5924
|
csvTimelock: this.csvTimelock
|
|
@@ -5952,7 +6179,7 @@ async function captureExitBranch(params) {
|
|
|
5952
6179
|
const nonCommitment = ordered.filter((c) => chainTxTypeToChainedExit(c.type) !== 1 /* Commitment */).map((c) => c.txid);
|
|
5953
6180
|
if (nonCommitment.length > 0) {
|
|
5954
6181
|
for (const psbt of await resolver.getVirtualTxs(nonCommitment)) {
|
|
5955
|
-
psbtByTxid.set(
|
|
6182
|
+
psbtByTxid.set(chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
5956
6183
|
}
|
|
5957
6184
|
}
|
|
5958
6185
|
}
|
|
@@ -5995,10 +6222,10 @@ var IndexerExitDataSource = class {
|
|
|
5995
6222
|
while (hasMore) {
|
|
5996
6223
|
const { chain: page, page: meta } = await this.indexer.getVtxoChain(
|
|
5997
6224
|
{ txid: vtxo.txid, vout: vtxo.vout },
|
|
5998
|
-
{ pageIndex, pageSize:
|
|
6225
|
+
{ pageIndex, pageSize: chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE }
|
|
5999
6226
|
);
|
|
6000
6227
|
chain.push(...page);
|
|
6001
|
-
hasMore = meta ? page.length ===
|
|
6228
|
+
hasMore = meta ? page.length === chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE : false;
|
|
6002
6229
|
pageIndex++;
|
|
6003
6230
|
}
|
|
6004
6231
|
return chain;
|
|
@@ -6010,12 +6237,12 @@ var IndexerExitDataSource = class {
|
|
|
6010
6237
|
while (hasMore) {
|
|
6011
6238
|
const { txs, page } = await this.indexer.getVirtualTxs(txids, {
|
|
6012
6239
|
pageIndex,
|
|
6013
|
-
pageSize:
|
|
6240
|
+
pageSize: chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE
|
|
6014
6241
|
});
|
|
6015
6242
|
for (const psbt of txs) {
|
|
6016
|
-
out.set(
|
|
6243
|
+
out.set(chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
6017
6244
|
}
|
|
6018
|
-
hasMore = page ? txs.length ===
|
|
6245
|
+
hasMore = page ? txs.length === chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE : false;
|
|
6019
6246
|
pageIndex++;
|
|
6020
6247
|
}
|
|
6021
6248
|
return out;
|
|
@@ -6036,7 +6263,7 @@ function chainedTxTypeToChainTxType(t) {
|
|
|
6036
6263
|
}
|
|
6037
6264
|
}
|
|
6038
6265
|
function psbtInputTxids(psbtBase64) {
|
|
6039
|
-
const tx =
|
|
6266
|
+
const tx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
|
|
6040
6267
|
const ids = [];
|
|
6041
6268
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
6042
6269
|
const txid = tx.getInput(i).txid;
|
|
@@ -6395,10 +6622,10 @@ async function resolveArkInfo(arkProvider, walletRepository) {
|
|
|
6395
6622
|
try {
|
|
6396
6623
|
info = await arkProvider.getInfo();
|
|
6397
6624
|
} catch (err) {
|
|
6398
|
-
if (!
|
|
6625
|
+
if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
|
|
6399
6626
|
const snapshot = await loadArkInfoSnapshot(walletRepository);
|
|
6400
6627
|
if (!snapshot) {
|
|
6401
|
-
throw new
|
|
6628
|
+
throw new chunk5MLC2HU3_cjs.ProviderUnavailableError(
|
|
6402
6629
|
"Arkade server info is unavailable and no cached snapshot exists",
|
|
6403
6630
|
{ cause: err }
|
|
6404
6631
|
);
|
|
@@ -6788,7 +7015,7 @@ function collectArkTxidsNeedingCreatedAt(vtxos) {
|
|
|
6788
7015
|
return [...txids];
|
|
6789
7016
|
}
|
|
6790
7017
|
async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnore, resolveTxCreatedAt) {
|
|
6791
|
-
const fromOldestVtxo = vtxos.map(
|
|
7018
|
+
const fromOldestVtxo = vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
|
|
6792
7019
|
const txidsNeedingCreatedAt = resolveTxCreatedAt ? collectArkTxidsNeedingCreatedAt(fromOldestVtxo) : [];
|
|
6793
7020
|
const resolvedCreatedAt = resolveTxCreatedAt && txidsNeedingCreatedAt.length > 0 ? await resolveTxCreatedAt(txidsNeedingCreatedAt) : /* @__PURE__ */ new Map();
|
|
6794
7021
|
const unmatchedSettledBoardingTxs = allBoardingTxs.filter(isSettledBoardingReceive).sort((a, b) => a.createdAt - b.createdAt);
|
|
@@ -6952,7 +7179,7 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
6952
7179
|
const virtualCoins = await this.wallet.getSpendableVtxos({
|
|
6953
7180
|
withRecoverable: false
|
|
6954
7181
|
});
|
|
6955
|
-
const controlAssetRef = params.controlAssetId ?
|
|
7182
|
+
const controlAssetRef = params.controlAssetId ? chunkGVHUHTRH_cjs.AssetRef.fromId(chunkGVHUHTRH_cjs.AssetId.fromString(params.controlAssetId)) : null;
|
|
6956
7183
|
const coinSelection = selectVirtualCoins(virtualCoins, Number(this.wallet.dustAmount));
|
|
6957
7184
|
let totalBtcSelected = 0n;
|
|
6958
7185
|
const assetChanges = /* @__PURE__ */ new Map();
|
|
@@ -6965,8 +7192,8 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
6965
7192
|
}
|
|
6966
7193
|
}
|
|
6967
7194
|
const groups = [];
|
|
6968
|
-
const issuedAssetOutput =
|
|
6969
|
-
const issuedAssetGroup =
|
|
7195
|
+
const issuedAssetOutput = chunkGVHUHTRH_cjs.AssetOutput.create(0, params.amount);
|
|
7196
|
+
const issuedAssetGroup = chunkGVHUHTRH_cjs.AssetGroup.create(
|
|
6970
7197
|
null,
|
|
6971
7198
|
controlAssetRef,
|
|
6972
7199
|
[],
|
|
@@ -6981,28 +7208,28 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
6981
7208
|
for (const [inputIndex, assets] of assetInputs) {
|
|
6982
7209
|
for (const asset of assets) {
|
|
6983
7210
|
if (asset.assetId !== assetId) continue;
|
|
6984
|
-
changeInputs.push(
|
|
7211
|
+
changeInputs.push(chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
6985
7212
|
}
|
|
6986
7213
|
}
|
|
6987
7214
|
groups.push(
|
|
6988
|
-
|
|
6989
|
-
|
|
7215
|
+
chunkGVHUHTRH_cjs.AssetGroup.create(
|
|
7216
|
+
chunkGVHUHTRH_cjs.AssetId.fromString(assetId),
|
|
6990
7217
|
null,
|
|
6991
7218
|
changeInputs,
|
|
6992
|
-
[
|
|
7219
|
+
[chunkGVHUHTRH_cjs.AssetOutput.create(0, amount)],
|
|
6993
7220
|
[]
|
|
6994
7221
|
)
|
|
6995
7222
|
);
|
|
6996
7223
|
}
|
|
6997
7224
|
}
|
|
6998
7225
|
const address = await this.wallet.getAddress();
|
|
6999
|
-
const outputAddress =
|
|
7226
|
+
const outputAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(address);
|
|
7000
7227
|
const outputs = [
|
|
7001
7228
|
{
|
|
7002
7229
|
script: outputAddress.pkScript,
|
|
7003
7230
|
amount: BigInt(totalBtcSelected)
|
|
7004
7231
|
},
|
|
7005
|
-
Extension.create([
|
|
7232
|
+
Extension.create([chunkGVHUHTRH_cjs.Packet.create(groups)]).txOut()
|
|
7006
7233
|
];
|
|
7007
7234
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(
|
|
7008
7235
|
coinSelection.inputs,
|
|
@@ -7010,7 +7237,7 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7010
7237
|
);
|
|
7011
7238
|
return {
|
|
7012
7239
|
arkTxId: arkTxid,
|
|
7013
|
-
assetId:
|
|
7240
|
+
assetId: chunkGVHUHTRH_cjs.AssetId.create(arkTxid, 0).toString()
|
|
7014
7241
|
};
|
|
7015
7242
|
}
|
|
7016
7243
|
/**
|
|
@@ -7082,16 +7309,16 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7082
7309
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7083
7310
|
for (const asset of assets) {
|
|
7084
7311
|
if (asset.assetId !== params.assetId) continue;
|
|
7085
|
-
reissueInputs.push(
|
|
7312
|
+
reissueInputs.push(chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7086
7313
|
}
|
|
7087
7314
|
}
|
|
7088
7315
|
const totalAssetAmount = assetToReissueAmount + params.amount;
|
|
7089
|
-
const reissueAssetIdObj =
|
|
7090
|
-
const reissueAssetGroup =
|
|
7316
|
+
const reissueAssetIdObj = chunkGVHUHTRH_cjs.AssetId.fromString(params.assetId);
|
|
7317
|
+
const reissueAssetGroup = chunkGVHUHTRH_cjs.AssetGroup.create(
|
|
7091
7318
|
reissueAssetIdObj,
|
|
7092
7319
|
null,
|
|
7093
7320
|
reissueInputs,
|
|
7094
|
-
[
|
|
7321
|
+
[chunkGVHUHTRH_cjs.AssetOutput.create(0, totalAssetAmount)],
|
|
7095
7322
|
[]
|
|
7096
7323
|
);
|
|
7097
7324
|
const groups = [reissueAssetGroup];
|
|
@@ -7100,27 +7327,27 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7100
7327
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7101
7328
|
for (const asset of assets) {
|
|
7102
7329
|
if (asset.assetId !== assetId) continue;
|
|
7103
|
-
changeInputs.push(
|
|
7330
|
+
changeInputs.push(chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7104
7331
|
}
|
|
7105
7332
|
}
|
|
7106
7333
|
groups.push(
|
|
7107
|
-
|
|
7108
|
-
|
|
7334
|
+
chunkGVHUHTRH_cjs.AssetGroup.create(
|
|
7335
|
+
chunkGVHUHTRH_cjs.AssetId.fromString(assetId),
|
|
7109
7336
|
null,
|
|
7110
7337
|
changeInputs,
|
|
7111
|
-
[
|
|
7338
|
+
[chunkGVHUHTRH_cjs.AssetOutput.create(0, amount)],
|
|
7112
7339
|
[]
|
|
7113
7340
|
)
|
|
7114
7341
|
);
|
|
7115
7342
|
}
|
|
7116
7343
|
const address = await this.wallet.getAddress();
|
|
7117
|
-
const outputAddress =
|
|
7344
|
+
const outputAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(address);
|
|
7118
7345
|
const outputs = [
|
|
7119
7346
|
{
|
|
7120
7347
|
script: outputAddress.pkScript,
|
|
7121
7348
|
amount: BigInt(totalBtcSelected)
|
|
7122
7349
|
},
|
|
7123
|
-
Extension.create([
|
|
7350
|
+
Extension.create([chunkGVHUHTRH_cjs.Packet.create(groups)]).txOut()
|
|
7124
7351
|
];
|
|
7125
7352
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
|
|
7126
7353
|
return arkTxid;
|
|
@@ -7187,27 +7414,27 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7187
7414
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7188
7415
|
for (const asset of assets) {
|
|
7189
7416
|
if (asset.assetId !== assetId) continue;
|
|
7190
|
-
changeInputs.push(
|
|
7417
|
+
changeInputs.push(chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7191
7418
|
}
|
|
7192
7419
|
}
|
|
7193
7420
|
groups.push(
|
|
7194
|
-
|
|
7195
|
-
|
|
7421
|
+
chunkGVHUHTRH_cjs.AssetGroup.create(
|
|
7422
|
+
chunkGVHUHTRH_cjs.AssetId.fromString(assetId),
|
|
7196
7423
|
null,
|
|
7197
7424
|
changeInputs,
|
|
7198
|
-
amount > 0n ? [
|
|
7425
|
+
amount > 0n ? [chunkGVHUHTRH_cjs.AssetOutput.create(0, amount)] : [],
|
|
7199
7426
|
[]
|
|
7200
7427
|
)
|
|
7201
7428
|
);
|
|
7202
7429
|
}
|
|
7203
7430
|
const address = await this.wallet.getAddress();
|
|
7204
|
-
const outputAddress =
|
|
7431
|
+
const outputAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(address);
|
|
7205
7432
|
const outputs = [
|
|
7206
7433
|
{
|
|
7207
7434
|
script: outputAddress.pkScript,
|
|
7208
7435
|
amount: BigInt(totalBtcSelected)
|
|
7209
7436
|
},
|
|
7210
|
-
Extension.create([
|
|
7437
|
+
Extension.create([chunkGVHUHTRH_cjs.Packet.create(groups)]).txOut()
|
|
7211
7438
|
];
|
|
7212
7439
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
|
|
7213
7440
|
return arkTxid;
|
|
@@ -7232,7 +7459,7 @@ function castMetadata(metadata) {
|
|
|
7232
7459
|
} else {
|
|
7233
7460
|
throw new Error("Invalid metadata value type");
|
|
7234
7461
|
}
|
|
7235
|
-
md.push(
|
|
7462
|
+
md.push(chunkGVHUHTRH_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
|
|
7236
7463
|
}
|
|
7237
7464
|
return md;
|
|
7238
7465
|
}
|
|
@@ -7253,10 +7480,10 @@ var DelegateManagerImpl = class {
|
|
|
7253
7480
|
if (vtxos.length === 0) {
|
|
7254
7481
|
return { delegated: [], failed: [] };
|
|
7255
7482
|
}
|
|
7256
|
-
const destinationScript =
|
|
7483
|
+
const destinationScript = chunk5MLC2HU3_cjs.ArkAddress.decode(destination).pkScript;
|
|
7257
7484
|
const arkInfo = await this.arkInfoProvider.getInfo();
|
|
7258
7485
|
const delegateInfo = await this.delegateProvider.getDelegateInfo();
|
|
7259
|
-
const eligible = vtxos.map(
|
|
7486
|
+
const eligible = vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo).filter(
|
|
7260
7487
|
(v) => isAnnotated(v) && findDelegateTapLeaf(v, delegateInfo.pubkey) !== void 0
|
|
7261
7488
|
);
|
|
7262
7489
|
if (eligible.length === 0) {
|
|
@@ -7285,11 +7512,11 @@ var DelegateManagerImpl = class {
|
|
|
7285
7512
|
const groupByExpiry = /* @__PURE__ */ new Map();
|
|
7286
7513
|
let recoverableVtxos = [];
|
|
7287
7514
|
for (const vtxo of eligible) {
|
|
7288
|
-
if (
|
|
7515
|
+
if (chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now)) {
|
|
7289
7516
|
recoverableVtxos.push(vtxo);
|
|
7290
7517
|
continue;
|
|
7291
7518
|
}
|
|
7292
|
-
const expiry =
|
|
7519
|
+
const expiry = chunk5MLC2HU3_cjs.toBatchExpiry(vtxo);
|
|
7293
7520
|
if (!expiry) continue;
|
|
7294
7521
|
const dayKey = getDayTimestamp(expiry);
|
|
7295
7522
|
groupByExpiry.set(dayKey, [...groupByExpiry.get(dayKey) ?? [], vtxo]);
|
|
@@ -7354,7 +7581,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7354
7581
|
}
|
|
7355
7582
|
if (!delegateAt) {
|
|
7356
7583
|
const now = { timestamp: /* @__PURE__ */ new Date() };
|
|
7357
|
-
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);
|
|
7358
7585
|
if (!expiryTimestamp || expiryTimestamp === Number.MAX_SAFE_INTEGER) {
|
|
7359
7586
|
delegateAt = new Date(Date.now() + 1 * 60 * 1e3);
|
|
7360
7587
|
} else {
|
|
@@ -7383,7 +7610,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7383
7610
|
let amount = 0n;
|
|
7384
7611
|
for (const coin of vtxos) {
|
|
7385
7612
|
const inputFee = estimator.evalOffchainInput({
|
|
7386
|
-
...
|
|
7613
|
+
...chunk5MLC2HU3_cjs.toOffchainInputFeeParams(coin),
|
|
7387
7614
|
type: "vtxo"
|
|
7388
7615
|
});
|
|
7389
7616
|
if (inputFee.value >= coin.value) {
|
|
@@ -7397,7 +7624,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7397
7624
|
const delegateFee = BigInt(Number(fee));
|
|
7398
7625
|
if (delegateFee > 0n) {
|
|
7399
7626
|
outputs.push({
|
|
7400
|
-
script:
|
|
7627
|
+
script: chunk5MLC2HU3_cjs.ArkAddress.decode(delegateAddress).pkScript,
|
|
7401
7628
|
amount: delegateFee
|
|
7402
7629
|
});
|
|
7403
7630
|
}
|
|
@@ -7430,10 +7657,10 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7430
7657
|
destinationScript
|
|
7431
7658
|
);
|
|
7432
7659
|
const forfeitOutputScript = btcSigner.OutScript.encode(
|
|
7433
|
-
btcSigner.Address(
|
|
7660
|
+
btcSigner.Address(chunk5MLC2HU3_cjs.getNetwork(network)).decode(forfeitAddress)
|
|
7434
7661
|
);
|
|
7435
7662
|
const forfeits = await Promise.all(
|
|
7436
|
-
vtxos.filter((v) => !
|
|
7663
|
+
vtxos.filter((v) => !chunk5MLC2HU3_cjs.canRecoverOnchain(v, { timestamp: /* @__PURE__ */ new Date() })).map(async (coin) => {
|
|
7437
7664
|
const forfeit = await makeDelegateForfeitTx(
|
|
7438
7665
|
coin,
|
|
7439
7666
|
dust,
|
|
@@ -7458,7 +7685,7 @@ async function makeDelegateForfeitTx(input, connectorAmount, delegatePubkey, for
|
|
|
7458
7685
|
index: input.vout,
|
|
7459
7686
|
witnessUtxo: {
|
|
7460
7687
|
amount: BigInt(input.value),
|
|
7461
|
-
script:
|
|
7688
|
+
script: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
7462
7689
|
},
|
|
7463
7690
|
sighashType: btcSigner.SigHash.ALL_ANYONECANPAY,
|
|
7464
7691
|
tapLeafScript: [delegateTapLeaf]
|
|
@@ -7516,7 +7743,7 @@ async function makeSignedDelegateIntent(identity, coins, outputs, onchainOutputs
|
|
|
7516
7743
|
expire_at: 0,
|
|
7517
7744
|
cosigners_public_keys: cosignerPubKeys
|
|
7518
7745
|
};
|
|
7519
|
-
const proof =
|
|
7746
|
+
const proof = chunk5MLC2HU3_cjs.Intent.create(message, coins, outputs);
|
|
7520
7747
|
const signedProof = await identity.sign(proof);
|
|
7521
7748
|
return {
|
|
7522
7749
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -7534,10 +7761,10 @@ function getDayTimestamp(timestamp) {
|
|
|
7534
7761
|
function findDelegateTapLeaf(vtxo, delegatePubkey) {
|
|
7535
7762
|
if (!vtxo.tapTree) return void 0;
|
|
7536
7763
|
const pk = delegatePubkey.length === 66 ? delegatePubkey.slice(2) : delegatePubkey;
|
|
7537
|
-
const vtxoScript =
|
|
7764
|
+
const vtxoScript = chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree);
|
|
7538
7765
|
return vtxoScript.leaves.find((tapLeaf) => {
|
|
7539
|
-
const arkTapscript =
|
|
7540
|
-
if (!
|
|
7766
|
+
const arkTapscript = chunk5MLC2HU3_cjs.decodeTapscript(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(tapLeaf));
|
|
7767
|
+
if (!chunk5MLC2HU3_cjs.MultisigTapscript.is(arkTapscript)) return false;
|
|
7541
7768
|
return arkTapscript.params.pubkeys.map(base.hex.encode).includes(pk);
|
|
7542
7769
|
});
|
|
7543
7770
|
}
|
|
@@ -7818,7 +8045,7 @@ function createManagedConnection(dbName, version, initDatabase2) {
|
|
|
7818
8045
|
};
|
|
7819
8046
|
}
|
|
7820
8047
|
function scriptFromArkAddress(address) {
|
|
7821
|
-
return base.hex.encode(
|
|
8048
|
+
return base.hex.encode(chunk5MLC2HU3_cjs.ArkAddress.decode(address).pkScript);
|
|
7822
8049
|
}
|
|
7823
8050
|
|
|
7824
8051
|
// src/repositories/indexedDB/schema.ts
|
|
@@ -8313,7 +8540,7 @@ function validateVtxosForScript(vtxos, script, context) {
|
|
|
8313
8540
|
}
|
|
8314
8541
|
async function getVtxosForContract(repo, contract) {
|
|
8315
8542
|
const vtxos = repo.getVtxosForScript ? await repo.getVtxosForScript(contract.script) : filterVtxosForScript(await repo.getVtxos(contract.address), contract.script);
|
|
8316
|
-
return vtxos.map(
|
|
8543
|
+
return vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
|
|
8317
8544
|
}
|
|
8318
8545
|
async function saveVtxosForContract(repo, contract, vtxos) {
|
|
8319
8546
|
if (repo.saveVtxosForScript) {
|
|
@@ -8455,7 +8682,7 @@ function decodeArkContract(encoded) {
|
|
|
8455
8682
|
}
|
|
8456
8683
|
function contractFromArkContract(encoded, options = {}) {
|
|
8457
8684
|
const parsed = decodeArkContract(encoded);
|
|
8458
|
-
const handler =
|
|
8685
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(parsed.type);
|
|
8459
8686
|
if (!handler) {
|
|
8460
8687
|
throw new Error(`No handler registered for contract type '${parsed.type}'`);
|
|
8461
8688
|
}
|
|
@@ -8469,9 +8696,9 @@ function contractFromArkContract(encoded, options = {}) {
|
|
|
8469
8696
|
metadata: options.metadata
|
|
8470
8697
|
};
|
|
8471
8698
|
}
|
|
8472
|
-
function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix =
|
|
8699
|
+
function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunk5MLC2HU3_cjs.DEFAULT_NETWORK.hrp, options = {}) {
|
|
8473
8700
|
const parsed = decodeArkContract(encoded);
|
|
8474
|
-
const handler =
|
|
8701
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.getOrThrow(parsed.type);
|
|
8475
8702
|
const params = parsed.data;
|
|
8476
8703
|
const vtxoScript = handler.createScript(params);
|
|
8477
8704
|
return {
|
|
@@ -8725,9 +8952,9 @@ var ContractWatcher = class {
|
|
|
8725
8952
|
this.connectionState = "connected";
|
|
8726
8953
|
this.reconnectAttempts = 0;
|
|
8727
8954
|
this.listenLoop().catch((e) => {
|
|
8728
|
-
if (
|
|
8955
|
+
if (chunk5MLC2HU3_cjs.isEventSourceError(e)) {
|
|
8729
8956
|
console.debug("ContractWatcher subscription disconnected; reconnecting");
|
|
8730
|
-
} else if (!
|
|
8957
|
+
} else if (!chunk5MLC2HU3_cjs.isEventSourceUnavailableError(e)) {
|
|
8731
8958
|
console.error(e);
|
|
8732
8959
|
}
|
|
8733
8960
|
this.connectionState = "disconnected";
|
|
@@ -8739,7 +8966,7 @@ var ContractWatcher = class {
|
|
|
8739
8966
|
this.scheduleReconnect();
|
|
8740
8967
|
});
|
|
8741
8968
|
} catch (error) {
|
|
8742
|
-
if (!
|
|
8969
|
+
if (!chunk5MLC2HU3_cjs.isEventSourceUnavailableError(error)) {
|
|
8743
8970
|
console.error("ContractWatcher connection failed:", error);
|
|
8744
8971
|
}
|
|
8745
8972
|
this.connectionState = "disconnected";
|
|
@@ -8765,7 +8992,7 @@ var ContractWatcher = class {
|
|
|
8765
8992
|
* slower; what it loses is push latency.
|
|
8766
8993
|
*/
|
|
8767
8994
|
reportEventSourceUnavailable(error) {
|
|
8768
|
-
if (!
|
|
8995
|
+
if (!chunk5MLC2HU3_cjs.isEventSourceUnavailableError(error)) return false;
|
|
8769
8996
|
if (!this.eventSourceReported) {
|
|
8770
8997
|
this.eventSourceReported = true;
|
|
8771
8998
|
console.warn(
|
|
@@ -8981,14 +9208,14 @@ var ContractWatcher = class {
|
|
|
8981
9208
|
const timestamp = Date.now();
|
|
8982
9209
|
if (update.newVtxos?.length) {
|
|
8983
9210
|
this.processSubscriptionVtxos(
|
|
8984
|
-
update.newVtxos.map(
|
|
9211
|
+
update.newVtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo),
|
|
8985
9212
|
"vtxo_received",
|
|
8986
9213
|
timestamp
|
|
8987
9214
|
);
|
|
8988
9215
|
}
|
|
8989
9216
|
if (update.spentVtxos?.length) {
|
|
8990
9217
|
this.processSubscriptionVtxos(
|
|
8991
|
-
update.spentVtxos.map(
|
|
9218
|
+
update.spentVtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo),
|
|
8992
9219
|
"vtxo_spent",
|
|
8993
9220
|
timestamp
|
|
8994
9221
|
);
|
|
@@ -9083,7 +9310,7 @@ var NON_TERMINAL_INTENT_STATES = ALL_INTENT_STATES.filter(
|
|
|
9083
9310
|
(s) => !isTerminalIntentState(s)
|
|
9084
9311
|
);
|
|
9085
9312
|
function isConsumed(vtxo) {
|
|
9086
|
-
return vtxo !== void 0 &&
|
|
9313
|
+
return vtxo !== void 0 && chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo);
|
|
9087
9314
|
}
|
|
9088
9315
|
async function classifyIntent(intent, vtxosByOutpoint, now) {
|
|
9089
9316
|
if (isTerminalIntentState(intent.state)) return void 0;
|
|
@@ -9126,7 +9353,7 @@ async function reconcileIntents(deps) {
|
|
|
9126
9353
|
let vtxosByOutpoint = /* @__PURE__ */ new Map();
|
|
9127
9354
|
if (outpoints.length > 0) {
|
|
9128
9355
|
try {
|
|
9129
|
-
const { vtxos } = await
|
|
9356
|
+
const { vtxos } = await chunk5MLC2HU3_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
|
|
9130
9357
|
vtxosByOutpoint = new Map(vtxos.map((v) => [outpointKey(v), v]));
|
|
9131
9358
|
} catch (e) {
|
|
9132
9359
|
console.error("reconcileIntents: failed to fetch input VTXO state", e);
|
|
@@ -9300,7 +9527,7 @@ var ContractManager = class _ContractManager {
|
|
|
9300
9527
|
await this.reconcileWatched();
|
|
9301
9528
|
this.markSyncOnline();
|
|
9302
9529
|
} catch (err) {
|
|
9303
|
-
if (!
|
|
9530
|
+
if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
|
|
9304
9531
|
this.markSyncDegraded(err);
|
|
9305
9532
|
}
|
|
9306
9533
|
this.initialized = true;
|
|
@@ -9432,7 +9659,7 @@ var ContractManager = class _ContractManager {
|
|
|
9432
9659
|
const from = Math.max(0, watermark - lookAhead.size);
|
|
9433
9660
|
const to = watermark + lookAhead.size;
|
|
9434
9661
|
const deps = lookAhead.candidateDeps();
|
|
9435
|
-
const handlers =
|
|
9662
|
+
const handlers = chunkWIFL5QYZ_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkWIFL5QYZ_cjs.contractHandlers.get(t)).filter(hasCandidates);
|
|
9436
9663
|
const band = /* @__PURE__ */ new Map();
|
|
9437
9664
|
for (let index = from; index <= to; index++) {
|
|
9438
9665
|
const descriptor = lookAhead.materialize(index);
|
|
@@ -9443,7 +9670,7 @@ var ContractManager = class _ContractManager {
|
|
|
9443
9670
|
index,
|
|
9444
9671
|
params: {
|
|
9445
9672
|
...candidate,
|
|
9446
|
-
...
|
|
9673
|
+
...chunkWIFL5QYZ_cjs.speculativeReceiveMetadata(descriptor)
|
|
9447
9674
|
}
|
|
9448
9675
|
});
|
|
9449
9676
|
}
|
|
@@ -9505,7 +9732,7 @@ var ContractManager = class _ContractManager {
|
|
|
9505
9732
|
});
|
|
9506
9733
|
for (const entry of pending) entry.catchUpPending = false;
|
|
9507
9734
|
} catch (err) {
|
|
9508
|
-
if (!
|
|
9735
|
+
if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
|
|
9509
9736
|
this.markSyncDegraded(err);
|
|
9510
9737
|
}
|
|
9511
9738
|
}
|
|
@@ -9555,7 +9782,7 @@ var ContractManager = class _ContractManager {
|
|
|
9555
9782
|
await this.fetchContractVxosFromIndexer([contract]);
|
|
9556
9783
|
this.markSyncOnline();
|
|
9557
9784
|
} catch (err) {
|
|
9558
|
-
if (!
|
|
9785
|
+
if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
|
|
9559
9786
|
this.markSyncDegraded(err);
|
|
9560
9787
|
}
|
|
9561
9788
|
await this.watcher.addContract(contract);
|
|
@@ -9592,7 +9819,7 @@ var ContractManager = class _ContractManager {
|
|
|
9592
9819
|
return result;
|
|
9593
9820
|
}
|
|
9594
9821
|
async upsertContractRow(params) {
|
|
9595
|
-
const handler =
|
|
9822
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(params.type);
|
|
9596
9823
|
if (!handler) {
|
|
9597
9824
|
throw new Error(`No handler registered for contract type '${params.type}'`);
|
|
9598
9825
|
}
|
|
@@ -9692,7 +9919,7 @@ var ContractManager = class _ContractManager {
|
|
|
9692
9919
|
`scanContracts: batchSize must be a positive integer (got ${String(opts.batchSize)})`
|
|
9693
9920
|
);
|
|
9694
9921
|
}
|
|
9695
|
-
const registered =
|
|
9922
|
+
const registered = chunkWIFL5QYZ_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkWIFL5QYZ_cjs.contractHandlers.get(t)).filter(isDiscoverable);
|
|
9696
9923
|
const discoverables = [
|
|
9697
9924
|
...registered.filter((h) => h.type === "boarding"),
|
|
9698
9925
|
...registered.filter((h) => h.type !== "boarding")
|
|
@@ -9827,7 +10054,7 @@ var ContractManager = class _ContractManager {
|
|
|
9827
10054
|
await this.syncContracts({ contracts, pageSize });
|
|
9828
10055
|
this.markSyncOnline();
|
|
9829
10056
|
} catch (err) {
|
|
9830
|
-
if (!
|
|
10057
|
+
if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
|
|
9831
10058
|
this.markSyncDegraded(err);
|
|
9832
10059
|
}
|
|
9833
10060
|
const vtxos = await this.getVtxosForContracts(contracts);
|
|
@@ -9848,7 +10075,7 @@ var ContractManager = class _ContractManager {
|
|
|
9848
10075
|
}
|
|
9849
10076
|
const tapscriptCache = tapscripts ?? /* @__PURE__ */ new Map();
|
|
9850
10077
|
return vtxos.map(
|
|
9851
|
-
(vtxo) => extendVirtualCoinForContract(
|
|
10078
|
+
(vtxo) => extendVirtualCoinForContract(chunk5MLC2HU3_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
|
|
9852
10079
|
);
|
|
9853
10080
|
}
|
|
9854
10081
|
/** @inheritdoc */
|
|
@@ -9892,14 +10119,14 @@ var ContractManager = class _ContractManager {
|
|
|
9892
10119
|
const byScript = new Map(contracts.map((contract) => [contract.script, contract]));
|
|
9893
10120
|
const asking = vtxos.filter((vtxo) => {
|
|
9894
10121
|
const contract = byScript.get(vtxo.script);
|
|
9895
|
-
return contract !== void 0 &&
|
|
10122
|
+
return contract !== void 0 && chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type)?.assertSpendableNow !== void 0;
|
|
9896
10123
|
});
|
|
9897
10124
|
if (asking.length === 0) return refused;
|
|
9898
10125
|
const tip = await this.currentChainTip();
|
|
9899
10126
|
const walletKey = await walletPubKey?.();
|
|
9900
10127
|
for (const vtxo of asking) {
|
|
9901
10128
|
const contract = byScript.get(vtxo.script);
|
|
9902
|
-
const handler =
|
|
10129
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
9903
10130
|
if (!handler?.assertSpendableNow) continue;
|
|
9904
10131
|
const context = {
|
|
9905
10132
|
collaborative: true,
|
|
@@ -9914,7 +10141,7 @@ var ContractManager = class _ContractManager {
|
|
|
9914
10141
|
// the next handler to answer a CSV question would meet a
|
|
9915
10142
|
// TypeError instead of a `false`. Carry the coin only when it
|
|
9916
10143
|
// really is one.
|
|
9917
|
-
vtxo:
|
|
10144
|
+
vtxo: chunk5MLC2HU3_cjs.isVirtualCoin(vtxo) && "status" in vtxo ? vtxo : void 0
|
|
9918
10145
|
};
|
|
9919
10146
|
try {
|
|
9920
10147
|
await handler.assertSpendableNow(
|
|
@@ -10070,7 +10297,7 @@ var ContractManager = class _ContractManager {
|
|
|
10070
10297
|
const { contractScript, collaborative = true, walletPubKey, vtxo } = options;
|
|
10071
10298
|
const [contract] = await this.getContracts({ script: contractScript });
|
|
10072
10299
|
if (!contract) return [];
|
|
10073
|
-
const handler =
|
|
10300
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
10074
10301
|
if (!handler) return [];
|
|
10075
10302
|
const script = handler.createScript(contract.params);
|
|
10076
10303
|
const tip = await this.currentChainTip();
|
|
@@ -10098,7 +10325,7 @@ var ContractManager = class _ContractManager {
|
|
|
10098
10325
|
const { contractScript, collaborative = true, walletPubKey } = options;
|
|
10099
10326
|
const [contract] = await this.getContracts({ script: contractScript });
|
|
10100
10327
|
if (!contract) return [];
|
|
10101
|
-
const handler =
|
|
10328
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
10102
10329
|
if (!handler) return [];
|
|
10103
10330
|
const script = handler.createScript(contract.params);
|
|
10104
10331
|
const context = {
|
|
@@ -10154,7 +10381,7 @@ var ContractManager = class _ContractManager {
|
|
|
10154
10381
|
}
|
|
10155
10382
|
async refreshOutpoints(outpoints) {
|
|
10156
10383
|
if (outpoints.length === 0) return;
|
|
10157
|
-
const { vtxos } = await
|
|
10384
|
+
const { vtxos } = await chunk5MLC2HU3_cjs.getNormalizedVtxos(this.config.indexerProvider, {
|
|
10158
10385
|
outpoints
|
|
10159
10386
|
});
|
|
10160
10387
|
if (vtxos.length === 0) return;
|
|
@@ -10233,7 +10460,7 @@ var ContractManager = class _ContractManager {
|
|
|
10233
10460
|
break;
|
|
10234
10461
|
}
|
|
10235
10462
|
} catch (err) {
|
|
10236
|
-
if (!
|
|
10463
|
+
if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
|
|
10237
10464
|
this.markSyncDegraded(err);
|
|
10238
10465
|
}
|
|
10239
10466
|
this.emitEvent(event);
|
|
@@ -10312,7 +10539,7 @@ var ContractManager = class _ContractManager {
|
|
|
10312
10539
|
*/
|
|
10313
10540
|
async reconcilePendingFrontier(contracts) {
|
|
10314
10541
|
const scriptToContract = new Map(contracts.map((c) => [c.script, c]));
|
|
10315
|
-
const vtxos = await
|
|
10542
|
+
const vtxos = await chunk5MLC2HU3_cjs.getAllNormalizedVtxos(
|
|
10316
10543
|
this.config.indexerProvider,
|
|
10317
10544
|
contracts.map((c) => c.script),
|
|
10318
10545
|
{ pendingOnly: true }
|
|
@@ -10395,7 +10622,7 @@ var ContractManager = class _ContractManager {
|
|
|
10395
10622
|
}
|
|
10396
10623
|
return result;
|
|
10397
10624
|
}
|
|
10398
|
-
async fetchContractVtxosBulk(contracts, pageSize =
|
|
10625
|
+
async fetchContractVtxosBulk(contracts, pageSize = chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
|
|
10399
10626
|
if (contracts.length === 0) {
|
|
10400
10627
|
return { vtxosByScript: /* @__PURE__ */ new Map(), promoted: /* @__PURE__ */ new Map() };
|
|
10401
10628
|
}
|
|
@@ -10411,7 +10638,7 @@ var ContractManager = class _ContractManager {
|
|
|
10411
10638
|
before: syncWindow.before
|
|
10412
10639
|
}
|
|
10413
10640
|
} : {};
|
|
10414
|
-
const vtxos = await
|
|
10641
|
+
const vtxos = await chunk5MLC2HU3_cjs.getAllNormalizedVtxos(
|
|
10415
10642
|
this.config.indexerProvider,
|
|
10416
10643
|
contracts.map((c) => c.script),
|
|
10417
10644
|
{ ...windowOpts, pageSize }
|
|
@@ -10556,7 +10783,7 @@ var deserializeTapLeaf = (t) => {
|
|
|
10556
10783
|
const s = base.hex.decode(t.s);
|
|
10557
10784
|
return [cb, s];
|
|
10558
10785
|
};
|
|
10559
|
-
var deserializeVtxo = (o) =>
|
|
10786
|
+
var deserializeVtxo = (o) => chunk5MLC2HU3_cjs.normalizeVtxo({
|
|
10560
10787
|
...o,
|
|
10561
10788
|
createdAt: new Date(o.createdAt),
|
|
10562
10789
|
tapTree: base.hex.decode(o.tapTree),
|
|
@@ -11379,7 +11606,7 @@ var HDDescriptorProvider = class _HDDescriptorProvider {
|
|
|
11379
11606
|
*/
|
|
11380
11607
|
materializeDescriptorAt(index) {
|
|
11381
11608
|
const descriptor = this.identity.descriptor;
|
|
11382
|
-
const network =
|
|
11609
|
+
const network = chunkWIFL5QYZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
11383
11610
|
const expansion = descriptorsScure.expand({ descriptor, network, index });
|
|
11384
11611
|
const keyInfo = expansion.expansionMap?.["@0"];
|
|
11385
11612
|
if (!keyInfo?.keyExpression) {
|
|
@@ -11527,7 +11754,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
|
|
|
11527
11754
|
const provider = await resolveDescriptorProvider(config, setup.walletRepository);
|
|
11528
11755
|
if (!provider) return void 0;
|
|
11529
11756
|
const allowSilentFallback = (config.walletMode ?? "auto") === "auto";
|
|
11530
|
-
const expectedContractType = setup.offchainTapscript instanceof
|
|
11757
|
+
const expectedContractType = setup.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? "delegate" : "default";
|
|
11531
11758
|
const factoryOpts = {
|
|
11532
11759
|
walletRepository: setup.walletRepository,
|
|
11533
11760
|
contractRepository: setup.contractRepository,
|
|
@@ -11728,7 +11955,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
|
|
|
11728
11955
|
};
|
|
11729
11956
|
function deriveLeafPubkey(descriptor) {
|
|
11730
11957
|
try {
|
|
11731
|
-
return
|
|
11958
|
+
return chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
11732
11959
|
} catch (e) {
|
|
11733
11960
|
throw new NonRangeableDescriptorError(
|
|
11734
11961
|
"Cannot derive leaf pubkey: descriptor is not a materialized, parsable tr(...) shape.",
|
|
@@ -11740,7 +11967,7 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
11740
11967
|
const pubKey = deriveLeafPubkey(descriptor);
|
|
11741
11968
|
const tapscript = rebuildTapscript(current, pubKey);
|
|
11742
11969
|
const serverPubKey = tapscript.options.serverPubKey;
|
|
11743
|
-
const csvTimelock =
|
|
11970
|
+
const csvTimelock = chunk5MLC2HU3_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
|
|
11744
11971
|
const base$1 = {
|
|
11745
11972
|
script: base.hex.encode(tapscript.pkScript),
|
|
11746
11973
|
address: tapscript.address(hrp, serverPubKey).encode(),
|
|
@@ -11751,11 +11978,11 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
11751
11978
|
// index-0 key. Without it, spends produce unsigned PSBTs that the
|
|
11752
11979
|
// server rejects with `INVALID_PSBT_INPUT (5): missing tapscript spend sig`.
|
|
11753
11980
|
metadata: {
|
|
11754
|
-
...tagSource && { source:
|
|
11981
|
+
...tagSource && { source: chunkWIFL5QYZ_cjs.WALLET_RECEIVE_SOURCE },
|
|
11755
11982
|
signingDescriptor: descriptor
|
|
11756
11983
|
}
|
|
11757
11984
|
};
|
|
11758
|
-
const params = tapscript instanceof
|
|
11985
|
+
const params = tapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? {
|
|
11759
11986
|
...base$1,
|
|
11760
11987
|
type: "delegate",
|
|
11761
11988
|
params: {
|
|
@@ -11776,10 +12003,10 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
11776
12003
|
return { tapscript, params };
|
|
11777
12004
|
}
|
|
11778
12005
|
function rebuildTapscript(current, pubKey) {
|
|
11779
|
-
if (current instanceof
|
|
11780
|
-
return new
|
|
12006
|
+
if (current instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script) {
|
|
12007
|
+
return new chunkWIFL5QYZ_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
|
|
11781
12008
|
}
|
|
11782
|
-
return new
|
|
12009
|
+
return new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
|
|
11783
12010
|
}
|
|
11784
12011
|
async function pickActiveReceive(contractRepository, serverPubKey, expectedType) {
|
|
11785
12012
|
const candidates = await contractRepository.getContracts({
|
|
@@ -11788,7 +12015,7 @@ async function pickActiveReceive(contractRepository, serverPubKey, expectedType)
|
|
|
11788
12015
|
});
|
|
11789
12016
|
const serverPubKeyHex = base.hex.encode(serverPubKey);
|
|
11790
12017
|
const matching = candidates.filter(
|
|
11791
|
-
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source ===
|
|
12018
|
+
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkWIFL5QYZ_cjs.WALLET_RECEIVE_SOURCE
|
|
11792
12019
|
).sort((a, b) => {
|
|
11793
12020
|
if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
|
|
11794
12021
|
return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
|
|
@@ -11844,7 +12071,7 @@ function computeOffchainBalance(vtxos, caps) {
|
|
|
11844
12071
|
}
|
|
11845
12072
|
};
|
|
11846
12073
|
for (const vtxo of vtxos) {
|
|
11847
|
-
if (
|
|
12074
|
+
if (chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo)) continue;
|
|
11848
12075
|
addAssets(owned, vtxo);
|
|
11849
12076
|
if (vtxo.isUnrolled) {
|
|
11850
12077
|
unrolled += vtxo.value;
|
|
@@ -11854,11 +12081,11 @@ function computeOffchainBalance(vtxos, caps) {
|
|
|
11854
12081
|
pendingRecovery += vtxo.value;
|
|
11855
12082
|
continue;
|
|
11856
12083
|
}
|
|
11857
|
-
if (
|
|
12084
|
+
if (chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now)) {
|
|
11858
12085
|
recoverable += vtxo.value;
|
|
11859
12086
|
continue;
|
|
11860
12087
|
}
|
|
11861
|
-
if (!
|
|
12088
|
+
if (!chunk5MLC2HU3_cjs.canSpendOffchain(vtxo, now)) continue;
|
|
11862
12089
|
if (vtxo.isPreconfirmed) {
|
|
11863
12090
|
preconfirmed += vtxo.value;
|
|
11864
12091
|
} else {
|
|
@@ -12028,12 +12255,12 @@ var InputSignerRouter = class {
|
|
|
12028
12255
|
};
|
|
12029
12256
|
|
|
12030
12257
|
// src/wallet/wallet.ts
|
|
12031
|
-
var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl ||
|
|
12258
|
+
var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunk5MLC2HU3_cjs.DEFAULT_ARKADE_SERVER_URL;
|
|
12032
12259
|
function intentProofJobs(coins) {
|
|
12033
12260
|
if (coins.length === 0) return [];
|
|
12034
12261
|
const coinJobs = coins.map((coin, i) => ({
|
|
12035
12262
|
index: i + 1,
|
|
12036
|
-
lookupScript:
|
|
12263
|
+
lookupScript: chunk5MLC2HU3_cjs.VtxoScript.decode(coin.tapTree).pkScript
|
|
12037
12264
|
}));
|
|
12038
12265
|
return [{ index: 0, lookupScript: coinJobs[0].lookupScript }, ...coinJobs];
|
|
12039
12266
|
}
|
|
@@ -12065,7 +12292,7 @@ function dedupeTimelocks(timelocks) {
|
|
|
12065
12292
|
const seen = /* @__PURE__ */ new Set();
|
|
12066
12293
|
const deduped = [];
|
|
12067
12294
|
for (const timelock of timelocks) {
|
|
12068
|
-
const sequence =
|
|
12295
|
+
const sequence = chunk5MLC2HU3_cjs.timelockToSequence(timelock).toString();
|
|
12069
12296
|
if (seen.has(sequence)) continue;
|
|
12070
12297
|
seen.add(sequence);
|
|
12071
12298
|
deduped.push(timelock);
|
|
@@ -12082,7 +12309,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
|
|
|
12082
12309
|
state: "active"
|
|
12083
12310
|
});
|
|
12084
12311
|
const newest = candidates.filter(
|
|
12085
|
-
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source ===
|
|
12312
|
+
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkWIFL5QYZ_cjs.WALLET_RECEIVE_SOURCE
|
|
12086
12313
|
).sort((a, b) => {
|
|
12087
12314
|
if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
|
|
12088
12315
|
return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
|
|
@@ -12090,7 +12317,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
|
|
|
12090
12317
|
if (!newest?.params.pubKey) return baseline;
|
|
12091
12318
|
try {
|
|
12092
12319
|
const pubKey = base.hex.decode(newest.params.pubKey);
|
|
12093
|
-
return new
|
|
12320
|
+
return new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
|
|
12094
12321
|
} catch (e) {
|
|
12095
12322
|
console.warn("Skipping malformed boarding contract at boot", newest.script, e);
|
|
12096
12323
|
return baseline;
|
|
@@ -12109,10 +12336,10 @@ function filterSnapshotVtxos(snapshot, filter, pendingSpendOutpoints) {
|
|
|
12109
12336
|
if (vtxo.isUnrolled) {
|
|
12110
12337
|
return !!f.withUnrolled;
|
|
12111
12338
|
}
|
|
12112
|
-
if (
|
|
12339
|
+
if (chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo)) {
|
|
12113
12340
|
return false;
|
|
12114
12341
|
}
|
|
12115
|
-
if (!f.withRecoverable &&
|
|
12342
|
+
if (!f.withRecoverable && chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now)) {
|
|
12116
12343
|
return false;
|
|
12117
12344
|
}
|
|
12118
12345
|
return true;
|
|
@@ -12452,7 +12679,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12452
12679
|
*/
|
|
12453
12680
|
static async setupWalletConfig(config, pubKey) {
|
|
12454
12681
|
const arkadeServerUrl = getArkadeServerUrl(config);
|
|
12455
|
-
const arkProvider = config.arkProvider || new
|
|
12682
|
+
const arkProvider = config.arkProvider || new chunk5MLC2HU3_cjs.RestArkProvider(arkadeServerUrl);
|
|
12456
12683
|
let indexerProvider = config.indexerProvider;
|
|
12457
12684
|
if (!indexerProvider) {
|
|
12458
12685
|
let indexerUrl = config.indexerUrl;
|
|
@@ -12469,7 +12696,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12469
12696
|
indexerUrl = arkadeServerUrl;
|
|
12470
12697
|
}
|
|
12471
12698
|
}
|
|
12472
|
-
indexerProvider = new
|
|
12699
|
+
indexerProvider = new chunkGVHUHTRH_cjs.RestIndexerProvider(indexerUrl);
|
|
12473
12700
|
}
|
|
12474
12701
|
const walletRepository = config.storage?.walletRepository ?? new IndexedDBWalletRepository();
|
|
12475
12702
|
const contractRepository = config.storage?.contractRepository ?? new IndexedDBContractRepository();
|
|
@@ -12478,7 +12705,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12478
12705
|
source: serverInfoSource,
|
|
12479
12706
|
lastOnlineAt: serverInfoLastOnlineAt
|
|
12480
12707
|
} = await resolveArkInfo(arkProvider, walletRepository);
|
|
12481
|
-
const network =
|
|
12708
|
+
const network = chunk5MLC2HU3_cjs.getNetwork(info.network);
|
|
12482
12709
|
if ("descriptor" in config.identity) {
|
|
12483
12710
|
const descriptor = config.identity.descriptor;
|
|
12484
12711
|
const identityIsMainnet = !descriptor.includes("tpub");
|
|
@@ -12518,18 +12745,18 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12518
12745
|
value: info.boardingExitDelay,
|
|
12519
12746
|
type: info.boardingExitDelay < 512n ? "blocks" : "seconds"
|
|
12520
12747
|
};
|
|
12521
|
-
const serverPubKey =
|
|
12522
|
-
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;
|
|
12523
12750
|
const offchainOptions = {
|
|
12524
12751
|
pubKey,
|
|
12525
12752
|
serverPubKey,
|
|
12526
12753
|
csvTimelock: exitTimelock
|
|
12527
12754
|
};
|
|
12528
|
-
const offchainTapscript = !delegatePubKey ? new
|
|
12529
|
-
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({
|
|
12530
12757
|
pubKey: base.hex.encode(pubKey),
|
|
12531
12758
|
serverPubKey: base.hex.encode(serverPubKey),
|
|
12532
|
-
csvTimelock:
|
|
12759
|
+
csvTimelock: chunk5MLC2HU3_cjs.timelockToSequence(boardingTimelock).toString()
|
|
12533
12760
|
});
|
|
12534
12761
|
return {
|
|
12535
12762
|
arkProvider,
|
|
@@ -12695,7 +12922,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12695
12922
|
if (!filter?.withUnrolled) {
|
|
12696
12923
|
logExcludedVtxos(
|
|
12697
12924
|
"getSpendableVtxos",
|
|
12698
|
-
snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !
|
|
12925
|
+
snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo)),
|
|
12699
12926
|
[() => UNROLLED_REASON]
|
|
12700
12927
|
);
|
|
12701
12928
|
}
|
|
@@ -12838,7 +13065,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12838
13065
|
const response = await contractManager.getContractsWithVtxos();
|
|
12839
13066
|
const allVtxos = response.flatMap((_) => _.vtxos);
|
|
12840
13067
|
const { boardingTxs, commitmentsToIgnore } = await this.getBoardingTxs();
|
|
12841
|
-
const resolveTxCreatedAt = (txids) =>
|
|
13068
|
+
const resolveTxCreatedAt = (txids) => chunk5MLC2HU3_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
|
|
12842
13069
|
return buildTransactionHistory(
|
|
12843
13070
|
allVtxos,
|
|
12844
13071
|
boardingTxs,
|
|
@@ -12932,7 +13159,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12932
13159
|
},
|
|
12933
13160
|
isUnrolled: true,
|
|
12934
13161
|
...boardingFacts,
|
|
12935
|
-
virtualStatus:
|
|
13162
|
+
virtualStatus: chunk5MLC2HU3_cjs.toVirtualStatus(boardingFacts),
|
|
12936
13163
|
spentBy: "",
|
|
12937
13164
|
createdAt: tx.status.confirmed ? new Date(tx.status.block_time * 1e3) : /* @__PURE__ */ new Date(0),
|
|
12938
13165
|
script: scriptHex
|
|
@@ -12988,9 +13215,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12988
13215
|
async getBoardingTapscripts(allowedSigners) {
|
|
12989
13216
|
const byScript = /* @__PURE__ */ new Map();
|
|
12990
13217
|
const add = (s) => byScript.set(base.hex.encode(s.pkScript), s);
|
|
12991
|
-
const boardingCsv = this.boardingTapscript.options.csvTimelock ??
|
|
13218
|
+
const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
12992
13219
|
add(
|
|
12993
|
-
new
|
|
13220
|
+
new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
12994
13221
|
pubKey: await this.identity.xOnlyPublicKey(),
|
|
12995
13222
|
serverPubKey: this.boardingTapscript.options.serverPubKey,
|
|
12996
13223
|
csvTimelock: boardingCsv
|
|
@@ -13005,7 +13232,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13005
13232
|
for (const c of boardingContracts) {
|
|
13006
13233
|
if (!allowed.has(toXOnlySignerHex(c.params.serverPubKey))) continue;
|
|
13007
13234
|
try {
|
|
13008
|
-
add(
|
|
13235
|
+
add(chunkWIFL5QYZ_cjs.BoardingContractHandler.createScript(c.params));
|
|
13009
13236
|
} catch (e) {
|
|
13010
13237
|
console.warn("Skipping malformed boarding contract", c.script, e);
|
|
13011
13238
|
}
|
|
@@ -13043,7 +13270,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13043
13270
|
// Per-row CSV delay decoded from THIS tapscript's exit leaf —
|
|
13044
13271
|
// not the wallet's current boarding timelock, which a signer
|
|
13045
13272
|
// rotation may have changed.
|
|
13046
|
-
csvTimelock:
|
|
13273
|
+
csvTimelock: chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
|
|
13047
13274
|
coins: utxos
|
|
13048
13275
|
});
|
|
13049
13276
|
}
|
|
@@ -13176,7 +13403,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13176
13403
|
/** Fetch Arkade transaction ids that are still pending final settlement. */
|
|
13177
13404
|
async fetchPendingTxs() {
|
|
13178
13405
|
const scripts = await this.getWalletScripts();
|
|
13179
|
-
const vtxos = await
|
|
13406
|
+
const vtxos = await chunk5MLC2HU3_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
|
|
13180
13407
|
return vtxos.filter(
|
|
13181
13408
|
(vtxo) => (vtxo.isSpent || vtxo.isPreconfirmed && !vtxo.isSwept) && vtxo.arkTxId !== void 0
|
|
13182
13409
|
).map((_) => _.arkTxId);
|
|
@@ -13207,7 +13434,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13207
13434
|
});
|
|
13208
13435
|
for (const contract of contracts) {
|
|
13209
13436
|
if (map.has(contract.script)) continue;
|
|
13210
|
-
const handler =
|
|
13437
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
13211
13438
|
if (handler) {
|
|
13212
13439
|
const script = handler.createScript(contract.params);
|
|
13213
13440
|
map.set(contract.script, script);
|
|
@@ -13319,7 +13546,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13319
13546
|
}
|
|
13320
13547
|
});
|
|
13321
13548
|
const baselinePubkey = await this.identity.xOnlyPublicKey();
|
|
13322
|
-
const delegatePubKey = this.offchainTapscript instanceof
|
|
13549
|
+
const delegatePubKey = this.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
|
|
13323
13550
|
const baselineSigners = [
|
|
13324
13551
|
this.offchainTapscript.options.serverPubKey,
|
|
13325
13552
|
...[...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h))
|
|
@@ -13327,8 +13554,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13327
13554
|
const seenBaselineScripts = /* @__PURE__ */ new Set();
|
|
13328
13555
|
for (const serverPubKey of baselineSigners) {
|
|
13329
13556
|
for (const csvTimelock of this.walletContractTimelocks) {
|
|
13330
|
-
const csvTimelockStr =
|
|
13331
|
-
const defaultScript = new
|
|
13557
|
+
const csvTimelockStr = chunk5MLC2HU3_cjs.timelockToSequence(csvTimelock).toString();
|
|
13558
|
+
const defaultScript = new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
13332
13559
|
pubKey: baselinePubkey,
|
|
13333
13560
|
serverPubKey,
|
|
13334
13561
|
csvTimelock
|
|
@@ -13349,7 +13576,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13349
13576
|
});
|
|
13350
13577
|
}
|
|
13351
13578
|
if (delegatePubKey) {
|
|
13352
|
-
const delegateScript = new
|
|
13579
|
+
const delegateScript = new chunkWIFL5QYZ_cjs.DelegateVtxo.Script({
|
|
13353
13580
|
pubKey: baselinePubkey,
|
|
13354
13581
|
serverPubKey,
|
|
13355
13582
|
delegatePubKey,
|
|
@@ -13373,9 +13600,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13373
13600
|
}
|
|
13374
13601
|
}
|
|
13375
13602
|
}
|
|
13376
|
-
const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ??
|
|
13603
|
+
const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
13377
13604
|
for (const serverPubKey of baselineSigners) {
|
|
13378
|
-
const baselineBoarding = new
|
|
13605
|
+
const baselineBoarding = new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
13379
13606
|
pubKey: baselinePubkey,
|
|
13380
13607
|
serverPubKey,
|
|
13381
13608
|
csvTimelock: boardingCsvTimelock
|
|
@@ -13388,7 +13615,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13388
13615
|
params: {
|
|
13389
13616
|
pubKey: base.hex.encode(baselineBoarding.options.pubKey),
|
|
13390
13617
|
serverPubKey: base.hex.encode(serverPubKey),
|
|
13391
|
-
csvTimelock:
|
|
13618
|
+
csvTimelock: chunk5MLC2HU3_cjs.timelockToSequence(boardingCsvTimelock).toString()
|
|
13392
13619
|
},
|
|
13393
13620
|
script: boardingScriptHex,
|
|
13394
13621
|
address: baselineBoarding.address(this.network.hrp, serverPubKey).encode(),
|
|
@@ -13588,7 +13815,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13588
13815
|
serverPubKey: this.offchainTapscript.options.serverPubKey,
|
|
13589
13816
|
deprecatedSignerPubKeys: [...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h)),
|
|
13590
13817
|
csvTimelocks: this.walletContractTimelocks,
|
|
13591
|
-
delegatePubKey: this.offchainTapscript instanceof
|
|
13818
|
+
delegatePubKey: this.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
|
|
13592
13819
|
};
|
|
13593
13820
|
}
|
|
13594
13821
|
_signerRouter;
|
|
@@ -13833,7 +14060,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13833
14060
|
const [row] = await manager.getContracts({ script: base.hex.encode(display.pkScript) });
|
|
13834
14061
|
const persisted = row?.metadata?.signingDescriptor;
|
|
13835
14062
|
if (typeof persisted === "string") return persisted;
|
|
13836
|
-
return
|
|
14063
|
+
return chunkWIFL5QYZ_cjs.identityDescriptor(this.identity);
|
|
13837
14064
|
}
|
|
13838
14065
|
/**
|
|
13839
14066
|
* Build, persist and shape one address of `type` owned by `descriptor` —
|
|
@@ -13849,7 +14076,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13849
14076
|
async mintAddress(manager, type, descriptor, tagSource, allocated) {
|
|
13850
14077
|
if (type === "boarding") {
|
|
13851
14078
|
const built2 = this.buildBoardingContract(
|
|
13852
|
-
|
|
14079
|
+
chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(descriptor),
|
|
13853
14080
|
descriptor,
|
|
13854
14081
|
tagSource
|
|
13855
14082
|
);
|
|
@@ -13894,11 +14121,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13894
14121
|
* {@link buildReceiveContract}.
|
|
13895
14122
|
*/
|
|
13896
14123
|
buildBoardingContract(pubKey, descriptor, tagSource) {
|
|
13897
|
-
const tapscript = new
|
|
14124
|
+
const tapscript = new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
13898
14125
|
...this._boardingTapscript.options,
|
|
13899
14126
|
pubKey
|
|
13900
14127
|
});
|
|
13901
|
-
const csvTimelock = tapscript.options.csvTimelock ??
|
|
14128
|
+
const csvTimelock = tapscript.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
13902
14129
|
return {
|
|
13903
14130
|
tapscript,
|
|
13904
14131
|
params: {
|
|
@@ -13906,13 +14133,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13906
14133
|
params: {
|
|
13907
14134
|
pubKey: base.hex.encode(pubKey),
|
|
13908
14135
|
serverPubKey: base.hex.encode(tapscript.options.serverPubKey),
|
|
13909
|
-
csvTimelock:
|
|
14136
|
+
csvTimelock: chunk5MLC2HU3_cjs.timelockToSequence(csvTimelock).toString()
|
|
13910
14137
|
},
|
|
13911
14138
|
script: base.hex.encode(tapscript.pkScript),
|
|
13912
14139
|
address: tapscript.address(this.network.hrp, this.arkServerPublicKey).encode(),
|
|
13913
14140
|
state: "active",
|
|
13914
14141
|
metadata: {
|
|
13915
|
-
...tagSource && { source:
|
|
14142
|
+
...tagSource && { source: chunkWIFL5QYZ_cjs.WALLET_RECEIVE_SOURCE },
|
|
13916
14143
|
signingDescriptor: descriptor
|
|
13917
14144
|
}
|
|
13918
14145
|
}
|
|
@@ -13941,7 +14168,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13941
14168
|
if (this._descriptorProvider instanceof HDDescriptorProvider) {
|
|
13942
14169
|
return (await this.getContractManager()).getNextSigningDescriptor();
|
|
13943
14170
|
}
|
|
13944
|
-
return
|
|
14171
|
+
return chunkWIFL5QYZ_cjs.identityDescriptor(this.identity);
|
|
13945
14172
|
}
|
|
13946
14173
|
/**
|
|
13947
14174
|
* @see HDAllocationCapable.advanceSigningDescriptorWatermark
|
|
@@ -14037,7 +14264,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14037
14264
|
* the stable public API.
|
|
14038
14265
|
*/
|
|
14039
14266
|
async rotateServerSigner(newServerPubKey, checkpointTapscript) {
|
|
14040
|
-
const xonly =
|
|
14267
|
+
const xonly = chunkWIFL5QYZ_cjs.toXOnly(newServerPubKey, "ark signer key");
|
|
14041
14268
|
const newServerUnrollScript = assertValidServerUnrollScript(
|
|
14042
14269
|
checkpointTapscript,
|
|
14043
14270
|
resolveCheckpointExitDelayPolicy(this.network, this.checkpointExitDelayPolicy)
|
|
@@ -14066,21 +14293,21 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14066
14293
|
const [currentBoardingRow] = await manager.getContracts({
|
|
14067
14294
|
script: currentBoardingScript
|
|
14068
14295
|
});
|
|
14069
|
-
const newOffchain = this.offchainTapscript instanceof
|
|
14296
|
+
const newOffchain = this.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? new chunkWIFL5QYZ_cjs.DelegateVtxo.Script({
|
|
14070
14297
|
...this.offchainTapscript.options,
|
|
14071
14298
|
serverPubKey: xonly
|
|
14072
|
-
}) : new
|
|
14299
|
+
}) : new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
14073
14300
|
...this.offchainTapscript.options,
|
|
14074
14301
|
serverPubKey: xonly
|
|
14075
14302
|
});
|
|
14076
|
-
const newBoarding = new
|
|
14303
|
+
const newBoarding = new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
|
|
14077
14304
|
...this._boardingTapscript.options,
|
|
14078
14305
|
serverPubKey: xonly
|
|
14079
14306
|
});
|
|
14080
|
-
const offchainCsv =
|
|
14307
|
+
const offchainCsv = chunk5MLC2HU3_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
|
|
14081
14308
|
const newOffchainScript = base.hex.encode(newOffchain.pkScript);
|
|
14082
14309
|
const newOffchainAddress = newOffchain.address(this.network.hrp, xonly).encode();
|
|
14083
|
-
if (newOffchain instanceof
|
|
14310
|
+
if (newOffchain instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script) {
|
|
14084
14311
|
await manager.createContract({
|
|
14085
14312
|
type: "delegate",
|
|
14086
14313
|
params: {
|
|
@@ -14108,13 +14335,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14108
14335
|
metadata: currentOffchainRow?.metadata
|
|
14109
14336
|
});
|
|
14110
14337
|
}
|
|
14111
|
-
const boardingCsv = newBoarding.options.csvTimelock ??
|
|
14338
|
+
const boardingCsv = newBoarding.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
14112
14339
|
await manager.createContract({
|
|
14113
14340
|
type: "boarding",
|
|
14114
14341
|
params: {
|
|
14115
14342
|
pubKey: base.hex.encode(newBoarding.options.pubKey),
|
|
14116
14343
|
serverPubKey: base.hex.encode(xonly),
|
|
14117
|
-
csvTimelock:
|
|
14344
|
+
csvTimelock: chunk5MLC2HU3_cjs.timelockToSequence(boardingCsv).toString()
|
|
14118
14345
|
},
|
|
14119
14346
|
script: base.hex.encode(newBoarding.pkScript),
|
|
14120
14347
|
address: newBoarding.address(this.network.hrp, xonly).encode(),
|
|
@@ -14147,14 +14374,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14147
14374
|
_restoreInFlight;
|
|
14148
14375
|
_addPendingSpends(inputs) {
|
|
14149
14376
|
for (const input of inputs) {
|
|
14150
|
-
if (
|
|
14377
|
+
if (chunk5MLC2HU3_cjs.isVirtualCoin(input)) {
|
|
14151
14378
|
this._pendingSpendOutpoints.add(`${input.txid}:${input.vout}`);
|
|
14152
14379
|
}
|
|
14153
14380
|
}
|
|
14154
14381
|
}
|
|
14155
14382
|
_removePendingSpends(inputs) {
|
|
14156
14383
|
for (const input of inputs) {
|
|
14157
|
-
if (
|
|
14384
|
+
if (chunk5MLC2HU3_cjs.isVirtualCoin(input)) {
|
|
14158
14385
|
this._pendingSpendOutpoints.delete(`${input.txid}:${input.vout}`);
|
|
14159
14386
|
}
|
|
14160
14387
|
}
|
|
@@ -14212,13 +14439,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14212
14439
|
const manager = await this.getContractManager();
|
|
14213
14440
|
const provider = this._descriptorProvider;
|
|
14214
14441
|
const hd = provider instanceof HDDescriptorProvider;
|
|
14215
|
-
const staticDescriptor = hd ? void 0 : await
|
|
14442
|
+
const staticDescriptor = hd ? void 0 : await chunkWIFL5QYZ_cjs.identityDescriptor(this.identity);
|
|
14216
14443
|
const materialize = (index) => hd ? provider.materializeDescriptorAt(index) : staticDescriptor;
|
|
14217
|
-
const delegatePubKey = this.offchainTapscript instanceof
|
|
14444
|
+
const delegatePubKey = this.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
|
|
14218
14445
|
const arkInfo = await this.arkProvider.getInfo();
|
|
14219
|
-
const currentSignerPubKey =
|
|
14446
|
+
const currentSignerPubKey = chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(arkInfo.signerPubkey), "ark signer key");
|
|
14220
14447
|
const deprecatedSignerPubKeys = arkInfo.deprecatedSigners.map(
|
|
14221
|
-
(s) =>
|
|
14448
|
+
(s) => chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(s.pubkey), "deprecated signer key")
|
|
14222
14449
|
);
|
|
14223
14450
|
const deps = {
|
|
14224
14451
|
indexerProvider: this.indexerProvider,
|
|
@@ -14233,7 +14460,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14233
14460
|
csvTimelocks: this.walletContractTimelocks,
|
|
14234
14461
|
// Boarding-exit CSV so the boarding handler can build its
|
|
14235
14462
|
// candidate script (distinct from the unilateral-exit matrix).
|
|
14236
|
-
boardingTimelock: this.boardingTapscript.options.csvTimelock ??
|
|
14463
|
+
boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
|
|
14237
14464
|
delegatePubKey
|
|
14238
14465
|
};
|
|
14239
14466
|
const result = await manager.scanContracts({
|
|
@@ -14347,7 +14574,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14347
14574
|
throw new Error("Invalid configured public key");
|
|
14348
14575
|
}
|
|
14349
14576
|
const setup = await ReadonlyWallet.setupWalletConfig(config, pubkey);
|
|
14350
|
-
const forfeitPubkey =
|
|
14577
|
+
const forfeitPubkey = chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(setup.info.forfeitPubkey), "forfeit key");
|
|
14351
14578
|
const forfeitAddress = btcSigner.Address(setup.network).decode(setup.info.forfeitAddress);
|
|
14352
14579
|
const forfeitOutputScript = btcSigner.OutScript.encode(forfeitAddress);
|
|
14353
14580
|
const checkpointExitDelayOverrides = {
|
|
@@ -14496,7 +14723,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14496
14723
|
inputs: params.selectedVtxos,
|
|
14497
14724
|
changeAmount: BigInt(changeAmount)
|
|
14498
14725
|
};
|
|
14499
|
-
const outputAddress =
|
|
14726
|
+
const outputAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(params.address);
|
|
14500
14727
|
assertRecipientArkAddress(
|
|
14501
14728
|
params.address,
|
|
14502
14729
|
outputAddress,
|
|
@@ -14562,13 +14789,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14562
14789
|
void this.logUngatedInputs("settle({ inputs })", params.inputs);
|
|
14563
14790
|
}
|
|
14564
14791
|
const offchainAddress = await this.getAddress();
|
|
14565
|
-
const offchainPkScript =
|
|
14792
|
+
const offchainPkScript = chunk5MLC2HU3_cjs.ArkAddress.decode(offchainAddress).pkScript;
|
|
14566
14793
|
const offchainOutputScript = base.hex.encode(offchainPkScript);
|
|
14567
14794
|
if (!params) {
|
|
14568
14795
|
const { fees, vtxoMaxAmount } = await this.arkProvider.getInfo();
|
|
14569
14796
|
const estimator = new Estimator(fees.intentFee);
|
|
14570
14797
|
let amount = 0;
|
|
14571
|
-
const exitScript =
|
|
14798
|
+
const exitScript = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(
|
|
14572
14799
|
base.hex.decode(this.boardingTapscript.exitScript)
|
|
14573
14800
|
);
|
|
14574
14801
|
const boardingTimelock = exitScript.params.timelock;
|
|
@@ -14597,7 +14824,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14597
14824
|
if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
|
|
14598
14825
|
break;
|
|
14599
14826
|
}
|
|
14600
|
-
const inputFee = estimator.evalOffchainInput(
|
|
14827
|
+
const inputFee = estimator.evalOffchainInput(chunk5MLC2HU3_cjs.toOffchainInputFeeParams(vtxo));
|
|
14601
14828
|
if (inputFee.satoshis >= vtxo.value) {
|
|
14602
14829
|
continue;
|
|
14603
14830
|
}
|
|
@@ -14644,7 +14871,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14644
14871
|
let script;
|
|
14645
14872
|
let arkAddress;
|
|
14646
14873
|
try {
|
|
14647
|
-
arkAddress =
|
|
14874
|
+
arkAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(output.address);
|
|
14648
14875
|
} catch {
|
|
14649
14876
|
arkAddress = void 0;
|
|
14650
14877
|
}
|
|
@@ -14734,7 +14961,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14734
14961
|
const abortController = new AbortController();
|
|
14735
14962
|
let stream;
|
|
14736
14963
|
let committedTxid;
|
|
14737
|
-
const settleInputVtxos = params.inputs.filter(
|
|
14964
|
+
const settleInputVtxos = params.inputs.filter(chunk5MLC2HU3_cjs.isVirtualCoin);
|
|
14738
14965
|
const contractManager = await this.getContractManager();
|
|
14739
14966
|
await contractManager.assertAnnotatable(settleInputVtxos);
|
|
14740
14967
|
await contractManager.assertSpendableNow?.(
|
|
@@ -14846,7 +15073,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14846
15073
|
async maybeRotateBoardingAfterBoard(inputs) {
|
|
14847
15074
|
if (!this._descriptorProvider) return;
|
|
14848
15075
|
const consumedBoarding = inputs.some(
|
|
14849
|
-
(input) => typeof input !== "string" && !
|
|
15076
|
+
(input) => typeof input !== "string" && !chunk5MLC2HU3_cjs.isVirtualCoin(input)
|
|
14850
15077
|
);
|
|
14851
15078
|
if (!consumedBoarding) return;
|
|
14852
15079
|
try {
|
|
@@ -14870,7 +15097,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14870
15097
|
let connectorIndex = 0;
|
|
14871
15098
|
const connectorsLeaves = connectorsGraph?.leaves() || [];
|
|
14872
15099
|
for (const input of inputs) {
|
|
14873
|
-
if (!
|
|
15100
|
+
if (!chunk5MLC2HU3_cjs.isVirtualCoin(input)) {
|
|
14874
15101
|
for (let i = 0; i < settlementPsbt.inputsLength; i++) {
|
|
14875
15102
|
const settlementInput = settlementPsbt.getInput(i);
|
|
14876
15103
|
if (!settlementInput.txid || settlementInput.index === void 0) {
|
|
@@ -14901,7 +15128,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14901
15128
|
}
|
|
14902
15129
|
continue;
|
|
14903
15130
|
}
|
|
14904
|
-
if (
|
|
15131
|
+
if (chunk5MLC2HU3_cjs.canRecoverOnchain(input, { timestamp: /* @__PURE__ */ new Date() }) || isSubdust({ value: input.value }, this.dustAmount)) {
|
|
14905
15132
|
continue;
|
|
14906
15133
|
}
|
|
14907
15134
|
if (connectorsLeaves.length === 0) {
|
|
@@ -14929,7 +15156,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14929
15156
|
index: input.vout,
|
|
14930
15157
|
witnessUtxo: {
|
|
14931
15158
|
amount: BigInt(input.value),
|
|
14932
|
-
script:
|
|
15159
|
+
script: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
14933
15160
|
},
|
|
14934
15161
|
sighashType: btcSigner.SigHash.DEFAULT,
|
|
14935
15162
|
tapLeafScript: [input.forfeitTapLeafScript]
|
|
@@ -14948,7 +15175,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14948
15175
|
forfeitTx = await this._signerRouter.sign(forfeitTx, [
|
|
14949
15176
|
{
|
|
14950
15177
|
index: 0,
|
|
14951
|
-
lookupScript:
|
|
15178
|
+
lookupScript: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
14952
15179
|
}
|
|
14953
15180
|
]);
|
|
14954
15181
|
signedForfeits.push(base.base64.encode(forfeitTx.toPSBT()));
|
|
@@ -15006,7 +15233,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15006
15233
|
resolveBatchExpiryPolicy(this.network, this.batchExpiryPolicy)
|
|
15007
15234
|
);
|
|
15008
15235
|
await this.arkProvider.confirmRegistration(intentId);
|
|
15009
|
-
const sweepTapscript =
|
|
15236
|
+
const sweepTapscript = chunk5MLC2HU3_cjs.CSVMultisigTapscript.encode({
|
|
15010
15237
|
timelock,
|
|
15011
15238
|
pubkeys: [this.forfeitPubkey]
|
|
15012
15239
|
}).script;
|
|
@@ -15021,10 +15248,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15021
15248
|
throw new Error("Sweep tap tree root not set");
|
|
15022
15249
|
}
|
|
15023
15250
|
const xOnlyPublicKeys = event.cosignersPublicKeys.map(
|
|
15024
|
-
(k) => base.hex.encode(
|
|
15251
|
+
(k) => base.hex.encode(chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
|
|
15025
15252
|
);
|
|
15026
15253
|
const signerPublicKey = await session.getPublicKey();
|
|
15027
|
-
const xonlySignerPublicKey =
|
|
15254
|
+
const xonlySignerPublicKey = chunkWIFL5QYZ_cjs.toXOnly(signerPublicKey, "signer key");
|
|
15028
15255
|
if (!xOnlyPublicKeys.includes(base.hex.encode(xonlySignerPublicKey))) {
|
|
15029
15256
|
return { skip: true };
|
|
15030
15257
|
}
|
|
@@ -15114,9 +15341,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15114
15341
|
...existing ?? {},
|
|
15115
15342
|
intentTxId,
|
|
15116
15343
|
registerProof: intent.proof,
|
|
15117
|
-
registerProofMessage:
|
|
15344
|
+
registerProofMessage: chunk5MLC2HU3_cjs.Intent.encodeMessage(intent.message),
|
|
15118
15345
|
deleteProof: deleteIntent.proof,
|
|
15119
|
-
deleteProofMessage:
|
|
15346
|
+
deleteProofMessage: chunk5MLC2HU3_cjs.Intent.encodeMessage(deleteIntent.message),
|
|
15120
15347
|
intentVtxos: inputs.map((i) => ({
|
|
15121
15348
|
txid: i.txid,
|
|
15122
15349
|
vout: i.vout
|
|
@@ -15148,7 +15375,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15148
15375
|
try {
|
|
15149
15376
|
return await this.arkProvider.registerIntent(intent);
|
|
15150
15377
|
} catch (error) {
|
|
15151
|
-
if (error instanceof
|
|
15378
|
+
if (error instanceof chunk5MLC2HU3_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
|
|
15152
15379
|
const deleteIntent = await this.makeDeleteIntentSignature(inputs);
|
|
15153
15380
|
await this.arkProvider.deleteIntent(deleteIntent);
|
|
15154
15381
|
return this.arkProvider.registerIntent(intent);
|
|
@@ -15164,7 +15391,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15164
15391
|
expire_at: 0,
|
|
15165
15392
|
cosigners_public_keys: cosignerPubKeys
|
|
15166
15393
|
};
|
|
15167
|
-
const proof =
|
|
15394
|
+
const proof = chunk5MLC2HU3_cjs.Intent.create(message, coins, outputs);
|
|
15168
15395
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15169
15396
|
return {
|
|
15170
15397
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15176,7 +15403,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15176
15403
|
type: "delete",
|
|
15177
15404
|
expire_at: 0
|
|
15178
15405
|
};
|
|
15179
|
-
const proof =
|
|
15406
|
+
const proof = chunk5MLC2HU3_cjs.Intent.create(message, coins, []);
|
|
15180
15407
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15181
15408
|
return {
|
|
15182
15409
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15188,7 +15415,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15188
15415
|
type: "get-pending-tx",
|
|
15189
15416
|
expire_at: 0
|
|
15190
15417
|
};
|
|
15191
|
-
const proof =
|
|
15418
|
+
const proof = chunk5MLC2HU3_cjs.Intent.create(message, coins, []);
|
|
15192
15419
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15193
15420
|
return {
|
|
15194
15421
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15209,7 +15436,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15209
15436
|
if (!vtxos || vtxos.length === 0) {
|
|
15210
15437
|
const scriptMap = await this.getScriptMap();
|
|
15211
15438
|
const allExtended = [];
|
|
15212
|
-
const fetchedVtxos = await
|
|
15439
|
+
const fetchedVtxos = await chunk5MLC2HU3_cjs.getAllNormalizedVtxos(this.indexerProvider, [
|
|
15213
15440
|
...scriptMap.keys()
|
|
15214
15441
|
]);
|
|
15215
15442
|
for (const vtxo of fetchedVtxos) {
|
|
@@ -15253,7 +15480,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15253
15480
|
try {
|
|
15254
15481
|
const checkpointTxs = pendingTx.signedCheckpointTxs.map((c) => {
|
|
15255
15482
|
const tx = btcSigner.Transaction.fromPSBT(base.base64.decode(c));
|
|
15256
|
-
|
|
15483
|
+
chunk5MLC2HU3_cjs.assertAllowedSighashTypes(tx);
|
|
15257
15484
|
return tx;
|
|
15258
15485
|
});
|
|
15259
15486
|
assertCheckpointsMatchInputs(
|
|
@@ -15325,11 +15552,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15325
15552
|
* against the current key alone would leave it pending forever.
|
|
15326
15553
|
*/
|
|
15327
15554
|
checkpointUnrollCandidates(info) {
|
|
15328
|
-
const current =
|
|
15555
|
+
const current = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
|
|
15329
15556
|
const candidates = [this._serverUnrollScript, current];
|
|
15330
15557
|
for (const deprecated of signerSetFromInfo(info).deprecated.keys()) {
|
|
15331
15558
|
candidates.push(
|
|
15332
|
-
|
|
15559
|
+
chunk5MLC2HU3_cjs.CSVMultisigTapscript.encode({
|
|
15333
15560
|
...current.params,
|
|
15334
15561
|
pubkeys: [base.hex.decode(deprecated)]
|
|
15335
15562
|
})
|
|
@@ -15420,7 +15647,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15420
15647
|
if (vtxos.length === 0) {
|
|
15421
15648
|
throw new Error("No VTXOs found for this arkadeCash");
|
|
15422
15649
|
}
|
|
15423
|
-
const myPkScript =
|
|
15650
|
+
const myPkScript = chunk5MLC2HU3_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
|
|
15424
15651
|
let { spendable, unclaimed } = this.classifyCashVtxos(vtxos);
|
|
15425
15652
|
let swept = 0;
|
|
15426
15653
|
const drainable = vtxos.filter(
|
|
@@ -15496,7 +15723,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15496
15723
|
const spendable = [];
|
|
15497
15724
|
const unclaimed = [];
|
|
15498
15725
|
for (const vtxo of vtxos) {
|
|
15499
|
-
if (
|
|
15726
|
+
if (chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo)) {
|
|
15500
15727
|
unclaimed.push(cashReport(vtxo, "already-spent"));
|
|
15501
15728
|
} else if (vtxo.isUnrolled) {
|
|
15502
15729
|
unclaimed.push(cashReport(vtxo, "exited"));
|
|
@@ -15518,7 +15745,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15518
15745
|
const all = [];
|
|
15519
15746
|
const seen = /* @__PURE__ */ new Set();
|
|
15520
15747
|
for (let pageIndex = 0; ; pageIndex++) {
|
|
15521
|
-
const { vtxos, page } = await
|
|
15748
|
+
const { vtxos, page } = await chunk5MLC2HU3_cjs.getNormalizedVtxos(this.indexerProvider, {
|
|
15522
15749
|
scripts,
|
|
15523
15750
|
pageIndex,
|
|
15524
15751
|
pageSize
|
|
@@ -15565,7 +15792,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15565
15792
|
for (let i = 0; i < inputs.length; i += MAX_INPUTS_PER_INTENT) {
|
|
15566
15793
|
const batch = inputs.slice(i, i + MAX_INPUTS_PER_INTENT);
|
|
15567
15794
|
const message = { type: "get-pending-tx", expire_at: 0 };
|
|
15568
|
-
const proof =
|
|
15795
|
+
const proof = chunk5MLC2HU3_cjs.Intent.create(message, batch, []);
|
|
15569
15796
|
const signedProof = await identity.sign(
|
|
15570
15797
|
proof,
|
|
15571
15798
|
Array.from({ length: batch.length + 1 }, (_, j) => j)
|
|
@@ -15587,7 +15814,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15587
15814
|
try {
|
|
15588
15815
|
const checkpointTxs = pendingTx.signedCheckpointTxs.map((checkpoint) => {
|
|
15589
15816
|
const tx = btcSigner.Transaction.fromPSBT(base.base64.decode(checkpoint));
|
|
15590
|
-
|
|
15817
|
+
chunk5MLC2HU3_cjs.assertAllowedSighashTypes(tx);
|
|
15591
15818
|
return tx;
|
|
15592
15819
|
});
|
|
15593
15820
|
assertCheckpointsMatchInputs(
|
|
@@ -15786,7 +16013,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15786
16013
|
script: recipient.script,
|
|
15787
16014
|
amount: BigInt(recipient.amount),
|
|
15788
16015
|
// Already checked against the recipient address in `validateRecipients`.
|
|
15789
|
-
...recipient.tapTree ? { tapTree:
|
|
16016
|
+
...recipient.tapTree ? { tapTree: chunk5MLC2HU3_cjs.TapTreeCoder.decode(recipient.tapTree) } : {}
|
|
15790
16017
|
}));
|
|
15791
16018
|
const totalBtcOutput = outputs.reduce((sum, o) => sum + Number(o.amount), 0);
|
|
15792
16019
|
let changeAmount = totalBtcSelected - totalBtcOutput;
|
|
@@ -15930,10 +16157,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15930
16157
|
const serverPubKey = this.arkServerPublicKey;
|
|
15931
16158
|
const serverUnrollScript = this.serverUnrollScript;
|
|
15932
16159
|
const arkAddress = offchainTapscript.address(this.network.hrp, serverPubKey);
|
|
15933
|
-
const normalizedInputs = inputs.map(
|
|
15934
|
-
const at = now ?? await
|
|
16160
|
+
const normalizedInputs = inputs.map(chunk5MLC2HU3_cjs.normalizeVtxo);
|
|
16161
|
+
const at = now ?? await chunk5MLC2HU3_cjs.resolveTimeHeight(this.onchainProvider);
|
|
15935
16162
|
for (const input of normalizedInputs) {
|
|
15936
|
-
if (!
|
|
16163
|
+
if (!chunk5MLC2HU3_cjs.canSpendOffchain(input, at)) {
|
|
15937
16164
|
throw new Error(
|
|
15938
16165
|
`sendSelectedVtxosToSelf: input ${input.txid}:${input.vout} is not cooperatively spendable`
|
|
15939
16166
|
);
|
|
@@ -16003,7 +16230,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16003
16230
|
);
|
|
16004
16231
|
const arkTxJobs = inputs.map((input, index) => ({
|
|
16005
16232
|
index,
|
|
16006
|
-
lookupScript:
|
|
16233
|
+
lookupScript: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
16007
16234
|
}));
|
|
16008
16235
|
const identity = this.identity;
|
|
16009
16236
|
const signer = {
|
|
@@ -16089,14 +16316,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16089
16316
|
const spentBy = checkpointIdByOutpoint.get(`${vtxo.txid}:${vtxo.vout}`);
|
|
16090
16317
|
spentVtxos.push({
|
|
16091
16318
|
...spentFacts,
|
|
16092
|
-
virtualStatus:
|
|
16319
|
+
virtualStatus: chunk5MLC2HU3_cjs.toVirtualStatus(spentFacts),
|
|
16093
16320
|
...spentBy ? { spentBy } : {},
|
|
16094
16321
|
arkTxId: arkTxid
|
|
16095
16322
|
});
|
|
16096
16323
|
for (const id of vtxo.commitmentTxIds) {
|
|
16097
16324
|
commitmentTxIds.add(id);
|
|
16098
16325
|
}
|
|
16099
|
-
const vtxoExpiry =
|
|
16326
|
+
const vtxoExpiry = chunk5MLC2HU3_cjs.toBatchExpiry(vtxo);
|
|
16100
16327
|
if (vtxoExpiry) {
|
|
16101
16328
|
batchExpiry = Math.min(batchExpiry, vtxoExpiry);
|
|
16102
16329
|
}
|
|
@@ -16109,7 +16336,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16109
16336
|
isSwept: false,
|
|
16110
16337
|
isPreconfirmed: true,
|
|
16111
16338
|
commitmentTxIds: Array.from(commitmentTxIds),
|
|
16112
|
-
...
|
|
16339
|
+
...chunk5MLC2HU3_cjs.parseLegacyExpiry(batchExpiry)
|
|
16113
16340
|
};
|
|
16114
16341
|
changeVtxo = {
|
|
16115
16342
|
txid: arkTxid,
|
|
@@ -16121,7 +16348,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16121
16348
|
tapTree: offchainTapscript.encode(),
|
|
16122
16349
|
value: Number(changeAmount),
|
|
16123
16350
|
...changeFacts,
|
|
16124
|
-
virtualStatus:
|
|
16351
|
+
virtualStatus: chunk5MLC2HU3_cjs.toVirtualStatus(changeFacts),
|
|
16125
16352
|
spentBy: "",
|
|
16126
16353
|
status: {
|
|
16127
16354
|
confirmed: false
|
|
@@ -16190,12 +16417,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16190
16417
|
const spentVtxos = [];
|
|
16191
16418
|
const inputArkTxIds = /* @__PURE__ */ new Set();
|
|
16192
16419
|
const boardingRemovalsByAddress = /* @__PURE__ */ new Map();
|
|
16193
|
-
const vtxoInputs = inputs.filter(
|
|
16420
|
+
const vtxoInputs = inputs.filter(chunk5MLC2HU3_cjs.isVirtualCoin);
|
|
16194
16421
|
const cm = await this.getContractManager();
|
|
16195
16422
|
const annotatedVtxos = await cm.annotateVtxos(vtxoInputs);
|
|
16196
16423
|
const annotatedByKey = new Map(annotatedVtxos.map((v) => [`${v.txid}:${v.vout}`, v]));
|
|
16197
16424
|
for (const input of inputs) {
|
|
16198
|
-
if (
|
|
16425
|
+
if (chunk5MLC2HU3_cjs.isVirtualCoin(input)) {
|
|
16199
16426
|
const outpoint = `${input.txid}:${input.vout}`;
|
|
16200
16427
|
const vtxo = annotatedByKey.get(outpoint);
|
|
16201
16428
|
if (!vtxo) {
|
|
@@ -16207,13 +16434,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16207
16434
|
const settledFacts = { ...vtxo, isSpent: true };
|
|
16208
16435
|
spentVtxos.push({
|
|
16209
16436
|
...settledFacts,
|
|
16210
|
-
virtualStatus:
|
|
16437
|
+
virtualStatus: chunk5MLC2HU3_cjs.toVirtualStatus(settledFacts),
|
|
16211
16438
|
settledBy: commitmentTxid
|
|
16212
16439
|
});
|
|
16213
16440
|
} else {
|
|
16214
16441
|
let sourceAddress;
|
|
16215
16442
|
try {
|
|
16216
|
-
sourceAddress =
|
|
16443
|
+
sourceAddress = chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
|
|
16217
16444
|
this.network
|
|
16218
16445
|
);
|
|
16219
16446
|
} catch {
|
|
@@ -16271,9 +16498,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16271
16498
|
}
|
|
16272
16499
|
};
|
|
16273
16500
|
function selectVirtualCoins(coins, targetAmount) {
|
|
16274
|
-
const sortedCoins = coins.map(
|
|
16275
|
-
const expiryA =
|
|
16276
|
-
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;
|
|
16277
16504
|
if (expiryA !== expiryB) {
|
|
16278
16505
|
return expiryA - expiryB;
|
|
16279
16506
|
}
|
|
@@ -16300,19 +16527,53 @@ function selectVirtualCoins(coins, targetAmount) {
|
|
|
16300
16527
|
changeAmount
|
|
16301
16528
|
};
|
|
16302
16529
|
}
|
|
16303
|
-
|
|
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);
|
|
16304
16544
|
let stopFunc;
|
|
16305
16545
|
let settled = false;
|
|
16306
|
-
|
|
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
|
+
}
|
|
16307
16568
|
wallet.notifyIncomingFunds((funds) => {
|
|
16308
16569
|
const hasFunds = funds.type === "utxo" ? funds.coins.length > 0 : funds.newVtxos.length > 0;
|
|
16309
16570
|
if (settled || !hasFunds) return;
|
|
16310
|
-
|
|
16311
|
-
resolve(funds);
|
|
16312
|
-
stopFunc?.();
|
|
16571
|
+
settle(() => resolve(funds));
|
|
16313
16572
|
}).then((stop) => {
|
|
16314
16573
|
stopFunc = stop;
|
|
16315
16574
|
if (settled) stop();
|
|
16575
|
+
}).catch((error) => {
|
|
16576
|
+
cancel(error);
|
|
16316
16577
|
});
|
|
16317
16578
|
});
|
|
16318
16579
|
}
|
|
@@ -16608,7 +16869,7 @@ var MessageBus = class {
|
|
|
16608
16869
|
this.initialized = true;
|
|
16609
16870
|
}
|
|
16610
16871
|
async buildServices(config) {
|
|
16611
|
-
const arkProvider = new
|
|
16872
|
+
const arkProvider = new chunk5MLC2HU3_cjs.RestArkProvider(config.arkServer.url);
|
|
16612
16873
|
const storage = {
|
|
16613
16874
|
walletRepository: this.walletRepository,
|
|
16614
16875
|
contractRepository: this.contractRepository,
|
|
@@ -16950,7 +17211,7 @@ var offboardNetworkNames = [
|
|
|
16950
17211
|
function offboardDestinationScript(destinationAddress) {
|
|
16951
17212
|
for (const networkName of offboardNetworkNames) {
|
|
16952
17213
|
try {
|
|
16953
|
-
const network =
|
|
17214
|
+
const network = chunk5MLC2HU3_cjs.networks[networkName];
|
|
16954
17215
|
const addr = btcSigner.Address(network).decode(destinationAddress);
|
|
16955
17216
|
return btcSigner.OutScript.encode(addr);
|
|
16956
17217
|
} catch {
|
|
@@ -17014,7 +17275,7 @@ var Ramps = class {
|
|
|
17014
17275
|
}
|
|
17015
17276
|
amount = amount ?? totalAmount;
|
|
17016
17277
|
const offchainAddress = await this.wallet.getAddress();
|
|
17017
|
-
const offchainAddr =
|
|
17278
|
+
const offchainAddr = chunk5MLC2HU3_cjs.ArkAddress.decode(offchainAddress);
|
|
17018
17279
|
const offchainScript = base.hex.encode(offchainAddr.pkScript);
|
|
17019
17280
|
const outputFee = estimator.evalOffchainOutput({
|
|
17020
17281
|
amount,
|
|
@@ -17074,7 +17335,7 @@ var Ramps = class {
|
|
|
17074
17335
|
const filteredVtxos = [];
|
|
17075
17336
|
let totalAmount = 0n;
|
|
17076
17337
|
for (const vtxo of vtxos) {
|
|
17077
|
-
const inputFee = estimator.evalOffchainInput(
|
|
17338
|
+
const inputFee = estimator.evalOffchainInput(chunk5MLC2HU3_cjs.toOffchainInputFeeParams(vtxo));
|
|
17078
17339
|
if (inputFee.satoshis >= vtxo.value) {
|
|
17079
17340
|
continue;
|
|
17080
17341
|
}
|
|
@@ -17910,7 +18171,7 @@ var WalletMessageHandler = class {
|
|
|
17910
18171
|
// Wallet methods
|
|
17911
18172
|
async handleInitWallet({ payload }) {
|
|
17912
18173
|
const { arkServerUrl } = payload;
|
|
17913
|
-
this.indexerProvider = new
|
|
18174
|
+
this.indexerProvider = new chunkGVHUHTRH_cjs.RestIndexerProvider(arkServerUrl);
|
|
17914
18175
|
await this.onWalletInitialized();
|
|
17915
18176
|
}
|
|
17916
18177
|
/**
|
|
@@ -18199,7 +18460,7 @@ var WalletMessageHandler = class {
|
|
|
18199
18460
|
if (v.isUnrolled) {
|
|
18200
18461
|
return withUnrolled;
|
|
18201
18462
|
}
|
|
18202
|
-
if (
|
|
18463
|
+
if (chunk5MLC2HU3_cjs.hasTerminalSpend(v)) {
|
|
18203
18464
|
return false;
|
|
18204
18465
|
}
|
|
18205
18466
|
if (includeRecoverable) {
|
|
@@ -18208,10 +18469,10 @@ var WalletMessageHandler = class {
|
|
|
18208
18469
|
if (dustAmount != null && isSubdust(v, dustAmount)) {
|
|
18209
18470
|
return false;
|
|
18210
18471
|
}
|
|
18211
|
-
if (
|
|
18472
|
+
if (chunk5MLC2HU3_cjs.isRecoverable(v)) {
|
|
18212
18473
|
return false;
|
|
18213
18474
|
}
|
|
18214
|
-
if (
|
|
18475
|
+
if (chunk5MLC2HU3_cjs.isExpired(v)) {
|
|
18215
18476
|
return false;
|
|
18216
18477
|
}
|
|
18217
18478
|
return true;
|
|
@@ -18309,7 +18570,7 @@ var WalletMessageHandler = class {
|
|
|
18309
18570
|
if (!this.readonlyWallet) return null;
|
|
18310
18571
|
const { boardingTxs, commitmentsToIgnore } = await this.readonlyWallet.getBoardingTxs();
|
|
18311
18572
|
const indexerProvider = this.indexerProvider;
|
|
18312
|
-
const resolveTxCreatedAt = indexerProvider ? (txids) =>
|
|
18573
|
+
const resolveTxCreatedAt = indexerProvider ? (txids) => chunk5MLC2HU3_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
|
|
18313
18574
|
return buildTransactionHistory(vtxos, boardingTxs, commitmentsToIgnore, resolveTxCreatedAt);
|
|
18314
18575
|
}
|
|
18315
18576
|
async ensureContractEventBroadcasting() {
|
|
@@ -19005,7 +19266,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19005
19266
|
};
|
|
19006
19267
|
try {
|
|
19007
19268
|
const response = await this.sendMessage(message);
|
|
19008
|
-
return response.payload.vtxos.map(
|
|
19269
|
+
return response.payload.vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
|
|
19009
19270
|
} catch (error) {
|
|
19010
19271
|
throw new Error(`Failed to get vtxos: ${error}`);
|
|
19011
19272
|
}
|
|
@@ -19030,7 +19291,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19030
19291
|
};
|
|
19031
19292
|
try {
|
|
19032
19293
|
const response = await this.sendMessage(message);
|
|
19033
|
-
return response.payload.vtxos.map(
|
|
19294
|
+
return response.payload.vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
|
|
19034
19295
|
} catch (error) {
|
|
19035
19296
|
throw new Error(`Failed to get spendable vtxos: ${error}`);
|
|
19036
19297
|
}
|
|
@@ -19161,7 +19422,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19161
19422
|
};
|
|
19162
19423
|
try {
|
|
19163
19424
|
const response = await sendContractMessage(message);
|
|
19164
|
-
return response.payload.vtxos.map(
|
|
19425
|
+
return response.payload.vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
|
|
19165
19426
|
} catch (e) {
|
|
19166
19427
|
throw new Error("Failed to annotate vtxos");
|
|
19167
19428
|
}
|
|
@@ -19762,7 +20023,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
|
|
|
19762
20023
|
};
|
|
19763
20024
|
try {
|
|
19764
20025
|
const response = await wallet.sendMessage(message);
|
|
19765
|
-
return response.payload.vtxos.map(
|
|
20026
|
+
return response.payload.vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
|
|
19766
20027
|
} catch (e) {
|
|
19767
20028
|
throw new Error(`Failed to get expiring vtxos: ${e}`);
|
|
19768
20029
|
}
|
|
@@ -19874,12 +20135,12 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
19874
20135
|
* @returns Configured onchain wallet
|
|
19875
20136
|
* @throws Error if the configured identity cannot produce a valid x-only public key
|
|
19876
20137
|
*/
|
|
19877
|
-
static async create(identity, networkName =
|
|
20138
|
+
static async create(identity, networkName = chunk5MLC2HU3_cjs.DEFAULT_NETWORK_NAME, provider) {
|
|
19878
20139
|
const pubkey = await identity.xOnlyPublicKey();
|
|
19879
20140
|
if (!pubkey) {
|
|
19880
20141
|
throw new Error("Invalid configured public key");
|
|
19881
20142
|
}
|
|
19882
|
-
const network =
|
|
20143
|
+
const network = chunk5MLC2HU3_cjs.getNetwork(networkName);
|
|
19883
20144
|
const onchainProvider = provider || new EsploraProvider(ESPLORA_URL[networkName]);
|
|
19884
20145
|
const onchainP2TR = btcSigner.p2tr(pubkey, void 0, network);
|
|
19885
20146
|
return new _OnchainWallet(identity, network, onchainP2TR, onchainProvider);
|
|
@@ -19985,7 +20246,7 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
19985
20246
|
if (!inputs) {
|
|
19986
20247
|
throw new Error("Fee estimation failed");
|
|
19987
20248
|
}
|
|
19988
|
-
let tx = new
|
|
20249
|
+
let tx = new chunk5MLC2HU3_cjs.Transaction();
|
|
19989
20250
|
for (const input of inputs) {
|
|
19990
20251
|
tx.addInput({
|
|
19991
20252
|
txid: input.txid,
|
|
@@ -20043,7 +20304,7 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
20043
20304
|
* @throws If the parent has no anchor, or funding cannot be selected/signed
|
|
20044
20305
|
*/
|
|
20045
20306
|
async bumpAnchor(parentHex, feeRate) {
|
|
20046
|
-
const parent =
|
|
20307
|
+
const parent = chunk5MLC2HU3_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
|
|
20047
20308
|
const coins = (await this.getCoins()).filter((c) => c.status.confirmed);
|
|
20048
20309
|
const child = await this.buildBumpPackage(parent, feeRate, coins);
|
|
20049
20310
|
return [parent.hex, child.hex];
|
|
@@ -20142,6 +20403,7 @@ var ListUnspentMethod = "blockchain.scripthash.listunspent";
|
|
|
20142
20403
|
var MISSING_TRANSACTION = "missingtransaction";
|
|
20143
20404
|
var MAX_FETCH_TRANSACTIONS_ATTEMPTS = 5;
|
|
20144
20405
|
var BLOCK_HEADER_SIZE = 80;
|
|
20406
|
+
var MTP_WINDOW = 11;
|
|
20145
20407
|
function parseBlockHeader(headerHex) {
|
|
20146
20408
|
const headerBytes = base.hex.decode(headerHex);
|
|
20147
20409
|
if (headerBytes.length !== BLOCK_HEADER_SIZE) {
|
|
@@ -20448,6 +20710,8 @@ var ElectrumOnchainProvider = class {
|
|
|
20448
20710
|
ws;
|
|
20449
20711
|
network;
|
|
20450
20712
|
chain;
|
|
20713
|
+
mtpCache;
|
|
20714
|
+
mtpInflight;
|
|
20451
20715
|
async getCoins(address) {
|
|
20452
20716
|
const script = this.encodeAddress(address);
|
|
20453
20717
|
const scriptHash = toScriptHash(script);
|
|
@@ -20703,15 +20967,58 @@ var ElectrumOnchainProvider = class {
|
|
|
20703
20967
|
blockTime
|
|
20704
20968
|
};
|
|
20705
20969
|
}
|
|
20970
|
+
/** `time` is median-time-past, per {@link OnchainProvider.getChainTip};
|
|
20971
|
+
* Electrum serves raw headers and no MTP, so it is computed here. */
|
|
20706
20972
|
async getChainTip() {
|
|
20707
20973
|
const tip = await this.chain.subscribeHeaders();
|
|
20708
20974
|
const { hash, timestamp } = parseBlockHeader(tip.hex);
|
|
20709
20975
|
return {
|
|
20710
20976
|
height: tip.height,
|
|
20711
|
-
time: timestamp,
|
|
20977
|
+
time: await this.medianTimePast(tip.height, timestamp, hash),
|
|
20712
20978
|
hash
|
|
20713
20979
|
};
|
|
20714
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
|
+
}
|
|
20715
21022
|
async watchAddresses(addresses, eventCallback) {
|
|
20716
21023
|
const scripts = addresses.map((addr) => this.encodeAddress(addr));
|
|
20717
21024
|
const scriptHashes = scripts.map(toScriptHash);
|
|
@@ -20904,7 +21211,7 @@ async function resolvePrevTxs(txids, source, onchain) {
|
|
|
20904
21211
|
try {
|
|
20905
21212
|
const { txs } = await source.getVirtualTxs(wanted);
|
|
20906
21213
|
for (const psbt of txs) {
|
|
20907
|
-
const tx =
|
|
21214
|
+
const tx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbt));
|
|
20908
21215
|
resolved.set(tx.id, tx.toBytes());
|
|
20909
21216
|
}
|
|
20910
21217
|
} catch (err) {
|
|
@@ -20937,7 +21244,7 @@ async function resolvePrevTxs(txids, source, onchain) {
|
|
|
20937
21244
|
async function attachPrevArkTxs(tx, txids, source, onchain) {
|
|
20938
21245
|
const pending = [];
|
|
20939
21246
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
20940
|
-
if (
|
|
21247
|
+
if (chunk5MLC2HU3_cjs.getArkPsbtFields(tx, i, chunk5MLC2HU3_cjs.PrevArkTxField).length === 0) pending.push(i);
|
|
20941
21248
|
}
|
|
20942
21249
|
if (pending.length === 0) return;
|
|
20943
21250
|
const resolved = await resolvePrevTxs(
|
|
@@ -20946,13 +21253,13 @@ async function attachPrevArkTxs(tx, txids, source, onchain) {
|
|
|
20946
21253
|
onchain
|
|
20947
21254
|
);
|
|
20948
21255
|
for (const i of pending) {
|
|
20949
|
-
|
|
21256
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(tx, i, chunk5MLC2HU3_cjs.PrevArkTxField, resolved.get(txidAt(txids, i)));
|
|
20950
21257
|
}
|
|
20951
21258
|
}
|
|
20952
21259
|
async function attachPrevoutTxs(tx, source) {
|
|
20953
21260
|
const pending = [];
|
|
20954
21261
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
20955
|
-
if (
|
|
21262
|
+
if (chunk5MLC2HU3_cjs.getArkPsbtFields(tx, i, chunk5MLC2HU3_cjs.PrevoutTxField).length > 0) continue;
|
|
20956
21263
|
const input = tx.getInput(i);
|
|
20957
21264
|
if (!input?.txid) throw new PrevTxUnavailableError(`input ${i} has no outpoint`);
|
|
20958
21265
|
pending.push({ index: i, txid: base.hex.encode(input.txid) });
|
|
@@ -20963,7 +21270,7 @@ async function attachPrevoutTxs(tx, source) {
|
|
|
20963
21270
|
resolved.set(txid, await source.getRawTransaction(txid));
|
|
20964
21271
|
}
|
|
20965
21272
|
for (const { index, txid } of pending) {
|
|
20966
|
-
|
|
21273
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(tx, index, chunk5MLC2HU3_cjs.PrevoutTxField, resolved.get(txid));
|
|
20967
21274
|
}
|
|
20968
21275
|
}
|
|
20969
21276
|
async function withPrevTxs(coins, source, onchain) {
|
|
@@ -20989,7 +21296,7 @@ exports.BIP322 = void 0;
|
|
|
20989
21296
|
async function sign2(message, identity, network) {
|
|
20990
21297
|
const xOnlyPubKey = await identity.xOnlyPublicKey();
|
|
20991
21298
|
const payment = btcSigner.p2tr(xOnlyPubKey, void 0, network);
|
|
20992
|
-
const toSpend =
|
|
21299
|
+
const toSpend = chunk5MLC2HU3_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
|
|
20993
21300
|
const toSign = craftBIP322ToSignP2TR(toSpend, payment.script, xOnlyPubKey);
|
|
20994
21301
|
const signed = await identity.sign(toSign, [0]);
|
|
20995
21302
|
signed.finalizeIdx(0);
|
|
@@ -21047,7 +21354,7 @@ function verifyP2TR(message, witnessItems, pkScript, pubkey) {
|
|
|
21047
21354
|
if (sighashType !== btcSigner.SigHash.DEFAULT && sighashType !== btcSigner.SigHash.ALL) {
|
|
21048
21355
|
return false;
|
|
21049
21356
|
}
|
|
21050
|
-
const toSpend =
|
|
21357
|
+
const toSpend = chunk5MLC2HU3_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
|
|
21051
21358
|
const toSign = craftBIP322ToSignP2TR(toSpend, pkScript, pubkey);
|
|
21052
21359
|
const sighash = toSign.preimageWitnessV1(0, [pkScript], sighashType, [0n]);
|
|
21053
21360
|
const rawSig = sig.length === 65 ? sig.subarray(0, 64) : sig;
|
|
@@ -21068,7 +21375,7 @@ function verifyP2WPKH(message, witnessItems, pkScript, addressHash) {
|
|
|
21068
21375
|
}
|
|
21069
21376
|
const sighashType = sigWithHash[sigWithHash.length - 1];
|
|
21070
21377
|
const derSig = sigWithHash.subarray(0, sigWithHash.length - 1);
|
|
21071
|
-
const toSpend =
|
|
21378
|
+
const toSpend = chunk5MLC2HU3_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
|
|
21072
21379
|
const toSign = craftBIP322ToSignSimple(toSpend, pkScript);
|
|
21073
21380
|
const scriptCode = btcSigner.OutScript.encode({ type: "pkh", hash: addressHash });
|
|
21074
21381
|
const sighash = toSign.preimageWitnessV0(0, scriptCode, sighashType, 0n);
|
|
@@ -21121,7 +21428,7 @@ function encodeCompactSize(n) {
|
|
|
21121
21428
|
return buf;
|
|
21122
21429
|
}
|
|
21123
21430
|
function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
|
|
21124
|
-
const tx = new
|
|
21431
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction({ version: 0 });
|
|
21125
21432
|
tx.addInput({
|
|
21126
21433
|
txid: toSpend.id,
|
|
21127
21434
|
index: 0,
|
|
@@ -21135,12 +21442,12 @@ function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
|
|
|
21135
21442
|
});
|
|
21136
21443
|
tx.addOutput({
|
|
21137
21444
|
amount: 0n,
|
|
21138
|
-
script:
|
|
21445
|
+
script: chunk5MLC2HU3_cjs.OP_RETURN_EMPTY_PKSCRIPT
|
|
21139
21446
|
});
|
|
21140
21447
|
return tx;
|
|
21141
21448
|
}
|
|
21142
21449
|
function craftBIP322ToSignSimple(toSpend, pkScript) {
|
|
21143
|
-
const tx = new
|
|
21450
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction({ version: 0 });
|
|
21144
21451
|
tx.addInput({
|
|
21145
21452
|
txid: toSpend.id,
|
|
21146
21453
|
index: 0,
|
|
@@ -21152,7 +21459,7 @@ function craftBIP322ToSignSimple(toSpend, pkScript) {
|
|
|
21152
21459
|
});
|
|
21153
21460
|
tx.addOutput({
|
|
21154
21461
|
amount: 0n,
|
|
21155
|
-
script:
|
|
21462
|
+
script: chunk5MLC2HU3_cjs.OP_RETURN_EMPTY_PKSCRIPT
|
|
21156
21463
|
});
|
|
21157
21464
|
return tx;
|
|
21158
21465
|
}
|
|
@@ -21283,7 +21590,7 @@ var RestEmulatorProvider = class {
|
|
|
21283
21590
|
}
|
|
21284
21591
|
};
|
|
21285
21592
|
function finalizeVirtualTx(type, psbtBase64) {
|
|
21286
|
-
const tx =
|
|
21593
|
+
const tx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
|
|
21287
21594
|
if (type === "INDEXER_CHAINED_TX_TYPE_TREE" /* TREE */) {
|
|
21288
21595
|
const input = tx.getInput(0);
|
|
21289
21596
|
if (!input) {
|
|
@@ -21310,14 +21617,14 @@ var ExitPathError = class extends Error {
|
|
|
21310
21617
|
reason;
|
|
21311
21618
|
};
|
|
21312
21619
|
function delayWeight(sequence) {
|
|
21313
|
-
const t =
|
|
21620
|
+
const t = chunk5MLC2HU3_cjs.sequenceToTimelock(sequence);
|
|
21314
21621
|
return t.type === "blocks" ? Number(t.value) : Number(t.value) / 600;
|
|
21315
21622
|
}
|
|
21316
21623
|
async function resolveUnilateralPath(params) {
|
|
21317
21624
|
const { vtxo, scriptHex, contractRepository } = params;
|
|
21318
21625
|
const contract = contractRepository ? (await contractRepository.getContracts({ script: scriptHex }))[0] : void 0;
|
|
21319
21626
|
if (contract) {
|
|
21320
|
-
const handler =
|
|
21627
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
21321
21628
|
if (!handler) {
|
|
21322
21629
|
throw new ExitPathError(
|
|
21323
21630
|
"no-handler",
|
|
@@ -21340,12 +21647,12 @@ async function resolveUnilateralPath(params) {
|
|
|
21340
21647
|
paths.sort((a, b) => delayWeight(a.sequence) - delayWeight(b.sequence));
|
|
21341
21648
|
return { selection: paths[0], label: `${contract.type}:unilateral` };
|
|
21342
21649
|
}
|
|
21343
|
-
const decoded =
|
|
21650
|
+
const decoded = chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree);
|
|
21344
21651
|
let best;
|
|
21345
21652
|
for (const exit of decoded.exitPaths()) {
|
|
21346
21653
|
const leaf = decoded.findLeaf(base.hex.encode(exit.script));
|
|
21347
21654
|
if (!leaf) continue;
|
|
21348
|
-
const sequence =
|
|
21655
|
+
const sequence = chunk5MLC2HU3_cjs.timelockToSequence(exit.params.timelock);
|
|
21349
21656
|
const weight = delayWeight(sequence);
|
|
21350
21657
|
if (!best || weight < best.weight) {
|
|
21351
21658
|
best = { selection: { leaf, sequence }, weight };
|
|
@@ -21565,7 +21872,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
21565
21872
|
let totalAmount = 0n;
|
|
21566
21873
|
const txWeightEstimator = TxWeightEstimator.create();
|
|
21567
21874
|
for (const vtxo of vtxos) {
|
|
21568
|
-
if (!
|
|
21875
|
+
if (!chunk5MLC2HU3_cjs.canSweepOnchain(vtxo)) {
|
|
21569
21876
|
throw new Error(
|
|
21570
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`
|
|
21571
21878
|
);
|
|
@@ -21576,14 +21883,14 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
21576
21883
|
}
|
|
21577
21884
|
const resolved = await resolveUnilateralPath({
|
|
21578
21885
|
vtxo,
|
|
21579
|
-
scriptHex: base.hex.encode(
|
|
21886
|
+
scriptHex: base.hex.encode(chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
|
|
21580
21887
|
contractRepository: wallet.contractRepository,
|
|
21581
21888
|
walletPubKeyHex: base.hex.encode(await wallet.identity.xOnlyPublicKey()),
|
|
21582
21889
|
currentTime: Date.now()
|
|
21583
21890
|
});
|
|
21584
21891
|
const spendingLeaf = resolved.selection.leaf;
|
|
21585
21892
|
const sequence = resolved.selection.sequence;
|
|
21586
|
-
const timelock =
|
|
21893
|
+
const timelock = chunk5MLC2HU3_cjs.sequenceToTimelock(sequence);
|
|
21587
21894
|
const elapsed = timelock.type === "blocks" ? chainTip.height >= txStatus.blockHeight + Number(timelock.value) : chainTip.time >= txStatus.blockTime + Number(timelock.value);
|
|
21588
21895
|
if (!elapsed) {
|
|
21589
21896
|
throw new Error(`no available exit path found for vtxo ${vtxo.txid}:${vtxo.vout}`);
|
|
@@ -21596,7 +21903,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
21596
21903
|
sequence,
|
|
21597
21904
|
witnessUtxo: {
|
|
21598
21905
|
amount: BigInt(vtxo.value),
|
|
21599
|
-
script:
|
|
21906
|
+
script: chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
|
|
21600
21907
|
},
|
|
21601
21908
|
sighashType: btcSigner.SigHash.DEFAULT
|
|
21602
21909
|
});
|
|
@@ -21606,7 +21913,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
21606
21913
|
btcSigner.TaprootControlBlock.encode(spendingLeaf[0]).length
|
|
21607
21914
|
);
|
|
21608
21915
|
}
|
|
21609
|
-
const tx = new
|
|
21916
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction({ version: 2 });
|
|
21610
21917
|
for (const input of inputs) {
|
|
21611
21918
|
tx.addInput(input);
|
|
21612
21919
|
}
|
|
@@ -21689,7 +21996,7 @@ async function buildSignedSweep(params) {
|
|
|
21689
21996
|
`uneconomic vtxo ${vtxo.txid}:${vtxo.vout}: value ${vtxo.value} - fee ${fee} < dust`
|
|
21690
21997
|
);
|
|
21691
21998
|
}
|
|
21692
|
-
const tx = new
|
|
21999
|
+
const tx = new chunk5MLC2HU3_cjs.Transaction({ version: 2 });
|
|
21693
22000
|
tx.addInput({
|
|
21694
22001
|
txid: vtxo.txid,
|
|
21695
22002
|
index: vtxo.vout,
|
|
@@ -21714,7 +22021,7 @@ async function buildSignedSweep(params) {
|
|
|
21714
22021
|
finalScriptWitness: [
|
|
21715
22022
|
tapScriptSig[0][1],
|
|
21716
22023
|
...path.extraWitness,
|
|
21717
|
-
|
|
22024
|
+
chunk5MLC2HU3_cjs.scriptFromTapLeafScript(path.leaf),
|
|
21718
22025
|
btcSigner.TaprootControlBlock.encode(controlBlock)
|
|
21719
22026
|
]
|
|
21720
22027
|
});
|
|
@@ -21744,7 +22051,7 @@ async function resolveFeeRate(opts) {
|
|
|
21744
22051
|
}
|
|
21745
22052
|
async function selectExitVtxos(opts) {
|
|
21746
22053
|
if (!opts.vtxos) return opts.wallet.getVtxos();
|
|
21747
|
-
const res = await
|
|
22054
|
+
const res = await chunk5MLC2HU3_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
|
|
21748
22055
|
const tapTrees = /* @__PURE__ */ new Map();
|
|
21749
22056
|
const out = [];
|
|
21750
22057
|
for (const vtxo of res.vtxos) {
|
|
@@ -21759,7 +22066,7 @@ async function selectExitVtxos(opts) {
|
|
|
21759
22066
|
`no contract registered for vtxo script ${vtxo.script} \u2014 register the contract before exiting`
|
|
21760
22067
|
);
|
|
21761
22068
|
}
|
|
21762
|
-
const handler =
|
|
22069
|
+
const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
|
|
21763
22070
|
if (!handler) {
|
|
21764
22071
|
throw new Error(`no contract handler registered for type '${contract.type}'`);
|
|
21765
22072
|
}
|
|
@@ -21789,7 +22096,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
21789
22096
|
if (pendingNodes.length > 0) {
|
|
21790
22097
|
const txs = await resolver.getVirtualTxs(pendingNodes.map((n) => n.txid));
|
|
21791
22098
|
for (const psbt of txs) {
|
|
21792
|
-
psbts.set(
|
|
22099
|
+
psbts.set(chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
21793
22100
|
}
|
|
21794
22101
|
}
|
|
21795
22102
|
const childVsize = Number(
|
|
@@ -21825,7 +22132,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
21825
22132
|
try {
|
|
21826
22133
|
const resolved = await resolveUnilateralPath({
|
|
21827
22134
|
vtxo,
|
|
21828
|
-
scriptHex: base.hex.encode(
|
|
22135
|
+
scriptHex: base.hex.encode(chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
|
|
21829
22136
|
contractRepository: wallet.contractRepository,
|
|
21830
22137
|
walletPubKeyHex,
|
|
21831
22138
|
currentTime: Date.now()
|
|
@@ -21844,7 +22151,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
21844
22151
|
});
|
|
21845
22152
|
continue;
|
|
21846
22153
|
}
|
|
21847
|
-
const t =
|
|
22154
|
+
const t = chunk5MLC2HU3_cjs.sequenceToTimelock(resolved.selection.sequence);
|
|
21848
22155
|
const delay = { type: t.type, value: Number(t.value) };
|
|
21849
22156
|
infos.push({ outpoint, value: vtxo.value, sweepFee, path: resolved.label, delay });
|
|
21850
22157
|
sweeps.push({ vtxo, resolved, sweepFee, delay });
|
|
@@ -22245,7 +22552,7 @@ async function prepare(opts) {
|
|
|
22245
22552
|
txid: sweep.vtxo.txid,
|
|
22246
22553
|
vout: sweep.vtxo.vout,
|
|
22247
22554
|
value: sweep.vtxo.value,
|
|
22248
|
-
pkScript:
|
|
22555
|
+
pkScript: chunk5MLC2HU3_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
|
|
22249
22556
|
},
|
|
22250
22557
|
path: sweep.resolved.selection,
|
|
22251
22558
|
outputAddress: opts.sweepAddress,
|
|
@@ -22333,7 +22640,7 @@ async function prepare(opts) {
|
|
|
22333
22640
|
if (newFee <= splitterFee) break;
|
|
22334
22641
|
splitterFee = newFee;
|
|
22335
22642
|
}
|
|
22336
|
-
const splitter = new
|
|
22643
|
+
const splitter = new chunk5MLC2HU3_cjs.Transaction({ version: 2 });
|
|
22337
22644
|
for (const coin of selected.inputs) {
|
|
22338
22645
|
splitter.addInput({
|
|
22339
22646
|
txid: coin.txid,
|
|
@@ -22477,41 +22784,41 @@ var UnilateralExit = {
|
|
|
22477
22784
|
// src/arkade/index.ts
|
|
22478
22785
|
var arkade_exports = {};
|
|
22479
22786
|
chunk5BLDMQED_cjs.__export(arkade_exports, {
|
|
22480
|
-
ARKADE_OP: () =>
|
|
22481
|
-
ARKADE_OPCODES: () =>
|
|
22482
|
-
ARKADE_OPCODE_NAMES: () =>
|
|
22483
|
-
ARKADE_OPCODE_VALUES: () =>
|
|
22484
|
-
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,
|
|
22485
22792
|
Arkade: () => Arkade,
|
|
22486
22793
|
ArkadeContract: () => ArkadeContract,
|
|
22487
|
-
ArkadeProgramScript: () =>
|
|
22488
|
-
ArkadeScript: () =>
|
|
22794
|
+
ArkadeProgramScript: () => chunkWIFL5QYZ_cjs.ArkadeProgramScript,
|
|
22795
|
+
ArkadeScript: () => chunkWIFL5QYZ_cjs.ArkadeScript,
|
|
22489
22796
|
ArkadeTransactionBuilder: () => ArkadeTransactionBuilder,
|
|
22490
|
-
BigNum: () =>
|
|
22797
|
+
BigNum: () => chunkWIFL5QYZ_cjs.bignum_exports,
|
|
22491
22798
|
OP: () => btcSigner.OP,
|
|
22492
|
-
OPCODE_NAMES: () =>
|
|
22493
|
-
OPCODE_VALUES: () =>
|
|
22494
|
-
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,
|
|
22495
22802
|
Script: () => btcSigner.Script,
|
|
22496
|
-
arkadeScriptHash: () =>
|
|
22497
|
-
arkadeWitnessHash: () =>
|
|
22498
|
-
asmToBytes: () =>
|
|
22499
|
-
bytesToASM: () =>
|
|
22500
|
-
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,
|
|
22501
22808
|
createArkadeBatchHandler: () => createArkadeBatchHandler,
|
|
22502
|
-
deserializeArkadeContractParams: () =>
|
|
22503
|
-
fromASM: () =>
|
|
22504
|
-
getOpcodeName: () =>
|
|
22505
|
-
getOpcodeValue: () =>
|
|
22506
|
-
parseArtifact: () =>
|
|
22507
|
-
resolveAsm: () =>
|
|
22508
|
-
serializeArkadeContractParams: () =>
|
|
22509
|
-
stringifyArtifact: () =>
|
|
22510
|
-
toASM: () =>
|
|
22511
|
-
validateProgram: () =>
|
|
22512
|
-
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
|
|
22513
22820
|
});
|
|
22514
|
-
var isVtxoCoin = (input) =>
|
|
22821
|
+
var isVtxoCoin = (input) => chunk5MLC2HU3_cjs.isVirtualCoin(input);
|
|
22515
22822
|
function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message, session, arkProvider, emulator, network, recipients, batchExpiryPolicy) {
|
|
22516
22823
|
let batchId;
|
|
22517
22824
|
let sweepTapTreeRoot;
|
|
@@ -22532,23 +22839,23 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
22532
22839
|
);
|
|
22533
22840
|
await arkProvider.confirmRegistration(intentId);
|
|
22534
22841
|
batchId = event.id;
|
|
22535
|
-
const sweepTapscript =
|
|
22842
|
+
const sweepTapscript = chunk5MLC2HU3_cjs.CSVMultisigTapscript.encode({
|
|
22536
22843
|
timelock,
|
|
22537
|
-
pubkeys: [
|
|
22844
|
+
pubkeys: [chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(info.forfeitPubkey), "forfeit key")]
|
|
22538
22845
|
}).script;
|
|
22539
22846
|
sweepTapTreeRoot = payment_js.tapLeafHash(sweepTapscript);
|
|
22540
22847
|
return { skip: false };
|
|
22541
22848
|
},
|
|
22542
22849
|
onTreeSigningStarted: async (event, vtxoTree) => {
|
|
22543
22850
|
const signerPubKey = await session.getPublicKey();
|
|
22544
|
-
const xonlySignerPubKey =
|
|
22851
|
+
const xonlySignerPubKey = chunkWIFL5QYZ_cjs.toXOnly(signerPubKey, "signer key");
|
|
22545
22852
|
const xOnlyPubkeys = event.cosignersPublicKeys.map(
|
|
22546
|
-
(k) => base.hex.encode(
|
|
22853
|
+
(k) => base.hex.encode(chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
|
|
22547
22854
|
);
|
|
22548
22855
|
if (!xOnlyPubkeys.includes(base.hex.encode(xonlySignerPubKey))) {
|
|
22549
22856
|
return { skip: true };
|
|
22550
22857
|
}
|
|
22551
|
-
const commitmentTx =
|
|
22858
|
+
const commitmentTx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
|
|
22552
22859
|
validateVtxoTxGraph(vtxoTree, commitmentTx, sweepTapTreeRoot);
|
|
22553
22860
|
if (recipients && recipients.length > 0) {
|
|
22554
22861
|
validateBatchRecipients(commitmentTx, vtxoTree.leaves(), recipients, network);
|
|
@@ -22580,7 +22887,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
22580
22887
|
if (connectorTree) {
|
|
22581
22888
|
validateConnectorsTxGraph(event.commitmentTx, connectorTree);
|
|
22582
22889
|
}
|
|
22583
|
-
let commitmentPsbt =
|
|
22890
|
+
let commitmentPsbt = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
|
|
22584
22891
|
assertFinalCommitmentMatchesValidated(
|
|
22585
22892
|
commitmentPsbt,
|
|
22586
22893
|
validatedCommitmentTxid,
|
|
@@ -22615,7 +22922,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
22615
22922
|
boardingIndices.push(boardingIdx);
|
|
22616
22923
|
continue;
|
|
22617
22924
|
}
|
|
22618
|
-
if (
|
|
22925
|
+
if (chunk5MLC2HU3_cjs.isRecoverable(input) || isSubdust(input, info.dust)) {
|
|
22619
22926
|
continue;
|
|
22620
22927
|
}
|
|
22621
22928
|
if (connectorIndex >= connectorLeaves.length) {
|
|
@@ -22636,7 +22943,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
22636
22943
|
index: input.vout,
|
|
22637
22944
|
witnessUtxo: {
|
|
22638
22945
|
amount: BigInt(input.value),
|
|
22639
|
-
script:
|
|
22946
|
+
script: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
22640
22947
|
},
|
|
22641
22948
|
sighashType: btcSigner.SigHash.DEFAULT,
|
|
22642
22949
|
tapLeafScript: [input.forfeitTapLeafScript]
|
|
@@ -22727,16 +23034,16 @@ var Arkade = class _Arkade {
|
|
|
22727
23034
|
/** Connect and resolve the server key, checkpoint closure and (if present) the co-signer key. */
|
|
22728
23035
|
static async connect(opts) {
|
|
22729
23036
|
const info = await opts.arkade.getInfo();
|
|
22730
|
-
const serverKey =
|
|
22731
|
-
const checkpoint =
|
|
22732
|
-
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;
|
|
22733
23040
|
let emulatorKey;
|
|
22734
23041
|
if (opts.emulator) {
|
|
22735
|
-
emulatorKey = base.hex.decode(
|
|
23042
|
+
emulatorKey = base.hex.decode(chunk5MLC2HU3_cjs.resolveEmulatorPubkey(network, opts.emulatorPubkey));
|
|
22736
23043
|
}
|
|
22737
23044
|
let userKey;
|
|
22738
23045
|
if (opts.identity) {
|
|
22739
|
-
userKey =
|
|
23046
|
+
userKey = chunkWIFL5QYZ_cjs.toXOnly(await opts.identity.xOnlyPublicKey(), "identity key");
|
|
22740
23047
|
}
|
|
22741
23048
|
return new _Arkade({
|
|
22742
23049
|
arkProvider: opts.arkade,
|
|
@@ -22762,7 +23069,7 @@ var Arkade = class _Arkade {
|
|
|
22762
23069
|
* key respectively; explicit args always win.
|
|
22763
23070
|
*/
|
|
22764
23071
|
contract(program, args = {}) {
|
|
22765
|
-
const declared = (program.params ?? []).map(
|
|
23072
|
+
const declared = (program.params ?? []).map(chunkWIFL5QYZ_cjs.inputName);
|
|
22766
23073
|
if (declared.includes("server") && args.server === void 0) {
|
|
22767
23074
|
args = { ...args, server: this.serverKey };
|
|
22768
23075
|
}
|
|
@@ -22782,7 +23089,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
22782
23089
|
userKey: client.userKey,
|
|
22783
23090
|
emulatorKey: client.emulatorKey
|
|
22784
23091
|
};
|
|
22785
|
-
this.vtxoScript = new
|
|
23092
|
+
this.vtxoScript = new chunkWIFL5QYZ_cjs.ArkadeProgramScript(program, args, this.keys);
|
|
22786
23093
|
this.tapTree = this.vtxoScript.encode();
|
|
22787
23094
|
this.compiled = this.vtxoScript.compiled;
|
|
22788
23095
|
}
|
|
@@ -22810,7 +23117,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
22810
23117
|
`ArkadeContract.fromContract: expected contract type 'arkade', got '${contract.type}'`
|
|
22811
23118
|
);
|
|
22812
23119
|
}
|
|
22813
|
-
const typed =
|
|
23120
|
+
const typed = chunkWIFL5QYZ_cjs.deserializeArkadeContractParams(contract.params);
|
|
22814
23121
|
return new _ArkadeContract(client, typed.program, typed.args, {
|
|
22815
23122
|
serverKey: typed.serverKey,
|
|
22816
23123
|
userKey: typed.userKey,
|
|
@@ -22851,7 +23158,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
22851
23158
|
toContractParams() {
|
|
22852
23159
|
return {
|
|
22853
23160
|
type: "arkade",
|
|
22854
|
-
params:
|
|
23161
|
+
params: chunkWIFL5QYZ_cjs.serializeArkadeContractParams({
|
|
22855
23162
|
program: this.program,
|
|
22856
23163
|
args: this.args,
|
|
22857
23164
|
serverKey: this.keys.serverKey,
|
|
@@ -22901,18 +23208,18 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
22901
23208
|
if (registered) {
|
|
22902
23209
|
const [withVtxos] = await manager.getContractsWithVtxos({ script: scriptHex });
|
|
22903
23210
|
return (withVtxos?.vtxos ?? []).filter(
|
|
22904
|
-
(v) => !
|
|
23211
|
+
(v) => !chunk5MLC2HU3_cjs.hasTerminalSpend(v) && !v.isUnrolled
|
|
22905
23212
|
);
|
|
22906
23213
|
}
|
|
22907
23214
|
}
|
|
22908
23215
|
if (!this.client.indexer) {
|
|
22909
23216
|
throw new Error("ArkadeContract.getUtxos: an indexer is required");
|
|
22910
23217
|
}
|
|
22911
|
-
const { vtxos } = await
|
|
23218
|
+
const { vtxos } = await chunk5MLC2HU3_cjs.getNormalizedVtxos(this.client.indexer, {
|
|
22912
23219
|
scripts: [scriptHex],
|
|
22913
23220
|
spendableOnly: true
|
|
22914
23221
|
});
|
|
22915
|
-
return vtxos.filter((v) => !
|
|
23222
|
+
return vtxos.filter((v) => !chunk5MLC2HU3_cjs.hasTerminalSpend(v) && !v.isUnrolled);
|
|
22916
23223
|
}
|
|
22917
23224
|
/** Total spendable balance (requires an indexer). */
|
|
22918
23225
|
async getBalance() {
|
|
@@ -23010,7 +23317,7 @@ var ArkadeTransactionBuilder = class {
|
|
|
23010
23317
|
this.contract.client.checkpoint
|
|
23011
23318
|
);
|
|
23012
23319
|
if (coin.sourceTx) {
|
|
23013
|
-
|
|
23320
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(arkTx, 0, chunk5MLC2HU3_cjs.PrevArkTxField, coin.sourceTx);
|
|
23014
23321
|
}
|
|
23015
23322
|
if (this.fn.arkadeScript) {
|
|
23016
23323
|
const indexer = this.contract.client.indexer;
|
|
@@ -23027,8 +23334,8 @@ var ArkadeTransactionBuilder = class {
|
|
|
23027
23334
|
}
|
|
23028
23335
|
const condition = (def.tapscript.witness ?? []).map((w) => this.witnessBytes(w));
|
|
23029
23336
|
if (condition.length > 0) {
|
|
23030
|
-
|
|
23031
|
-
|
|
23337
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(arkTx, 0, chunk5MLC2HU3_cjs.ConditionWitness, condition);
|
|
23338
|
+
chunk5MLC2HU3_cjs.setArkPsbtField(checkpoints[0], 0, chunk5MLC2HU3_cjs.ConditionWitness, condition);
|
|
23032
23339
|
}
|
|
23033
23340
|
const packets = [];
|
|
23034
23341
|
if (this.assetSpecs.length > 0) {
|
|
@@ -23067,7 +23374,7 @@ var ArkadeTransactionBuilder = class {
|
|
|
23067
23374
|
base.base64.encode(signedArk2.toPSBT()),
|
|
23068
23375
|
signedCps.map((c) => base.base64.encode(c.toPSBT()))
|
|
23069
23376
|
);
|
|
23070
|
-
const txid =
|
|
23377
|
+
const txid = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
|
|
23071
23378
|
return {
|
|
23072
23379
|
txid,
|
|
23073
23380
|
signedArkTx: res2.signedArkTx,
|
|
@@ -23126,23 +23433,23 @@ var ArkadeTransactionBuilder = class {
|
|
|
23126
23433
|
}
|
|
23127
23434
|
buildAssetPacket() {
|
|
23128
23435
|
const groups = this.assetSpecs.map((s) => {
|
|
23129
|
-
const id = typeof s.assetId === "string" ?
|
|
23130
|
-
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(
|
|
23131
23438
|
id,
|
|
23132
23439
|
null,
|
|
23133
|
-
s.inputs.map((i) =>
|
|
23134
|
-
s.outputs.map((o) =>
|
|
23135
|
-
(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))
|
|
23136
23443
|
);
|
|
23137
23444
|
});
|
|
23138
|
-
return
|
|
23445
|
+
return chunkGVHUHTRH_cjs.Packet.create(groups);
|
|
23139
23446
|
}
|
|
23140
23447
|
witnessBytes(ref) {
|
|
23141
|
-
return
|
|
23448
|
+
return chunkWIFL5QYZ_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
|
|
23142
23449
|
}
|
|
23143
23450
|
};
|
|
23144
23451
|
function bindInputs(fn, callArgs) {
|
|
23145
|
-
const names = (fn.def.inputs ?? []).map(
|
|
23452
|
+
const names = (fn.def.inputs ?? []).map(chunkWIFL5QYZ_cjs.inputName);
|
|
23146
23453
|
if (callArgs.length !== names.length) {
|
|
23147
23454
|
throw new Error(`${fn.name}: expected ${names.length} argument(s), got ${callArgs.length}`);
|
|
23148
23455
|
}
|
|
@@ -23533,6 +23840,7 @@ function createDefaultPaymentRouter(wallet) {
|
|
|
23533
23840
|
exports.ARKADE_MAGIC = ARKADE_MAGIC;
|
|
23534
23841
|
exports.ARKADE_SALTED_PREIMAGE_TAG = ARKADE_SALTED_PREIMAGE_TAG;
|
|
23535
23842
|
exports.ARKADE_SWAP_PREIMAGE_TAG = ARKADE_SWAP_PREIMAGE_TAG;
|
|
23843
|
+
exports.AbortError = AbortError;
|
|
23536
23844
|
exports.ActivityRegistry = ActivityRegistry;
|
|
23537
23845
|
exports.AmbiguousRouteError = AmbiguousRouteError;
|
|
23538
23846
|
exports.ArkNote = ArkNote;
|
|
@@ -23747,5 +24055,5 @@ exports.verifyTapscriptSignatures = verifyTapscriptSignatures;
|
|
|
23747
24055
|
exports.waitForIncomingFunds = waitForIncomingFunds;
|
|
23748
24056
|
exports.warnAndFilterVtxosForScript = warnAndFilterVtxosForScript;
|
|
23749
24057
|
exports.withPrevTxs = withPrevTxs;
|
|
23750
|
-
//# sourceMappingURL=chunk-
|
|
23751
|
-
//# sourceMappingURL=chunk-
|
|
24058
|
+
//# sourceMappingURL=chunk-EBYCTLET.cjs.map
|
|
24059
|
+
//# sourceMappingURL=chunk-EBYCTLET.cjs.map
|