@arkade-os/sdk 0.4.71 → 0.4.72
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 +29 -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-CjKAUiuj.d.ts → asyncStorageTaskQueue-DhhNZc4v.d.ts} +2 -2
- package/dist/{asyncStorageTaskQueue-DgXf4iuU.d.cts → asyncStorageTaskQueue-s5lUGWxu.d.cts} +2 -2
- package/dist/{chunk-I7ZNWBBU.cjs → chunk-4BWZ437E.cjs} +21 -17
- package/dist/chunk-4BWZ437E.cjs.map +1 -0
- package/dist/{chunk-FM263GKH.cjs → chunk-4C5PMGBB.cjs} +51 -25
- package/dist/chunk-4C5PMGBB.cjs.map +1 -0
- package/dist/{chunk-2ZX4Z2IP.js → chunk-5GQFYVWP.js} +30 -5
- package/dist/chunk-5GQFYVWP.js.map +1 -0
- package/dist/{chunk-5J5PDZRR.cjs → chunk-6FTHFJAN.cjs} +30 -4
- package/dist/chunk-6FTHFJAN.cjs.map +1 -0
- package/dist/{chunk-E5JNYFOF.js → chunk-BHLYB44A.js} +210 -53
- package/dist/chunk-BHLYB44A.js.map +1 -0
- package/dist/{chunk-ALZ2CZ3T.js → chunk-CB6QPAO5.js} +3 -3
- package/dist/{chunk-ALZ2CZ3T.js.map → chunk-CB6QPAO5.js.map} +1 -1
- package/dist/{chunk-NOWVA5CM.js → chunk-CZPBPMO2.js} +4 -4
- package/dist/{chunk-NOWVA5CM.js.map → chunk-CZPBPMO2.js.map} +1 -1
- package/dist/{chunk-ZT3EM4CE.js → chunk-IGER5FPC.js} +37 -11
- package/dist/chunk-IGER5FPC.js.map +1 -0
- package/dist/{chunk-7PHMT3T4.cjs → chunk-KDMHEWTD.cjs} +10 -10
- package/dist/{chunk-7PHMT3T4.cjs.map → chunk-KDMHEWTD.cjs.map} +1 -1
- package/dist/{chunk-P6EXRY5L.cjs → chunk-NPM5YZBC.cjs} +49 -49
- package/dist/{chunk-P6EXRY5L.cjs.map → chunk-NPM5YZBC.cjs.map} +1 -1
- package/dist/{chunk-SCSLCU66.js → chunk-S5PUFSXC.js} +8 -4
- package/dist/chunk-S5PUFSXC.js.map +1 -0
- package/dist/{chunk-MK5EPTTB.cjs → chunk-U5I3ITV7.cjs} +643 -485
- package/dist/chunk-U5I3ITV7.cjs.map +1 -0
- 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-D-gEEqrP.d.cts → delegate-BJp8f6LT.d.cts} +1 -1
- package/dist/{delegate-CKJdsC99.d.ts → delegate-Ckz_TWzM.d.ts} +1 -1
- package/dist/{hdWalletCapable-CwLPmWct.d.cts → hdWalletCapable-DA9bJ5eB.d.cts} +2 -2
- package/dist/{hdWalletCapable-BJ4pvkai.d.ts → hdWalletCapable-DABgAD-T.d.ts} +2 -2
- package/dist/{index-Boppyqav.d.ts → index-B8xrELXY.d.ts} +2 -2
- package/dist/{index-BE1uFXrV.d.cts → index-DSbDm0Io.d.cts} +2 -2
- package/dist/{index-CyGnhCSS.d.ts → index-Dg0-TvBQ.d.cts} +51 -3
- package/dist/{index-CyGnhCSS.d.cts → index-Dg0-TvBQ.d.ts} +51 -3
- package/dist/index.cjs +306 -298
- package/dist/index.d.cts +54 -10
- package/dist/index.d.ts +54 -10
- 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-CjmMH_rW.d.cts → taskRunner-BH_FxaNI.d.cts} +2 -2
- package/dist/{taskRunner-l3zyfW_Q.d.ts → taskRunner-DrVz2QZs.d.ts} +2 -2
- package/dist/wallet/expo/background.cjs +14 -14
- package/dist/wallet/expo/background.d.cts +3 -3
- package/dist/wallet/expo/background.d.ts +3 -3
- package/dist/wallet/expo/background.js +6 -6
- package/dist/wallet/expo/index.cjs +14 -14
- package/dist/wallet/expo/index.d.cts +4 -4
- package/dist/wallet/expo/index.d.ts +4 -4
- package/dist/wallet/expo/index.js +5 -5
- package/dist/worker/expo/index.cjs +9 -9
- package/dist/worker/expo/index.d.cts +4 -4
- package/dist/worker/expo/index.d.ts +4 -4
- package/dist/worker/expo/index.js +5 -5
- package/package.json +1 -1
- package/dist/chunk-2ZX4Z2IP.js.map +0 -1
- package/dist/chunk-5J5PDZRR.cjs.map +0 -1
- package/dist/chunk-E5JNYFOF.js.map +0 -1
- package/dist/chunk-FM263GKH.cjs.map +0 -1
- package/dist/chunk-I7ZNWBBU.cjs.map +0 -1
- package/dist/chunk-MK5EPTTB.cjs.map +0 -1
- package/dist/chunk-SCSLCU66.js.map +0 -1
- package/dist/chunk-ZT3EM4CE.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var chunk4C5PMGBB_cjs = require('./chunk-4C5PMGBB.cjs');
|
|
4
|
+
var chunkNPM5YZBC_cjs = require('./chunk-NPM5YZBC.cjs');
|
|
5
|
+
var chunk6FTHFJAN_cjs = require('./chunk-6FTHFJAN.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 = chunk6FTHFJAN_cjs.getArkPsbtFields(tx.root, 0, chunk6FTHFJAN_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 = chunk6FTHFJAN_cjs.getArkPsbtFields(g.root, 0, chunk6FTHFJAN_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
|
+
chunk6FTHFJAN_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 = chunkNPM5YZBC_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 chunkNPM5YZBC_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 = chunkNPM5YZBC_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
|
+
chunk6FTHFJAN_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 = chunkNPM5YZBC_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 chunkNPM5YZBC_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 chunkNPM5YZBC_cjs.deriveDescriptorLeafPubKey(this.descriptor);
|
|
882
882
|
}
|
|
883
883
|
async compressedPublicKey() {
|
|
884
|
-
return
|
|
884
|
+
return chunkNPM5YZBC_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 && chunkNPM5YZBC_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 = chunkNPM5YZBC_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 chunkNPM5YZBC_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 chunkNPM5YZBC_cjs.identityDescriptor(wallet.identity);
|
|
1337
1337
|
}
|
|
1338
1338
|
async function provisionRefundKey(wallet) {
|
|
1339
|
-
const descriptor = await
|
|
1339
|
+
const descriptor = await chunkNPM5YZBC_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 } = chunk6FTHFJAN_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 = chunkNPM5YZBC_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 chunk6FTHFJAN_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: chunk6FTHFJAN_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 chunk6FTHFJAN_cjs.rateGate.runHttp(url, () => chunk6FTHFJAN_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[chunk6FTHFJAN_cjs.DEFAULT_NETWORK_NAME], opts) {
|
|
1667
1667
|
this.baseUrl = baseUrl;
|
|
1668
1668
|
this.pollingInterval = opts?.pollingInterval ?? 15e3;
|
|
1669
1669
|
this.forcePolling = opts?.forcePolling ?? false;
|
|
@@ -1682,14 +1682,14 @@ var EsploraProvider = class {
|
|
|
1682
1682
|
*/
|
|
1683
1683
|
addressWatches = /* @__PURE__ */ new Map();
|
|
1684
1684
|
async getCoins(address) {
|
|
1685
|
-
const response = await
|
|
1685
|
+
const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
|
|
1686
1686
|
if (!response.ok) {
|
|
1687
1687
|
throw new Error(`Failed to fetch UTXOs: ${response.statusText}`);
|
|
1688
1688
|
}
|
|
1689
1689
|
return response.json();
|
|
1690
1690
|
}
|
|
1691
1691
|
async getFeeRate() {
|
|
1692
|
-
const response = await
|
|
1692
|
+
const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
|
|
1693
1693
|
if (response.status === 404) {
|
|
1694
1694
|
return void 0;
|
|
1695
1695
|
}
|
|
@@ -1710,7 +1710,7 @@ var EsploraProvider = class {
|
|
|
1710
1710
|
}
|
|
1711
1711
|
}
|
|
1712
1712
|
async getTxOutspends(txid) {
|
|
1713
|
-
const response = await
|
|
1713
|
+
const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
|
|
1714
1714
|
if (!response.ok) {
|
|
1715
1715
|
const error = await response.text();
|
|
1716
1716
|
throw new Error(`Failed to get transaction outspends: ${error}`);
|
|
@@ -1718,7 +1718,7 @@ var EsploraProvider = class {
|
|
|
1718
1718
|
return response.json();
|
|
1719
1719
|
}
|
|
1720
1720
|
async getTransactions(address) {
|
|
1721
|
-
const response = await
|
|
1721
|
+
const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
|
|
1722
1722
|
if (!response.ok) {
|
|
1723
1723
|
const error = await response.text();
|
|
1724
1724
|
throw new Error(`Failed to get transactions: ${error}`);
|
|
@@ -1731,14 +1731,14 @@ var EsploraProvider = class {
|
|
|
1731
1731
|
* usable as a change probe for the polling fallback.
|
|
1732
1732
|
*/
|
|
1733
1733
|
async getAddressStats(address) {
|
|
1734
|
-
const response = await
|
|
1734
|
+
const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/address/${address}`);
|
|
1735
1735
|
if (!response.ok) {
|
|
1736
1736
|
throw new Error(`Failed to get address stats: ${response.statusText}`);
|
|
1737
1737
|
}
|
|
1738
1738
|
return response.json();
|
|
1739
1739
|
}
|
|
1740
1740
|
async getRawTransaction(txid) {
|
|
1741
|
-
const response = await
|
|
1741
|
+
const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/hex`);
|
|
1742
1742
|
if (!response.ok) {
|
|
1743
1743
|
const error = await response.text();
|
|
1744
1744
|
throw new Error(`Failed to get raw transaction ${txid}: ${error}`);
|
|
@@ -1746,7 +1746,7 @@ var EsploraProvider = class {
|
|
|
1746
1746
|
return base.hex.decode((await response.text()).trim());
|
|
1747
1747
|
}
|
|
1748
1748
|
async getTxStatus(txid) {
|
|
1749
|
-
const txresponse = await
|
|
1749
|
+
const txresponse = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
|
|
1750
1750
|
if (!txresponse.ok) {
|
|
1751
1751
|
throw new Error(txresponse.statusText);
|
|
1752
1752
|
}
|
|
@@ -1754,7 +1754,7 @@ var EsploraProvider = class {
|
|
|
1754
1754
|
if (!tx.status.confirmed) {
|
|
1755
1755
|
return { confirmed: false };
|
|
1756
1756
|
}
|
|
1757
|
-
const response = await
|
|
1757
|
+
const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
|
|
1758
1758
|
if (!response.ok) {
|
|
1759
1759
|
throw new Error(`Failed to get transaction status: ${response.statusText}`);
|
|
1760
1760
|
}
|
|
@@ -2038,9 +2038,9 @@ var EsploraProvider = class {
|
|
|
2038
2038
|
return { subscribers, teardown, started };
|
|
2039
2039
|
}
|
|
2040
2040
|
async getChainTip() {
|
|
2041
|
-
let tipBlocks = await
|
|
2041
|
+
let tipBlocks = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/blocks`);
|
|
2042
2042
|
if (tipBlocks.status === 404) {
|
|
2043
|
-
tipBlocks = await
|
|
2043
|
+
tipBlocks = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/v1/blocks`);
|
|
2044
2044
|
}
|
|
2045
2045
|
if (!tipBlocks.ok) {
|
|
2046
2046
|
throw new Error(`Failed to get chain tip: ${tipBlocks.statusText}`);
|
|
@@ -2062,7 +2062,7 @@ var EsploraProvider = class {
|
|
|
2062
2062
|
};
|
|
2063
2063
|
}
|
|
2064
2064
|
async broadcastPackage(parent, child) {
|
|
2065
|
-
const response = await
|
|
2065
|
+
const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
|
|
2066
2066
|
method: "POST",
|
|
2067
2067
|
headers: {
|
|
2068
2068
|
"Content-Type": "application/json"
|
|
@@ -2078,7 +2078,7 @@ var EsploraProvider = class {
|
|
|
2078
2078
|
return result;
|
|
2079
2079
|
}
|
|
2080
2080
|
async broadcastTx(tx) {
|
|
2081
|
-
const response = await
|
|
2081
|
+
const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/tx`, {
|
|
2082
2082
|
method: "POST",
|
|
2083
2083
|
headers: {
|
|
2084
2084
|
"Content-Type": "text/plain"
|
|
@@ -2261,7 +2261,7 @@ function findP2AOutput(tx) {
|
|
|
2261
2261
|
var CHILD_DUST_AMOUNT = 546;
|
|
2262
2262
|
function buildAnchorChild(params) {
|
|
2263
2263
|
const { parent, feeRate, fundingCoins, changeAddress, tapInternalKey, network } = params;
|
|
2264
|
-
const child = new
|
|
2264
|
+
const child = new chunk6FTHFJAN_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
|
|
2265
2265
|
child.addInput(findP2AOutput(parent));
|
|
2266
2266
|
const estimator = TxWeightEstimator.create().addP2AInput();
|
|
2267
2267
|
for (const _ of fundingCoins) {
|
|
@@ -2309,7 +2309,7 @@ function buildForfeitTx(inputs, forfeitPkScript, txLocktime) {
|
|
|
2309
2309
|
);
|
|
2310
2310
|
}
|
|
2311
2311
|
function buildForfeitTxWithOutput(inputs, output, txLocktime) {
|
|
2312
|
-
const tx = new
|
|
2312
|
+
const tx = new chunk6FTHFJAN_cjs.Transaction({
|
|
2313
2313
|
version: 3,
|
|
2314
2314
|
lockTime: txLocktime
|
|
2315
2315
|
});
|
|
@@ -2385,7 +2385,7 @@ function validateVtxoTxGraph(graph, roundTransaction, sweepTapTreeRoot) {
|
|
|
2385
2385
|
if (previousScriptKey.length !== 32) {
|
|
2386
2386
|
throw new Error(`parent output ${childIndex} has invalid script`);
|
|
2387
2387
|
}
|
|
2388
|
-
const cosigners =
|
|
2388
|
+
const cosigners = chunk6FTHFJAN_cjs.getArkPsbtFields(child.root, 0, chunk6FTHFJAN_cjs.CosignerPublicKey);
|
|
2389
2389
|
if (cosigners.length === 0) {
|
|
2390
2390
|
throw ErrMissingCosignersPublicKeys;
|
|
2391
2391
|
}
|
|
@@ -2443,7 +2443,7 @@ var EmulatorPacket = class _EmulatorPacket {
|
|
|
2443
2443
|
return new _EmulatorPacket(entries);
|
|
2444
2444
|
}
|
|
2445
2445
|
static fromBytes(data) {
|
|
2446
|
-
const reader = new
|
|
2446
|
+
const reader = new chunk4C5PMGBB_cjs.BufferReader(data);
|
|
2447
2447
|
const entryCount = reader.readCompactSize();
|
|
2448
2448
|
const entries = [];
|
|
2449
2449
|
for (let i = 0; i < entryCount; i++) {
|
|
@@ -2461,7 +2461,7 @@ var EmulatorPacket = class _EmulatorPacket {
|
|
|
2461
2461
|
return _EmulatorPacket.PACKET_TYPE;
|
|
2462
2462
|
}
|
|
2463
2463
|
serialize() {
|
|
2464
|
-
const writer = new
|
|
2464
|
+
const writer = new chunk4C5PMGBB_cjs.BufferWriter();
|
|
2465
2465
|
writer.writeCompactSize(this.entries.length);
|
|
2466
2466
|
for (const entry of this.entries) {
|
|
2467
2467
|
writer.writeUint16LE(entry.vin);
|
|
@@ -2548,7 +2548,7 @@ var Extension = class _Extension {
|
|
|
2548
2548
|
`expected magic prefix ${base.hex.encode(ARKADE_MAGIC)}, got ${base.hex.encode(payload.slice(0, Math.min(payload.length, ARKADE_MAGIC.length)))}`
|
|
2549
2549
|
);
|
|
2550
2550
|
}
|
|
2551
|
-
const reader = new
|
|
2551
|
+
const reader = new chunk4C5PMGBB_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
|
|
2552
2552
|
const packets = [];
|
|
2553
2553
|
while (reader.remaining() > 0) {
|
|
2554
2554
|
const packetType = reader.readByte();
|
|
@@ -2622,7 +2622,7 @@ var Extension = class _Extension {
|
|
|
2622
2622
|
*/
|
|
2623
2623
|
getAssetPacket() {
|
|
2624
2624
|
for (const p of this.packets) {
|
|
2625
|
-
if (p instanceof
|
|
2625
|
+
if (p instanceof chunk4C5PMGBB_cjs.Packet) {
|
|
2626
2626
|
return p;
|
|
2627
2627
|
}
|
|
2628
2628
|
}
|
|
@@ -2660,8 +2660,8 @@ var Extension = class _Extension {
|
|
|
2660
2660
|
};
|
|
2661
2661
|
function parsePacket(packetType, data) {
|
|
2662
2662
|
switch (packetType) {
|
|
2663
|
-
case
|
|
2664
|
-
return
|
|
2663
|
+
case chunk4C5PMGBB_cjs.Packet.PACKET_TYPE:
|
|
2664
|
+
return chunk4C5PMGBB_cjs.Packet.fromBytes(data);
|
|
2665
2665
|
case EmulatorPacket.PACKET_TYPE:
|
|
2666
2666
|
return EmulatorPacket.fromBytes(data);
|
|
2667
2667
|
default:
|
|
@@ -2708,16 +2708,16 @@ function buildOpReturnScript(data) {
|
|
|
2708
2708
|
}
|
|
2709
2709
|
return script;
|
|
2710
2710
|
}
|
|
2711
|
-
var ErrOffchainOutputNotFound = (address) => new
|
|
2712
|
-
var ErrInvalidAssetOutputAmount = (got, want, assetId) => new
|
|
2711
|
+
var ErrOffchainOutputNotFound = (address) => new chunk6FTHFJAN_cjs.ServerResponseMismatchError(`offchain send output not found: ${address}`);
|
|
2712
|
+
var ErrInvalidAssetOutputAmount = (got, want, assetId) => new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
2713
2713
|
`invalid asset output amount for ${assetId}: got ${got}, want ${want}`
|
|
2714
2714
|
);
|
|
2715
|
-
var ErrAssetGroupNotFound = (assetId) => new
|
|
2716
|
-
var ErrAssetOutputNotFound = (assetId, outputIndex) => new
|
|
2715
|
+
var ErrAssetGroupNotFound = (assetId) => new chunk6FTHFJAN_cjs.ServerResponseMismatchError(`asset group not found in batch leaf: ${assetId}`);
|
|
2716
|
+
var ErrAssetOutputNotFound = (assetId, outputIndex) => new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
2717
2717
|
`asset output not found in asset group ${assetId} at index ${outputIndex}`
|
|
2718
2718
|
);
|
|
2719
|
-
var ErrOnchainOutputNotFound = (address) => new
|
|
2720
|
-
var ErrUnvalidatedOffchainOutput = (address) => new
|
|
2719
|
+
var ErrOnchainOutputNotFound = (address) => new chunk6FTHFJAN_cjs.ServerResponseMismatchError(`onchain output not found: ${address}`);
|
|
2720
|
+
var ErrUnvalidatedOffchainOutput = (address) => new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
2721
2721
|
`offchain output ${address} cannot be validated: virtual output tree signing did not run`
|
|
2722
2722
|
);
|
|
2723
2723
|
var ErrInvalidOnchainOutputAmount = (address) => new Error(`invalid onchain output amount: ${address}`);
|
|
@@ -2726,7 +2726,7 @@ var ErrInvalidOffchainOutputAmount = (address) => new Error(`invalid offchain ou
|
|
|
2726
2726
|
function assertFinalCommitmentMatchesValidated(finalCommitmentTx, validatedCommitmentTxid, context) {
|
|
2727
2727
|
if (!validatedCommitmentTxid) return;
|
|
2728
2728
|
if (finalCommitmentTx.id === validatedCommitmentTxid) return;
|
|
2729
|
-
throw new
|
|
2729
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
2730
2730
|
`${context}: finalization commitment tx ${finalCommitmentTx.id} differs from the validated commitment tx ${validatedCommitmentTxid}`
|
|
2731
2731
|
);
|
|
2732
2732
|
}
|
|
@@ -2736,7 +2736,7 @@ function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, netwo
|
|
|
2736
2736
|
for (const recipient of recipients) {
|
|
2737
2737
|
let arkAddress;
|
|
2738
2738
|
try {
|
|
2739
|
-
arkAddress =
|
|
2739
|
+
arkAddress = chunk6FTHFJAN_cjs.ArkAddress.decode(recipient.address);
|
|
2740
2740
|
} catch {
|
|
2741
2741
|
validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
|
|
2742
2742
|
continue;
|
|
@@ -2748,7 +2748,7 @@ function validateBatchRecipientsWithoutTree(commitmentTx, recipients, network) {
|
|
|
2748
2748
|
const usedOnchainOutputs = /* @__PURE__ */ new Set();
|
|
2749
2749
|
for (const recipient of recipients) {
|
|
2750
2750
|
try {
|
|
2751
|
-
|
|
2751
|
+
chunk6FTHFJAN_cjs.ArkAddress.decode(recipient.address);
|
|
2752
2752
|
} catch {
|
|
2753
2753
|
validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
|
|
2754
2754
|
continue;
|
|
@@ -2981,7 +2981,7 @@ function assetMintResolver() {
|
|
|
2981
2981
|
if (!tx.assets?.length || !tx.key.arkTxid) return void 0;
|
|
2982
2982
|
const minted = tx.assets.filter((a) => {
|
|
2983
2983
|
try {
|
|
2984
|
-
return base.hex.encode(
|
|
2984
|
+
return base.hex.encode(chunk4C5PMGBB_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
|
|
2985
2985
|
} catch {
|
|
2986
2986
|
return false;
|
|
2987
2987
|
}
|
|
@@ -3005,6 +3005,39 @@ function createDefaultActivityRegistry() {
|
|
|
3005
3005
|
return registry;
|
|
3006
3006
|
}
|
|
3007
3007
|
|
|
3008
|
+
// src/wallet/restoreHooks.ts
|
|
3009
|
+
var restoreHooks = /* @__PURE__ */ new WeakMap();
|
|
3010
|
+
function registerWalletRestoreHook(wallet, hook) {
|
|
3011
|
+
const hooks = restoreHooks.get(wallet) ?? [];
|
|
3012
|
+
const entry = { ...hook };
|
|
3013
|
+
const existing = hooks.findIndex(({ id }) => id === hook.id);
|
|
3014
|
+
if (existing === -1) hooks.push(entry);
|
|
3015
|
+
else hooks[existing] = entry;
|
|
3016
|
+
restoreHooks.set(wallet, hooks);
|
|
3017
|
+
return () => {
|
|
3018
|
+
const current = restoreHooks.get(wallet);
|
|
3019
|
+
if (!current) return;
|
|
3020
|
+
const index = current.indexOf(entry);
|
|
3021
|
+
if (index === -1) return;
|
|
3022
|
+
current.splice(index, 1);
|
|
3023
|
+
if (current.length === 0) restoreHooks.delete(wallet);
|
|
3024
|
+
};
|
|
3025
|
+
}
|
|
3026
|
+
async function runWalletRestoreHooks(wallet) {
|
|
3027
|
+
const snapshot = [...restoreHooks.get(wallet) ?? []];
|
|
3028
|
+
const errors = [];
|
|
3029
|
+
for (const hook of snapshot) {
|
|
3030
|
+
try {
|
|
3031
|
+
await hook.restore(wallet);
|
|
3032
|
+
} catch (error) {
|
|
3033
|
+
errors.push(error);
|
|
3034
|
+
}
|
|
3035
|
+
}
|
|
3036
|
+
if (errors.length > 0) {
|
|
3037
|
+
throw new AggregateError(errors, "Wallet restore hooks failed");
|
|
3038
|
+
}
|
|
3039
|
+
}
|
|
3040
|
+
|
|
3008
3041
|
// src/wallet/index.ts
|
|
3009
3042
|
var TxType = /* @__PURE__ */ ((TxType2) => {
|
|
3010
3043
|
TxType2["TxSent"] = "SENT";
|
|
@@ -3024,7 +3057,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
3024
3057
|
const existing = inputsByAssetId.get(asset.assetId);
|
|
3025
3058
|
inputsByAssetId.set(asset.assetId, [
|
|
3026
3059
|
...existing ?? [],
|
|
3027
|
-
|
|
3060
|
+
chunk4C5PMGBB_cjs.AssetInput.create(inputIndex, asset.amount)
|
|
3028
3061
|
]);
|
|
3029
3062
|
}
|
|
3030
3063
|
}
|
|
@@ -3036,7 +3069,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
3036
3069
|
const existing = outputsByAssetId.get(asset.assetId);
|
|
3037
3070
|
outputsByAssetId.set(asset.assetId, [
|
|
3038
3071
|
...existing ?? [],
|
|
3039
|
-
|
|
3072
|
+
chunk4C5PMGBB_cjs.AssetOutput.create(outputIndex, asset.amount)
|
|
3040
3073
|
]);
|
|
3041
3074
|
}
|
|
3042
3075
|
}
|
|
@@ -3047,7 +3080,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
3047
3080
|
const existing = outputsByAssetId.get(asset.assetId);
|
|
3048
3081
|
outputsByAssetId.set(asset.assetId, [
|
|
3049
3082
|
...existing ?? [],
|
|
3050
|
-
|
|
3083
|
+
chunk4C5PMGBB_cjs.AssetOutput.create(outputIndex, asset.amount)
|
|
3051
3084
|
]);
|
|
3052
3085
|
}
|
|
3053
3086
|
}
|
|
@@ -3056,11 +3089,11 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
3056
3089
|
for (const assetIdStr of allAssetIds) {
|
|
3057
3090
|
const inputs = inputsByAssetId.get(assetIdStr);
|
|
3058
3091
|
const outputs = outputsByAssetId.get(assetIdStr);
|
|
3059
|
-
const assetId =
|
|
3060
|
-
const group =
|
|
3092
|
+
const assetId = chunk4C5PMGBB_cjs.AssetId.fromString(assetIdStr);
|
|
3093
|
+
const group = chunk4C5PMGBB_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
|
|
3061
3094
|
groups.push(group);
|
|
3062
3095
|
}
|
|
3063
|
-
return
|
|
3096
|
+
return chunk4C5PMGBB_cjs.Packet.create(groups);
|
|
3064
3097
|
}
|
|
3065
3098
|
function selectCoinsWithAsset(coins, assetId, requiredAmount) {
|
|
3066
3099
|
const coinsWithAsset = coins.filter((coin) => coin.assets?.some((a) => a.assetId === assetId));
|
|
@@ -3097,7 +3130,7 @@ function selectedCoinsToAssetInputs(selectedCoins) {
|
|
|
3097
3130
|
}
|
|
3098
3131
|
function toXOnlySignerHex(pubkeyHex) {
|
|
3099
3132
|
const bytes = base.hex.decode(pubkeyHex);
|
|
3100
|
-
if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(
|
|
3133
|
+
if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(chunkNPM5YZBC_cjs.toXOnly(bytes, "signer key"));
|
|
3101
3134
|
throw new Error(`invalid signer pubkey length: expected 32 or 33 bytes, got ${bytes.length}`);
|
|
3102
3135
|
}
|
|
3103
3136
|
function signerSetFromInfo(info) {
|
|
@@ -3144,13 +3177,13 @@ var toTimelock = (value) => ({
|
|
|
3144
3177
|
var toSeconds = (t) => t.type === "seconds" ? t.value : t.value * NOMINAL_BLOCK_SECONDS;
|
|
3145
3178
|
function assertTimelockInPolicy(timelock, policy, label, overrideOption) {
|
|
3146
3179
|
if (policy.requireSeconds && timelock.type === "blocks") {
|
|
3147
|
-
throw new
|
|
3180
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3148
3181
|
`${label} rejected: block-typed timelocks are not accepted (got ${timelock.value})`
|
|
3149
3182
|
);
|
|
3150
3183
|
}
|
|
3151
3184
|
const seconds = toSeconds(timelock);
|
|
3152
3185
|
if (seconds < policy.minSeconds) {
|
|
3153
|
-
throw new
|
|
3186
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3154
3187
|
`${label} rejected: ${timelock.value} ${timelock.type} is below the ${policy.minSeconds}s floor; pass ${overrideOption}: ${seconds}n to Wallet.create to lower it`
|
|
3155
3188
|
);
|
|
3156
3189
|
}
|
|
@@ -3171,7 +3204,7 @@ function resolveBatchExpiryPolicy(network, overrides) {
|
|
|
3171
3204
|
}
|
|
3172
3205
|
function assertValidBatchExpiry(batchExpiry, policy) {
|
|
3173
3206
|
if (policy.advertisedVtxoTreeExpiry !== void 0 && batchExpiry !== policy.advertisedVtxoTreeExpiry) {
|
|
3174
|
-
throw new
|
|
3207
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3175
3208
|
`batch expiry rejected: ${batchExpiry} does not match the advertised vtxoTreeExpiry ${policy.advertisedVtxoTreeExpiry}`
|
|
3176
3209
|
);
|
|
3177
3210
|
}
|
|
@@ -3201,21 +3234,21 @@ function resolveCheckpointExitDelayPolicy(network, overrides) {
|
|
|
3201
3234
|
function assertValidServerUnrollScript(checkpointTapscript, policy) {
|
|
3202
3235
|
let script;
|
|
3203
3236
|
try {
|
|
3204
|
-
script =
|
|
3237
|
+
script = chunk6FTHFJAN_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
|
|
3205
3238
|
} catch (e) {
|
|
3206
|
-
throw new
|
|
3239
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3207
3240
|
`checkpoint exit delay rejected: invalid checkpointTapscript from server (${e instanceof Error ? e.message : String(e)})`
|
|
3208
3241
|
);
|
|
3209
3242
|
}
|
|
3210
3243
|
if (policy.advertisedForfeitPubkey !== void 0) {
|
|
3211
3244
|
const { pubkeys } = script.params;
|
|
3212
3245
|
if (pubkeys.length !== 1) {
|
|
3213
|
-
throw new
|
|
3246
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3214
3247
|
`checkpoint exit delay rejected: checkpointTapscript must commit to exactly one pubkey, got ${pubkeys.length} [${pubkeys.map(base.hex.encode).join(", ")}]`
|
|
3215
3248
|
);
|
|
3216
3249
|
}
|
|
3217
3250
|
if (!utils_js.equalBytes(pubkeys[0], policy.advertisedForfeitPubkey)) {
|
|
3218
|
-
throw new
|
|
3251
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3219
3252
|
`checkpoint exit delay rejected: checkpointTapscript pubkey ${base.hex.encode(pubkeys[0])} does not match the advertised forfeitPubkey ${base.hex.encode(policy.advertisedForfeitPubkey)}`
|
|
3220
3253
|
);
|
|
3221
3254
|
}
|
|
@@ -3259,8 +3292,8 @@ function buildOffchainTx(inputs, outputs, serverUnrollScript) {
|
|
|
3259
3292
|
function buildVirtualTx(inputs, outputs) {
|
|
3260
3293
|
let lockTime = 0n;
|
|
3261
3294
|
for (const input of inputs) {
|
|
3262
|
-
const tapscript =
|
|
3263
|
-
if (
|
|
3295
|
+
const tapscript = chunk6FTHFJAN_cjs.decodeTapscript(chunk6FTHFJAN_cjs.scriptFromTapLeafScript(input.tapLeafScript));
|
|
3296
|
+
if (chunk6FTHFJAN_cjs.CLTVMultisigTapscript.is(tapscript)) {
|
|
3264
3297
|
if (lockTime !== 0n) {
|
|
3265
3298
|
if (isSeconds(lockTime) !== isSeconds(tapscript.params.absoluteTimelock)) {
|
|
3266
3299
|
throw new Error("cannot mix seconds and blocks locktime");
|
|
@@ -3271,7 +3304,7 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3271
3304
|
}
|
|
3272
3305
|
}
|
|
3273
3306
|
}
|
|
3274
|
-
const tx = new
|
|
3307
|
+
const tx = new chunk6FTHFJAN_cjs.Transaction({
|
|
3275
3308
|
version: 3,
|
|
3276
3309
|
lockTime: Number(lockTime)
|
|
3277
3310
|
});
|
|
@@ -3281,12 +3314,12 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3281
3314
|
index: input.vout,
|
|
3282
3315
|
sequence: lockTime ? btcSigner.DEFAULT_SEQUENCE - 1 : void 0,
|
|
3283
3316
|
witnessUtxo: {
|
|
3284
|
-
script:
|
|
3317
|
+
script: chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).pkScript,
|
|
3285
3318
|
amount: BigInt(input.value)
|
|
3286
3319
|
},
|
|
3287
3320
|
tapLeafScript: [input.tapLeafScript]
|
|
3288
3321
|
});
|
|
3289
|
-
|
|
3322
|
+
chunk6FTHFJAN_cjs.setArkPsbtField(tx, i, chunk6FTHFJAN_cjs.VtxoTaprootTree, input.tapTree);
|
|
3290
3323
|
}
|
|
3291
3324
|
for (const output of outputs) {
|
|
3292
3325
|
tx.addOutput(output);
|
|
@@ -3295,8 +3328,8 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3295
3328
|
return tx;
|
|
3296
3329
|
}
|
|
3297
3330
|
function buildCheckpointTx(vtxo, serverUnrollScript) {
|
|
3298
|
-
const collaborativeClosure =
|
|
3299
|
-
const checkpointVtxoScript = new
|
|
3331
|
+
const collaborativeClosure = chunk6FTHFJAN_cjs.decodeTapscript(chunk6FTHFJAN_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
|
|
3332
|
+
const checkpointVtxoScript = new chunk6FTHFJAN_cjs.VtxoScript([
|
|
3300
3333
|
serverUnrollScript.script,
|
|
3301
3334
|
collaborativeClosure.script
|
|
3302
3335
|
]);
|
|
@@ -3372,7 +3405,7 @@ function verifyTapscriptSignatures(tx, inputIndex, requiredSigners, excludePubke
|
|
|
3372
3405
|
const sighashType = signature.length === 65 ? signature[64] : btcSigner.SigHash.DEFAULT;
|
|
3373
3406
|
const sig = signature.subarray(0, 64);
|
|
3374
3407
|
if (!allowedSighashTypes.includes(sighashType)) {
|
|
3375
|
-
const sighashName =
|
|
3408
|
+
const sighashName = chunk6FTHFJAN_cjs.formatSighash(sighashType);
|
|
3376
3409
|
throw new Error(
|
|
3377
3410
|
`Unallowed sighash type ${sighashName} for input ${inputIndex}, pubkey ${pubKeyHex}.`
|
|
3378
3411
|
);
|
|
@@ -3446,7 +3479,7 @@ function combineTapscriptSigs(signedTx, originalTx) {
|
|
|
3446
3479
|
}
|
|
3447
3480
|
function isValidArkAddress(address) {
|
|
3448
3481
|
try {
|
|
3449
|
-
|
|
3482
|
+
chunk6FTHFJAN_cjs.ArkAddress.decode(address);
|
|
3450
3483
|
return true;
|
|
3451
3484
|
} catch (e) {
|
|
3452
3485
|
return false;
|
|
@@ -3454,16 +3487,16 @@ function isValidArkAddress(address) {
|
|
|
3454
3487
|
}
|
|
3455
3488
|
function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, context) {
|
|
3456
3489
|
if (serverCheckpointTxs.length !== expectedCheckpoints.length) {
|
|
3457
|
-
throw new
|
|
3490
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3458
3491
|
`${context} returned ${serverCheckpointTxs.length} checkpoints, expected ${expectedCheckpoints.length}`
|
|
3459
3492
|
);
|
|
3460
3493
|
}
|
|
3461
3494
|
const byTxid = new Map(expectedCheckpoints.map((c) => [c.id, c]));
|
|
3462
3495
|
return serverCheckpointTxs.map((encoded, index) => {
|
|
3463
|
-
const server =
|
|
3496
|
+
const server = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
|
|
3464
3497
|
const local = byTxid.get(server.id);
|
|
3465
3498
|
if (!local) {
|
|
3466
|
-
throw new
|
|
3499
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3467
3500
|
`${context} checkpoint ${index} txid ${server.id} does not match any submitted checkpoint`
|
|
3468
3501
|
);
|
|
3469
3502
|
}
|
|
@@ -3473,14 +3506,14 @@ function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, contex
|
|
|
3473
3506
|
}
|
|
3474
3507
|
function assertSubmittedArkTxid(response, signedArkTx, context) {
|
|
3475
3508
|
if (response.arkTxid !== signedArkTx.id) {
|
|
3476
|
-
throw new
|
|
3509
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3477
3510
|
`${context} returned ark txid ${response.arkTxid}, expected ${signedArkTx.id}`
|
|
3478
3511
|
);
|
|
3479
3512
|
}
|
|
3480
3513
|
if (response.finalArkTx === void 0) return;
|
|
3481
|
-
const finalTxid =
|
|
3514
|
+
const finalTxid = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
|
|
3482
3515
|
if (finalTxid !== signedArkTx.id) {
|
|
3483
|
-
throw new
|
|
3516
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3484
3517
|
`${context} returned final ark tx ${finalTxid}, expected ${signedArkTx.id}`
|
|
3485
3518
|
);
|
|
3486
3519
|
}
|
|
@@ -3499,10 +3532,10 @@ function assertServerSignedLeaf(serverTx, localTx, inputIndex, serverPubkeyHex,
|
|
|
3499
3532
|
[serverPubkeyHex],
|
|
3500
3533
|
void 0,
|
|
3501
3534
|
void 0,
|
|
3502
|
-
payment_js.tapLeafHash(
|
|
3535
|
+
payment_js.tapLeafHash(chunk6FTHFJAN_cjs.scriptFromTapLeafScript(leaf))
|
|
3503
3536
|
);
|
|
3504
3537
|
} catch (error) {
|
|
3505
|
-
throw new
|
|
3538
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3506
3539
|
`${context}: input ${inputIndex} is not signed by the server on the leaf being spent (${error instanceof Error ? error.message : String(error)})`
|
|
3507
3540
|
);
|
|
3508
3541
|
}
|
|
@@ -3511,20 +3544,20 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
|
|
|
3511
3544
|
const byOutpoint = new Map(inputs.map((input) => [`${input.txid}:${input.vout}`, input]));
|
|
3512
3545
|
for (const [index, checkpoint] of checkpoints.entries()) {
|
|
3513
3546
|
if (checkpoint.inputsLength !== 1) {
|
|
3514
|
-
throw new
|
|
3547
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3515
3548
|
`${context}: checkpoint ${index} spends ${checkpoint.inputsLength} inputs, expected 1`
|
|
3516
3549
|
);
|
|
3517
3550
|
}
|
|
3518
3551
|
const spent = checkpoint.getInput(0);
|
|
3519
3552
|
if (!spent.txid || spent.index === void 0) {
|
|
3520
|
-
throw new
|
|
3553
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3521
3554
|
`${context}: checkpoint ${index} has no input outpoint`
|
|
3522
3555
|
);
|
|
3523
3556
|
}
|
|
3524
3557
|
const outpoint = `${base.hex.encode(spent.txid)}:${spent.index}`;
|
|
3525
3558
|
const input = byOutpoint.get(outpoint);
|
|
3526
3559
|
if (!input) {
|
|
3527
|
-
throw new
|
|
3560
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3528
3561
|
`${context}: checkpoint ${index} spends ${outpoint}, which is not one of the requested virtual outputs`
|
|
3529
3562
|
);
|
|
3530
3563
|
}
|
|
@@ -3532,7 +3565,7 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
|
|
|
3532
3565
|
(unroll) => buildCheckpointTx(input, unroll).tx.id === checkpoint.id
|
|
3533
3566
|
);
|
|
3534
3567
|
if (!rebuilt) {
|
|
3535
|
-
throw new
|
|
3568
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3536
3569
|
`${context}: checkpoint ${index} txid ${checkpoint.id} differs from the checkpoint built locally for ${outpoint}`
|
|
3537
3570
|
);
|
|
3538
3571
|
}
|
|
@@ -3558,9 +3591,9 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
|
|
|
3558
3591
|
const matched = matchServerCheckpoints(signedCheckpointTxs, offchainTx.checkpoints, "submitTx");
|
|
3559
3592
|
matched.forEach(({ server }, index) => {
|
|
3560
3593
|
try {
|
|
3561
|
-
|
|
3594
|
+
chunk6FTHFJAN_cjs.assertAllowedSighashTypes(server);
|
|
3562
3595
|
} catch (error) {
|
|
3563
|
-
throw new
|
|
3596
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3564
3597
|
`submitTx checkpoint ${index}: ${error instanceof Error ? error.message : String(error)}`
|
|
3565
3598
|
);
|
|
3566
3599
|
}
|
|
@@ -3568,12 +3601,12 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
|
|
|
3568
3601
|
const verify = options?.verifyServerSignatures;
|
|
3569
3602
|
if (verify) {
|
|
3570
3603
|
if (response.finalArkTx === void 0) {
|
|
3571
|
-
throw new
|
|
3604
|
+
throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
|
|
3572
3605
|
"submitTx: server returned no final ark tx to verify its signatures against"
|
|
3573
3606
|
);
|
|
3574
3607
|
}
|
|
3575
|
-
const finalArkTx =
|
|
3576
|
-
const serverPubkeyHex = base.hex.encode(
|
|
3608
|
+
const finalArkTx = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx));
|
|
3609
|
+
const serverPubkeyHex = base.hex.encode(chunkNPM5YZBC_cjs.toXOnly(verify.serverPubkey, "server key"));
|
|
3577
3610
|
for (let i = 0; i < offchainTx.arkTx.inputsLength; i++) {
|
|
3578
3611
|
assertServerSignedLeaf(
|
|
3579
3612
|
finalArkTx,
|
|
@@ -3629,12 +3662,12 @@ function claimWithPreimageIdentity(identity, preimage) {
|
|
|
3629
3662
|
return {
|
|
3630
3663
|
...identity,
|
|
3631
3664
|
sign: async (tx, inputIndexes) => {
|
|
3632
|
-
const signed =
|
|
3665
|
+
const signed = chunk6FTHFJAN_cjs.Transaction.fromPSBT(
|
|
3633
3666
|
(await identity.sign(tx.clone(), inputIndexes)).toPSBT()
|
|
3634
3667
|
);
|
|
3635
3668
|
const indexes = inputIndexes ?? Array.from({ length: signed.inputsLength }, (_, i) => i);
|
|
3636
3669
|
for (const index of indexes) {
|
|
3637
|
-
|
|
3670
|
+
chunk6FTHFJAN_cjs.setArkPsbtField(signed, index, chunk6FTHFJAN_cjs.ConditionWitness, [preimage]);
|
|
3638
3671
|
}
|
|
3639
3672
|
return signed;
|
|
3640
3673
|
}
|
|
@@ -3829,7 +3862,7 @@ function extendCoinWithTapscript(boardingTapscript, utxo) {
|
|
|
3829
3862
|
};
|
|
3830
3863
|
}
|
|
3831
3864
|
function deriveContractTapscripts(contract) {
|
|
3832
|
-
const handler =
|
|
3865
|
+
const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
|
|
3833
3866
|
if (!handler) {
|
|
3834
3867
|
throw new Error(`No handler for contract type '${contract.type}'`);
|
|
3835
3868
|
}
|
|
@@ -3900,7 +3933,7 @@ function getRandomId() {
|
|
|
3900
3933
|
}
|
|
3901
3934
|
function isValidArkAddress2(address) {
|
|
3902
3935
|
try {
|
|
3903
|
-
|
|
3936
|
+
chunk6FTHFJAN_cjs.ArkAddress.decode(address);
|
|
3904
3937
|
return true;
|
|
3905
3938
|
} catch (e) {
|
|
3906
3939
|
return false;
|
|
@@ -3928,7 +3961,7 @@ function assertRecipientArkAddress(encoded, address, context) {
|
|
|
3928
3961
|
function assertTapTreeDerivesAddress(encoded, tapTree, address) {
|
|
3929
3962
|
let derived;
|
|
3930
3963
|
try {
|
|
3931
|
-
derived =
|
|
3964
|
+
derived = chunk6FTHFJAN_cjs.VtxoScript.decode(tapTree).pkScript;
|
|
3932
3965
|
} catch (e) {
|
|
3933
3966
|
throw new Error(
|
|
3934
3967
|
`Invalid tapTree for ${encoded}: ${e instanceof Error ? e.message : String(e)}`
|
|
@@ -3945,7 +3978,7 @@ function validateRecipients(recipients, dustAmount, context) {
|
|
|
3945
3978
|
for (const recipient of recipients) {
|
|
3946
3979
|
let address;
|
|
3947
3980
|
try {
|
|
3948
|
-
address =
|
|
3981
|
+
address = chunk6FTHFJAN_cjs.ArkAddress.decode(recipient.address);
|
|
3949
3982
|
} catch (e) {
|
|
3950
3983
|
throw new Error(`Invalid Arkade address: ${recipient.address}`);
|
|
3951
3984
|
}
|
|
@@ -3970,7 +4003,7 @@ function validateRecipients(recipients, dustAmount, context) {
|
|
|
3970
4003
|
|
|
3971
4004
|
// src/contracts/spendability.ts
|
|
3972
4005
|
function isContractGenericallySpendable(contract) {
|
|
3973
|
-
return
|
|
4006
|
+
return chunkNPM5YZBC_cjs.contractHandlers.get(contract.type)?.isGenericallySpendable?.(contract) === true;
|
|
3974
4007
|
}
|
|
3975
4008
|
function gatedContracts(contracts) {
|
|
3976
4009
|
const gated = /* @__PURE__ */ new Map();
|
|
@@ -3979,11 +4012,20 @@ function gatedContracts(contracts) {
|
|
|
3979
4012
|
}
|
|
3980
4013
|
return gated;
|
|
3981
4014
|
}
|
|
4015
|
+
function gatedFrom(snapshot) {
|
|
4016
|
+
return gatedContracts(snapshot.map((entry) => entry.contract));
|
|
4017
|
+
}
|
|
4018
|
+
function gatedTypeOf(vtxo, gated) {
|
|
4019
|
+
return vtxo.script === void 0 ? void 0 : gated.get(vtxo.script);
|
|
4020
|
+
}
|
|
4021
|
+
function isGatedVtxo(vtxo, gated) {
|
|
4022
|
+
return gatedTypeOf(vtxo, gated) !== void 0;
|
|
4023
|
+
}
|
|
3982
4024
|
function gateExclusion(gated) {
|
|
3983
4025
|
return (vtxo) => {
|
|
3984
|
-
const type = vtxo
|
|
4026
|
+
const type = gatedTypeOf(vtxo, gated);
|
|
3985
4027
|
if (type === void 0) return void 0;
|
|
3986
|
-
if (!
|
|
4028
|
+
if (!chunkNPM5YZBC_cjs.contractHandlers.has(type)) {
|
|
3987
4029
|
return `at ${vtxo.script} (contract type '${type}') has no handler registered in this build`;
|
|
3988
4030
|
}
|
|
3989
4031
|
return `at ${vtxo.script} (contract type '${type}') is not generically spendable`;
|
|
@@ -4019,7 +4061,7 @@ function selectPendingRecoveryOutpoints(contractsWithVtxos, signerSet, nowSecond
|
|
|
4019
4061
|
continue;
|
|
4020
4062
|
}
|
|
4021
4063
|
for (const v of vtxos) {
|
|
4022
|
-
if (!
|
|
4064
|
+
if (!chunk6FTHFJAN_cjs.hasTerminalSpend(v) && !v.isSwept && !v.isUnrolled) {
|
|
4023
4065
|
out.add(`${v.txid}:${v.vout}`);
|
|
4024
4066
|
}
|
|
4025
4067
|
}
|
|
@@ -4054,10 +4096,10 @@ function byValueDescending(vtxos) {
|
|
|
4054
4096
|
return [...vtxos].sort((a, b) => b.value - a.value);
|
|
4055
4097
|
}
|
|
4056
4098
|
async function fetchTimeHeight(wallet) {
|
|
4057
|
-
return
|
|
4099
|
+
return chunk6FTHFJAN_cjs.resolveTimeHeight(wallet.onchainProvider);
|
|
4058
4100
|
}
|
|
4059
4101
|
function canMigrateBySend(vtxo, now) {
|
|
4060
|
-
if (!
|
|
4102
|
+
if (!chunk6FTHFJAN_cjs.canSpendOffchain(vtxo, now)) return false;
|
|
4061
4103
|
return vtxo.expiresAt !== void 0 || vtxo.expiresAtHeight !== void 0;
|
|
4062
4104
|
}
|
|
4063
4105
|
function byExpiryAscending(vtxos, now) {
|
|
@@ -4065,7 +4107,7 @@ function byExpiryAscending(vtxos, now) {
|
|
|
4065
4107
|
if (vtxo.isSwept) return -Infinity;
|
|
4066
4108
|
if (vtxo.expiresAt !== void 0) return vtxo.expiresAt.getTime();
|
|
4067
4109
|
if (vtxo.expiresAtHeight !== void 0) {
|
|
4068
|
-
return
|
|
4110
|
+
return chunk6FTHFJAN_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
|
|
4069
4111
|
}
|
|
4070
4112
|
return Infinity;
|
|
4071
4113
|
};
|
|
@@ -4092,7 +4134,7 @@ function priceSettlementInputs(vtxos, estimator) {
|
|
|
4092
4134
|
const payable = [];
|
|
4093
4135
|
const net = /* @__PURE__ */ new Map();
|
|
4094
4136
|
for (const vtxo of vtxos) {
|
|
4095
|
-
const inputFee = estimator.evalOffchainInput(
|
|
4137
|
+
const inputFee = estimator.evalOffchainInput(chunk6FTHFJAN_cjs.toOffchainInputFeeParams(vtxo));
|
|
4096
4138
|
if (inputFee.satoshis >= vtxo.value) {
|
|
4097
4139
|
continue;
|
|
4098
4140
|
}
|
|
@@ -4118,7 +4160,7 @@ function deductOffchainOutputFee(subtotal, estimator, arkAddress) {
|
|
|
4118
4160
|
}
|
|
4119
4161
|
const outputFee = estimator.evalOffchainOutput({
|
|
4120
4162
|
amount: subtotal,
|
|
4121
|
-
script: base.hex.encode(
|
|
4163
|
+
script: base.hex.encode(chunk6FTHFJAN_cjs.ArkAddress.decode(arkAddress).pkScript)
|
|
4122
4164
|
});
|
|
4123
4165
|
return subtotal - BigInt(outputFee.satoshis);
|
|
4124
4166
|
}
|
|
@@ -4136,10 +4178,10 @@ var DEFAULT_SETTLEMENT_CONFIG = {
|
|
|
4136
4178
|
};
|
|
4137
4179
|
function getRecoverableVtxos(vtxos, dustAmount, now) {
|
|
4138
4180
|
return vtxos.filter((vtxo) => {
|
|
4139
|
-
if (
|
|
4181
|
+
if (chunk6FTHFJAN_cjs.canRecoverOnchain(vtxo, now)) {
|
|
4140
4182
|
return true;
|
|
4141
4183
|
}
|
|
4142
|
-
if (
|
|
4184
|
+
if (chunk6FTHFJAN_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
|
|
4143
4185
|
return true;
|
|
4144
4186
|
}
|
|
4145
4187
|
return false;
|
|
@@ -4171,7 +4213,7 @@ function getRecoverableWithSubdust(vtxos, dustAmount, now) {
|
|
|
4171
4213
|
function isVtxoExpiringSoon(vtxo, thresholdMs) {
|
|
4172
4214
|
if (vtxo.isUnrolled) return false;
|
|
4173
4215
|
const realThresholdMs = thresholdMs <= 100 ? DEFAULT_THRESHOLD_MS : thresholdMs;
|
|
4174
|
-
const expiresAt =
|
|
4216
|
+
const expiresAt = chunk6FTHFJAN_cjs.normalizeVtxo(vtxo).expiresAt;
|
|
4175
4217
|
if (expiresAt === void 0) return false;
|
|
4176
4218
|
const now = Date.now();
|
|
4177
4219
|
const batchExpiry = expiresAt.getTime();
|
|
@@ -4182,7 +4224,7 @@ function getExpiringAndRecoverableVtxos(vtxos, thresholdMs, dustAmount, now) {
|
|
|
4182
4224
|
return vtxos.filter(
|
|
4183
4225
|
// The leading exclusion covers the `isSubdust` arm too, which is a value
|
|
4184
4226
|
// property and would otherwise re-admit an exited coin on its own.
|
|
4185
|
-
(vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) ||
|
|
4227
|
+
(vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) || chunk6FTHFJAN_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount))
|
|
4186
4228
|
);
|
|
4187
4229
|
}
|
|
4188
4230
|
function isMigrationCapable(wallet) {
|
|
@@ -4781,11 +4823,11 @@ var VtxoManager = class _VtxoManager {
|
|
|
4781
4823
|
`Sweep not economical: output ${outputAmount} sats after ${fee} sats fee is below dust (${dustAmount} sats)`
|
|
4782
4824
|
);
|
|
4783
4825
|
}
|
|
4784
|
-
const tx = new
|
|
4826
|
+
const tx = new chunk6FTHFJAN_cjs.Transaction();
|
|
4785
4827
|
for (const utxo of expiredUtxos) {
|
|
4786
|
-
const utxoScript =
|
|
4828
|
+
const utxoScript = chunk6FTHFJAN_cjs.VtxoScript.decode(utxo.tapTree);
|
|
4787
4829
|
const utxoExitLeaf = utxoScript.leaves.find(
|
|
4788
|
-
(leaf) =>
|
|
4830
|
+
(leaf) => chunk6FTHFJAN_cjs.CSVMultisigTapscript.isScriptValid(chunk6FTHFJAN_cjs.scriptFromTapLeafScript(leaf)) === true
|
|
4789
4831
|
);
|
|
4790
4832
|
if (!utxoExitLeaf) {
|
|
4791
4833
|
throw new Error(
|
|
@@ -4800,7 +4842,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
4800
4842
|
amount: BigInt(utxo.value)
|
|
4801
4843
|
},
|
|
4802
4844
|
tapLeafScript: [utxoExitLeaf],
|
|
4803
|
-
sequence:
|
|
4845
|
+
sequence: chunk6FTHFJAN_cjs.getSequence(utxoExitLeaf)
|
|
4804
4846
|
});
|
|
4805
4847
|
}
|
|
4806
4848
|
tx.addOutputAddress(boardingAddress, outputAmount, this.getNetwork());
|
|
@@ -5043,8 +5085,8 @@ var VtxoManager = class _VtxoManager {
|
|
|
5043
5085
|
const cls = classifyAgainstSignerSet(serverPubKey, signerSet, nowSeconds);
|
|
5044
5086
|
if (cls.status === "CURRENT") continue;
|
|
5045
5087
|
const live = vtxos.filter((v) => !v.isUnrolled);
|
|
5046
|
-
const recoverable = live.filter((v) => v.isSwept && !
|
|
5047
|
-
const spendable = live.filter((v) => !
|
|
5088
|
+
const recoverable = live.filter((v) => v.isSwept && !chunk6FTHFJAN_cjs.hasTerminalSpend(v));
|
|
5089
|
+
const spendable = live.filter((v) => !chunk6FTHFJAN_cjs.hasTerminalSpend(v) && !v.isSwept);
|
|
5048
5090
|
const value = spendable.reduce((sum, v) => sum + v.value, 0);
|
|
5049
5091
|
let recoverableCount = 0;
|
|
5050
5092
|
let recoverableValue = 0;
|
|
@@ -5057,7 +5099,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5057
5099
|
awaitingSweepCount = spendable.length;
|
|
5058
5100
|
awaitingSweepValue = value;
|
|
5059
5101
|
for (const v of spendable) {
|
|
5060
|
-
const exp =
|
|
5102
|
+
const exp = chunk6FTHFJAN_cjs.toBatchExpiry(v);
|
|
5061
5103
|
if (exp !== void 0 && (nextSweepEta === void 0 || exp < nextSweepEta)) {
|
|
5062
5104
|
nextSweepEta = exp;
|
|
5063
5105
|
}
|
|
@@ -5318,7 +5360,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5318
5360
|
/** Decodes the boarding tapscript exit path to extract the CSV timelock. */
|
|
5319
5361
|
getBoardingTimelock() {
|
|
5320
5362
|
const wallet = this.getSweepWallet();
|
|
5321
|
-
const exitScript =
|
|
5363
|
+
const exitScript = chunk6FTHFJAN_cjs.CSVMultisigTapscript.decode(
|
|
5322
5364
|
base.hex.decode(wallet.boardingTapscript.exitScript)
|
|
5323
5365
|
);
|
|
5324
5366
|
return exitScript.params.timelock;
|
|
@@ -5449,8 +5491,8 @@ var VtxoManager = class _VtxoManager {
|
|
|
5449
5491
|
* or doesn't carry the metadata.
|
|
5450
5492
|
*/
|
|
5451
5493
|
extractSpentOutpoint(error) {
|
|
5452
|
-
const ark =
|
|
5453
|
-
if (!
|
|
5494
|
+
const ark = chunk6FTHFJAN_cjs.maybeArkError(error);
|
|
5495
|
+
if (!chunk6FTHFJAN_cjs.isArkError(ark, chunk6FTHFJAN_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
|
|
5454
5496
|
const raw = ark.metadata?.vtxo_outpoint;
|
|
5455
5497
|
if (typeof raw !== "string") return void 0;
|
|
5456
5498
|
const [txid, voutStr] = raw.split(":");
|
|
@@ -5640,7 +5682,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5640
5682
|
if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
|
|
5641
5683
|
break;
|
|
5642
5684
|
}
|
|
5643
|
-
const inputFee = estimator.evalOffchainInput(
|
|
5685
|
+
const inputFee = estimator.evalOffchainInput(chunk6FTHFJAN_cjs.toOffchainInputFeeParams(v));
|
|
5644
5686
|
if (inputFee.satoshis >= v.value) {
|
|
5645
5687
|
continue;
|
|
5646
5688
|
}
|
|
@@ -5660,7 +5702,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5660
5702
|
const arkAddress = await this.wallet.getAddress();
|
|
5661
5703
|
const outputFee = estimator.evalOffchainOutput({
|
|
5662
5704
|
amount: totalAmount,
|
|
5663
|
-
script: base.hex.encode(
|
|
5705
|
+
script: base.hex.encode(chunk6FTHFJAN_cjs.ArkAddress.decode(arkAddress).pkScript)
|
|
5664
5706
|
});
|
|
5665
5707
|
totalAmount -= BigInt(outputFee.satoshis);
|
|
5666
5708
|
if (totalAmount < dustAmount) return;
|
|
@@ -5740,7 +5782,7 @@ var ArkNote = class _ArkNote {
|
|
|
5740
5782
|
this.value = value;
|
|
5741
5783
|
this.HRP = HRP;
|
|
5742
5784
|
const preimageHash = utils_js.sha256(this.preimage);
|
|
5743
|
-
this.vtxoScript = new
|
|
5785
|
+
this.vtxoScript = new chunk6FTHFJAN_cjs.VtxoScript([noteTapscript(preimageHash)]);
|
|
5744
5786
|
const leaf = this.vtxoScript.leaves[0];
|
|
5745
5787
|
this.txid = base.hex.encode(new Uint8Array(preimageHash).reverse());
|
|
5746
5788
|
this.tapTree = this.vtxoScript.encode();
|
|
@@ -5907,7 +5949,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
5907
5949
|
const privateKey = data.slice(1, 33);
|
|
5908
5950
|
const serverPubKey = data.slice(33, 65);
|
|
5909
5951
|
const sequence = new DataView(data.buffer, data.byteOffset + 65, 4).getUint32(0, false);
|
|
5910
|
-
const csvTimelock =
|
|
5952
|
+
const csvTimelock = chunk6FTHFJAN_cjs.sequenceToTimelock(sequence);
|
|
5911
5953
|
return new _ArkadeCash(privateKey, serverPubKey, csvTimelock, decoded.prefix);
|
|
5912
5954
|
}
|
|
5913
5955
|
toString() {
|
|
@@ -5915,7 +5957,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
5915
5957
|
data[0] = _ArkadeCash.Version;
|
|
5916
5958
|
data.set(this._privateKey, 1);
|
|
5917
5959
|
data.set(this._serverPubKey, 33);
|
|
5918
|
-
const sequence =
|
|
5960
|
+
const sequence = chunk6FTHFJAN_cjs.timelockToSequence(this.csvTimelock);
|
|
5919
5961
|
new DataView(data.buffer, data.byteOffset + 65, 4).setUint32(0, sequence, false);
|
|
5920
5962
|
const words = base.bech32m.toWords(data);
|
|
5921
5963
|
return base.bech32m.encode(this.hrp, words, 1023);
|
|
@@ -5924,7 +5966,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
5924
5966
|
return SingleKey.fromPrivateKey(this._privateKey);
|
|
5925
5967
|
}
|
|
5926
5968
|
get vtxoScript() {
|
|
5927
|
-
return new
|
|
5969
|
+
return new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
|
|
5928
5970
|
pubKey: this._publicKey,
|
|
5929
5971
|
serverPubKey: this._serverPubKey,
|
|
5930
5972
|
csvTimelock: this.csvTimelock
|
|
@@ -6185,7 +6227,7 @@ async function captureExitBranch(params) {
|
|
|
6185
6227
|
const nonCommitment = ordered.filter((c) => chainTxTypeToChainedExit(c.type) !== 1 /* Commitment */).map((c) => c.txid);
|
|
6186
6228
|
if (nonCommitment.length > 0) {
|
|
6187
6229
|
for (const psbt of await resolver.getVirtualTxs(nonCommitment)) {
|
|
6188
|
-
psbtByTxid.set(
|
|
6230
|
+
psbtByTxid.set(chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
6189
6231
|
}
|
|
6190
6232
|
}
|
|
6191
6233
|
}
|
|
@@ -6228,10 +6270,10 @@ var IndexerExitDataSource = class {
|
|
|
6228
6270
|
while (hasMore) {
|
|
6229
6271
|
const { chain: page, page: meta } = await this.indexer.getVtxoChain(
|
|
6230
6272
|
{ txid: vtxo.txid, vout: vtxo.vout },
|
|
6231
|
-
{ pageIndex, pageSize:
|
|
6273
|
+
{ pageIndex, pageSize: chunk6FTHFJAN_cjs.DEFAULT_PAGE_SIZE }
|
|
6232
6274
|
);
|
|
6233
6275
|
chain.push(...page);
|
|
6234
|
-
hasMore = meta ? page.length ===
|
|
6276
|
+
hasMore = meta ? page.length === chunk6FTHFJAN_cjs.DEFAULT_PAGE_SIZE : false;
|
|
6235
6277
|
pageIndex++;
|
|
6236
6278
|
}
|
|
6237
6279
|
return chain;
|
|
@@ -6243,12 +6285,12 @@ var IndexerExitDataSource = class {
|
|
|
6243
6285
|
while (hasMore) {
|
|
6244
6286
|
const { txs, page } = await this.indexer.getVirtualTxs(txids, {
|
|
6245
6287
|
pageIndex,
|
|
6246
|
-
pageSize:
|
|
6288
|
+
pageSize: chunk6FTHFJAN_cjs.DEFAULT_PAGE_SIZE
|
|
6247
6289
|
});
|
|
6248
6290
|
for (const psbt of txs) {
|
|
6249
|
-
out.set(
|
|
6291
|
+
out.set(chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
6250
6292
|
}
|
|
6251
|
-
hasMore = page ? txs.length ===
|
|
6293
|
+
hasMore = page ? txs.length === chunk6FTHFJAN_cjs.DEFAULT_PAGE_SIZE : false;
|
|
6252
6294
|
pageIndex++;
|
|
6253
6295
|
}
|
|
6254
6296
|
return out;
|
|
@@ -6269,7 +6311,7 @@ function chainedTxTypeToChainTxType(t) {
|
|
|
6269
6311
|
}
|
|
6270
6312
|
}
|
|
6271
6313
|
function psbtInputTxids(psbtBase64) {
|
|
6272
|
-
const tx =
|
|
6314
|
+
const tx = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
|
|
6273
6315
|
const ids = [];
|
|
6274
6316
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
6275
6317
|
const txid = tx.getInput(i).txid;
|
|
@@ -6628,10 +6670,10 @@ async function resolveArkInfo(arkProvider, walletRepository) {
|
|
|
6628
6670
|
try {
|
|
6629
6671
|
info = await arkProvider.getInfo();
|
|
6630
6672
|
} catch (err) {
|
|
6631
|
-
if (!
|
|
6673
|
+
if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
|
|
6632
6674
|
const snapshot = await loadArkInfoSnapshot(walletRepository);
|
|
6633
6675
|
if (!snapshot) {
|
|
6634
|
-
throw new
|
|
6676
|
+
throw new chunk6FTHFJAN_cjs.ProviderUnavailableError(
|
|
6635
6677
|
"Arkade server info is unavailable and no cached snapshot exists",
|
|
6636
6678
|
{ cause: err }
|
|
6637
6679
|
);
|
|
@@ -6959,6 +7001,24 @@ exports.Batch = void 0;
|
|
|
6959
7001
|
})(exports.Batch || (exports.Batch = {}));
|
|
6960
7002
|
|
|
6961
7003
|
// src/utils/transactionHistory.ts
|
|
7004
|
+
function localCreatedAtByTxid(vtxos) {
|
|
7005
|
+
const createdAt = /* @__PURE__ */ new Map();
|
|
7006
|
+
for (const vtxo of vtxos) {
|
|
7007
|
+
if (vtxo.txid && !createdAt.has(vtxo.txid)) {
|
|
7008
|
+
createdAt.set(vtxo.txid, vtxo.createdAt.getTime());
|
|
7009
|
+
}
|
|
7010
|
+
}
|
|
7011
|
+
return createdAt;
|
|
7012
|
+
}
|
|
7013
|
+
function gatedTouchpoints(gated) {
|
|
7014
|
+
const paidIn = /* @__PURE__ */ new Set();
|
|
7015
|
+
const paidOut = /* @__PURE__ */ new Set();
|
|
7016
|
+
for (const vtxo of gated) {
|
|
7017
|
+
if (vtxo.txid) paidIn.add(vtxo.txid);
|
|
7018
|
+
if (vtxo.isSpent && vtxo.arkTxId) paidOut.add(vtxo.arkTxId);
|
|
7019
|
+
}
|
|
7020
|
+
return { paidIn, paidOut };
|
|
7021
|
+
}
|
|
6962
7022
|
var txKey = {
|
|
6963
7023
|
commitmentTxid: "",
|
|
6964
7024
|
boardingTxid: "",
|
|
@@ -7010,24 +7070,27 @@ function subtractAssets(spent, change) {
|
|
|
7010
7070
|
if (map.size === 0) return void 0;
|
|
7011
7071
|
return Array.from(map, ([assetId, amount]) => ({ assetId, amount }));
|
|
7012
7072
|
}
|
|
7013
|
-
function collectArkTxidsNeedingCreatedAt(vtxos) {
|
|
7014
|
-
const ownTxids = new Set(vtxos.map((v) => v.txid));
|
|
7073
|
+
function collectArkTxidsNeedingCreatedAt(vtxos, localCreatedAt) {
|
|
7015
7074
|
const txids = /* @__PURE__ */ new Set();
|
|
7016
7075
|
for (const vtxo of vtxos) {
|
|
7017
|
-
if (vtxo.isSpent && vtxo.arkTxId && !
|
|
7076
|
+
if (vtxo.isSpent && vtxo.arkTxId && !localCreatedAt.has(vtxo.arkTxId)) {
|
|
7018
7077
|
txids.add(vtxo.arkTxId);
|
|
7019
7078
|
}
|
|
7020
7079
|
}
|
|
7021
7080
|
return [...txids];
|
|
7022
7081
|
}
|
|
7023
|
-
async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnore, resolveTxCreatedAt) {
|
|
7024
|
-
const
|
|
7025
|
-
const
|
|
7082
|
+
async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnore, resolveTxCreatedAt, gatedScripts = /* @__PURE__ */ new Map()) {
|
|
7083
|
+
const normalized = vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
|
|
7084
|
+
const localCreatedAt = localCreatedAtByTxid(normalized);
|
|
7085
|
+
const gatedVtxos = normalized.filter((vtxo) => isGatedVtxo(vtxo, gatedScripts));
|
|
7086
|
+
const ownVtxos = normalized.filter((vtxo) => !isGatedVtxo(vtxo, gatedScripts));
|
|
7087
|
+
const { paidIn: paidIntoGated, paidOut: paidOutOfGated } = gatedTouchpoints(gatedVtxos);
|
|
7088
|
+
const txidsNeedingCreatedAt = resolveTxCreatedAt ? collectArkTxidsNeedingCreatedAt(ownVtxos, localCreatedAt) : [];
|
|
7026
7089
|
const resolvedCreatedAt = resolveTxCreatedAt && txidsNeedingCreatedAt.length > 0 ? await resolveTxCreatedAt(txidsNeedingCreatedAt) : /* @__PURE__ */ new Map();
|
|
7027
7090
|
const unmatchedSettledBoardingTxs = allBoardingTxs.filter(isSettledBoardingReceive).sort((a, b) => a.createdAt - b.createdAt);
|
|
7028
7091
|
const sent = [];
|
|
7029
7092
|
let received = [];
|
|
7030
|
-
for (const vtxo of
|
|
7093
|
+
for (const vtxo of ownVtxos) {
|
|
7031
7094
|
if (vtxo.status.isLeaf) {
|
|
7032
7095
|
const commitmentTxid = vtxo.commitmentTxIds[0];
|
|
7033
7096
|
const vtxoCreatedAt = vtxo.createdAt.getTime();
|
|
@@ -7037,7 +7100,7 @@ async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnor
|
|
|
7037
7100
|
unmatchedSettledBoardingTxs,
|
|
7038
7101
|
(tx) => tx.createdAt <= vtxoCreatedAt && (tx.key.commitmentTxid === commitmentTxid || tx.key.commitmentTxid === vtxo.settledBy)
|
|
7039
7102
|
);
|
|
7040
|
-
} else if (
|
|
7103
|
+
} else if (ownVtxos.filter((v) => v.settledBy === vtxo.commitmentTxIds[0]).length === 0) {
|
|
7041
7104
|
const duplicateBoardingReceive = consumeBoardingReceive(
|
|
7042
7105
|
unmatchedSettledBoardingTxs,
|
|
7043
7106
|
(tx) => tx.amount === vtxo.value && tx.createdAt <= vtxoCreatedAt
|
|
@@ -7058,11 +7121,14 @@ async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnor
|
|
|
7058
7121
|
});
|
|
7059
7122
|
}
|
|
7060
7123
|
}
|
|
7061
|
-
} else if (
|
|
7124
|
+
} else if (ownVtxos.filter((v) => v.arkTxId === vtxo.txid).length === 0) {
|
|
7062
7125
|
const assets = collectAssets([vtxo]);
|
|
7063
7126
|
received.push({
|
|
7064
7127
|
key: { ...txKey, arkTxid: vtxo.txid },
|
|
7065
|
-
|
|
7128
|
+
// The escrow paying out: a swap fill or a cancel spends the
|
|
7129
|
+
// gated coin and lands the proceeds here. Nothing else about
|
|
7130
|
+
// the row changes — the tag only names the counterparty.
|
|
7131
|
+
tag: paidOutOfGated.has(vtxo.txid) ? "gated" : "offchain",
|
|
7066
7132
|
type: "RECEIVED" /* TxReceived */,
|
|
7067
7133
|
amount: vtxo.value,
|
|
7068
7134
|
settled: vtxo.status.isLeaf || vtxo.isSpent,
|
|
@@ -7072,8 +7138,8 @@ async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnor
|
|
|
7072
7138
|
}
|
|
7073
7139
|
if (vtxo.isSpent) {
|
|
7074
7140
|
if (vtxo.arkTxId && !sent.some((s) => s.key.arkTxid === vtxo.arkTxId)) {
|
|
7075
|
-
const changes =
|
|
7076
|
-
const allSpent =
|
|
7141
|
+
const changes = ownVtxos.filter((_) => _.txid === vtxo.arkTxId);
|
|
7142
|
+
const allSpent = ownVtxos.filter((v) => v.arkTxId === vtxo.arkTxId);
|
|
7077
7143
|
const spentAmount = allSpent.reduce((acc, v) => acc + v.value, 0);
|
|
7078
7144
|
let txAmount = 0;
|
|
7079
7145
|
let txTime = 0;
|
|
@@ -7083,13 +7149,16 @@ async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnor
|
|
|
7083
7149
|
txTime = changes[0].createdAt.getTime();
|
|
7084
7150
|
} else {
|
|
7085
7151
|
txAmount = spentAmount;
|
|
7086
|
-
txTime = resolvedCreatedAt.get(vtxo.arkTxId) ?? vtxo.createdAt.getTime() + 1;
|
|
7152
|
+
txTime = localCreatedAt.get(vtxo.arkTxId) ?? resolvedCreatedAt.get(vtxo.arkTxId) ?? vtxo.createdAt.getTime() + 1;
|
|
7087
7153
|
}
|
|
7088
7154
|
const assets = subtractAssets(allSpent, changes);
|
|
7089
7155
|
if (txAmount !== 0 || assets) {
|
|
7090
7156
|
sent.push({
|
|
7091
7157
|
key: { ...txKey, arkTxid: vtxo.arkTxId },
|
|
7092
|
-
|
|
7158
|
+
// Funding the escrow: an output of this tx landed on a
|
|
7159
|
+
// gated contract of the wallet's, so the send is to the
|
|
7160
|
+
// user's own covenant rather than to a stranger.
|
|
7161
|
+
tag: paidIntoGated.has(vtxo.arkTxId) ? "gated" : "offchain",
|
|
7093
7162
|
type: "SENT" /* TxSent */,
|
|
7094
7163
|
amount: txAmount,
|
|
7095
7164
|
settled: true,
|
|
@@ -7099,10 +7168,10 @@ async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnor
|
|
|
7099
7168
|
}
|
|
7100
7169
|
}
|
|
7101
7170
|
if (vtxo.settledBy && !commitmentsToIgnore.has(vtxo.settledBy) && !sent.some((s) => s.key.commitmentTxid === vtxo.settledBy)) {
|
|
7102
|
-
const changes =
|
|
7171
|
+
const changes = ownVtxos.filter(
|
|
7103
7172
|
(v) => v.status.isLeaf && v.commitmentTxIds.length > 0 && v.commitmentTxIds.every((_) => vtxo.settledBy === _)
|
|
7104
7173
|
);
|
|
7105
|
-
const forfeitVtxos =
|
|
7174
|
+
const forfeitVtxos = ownVtxos.filter((v) => v.settledBy === vtxo.settledBy);
|
|
7106
7175
|
const forfeitAmount = forfeitVtxos.reduce((acc, v) => acc + v.value, 0);
|
|
7107
7176
|
if (changes.length > 0) {
|
|
7108
7177
|
const settledAmount = changes.reduce((acc, v) => acc + v.value, 0);
|
|
@@ -7185,7 +7254,7 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7185
7254
|
const virtualCoins = await this.wallet.getSpendableVtxos({
|
|
7186
7255
|
withRecoverable: false
|
|
7187
7256
|
});
|
|
7188
|
-
const controlAssetRef = params.controlAssetId ?
|
|
7257
|
+
const controlAssetRef = params.controlAssetId ? chunk4C5PMGBB_cjs.AssetRef.fromId(chunk4C5PMGBB_cjs.AssetId.fromString(params.controlAssetId)) : null;
|
|
7189
7258
|
const coinSelection = selectVirtualCoins(virtualCoins, Number(this.wallet.dustAmount));
|
|
7190
7259
|
let totalBtcSelected = 0n;
|
|
7191
7260
|
const assetChanges = /* @__PURE__ */ new Map();
|
|
@@ -7198,8 +7267,8 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7198
7267
|
}
|
|
7199
7268
|
}
|
|
7200
7269
|
const groups = [];
|
|
7201
|
-
const issuedAssetOutput =
|
|
7202
|
-
const issuedAssetGroup =
|
|
7270
|
+
const issuedAssetOutput = chunk4C5PMGBB_cjs.AssetOutput.create(0, params.amount);
|
|
7271
|
+
const issuedAssetGroup = chunk4C5PMGBB_cjs.AssetGroup.create(
|
|
7203
7272
|
null,
|
|
7204
7273
|
controlAssetRef,
|
|
7205
7274
|
[],
|
|
@@ -7214,28 +7283,28 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7214
7283
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7215
7284
|
for (const asset of assets) {
|
|
7216
7285
|
if (asset.assetId !== assetId) continue;
|
|
7217
|
-
changeInputs.push(
|
|
7286
|
+
changeInputs.push(chunk4C5PMGBB_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7218
7287
|
}
|
|
7219
7288
|
}
|
|
7220
7289
|
groups.push(
|
|
7221
|
-
|
|
7222
|
-
|
|
7290
|
+
chunk4C5PMGBB_cjs.AssetGroup.create(
|
|
7291
|
+
chunk4C5PMGBB_cjs.AssetId.fromString(assetId),
|
|
7223
7292
|
null,
|
|
7224
7293
|
changeInputs,
|
|
7225
|
-
[
|
|
7294
|
+
[chunk4C5PMGBB_cjs.AssetOutput.create(0, amount)],
|
|
7226
7295
|
[]
|
|
7227
7296
|
)
|
|
7228
7297
|
);
|
|
7229
7298
|
}
|
|
7230
7299
|
}
|
|
7231
7300
|
const address = await this.wallet.getAddress();
|
|
7232
|
-
const outputAddress =
|
|
7301
|
+
const outputAddress = chunk6FTHFJAN_cjs.ArkAddress.decode(address);
|
|
7233
7302
|
const outputs = [
|
|
7234
7303
|
{
|
|
7235
7304
|
script: outputAddress.pkScript,
|
|
7236
7305
|
amount: BigInt(totalBtcSelected)
|
|
7237
7306
|
},
|
|
7238
|
-
Extension.create([
|
|
7307
|
+
Extension.create([chunk4C5PMGBB_cjs.Packet.create(groups)]).txOut()
|
|
7239
7308
|
];
|
|
7240
7309
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(
|
|
7241
7310
|
coinSelection.inputs,
|
|
@@ -7243,7 +7312,7 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7243
7312
|
);
|
|
7244
7313
|
return {
|
|
7245
7314
|
arkTxId: arkTxid,
|
|
7246
|
-
assetId:
|
|
7315
|
+
assetId: chunk4C5PMGBB_cjs.AssetId.create(arkTxid, 0).toString()
|
|
7247
7316
|
};
|
|
7248
7317
|
}
|
|
7249
7318
|
/**
|
|
@@ -7315,16 +7384,16 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7315
7384
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7316
7385
|
for (const asset of assets) {
|
|
7317
7386
|
if (asset.assetId !== params.assetId) continue;
|
|
7318
|
-
reissueInputs.push(
|
|
7387
|
+
reissueInputs.push(chunk4C5PMGBB_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7319
7388
|
}
|
|
7320
7389
|
}
|
|
7321
7390
|
const totalAssetAmount = assetToReissueAmount + params.amount;
|
|
7322
|
-
const reissueAssetIdObj =
|
|
7323
|
-
const reissueAssetGroup =
|
|
7391
|
+
const reissueAssetIdObj = chunk4C5PMGBB_cjs.AssetId.fromString(params.assetId);
|
|
7392
|
+
const reissueAssetGroup = chunk4C5PMGBB_cjs.AssetGroup.create(
|
|
7324
7393
|
reissueAssetIdObj,
|
|
7325
7394
|
null,
|
|
7326
7395
|
reissueInputs,
|
|
7327
|
-
[
|
|
7396
|
+
[chunk4C5PMGBB_cjs.AssetOutput.create(0, totalAssetAmount)],
|
|
7328
7397
|
[]
|
|
7329
7398
|
);
|
|
7330
7399
|
const groups = [reissueAssetGroup];
|
|
@@ -7333,27 +7402,27 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7333
7402
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7334
7403
|
for (const asset of assets) {
|
|
7335
7404
|
if (asset.assetId !== assetId) continue;
|
|
7336
|
-
changeInputs.push(
|
|
7405
|
+
changeInputs.push(chunk4C5PMGBB_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7337
7406
|
}
|
|
7338
7407
|
}
|
|
7339
7408
|
groups.push(
|
|
7340
|
-
|
|
7341
|
-
|
|
7409
|
+
chunk4C5PMGBB_cjs.AssetGroup.create(
|
|
7410
|
+
chunk4C5PMGBB_cjs.AssetId.fromString(assetId),
|
|
7342
7411
|
null,
|
|
7343
7412
|
changeInputs,
|
|
7344
|
-
[
|
|
7413
|
+
[chunk4C5PMGBB_cjs.AssetOutput.create(0, amount)],
|
|
7345
7414
|
[]
|
|
7346
7415
|
)
|
|
7347
7416
|
);
|
|
7348
7417
|
}
|
|
7349
7418
|
const address = await this.wallet.getAddress();
|
|
7350
|
-
const outputAddress =
|
|
7419
|
+
const outputAddress = chunk6FTHFJAN_cjs.ArkAddress.decode(address);
|
|
7351
7420
|
const outputs = [
|
|
7352
7421
|
{
|
|
7353
7422
|
script: outputAddress.pkScript,
|
|
7354
7423
|
amount: BigInt(totalBtcSelected)
|
|
7355
7424
|
},
|
|
7356
|
-
Extension.create([
|
|
7425
|
+
Extension.create([chunk4C5PMGBB_cjs.Packet.create(groups)]).txOut()
|
|
7357
7426
|
];
|
|
7358
7427
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
|
|
7359
7428
|
return arkTxid;
|
|
@@ -7420,27 +7489,27 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7420
7489
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7421
7490
|
for (const asset of assets) {
|
|
7422
7491
|
if (asset.assetId !== assetId) continue;
|
|
7423
|
-
changeInputs.push(
|
|
7492
|
+
changeInputs.push(chunk4C5PMGBB_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7424
7493
|
}
|
|
7425
7494
|
}
|
|
7426
7495
|
groups.push(
|
|
7427
|
-
|
|
7428
|
-
|
|
7496
|
+
chunk4C5PMGBB_cjs.AssetGroup.create(
|
|
7497
|
+
chunk4C5PMGBB_cjs.AssetId.fromString(assetId),
|
|
7429
7498
|
null,
|
|
7430
7499
|
changeInputs,
|
|
7431
|
-
amount > 0n ? [
|
|
7500
|
+
amount > 0n ? [chunk4C5PMGBB_cjs.AssetOutput.create(0, amount)] : [],
|
|
7432
7501
|
[]
|
|
7433
7502
|
)
|
|
7434
7503
|
);
|
|
7435
7504
|
}
|
|
7436
7505
|
const address = await this.wallet.getAddress();
|
|
7437
|
-
const outputAddress =
|
|
7506
|
+
const outputAddress = chunk6FTHFJAN_cjs.ArkAddress.decode(address);
|
|
7438
7507
|
const outputs = [
|
|
7439
7508
|
{
|
|
7440
7509
|
script: outputAddress.pkScript,
|
|
7441
7510
|
amount: BigInt(totalBtcSelected)
|
|
7442
7511
|
},
|
|
7443
|
-
Extension.create([
|
|
7512
|
+
Extension.create([chunk4C5PMGBB_cjs.Packet.create(groups)]).txOut()
|
|
7444
7513
|
];
|
|
7445
7514
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
|
|
7446
7515
|
return arkTxid;
|
|
@@ -7465,7 +7534,7 @@ function castMetadata(metadata) {
|
|
|
7465
7534
|
} else {
|
|
7466
7535
|
throw new Error("Invalid metadata value type");
|
|
7467
7536
|
}
|
|
7468
|
-
md.push(
|
|
7537
|
+
md.push(chunk4C5PMGBB_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
|
|
7469
7538
|
}
|
|
7470
7539
|
return md;
|
|
7471
7540
|
}
|
|
@@ -7486,10 +7555,10 @@ var DelegateManagerImpl = class {
|
|
|
7486
7555
|
if (vtxos.length === 0) {
|
|
7487
7556
|
return { delegated: [], failed: [] };
|
|
7488
7557
|
}
|
|
7489
|
-
const destinationScript =
|
|
7558
|
+
const destinationScript = chunk6FTHFJAN_cjs.ArkAddress.decode(destination).pkScript;
|
|
7490
7559
|
const arkInfo = await this.arkInfoProvider.getInfo();
|
|
7491
7560
|
const delegateInfo = await this.delegateProvider.getDelegateInfo();
|
|
7492
|
-
const eligible = vtxos.map(
|
|
7561
|
+
const eligible = vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo).filter(
|
|
7493
7562
|
(v) => isAnnotated(v) && findDelegateTapLeaf(v, delegateInfo.pubkey) !== void 0
|
|
7494
7563
|
);
|
|
7495
7564
|
if (eligible.length === 0) {
|
|
@@ -7518,11 +7587,11 @@ var DelegateManagerImpl = class {
|
|
|
7518
7587
|
const groupByExpiry = /* @__PURE__ */ new Map();
|
|
7519
7588
|
let recoverableVtxos = [];
|
|
7520
7589
|
for (const vtxo of eligible) {
|
|
7521
|
-
if (
|
|
7590
|
+
if (chunk6FTHFJAN_cjs.canRecoverOnchain(vtxo, now)) {
|
|
7522
7591
|
recoverableVtxos.push(vtxo);
|
|
7523
7592
|
continue;
|
|
7524
7593
|
}
|
|
7525
|
-
const expiry =
|
|
7594
|
+
const expiry = chunk6FTHFJAN_cjs.toBatchExpiry(vtxo);
|
|
7526
7595
|
if (!expiry) continue;
|
|
7527
7596
|
const dayKey = getDayTimestamp(expiry);
|
|
7528
7597
|
groupByExpiry.set(dayKey, [...groupByExpiry.get(dayKey) ?? [], vtxo]);
|
|
@@ -7587,7 +7656,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7587
7656
|
}
|
|
7588
7657
|
if (!delegateAt) {
|
|
7589
7658
|
const now = { timestamp: /* @__PURE__ */ new Date() };
|
|
7590
|
-
const expiryTimestamp = vtxos.filter((coin) => !
|
|
7659
|
+
const expiryTimestamp = vtxos.filter((coin) => !chunk6FTHFJAN_cjs.canRecoverOnchain(coin, now) && chunk6FTHFJAN_cjs.toBatchExpiry(coin)).reduce((min, coin) => Math.min(min, chunk6FTHFJAN_cjs.toBatchExpiry(coin)), Number.MAX_SAFE_INTEGER);
|
|
7591
7660
|
if (!expiryTimestamp || expiryTimestamp === Number.MAX_SAFE_INTEGER) {
|
|
7592
7661
|
delegateAt = new Date(Date.now() + 1 * 60 * 1e3);
|
|
7593
7662
|
} else {
|
|
@@ -7616,7 +7685,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7616
7685
|
let amount = 0n;
|
|
7617
7686
|
for (const coin of vtxos) {
|
|
7618
7687
|
const inputFee = estimator.evalOffchainInput({
|
|
7619
|
-
...
|
|
7688
|
+
...chunk6FTHFJAN_cjs.toOffchainInputFeeParams(coin),
|
|
7620
7689
|
type: "vtxo"
|
|
7621
7690
|
});
|
|
7622
7691
|
if (inputFee.value >= coin.value) {
|
|
@@ -7630,7 +7699,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7630
7699
|
const delegateFee = BigInt(Number(fee));
|
|
7631
7700
|
if (delegateFee > 0n) {
|
|
7632
7701
|
outputs.push({
|
|
7633
|
-
script:
|
|
7702
|
+
script: chunk6FTHFJAN_cjs.ArkAddress.decode(delegateAddress).pkScript,
|
|
7634
7703
|
amount: delegateFee
|
|
7635
7704
|
});
|
|
7636
7705
|
}
|
|
@@ -7663,10 +7732,10 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7663
7732
|
destinationScript
|
|
7664
7733
|
);
|
|
7665
7734
|
const forfeitOutputScript = btcSigner.OutScript.encode(
|
|
7666
|
-
btcSigner.Address(
|
|
7735
|
+
btcSigner.Address(chunk6FTHFJAN_cjs.getNetwork(network)).decode(forfeitAddress)
|
|
7667
7736
|
);
|
|
7668
7737
|
const forfeits = await Promise.all(
|
|
7669
|
-
vtxos.filter((v) => !
|
|
7738
|
+
vtxos.filter((v) => !chunk6FTHFJAN_cjs.canRecoverOnchain(v, { timestamp: /* @__PURE__ */ new Date() })).map(async (coin) => {
|
|
7670
7739
|
const forfeit = await makeDelegateForfeitTx(
|
|
7671
7740
|
coin,
|
|
7672
7741
|
dust,
|
|
@@ -7691,7 +7760,7 @@ async function makeDelegateForfeitTx(input, connectorAmount, delegatePubkey, for
|
|
|
7691
7760
|
index: input.vout,
|
|
7692
7761
|
witnessUtxo: {
|
|
7693
7762
|
amount: BigInt(input.value),
|
|
7694
|
-
script:
|
|
7763
|
+
script: chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
7695
7764
|
},
|
|
7696
7765
|
sighashType: btcSigner.SigHash.ALL_ANYONECANPAY,
|
|
7697
7766
|
tapLeafScript: [delegateTapLeaf]
|
|
@@ -7749,7 +7818,7 @@ async function makeSignedDelegateIntent(identity, coins, outputs, onchainOutputs
|
|
|
7749
7818
|
expire_at: 0,
|
|
7750
7819
|
cosigners_public_keys: cosignerPubKeys
|
|
7751
7820
|
};
|
|
7752
|
-
const proof =
|
|
7821
|
+
const proof = chunk6FTHFJAN_cjs.Intent.create(message, coins, outputs);
|
|
7753
7822
|
const signedProof = await identity.sign(proof);
|
|
7754
7823
|
return {
|
|
7755
7824
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -7767,10 +7836,10 @@ function getDayTimestamp(timestamp) {
|
|
|
7767
7836
|
function findDelegateTapLeaf(vtxo, delegatePubkey) {
|
|
7768
7837
|
if (!vtxo.tapTree) return void 0;
|
|
7769
7838
|
const pk = delegatePubkey.length === 66 ? delegatePubkey.slice(2) : delegatePubkey;
|
|
7770
|
-
const vtxoScript =
|
|
7839
|
+
const vtxoScript = chunk6FTHFJAN_cjs.VtxoScript.decode(vtxo.tapTree);
|
|
7771
7840
|
return vtxoScript.leaves.find((tapLeaf) => {
|
|
7772
|
-
const arkTapscript =
|
|
7773
|
-
if (!
|
|
7841
|
+
const arkTapscript = chunk6FTHFJAN_cjs.decodeTapscript(chunk6FTHFJAN_cjs.scriptFromTapLeafScript(tapLeaf));
|
|
7842
|
+
if (!chunk6FTHFJAN_cjs.MultisigTapscript.is(arkTapscript)) return false;
|
|
7774
7843
|
return arkTapscript.params.pubkeys.map(base.hex.encode).includes(pk);
|
|
7775
7844
|
});
|
|
7776
7845
|
}
|
|
@@ -8051,7 +8120,7 @@ function createManagedConnection(dbName, version, initDatabase2) {
|
|
|
8051
8120
|
};
|
|
8052
8121
|
}
|
|
8053
8122
|
function scriptFromArkAddress(address) {
|
|
8054
|
-
return base.hex.encode(
|
|
8123
|
+
return base.hex.encode(chunk6FTHFJAN_cjs.ArkAddress.decode(address).pkScript);
|
|
8055
8124
|
}
|
|
8056
8125
|
|
|
8057
8126
|
// src/repositories/indexedDB/schema.ts
|
|
@@ -8546,7 +8615,7 @@ function validateVtxosForScript(vtxos, script, context) {
|
|
|
8546
8615
|
}
|
|
8547
8616
|
async function getVtxosForContract(repo, contract) {
|
|
8548
8617
|
const vtxos = repo.getVtxosForScript ? await repo.getVtxosForScript(contract.script) : filterVtxosForScript(await repo.getVtxos(contract.address), contract.script);
|
|
8549
|
-
return vtxos.map(
|
|
8618
|
+
return vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo);
|
|
8550
8619
|
}
|
|
8551
8620
|
async function saveVtxosForContract(repo, contract, vtxos) {
|
|
8552
8621
|
if (repo.saveVtxosForScript) {
|
|
@@ -8688,7 +8757,7 @@ function decodeArkContract(encoded) {
|
|
|
8688
8757
|
}
|
|
8689
8758
|
function contractFromArkContract(encoded, options = {}) {
|
|
8690
8759
|
const parsed = decodeArkContract(encoded);
|
|
8691
|
-
const handler =
|
|
8760
|
+
const handler = chunkNPM5YZBC_cjs.contractHandlers.get(parsed.type);
|
|
8692
8761
|
if (!handler) {
|
|
8693
8762
|
throw new Error(`No handler registered for contract type '${parsed.type}'`);
|
|
8694
8763
|
}
|
|
@@ -8702,9 +8771,9 @@ function contractFromArkContract(encoded, options = {}) {
|
|
|
8702
8771
|
metadata: options.metadata
|
|
8703
8772
|
};
|
|
8704
8773
|
}
|
|
8705
|
-
function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix =
|
|
8774
|
+
function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunk6FTHFJAN_cjs.DEFAULT_NETWORK.hrp, options = {}) {
|
|
8706
8775
|
const parsed = decodeArkContract(encoded);
|
|
8707
|
-
const handler =
|
|
8776
|
+
const handler = chunkNPM5YZBC_cjs.contractHandlers.getOrThrow(parsed.type);
|
|
8708
8777
|
const params = parsed.data;
|
|
8709
8778
|
const vtxoScript = handler.createScript(params);
|
|
8710
8779
|
return {
|
|
@@ -9001,9 +9070,9 @@ var ContractWatcher = class {
|
|
|
9001
9070
|
this.connectionState = "connected";
|
|
9002
9071
|
this.reconnectAttempts = 0;
|
|
9003
9072
|
this.listenLoop().catch((e) => {
|
|
9004
|
-
if (
|
|
9073
|
+
if (chunk6FTHFJAN_cjs.isEventSourceError(e)) {
|
|
9005
9074
|
console.debug("ContractWatcher subscription disconnected; reconnecting");
|
|
9006
|
-
} else if (!
|
|
9075
|
+
} else if (!chunk6FTHFJAN_cjs.isEventSourceUnavailableError(e)) {
|
|
9007
9076
|
console.error(e);
|
|
9008
9077
|
}
|
|
9009
9078
|
this.connectionState = "disconnected";
|
|
@@ -9015,7 +9084,7 @@ var ContractWatcher = class {
|
|
|
9015
9084
|
this.scheduleReconnect();
|
|
9016
9085
|
});
|
|
9017
9086
|
} catch (error) {
|
|
9018
|
-
if (!
|
|
9087
|
+
if (!chunk6FTHFJAN_cjs.isEventSourceUnavailableError(error)) {
|
|
9019
9088
|
console.error("ContractWatcher connection failed:", error);
|
|
9020
9089
|
}
|
|
9021
9090
|
this.connectionState = "disconnected";
|
|
@@ -9041,7 +9110,7 @@ var ContractWatcher = class {
|
|
|
9041
9110
|
* slower; what it loses is push latency.
|
|
9042
9111
|
*/
|
|
9043
9112
|
reportEventSourceUnavailable(error) {
|
|
9044
|
-
if (!
|
|
9113
|
+
if (!chunk6FTHFJAN_cjs.isEventSourceUnavailableError(error)) return false;
|
|
9045
9114
|
if (!this.eventSourceReported) {
|
|
9046
9115
|
this.eventSourceReported = true;
|
|
9047
9116
|
console.warn(
|
|
@@ -9113,7 +9182,7 @@ var ContractWatcher = class {
|
|
|
9113
9182
|
const now = Date.now();
|
|
9114
9183
|
let current;
|
|
9115
9184
|
try {
|
|
9116
|
-
current = await
|
|
9185
|
+
current = await chunk6FTHFJAN_cjs.getAllNormalizedVtxos(this.config.indexerProvider, scripts, {
|
|
9117
9186
|
spendableOnly: true
|
|
9118
9187
|
});
|
|
9119
9188
|
} catch (error) {
|
|
@@ -9166,13 +9235,14 @@ var ContractWatcher = class {
|
|
|
9166
9235
|
try {
|
|
9167
9236
|
const vtxosMap = await this.getContractVtxos({
|
|
9168
9237
|
contractScripts,
|
|
9169
|
-
includeSpent:
|
|
9170
|
-
// only spendable ones!
|
|
9238
|
+
includeSpent: true
|
|
9171
9239
|
});
|
|
9172
9240
|
for (const contractScript of contractScripts) {
|
|
9173
9241
|
const state = this.contracts.get(contractScript);
|
|
9174
9242
|
if (!state) continue;
|
|
9175
|
-
const
|
|
9243
|
+
const known = vtxosMap.get(contractScript) || [];
|
|
9244
|
+
const knownByKey = new Map(known.map((v) => [`${v.txid}:${v.vout}`, v]));
|
|
9245
|
+
const currentVtxos = known.filter((v) => !v.isSpent);
|
|
9176
9246
|
const currentKeys = new Set(currentVtxos.map((v) => `${v.txid}:${v.vout}`));
|
|
9177
9247
|
const newVtxos = [];
|
|
9178
9248
|
for (const vtxo of currentVtxos) {
|
|
@@ -9185,7 +9255,7 @@ var ContractWatcher = class {
|
|
|
9185
9255
|
const spentVtxos = [];
|
|
9186
9256
|
for (const [key, vtxo] of state.lastKnownVtxos) {
|
|
9187
9257
|
if (!currentKeys.has(key)) {
|
|
9188
|
-
spentVtxos.push(vtxo);
|
|
9258
|
+
spentVtxos.push(knownByKey.get(key) ?? vtxo);
|
|
9189
9259
|
state.lastKnownVtxos.delete(key);
|
|
9190
9260
|
}
|
|
9191
9261
|
}
|
|
@@ -9321,14 +9391,14 @@ var ContractWatcher = class {
|
|
|
9321
9391
|
const timestamp = Date.now();
|
|
9322
9392
|
if (update.newVtxos?.length) {
|
|
9323
9393
|
this.processSubscriptionVtxos(
|
|
9324
|
-
update.newVtxos.map(
|
|
9394
|
+
update.newVtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo),
|
|
9325
9395
|
"vtxo_received",
|
|
9326
9396
|
timestamp
|
|
9327
9397
|
);
|
|
9328
9398
|
}
|
|
9329
9399
|
if (update.spentVtxos?.length) {
|
|
9330
9400
|
this.processSubscriptionVtxos(
|
|
9331
|
-
update.spentVtxos.map(
|
|
9401
|
+
update.spentVtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo),
|
|
9332
9402
|
"vtxo_spent",
|
|
9333
9403
|
timestamp
|
|
9334
9404
|
);
|
|
@@ -9356,8 +9426,8 @@ var ContractWatcher = class {
|
|
|
9356
9426
|
continue;
|
|
9357
9427
|
}
|
|
9358
9428
|
if (target === byWatchedScript && eventType === "vtxo_received") {
|
|
9359
|
-
const n =
|
|
9360
|
-
if (
|
|
9429
|
+
const n = chunk6FTHFJAN_cjs.normalizeVtxo(vtxo);
|
|
9430
|
+
if (chunk6FTHFJAN_cjs.hasTerminalSpend(n) || n.isSwept || chunk6FTHFJAN_cjs.isPastExpiry(n, now)) continue;
|
|
9361
9431
|
}
|
|
9362
9432
|
let bucket = target.get(vtxo.script);
|
|
9363
9433
|
if (!bucket) {
|
|
@@ -9456,7 +9526,7 @@ var NON_TERMINAL_INTENT_STATES = ALL_INTENT_STATES.filter(
|
|
|
9456
9526
|
(s) => !isTerminalIntentState(s)
|
|
9457
9527
|
);
|
|
9458
9528
|
function isConsumed(vtxo) {
|
|
9459
|
-
return vtxo !== void 0 &&
|
|
9529
|
+
return vtxo !== void 0 && chunk6FTHFJAN_cjs.hasTerminalSpend(vtxo);
|
|
9460
9530
|
}
|
|
9461
9531
|
async function classifyIntent(intent, vtxosByOutpoint, now) {
|
|
9462
9532
|
if (isTerminalIntentState(intent.state)) return void 0;
|
|
@@ -9499,7 +9569,7 @@ async function reconcileIntents(deps) {
|
|
|
9499
9569
|
let vtxosByOutpoint = /* @__PURE__ */ new Map();
|
|
9500
9570
|
if (outpoints.length > 0) {
|
|
9501
9571
|
try {
|
|
9502
|
-
const { vtxos } = await
|
|
9572
|
+
const { vtxos } = await chunk6FTHFJAN_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
|
|
9503
9573
|
vtxosByOutpoint = new Map(vtxos.map((v) => [outpointKey(v), v]));
|
|
9504
9574
|
} catch (e) {
|
|
9505
9575
|
console.error("reconcileIntents: failed to fetch input VTXO state", e);
|
|
@@ -9579,6 +9649,7 @@ var ContractManager = class _ContractManager {
|
|
|
9579
9649
|
syncDegradedReason;
|
|
9580
9650
|
/** Epoch-ms of the last successful provider sync, if any. */
|
|
9581
9651
|
lastSyncedAt;
|
|
9652
|
+
syncedAtByScript = /* @__PURE__ */ new Map();
|
|
9582
9653
|
/** Last chain tip read, with the epoch-ms it was read at. @see currentChainTip */
|
|
9583
9654
|
chainTipCache;
|
|
9584
9655
|
/** In-flight chain tip read, so concurrent cache misses share one. */
|
|
@@ -9632,6 +9703,10 @@ var ContractManager = class _ContractManager {
|
|
|
9632
9703
|
lastSyncedAt: this.lastSyncedAt
|
|
9633
9704
|
};
|
|
9634
9705
|
}
|
|
9706
|
+
/** @see ContractManagerConfig.vtxoSyncMaxAgeMs — for factory-built managers. */
|
|
9707
|
+
setVtxoSyncMaxAge(maxAgeMs) {
|
|
9708
|
+
this.config.vtxoSyncMaxAgeMs = maxAgeMs;
|
|
9709
|
+
}
|
|
9635
9710
|
markSyncOnline() {
|
|
9636
9711
|
this.lastSyncedAt = Date.now();
|
|
9637
9712
|
this.syncDegradedReason = this.annotationDegradedReason();
|
|
@@ -9673,7 +9748,7 @@ var ContractManager = class _ContractManager {
|
|
|
9673
9748
|
await this.reconcileWatched();
|
|
9674
9749
|
this.markSyncOnline();
|
|
9675
9750
|
} catch (err) {
|
|
9676
|
-
if (!
|
|
9751
|
+
if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
|
|
9677
9752
|
this.markSyncDegraded(err);
|
|
9678
9753
|
}
|
|
9679
9754
|
this.initialized = true;
|
|
@@ -9805,7 +9880,7 @@ var ContractManager = class _ContractManager {
|
|
|
9805
9880
|
const from = Math.max(0, watermark - lookAhead.size);
|
|
9806
9881
|
const to = watermark + lookAhead.size;
|
|
9807
9882
|
const deps = lookAhead.candidateDeps();
|
|
9808
|
-
const handlers =
|
|
9883
|
+
const handlers = chunkNPM5YZBC_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkNPM5YZBC_cjs.contractHandlers.get(t)).filter(hasCandidates);
|
|
9809
9884
|
const band = /* @__PURE__ */ new Map();
|
|
9810
9885
|
for (let index = from; index <= to; index++) {
|
|
9811
9886
|
const descriptor = lookAhead.materialize(index);
|
|
@@ -9816,7 +9891,7 @@ var ContractManager = class _ContractManager {
|
|
|
9816
9891
|
index,
|
|
9817
9892
|
params: {
|
|
9818
9893
|
...candidate,
|
|
9819
|
-
...
|
|
9894
|
+
...chunkNPM5YZBC_cjs.speculativeReceiveMetadata(descriptor)
|
|
9820
9895
|
}
|
|
9821
9896
|
});
|
|
9822
9897
|
}
|
|
@@ -9878,7 +9953,7 @@ var ContractManager = class _ContractManager {
|
|
|
9878
9953
|
});
|
|
9879
9954
|
for (const entry of pending) entry.catchUpPending = false;
|
|
9880
9955
|
} catch (err) {
|
|
9881
|
-
if (!
|
|
9956
|
+
if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
|
|
9882
9957
|
this.markSyncDegraded(err);
|
|
9883
9958
|
}
|
|
9884
9959
|
}
|
|
@@ -9928,13 +10003,48 @@ var ContractManager = class _ContractManager {
|
|
|
9928
10003
|
await this.fetchContractVxosFromIndexer([contract]);
|
|
9929
10004
|
this.markSyncOnline();
|
|
9930
10005
|
} catch (err) {
|
|
9931
|
-
if (!
|
|
10006
|
+
if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
|
|
9932
10007
|
this.markSyncDegraded(err);
|
|
9933
10008
|
}
|
|
9934
10009
|
await this.watcher.addContract(contract);
|
|
9935
10010
|
}
|
|
9936
10011
|
return contract;
|
|
9937
10012
|
}
|
|
10013
|
+
/**
|
|
10014
|
+
* `createContract`'s step order, fetch batched: persist all, hydrate once,
|
|
10015
|
+
* then watch. Hydrating first keeps it equivalent — the watcher seeds from
|
|
10016
|
+
* the repository, so an unhydrated row reads as all-new. A part-way failure
|
|
10017
|
+
* still watches what it wrote; a retry reports those rows as existing.
|
|
10018
|
+
*/
|
|
10019
|
+
async createContracts(paramsList) {
|
|
10020
|
+
if (paramsList.length === 0) return [];
|
|
10021
|
+
return this.watcher.withCoalescedSubscription(async () => {
|
|
10022
|
+
const upserted = [];
|
|
10023
|
+
try {
|
|
10024
|
+
for (const params of paramsList) upserted.push(await this.upsertContract(params));
|
|
10025
|
+
} catch (err) {
|
|
10026
|
+
for (const u of upserted) {
|
|
10027
|
+
if (!u.persisted) continue;
|
|
10028
|
+
await this.watcher.addContract(u.contract).catch(
|
|
10029
|
+
(e) => console.error(`ContractManager: ${u.contract.script} left dark`, e)
|
|
10030
|
+
);
|
|
10031
|
+
}
|
|
10032
|
+
throw err;
|
|
10033
|
+
}
|
|
10034
|
+
const fresh = upserted.filter((u) => u.persisted).map((u) => u.contract);
|
|
10035
|
+
if (fresh.length > 0) {
|
|
10036
|
+
try {
|
|
10037
|
+
await this.fetchContractVxosFromIndexer(fresh);
|
|
10038
|
+
this.markSyncOnline();
|
|
10039
|
+
} catch (err) {
|
|
10040
|
+
if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
|
|
10041
|
+
this.markSyncDegraded(err);
|
|
10042
|
+
}
|
|
10043
|
+
for (const contract of fresh) await this.watcher.addContract(contract);
|
|
10044
|
+
}
|
|
10045
|
+
return upserted.map((u) => u.contract);
|
|
10046
|
+
});
|
|
10047
|
+
}
|
|
9938
10048
|
/**
|
|
9939
10049
|
* Lightweight variant of {@link createContract} for batch discovery
|
|
9940
10050
|
* paths (currently: {@link scanContracts}). Validates, dedupes, persists,
|
|
@@ -9965,7 +10075,7 @@ var ContractManager = class _ContractManager {
|
|
|
9965
10075
|
return result;
|
|
9966
10076
|
}
|
|
9967
10077
|
async upsertContractRow(params) {
|
|
9968
|
-
const handler =
|
|
10078
|
+
const handler = chunkNPM5YZBC_cjs.contractHandlers.get(params.type);
|
|
9969
10079
|
if (!handler) {
|
|
9970
10080
|
throw new Error(`No handler registered for contract type '${params.type}'`);
|
|
9971
10081
|
}
|
|
@@ -10065,7 +10175,7 @@ var ContractManager = class _ContractManager {
|
|
|
10065
10175
|
`scanContracts: batchSize must be a positive integer (got ${String(opts.batchSize)})`
|
|
10066
10176
|
);
|
|
10067
10177
|
}
|
|
10068
|
-
const registered =
|
|
10178
|
+
const registered = chunkNPM5YZBC_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkNPM5YZBC_cjs.contractHandlers.get(t)).filter(isDiscoverable);
|
|
10069
10179
|
const discoverables = [
|
|
10070
10180
|
...registered.filter((h) => h.type === "boarding"),
|
|
10071
10181
|
...registered.filter((h) => h.type !== "boarding")
|
|
@@ -10196,12 +10306,16 @@ var ContractManager = class _ContractManager {
|
|
|
10196
10306
|
}
|
|
10197
10307
|
async getContractsWithVtxos(filter, pageSize) {
|
|
10198
10308
|
const contracts = await this.getContracts(filter);
|
|
10199
|
-
|
|
10200
|
-
await this.
|
|
10201
|
-
|
|
10202
|
-
|
|
10203
|
-
|
|
10204
|
-
|
|
10309
|
+
if (this.syncedWithin(contracts, this.config.vtxoSyncMaxAgeMs ?? 0)) {
|
|
10310
|
+
await this.demoteFundedAwaitingContracts(contracts);
|
|
10311
|
+
} else {
|
|
10312
|
+
try {
|
|
10313
|
+
await this.syncContracts({ contracts, pageSize });
|
|
10314
|
+
this.markSyncOnline();
|
|
10315
|
+
} catch (err) {
|
|
10316
|
+
if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
|
|
10317
|
+
this.markSyncDegraded(err);
|
|
10318
|
+
}
|
|
10205
10319
|
}
|
|
10206
10320
|
const vtxos = await this.getVtxosForContracts(contracts);
|
|
10207
10321
|
return contracts.map((contract) => ({
|
|
@@ -10221,7 +10335,7 @@ var ContractManager = class _ContractManager {
|
|
|
10221
10335
|
}
|
|
10222
10336
|
const tapscriptCache = tapscripts ?? /* @__PURE__ */ new Map();
|
|
10223
10337
|
return vtxos.map(
|
|
10224
|
-
(vtxo) => extendVirtualCoinForContract(
|
|
10338
|
+
(vtxo) => extendVirtualCoinForContract(chunk6FTHFJAN_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
|
|
10225
10339
|
);
|
|
10226
10340
|
}
|
|
10227
10341
|
/** @inheritdoc */
|
|
@@ -10265,14 +10379,14 @@ var ContractManager = class _ContractManager {
|
|
|
10265
10379
|
const byScript = new Map(contracts.map((contract) => [contract.script, contract]));
|
|
10266
10380
|
const asking = vtxos.filter((vtxo) => {
|
|
10267
10381
|
const contract = byScript.get(vtxo.script);
|
|
10268
|
-
return contract !== void 0 &&
|
|
10382
|
+
return contract !== void 0 && chunkNPM5YZBC_cjs.contractHandlers.get(contract.type)?.assertSpendableNow !== void 0;
|
|
10269
10383
|
});
|
|
10270
10384
|
if (asking.length === 0) return refused;
|
|
10271
10385
|
const tip = await this.currentChainTip();
|
|
10272
10386
|
const walletKey = await walletPubKey?.();
|
|
10273
10387
|
for (const vtxo of asking) {
|
|
10274
10388
|
const contract = byScript.get(vtxo.script);
|
|
10275
|
-
const handler =
|
|
10389
|
+
const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
|
|
10276
10390
|
if (!handler?.assertSpendableNow) continue;
|
|
10277
10391
|
const context = {
|
|
10278
10392
|
collaborative: true,
|
|
@@ -10287,7 +10401,7 @@ var ContractManager = class _ContractManager {
|
|
|
10287
10401
|
// the next handler to answer a CSV question would meet a
|
|
10288
10402
|
// TypeError instead of a `false`. Carry the coin only when it
|
|
10289
10403
|
// really is one.
|
|
10290
|
-
vtxo:
|
|
10404
|
+
vtxo: chunk6FTHFJAN_cjs.isVirtualCoin(vtxo) && "status" in vtxo ? vtxo : void 0
|
|
10291
10405
|
};
|
|
10292
10406
|
try {
|
|
10293
10407
|
await handler.assertSpendableNow(
|
|
@@ -10443,7 +10557,7 @@ var ContractManager = class _ContractManager {
|
|
|
10443
10557
|
const { contractScript, collaborative = true, walletPubKey, vtxo } = options;
|
|
10444
10558
|
const [contract] = await this.getContracts({ script: contractScript });
|
|
10445
10559
|
if (!contract) return [];
|
|
10446
|
-
const handler =
|
|
10560
|
+
const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
|
|
10447
10561
|
if (!handler) return [];
|
|
10448
10562
|
const script = handler.createScript(contract.params);
|
|
10449
10563
|
const tip = await this.currentChainTip();
|
|
@@ -10471,7 +10585,7 @@ var ContractManager = class _ContractManager {
|
|
|
10471
10585
|
const { contractScript, collaborative = true, walletPubKey } = options;
|
|
10472
10586
|
const [contract] = await this.getContracts({ script: contractScript });
|
|
10473
10587
|
if (!contract) return [];
|
|
10474
|
-
const handler =
|
|
10588
|
+
const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
|
|
10475
10589
|
if (!handler) return [];
|
|
10476
10590
|
const script = handler.createScript(contract.params);
|
|
10477
10591
|
const context = {
|
|
@@ -10527,7 +10641,7 @@ var ContractManager = class _ContractManager {
|
|
|
10527
10641
|
}
|
|
10528
10642
|
async refreshOutpoints(outpoints) {
|
|
10529
10643
|
if (outpoints.length === 0) return;
|
|
10530
|
-
const { vtxos } = await
|
|
10644
|
+
const { vtxos } = await chunk6FTHFJAN_cjs.getNormalizedVtxos(this.config.indexerProvider, {
|
|
10531
10645
|
outpoints
|
|
10532
10646
|
});
|
|
10533
10647
|
if (vtxos.length === 0) return;
|
|
@@ -10616,13 +10730,14 @@ var ContractManager = class _ContractManager {
|
|
|
10616
10730
|
}
|
|
10617
10731
|
break;
|
|
10618
10732
|
case "connection_reset":
|
|
10733
|
+
this.syncedAtByScript.clear();
|
|
10619
10734
|
await this.scheduleLookAheadDrain();
|
|
10620
10735
|
await this.reconcileWatched();
|
|
10621
10736
|
this.markSyncOnline();
|
|
10622
10737
|
break;
|
|
10623
10738
|
}
|
|
10624
10739
|
} catch (err) {
|
|
10625
|
-
if (!
|
|
10740
|
+
if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
|
|
10626
10741
|
this.markSyncDegraded(err);
|
|
10627
10742
|
}
|
|
10628
10743
|
this.emitEvent(event);
|
|
@@ -10662,9 +10777,21 @@ var ContractManager = class _ContractManager {
|
|
|
10662
10777
|
const cutoff = cursorCutoff(requestStartedAt);
|
|
10663
10778
|
await advanceSyncCursor(this.config.walletRepository, cutoff);
|
|
10664
10779
|
}
|
|
10780
|
+
if (options.window === void 0) {
|
|
10781
|
+
for (const contract of contracts) {
|
|
10782
|
+
this.syncedAtByScript.set(contract.script, requestStartedAt);
|
|
10783
|
+
}
|
|
10784
|
+
}
|
|
10665
10785
|
await this.demoteFundedAwaitingContracts(contracts);
|
|
10666
10786
|
return result;
|
|
10667
10787
|
}
|
|
10788
|
+
syncedWithin(contracts, maxAgeMs) {
|
|
10789
|
+
if (maxAgeMs <= 0) return false;
|
|
10790
|
+
const floor = Date.now() - maxAgeMs;
|
|
10791
|
+
return contracts.every(
|
|
10792
|
+
(contract) => (this.syncedAtByScript.get(contract.script) ?? 0) >= floor
|
|
10793
|
+
);
|
|
10794
|
+
}
|
|
10668
10795
|
/**
|
|
10669
10796
|
* Demote every `awaiting-funds` contract in `contracts` that has been
|
|
10670
10797
|
* funded — the automatic half of {@link ContractWatchState}.
|
|
@@ -10701,7 +10828,7 @@ var ContractManager = class _ContractManager {
|
|
|
10701
10828
|
*/
|
|
10702
10829
|
async reconcilePendingFrontier(contracts) {
|
|
10703
10830
|
const scriptToContract = new Map(contracts.map((c) => [c.script, c]));
|
|
10704
|
-
const vtxos = await
|
|
10831
|
+
const vtxos = await chunk6FTHFJAN_cjs.getAllNormalizedVtxos(
|
|
10705
10832
|
this.config.indexerProvider,
|
|
10706
10833
|
contracts.map((c) => c.script),
|
|
10707
10834
|
{ pendingOnly: true }
|
|
@@ -10784,7 +10911,7 @@ var ContractManager = class _ContractManager {
|
|
|
10784
10911
|
}
|
|
10785
10912
|
return result;
|
|
10786
10913
|
}
|
|
10787
|
-
async fetchContractVtxosBulk(contracts, pageSize =
|
|
10914
|
+
async fetchContractVtxosBulk(contracts, pageSize = chunk6FTHFJAN_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
|
|
10788
10915
|
if (contracts.length === 0) {
|
|
10789
10916
|
return { vtxosByScript: /* @__PURE__ */ new Map(), promoted: /* @__PURE__ */ new Map() };
|
|
10790
10917
|
}
|
|
@@ -10800,7 +10927,7 @@ var ContractManager = class _ContractManager {
|
|
|
10800
10927
|
before: syncWindow.before
|
|
10801
10928
|
}
|
|
10802
10929
|
} : {};
|
|
10803
|
-
const vtxos = await
|
|
10930
|
+
const vtxos = await chunk6FTHFJAN_cjs.getAllNormalizedVtxos(
|
|
10804
10931
|
this.config.indexerProvider,
|
|
10805
10932
|
contracts.map((c) => c.script),
|
|
10806
10933
|
{ ...windowOpts, pageSize }
|
|
@@ -10945,7 +11072,7 @@ var deserializeTapLeaf = (t) => {
|
|
|
10945
11072
|
const s = base.hex.decode(t.s);
|
|
10946
11073
|
return [cb, s];
|
|
10947
11074
|
};
|
|
10948
|
-
var deserializeVtxo = (o) =>
|
|
11075
|
+
var deserializeVtxo = (o) => chunk6FTHFJAN_cjs.normalizeVtxo({
|
|
10949
11076
|
...o,
|
|
10950
11077
|
createdAt: new Date(o.createdAt),
|
|
10951
11078
|
tapTree: base.hex.decode(o.tapTree),
|
|
@@ -11768,7 +11895,7 @@ var HDDescriptorProvider = class _HDDescriptorProvider {
|
|
|
11768
11895
|
*/
|
|
11769
11896
|
materializeDescriptorAt(index) {
|
|
11770
11897
|
const descriptor = this.identity.descriptor;
|
|
11771
|
-
const network =
|
|
11898
|
+
const network = chunkNPM5YZBC_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
11772
11899
|
const expansion = descriptorsScure.expand({ descriptor, network, index });
|
|
11773
11900
|
const keyInfo = expansion.expansionMap?.["@0"];
|
|
11774
11901
|
if (!keyInfo?.keyExpression) {
|
|
@@ -11916,7 +12043,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
|
|
|
11916
12043
|
const provider = await resolveDescriptorProvider(config, setup.walletRepository);
|
|
11917
12044
|
if (!provider) return void 0;
|
|
11918
12045
|
const allowSilentFallback = (config.walletMode ?? "auto") === "auto";
|
|
11919
|
-
const expectedContractType = setup.offchainTapscript instanceof
|
|
12046
|
+
const expectedContractType = setup.offchainTapscript instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script ? "delegate" : "default";
|
|
11920
12047
|
const factoryOpts = {
|
|
11921
12048
|
walletRepository: setup.walletRepository,
|
|
11922
12049
|
contractRepository: setup.contractRepository,
|
|
@@ -12117,7 +12244,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
|
|
|
12117
12244
|
};
|
|
12118
12245
|
function deriveLeafPubkey(descriptor) {
|
|
12119
12246
|
try {
|
|
12120
|
-
return
|
|
12247
|
+
return chunkNPM5YZBC_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
12121
12248
|
} catch (e) {
|
|
12122
12249
|
throw new NonRangeableDescriptorError(
|
|
12123
12250
|
"Cannot derive leaf pubkey: descriptor is not a materialized, parsable tr(...) shape.",
|
|
@@ -12129,7 +12256,7 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
12129
12256
|
const pubKey = deriveLeafPubkey(descriptor);
|
|
12130
12257
|
const tapscript = rebuildTapscript(current, pubKey);
|
|
12131
12258
|
const serverPubKey = tapscript.options.serverPubKey;
|
|
12132
|
-
const csvTimelock =
|
|
12259
|
+
const csvTimelock = chunk6FTHFJAN_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
|
|
12133
12260
|
const base$1 = {
|
|
12134
12261
|
script: base.hex.encode(tapscript.pkScript),
|
|
12135
12262
|
address: tapscript.address(hrp, serverPubKey).encode(),
|
|
@@ -12140,11 +12267,11 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
12140
12267
|
// index-0 key. Without it, spends produce unsigned PSBTs that the
|
|
12141
12268
|
// server rejects with `INVALID_PSBT_INPUT (5): missing tapscript spend sig`.
|
|
12142
12269
|
metadata: {
|
|
12143
|
-
...tagSource && { source:
|
|
12270
|
+
...tagSource && { source: chunkNPM5YZBC_cjs.WALLET_RECEIVE_SOURCE },
|
|
12144
12271
|
signingDescriptor: descriptor
|
|
12145
12272
|
}
|
|
12146
12273
|
};
|
|
12147
|
-
const params = tapscript instanceof
|
|
12274
|
+
const params = tapscript instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script ? {
|
|
12148
12275
|
...base$1,
|
|
12149
12276
|
type: "delegate",
|
|
12150
12277
|
params: {
|
|
@@ -12165,10 +12292,10 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
12165
12292
|
return { tapscript, params };
|
|
12166
12293
|
}
|
|
12167
12294
|
function rebuildTapscript(current, pubKey) {
|
|
12168
|
-
if (current instanceof
|
|
12169
|
-
return new
|
|
12295
|
+
if (current instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script) {
|
|
12296
|
+
return new chunkNPM5YZBC_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
|
|
12170
12297
|
}
|
|
12171
|
-
return new
|
|
12298
|
+
return new chunkNPM5YZBC_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
|
|
12172
12299
|
}
|
|
12173
12300
|
async function pickActiveReceive(contractRepository, serverPubKey, expectedType) {
|
|
12174
12301
|
const candidates = await contractRepository.getContracts({
|
|
@@ -12177,7 +12304,7 @@ async function pickActiveReceive(contractRepository, serverPubKey, expectedType)
|
|
|
12177
12304
|
});
|
|
12178
12305
|
const serverPubKeyHex = base.hex.encode(serverPubKey);
|
|
12179
12306
|
const matching = candidates.filter(
|
|
12180
|
-
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source ===
|
|
12307
|
+
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkNPM5YZBC_cjs.WALLET_RECEIVE_SOURCE
|
|
12181
12308
|
).sort((a, b) => {
|
|
12182
12309
|
if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
|
|
12183
12310
|
return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
|
|
@@ -12233,7 +12360,7 @@ function computeOffchainBalance(vtxos, caps) {
|
|
|
12233
12360
|
}
|
|
12234
12361
|
};
|
|
12235
12362
|
for (const vtxo of vtxos) {
|
|
12236
|
-
if (
|
|
12363
|
+
if (chunk6FTHFJAN_cjs.hasTerminalSpend(vtxo)) continue;
|
|
12237
12364
|
addAssets(owned, vtxo);
|
|
12238
12365
|
if (vtxo.isUnrolled) {
|
|
12239
12366
|
unrolled += vtxo.value;
|
|
@@ -12243,11 +12370,11 @@ function computeOffchainBalance(vtxos, caps) {
|
|
|
12243
12370
|
pendingRecovery += vtxo.value;
|
|
12244
12371
|
continue;
|
|
12245
12372
|
}
|
|
12246
|
-
if (
|
|
12373
|
+
if (chunk6FTHFJAN_cjs.canRecoverOnchain(vtxo, now)) {
|
|
12247
12374
|
recoverable += vtxo.value;
|
|
12248
12375
|
continue;
|
|
12249
12376
|
}
|
|
12250
|
-
if (!
|
|
12377
|
+
if (!chunk6FTHFJAN_cjs.canSpendOffchain(vtxo, now)) continue;
|
|
12251
12378
|
if (vtxo.isPreconfirmed) {
|
|
12252
12379
|
preconfirmed += vtxo.value;
|
|
12253
12380
|
} else {
|
|
@@ -12417,12 +12544,12 @@ var InputSignerRouter = class {
|
|
|
12417
12544
|
};
|
|
12418
12545
|
|
|
12419
12546
|
// src/wallet/wallet.ts
|
|
12420
|
-
var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl ||
|
|
12547
|
+
var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunk6FTHFJAN_cjs.DEFAULT_ARKADE_SERVER_URL;
|
|
12421
12548
|
function intentProofJobs(coins) {
|
|
12422
12549
|
if (coins.length === 0) return [];
|
|
12423
12550
|
const coinJobs = coins.map((coin, i) => ({
|
|
12424
12551
|
index: i + 1,
|
|
12425
|
-
lookupScript:
|
|
12552
|
+
lookupScript: chunk6FTHFJAN_cjs.VtxoScript.decode(coin.tapTree).pkScript
|
|
12426
12553
|
}));
|
|
12427
12554
|
return [{ index: 0, lookupScript: coinJobs[0].lookupScript }, ...coinJobs];
|
|
12428
12555
|
}
|
|
@@ -12454,7 +12581,7 @@ function dedupeTimelocks(timelocks) {
|
|
|
12454
12581
|
const seen = /* @__PURE__ */ new Set();
|
|
12455
12582
|
const deduped = [];
|
|
12456
12583
|
for (const timelock of timelocks) {
|
|
12457
|
-
const sequence =
|
|
12584
|
+
const sequence = chunk6FTHFJAN_cjs.timelockToSequence(timelock).toString();
|
|
12458
12585
|
if (seen.has(sequence)) continue;
|
|
12459
12586
|
seen.add(sequence);
|
|
12460
12587
|
deduped.push(timelock);
|
|
@@ -12471,7 +12598,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
|
|
|
12471
12598
|
state: "active"
|
|
12472
12599
|
});
|
|
12473
12600
|
const newest = candidates.filter(
|
|
12474
|
-
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source ===
|
|
12601
|
+
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkNPM5YZBC_cjs.WALLET_RECEIVE_SOURCE
|
|
12475
12602
|
).sort((a, b) => {
|
|
12476
12603
|
if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
|
|
12477
12604
|
return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
|
|
@@ -12479,7 +12606,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
|
|
|
12479
12606
|
if (!newest?.params.pubKey) return baseline;
|
|
12480
12607
|
try {
|
|
12481
12608
|
const pubKey = base.hex.decode(newest.params.pubKey);
|
|
12482
|
-
return new
|
|
12609
|
+
return new chunkNPM5YZBC_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
|
|
12483
12610
|
} catch (e) {
|
|
12484
12611
|
console.warn("Skipping malformed boarding contract at boot", newest.script, e);
|
|
12485
12612
|
return baseline;
|
|
@@ -12498,10 +12625,10 @@ function filterSnapshotVtxos(snapshot, filter, pendingSpendOutpoints) {
|
|
|
12498
12625
|
if (vtxo.isUnrolled) {
|
|
12499
12626
|
return !!f.withUnrolled;
|
|
12500
12627
|
}
|
|
12501
|
-
if (
|
|
12628
|
+
if (chunk6FTHFJAN_cjs.hasTerminalSpend(vtxo)) {
|
|
12502
12629
|
return false;
|
|
12503
12630
|
}
|
|
12504
|
-
if (!f.withRecoverable &&
|
|
12631
|
+
if (!f.withRecoverable && chunk6FTHFJAN_cjs.canRecoverOnchain(vtxo, now)) {
|
|
12505
12632
|
return false;
|
|
12506
12633
|
}
|
|
12507
12634
|
return true;
|
|
@@ -12841,7 +12968,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12841
12968
|
*/
|
|
12842
12969
|
static async setupWalletConfig(config, pubKey) {
|
|
12843
12970
|
const arkadeServerUrl = getArkadeServerUrl(config);
|
|
12844
|
-
const arkProvider = config.arkProvider || new
|
|
12971
|
+
const arkProvider = config.arkProvider || new chunk6FTHFJAN_cjs.RestArkProvider(arkadeServerUrl);
|
|
12845
12972
|
let indexerProvider = config.indexerProvider;
|
|
12846
12973
|
if (!indexerProvider) {
|
|
12847
12974
|
let indexerUrl = config.indexerUrl;
|
|
@@ -12858,7 +12985,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12858
12985
|
indexerUrl = arkadeServerUrl;
|
|
12859
12986
|
}
|
|
12860
12987
|
}
|
|
12861
|
-
indexerProvider = new
|
|
12988
|
+
indexerProvider = new chunk4C5PMGBB_cjs.RestIndexerProvider(indexerUrl);
|
|
12862
12989
|
}
|
|
12863
12990
|
const walletRepository = config.storage?.walletRepository ?? new IndexedDBWalletRepository();
|
|
12864
12991
|
const contractRepository = config.storage?.contractRepository ?? new IndexedDBContractRepository();
|
|
@@ -12867,7 +12994,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12867
12994
|
source: serverInfoSource,
|
|
12868
12995
|
lastOnlineAt: serverInfoLastOnlineAt
|
|
12869
12996
|
} = await resolveArkInfo(arkProvider, walletRepository);
|
|
12870
|
-
const network =
|
|
12997
|
+
const network = chunk6FTHFJAN_cjs.getNetwork(info.network);
|
|
12871
12998
|
if ("descriptor" in config.identity) {
|
|
12872
12999
|
const descriptor = config.identity.descriptor;
|
|
12873
13000
|
const identityIsMainnet = !descriptor.includes("tpub");
|
|
@@ -12907,18 +13034,18 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12907
13034
|
value: info.boardingExitDelay,
|
|
12908
13035
|
type: info.boardingExitDelay < 512n ? "blocks" : "seconds"
|
|
12909
13036
|
};
|
|
12910
|
-
const serverPubKey =
|
|
12911
|
-
const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) =>
|
|
13037
|
+
const serverPubKey = chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
|
|
13038
|
+
const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : config.delegatorProvider ? await config.delegatorProvider.getDelegateInfo().then((info2) => chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : void 0;
|
|
12912
13039
|
const offchainOptions = {
|
|
12913
13040
|
pubKey,
|
|
12914
13041
|
serverPubKey,
|
|
12915
13042
|
csvTimelock: exitTimelock
|
|
12916
13043
|
};
|
|
12917
|
-
const offchainTapscript = !delegatePubKey ? new
|
|
12918
|
-
const boardingTapscript =
|
|
13044
|
+
const offchainTapscript = !delegatePubKey ? new chunkNPM5YZBC_cjs.DefaultVtxo.Script(offchainOptions) : new chunkNPM5YZBC_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
|
|
13045
|
+
const boardingTapscript = chunkNPM5YZBC_cjs.BoardingContractHandler.createScript({
|
|
12919
13046
|
pubKey: base.hex.encode(pubKey),
|
|
12920
13047
|
serverPubKey: base.hex.encode(serverPubKey),
|
|
12921
|
-
csvTimelock:
|
|
13048
|
+
csvTimelock: chunk6FTHFJAN_cjs.timelockToSequence(boardingTimelock).toString()
|
|
12922
13049
|
});
|
|
12923
13050
|
return {
|
|
12924
13051
|
arkProvider,
|
|
@@ -13070,7 +13197,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13070
13197
|
const vtxos = filterSnapshotVtxos(snapshot, filter, this._pendingSpendOutpoints);
|
|
13071
13198
|
const { gated, pendingRecovery } = this.spendabilityView(snapshot);
|
|
13072
13199
|
const selectable = vtxos.filter(
|
|
13073
|
-
(vtxo) => !
|
|
13200
|
+
(vtxo) => !isGatedVtxo(vtxo, gated) && !pendingRecovery.has(`${vtxo.txid}:${vtxo.vout}`)
|
|
13074
13201
|
);
|
|
13075
13202
|
const unlocked = await spendableVtxosExcludingLocked(selectable, this.intentRepository);
|
|
13076
13203
|
logExcludedVtxos("getSpendableVtxos", vtxos, [
|
|
@@ -13084,7 +13211,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13084
13211
|
if (!filter?.withUnrolled) {
|
|
13085
13212
|
logExcludedVtxos(
|
|
13086
13213
|
"getSpendableVtxos",
|
|
13087
|
-
snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !
|
|
13214
|
+
snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !chunk6FTHFJAN_cjs.hasTerminalSpend(vtxo)),
|
|
13088
13215
|
[() => UNROLLED_REASON]
|
|
13089
13216
|
);
|
|
13090
13217
|
}
|
|
@@ -13168,7 +13295,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13168
13295
|
*/
|
|
13169
13296
|
spendabilityView(snapshot) {
|
|
13170
13297
|
return {
|
|
13171
|
-
gated:
|
|
13298
|
+
gated: gatedFrom(snapshot),
|
|
13172
13299
|
pendingRecovery: this.selectPendingRecovery(snapshot)
|
|
13173
13300
|
};
|
|
13174
13301
|
}
|
|
@@ -13183,7 +13310,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13183
13310
|
return {
|
|
13184
13311
|
now: { timestamp: /* @__PURE__ */ new Date() },
|
|
13185
13312
|
isPendingRecovery: (vtxo) => pendingRecovery.has(`${vtxo.txid}:${vtxo.vout}`),
|
|
13186
|
-
isGenericallySpendable: (vtxo) => !
|
|
13313
|
+
isGenericallySpendable: (vtxo) => !isGatedVtxo(vtxo, gated),
|
|
13187
13314
|
isUnlocked: (vtxo) => unlocked.has(`${vtxo.txid}:${vtxo.vout}`)
|
|
13188
13315
|
};
|
|
13189
13316
|
}
|
|
@@ -13223,16 +13350,18 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13223
13350
|
* Return wallet transaction history derived from Arkade state and boarding transactions.
|
|
13224
13351
|
*/
|
|
13225
13352
|
async getTransactionHistory() {
|
|
13226
|
-
const
|
|
13227
|
-
|
|
13228
|
-
|
|
13229
|
-
|
|
13230
|
-
const
|
|
13353
|
+
const [snapshot, { boardingTxs, commitmentsToIgnore }] = await Promise.all([
|
|
13354
|
+
this.contractSnapshot(),
|
|
13355
|
+
this.getBoardingTxs()
|
|
13356
|
+
]);
|
|
13357
|
+
const allVtxos = snapshot.flatMap((_) => _.vtxos);
|
|
13358
|
+
const resolveTxCreatedAt = (txids) => chunk6FTHFJAN_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
|
|
13231
13359
|
return buildTransactionHistory(
|
|
13232
13360
|
allVtxos,
|
|
13233
13361
|
boardingTxs,
|
|
13234
13362
|
commitmentsToIgnore,
|
|
13235
|
-
resolveTxCreatedAt
|
|
13363
|
+
resolveTxCreatedAt,
|
|
13364
|
+
gatedFrom(snapshot)
|
|
13236
13365
|
);
|
|
13237
13366
|
}
|
|
13238
13367
|
/**
|
|
@@ -13321,7 +13450,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13321
13450
|
},
|
|
13322
13451
|
isUnrolled: true,
|
|
13323
13452
|
...boardingFacts,
|
|
13324
|
-
virtualStatus:
|
|
13453
|
+
virtualStatus: chunk6FTHFJAN_cjs.toVirtualStatus(boardingFacts),
|
|
13325
13454
|
spentBy: "",
|
|
13326
13455
|
createdAt: tx.status.confirmed ? new Date(tx.status.block_time * 1e3) : /* @__PURE__ */ new Date(0),
|
|
13327
13456
|
script: scriptHex
|
|
@@ -13377,9 +13506,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13377
13506
|
async getBoardingTapscripts(allowedSigners) {
|
|
13378
13507
|
const byScript = /* @__PURE__ */ new Map();
|
|
13379
13508
|
const add = (s) => byScript.set(base.hex.encode(s.pkScript), s);
|
|
13380
|
-
const boardingCsv = this.boardingTapscript.options.csvTimelock ??
|
|
13509
|
+
const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunkNPM5YZBC_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
13381
13510
|
add(
|
|
13382
|
-
new
|
|
13511
|
+
new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
|
|
13383
13512
|
pubKey: await this.identity.xOnlyPublicKey(),
|
|
13384
13513
|
serverPubKey: this.boardingTapscript.options.serverPubKey,
|
|
13385
13514
|
csvTimelock: boardingCsv
|
|
@@ -13394,7 +13523,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13394
13523
|
for (const c of boardingContracts) {
|
|
13395
13524
|
if (!allowed.has(toXOnlySignerHex(c.params.serverPubKey))) continue;
|
|
13396
13525
|
try {
|
|
13397
|
-
add(
|
|
13526
|
+
add(chunkNPM5YZBC_cjs.BoardingContractHandler.createScript(c.params));
|
|
13398
13527
|
} catch (e) {
|
|
13399
13528
|
console.warn("Skipping malformed boarding contract", c.script, e);
|
|
13400
13529
|
}
|
|
@@ -13432,7 +13561,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13432
13561
|
// Per-row CSV delay decoded from THIS tapscript's exit leaf —
|
|
13433
13562
|
// not the wallet's current boarding timelock, which a signer
|
|
13434
13563
|
// rotation may have changed.
|
|
13435
|
-
csvTimelock:
|
|
13564
|
+
csvTimelock: chunk6FTHFJAN_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
|
|
13436
13565
|
coins: utxos
|
|
13437
13566
|
});
|
|
13438
13567
|
}
|
|
@@ -13565,7 +13694,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13565
13694
|
/** Fetch Arkade transaction ids that are still pending final settlement. */
|
|
13566
13695
|
async fetchPendingTxs() {
|
|
13567
13696
|
const scripts = await this.getWalletScripts();
|
|
13568
|
-
const vtxos = await
|
|
13697
|
+
const vtxos = await chunk6FTHFJAN_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
|
|
13569
13698
|
return vtxos.filter(
|
|
13570
13699
|
(vtxo) => (vtxo.isSpent || vtxo.isPreconfirmed && !vtxo.isSwept) && vtxo.arkTxId !== void 0
|
|
13571
13700
|
).map((_) => _.arkTxId);
|
|
@@ -13596,7 +13725,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13596
13725
|
});
|
|
13597
13726
|
for (const contract of contracts) {
|
|
13598
13727
|
if (map.has(contract.script)) continue;
|
|
13599
|
-
const handler =
|
|
13728
|
+
const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
|
|
13600
13729
|
if (handler) {
|
|
13601
13730
|
const script = handler.createScript(contract.params);
|
|
13602
13731
|
map.set(contract.script, script);
|
|
@@ -13708,7 +13837,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13708
13837
|
}
|
|
13709
13838
|
});
|
|
13710
13839
|
const baselinePubkey = await this.identity.xOnlyPublicKey();
|
|
13711
|
-
const delegatePubKey = this.offchainTapscript instanceof
|
|
13840
|
+
const delegatePubKey = this.offchainTapscript instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
|
|
13712
13841
|
const baselineSigners = [
|
|
13713
13842
|
this.offchainTapscript.options.serverPubKey,
|
|
13714
13843
|
...[...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h))
|
|
@@ -13716,8 +13845,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13716
13845
|
const seenBaselineScripts = /* @__PURE__ */ new Set();
|
|
13717
13846
|
for (const serverPubKey of baselineSigners) {
|
|
13718
13847
|
for (const csvTimelock of this.walletContractTimelocks) {
|
|
13719
|
-
const csvTimelockStr =
|
|
13720
|
-
const defaultScript = new
|
|
13848
|
+
const csvTimelockStr = chunk6FTHFJAN_cjs.timelockToSequence(csvTimelock).toString();
|
|
13849
|
+
const defaultScript = new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
|
|
13721
13850
|
pubKey: baselinePubkey,
|
|
13722
13851
|
serverPubKey,
|
|
13723
13852
|
csvTimelock
|
|
@@ -13738,7 +13867,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13738
13867
|
});
|
|
13739
13868
|
}
|
|
13740
13869
|
if (delegatePubKey) {
|
|
13741
|
-
const delegateScript = new
|
|
13870
|
+
const delegateScript = new chunkNPM5YZBC_cjs.DelegateVtxo.Script({
|
|
13742
13871
|
pubKey: baselinePubkey,
|
|
13743
13872
|
serverPubKey,
|
|
13744
13873
|
delegatePubKey,
|
|
@@ -13762,9 +13891,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13762
13891
|
}
|
|
13763
13892
|
}
|
|
13764
13893
|
}
|
|
13765
|
-
const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ??
|
|
13894
|
+
const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunkNPM5YZBC_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
13766
13895
|
for (const serverPubKey of baselineSigners) {
|
|
13767
|
-
const baselineBoarding = new
|
|
13896
|
+
const baselineBoarding = new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
|
|
13768
13897
|
pubKey: baselinePubkey,
|
|
13769
13898
|
serverPubKey,
|
|
13770
13899
|
csvTimelock: boardingCsvTimelock
|
|
@@ -13777,7 +13906,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13777
13906
|
params: {
|
|
13778
13907
|
pubKey: base.hex.encode(baselineBoarding.options.pubKey),
|
|
13779
13908
|
serverPubKey: base.hex.encode(serverPubKey),
|
|
13780
|
-
csvTimelock:
|
|
13909
|
+
csvTimelock: chunk6FTHFJAN_cjs.timelockToSequence(boardingCsvTimelock).toString()
|
|
13781
13910
|
},
|
|
13782
13911
|
script: boardingScriptHex,
|
|
13783
13912
|
address: baselineBoarding.address(this.network.hrp, serverPubKey).encode(),
|
|
@@ -13977,7 +14106,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13977
14106
|
serverPubKey: this.offchainTapscript.options.serverPubKey,
|
|
13978
14107
|
deprecatedSignerPubKeys: [...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h)),
|
|
13979
14108
|
csvTimelocks: this.walletContractTimelocks,
|
|
13980
|
-
delegatePubKey: this.offchainTapscript instanceof
|
|
14109
|
+
delegatePubKey: this.offchainTapscript instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
|
|
13981
14110
|
};
|
|
13982
14111
|
}
|
|
13983
14112
|
_signerRouter;
|
|
@@ -14222,7 +14351,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14222
14351
|
const [row] = await manager.getContracts({ script: base.hex.encode(display.pkScript) });
|
|
14223
14352
|
const persisted = row?.metadata?.signingDescriptor;
|
|
14224
14353
|
if (typeof persisted === "string") return persisted;
|
|
14225
|
-
return
|
|
14354
|
+
return chunkNPM5YZBC_cjs.identityDescriptor(this.identity);
|
|
14226
14355
|
}
|
|
14227
14356
|
/**
|
|
14228
14357
|
* Build, persist and shape one address of `type` owned by `descriptor` —
|
|
@@ -14238,7 +14367,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14238
14367
|
async mintAddress(manager, type, descriptor, tagSource, allocated) {
|
|
14239
14368
|
if (type === "boarding") {
|
|
14240
14369
|
const built2 = this.buildBoardingContract(
|
|
14241
|
-
|
|
14370
|
+
chunkNPM5YZBC_cjs.deriveDescriptorLeafPubKey(descriptor),
|
|
14242
14371
|
descriptor,
|
|
14243
14372
|
tagSource
|
|
14244
14373
|
);
|
|
@@ -14283,11 +14412,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14283
14412
|
* {@link buildReceiveContract}.
|
|
14284
14413
|
*/
|
|
14285
14414
|
buildBoardingContract(pubKey, descriptor, tagSource) {
|
|
14286
|
-
const tapscript = new
|
|
14415
|
+
const tapscript = new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
|
|
14287
14416
|
...this._boardingTapscript.options,
|
|
14288
14417
|
pubKey
|
|
14289
14418
|
});
|
|
14290
|
-
const csvTimelock = tapscript.options.csvTimelock ??
|
|
14419
|
+
const csvTimelock = tapscript.options.csvTimelock ?? chunkNPM5YZBC_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
14291
14420
|
return {
|
|
14292
14421
|
tapscript,
|
|
14293
14422
|
params: {
|
|
@@ -14295,13 +14424,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14295
14424
|
params: {
|
|
14296
14425
|
pubKey: base.hex.encode(pubKey),
|
|
14297
14426
|
serverPubKey: base.hex.encode(tapscript.options.serverPubKey),
|
|
14298
|
-
csvTimelock:
|
|
14427
|
+
csvTimelock: chunk6FTHFJAN_cjs.timelockToSequence(csvTimelock).toString()
|
|
14299
14428
|
},
|
|
14300
14429
|
script: base.hex.encode(tapscript.pkScript),
|
|
14301
14430
|
address: tapscript.address(this.network.hrp, this.arkServerPublicKey).encode(),
|
|
14302
14431
|
state: "active",
|
|
14303
14432
|
metadata: {
|
|
14304
|
-
...tagSource && { source:
|
|
14433
|
+
...tagSource && { source: chunkNPM5YZBC_cjs.WALLET_RECEIVE_SOURCE },
|
|
14305
14434
|
signingDescriptor: descriptor
|
|
14306
14435
|
}
|
|
14307
14436
|
}
|
|
@@ -14330,7 +14459,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14330
14459
|
if (this._descriptorProvider instanceof HDDescriptorProvider) {
|
|
14331
14460
|
return (await this.getContractManager()).getNextSigningDescriptor();
|
|
14332
14461
|
}
|
|
14333
|
-
return
|
|
14462
|
+
return chunkNPM5YZBC_cjs.identityDescriptor(this.identity);
|
|
14334
14463
|
}
|
|
14335
14464
|
/**
|
|
14336
14465
|
* @see HDAllocationCapable.advanceSigningDescriptorWatermark
|
|
@@ -14426,7 +14555,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14426
14555
|
* the stable public API.
|
|
14427
14556
|
*/
|
|
14428
14557
|
async rotateServerSigner(newServerPubKey, checkpointTapscript) {
|
|
14429
|
-
const xonly =
|
|
14558
|
+
const xonly = chunkNPM5YZBC_cjs.toXOnly(newServerPubKey, "ark signer key");
|
|
14430
14559
|
const newServerUnrollScript = assertValidServerUnrollScript(
|
|
14431
14560
|
checkpointTapscript,
|
|
14432
14561
|
resolveCheckpointExitDelayPolicy(this.network, this.checkpointExitDelayPolicy)
|
|
@@ -14455,21 +14584,21 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14455
14584
|
const [currentBoardingRow] = await manager.getContracts({
|
|
14456
14585
|
script: currentBoardingScript
|
|
14457
14586
|
});
|
|
14458
|
-
const newOffchain = this.offchainTapscript instanceof
|
|
14587
|
+
const newOffchain = this.offchainTapscript instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script ? new chunkNPM5YZBC_cjs.DelegateVtxo.Script({
|
|
14459
14588
|
...this.offchainTapscript.options,
|
|
14460
14589
|
serverPubKey: xonly
|
|
14461
|
-
}) : new
|
|
14590
|
+
}) : new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
|
|
14462
14591
|
...this.offchainTapscript.options,
|
|
14463
14592
|
serverPubKey: xonly
|
|
14464
14593
|
});
|
|
14465
|
-
const newBoarding = new
|
|
14594
|
+
const newBoarding = new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
|
|
14466
14595
|
...this._boardingTapscript.options,
|
|
14467
14596
|
serverPubKey: xonly
|
|
14468
14597
|
});
|
|
14469
|
-
const offchainCsv =
|
|
14598
|
+
const offchainCsv = chunk6FTHFJAN_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
|
|
14470
14599
|
const newOffchainScript = base.hex.encode(newOffchain.pkScript);
|
|
14471
14600
|
const newOffchainAddress = newOffchain.address(this.network.hrp, xonly).encode();
|
|
14472
|
-
if (newOffchain instanceof
|
|
14601
|
+
if (newOffchain instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script) {
|
|
14473
14602
|
await manager.createContract({
|
|
14474
14603
|
type: "delegate",
|
|
14475
14604
|
params: {
|
|
@@ -14497,13 +14626,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14497
14626
|
metadata: currentOffchainRow?.metadata
|
|
14498
14627
|
});
|
|
14499
14628
|
}
|
|
14500
|
-
const boardingCsv = newBoarding.options.csvTimelock ??
|
|
14629
|
+
const boardingCsv = newBoarding.options.csvTimelock ?? chunkNPM5YZBC_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
14501
14630
|
await manager.createContract({
|
|
14502
14631
|
type: "boarding",
|
|
14503
14632
|
params: {
|
|
14504
14633
|
pubKey: base.hex.encode(newBoarding.options.pubKey),
|
|
14505
14634
|
serverPubKey: base.hex.encode(xonly),
|
|
14506
|
-
csvTimelock:
|
|
14635
|
+
csvTimelock: chunk6FTHFJAN_cjs.timelockToSequence(boardingCsv).toString()
|
|
14507
14636
|
},
|
|
14508
14637
|
script: base.hex.encode(newBoarding.pkScript),
|
|
14509
14638
|
address: newBoarding.address(this.network.hrp, xonly).encode(),
|
|
@@ -14536,14 +14665,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14536
14665
|
_restoreInFlight;
|
|
14537
14666
|
_addPendingSpends(inputs) {
|
|
14538
14667
|
for (const input of inputs) {
|
|
14539
|
-
if (
|
|
14668
|
+
if (chunk6FTHFJAN_cjs.isVirtualCoin(input)) {
|
|
14540
14669
|
this._pendingSpendOutpoints.add(`${input.txid}:${input.vout}`);
|
|
14541
14670
|
}
|
|
14542
14671
|
}
|
|
14543
14672
|
}
|
|
14544
14673
|
_removePendingSpends(inputs) {
|
|
14545
14674
|
for (const input of inputs) {
|
|
14546
|
-
if (
|
|
14675
|
+
if (chunk6FTHFJAN_cjs.isVirtualCoin(input)) {
|
|
14547
14676
|
this._pendingSpendOutpoints.delete(`${input.txid}:${input.vout}`);
|
|
14548
14677
|
}
|
|
14549
14678
|
}
|
|
@@ -14592,7 +14721,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14592
14721
|
`restore: gapLimit must be a positive integer (got ${String(opts?.gapLimit)})`
|
|
14593
14722
|
);
|
|
14594
14723
|
}
|
|
14595
|
-
this._restoreInFlight =
|
|
14724
|
+
this._restoreInFlight = (async () => {
|
|
14725
|
+
await this._runRestore(gapLimit);
|
|
14726
|
+
await runWalletRestoreHooks(this);
|
|
14727
|
+
})().finally(() => {
|
|
14596
14728
|
this._restoreInFlight = void 0;
|
|
14597
14729
|
});
|
|
14598
14730
|
return this._restoreInFlight;
|
|
@@ -14601,13 +14733,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14601
14733
|
const manager = await this.getContractManager();
|
|
14602
14734
|
const provider = this._descriptorProvider;
|
|
14603
14735
|
const hd = provider instanceof HDDescriptorProvider;
|
|
14604
|
-
const staticDescriptor = hd ? void 0 : await
|
|
14736
|
+
const staticDescriptor = hd ? void 0 : await chunkNPM5YZBC_cjs.identityDescriptor(this.identity);
|
|
14605
14737
|
const materialize = (index) => hd ? provider.materializeDescriptorAt(index) : staticDescriptor;
|
|
14606
|
-
const delegatePubKey = this.offchainTapscript instanceof
|
|
14738
|
+
const delegatePubKey = this.offchainTapscript instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
|
|
14607
14739
|
const arkInfo = await this.arkProvider.getInfo();
|
|
14608
|
-
const currentSignerPubKey =
|
|
14740
|
+
const currentSignerPubKey = chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(arkInfo.signerPubkey), "ark signer key");
|
|
14609
14741
|
const deprecatedSignerPubKeys = arkInfo.deprecatedSigners.map(
|
|
14610
|
-
(s) =>
|
|
14742
|
+
(s) => chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(s.pubkey), "deprecated signer key")
|
|
14611
14743
|
);
|
|
14612
14744
|
const deps = {
|
|
14613
14745
|
indexerProvider: this.indexerProvider,
|
|
@@ -14622,7 +14754,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14622
14754
|
csvTimelocks: this.walletContractTimelocks,
|
|
14623
14755
|
// Boarding-exit CSV so the boarding handler can build its
|
|
14624
14756
|
// candidate script (distinct from the unilateral-exit matrix).
|
|
14625
|
-
boardingTimelock: this.boardingTapscript.options.csvTimelock ??
|
|
14757
|
+
boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunkNPM5YZBC_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
|
|
14626
14758
|
delegatePubKey
|
|
14627
14759
|
};
|
|
14628
14760
|
const result = await manager.scanContracts({
|
|
@@ -14736,7 +14868,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14736
14868
|
throw new Error("Invalid configured public key");
|
|
14737
14869
|
}
|
|
14738
14870
|
const setup = await ReadonlyWallet.setupWalletConfig(config, pubkey);
|
|
14739
|
-
const forfeitPubkey =
|
|
14871
|
+
const forfeitPubkey = chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(setup.info.forfeitPubkey), "forfeit key");
|
|
14740
14872
|
const forfeitAddress = btcSigner.Address(setup.network).decode(setup.info.forfeitAddress);
|
|
14741
14873
|
const forfeitOutputScript = btcSigner.OutScript.encode(forfeitAddress);
|
|
14742
14874
|
const checkpointExitDelayOverrides = {
|
|
@@ -14885,7 +15017,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14885
15017
|
inputs: params.selectedVtxos,
|
|
14886
15018
|
changeAmount: BigInt(changeAmount)
|
|
14887
15019
|
};
|
|
14888
|
-
const outputAddress =
|
|
15020
|
+
const outputAddress = chunk6FTHFJAN_cjs.ArkAddress.decode(params.address);
|
|
14889
15021
|
assertRecipientArkAddress(
|
|
14890
15022
|
params.address,
|
|
14891
15023
|
outputAddress,
|
|
@@ -14951,13 +15083,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14951
15083
|
void this.logUngatedInputs("settle({ inputs })", params.inputs);
|
|
14952
15084
|
}
|
|
14953
15085
|
const offchainAddress = await this.getAddress();
|
|
14954
|
-
const offchainPkScript =
|
|
15086
|
+
const offchainPkScript = chunk6FTHFJAN_cjs.ArkAddress.decode(offchainAddress).pkScript;
|
|
14955
15087
|
const offchainOutputScript = base.hex.encode(offchainPkScript);
|
|
14956
15088
|
if (!params) {
|
|
14957
15089
|
const { fees, vtxoMaxAmount } = await this.arkProvider.getInfo();
|
|
14958
15090
|
const estimator = new Estimator(fees.intentFee);
|
|
14959
15091
|
let amount = 0;
|
|
14960
|
-
const exitScript =
|
|
15092
|
+
const exitScript = chunk6FTHFJAN_cjs.CSVMultisigTapscript.decode(
|
|
14961
15093
|
base.hex.decode(this.boardingTapscript.exitScript)
|
|
14962
15094
|
);
|
|
14963
15095
|
const boardingTimelock = exitScript.params.timelock;
|
|
@@ -14986,7 +15118,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14986
15118
|
if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
|
|
14987
15119
|
break;
|
|
14988
15120
|
}
|
|
14989
|
-
const inputFee = estimator.evalOffchainInput(
|
|
15121
|
+
const inputFee = estimator.evalOffchainInput(chunk6FTHFJAN_cjs.toOffchainInputFeeParams(vtxo));
|
|
14990
15122
|
if (inputFee.satoshis >= vtxo.value) {
|
|
14991
15123
|
continue;
|
|
14992
15124
|
}
|
|
@@ -15033,7 +15165,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15033
15165
|
let script;
|
|
15034
15166
|
let arkAddress;
|
|
15035
15167
|
try {
|
|
15036
|
-
arkAddress =
|
|
15168
|
+
arkAddress = chunk6FTHFJAN_cjs.ArkAddress.decode(output.address);
|
|
15037
15169
|
} catch {
|
|
15038
15170
|
arkAddress = void 0;
|
|
15039
15171
|
}
|
|
@@ -15123,7 +15255,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15123
15255
|
const abortController = new AbortController();
|
|
15124
15256
|
let stream;
|
|
15125
15257
|
let committedTxid;
|
|
15126
|
-
const settleInputVtxos = params.inputs.filter(
|
|
15258
|
+
const settleInputVtxos = params.inputs.filter(chunk6FTHFJAN_cjs.isVirtualCoin);
|
|
15127
15259
|
const contractManager = await this.getContractManager();
|
|
15128
15260
|
await contractManager.assertAnnotatable(settleInputVtxos);
|
|
15129
15261
|
await contractManager.assertSpendableNow?.(
|
|
@@ -15235,7 +15367,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15235
15367
|
async maybeRotateBoardingAfterBoard(inputs) {
|
|
15236
15368
|
if (!this._descriptorProvider) return;
|
|
15237
15369
|
const consumedBoarding = inputs.some(
|
|
15238
|
-
(input) => typeof input !== "string" && !
|
|
15370
|
+
(input) => typeof input !== "string" && !chunk6FTHFJAN_cjs.isVirtualCoin(input)
|
|
15239
15371
|
);
|
|
15240
15372
|
if (!consumedBoarding) return;
|
|
15241
15373
|
try {
|
|
@@ -15259,7 +15391,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15259
15391
|
let connectorIndex = 0;
|
|
15260
15392
|
const connectorsLeaves = connectorsGraph?.leaves() || [];
|
|
15261
15393
|
for (const input of inputs) {
|
|
15262
|
-
if (!
|
|
15394
|
+
if (!chunk6FTHFJAN_cjs.isVirtualCoin(input)) {
|
|
15263
15395
|
for (let i = 0; i < settlementPsbt.inputsLength; i++) {
|
|
15264
15396
|
const settlementInput = settlementPsbt.getInput(i);
|
|
15265
15397
|
if (!settlementInput.txid || settlementInput.index === void 0) {
|
|
@@ -15290,7 +15422,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15290
15422
|
}
|
|
15291
15423
|
continue;
|
|
15292
15424
|
}
|
|
15293
|
-
if (
|
|
15425
|
+
if (chunk6FTHFJAN_cjs.canRecoverOnchain(input, { timestamp: /* @__PURE__ */ new Date() }) || isSubdust({ value: input.value }, this.dustAmount)) {
|
|
15294
15426
|
continue;
|
|
15295
15427
|
}
|
|
15296
15428
|
if (connectorsLeaves.length === 0) {
|
|
@@ -15318,7 +15450,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15318
15450
|
index: input.vout,
|
|
15319
15451
|
witnessUtxo: {
|
|
15320
15452
|
amount: BigInt(input.value),
|
|
15321
|
-
script:
|
|
15453
|
+
script: chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
15322
15454
|
},
|
|
15323
15455
|
sighashType: btcSigner.SigHash.DEFAULT,
|
|
15324
15456
|
tapLeafScript: [input.forfeitTapLeafScript]
|
|
@@ -15337,7 +15469,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15337
15469
|
forfeitTx = await this._signerRouter.sign(forfeitTx, [
|
|
15338
15470
|
{
|
|
15339
15471
|
index: 0,
|
|
15340
|
-
lookupScript:
|
|
15472
|
+
lookupScript: chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
15341
15473
|
}
|
|
15342
15474
|
]);
|
|
15343
15475
|
signedForfeits.push(base.base64.encode(forfeitTx.toPSBT()));
|
|
@@ -15395,7 +15527,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15395
15527
|
resolveBatchExpiryPolicy(this.network, this.batchExpiryPolicy)
|
|
15396
15528
|
);
|
|
15397
15529
|
await this.arkProvider.confirmRegistration(intentId);
|
|
15398
|
-
const sweepTapscript =
|
|
15530
|
+
const sweepTapscript = chunk6FTHFJAN_cjs.CSVMultisigTapscript.encode({
|
|
15399
15531
|
timelock,
|
|
15400
15532
|
pubkeys: [this.forfeitPubkey]
|
|
15401
15533
|
}).script;
|
|
@@ -15410,10 +15542,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15410
15542
|
throw new Error("Sweep tap tree root not set");
|
|
15411
15543
|
}
|
|
15412
15544
|
const xOnlyPublicKeys = event.cosignersPublicKeys.map(
|
|
15413
|
-
(k) => base.hex.encode(
|
|
15545
|
+
(k) => base.hex.encode(chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
|
|
15414
15546
|
);
|
|
15415
15547
|
const signerPublicKey = await session.getPublicKey();
|
|
15416
|
-
const xonlySignerPublicKey =
|
|
15548
|
+
const xonlySignerPublicKey = chunkNPM5YZBC_cjs.toXOnly(signerPublicKey, "signer key");
|
|
15417
15549
|
if (!xOnlyPublicKeys.includes(base.hex.encode(xonlySignerPublicKey))) {
|
|
15418
15550
|
return { skip: true };
|
|
15419
15551
|
}
|
|
@@ -15503,9 +15635,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15503
15635
|
...existing ?? {},
|
|
15504
15636
|
intentTxId,
|
|
15505
15637
|
registerProof: intent.proof,
|
|
15506
|
-
registerProofMessage:
|
|
15638
|
+
registerProofMessage: chunk6FTHFJAN_cjs.Intent.encodeMessage(intent.message),
|
|
15507
15639
|
deleteProof: deleteIntent.proof,
|
|
15508
|
-
deleteProofMessage:
|
|
15640
|
+
deleteProofMessage: chunk6FTHFJAN_cjs.Intent.encodeMessage(deleteIntent.message),
|
|
15509
15641
|
intentVtxos: inputs.map((i) => ({
|
|
15510
15642
|
txid: i.txid,
|
|
15511
15643
|
vout: i.vout
|
|
@@ -15537,7 +15669,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15537
15669
|
try {
|
|
15538
15670
|
return await this.arkProvider.registerIntent(intent);
|
|
15539
15671
|
} catch (error) {
|
|
15540
|
-
if (error instanceof
|
|
15672
|
+
if (error instanceof chunk6FTHFJAN_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
|
|
15541
15673
|
const deleteIntent = await this.makeDeleteIntentSignature(inputs);
|
|
15542
15674
|
await this.arkProvider.deleteIntent(deleteIntent);
|
|
15543
15675
|
return this.arkProvider.registerIntent(intent);
|
|
@@ -15553,7 +15685,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15553
15685
|
expire_at: 0,
|
|
15554
15686
|
cosigners_public_keys: cosignerPubKeys
|
|
15555
15687
|
};
|
|
15556
|
-
const proof =
|
|
15688
|
+
const proof = chunk6FTHFJAN_cjs.Intent.create(message, coins, outputs);
|
|
15557
15689
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15558
15690
|
return {
|
|
15559
15691
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15565,7 +15697,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15565
15697
|
type: "delete",
|
|
15566
15698
|
expire_at: 0
|
|
15567
15699
|
};
|
|
15568
|
-
const proof =
|
|
15700
|
+
const proof = chunk6FTHFJAN_cjs.Intent.create(message, coins, []);
|
|
15569
15701
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15570
15702
|
return {
|
|
15571
15703
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15577,7 +15709,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15577
15709
|
type: "get-pending-tx",
|
|
15578
15710
|
expire_at: 0
|
|
15579
15711
|
};
|
|
15580
|
-
const proof =
|
|
15712
|
+
const proof = chunk6FTHFJAN_cjs.Intent.create(message, coins, []);
|
|
15581
15713
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15582
15714
|
return {
|
|
15583
15715
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15598,7 +15730,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15598
15730
|
if (!vtxos || vtxos.length === 0) {
|
|
15599
15731
|
const scriptMap = await this.getScriptMap();
|
|
15600
15732
|
const allExtended = [];
|
|
15601
|
-
const fetchedVtxos = await
|
|
15733
|
+
const fetchedVtxos = await chunk6FTHFJAN_cjs.getAllNormalizedVtxos(this.indexerProvider, [
|
|
15602
15734
|
...scriptMap.keys()
|
|
15603
15735
|
]);
|
|
15604
15736
|
for (const vtxo of fetchedVtxos) {
|
|
@@ -15642,7 +15774,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15642
15774
|
try {
|
|
15643
15775
|
const checkpointTxs = pendingTx.signedCheckpointTxs.map((c) => {
|
|
15644
15776
|
const tx = btcSigner.Transaction.fromPSBT(base.base64.decode(c));
|
|
15645
|
-
|
|
15777
|
+
chunk6FTHFJAN_cjs.assertAllowedSighashTypes(tx);
|
|
15646
15778
|
return tx;
|
|
15647
15779
|
});
|
|
15648
15780
|
assertCheckpointsMatchInputs(
|
|
@@ -15714,11 +15846,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15714
15846
|
* against the current key alone would leave it pending forever.
|
|
15715
15847
|
*/
|
|
15716
15848
|
checkpointUnrollCandidates(info) {
|
|
15717
|
-
const current =
|
|
15849
|
+
const current = chunk6FTHFJAN_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
|
|
15718
15850
|
const candidates = [this._serverUnrollScript, current];
|
|
15719
15851
|
for (const deprecated of signerSetFromInfo(info).deprecated.keys()) {
|
|
15720
15852
|
candidates.push(
|
|
15721
|
-
|
|
15853
|
+
chunk6FTHFJAN_cjs.CSVMultisigTapscript.encode({
|
|
15722
15854
|
...current.params,
|
|
15723
15855
|
pubkeys: [base.hex.decode(deprecated)]
|
|
15724
15856
|
})
|
|
@@ -15809,7 +15941,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15809
15941
|
if (vtxos.length === 0) {
|
|
15810
15942
|
throw new Error("No VTXOs found for this arkadeCash");
|
|
15811
15943
|
}
|
|
15812
|
-
const myPkScript =
|
|
15944
|
+
const myPkScript = chunk6FTHFJAN_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
|
|
15813
15945
|
let { spendable, unclaimed } = this.classifyCashVtxos(vtxos);
|
|
15814
15946
|
let swept = 0;
|
|
15815
15947
|
const drainable = vtxos.filter(
|
|
@@ -15885,7 +16017,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15885
16017
|
const spendable = [];
|
|
15886
16018
|
const unclaimed = [];
|
|
15887
16019
|
for (const vtxo of vtxos) {
|
|
15888
|
-
if (
|
|
16020
|
+
if (chunk6FTHFJAN_cjs.hasTerminalSpend(vtxo)) {
|
|
15889
16021
|
unclaimed.push(cashReport(vtxo, "already-spent"));
|
|
15890
16022
|
} else if (vtxo.isUnrolled) {
|
|
15891
16023
|
unclaimed.push(cashReport(vtxo, "exited"));
|
|
@@ -15907,7 +16039,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15907
16039
|
const all = [];
|
|
15908
16040
|
const seen = /* @__PURE__ */ new Set();
|
|
15909
16041
|
for (let pageIndex = 0; ; pageIndex++) {
|
|
15910
|
-
const { vtxos, page } = await
|
|
16042
|
+
const { vtxos, page } = await chunk6FTHFJAN_cjs.getNormalizedVtxos(this.indexerProvider, {
|
|
15911
16043
|
scripts,
|
|
15912
16044
|
pageIndex,
|
|
15913
16045
|
pageSize
|
|
@@ -15954,7 +16086,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15954
16086
|
for (let i = 0; i < inputs.length; i += MAX_INPUTS_PER_INTENT) {
|
|
15955
16087
|
const batch = inputs.slice(i, i + MAX_INPUTS_PER_INTENT);
|
|
15956
16088
|
const message = { type: "get-pending-tx", expire_at: 0 };
|
|
15957
|
-
const proof =
|
|
16089
|
+
const proof = chunk6FTHFJAN_cjs.Intent.create(message, batch, []);
|
|
15958
16090
|
const signedProof = await identity.sign(
|
|
15959
16091
|
proof,
|
|
15960
16092
|
Array.from({ length: batch.length + 1 }, (_, j) => j)
|
|
@@ -15976,7 +16108,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15976
16108
|
try {
|
|
15977
16109
|
const checkpointTxs = pendingTx.signedCheckpointTxs.map((checkpoint) => {
|
|
15978
16110
|
const tx = btcSigner.Transaction.fromPSBT(base.base64.decode(checkpoint));
|
|
15979
|
-
|
|
16111
|
+
chunk6FTHFJAN_cjs.assertAllowedSighashTypes(tx);
|
|
15980
16112
|
return tx;
|
|
15981
16113
|
});
|
|
15982
16114
|
assertCheckpointsMatchInputs(
|
|
@@ -16175,7 +16307,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16175
16307
|
script: recipient.script,
|
|
16176
16308
|
amount: BigInt(recipient.amount),
|
|
16177
16309
|
// Already checked against the recipient address in `validateRecipients`.
|
|
16178
|
-
...recipient.tapTree ? { tapTree:
|
|
16310
|
+
...recipient.tapTree ? { tapTree: chunk6FTHFJAN_cjs.TapTreeCoder.decode(recipient.tapTree) } : {}
|
|
16179
16311
|
}));
|
|
16180
16312
|
const totalBtcOutput = outputs.reduce((sum, o) => sum + Number(o.amount), 0);
|
|
16181
16313
|
let changeAmount = totalBtcSelected - totalBtcOutput;
|
|
@@ -16319,10 +16451,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16319
16451
|
const serverPubKey = this.arkServerPublicKey;
|
|
16320
16452
|
const serverUnrollScript = this.serverUnrollScript;
|
|
16321
16453
|
const arkAddress = offchainTapscript.address(this.network.hrp, serverPubKey);
|
|
16322
|
-
const normalizedInputs = inputs.map(
|
|
16323
|
-
const at = now ?? await
|
|
16454
|
+
const normalizedInputs = inputs.map(chunk6FTHFJAN_cjs.normalizeVtxo);
|
|
16455
|
+
const at = now ?? await chunk6FTHFJAN_cjs.resolveTimeHeight(this.onchainProvider);
|
|
16324
16456
|
for (const input of normalizedInputs) {
|
|
16325
|
-
if (!
|
|
16457
|
+
if (!chunk6FTHFJAN_cjs.canSpendOffchain(input, at)) {
|
|
16326
16458
|
throw new Error(
|
|
16327
16459
|
`sendSelectedVtxosToSelf: input ${input.txid}:${input.vout} is not cooperatively spendable`
|
|
16328
16460
|
);
|
|
@@ -16392,7 +16524,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16392
16524
|
);
|
|
16393
16525
|
const arkTxJobs = inputs.map((input, index) => ({
|
|
16394
16526
|
index,
|
|
16395
|
-
lookupScript:
|
|
16527
|
+
lookupScript: chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
16396
16528
|
}));
|
|
16397
16529
|
const identity = this.identity;
|
|
16398
16530
|
const signer = {
|
|
@@ -16478,14 +16610,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16478
16610
|
const spentBy = checkpointIdByOutpoint.get(`${vtxo.txid}:${vtxo.vout}`);
|
|
16479
16611
|
spentVtxos.push({
|
|
16480
16612
|
...spentFacts,
|
|
16481
|
-
virtualStatus:
|
|
16613
|
+
virtualStatus: chunk6FTHFJAN_cjs.toVirtualStatus(spentFacts),
|
|
16482
16614
|
...spentBy ? { spentBy } : {},
|
|
16483
16615
|
arkTxId: arkTxid
|
|
16484
16616
|
});
|
|
16485
16617
|
for (const id of vtxo.commitmentTxIds) {
|
|
16486
16618
|
commitmentTxIds.add(id);
|
|
16487
16619
|
}
|
|
16488
|
-
const vtxoExpiry =
|
|
16620
|
+
const vtxoExpiry = chunk6FTHFJAN_cjs.toBatchExpiry(vtxo);
|
|
16489
16621
|
if (vtxoExpiry) {
|
|
16490
16622
|
batchExpiry = Math.min(batchExpiry, vtxoExpiry);
|
|
16491
16623
|
}
|
|
@@ -16498,7 +16630,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16498
16630
|
isSwept: false,
|
|
16499
16631
|
isPreconfirmed: true,
|
|
16500
16632
|
commitmentTxIds: Array.from(commitmentTxIds),
|
|
16501
|
-
...
|
|
16633
|
+
...chunk6FTHFJAN_cjs.parseLegacyExpiry(batchExpiry)
|
|
16502
16634
|
};
|
|
16503
16635
|
changeVtxo = {
|
|
16504
16636
|
txid: arkTxid,
|
|
@@ -16510,7 +16642,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16510
16642
|
tapTree: offchainTapscript.encode(),
|
|
16511
16643
|
value: Number(changeAmount),
|
|
16512
16644
|
...changeFacts,
|
|
16513
|
-
virtualStatus:
|
|
16645
|
+
virtualStatus: chunk6FTHFJAN_cjs.toVirtualStatus(changeFacts),
|
|
16514
16646
|
spentBy: "",
|
|
16515
16647
|
status: {
|
|
16516
16648
|
confirmed: false
|
|
@@ -16579,12 +16711,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16579
16711
|
const spentVtxos = [];
|
|
16580
16712
|
const inputArkTxIds = /* @__PURE__ */ new Set();
|
|
16581
16713
|
const boardingRemovalsByAddress = /* @__PURE__ */ new Map();
|
|
16582
|
-
const vtxoInputs = inputs.filter(
|
|
16714
|
+
const vtxoInputs = inputs.filter(chunk6FTHFJAN_cjs.isVirtualCoin);
|
|
16583
16715
|
const cm = await this.getContractManager();
|
|
16584
16716
|
const annotatedVtxos = await cm.annotateVtxos(vtxoInputs);
|
|
16585
16717
|
const annotatedByKey = new Map(annotatedVtxos.map((v) => [`${v.txid}:${v.vout}`, v]));
|
|
16586
16718
|
for (const input of inputs) {
|
|
16587
|
-
if (
|
|
16719
|
+
if (chunk6FTHFJAN_cjs.isVirtualCoin(input)) {
|
|
16588
16720
|
const outpoint = `${input.txid}:${input.vout}`;
|
|
16589
16721
|
const vtxo = annotatedByKey.get(outpoint);
|
|
16590
16722
|
if (!vtxo) {
|
|
@@ -16596,13 +16728,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16596
16728
|
const settledFacts = { ...vtxo, isSpent: true };
|
|
16597
16729
|
spentVtxos.push({
|
|
16598
16730
|
...settledFacts,
|
|
16599
|
-
virtualStatus:
|
|
16731
|
+
virtualStatus: chunk6FTHFJAN_cjs.toVirtualStatus(settledFacts),
|
|
16600
16732
|
settledBy: commitmentTxid
|
|
16601
16733
|
});
|
|
16602
16734
|
} else {
|
|
16603
16735
|
let sourceAddress;
|
|
16604
16736
|
try {
|
|
16605
|
-
sourceAddress =
|
|
16737
|
+
sourceAddress = chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
|
|
16606
16738
|
this.network
|
|
16607
16739
|
);
|
|
16608
16740
|
} catch {
|
|
@@ -16660,9 +16792,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16660
16792
|
}
|
|
16661
16793
|
};
|
|
16662
16794
|
function selectVirtualCoins(coins, targetAmount) {
|
|
16663
|
-
const sortedCoins = coins.map(
|
|
16664
|
-
const expiryA =
|
|
16665
|
-
const expiryB =
|
|
16795
|
+
const sortedCoins = coins.map(chunk6FTHFJAN_cjs.normalizeVtxo).sort((a, b) => {
|
|
16796
|
+
const expiryA = chunk6FTHFJAN_cjs.toBatchExpiry(a) || Number.MAX_SAFE_INTEGER;
|
|
16797
|
+
const expiryB = chunk6FTHFJAN_cjs.toBatchExpiry(b) || Number.MAX_SAFE_INTEGER;
|
|
16666
16798
|
if (expiryA !== expiryB) {
|
|
16667
16799
|
return expiryA - expiryB;
|
|
16668
16800
|
}
|
|
@@ -17031,7 +17163,7 @@ var MessageBus = class {
|
|
|
17031
17163
|
this.initialized = true;
|
|
17032
17164
|
}
|
|
17033
17165
|
async buildServices(config) {
|
|
17034
|
-
const arkProvider = new
|
|
17166
|
+
const arkProvider = new chunk6FTHFJAN_cjs.RestArkProvider(config.arkServer.url);
|
|
17035
17167
|
const storage = {
|
|
17036
17168
|
walletRepository: this.walletRepository,
|
|
17037
17169
|
contractRepository: this.contractRepository,
|
|
@@ -17373,7 +17505,7 @@ var offboardNetworkNames = [
|
|
|
17373
17505
|
function offboardDestinationScript(destinationAddress) {
|
|
17374
17506
|
for (const networkName of offboardNetworkNames) {
|
|
17375
17507
|
try {
|
|
17376
|
-
const network =
|
|
17508
|
+
const network = chunk6FTHFJAN_cjs.networks[networkName];
|
|
17377
17509
|
const addr = btcSigner.Address(network).decode(destinationAddress);
|
|
17378
17510
|
return btcSigner.OutScript.encode(addr);
|
|
17379
17511
|
} catch {
|
|
@@ -17437,7 +17569,7 @@ var Ramps = class {
|
|
|
17437
17569
|
}
|
|
17438
17570
|
amount = amount ?? totalAmount;
|
|
17439
17571
|
const offchainAddress = await this.wallet.getAddress();
|
|
17440
|
-
const offchainAddr =
|
|
17572
|
+
const offchainAddr = chunk6FTHFJAN_cjs.ArkAddress.decode(offchainAddress);
|
|
17441
17573
|
const offchainScript = base.hex.encode(offchainAddr.pkScript);
|
|
17442
17574
|
const outputFee = estimator.evalOffchainOutput({
|
|
17443
17575
|
amount,
|
|
@@ -17497,7 +17629,7 @@ var Ramps = class {
|
|
|
17497
17629
|
const filteredVtxos = [];
|
|
17498
17630
|
let totalAmount = 0n;
|
|
17499
17631
|
for (const vtxo of vtxos) {
|
|
17500
|
-
const inputFee = estimator.evalOffchainInput(
|
|
17632
|
+
const inputFee = estimator.evalOffchainInput(chunk6FTHFJAN_cjs.toOffchainInputFeeParams(vtxo));
|
|
17501
17633
|
if (inputFee.satoshis >= vtxo.value) {
|
|
17502
17634
|
continue;
|
|
17503
17635
|
}
|
|
@@ -17912,8 +18044,7 @@ var WalletMessageHandler = class {
|
|
|
17912
18044
|
});
|
|
17913
18045
|
}
|
|
17914
18046
|
case "GET_TRANSACTION_HISTORY": {
|
|
17915
|
-
const
|
|
17916
|
-
const transactions = await this.buildTransactionHistoryFromCache(allVtxos) ?? [];
|
|
18047
|
+
const transactions = await this.buildTransactionHistoryFromCache() ?? [];
|
|
17917
18048
|
return this.tagged({
|
|
17918
18049
|
id,
|
|
17919
18050
|
type: "TRANSACTION_HISTORY",
|
|
@@ -18369,7 +18500,7 @@ var WalletMessageHandler = class {
|
|
|
18369
18500
|
// Wallet methods
|
|
18370
18501
|
async handleInitWallet({ payload }) {
|
|
18371
18502
|
const { arkServerUrl } = payload;
|
|
18372
|
-
this.indexerProvider = new
|
|
18503
|
+
this.indexerProvider = new chunk4C5PMGBB_cjs.RestIndexerProvider(arkServerUrl);
|
|
18373
18504
|
await this.onWalletInitialized();
|
|
18374
18505
|
}
|
|
18375
18506
|
/**
|
|
@@ -18395,7 +18526,7 @@ var WalletMessageHandler = class {
|
|
|
18395
18526
|
unconfirmed += utxo.value;
|
|
18396
18527
|
}
|
|
18397
18528
|
}
|
|
18398
|
-
const gated =
|
|
18529
|
+
const gated = gatedFrom(snapshot);
|
|
18399
18530
|
const unlocked = new Set(
|
|
18400
18531
|
(await spendableVtxosExcludingLocked(allVtxos, this.readonlyWallet?.intentRepository)).map((vtxo) => `${vtxo.txid}:${vtxo.vout}`)
|
|
18401
18532
|
);
|
|
@@ -18403,7 +18534,7 @@ var WalletMessageHandler = class {
|
|
|
18403
18534
|
const offchain = computeOffchainBalance(allVtxos, {
|
|
18404
18535
|
now: { timestamp: /* @__PURE__ */ new Date() },
|
|
18405
18536
|
isPendingRecovery: (vtxo) => pendingOutpoints.has(`${vtxo.txid}:${vtxo.vout}`),
|
|
18406
|
-
isGenericallySpendable: (vtxo) => !
|
|
18537
|
+
isGenericallySpendable: (vtxo) => !isGatedVtxo(vtxo, gated),
|
|
18407
18538
|
isUnlocked: (vtxo) => unlocked.has(`${vtxo.txid}:${vtxo.vout}`)
|
|
18408
18539
|
});
|
|
18409
18540
|
return {
|
|
@@ -18543,7 +18674,6 @@ var WalletMessageHandler = class {
|
|
|
18543
18674
|
if (!this.readonlyWallet || !this.walletRepository) {
|
|
18544
18675
|
return;
|
|
18545
18676
|
}
|
|
18546
|
-
const vtxos = await this.getVtxosFromRepo();
|
|
18547
18677
|
const boardingAddresses = await this.readonlyWallet.getBoardingAddresses();
|
|
18548
18678
|
const fresh = await this.readonlyWallet.getBoardingUtxos();
|
|
18549
18679
|
const freshKeys = new Set(fresh.map((u) => `${u.txid}:${u.vout}`));
|
|
@@ -18555,7 +18685,7 @@ var WalletMessageHandler = class {
|
|
|
18555
18685
|
if (kept.length > 0) await this.walletRepository.saveUtxos(addr, kept);
|
|
18556
18686
|
}
|
|
18557
18687
|
const address = await this.readonlyWallet.getAddress();
|
|
18558
|
-
const txs = await this.buildTransactionHistoryFromCache(
|
|
18688
|
+
const txs = await this.buildTransactionHistoryFromCache();
|
|
18559
18689
|
if (txs) await this.walletRepository.saveTransactions(address, txs);
|
|
18560
18690
|
}
|
|
18561
18691
|
/**
|
|
@@ -18658,7 +18788,7 @@ var WalletMessageHandler = class {
|
|
|
18658
18788
|
if (v.isUnrolled) {
|
|
18659
18789
|
return withUnrolled;
|
|
18660
18790
|
}
|
|
18661
|
-
if (
|
|
18791
|
+
if (chunk6FTHFJAN_cjs.hasTerminalSpend(v)) {
|
|
18662
18792
|
return false;
|
|
18663
18793
|
}
|
|
18664
18794
|
if (includeRecoverable) {
|
|
@@ -18667,10 +18797,10 @@ var WalletMessageHandler = class {
|
|
|
18667
18797
|
if (dustAmount != null && isSubdust(v, dustAmount)) {
|
|
18668
18798
|
return false;
|
|
18669
18799
|
}
|
|
18670
|
-
if (
|
|
18800
|
+
if (chunk6FTHFJAN_cjs.isRecoverable(v)) {
|
|
18671
18801
|
return false;
|
|
18672
18802
|
}
|
|
18673
|
-
if (
|
|
18803
|
+
if (chunk6FTHFJAN_cjs.isExpired(v)) {
|
|
18674
18804
|
return false;
|
|
18675
18805
|
}
|
|
18676
18806
|
return true;
|
|
@@ -18763,13 +18893,29 @@ var WalletMessageHandler = class {
|
|
|
18763
18893
|
/**
|
|
18764
18894
|
* Build transaction history from cached virtual outputs, hitting the indexer only for
|
|
18765
18895
|
* uncached timestamps. Best-effort, like the plain Wallet path.
|
|
18766
|
-
|
|
18767
|
-
|
|
18896
|
+
*
|
|
18897
|
+
* Takes its own {@link repoSnapshot} rather than a caller-supplied VTXO
|
|
18898
|
+
* list: the coins and the gate that judges them have to come off one read
|
|
18899
|
+
* or they answer about different instants, and being the worker's only
|
|
18900
|
+
* history builder means neither caller can supply one without the other.
|
|
18901
|
+
* The snapshot and the boarding read are independent, so they run together
|
|
18902
|
+
* — the same pairing `handleGetBalance` makes.
|
|
18903
|
+
*/
|
|
18904
|
+
async buildTransactionHistoryFromCache() {
|
|
18768
18905
|
if (!this.readonlyWallet) return null;
|
|
18769
|
-
const { boardingTxs, commitmentsToIgnore } = await
|
|
18906
|
+
const [{ snapshot, vtxos }, { boardingTxs, commitmentsToIgnore }] = await Promise.all([
|
|
18907
|
+
this.repoSnapshot(),
|
|
18908
|
+
this.readonlyWallet.getBoardingTxs()
|
|
18909
|
+
]);
|
|
18770
18910
|
const indexerProvider = this.indexerProvider;
|
|
18771
|
-
const resolveTxCreatedAt = indexerProvider ? (txids) =>
|
|
18772
|
-
return buildTransactionHistory(
|
|
18911
|
+
const resolveTxCreatedAt = indexerProvider ? (txids) => chunk6FTHFJAN_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
|
|
18912
|
+
return buildTransactionHistory(
|
|
18913
|
+
vtxos,
|
|
18914
|
+
boardingTxs,
|
|
18915
|
+
commitmentsToIgnore,
|
|
18916
|
+
resolveTxCreatedAt,
|
|
18917
|
+
gatedFrom(snapshot)
|
|
18918
|
+
);
|
|
18773
18919
|
}
|
|
18774
18920
|
async ensureContractEventBroadcasting() {
|
|
18775
18921
|
const wallet = this.readonlyWallet;
|
|
@@ -19470,7 +19616,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19470
19616
|
};
|
|
19471
19617
|
try {
|
|
19472
19618
|
const response = await this.sendMessage(message);
|
|
19473
|
-
return response.payload.vtxos.map(
|
|
19619
|
+
return response.payload.vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo);
|
|
19474
19620
|
} catch (error) {
|
|
19475
19621
|
throw new Error(`Failed to get vtxos: ${error}`);
|
|
19476
19622
|
}
|
|
@@ -19495,7 +19641,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19495
19641
|
};
|
|
19496
19642
|
try {
|
|
19497
19643
|
const response = await this.sendMessage(message);
|
|
19498
|
-
return response.payload.vtxos.map(
|
|
19644
|
+
return response.payload.vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo);
|
|
19499
19645
|
} catch (error) {
|
|
19500
19646
|
throw new Error(`Failed to get spendable vtxos: ${error}`);
|
|
19501
19647
|
}
|
|
@@ -19666,7 +19812,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19666
19812
|
};
|
|
19667
19813
|
try {
|
|
19668
19814
|
const response = await sendContractMessage(message);
|
|
19669
|
-
return response.payload.vtxos.map(
|
|
19815
|
+
return response.payload.vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo);
|
|
19670
19816
|
} catch (e) {
|
|
19671
19817
|
throw new Error("Failed to annotate vtxos");
|
|
19672
19818
|
}
|
|
@@ -19865,6 +20011,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
|
|
|
19865
20011
|
identity;
|
|
19866
20012
|
_assetManager;
|
|
19867
20013
|
hasDelegate;
|
|
20014
|
+
_restoreInFlight;
|
|
19868
20015
|
get assetManager() {
|
|
19869
20016
|
return this._assetManager;
|
|
19870
20017
|
}
|
|
@@ -20127,6 +20274,16 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
|
|
|
20127
20274
|
* reconstructed here so callers can inspect `.errors`.
|
|
20128
20275
|
*/
|
|
20129
20276
|
async restore(opts) {
|
|
20277
|
+
if (this._restoreInFlight) return this._restoreInFlight;
|
|
20278
|
+
this._restoreInFlight = (async () => {
|
|
20279
|
+
await this._restoreWorkerWallet(opts);
|
|
20280
|
+
await runWalletRestoreHooks(this);
|
|
20281
|
+
})().finally(() => {
|
|
20282
|
+
this._restoreInFlight = void 0;
|
|
20283
|
+
});
|
|
20284
|
+
return this._restoreInFlight;
|
|
20285
|
+
}
|
|
20286
|
+
async _restoreWorkerWallet(opts) {
|
|
20130
20287
|
const message = {
|
|
20131
20288
|
id: getRandomId(),
|
|
20132
20289
|
tag: this.messageTag,
|
|
@@ -20267,7 +20424,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
|
|
|
20267
20424
|
};
|
|
20268
20425
|
try {
|
|
20269
20426
|
const response = await wallet.sendMessage(message);
|
|
20270
|
-
return response.payload.vtxos.map(
|
|
20427
|
+
return response.payload.vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo);
|
|
20271
20428
|
} catch (e) {
|
|
20272
20429
|
throw new Error(`Failed to get expiring vtxos: ${e}`);
|
|
20273
20430
|
}
|
|
@@ -20379,12 +20536,12 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
20379
20536
|
* @returns Configured onchain wallet
|
|
20380
20537
|
* @throws Error if the configured identity cannot produce a valid x-only public key
|
|
20381
20538
|
*/
|
|
20382
|
-
static async create(identity, networkName =
|
|
20539
|
+
static async create(identity, networkName = chunk6FTHFJAN_cjs.DEFAULT_NETWORK_NAME, provider) {
|
|
20383
20540
|
const pubkey = await identity.xOnlyPublicKey();
|
|
20384
20541
|
if (!pubkey) {
|
|
20385
20542
|
throw new Error("Invalid configured public key");
|
|
20386
20543
|
}
|
|
20387
|
-
const network =
|
|
20544
|
+
const network = chunk6FTHFJAN_cjs.getNetwork(networkName);
|
|
20388
20545
|
const onchainProvider = provider || new EsploraProvider(ESPLORA_URL[networkName]);
|
|
20389
20546
|
const onchainP2TR = btcSigner.p2tr(pubkey, void 0, network);
|
|
20390
20547
|
return new _OnchainWallet(identity, network, onchainP2TR, onchainProvider);
|
|
@@ -20490,7 +20647,7 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
20490
20647
|
if (!inputs) {
|
|
20491
20648
|
throw new Error("Fee estimation failed");
|
|
20492
20649
|
}
|
|
20493
|
-
let tx = new
|
|
20650
|
+
let tx = new chunk6FTHFJAN_cjs.Transaction();
|
|
20494
20651
|
for (const input of inputs) {
|
|
20495
20652
|
tx.addInput({
|
|
20496
20653
|
txid: input.txid,
|
|
@@ -20548,7 +20705,7 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
20548
20705
|
* @throws If the parent has no anchor, or funding cannot be selected/signed
|
|
20549
20706
|
*/
|
|
20550
20707
|
async bumpAnchor(parentHex, feeRate) {
|
|
20551
|
-
const parent =
|
|
20708
|
+
const parent = chunk6FTHFJAN_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
|
|
20552
20709
|
const coins = (await this.getCoins()).filter((c) => c.status.confirmed);
|
|
20553
20710
|
const child = await this.buildBumpPackage(parent, feeRate, coins);
|
|
20554
20711
|
return [parent.hex, child.hex];
|
|
@@ -21455,7 +21612,7 @@ async function resolvePrevTxs(txids, source, onchain) {
|
|
|
21455
21612
|
try {
|
|
21456
21613
|
const { txs } = await source.getVirtualTxs(wanted);
|
|
21457
21614
|
for (const psbt of txs) {
|
|
21458
|
-
const tx =
|
|
21615
|
+
const tx = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(psbt));
|
|
21459
21616
|
resolved.set(tx.id, tx.toBytes());
|
|
21460
21617
|
}
|
|
21461
21618
|
} catch (err) {
|
|
@@ -21488,7 +21645,7 @@ async function resolvePrevTxs(txids, source, onchain) {
|
|
|
21488
21645
|
async function attachPrevArkTxs(tx, txids, source, onchain) {
|
|
21489
21646
|
const pending = [];
|
|
21490
21647
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
21491
|
-
if (
|
|
21648
|
+
if (chunk6FTHFJAN_cjs.getArkPsbtFields(tx, i, chunk6FTHFJAN_cjs.PrevArkTxField).length === 0) pending.push(i);
|
|
21492
21649
|
}
|
|
21493
21650
|
if (pending.length === 0) return;
|
|
21494
21651
|
const resolved = await resolvePrevTxs(
|
|
@@ -21497,13 +21654,13 @@ async function attachPrevArkTxs(tx, txids, source, onchain) {
|
|
|
21497
21654
|
onchain
|
|
21498
21655
|
);
|
|
21499
21656
|
for (const i of pending) {
|
|
21500
|
-
|
|
21657
|
+
chunk6FTHFJAN_cjs.setArkPsbtField(tx, i, chunk6FTHFJAN_cjs.PrevArkTxField, resolved.get(txidAt(txids, i)));
|
|
21501
21658
|
}
|
|
21502
21659
|
}
|
|
21503
21660
|
async function attachPrevoutTxs(tx, source) {
|
|
21504
21661
|
const pending = [];
|
|
21505
21662
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
21506
|
-
if (
|
|
21663
|
+
if (chunk6FTHFJAN_cjs.getArkPsbtFields(tx, i, chunk6FTHFJAN_cjs.PrevoutTxField).length > 0) continue;
|
|
21507
21664
|
const input = tx.getInput(i);
|
|
21508
21665
|
if (!input?.txid) throw new PrevTxUnavailableError(`input ${i} has no outpoint`);
|
|
21509
21666
|
pending.push({ index: i, txid: base.hex.encode(input.txid) });
|
|
@@ -21514,7 +21671,7 @@ async function attachPrevoutTxs(tx, source) {
|
|
|
21514
21671
|
resolved.set(txid, await source.getRawTransaction(txid));
|
|
21515
21672
|
}
|
|
21516
21673
|
for (const { index, txid } of pending) {
|
|
21517
|
-
|
|
21674
|
+
chunk6FTHFJAN_cjs.setArkPsbtField(tx, index, chunk6FTHFJAN_cjs.PrevoutTxField, resolved.get(txid));
|
|
21518
21675
|
}
|
|
21519
21676
|
}
|
|
21520
21677
|
async function withPrevTxs(coins, source, onchain) {
|
|
@@ -21540,7 +21697,7 @@ exports.BIP322 = void 0;
|
|
|
21540
21697
|
async function sign2(message, identity, network) {
|
|
21541
21698
|
const xOnlyPubKey = await identity.xOnlyPublicKey();
|
|
21542
21699
|
const payment = btcSigner.p2tr(xOnlyPubKey, void 0, network);
|
|
21543
|
-
const toSpend =
|
|
21700
|
+
const toSpend = chunk6FTHFJAN_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
|
|
21544
21701
|
const toSign = craftBIP322ToSignP2TR(toSpend, payment.script, xOnlyPubKey);
|
|
21545
21702
|
const signed = await identity.sign(toSign, [0]);
|
|
21546
21703
|
signed.finalizeIdx(0);
|
|
@@ -21598,7 +21755,7 @@ function verifyP2TR(message, witnessItems, pkScript, pubkey) {
|
|
|
21598
21755
|
if (sighashType !== btcSigner.SigHash.DEFAULT && sighashType !== btcSigner.SigHash.ALL) {
|
|
21599
21756
|
return false;
|
|
21600
21757
|
}
|
|
21601
|
-
const toSpend =
|
|
21758
|
+
const toSpend = chunk6FTHFJAN_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
|
|
21602
21759
|
const toSign = craftBIP322ToSignP2TR(toSpend, pkScript, pubkey);
|
|
21603
21760
|
const sighash = toSign.preimageWitnessV1(0, [pkScript], sighashType, [0n]);
|
|
21604
21761
|
const rawSig = sig.length === 65 ? sig.subarray(0, 64) : sig;
|
|
@@ -21619,7 +21776,7 @@ function verifyP2WPKH(message, witnessItems, pkScript, addressHash) {
|
|
|
21619
21776
|
}
|
|
21620
21777
|
const sighashType = sigWithHash[sigWithHash.length - 1];
|
|
21621
21778
|
const derSig = sigWithHash.subarray(0, sigWithHash.length - 1);
|
|
21622
|
-
const toSpend =
|
|
21779
|
+
const toSpend = chunk6FTHFJAN_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
|
|
21623
21780
|
const toSign = craftBIP322ToSignSimple(toSpend, pkScript);
|
|
21624
21781
|
const scriptCode = btcSigner.OutScript.encode({ type: "pkh", hash: addressHash });
|
|
21625
21782
|
const sighash = toSign.preimageWitnessV0(0, scriptCode, sighashType, 0n);
|
|
@@ -21672,7 +21829,7 @@ function encodeCompactSize(n) {
|
|
|
21672
21829
|
return buf;
|
|
21673
21830
|
}
|
|
21674
21831
|
function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
|
|
21675
|
-
const tx = new
|
|
21832
|
+
const tx = new chunk6FTHFJAN_cjs.Transaction({ version: 0 });
|
|
21676
21833
|
tx.addInput({
|
|
21677
21834
|
txid: toSpend.id,
|
|
21678
21835
|
index: 0,
|
|
@@ -21686,12 +21843,12 @@ function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
|
|
|
21686
21843
|
});
|
|
21687
21844
|
tx.addOutput({
|
|
21688
21845
|
amount: 0n,
|
|
21689
|
-
script:
|
|
21846
|
+
script: chunk6FTHFJAN_cjs.OP_RETURN_EMPTY_PKSCRIPT
|
|
21690
21847
|
});
|
|
21691
21848
|
return tx;
|
|
21692
21849
|
}
|
|
21693
21850
|
function craftBIP322ToSignSimple(toSpend, pkScript) {
|
|
21694
|
-
const tx = new
|
|
21851
|
+
const tx = new chunk6FTHFJAN_cjs.Transaction({ version: 0 });
|
|
21695
21852
|
tx.addInput({
|
|
21696
21853
|
txid: toSpend.id,
|
|
21697
21854
|
index: 0,
|
|
@@ -21703,7 +21860,7 @@ function craftBIP322ToSignSimple(toSpend, pkScript) {
|
|
|
21703
21860
|
});
|
|
21704
21861
|
tx.addOutput({
|
|
21705
21862
|
amount: 0n,
|
|
21706
|
-
script:
|
|
21863
|
+
script: chunk6FTHFJAN_cjs.OP_RETURN_EMPTY_PKSCRIPT
|
|
21707
21864
|
});
|
|
21708
21865
|
return tx;
|
|
21709
21866
|
}
|
|
@@ -21716,7 +21873,7 @@ var RestEmulatorProvider = class {
|
|
|
21716
21873
|
serverUrl;
|
|
21717
21874
|
async getInfo() {
|
|
21718
21875
|
const url = `${this.serverUrl}/v1/info`;
|
|
21719
|
-
const response = await
|
|
21876
|
+
const response = await chunk6FTHFJAN_cjs.baseFetch(url);
|
|
21720
21877
|
if (!response.ok) {
|
|
21721
21878
|
const errorText2 = await response.text();
|
|
21722
21879
|
throw new Error(`Failed to get emulator info: ${errorText2}`);
|
|
@@ -21834,7 +21991,7 @@ var RestEmulatorProvider = class {
|
|
|
21834
21991
|
}
|
|
21835
21992
|
};
|
|
21836
21993
|
function finalizeVirtualTx(type, psbtBase64) {
|
|
21837
|
-
const tx =
|
|
21994
|
+
const tx = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
|
|
21838
21995
|
if (type === "INDEXER_CHAINED_TX_TYPE_TREE" /* TREE */) {
|
|
21839
21996
|
const input = tx.getInput(0);
|
|
21840
21997
|
if (!input) {
|
|
@@ -21861,14 +22018,14 @@ var ExitPathError = class extends Error {
|
|
|
21861
22018
|
reason;
|
|
21862
22019
|
};
|
|
21863
22020
|
function delayWeight(sequence) {
|
|
21864
|
-
const t =
|
|
22021
|
+
const t = chunk6FTHFJAN_cjs.sequenceToTimelock(sequence);
|
|
21865
22022
|
return t.type === "blocks" ? Number(t.value) : Number(t.value) / 600;
|
|
21866
22023
|
}
|
|
21867
22024
|
async function resolveUnilateralPath(params) {
|
|
21868
22025
|
const { vtxo, scriptHex, contractRepository } = params;
|
|
21869
22026
|
const contract = contractRepository ? (await contractRepository.getContracts({ script: scriptHex }))[0] : void 0;
|
|
21870
22027
|
if (contract) {
|
|
21871
|
-
const handler =
|
|
22028
|
+
const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
|
|
21872
22029
|
if (!handler) {
|
|
21873
22030
|
throw new ExitPathError(
|
|
21874
22031
|
"no-handler",
|
|
@@ -21891,12 +22048,12 @@ async function resolveUnilateralPath(params) {
|
|
|
21891
22048
|
paths.sort((a, b) => delayWeight(a.sequence) - delayWeight(b.sequence));
|
|
21892
22049
|
return { selection: paths[0], label: `${contract.type}:unilateral` };
|
|
21893
22050
|
}
|
|
21894
|
-
const decoded =
|
|
22051
|
+
const decoded = chunk6FTHFJAN_cjs.VtxoScript.decode(vtxo.tapTree);
|
|
21895
22052
|
let best;
|
|
21896
22053
|
for (const exit of decoded.exitPaths()) {
|
|
21897
22054
|
const leaf = decoded.findLeaf(base.hex.encode(exit.script));
|
|
21898
22055
|
if (!leaf) continue;
|
|
21899
|
-
const sequence =
|
|
22056
|
+
const sequence = chunk6FTHFJAN_cjs.timelockToSequence(exit.params.timelock);
|
|
21900
22057
|
const weight = delayWeight(sequence);
|
|
21901
22058
|
if (!best || weight < best.weight) {
|
|
21902
22059
|
best = { selection: { leaf, sequence }, weight };
|
|
@@ -22116,7 +22273,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
22116
22273
|
let totalAmount = 0n;
|
|
22117
22274
|
const txWeightEstimator = TxWeightEstimator.create();
|
|
22118
22275
|
for (const vtxo of vtxos) {
|
|
22119
|
-
if (!
|
|
22276
|
+
if (!chunk6FTHFJAN_cjs.canSweepOnchain(vtxo)) {
|
|
22120
22277
|
throw new Error(
|
|
22121
22278
|
`Vtxo ${vtxo.txid}:${vtxo.vout} cannot be swept onchain: it is not fully unrolled (use unroll first), or its exit output was already spent`
|
|
22122
22279
|
);
|
|
@@ -22127,14 +22284,14 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
22127
22284
|
}
|
|
22128
22285
|
const resolved = await resolveUnilateralPath({
|
|
22129
22286
|
vtxo,
|
|
22130
|
-
scriptHex: base.hex.encode(
|
|
22287
|
+
scriptHex: base.hex.encode(chunk6FTHFJAN_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
|
|
22131
22288
|
contractRepository: wallet.contractRepository,
|
|
22132
22289
|
walletPubKeyHex: base.hex.encode(await wallet.identity.xOnlyPublicKey()),
|
|
22133
22290
|
currentTime: Date.now()
|
|
22134
22291
|
});
|
|
22135
22292
|
const spendingLeaf = resolved.selection.leaf;
|
|
22136
22293
|
const sequence = resolved.selection.sequence;
|
|
22137
|
-
const timelock =
|
|
22294
|
+
const timelock = chunk6FTHFJAN_cjs.sequenceToTimelock(sequence);
|
|
22138
22295
|
const elapsed = timelock.type === "blocks" ? chainTip.height >= txStatus.blockHeight + Number(timelock.value) : chainTip.time >= txStatus.blockTime + Number(timelock.value);
|
|
22139
22296
|
if (!elapsed) {
|
|
22140
22297
|
throw new Error(`no available exit path found for vtxo ${vtxo.txid}:${vtxo.vout}`);
|
|
@@ -22147,7 +22304,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
22147
22304
|
sequence,
|
|
22148
22305
|
witnessUtxo: {
|
|
22149
22306
|
amount: BigInt(vtxo.value),
|
|
22150
|
-
script:
|
|
22307
|
+
script: chunk6FTHFJAN_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
|
|
22151
22308
|
},
|
|
22152
22309
|
sighashType: btcSigner.SigHash.DEFAULT
|
|
22153
22310
|
});
|
|
@@ -22157,7 +22314,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
22157
22314
|
btcSigner.TaprootControlBlock.encode(spendingLeaf[0]).length
|
|
22158
22315
|
);
|
|
22159
22316
|
}
|
|
22160
|
-
const tx = new
|
|
22317
|
+
const tx = new chunk6FTHFJAN_cjs.Transaction({ version: 2 });
|
|
22161
22318
|
for (const input of inputs) {
|
|
22162
22319
|
tx.addInput(input);
|
|
22163
22320
|
}
|
|
@@ -22240,7 +22397,7 @@ async function buildSignedSweep(params) {
|
|
|
22240
22397
|
`uneconomic vtxo ${vtxo.txid}:${vtxo.vout}: value ${vtxo.value} - fee ${fee} < dust`
|
|
22241
22398
|
);
|
|
22242
22399
|
}
|
|
22243
|
-
const tx = new
|
|
22400
|
+
const tx = new chunk6FTHFJAN_cjs.Transaction({ version: 2 });
|
|
22244
22401
|
tx.addInput({
|
|
22245
22402
|
txid: vtxo.txid,
|
|
22246
22403
|
index: vtxo.vout,
|
|
@@ -22265,7 +22422,7 @@ async function buildSignedSweep(params) {
|
|
|
22265
22422
|
finalScriptWitness: [
|
|
22266
22423
|
tapScriptSig[0][1],
|
|
22267
22424
|
...path.extraWitness,
|
|
22268
|
-
|
|
22425
|
+
chunk6FTHFJAN_cjs.scriptFromTapLeafScript(path.leaf),
|
|
22269
22426
|
btcSigner.TaprootControlBlock.encode(controlBlock)
|
|
22270
22427
|
]
|
|
22271
22428
|
});
|
|
@@ -22295,7 +22452,7 @@ async function resolveFeeRate(opts) {
|
|
|
22295
22452
|
}
|
|
22296
22453
|
async function selectExitVtxos(opts) {
|
|
22297
22454
|
if (!opts.vtxos) return opts.wallet.getVtxos();
|
|
22298
|
-
const res = await
|
|
22455
|
+
const res = await chunk6FTHFJAN_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
|
|
22299
22456
|
const tapTrees = /* @__PURE__ */ new Map();
|
|
22300
22457
|
const out = [];
|
|
22301
22458
|
for (const vtxo of res.vtxos) {
|
|
@@ -22310,7 +22467,7 @@ async function selectExitVtxos(opts) {
|
|
|
22310
22467
|
`no contract registered for vtxo script ${vtxo.script} \u2014 register the contract before exiting`
|
|
22311
22468
|
);
|
|
22312
22469
|
}
|
|
22313
|
-
const handler =
|
|
22470
|
+
const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
|
|
22314
22471
|
if (!handler) {
|
|
22315
22472
|
throw new Error(`no contract handler registered for type '${contract.type}'`);
|
|
22316
22473
|
}
|
|
@@ -22340,7 +22497,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
22340
22497
|
if (pendingNodes.length > 0) {
|
|
22341
22498
|
const txs = await resolver.getVirtualTxs(pendingNodes.map((n) => n.txid));
|
|
22342
22499
|
for (const psbt of txs) {
|
|
22343
|
-
psbts.set(
|
|
22500
|
+
psbts.set(chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
22344
22501
|
}
|
|
22345
22502
|
}
|
|
22346
22503
|
const childVsize = Number(
|
|
@@ -22376,7 +22533,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
22376
22533
|
try {
|
|
22377
22534
|
const resolved = await resolveUnilateralPath({
|
|
22378
22535
|
vtxo,
|
|
22379
|
-
scriptHex: base.hex.encode(
|
|
22536
|
+
scriptHex: base.hex.encode(chunk6FTHFJAN_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
|
|
22380
22537
|
contractRepository: wallet.contractRepository,
|
|
22381
22538
|
walletPubKeyHex,
|
|
22382
22539
|
currentTime: Date.now()
|
|
@@ -22395,7 +22552,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
22395
22552
|
});
|
|
22396
22553
|
continue;
|
|
22397
22554
|
}
|
|
22398
|
-
const t =
|
|
22555
|
+
const t = chunk6FTHFJAN_cjs.sequenceToTimelock(resolved.selection.sequence);
|
|
22399
22556
|
const delay = { type: t.type, value: Number(t.value) };
|
|
22400
22557
|
infos.push({ outpoint, value: vtxo.value, sweepFee, path: resolved.label, delay });
|
|
22401
22558
|
sweeps.push({ vtxo, resolved, sweepFee, delay });
|
|
@@ -22796,7 +22953,7 @@ async function prepare(opts) {
|
|
|
22796
22953
|
txid: sweep.vtxo.txid,
|
|
22797
22954
|
vout: sweep.vtxo.vout,
|
|
22798
22955
|
value: sweep.vtxo.value,
|
|
22799
|
-
pkScript:
|
|
22956
|
+
pkScript: chunk6FTHFJAN_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
|
|
22800
22957
|
},
|
|
22801
22958
|
path: sweep.resolved.selection,
|
|
22802
22959
|
outputAddress: opts.sweepAddress,
|
|
@@ -22884,7 +23041,7 @@ async function prepare(opts) {
|
|
|
22884
23041
|
if (newFee <= splitterFee) break;
|
|
22885
23042
|
splitterFee = newFee;
|
|
22886
23043
|
}
|
|
22887
|
-
const splitter = new
|
|
23044
|
+
const splitter = new chunk6FTHFJAN_cjs.Transaction({ version: 2 });
|
|
22888
23045
|
for (const coin of selected.inputs) {
|
|
22889
23046
|
splitter.addInput({
|
|
22890
23047
|
txid: coin.txid,
|
|
@@ -23028,41 +23185,41 @@ var UnilateralExit = {
|
|
|
23028
23185
|
// src/arkade/index.ts
|
|
23029
23186
|
var arkade_exports = {};
|
|
23030
23187
|
chunk5BLDMQED_cjs.__export(arkade_exports, {
|
|
23031
|
-
ARKADE_OP: () =>
|
|
23032
|
-
ARKADE_OPCODES: () =>
|
|
23033
|
-
ARKADE_OPCODE_NAMES: () =>
|
|
23034
|
-
ARKADE_OPCODE_VALUES: () =>
|
|
23035
|
-
ARKADE_OPS: () =>
|
|
23188
|
+
ARKADE_OP: () => chunkNPM5YZBC_cjs.ARKADE_OP,
|
|
23189
|
+
ARKADE_OPCODES: () => chunkNPM5YZBC_cjs.ARKADE_OPCODES,
|
|
23190
|
+
ARKADE_OPCODE_NAMES: () => chunkNPM5YZBC_cjs.ARKADE_OPCODE_NAMES,
|
|
23191
|
+
ARKADE_OPCODE_VALUES: () => chunkNPM5YZBC_cjs.ARKADE_OPCODE_VALUES,
|
|
23192
|
+
ARKADE_OPS: () => chunkNPM5YZBC_cjs.ARKADE_OPS,
|
|
23036
23193
|
Arkade: () => Arkade,
|
|
23037
23194
|
ArkadeContract: () => ArkadeContract,
|
|
23038
|
-
ArkadeProgramScript: () =>
|
|
23039
|
-
ArkadeScript: () =>
|
|
23195
|
+
ArkadeProgramScript: () => chunkNPM5YZBC_cjs.ArkadeProgramScript,
|
|
23196
|
+
ArkadeScript: () => chunkNPM5YZBC_cjs.ArkadeScript,
|
|
23040
23197
|
ArkadeTransactionBuilder: () => ArkadeTransactionBuilder,
|
|
23041
|
-
BigNum: () =>
|
|
23198
|
+
BigNum: () => chunkNPM5YZBC_cjs.bignum_exports,
|
|
23042
23199
|
OP: () => btcSigner.OP,
|
|
23043
|
-
OPCODE_NAMES: () =>
|
|
23044
|
-
OPCODE_VALUES: () =>
|
|
23045
|
-
SUPPORTED_PROGRAM_VERSION: () =>
|
|
23200
|
+
OPCODE_NAMES: () => chunkNPM5YZBC_cjs.OPCODE_NAMES,
|
|
23201
|
+
OPCODE_VALUES: () => chunkNPM5YZBC_cjs.OPCODE_VALUES,
|
|
23202
|
+
SUPPORTED_PROGRAM_VERSION: () => chunkNPM5YZBC_cjs.SUPPORTED_PROGRAM_VERSION,
|
|
23046
23203
|
Script: () => btcSigner.Script,
|
|
23047
|
-
arkadeScriptHash: () =>
|
|
23048
|
-
arkadeWitnessHash: () =>
|
|
23049
|
-
asmToBytes: () =>
|
|
23050
|
-
bytesToASM: () =>
|
|
23051
|
-
computeArkadeScriptPublicKey: () =>
|
|
23204
|
+
arkadeScriptHash: () => chunkNPM5YZBC_cjs.arkadeScriptHash,
|
|
23205
|
+
arkadeWitnessHash: () => chunkNPM5YZBC_cjs.arkadeWitnessHash,
|
|
23206
|
+
asmToBytes: () => chunkNPM5YZBC_cjs.asmToBytes,
|
|
23207
|
+
bytesToASM: () => chunkNPM5YZBC_cjs.bytesToASM,
|
|
23208
|
+
computeArkadeScriptPublicKey: () => chunkNPM5YZBC_cjs.computeArkadeScriptPublicKey,
|
|
23052
23209
|
createArkadeBatchHandler: () => createArkadeBatchHandler,
|
|
23053
|
-
deserializeArkadeContractParams: () =>
|
|
23054
|
-
fromASM: () =>
|
|
23055
|
-
getOpcodeName: () =>
|
|
23056
|
-
getOpcodeValue: () =>
|
|
23057
|
-
parseArtifact: () =>
|
|
23058
|
-
resolveAsm: () =>
|
|
23059
|
-
serializeArkadeContractParams: () =>
|
|
23060
|
-
stringifyArtifact: () =>
|
|
23061
|
-
toASM: () =>
|
|
23062
|
-
validateProgram: () =>
|
|
23063
|
-
witnessRefToBytes: () =>
|
|
23210
|
+
deserializeArkadeContractParams: () => chunkNPM5YZBC_cjs.deserializeArkadeContractParams,
|
|
23211
|
+
fromASM: () => chunkNPM5YZBC_cjs.fromASM,
|
|
23212
|
+
getOpcodeName: () => chunkNPM5YZBC_cjs.getOpcodeName,
|
|
23213
|
+
getOpcodeValue: () => chunkNPM5YZBC_cjs.getOpcodeValue,
|
|
23214
|
+
parseArtifact: () => chunkNPM5YZBC_cjs.parseArtifact,
|
|
23215
|
+
resolveAsm: () => chunkNPM5YZBC_cjs.resolveAsm,
|
|
23216
|
+
serializeArkadeContractParams: () => chunkNPM5YZBC_cjs.serializeArkadeContractParams,
|
|
23217
|
+
stringifyArtifact: () => chunkNPM5YZBC_cjs.stringifyArtifact,
|
|
23218
|
+
toASM: () => chunkNPM5YZBC_cjs.toASM,
|
|
23219
|
+
validateProgram: () => chunkNPM5YZBC_cjs.validateProgram,
|
|
23220
|
+
witnessRefToBytes: () => chunkNPM5YZBC_cjs.witnessRefToBytes
|
|
23064
23221
|
});
|
|
23065
|
-
var isVtxoCoin = (input) =>
|
|
23222
|
+
var isVtxoCoin = (input) => chunk6FTHFJAN_cjs.isVirtualCoin(input);
|
|
23066
23223
|
function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message, session, arkProvider, emulator, network, recipients, batchExpiryPolicy) {
|
|
23067
23224
|
let batchId;
|
|
23068
23225
|
let sweepTapTreeRoot;
|
|
@@ -23083,23 +23240,23 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
23083
23240
|
);
|
|
23084
23241
|
await arkProvider.confirmRegistration(intentId);
|
|
23085
23242
|
batchId = event.id;
|
|
23086
|
-
const sweepTapscript =
|
|
23243
|
+
const sweepTapscript = chunk6FTHFJAN_cjs.CSVMultisigTapscript.encode({
|
|
23087
23244
|
timelock,
|
|
23088
|
-
pubkeys: [
|
|
23245
|
+
pubkeys: [chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(info.forfeitPubkey), "forfeit key")]
|
|
23089
23246
|
}).script;
|
|
23090
23247
|
sweepTapTreeRoot = payment_js.tapLeafHash(sweepTapscript);
|
|
23091
23248
|
return { skip: false };
|
|
23092
23249
|
},
|
|
23093
23250
|
onTreeSigningStarted: async (event, vtxoTree) => {
|
|
23094
23251
|
const signerPubKey = await session.getPublicKey();
|
|
23095
|
-
const xonlySignerPubKey =
|
|
23252
|
+
const xonlySignerPubKey = chunkNPM5YZBC_cjs.toXOnly(signerPubKey, "signer key");
|
|
23096
23253
|
const xOnlyPubkeys = event.cosignersPublicKeys.map(
|
|
23097
|
-
(k) => base.hex.encode(
|
|
23254
|
+
(k) => base.hex.encode(chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
|
|
23098
23255
|
);
|
|
23099
23256
|
if (!xOnlyPubkeys.includes(base.hex.encode(xonlySignerPubKey))) {
|
|
23100
23257
|
return { skip: true };
|
|
23101
23258
|
}
|
|
23102
|
-
const commitmentTx =
|
|
23259
|
+
const commitmentTx = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
|
|
23103
23260
|
validateVtxoTxGraph(vtxoTree, commitmentTx, sweepTapTreeRoot);
|
|
23104
23261
|
if (recipients && recipients.length > 0) {
|
|
23105
23262
|
validateBatchRecipients(commitmentTx, vtxoTree.leaves(), recipients, network);
|
|
@@ -23131,7 +23288,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
23131
23288
|
if (connectorTree) {
|
|
23132
23289
|
validateConnectorsTxGraph(event.commitmentTx, connectorTree);
|
|
23133
23290
|
}
|
|
23134
|
-
let commitmentPsbt =
|
|
23291
|
+
let commitmentPsbt = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
|
|
23135
23292
|
assertFinalCommitmentMatchesValidated(
|
|
23136
23293
|
commitmentPsbt,
|
|
23137
23294
|
validatedCommitmentTxid,
|
|
@@ -23166,7 +23323,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
23166
23323
|
boardingIndices.push(boardingIdx);
|
|
23167
23324
|
continue;
|
|
23168
23325
|
}
|
|
23169
|
-
if (
|
|
23326
|
+
if (chunk6FTHFJAN_cjs.isRecoverable(input) || isSubdust(input, info.dust)) {
|
|
23170
23327
|
continue;
|
|
23171
23328
|
}
|
|
23172
23329
|
if (connectorIndex >= connectorLeaves.length) {
|
|
@@ -23187,7 +23344,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
23187
23344
|
index: input.vout,
|
|
23188
23345
|
witnessUtxo: {
|
|
23189
23346
|
amount: BigInt(input.value),
|
|
23190
|
-
script:
|
|
23347
|
+
script: chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
23191
23348
|
},
|
|
23192
23349
|
sighashType: btcSigner.SigHash.DEFAULT,
|
|
23193
23350
|
tapLeafScript: [input.forfeitTapLeafScript]
|
|
@@ -23278,16 +23435,16 @@ var Arkade = class _Arkade {
|
|
|
23278
23435
|
/** Connect and resolve the server key, checkpoint closure and (if present) the co-signer key. */
|
|
23279
23436
|
static async connect(opts) {
|
|
23280
23437
|
const info = await opts.arkade.getInfo();
|
|
23281
|
-
const serverKey =
|
|
23282
|
-
const checkpoint =
|
|
23283
|
-
const network = opts.network ??
|
|
23438
|
+
const serverKey = chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
|
|
23439
|
+
const checkpoint = chunk6FTHFJAN_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
|
|
23440
|
+
const network = opts.network ?? chunk6FTHFJAN_cjs.DEFAULT_NETWORK;
|
|
23284
23441
|
let emulatorKey;
|
|
23285
23442
|
if (opts.emulator) {
|
|
23286
|
-
emulatorKey = base.hex.decode(
|
|
23443
|
+
emulatorKey = base.hex.decode(chunk6FTHFJAN_cjs.resolveEmulatorPubkey(network, opts.emulatorPubkey));
|
|
23287
23444
|
}
|
|
23288
23445
|
let userKey;
|
|
23289
23446
|
if (opts.identity) {
|
|
23290
|
-
userKey =
|
|
23447
|
+
userKey = chunkNPM5YZBC_cjs.toXOnly(await opts.identity.xOnlyPublicKey(), "identity key");
|
|
23291
23448
|
}
|
|
23292
23449
|
return new _Arkade({
|
|
23293
23450
|
arkProvider: opts.arkade,
|
|
@@ -23313,7 +23470,7 @@ var Arkade = class _Arkade {
|
|
|
23313
23470
|
* key respectively; explicit args always win.
|
|
23314
23471
|
*/
|
|
23315
23472
|
contract(program, args = {}) {
|
|
23316
|
-
const declared = (program.params ?? []).map(
|
|
23473
|
+
const declared = (program.params ?? []).map(chunkNPM5YZBC_cjs.inputName);
|
|
23317
23474
|
if (declared.includes("server") && args.server === void 0) {
|
|
23318
23475
|
args = { ...args, server: this.serverKey };
|
|
23319
23476
|
}
|
|
@@ -23333,7 +23490,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
23333
23490
|
userKey: client.userKey,
|
|
23334
23491
|
emulatorKey: client.emulatorKey
|
|
23335
23492
|
};
|
|
23336
|
-
this.vtxoScript = new
|
|
23493
|
+
this.vtxoScript = new chunkNPM5YZBC_cjs.ArkadeProgramScript(program, args, this.keys);
|
|
23337
23494
|
this.tapTree = this.vtxoScript.encode();
|
|
23338
23495
|
this.compiled = this.vtxoScript.compiled;
|
|
23339
23496
|
}
|
|
@@ -23361,7 +23518,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
23361
23518
|
`ArkadeContract.fromContract: expected contract type 'arkade', got '${contract.type}'`
|
|
23362
23519
|
);
|
|
23363
23520
|
}
|
|
23364
|
-
const typed =
|
|
23521
|
+
const typed = chunkNPM5YZBC_cjs.deserializeArkadeContractParams(contract.params);
|
|
23365
23522
|
return new _ArkadeContract(client, typed.program, typed.args, {
|
|
23366
23523
|
serverKey: typed.serverKey,
|
|
23367
23524
|
userKey: typed.userKey,
|
|
@@ -23402,7 +23559,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
23402
23559
|
toContractParams() {
|
|
23403
23560
|
return {
|
|
23404
23561
|
type: "arkade",
|
|
23405
|
-
params:
|
|
23562
|
+
params: chunkNPM5YZBC_cjs.serializeArkadeContractParams({
|
|
23406
23563
|
program: this.program,
|
|
23407
23564
|
args: this.args,
|
|
23408
23565
|
serverKey: this.keys.serverKey,
|
|
@@ -23452,18 +23609,18 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
23452
23609
|
if (registered) {
|
|
23453
23610
|
const [withVtxos] = await manager.getContractsWithVtxos({ script: scriptHex });
|
|
23454
23611
|
return (withVtxos?.vtxos ?? []).filter(
|
|
23455
|
-
(v) => !
|
|
23612
|
+
(v) => !chunk6FTHFJAN_cjs.hasTerminalSpend(v) && !v.isUnrolled
|
|
23456
23613
|
);
|
|
23457
23614
|
}
|
|
23458
23615
|
}
|
|
23459
23616
|
if (!this.client.indexer) {
|
|
23460
23617
|
throw new Error("ArkadeContract.getUtxos: an indexer is required");
|
|
23461
23618
|
}
|
|
23462
|
-
const { vtxos } = await
|
|
23619
|
+
const { vtxos } = await chunk6FTHFJAN_cjs.getNormalizedVtxos(this.client.indexer, {
|
|
23463
23620
|
scripts: [scriptHex],
|
|
23464
23621
|
spendableOnly: true
|
|
23465
23622
|
});
|
|
23466
|
-
return vtxos.filter((v) => !
|
|
23623
|
+
return vtxos.filter((v) => !chunk6FTHFJAN_cjs.hasTerminalSpend(v) && !v.isUnrolled);
|
|
23467
23624
|
}
|
|
23468
23625
|
/** Total spendable balance (requires an indexer). */
|
|
23469
23626
|
async getBalance() {
|
|
@@ -23561,7 +23718,7 @@ var ArkadeTransactionBuilder = class {
|
|
|
23561
23718
|
this.contract.client.checkpoint
|
|
23562
23719
|
);
|
|
23563
23720
|
if (coin.sourceTx) {
|
|
23564
|
-
|
|
23721
|
+
chunk6FTHFJAN_cjs.setArkPsbtField(arkTx, 0, chunk6FTHFJAN_cjs.PrevArkTxField, coin.sourceTx);
|
|
23565
23722
|
}
|
|
23566
23723
|
if (this.fn.arkadeScript) {
|
|
23567
23724
|
const indexer = this.contract.client.indexer;
|
|
@@ -23578,8 +23735,8 @@ var ArkadeTransactionBuilder = class {
|
|
|
23578
23735
|
}
|
|
23579
23736
|
const condition = (def.tapscript.witness ?? []).map((w) => this.witnessBytes(w));
|
|
23580
23737
|
if (condition.length > 0) {
|
|
23581
|
-
|
|
23582
|
-
|
|
23738
|
+
chunk6FTHFJAN_cjs.setArkPsbtField(arkTx, 0, chunk6FTHFJAN_cjs.ConditionWitness, condition);
|
|
23739
|
+
chunk6FTHFJAN_cjs.setArkPsbtField(checkpoints[0], 0, chunk6FTHFJAN_cjs.ConditionWitness, condition);
|
|
23583
23740
|
}
|
|
23584
23741
|
const packets = [];
|
|
23585
23742
|
if (this.assetSpecs.length > 0) {
|
|
@@ -23618,7 +23775,7 @@ var ArkadeTransactionBuilder = class {
|
|
|
23618
23775
|
base.base64.encode(signedArk2.toPSBT()),
|
|
23619
23776
|
signedCps.map((c) => base.base64.encode(c.toPSBT()))
|
|
23620
23777
|
);
|
|
23621
|
-
const txid =
|
|
23778
|
+
const txid = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
|
|
23622
23779
|
return {
|
|
23623
23780
|
txid,
|
|
23624
23781
|
signedArkTx: res2.signedArkTx,
|
|
@@ -23677,23 +23834,23 @@ var ArkadeTransactionBuilder = class {
|
|
|
23677
23834
|
}
|
|
23678
23835
|
buildAssetPacket() {
|
|
23679
23836
|
const groups = this.assetSpecs.map((s) => {
|
|
23680
|
-
const id = typeof s.assetId === "string" ?
|
|
23681
|
-
return
|
|
23837
|
+
const id = typeof s.assetId === "string" ? chunk4C5PMGBB_cjs.AssetId.fromString(s.assetId) : chunk4C5PMGBB_cjs.AssetId.fromBytes(s.assetId);
|
|
23838
|
+
return chunk4C5PMGBB_cjs.AssetGroup.create(
|
|
23682
23839
|
id,
|
|
23683
23840
|
null,
|
|
23684
|
-
s.inputs.map((i) =>
|
|
23685
|
-
s.outputs.map((o) =>
|
|
23686
|
-
(s.metadata ?? []).map((m) =>
|
|
23841
|
+
s.inputs.map((i) => chunk4C5PMGBB_cjs.AssetInput.create(i.vin, i.amount)),
|
|
23842
|
+
s.outputs.map((o) => chunk4C5PMGBB_cjs.AssetOutput.create(o.vout, o.amount)),
|
|
23843
|
+
(s.metadata ?? []).map((m) => chunk4C5PMGBB_cjs.Metadata.create(m.key, m.value))
|
|
23687
23844
|
);
|
|
23688
23845
|
});
|
|
23689
|
-
return
|
|
23846
|
+
return chunk4C5PMGBB_cjs.Packet.create(groups);
|
|
23690
23847
|
}
|
|
23691
23848
|
witnessBytes(ref) {
|
|
23692
|
-
return
|
|
23849
|
+
return chunkNPM5YZBC_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
|
|
23693
23850
|
}
|
|
23694
23851
|
};
|
|
23695
23852
|
function bindInputs(fn, callArgs) {
|
|
23696
|
-
const names = (fn.def.inputs ?? []).map(
|
|
23853
|
+
const names = (fn.def.inputs ?? []).map(chunkNPM5YZBC_cjs.inputName);
|
|
23697
23854
|
if (callArgs.length !== names.length) {
|
|
23698
23855
|
throw new Error(`${fn.name}: expected ${names.length} argument(s), got ${callArgs.length}`);
|
|
23699
23856
|
}
|
|
@@ -24345,6 +24502,7 @@ exports.outpointReasons = outpointReasons;
|
|
|
24345
24502
|
exports.promisifyRequest = promisifyRequest;
|
|
24346
24503
|
exports.provisionClaimSecret = provisionClaimSecret;
|
|
24347
24504
|
exports.provisionRefundKey = provisionRefundKey;
|
|
24505
|
+
exports.registerWalletRestoreHook = registerWalletRestoreHook;
|
|
24348
24506
|
exports.requiresMigration = requiresMigration;
|
|
24349
24507
|
exports.resolveAssetAmount = resolveAssetAmount;
|
|
24350
24508
|
exports.resolveBatchExpiryPolicy = resolveBatchExpiryPolicy;
|
|
@@ -24376,5 +24534,5 @@ exports.waitForIncomingFunds = waitForIncomingFunds;
|
|
|
24376
24534
|
exports.walletFeeSource = walletFeeSource;
|
|
24377
24535
|
exports.warnAndFilterVtxosForScript = warnAndFilterVtxosForScript;
|
|
24378
24536
|
exports.withPrevTxs = withPrevTxs;
|
|
24379
|
-
//# sourceMappingURL=chunk-
|
|
24380
|
-
//# sourceMappingURL=chunk-
|
|
24537
|
+
//# sourceMappingURL=chunk-U5I3ITV7.cjs.map
|
|
24538
|
+
//# sourceMappingURL=chunk-U5I3ITV7.cjs.map
|