@arkade-os/sdk 0.5.0-rc.0 → 0.5.0-rc.2
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 +34 -1
- 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-CdF_ELX8.d.cts → asyncStorageTaskQueue-BuDvgWh6.d.cts} +1 -1
- package/dist/{asyncStorageTaskQueue-BCzN3Y45.d.ts → asyncStorageTaskQueue-C5rBYlru.d.ts} +1 -1
- package/dist/{chunk-KTU44AEH.js → chunk-3R476TDV.js} +4 -4
- package/dist/{chunk-KTU44AEH.js.map → chunk-3R476TDV.js.map} +1 -1
- package/dist/{chunk-HL7EC2Z5.cjs → chunk-43FKNLX4.cjs} +50 -50
- package/dist/{chunk-HL7EC2Z5.cjs.map → chunk-43FKNLX4.cjs.map} +1 -1
- package/dist/{chunk-FVTJJQNM.js → chunk-4PKLULWT.js} +3 -3
- package/dist/{chunk-FVTJJQNM.js.map → chunk-4PKLULWT.js.map} +1 -1
- package/dist/{chunk-ABJPM4JF.js → chunk-6DNR46C7.js} +4 -4
- package/dist/{chunk-ABJPM4JF.js.map → chunk-6DNR46C7.js.map} +1 -1
- package/dist/{chunk-PB5KJI4U.cjs → chunk-D25O4EGY.cjs} +10 -10
- package/dist/{chunk-PB5KJI4U.cjs.map → chunk-D25O4EGY.cjs.map} +1 -1
- package/dist/{chunk-5MJHZHG7.cjs → chunk-GMZZQXV5.cjs} +863 -484
- package/dist/chunk-GMZZQXV5.cjs.map +1 -0
- package/dist/{chunk-RXWKCEZP.cjs → chunk-HLCGYOIH.cjs} +17 -17
- package/dist/{chunk-RXWKCEZP.cjs.map → chunk-HLCGYOIH.cjs.map} +1 -1
- package/dist/{chunk-PPG6W34P.js → chunk-ISO4TI5J.js} +3 -3
- package/dist/{chunk-PPG6W34P.js.map → chunk-ISO4TI5J.js.map} +1 -1
- package/dist/{chunk-6AFUNKK7.cjs → chunk-JZWLXNHV.cjs} +3 -3
- package/dist/{chunk-6AFUNKK7.cjs.map → chunk-JZWLXNHV.cjs.map} +1 -1
- package/dist/{chunk-CZ32XADN.cjs → chunk-NVZJSKZS.cjs} +17 -17
- package/dist/{chunk-CZ32XADN.cjs.map → chunk-NVZJSKZS.cjs.map} +1 -1
- package/dist/{chunk-JYP7YXT2.js → chunk-ZOTXDOS5.js} +4 -4
- package/dist/{chunk-JYP7YXT2.js.map → chunk-ZOTXDOS5.js.map} +1 -1
- package/dist/{chunk-6F2Q32KA.js → chunk-ZRNQV6HV.js} +425 -52
- package/dist/chunk-ZRNQV6HV.js.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-DLIOBQ5x.d.cts → delegate-1yp1HyP7.d.cts} +1 -1
- package/dist/{delegate-Dyn5L80J.d.ts → delegate-BAX5QftB.d.ts} +1 -1
- package/dist/{hdWalletCapable-Dt3MUiGE.d.cts → hdWalletCapable-CmEU0NP1.d.ts} +49 -5
- package/dist/{hdWalletCapable-D9tooZ6F.d.ts → hdWalletCapable-eJgaT-ec.d.cts} +49 -5
- package/dist/{index-D9tXd-tN.d.ts → index-Bem5vKzX.d.ts} +2 -2
- package/dist/{index-Udm5V2xW.d.cts → index-DUxufw76.d.cts} +53 -1
- package/dist/{index-Udm5V2xW.d.ts → index-DUxufw76.d.ts} +53 -1
- package/dist/{index-D3hmsuKs.d.cts → index-W_oMcOmG.d.cts} +2 -2
- package/dist/index.cjs +318 -294
- package/dist/index.d.cts +81 -14
- package/dist/index.d.ts +81 -14
- 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-ZdS16Ypm.d.ts → taskRunner-D_iPiZIi.d.ts} +1 -1
- package/dist/{taskRunner-DxZciNaa.d.cts → taskRunner-Dr3NStc0.d.cts} +1 -1
- package/dist/wallet/expo/background.cjs +14 -14
- package/dist/wallet/expo/background.d.cts +3 -3
- package/dist/wallet/expo/background.d.ts +3 -3
- package/dist/wallet/expo/background.js +6 -6
- package/dist/wallet/expo/index.cjs +14 -14
- package/dist/wallet/expo/index.d.cts +4 -4
- package/dist/wallet/expo/index.d.ts +4 -4
- package/dist/wallet/expo/index.js +5 -5
- package/dist/worker/expo/index.cjs +9 -9
- package/dist/worker/expo/index.d.cts +4 -4
- package/dist/worker/expo/index.d.ts +4 -4
- package/dist/worker/expo/index.js +5 -5
- package/package.json +1 -1
- package/dist/chunk-5MJHZHG7.cjs.map +0 -1
- package/dist/chunk-6F2Q32KA.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var chunkNVZJSKZS_cjs = require('./chunk-NVZJSKZS.cjs');
|
|
4
|
+
var chunk43FKNLX4_cjs = require('./chunk-43FKNLX4.cjs');
|
|
5
|
+
var chunkJZWLXNHV_cjs = require('./chunk-JZWLXNHV.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 = chunkJZWLXNHV_cjs.getArkPsbtFields(tx.root, 0, chunkJZWLXNHV_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 = chunkJZWLXNHV_cjs.getArkPsbtFields(g.root, 0, chunkJZWLXNHV_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
|
+
chunkJZWLXNHV_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 = chunk43FKNLX4_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 chunk43FKNLX4_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 = chunk43FKNLX4_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
|
+
chunkJZWLXNHV_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 = chunk43FKNLX4_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 chunk43FKNLX4_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 chunk43FKNLX4_cjs.deriveDescriptorLeafPubKey(this.descriptor);
|
|
882
882
|
}
|
|
883
883
|
async compressedPublicKey() {
|
|
884
|
-
return
|
|
884
|
+
return chunk43FKNLX4_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 && chunk43FKNLX4_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 = chunk43FKNLX4_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 chunk43FKNLX4_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 chunk43FKNLX4_cjs.identityDescriptor(wallet.identity);
|
|
1337
1337
|
}
|
|
1338
1338
|
async function provisionRefundKey(wallet) {
|
|
1339
|
-
const descriptor = await
|
|
1339
|
+
const descriptor = await chunk43FKNLX4_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 } = chunkJZWLXNHV_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 = chunk43FKNLX4_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 chunkJZWLXNHV_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: chunkJZWLXNHV_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 chunkJZWLXNHV_cjs.rateGate.runHttp(url, () => chunkJZWLXNHV_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[chunkJZWLXNHV_cjs.DEFAULT_NETWORK_NAME], opts) {
|
|
1667
1667
|
this.baseUrl = baseUrl;
|
|
1668
1668
|
this.pollingInterval = opts?.pollingInterval ?? 15e3;
|
|
1669
1669
|
this.forcePolling = opts?.forcePolling ?? false;
|
|
@@ -1671,15 +1671,25 @@ var EsploraProvider = class {
|
|
|
1671
1671
|
baseUrl;
|
|
1672
1672
|
pollingInterval;
|
|
1673
1673
|
forcePolling;
|
|
1674
|
+
/**
|
|
1675
|
+
* Live {@link watchAddresses} subscriptions, keyed by their address set.
|
|
1676
|
+
*
|
|
1677
|
+
* Concurrent watchers over the same addresses share one transport, so a
|
|
1678
|
+
* caller that opens watchers in a loop — or leaks them by abandoning
|
|
1679
|
+
* {@link waitForIncomingFunds} — costs one entry in a `Set` rather than
|
|
1680
|
+
* another WebSocket plus another full-history polling loop. Entries are
|
|
1681
|
+
* dropped once their last subscriber stops.
|
|
1682
|
+
*/
|
|
1683
|
+
addressWatches = /* @__PURE__ */ new Map();
|
|
1674
1684
|
async getCoins(address) {
|
|
1675
|
-
const response = await
|
|
1685
|
+
const response = await chunkJZWLXNHV_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
|
|
1676
1686
|
if (!response.ok) {
|
|
1677
1687
|
throw new Error(`Failed to fetch UTXOs: ${response.statusText}`);
|
|
1678
1688
|
}
|
|
1679
1689
|
return response.json();
|
|
1680
1690
|
}
|
|
1681
1691
|
async getFeeRate() {
|
|
1682
|
-
const response = await
|
|
1692
|
+
const response = await chunkJZWLXNHV_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
|
|
1683
1693
|
if (response.status === 404) {
|
|
1684
1694
|
return void 0;
|
|
1685
1695
|
}
|
|
@@ -1700,7 +1710,7 @@ var EsploraProvider = class {
|
|
|
1700
1710
|
}
|
|
1701
1711
|
}
|
|
1702
1712
|
async getTxOutspends(txid) {
|
|
1703
|
-
const response = await
|
|
1713
|
+
const response = await chunkJZWLXNHV_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
|
|
1704
1714
|
if (!response.ok) {
|
|
1705
1715
|
const error = await response.text();
|
|
1706
1716
|
throw new Error(`Failed to get transaction outspends: ${error}`);
|
|
@@ -1708,15 +1718,27 @@ var EsploraProvider = class {
|
|
|
1708
1718
|
return response.json();
|
|
1709
1719
|
}
|
|
1710
1720
|
async getTransactions(address) {
|
|
1711
|
-
const response = await
|
|
1721
|
+
const response = await chunkJZWLXNHV_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
|
|
1712
1722
|
if (!response.ok) {
|
|
1713
1723
|
const error = await response.text();
|
|
1714
1724
|
throw new Error(`Failed to get transactions: ${error}`);
|
|
1715
1725
|
}
|
|
1716
1726
|
return response.json();
|
|
1717
1727
|
}
|
|
1728
|
+
/**
|
|
1729
|
+
* Activity counts for an address, without its transactions — orders of
|
|
1730
|
+
* magnitude smaller than `/address/{addr}/txs`, which is what makes it
|
|
1731
|
+
* usable as a change probe for the polling fallback.
|
|
1732
|
+
*/
|
|
1733
|
+
async getAddressStats(address) {
|
|
1734
|
+
const response = await chunkJZWLXNHV_cjs.baseFetch(`${this.baseUrl}/address/${address}`);
|
|
1735
|
+
if (!response.ok) {
|
|
1736
|
+
throw new Error(`Failed to get address stats: ${response.statusText}`);
|
|
1737
|
+
}
|
|
1738
|
+
return response.json();
|
|
1739
|
+
}
|
|
1718
1740
|
async getRawTransaction(txid) {
|
|
1719
|
-
const response = await
|
|
1741
|
+
const response = await chunkJZWLXNHV_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/hex`);
|
|
1720
1742
|
if (!response.ok) {
|
|
1721
1743
|
const error = await response.text();
|
|
1722
1744
|
throw new Error(`Failed to get raw transaction ${txid}: ${error}`);
|
|
@@ -1724,7 +1746,7 @@ var EsploraProvider = class {
|
|
|
1724
1746
|
return base.hex.decode((await response.text()).trim());
|
|
1725
1747
|
}
|
|
1726
1748
|
async getTxStatus(txid) {
|
|
1727
|
-
const txresponse = await
|
|
1749
|
+
const txresponse = await chunkJZWLXNHV_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
|
|
1728
1750
|
if (!txresponse.ok) {
|
|
1729
1751
|
throw new Error(txresponse.statusText);
|
|
1730
1752
|
}
|
|
@@ -1732,7 +1754,7 @@ var EsploraProvider = class {
|
|
|
1732
1754
|
if (!tx.status.confirmed) {
|
|
1733
1755
|
return { confirmed: false };
|
|
1734
1756
|
}
|
|
1735
|
-
const response = await
|
|
1757
|
+
const response = await chunkJZWLXNHV_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
|
|
1736
1758
|
if (!response.ok) {
|
|
1737
1759
|
throw new Error(`Failed to get transaction status: ${response.statusText}`);
|
|
1738
1760
|
}
|
|
@@ -1746,50 +1768,227 @@ var EsploraProvider = class {
|
|
|
1746
1768
|
blockHeight: data.block_height
|
|
1747
1769
|
};
|
|
1748
1770
|
}
|
|
1771
|
+
/**
|
|
1772
|
+
* Watch a set of addresses over the explorer's WebSocket, degrading to HTTP
|
|
1773
|
+
* polling whenever the socket is unavailable and returning to the socket as
|
|
1774
|
+
* soon as it can be re-established.
|
|
1775
|
+
*
|
|
1776
|
+
* Concurrent calls covering the same address set share one transport. The
|
|
1777
|
+
* returned function releases **this** subscription only; the transport is
|
|
1778
|
+
* torn down when the last subscriber releases it. Calling it more than once
|
|
1779
|
+
* is a no-op.
|
|
1780
|
+
*
|
|
1781
|
+
* @param addresses - Addresses to monitor; order is not significant
|
|
1782
|
+
* @param callback - Invoked with transactions seen after the watch started
|
|
1783
|
+
* @returns A function releasing this subscription
|
|
1784
|
+
* @remarks
|
|
1785
|
+
* The HTTP fallback fetches full address history per address per cycle,
|
|
1786
|
+
* which is dramatically more expensive than the socket — so callers should
|
|
1787
|
+
* release watches they no longer need rather than relying on sharing.
|
|
1788
|
+
* @see {@link waitForIncomingFunds} for the cancellation-aware wallet-level helper
|
|
1789
|
+
*/
|
|
1749
1790
|
async watchAddresses(addresses, callback) {
|
|
1750
|
-
|
|
1791
|
+
const key = [...addresses].sort().join("\0");
|
|
1792
|
+
let watch = this.addressWatches.get(key);
|
|
1793
|
+
if (!watch) {
|
|
1794
|
+
watch = this.createAddressWatch(addresses, () => this.addressWatches.delete(key));
|
|
1795
|
+
this.addressWatches.set(key, watch);
|
|
1796
|
+
}
|
|
1797
|
+
const subscriber = { callback };
|
|
1798
|
+
watch.subscribers.add(subscriber);
|
|
1799
|
+
const shared = watch;
|
|
1800
|
+
await shared.started;
|
|
1801
|
+
let released = false;
|
|
1802
|
+
return () => {
|
|
1803
|
+
if (released) return;
|
|
1804
|
+
released = true;
|
|
1805
|
+
shared.subscribers.delete(subscriber);
|
|
1806
|
+
if (shared.subscribers.size === 0) shared.teardown();
|
|
1807
|
+
};
|
|
1808
|
+
}
|
|
1809
|
+
/**
|
|
1810
|
+
* Bring up one shared address watch: a WebSocket subscription where the
|
|
1811
|
+
* explorer supports it, degrading to HTTP polling when it doesn't.
|
|
1812
|
+
*
|
|
1813
|
+
* @param addresses - Addresses this watch covers
|
|
1814
|
+
* @param onTeardown - Invoked when the watch retires, to drop the registry entry
|
|
1815
|
+
*/
|
|
1816
|
+
createAddressWatch(addresses, onTeardown) {
|
|
1817
|
+
const subscribers = /* @__PURE__ */ new Set();
|
|
1751
1818
|
const wsUrl = this.baseUrl.replace(/^http(s)?:/, "ws$1:") + "/v1/ws";
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1819
|
+
let stopped = false;
|
|
1820
|
+
let timer = null;
|
|
1821
|
+
let pollStarted = false;
|
|
1822
|
+
let ws = null;
|
|
1823
|
+
let reconnectTimer = null;
|
|
1824
|
+
let reconnectFailures = 0;
|
|
1825
|
+
let pollSession = 0;
|
|
1826
|
+
const emit = (txs) => {
|
|
1827
|
+
if (stopped || txs.length === 0) return;
|
|
1828
|
+
for (const subscriber of [...subscribers]) {
|
|
1829
|
+
try {
|
|
1830
|
+
subscriber.callback(txs);
|
|
1831
|
+
} catch (error) {
|
|
1832
|
+
console.error("Address watch subscriber threw:", error);
|
|
1833
|
+
}
|
|
1834
|
+
}
|
|
1835
|
+
};
|
|
1836
|
+
const txKey2 = (tx) => `${tx.txid}_${tx.status.block_time}`;
|
|
1837
|
+
const getAllTxs = async () => {
|
|
1838
|
+
const txArrays = await Promise.all(
|
|
1839
|
+
addresses.map((address) => this.getTransactions(address))
|
|
1840
|
+
);
|
|
1841
|
+
return txArrays.flat();
|
|
1842
|
+
};
|
|
1843
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1844
|
+
let baselined = false;
|
|
1845
|
+
let anchorHeight;
|
|
1846
|
+
const baseline = (async () => {
|
|
1847
|
+
const [history, tip] = await Promise.allSettled([getAllTxs(), this.getChainTip()]);
|
|
1848
|
+
if (history.status === "fulfilled") {
|
|
1849
|
+
for (const tx of history.value) seen.add(txKey2(tx));
|
|
1850
|
+
baselined = true;
|
|
1851
|
+
return;
|
|
1852
|
+
}
|
|
1853
|
+
console.warn(
|
|
1854
|
+
"Could not baseline watched addresses; the first poll pass will establish it instead:",
|
|
1855
|
+
history.reason
|
|
1856
|
+
);
|
|
1857
|
+
if (tip.status === "fulfilled") anchorHeight = tip.value.height;
|
|
1858
|
+
})();
|
|
1859
|
+
const report = (txs) => {
|
|
1860
|
+
const fresh = [];
|
|
1861
|
+
for (const tx of txs) {
|
|
1862
|
+
const key = txKey2(tx);
|
|
1863
|
+
if (seen.has(key)) continue;
|
|
1864
|
+
seen.add(key);
|
|
1865
|
+
fresh.push(tx);
|
|
1866
|
+
}
|
|
1867
|
+
if (fresh.length === 0) return;
|
|
1868
|
+
emit(fresh);
|
|
1869
|
+
};
|
|
1870
|
+
const startPolling = async () => {
|
|
1871
|
+
if (stopped || pollStarted) return;
|
|
1872
|
+
pollStarted = true;
|
|
1873
|
+
console.warn(
|
|
1874
|
+
`Esplora websocket unavailable (${wsUrl}); falling back to HTTP polling every ${this.pollingInterval}ms for ${addresses.length} address(es) while retrying the socket`
|
|
1875
|
+
);
|
|
1876
|
+
let failures = 0;
|
|
1877
|
+
const activityFingerprint = async () => {
|
|
1878
|
+
try {
|
|
1879
|
+
const stats = await Promise.all(
|
|
1880
|
+
addresses.map((address) => this.getAddressStats(address))
|
|
1881
|
+
);
|
|
1882
|
+
const counted = (activity) => typeof activity?.tx_count === "number" && typeof activity.funded_txo_count === "number" && typeof activity.spent_txo_count === "number";
|
|
1883
|
+
const usable = stats.every(
|
|
1884
|
+
(s) => counted(s?.chain_stats) && counted(s?.mempool_stats)
|
|
1885
|
+
);
|
|
1886
|
+
if (!usable) return void 0;
|
|
1887
|
+
if (stats.some((s) => s.mempool_stats.tx_count > 0)) return void 0;
|
|
1888
|
+
return stats.map(
|
|
1889
|
+
({ chain_stats: chain }) => `${chain.tx_count}:${chain.funded_txo_count}:${chain.spent_txo_count}`
|
|
1890
|
+
).join(",");
|
|
1891
|
+
} catch {
|
|
1892
|
+
return void 0;
|
|
1893
|
+
}
|
|
1758
1894
|
};
|
|
1759
|
-
|
|
1760
|
-
const
|
|
1761
|
-
const
|
|
1762
|
-
|
|
1895
|
+
let lastFingerprint;
|
|
1896
|
+
const session = pollSession;
|
|
1897
|
+
const isCurrentLoop = () => !stopped && session === pollSession;
|
|
1898
|
+
const schedule = () => {
|
|
1899
|
+
if (!isCurrentLoop()) return;
|
|
1900
|
+
timer = setTimeout(tick, this.pollingInterval * 2 ** failures);
|
|
1901
|
+
};
|
|
1902
|
+
const tick = async () => {
|
|
1763
1903
|
try {
|
|
1904
|
+
const fingerprint = await activityFingerprint();
|
|
1905
|
+
if (!isCurrentLoop()) return;
|
|
1906
|
+
if (fingerprint !== void 0 && fingerprint === lastFingerprint) {
|
|
1907
|
+
failures = 0;
|
|
1908
|
+
schedule();
|
|
1909
|
+
return;
|
|
1910
|
+
}
|
|
1764
1911
|
const currentTxs = await getAllTxs();
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1912
|
+
if (!isCurrentLoop()) return;
|
|
1913
|
+
lastFingerprint = fingerprint;
|
|
1914
|
+
if (baselined) {
|
|
1915
|
+
report(currentTxs);
|
|
1916
|
+
} else if (anchorHeight !== void 0) {
|
|
1917
|
+
const arrivedAfterStart = (tx) => !tx.status.confirmed || tx.status.block_height === void 0 || tx.status.block_height > anchorHeight;
|
|
1918
|
+
for (const tx of currentTxs) {
|
|
1919
|
+
if (!arrivedAfterStart(tx)) seen.add(txKey2(tx));
|
|
1920
|
+
}
|
|
1921
|
+
baselined = true;
|
|
1922
|
+
report(currentTxs);
|
|
1923
|
+
} else {
|
|
1924
|
+
console.warn(
|
|
1925
|
+
`Esplora address watch established its baseline late for ${addresses.length} address(es); deposits arriving before now may not have been reported`
|
|
1926
|
+
);
|
|
1927
|
+
for (const tx of currentTxs) seen.add(txKey2(tx));
|
|
1928
|
+
baselined = true;
|
|
1769
1929
|
}
|
|
1930
|
+
failures = 0;
|
|
1770
1931
|
} catch (error) {
|
|
1771
|
-
|
|
1932
|
+
failures = Math.min(failures + 1, MAX_POLL_BACKOFF_EXPONENT);
|
|
1933
|
+
console.error("Error polling watched addresses:", error);
|
|
1772
1934
|
}
|
|
1773
|
-
|
|
1935
|
+
schedule();
|
|
1936
|
+
};
|
|
1937
|
+
await baseline;
|
|
1938
|
+
if (!isCurrentLoop()) return;
|
|
1939
|
+
await tick();
|
|
1774
1940
|
};
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
if (
|
|
1778
|
-
|
|
1941
|
+
const stopPolling = () => {
|
|
1942
|
+
pollSession++;
|
|
1943
|
+
if (timer) {
|
|
1944
|
+
clearTimeout(timer);
|
|
1945
|
+
timer = null;
|
|
1946
|
+
}
|
|
1947
|
+
pollStarted = false;
|
|
1779
1948
|
};
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1949
|
+
const handleSocketFailure = () => {
|
|
1950
|
+
if (stopped) return Promise.resolve();
|
|
1951
|
+
scheduleReconnect();
|
|
1952
|
+
return startPolling();
|
|
1953
|
+
};
|
|
1954
|
+
const scheduleReconnect = () => {
|
|
1955
|
+
if (stopped || reconnectTimer !== null) return;
|
|
1956
|
+
const delay = RECONNECT_BASE_DELAY_MS * 2 ** Math.min(reconnectFailures, MAX_RECONNECT_BACKOFF_EXPONENT);
|
|
1957
|
+
reconnectFailures++;
|
|
1958
|
+
reconnectTimer = setTimeout(() => {
|
|
1959
|
+
reconnectTimer = null;
|
|
1960
|
+
connect();
|
|
1961
|
+
}, delay);
|
|
1962
|
+
};
|
|
1963
|
+
const connect = () => {
|
|
1964
|
+
if (stopped) return Promise.resolve();
|
|
1965
|
+
const previous = ws;
|
|
1966
|
+
ws = null;
|
|
1967
|
+
if (previous) {
|
|
1968
|
+
try {
|
|
1969
|
+
previous.close();
|
|
1970
|
+
} catch {
|
|
1971
|
+
}
|
|
1972
|
+
}
|
|
1973
|
+
let socket;
|
|
1974
|
+
try {
|
|
1975
|
+
socket = new WebSocket(wsUrl);
|
|
1976
|
+
} catch {
|
|
1977
|
+
return handleSocketFailure();
|
|
1978
|
+
}
|
|
1979
|
+
ws = socket;
|
|
1980
|
+
const isCurrent = () => !stopped && ws === socket;
|
|
1981
|
+
socket.addEventListener("open", () => {
|
|
1982
|
+
if (!isCurrent()) return;
|
|
1983
|
+
reconnectFailures = 0;
|
|
1787
1984
|
const subscribeMsg = {
|
|
1788
1985
|
"track-addresses": addresses
|
|
1789
1986
|
};
|
|
1790
|
-
|
|
1987
|
+
socket.send(JSON.stringify(subscribeMsg));
|
|
1988
|
+
stopPolling();
|
|
1791
1989
|
});
|
|
1792
|
-
|
|
1990
|
+
socket.addEventListener("message", (event) => {
|
|
1991
|
+
if (!isCurrent()) return;
|
|
1793
1992
|
try {
|
|
1794
1993
|
const newTxs = [];
|
|
1795
1994
|
const message = JSON.parse(event.data.toString());
|
|
@@ -1801,22 +2000,45 @@ var EsploraProvider = class {
|
|
|
1801
2000
|
newTxs.push(...aux[address][type].filter(isExplorerTransaction));
|
|
1802
2001
|
}
|
|
1803
2002
|
}
|
|
1804
|
-
|
|
2003
|
+
report(newTxs);
|
|
1805
2004
|
} catch (error) {
|
|
1806
2005
|
console.error("Failed to process WebSocket message:", error);
|
|
1807
2006
|
}
|
|
1808
2007
|
});
|
|
1809
|
-
|
|
1810
|
-
|
|
2008
|
+
socket.addEventListener("error", () => {
|
|
2009
|
+
if (isCurrent()) void handleSocketFailure();
|
|
1811
2010
|
});
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
2011
|
+
socket.addEventListener("close", () => {
|
|
2012
|
+
if (isCurrent()) void handleSocketFailure();
|
|
2013
|
+
});
|
|
2014
|
+
return Promise.resolve();
|
|
2015
|
+
};
|
|
2016
|
+
const teardown = () => {
|
|
2017
|
+
if (stopped) return;
|
|
2018
|
+
stopped = true;
|
|
2019
|
+
onTeardown();
|
|
2020
|
+
if (timer) {
|
|
2021
|
+
clearTimeout(timer);
|
|
2022
|
+
timer = null;
|
|
2023
|
+
}
|
|
2024
|
+
if (reconnectTimer !== null) {
|
|
2025
|
+
clearTimeout(reconnectTimer);
|
|
2026
|
+
reconnectTimer = null;
|
|
2027
|
+
}
|
|
2028
|
+
if (ws) {
|
|
2029
|
+
try {
|
|
2030
|
+
ws.close();
|
|
2031
|
+
} catch {
|
|
2032
|
+
}
|
|
2033
|
+
ws = null;
|
|
2034
|
+
}
|
|
2035
|
+
subscribers.clear();
|
|
2036
|
+
};
|
|
2037
|
+
const started = this.forcePolling ? startPolling() : connect().then(() => baseline);
|
|
2038
|
+
return { subscribers, teardown, started };
|
|
1817
2039
|
}
|
|
1818
2040
|
async getChainTip() {
|
|
1819
|
-
const tipBlocks = await
|
|
2041
|
+
const tipBlocks = await chunkJZWLXNHV_cjs.baseFetch(`${this.baseUrl}/blocks`);
|
|
1820
2042
|
if (!tipBlocks.ok) {
|
|
1821
2043
|
throw new Error(`Failed to get chain tip: ${tipBlocks.statusText}`);
|
|
1822
2044
|
}
|
|
@@ -1830,12 +2052,14 @@ var EsploraProvider = class {
|
|
|
1830
2052
|
const hash = tip[0].id;
|
|
1831
2053
|
return {
|
|
1832
2054
|
height: tip[0].height,
|
|
2055
|
+
// `mediantime`, never `timestamp`: the latter is the header's own
|
|
2056
|
+
// `nTime`, and this field is specified as MTP.
|
|
1833
2057
|
time: tip[0].mediantime,
|
|
1834
2058
|
hash
|
|
1835
2059
|
};
|
|
1836
2060
|
}
|
|
1837
2061
|
async broadcastPackage(parent, child) {
|
|
1838
|
-
const response = await
|
|
2062
|
+
const response = await chunkJZWLXNHV_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
|
|
1839
2063
|
method: "POST",
|
|
1840
2064
|
headers: {
|
|
1841
2065
|
"Content-Type": "application/json"
|
|
@@ -1851,7 +2075,7 @@ var EsploraProvider = class {
|
|
|
1851
2075
|
return result;
|
|
1852
2076
|
}
|
|
1853
2077
|
async broadcastTx(tx) {
|
|
1854
|
-
const response = await
|
|
2078
|
+
const response = await chunkJZWLXNHV_cjs.baseFetch(`${this.baseUrl}/tx`, {
|
|
1855
2079
|
method: "POST",
|
|
1856
2080
|
headers: {
|
|
1857
2081
|
"Content-Type": "text/plain"
|
|
@@ -1895,6 +2119,9 @@ var isExplorerTransaction = (tx) => {
|
|
|
1895
2119
|
(vout) => typeof vout.scriptpubkey_address === "string" && typeof vout.value === "number"
|
|
1896
2120
|
) && typeof tx.status === "object" && typeof tx.status.confirmed === "boolean";
|
|
1897
2121
|
};
|
|
2122
|
+
var MAX_POLL_BACKOFF_EXPONENT = 4;
|
|
2123
|
+
var RECONNECT_BASE_DELAY_MS = 1e3;
|
|
2124
|
+
var MAX_RECONNECT_BACKOFF_EXPONENT = 5;
|
|
1898
2125
|
var getVarIntSize = (n) => {
|
|
1899
2126
|
if (n < 253) return 1;
|
|
1900
2127
|
if (n <= 65535) return 3;
|
|
@@ -2031,7 +2258,7 @@ function findP2AOutput(tx) {
|
|
|
2031
2258
|
var CHILD_DUST_AMOUNT = 546;
|
|
2032
2259
|
function buildAnchorChild(params) {
|
|
2033
2260
|
const { parent, feeRate, fundingCoins, changeAddress, tapInternalKey, network } = params;
|
|
2034
|
-
const child = new
|
|
2261
|
+
const child = new chunkJZWLXNHV_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
|
|
2035
2262
|
child.addInput(findP2AOutput(parent));
|
|
2036
2263
|
const estimator = TxWeightEstimator.create().addP2AInput();
|
|
2037
2264
|
for (const _ of fundingCoins) {
|
|
@@ -2079,7 +2306,7 @@ function buildForfeitTx(inputs, forfeitPkScript, txLocktime) {
|
|
|
2079
2306
|
);
|
|
2080
2307
|
}
|
|
2081
2308
|
function buildForfeitTxWithOutput(inputs, output, txLocktime) {
|
|
2082
|
-
const tx = new
|
|
2309
|
+
const tx = new chunkJZWLXNHV_cjs.Transaction({
|
|
2083
2310
|
version: 3,
|
|
2084
2311
|
lockTime: txLocktime
|
|
2085
2312
|
});
|
|
@@ -2155,7 +2382,7 @@ function validateVtxoTxGraph(graph, roundTransaction, sweepTapTreeRoot) {
|
|
|
2155
2382
|
if (previousScriptKey.length !== 32) {
|
|
2156
2383
|
throw new Error(`parent output ${childIndex} has invalid script`);
|
|
2157
2384
|
}
|
|
2158
|
-
const cosigners =
|
|
2385
|
+
const cosigners = chunkJZWLXNHV_cjs.getArkPsbtFields(child.root, 0, chunkJZWLXNHV_cjs.CosignerPublicKey);
|
|
2159
2386
|
if (cosigners.length === 0) {
|
|
2160
2387
|
throw ErrMissingCosignersPublicKeys;
|
|
2161
2388
|
}
|
|
@@ -2213,7 +2440,7 @@ var EmulatorPacket = class _EmulatorPacket {
|
|
|
2213
2440
|
return new _EmulatorPacket(entries);
|
|
2214
2441
|
}
|
|
2215
2442
|
static fromBytes(data) {
|
|
2216
|
-
const reader = new
|
|
2443
|
+
const reader = new chunkNVZJSKZS_cjs.BufferReader(data);
|
|
2217
2444
|
const entryCount = reader.readCompactSize();
|
|
2218
2445
|
const entries = [];
|
|
2219
2446
|
for (let i = 0; i < entryCount; i++) {
|
|
@@ -2231,7 +2458,7 @@ var EmulatorPacket = class _EmulatorPacket {
|
|
|
2231
2458
|
return _EmulatorPacket.PACKET_TYPE;
|
|
2232
2459
|
}
|
|
2233
2460
|
serialize() {
|
|
2234
|
-
const writer = new
|
|
2461
|
+
const writer = new chunkNVZJSKZS_cjs.BufferWriter();
|
|
2235
2462
|
writer.writeCompactSize(this.entries.length);
|
|
2236
2463
|
for (const entry of this.entries) {
|
|
2237
2464
|
writer.writeUint16LE(entry.vin);
|
|
@@ -2318,7 +2545,7 @@ var Extension = class _Extension {
|
|
|
2318
2545
|
`expected magic prefix ${base.hex.encode(ARKADE_MAGIC)}, got ${base.hex.encode(payload.slice(0, Math.min(payload.length, ARKADE_MAGIC.length)))}`
|
|
2319
2546
|
);
|
|
2320
2547
|
}
|
|
2321
|
-
const reader = new
|
|
2548
|
+
const reader = new chunkNVZJSKZS_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
|
|
2322
2549
|
const packets = [];
|
|
2323
2550
|
while (reader.remaining() > 0) {
|
|
2324
2551
|
const packetType = reader.readByte();
|
|
@@ -2392,7 +2619,7 @@ var Extension = class _Extension {
|
|
|
2392
2619
|
*/
|
|
2393
2620
|
getAssetPacket() {
|
|
2394
2621
|
for (const p of this.packets) {
|
|
2395
|
-
if (p instanceof
|
|
2622
|
+
if (p instanceof chunkNVZJSKZS_cjs.Packet) {
|
|
2396
2623
|
return p;
|
|
2397
2624
|
}
|
|
2398
2625
|
}
|
|
@@ -2430,8 +2657,8 @@ var Extension = class _Extension {
|
|
|
2430
2657
|
};
|
|
2431
2658
|
function parsePacket(packetType, data) {
|
|
2432
2659
|
switch (packetType) {
|
|
2433
|
-
case
|
|
2434
|
-
return
|
|
2660
|
+
case chunkNVZJSKZS_cjs.Packet.PACKET_TYPE:
|
|
2661
|
+
return chunkNVZJSKZS_cjs.Packet.fromBytes(data);
|
|
2435
2662
|
case EmulatorPacket.PACKET_TYPE:
|
|
2436
2663
|
return EmulatorPacket.fromBytes(data);
|
|
2437
2664
|
default:
|
|
@@ -2478,16 +2705,16 @@ function buildOpReturnScript(data) {
|
|
|
2478
2705
|
}
|
|
2479
2706
|
return script;
|
|
2480
2707
|
}
|
|
2481
|
-
var ErrOffchainOutputNotFound = (address) => new
|
|
2482
|
-
var ErrInvalidAssetOutputAmount = (got, want, assetId) => new
|
|
2708
|
+
var ErrOffchainOutputNotFound = (address) => new chunkJZWLXNHV_cjs.ServerResponseMismatchError(`offchain send output not found: ${address}`);
|
|
2709
|
+
var ErrInvalidAssetOutputAmount = (got, want, assetId) => new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
2483
2710
|
`invalid asset output amount for ${assetId}: got ${got}, want ${want}`
|
|
2484
2711
|
);
|
|
2485
|
-
var ErrAssetGroupNotFound = (assetId) => new
|
|
2486
|
-
var ErrAssetOutputNotFound = (assetId, outputIndex) => new
|
|
2712
|
+
var ErrAssetGroupNotFound = (assetId) => new chunkJZWLXNHV_cjs.ServerResponseMismatchError(`asset group not found in batch leaf: ${assetId}`);
|
|
2713
|
+
var ErrAssetOutputNotFound = (assetId, outputIndex) => new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
2487
2714
|
`asset output not found in asset group ${assetId} at index ${outputIndex}`
|
|
2488
2715
|
);
|
|
2489
|
-
var ErrOnchainOutputNotFound = (address) => new
|
|
2490
|
-
var ErrUnvalidatedOffchainOutput = (address) => new
|
|
2716
|
+
var ErrOnchainOutputNotFound = (address) => new chunkJZWLXNHV_cjs.ServerResponseMismatchError(`onchain output not found: ${address}`);
|
|
2717
|
+
var ErrUnvalidatedOffchainOutput = (address) => new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
2491
2718
|
`offchain output ${address} cannot be validated: virtual output tree signing did not run`
|
|
2492
2719
|
);
|
|
2493
2720
|
var ErrInvalidOnchainOutputAmount = (address) => new Error(`invalid onchain output amount: ${address}`);
|
|
@@ -2496,7 +2723,7 @@ var ErrInvalidOffchainOutputAmount = (address) => new Error(`invalid offchain ou
|
|
|
2496
2723
|
function assertFinalCommitmentMatchesValidated(finalCommitmentTx, validatedCommitmentTxid, context) {
|
|
2497
2724
|
if (!validatedCommitmentTxid) return;
|
|
2498
2725
|
if (finalCommitmentTx.id === validatedCommitmentTxid) return;
|
|
2499
|
-
throw new
|
|
2726
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
2500
2727
|
`${context}: finalization commitment tx ${finalCommitmentTx.id} differs from the validated commitment tx ${validatedCommitmentTxid}`
|
|
2501
2728
|
);
|
|
2502
2729
|
}
|
|
@@ -2506,7 +2733,7 @@ function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, netwo
|
|
|
2506
2733
|
for (const recipient of recipients) {
|
|
2507
2734
|
let arkAddress;
|
|
2508
2735
|
try {
|
|
2509
|
-
arkAddress =
|
|
2736
|
+
arkAddress = chunkJZWLXNHV_cjs.ArkAddress.decode(recipient.address);
|
|
2510
2737
|
} catch {
|
|
2511
2738
|
validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
|
|
2512
2739
|
continue;
|
|
@@ -2518,7 +2745,7 @@ function validateBatchRecipientsWithoutTree(commitmentTx, recipients, network) {
|
|
|
2518
2745
|
const usedOnchainOutputs = /* @__PURE__ */ new Set();
|
|
2519
2746
|
for (const recipient of recipients) {
|
|
2520
2747
|
try {
|
|
2521
|
-
|
|
2748
|
+
chunkJZWLXNHV_cjs.ArkAddress.decode(recipient.address);
|
|
2522
2749
|
} catch {
|
|
2523
2750
|
validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
|
|
2524
2751
|
continue;
|
|
@@ -2751,7 +2978,7 @@ function assetMintResolver() {
|
|
|
2751
2978
|
if (!tx.assets?.length || !tx.key.arkTxid) return void 0;
|
|
2752
2979
|
const minted = tx.assets.filter((a) => {
|
|
2753
2980
|
try {
|
|
2754
|
-
return base.hex.encode(
|
|
2981
|
+
return base.hex.encode(chunkNVZJSKZS_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
|
|
2755
2982
|
} catch {
|
|
2756
2983
|
return false;
|
|
2757
2984
|
}
|
|
@@ -2794,7 +3021,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2794
3021
|
const existing = inputsByAssetId.get(asset.assetId);
|
|
2795
3022
|
inputsByAssetId.set(asset.assetId, [
|
|
2796
3023
|
...existing ?? [],
|
|
2797
|
-
|
|
3024
|
+
chunkNVZJSKZS_cjs.AssetInput.create(inputIndex, asset.amount)
|
|
2798
3025
|
]);
|
|
2799
3026
|
}
|
|
2800
3027
|
}
|
|
@@ -2806,7 +3033,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2806
3033
|
const existing = outputsByAssetId.get(asset.assetId);
|
|
2807
3034
|
outputsByAssetId.set(asset.assetId, [
|
|
2808
3035
|
...existing ?? [],
|
|
2809
|
-
|
|
3036
|
+
chunkNVZJSKZS_cjs.AssetOutput.create(outputIndex, asset.amount)
|
|
2810
3037
|
]);
|
|
2811
3038
|
}
|
|
2812
3039
|
}
|
|
@@ -2817,7 +3044,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2817
3044
|
const existing = outputsByAssetId.get(asset.assetId);
|
|
2818
3045
|
outputsByAssetId.set(asset.assetId, [
|
|
2819
3046
|
...existing ?? [],
|
|
2820
|
-
|
|
3047
|
+
chunkNVZJSKZS_cjs.AssetOutput.create(outputIndex, asset.amount)
|
|
2821
3048
|
]);
|
|
2822
3049
|
}
|
|
2823
3050
|
}
|
|
@@ -2826,11 +3053,11 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2826
3053
|
for (const assetIdStr of allAssetIds) {
|
|
2827
3054
|
const inputs = inputsByAssetId.get(assetIdStr);
|
|
2828
3055
|
const outputs = outputsByAssetId.get(assetIdStr);
|
|
2829
|
-
const assetId =
|
|
2830
|
-
const group =
|
|
3056
|
+
const assetId = chunkNVZJSKZS_cjs.AssetId.fromString(assetIdStr);
|
|
3057
|
+
const group = chunkNVZJSKZS_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
|
|
2831
3058
|
groups.push(group);
|
|
2832
3059
|
}
|
|
2833
|
-
return
|
|
3060
|
+
return chunkNVZJSKZS_cjs.Packet.create(groups);
|
|
2834
3061
|
}
|
|
2835
3062
|
function selectCoinsWithAsset(coins, assetId, requiredAmount) {
|
|
2836
3063
|
const coinsWithAsset = coins.filter((coin) => coin.assets?.some((a) => a.assetId === assetId));
|
|
@@ -2867,7 +3094,7 @@ function selectedCoinsToAssetInputs(selectedCoins) {
|
|
|
2867
3094
|
}
|
|
2868
3095
|
function toXOnlySignerHex(pubkeyHex) {
|
|
2869
3096
|
const bytes = base.hex.decode(pubkeyHex);
|
|
2870
|
-
if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(
|
|
3097
|
+
if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(chunk43FKNLX4_cjs.toXOnly(bytes, "signer key"));
|
|
2871
3098
|
throw new Error(`invalid signer pubkey length: expected 32 or 33 bytes, got ${bytes.length}`);
|
|
2872
3099
|
}
|
|
2873
3100
|
function signerSetFromInfo(info) {
|
|
@@ -2914,13 +3141,13 @@ var toTimelock = (value) => ({
|
|
|
2914
3141
|
var toSeconds = (t) => t.type === "seconds" ? t.value : t.value * NOMINAL_BLOCK_SECONDS;
|
|
2915
3142
|
function assertTimelockInPolicy(timelock, policy, label, overrideOption) {
|
|
2916
3143
|
if (policy.requireSeconds && timelock.type === "blocks") {
|
|
2917
|
-
throw new
|
|
3144
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
2918
3145
|
`${label} rejected: block-typed timelocks are not accepted (got ${timelock.value})`
|
|
2919
3146
|
);
|
|
2920
3147
|
}
|
|
2921
3148
|
const seconds = toSeconds(timelock);
|
|
2922
3149
|
if (seconds < policy.minSeconds) {
|
|
2923
|
-
throw new
|
|
3150
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
2924
3151
|
`${label} rejected: ${timelock.value} ${timelock.type} is below the ${policy.minSeconds}s floor; pass ${overrideOption}: ${seconds}n to Wallet.create to lower it`
|
|
2925
3152
|
);
|
|
2926
3153
|
}
|
|
@@ -2941,7 +3168,7 @@ function resolveBatchExpiryPolicy(network, overrides) {
|
|
|
2941
3168
|
}
|
|
2942
3169
|
function assertValidBatchExpiry(batchExpiry, policy) {
|
|
2943
3170
|
if (policy.advertisedVtxoTreeExpiry !== void 0 && batchExpiry !== policy.advertisedVtxoTreeExpiry) {
|
|
2944
|
-
throw new
|
|
3171
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
2945
3172
|
`batch expiry rejected: ${batchExpiry} does not match the advertised vtxoTreeExpiry ${policy.advertisedVtxoTreeExpiry}`
|
|
2946
3173
|
);
|
|
2947
3174
|
}
|
|
@@ -2971,21 +3198,21 @@ function resolveCheckpointExitDelayPolicy(network, overrides) {
|
|
|
2971
3198
|
function assertValidServerUnrollScript(checkpointTapscript, policy) {
|
|
2972
3199
|
let script;
|
|
2973
3200
|
try {
|
|
2974
|
-
script =
|
|
3201
|
+
script = chunkJZWLXNHV_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
|
|
2975
3202
|
} catch (e) {
|
|
2976
|
-
throw new
|
|
3203
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
2977
3204
|
`checkpoint exit delay rejected: invalid checkpointTapscript from server (${e instanceof Error ? e.message : String(e)})`
|
|
2978
3205
|
);
|
|
2979
3206
|
}
|
|
2980
3207
|
if (policy.advertisedForfeitPubkey !== void 0) {
|
|
2981
3208
|
const { pubkeys } = script.params;
|
|
2982
3209
|
if (pubkeys.length !== 1) {
|
|
2983
|
-
throw new
|
|
3210
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
2984
3211
|
`checkpoint exit delay rejected: checkpointTapscript must commit to exactly one pubkey, got ${pubkeys.length} [${pubkeys.map(base.hex.encode).join(", ")}]`
|
|
2985
3212
|
);
|
|
2986
3213
|
}
|
|
2987
3214
|
if (!utils_js.equalBytes(pubkeys[0], policy.advertisedForfeitPubkey)) {
|
|
2988
|
-
throw new
|
|
3215
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
2989
3216
|
`checkpoint exit delay rejected: checkpointTapscript pubkey ${base.hex.encode(pubkeys[0])} does not match the advertised forfeitPubkey ${base.hex.encode(policy.advertisedForfeitPubkey)}`
|
|
2990
3217
|
);
|
|
2991
3218
|
}
|
|
@@ -3029,8 +3256,8 @@ function buildOffchainTx(inputs, outputs, serverUnrollScript) {
|
|
|
3029
3256
|
function buildVirtualTx(inputs, outputs) {
|
|
3030
3257
|
let lockTime = 0n;
|
|
3031
3258
|
for (const input of inputs) {
|
|
3032
|
-
const tapscript =
|
|
3033
|
-
if (
|
|
3259
|
+
const tapscript = chunkJZWLXNHV_cjs.decodeTapscript(chunkJZWLXNHV_cjs.scriptFromTapLeafScript(input.tapLeafScript));
|
|
3260
|
+
if (chunkJZWLXNHV_cjs.CLTVMultisigTapscript.is(tapscript)) {
|
|
3034
3261
|
if (lockTime !== 0n) {
|
|
3035
3262
|
if (isSeconds(lockTime) !== isSeconds(tapscript.params.absoluteTimelock)) {
|
|
3036
3263
|
throw new Error("cannot mix seconds and blocks locktime");
|
|
@@ -3041,7 +3268,7 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3041
3268
|
}
|
|
3042
3269
|
}
|
|
3043
3270
|
}
|
|
3044
|
-
const tx = new
|
|
3271
|
+
const tx = new chunkJZWLXNHV_cjs.Transaction({
|
|
3045
3272
|
version: 3,
|
|
3046
3273
|
lockTime: Number(lockTime)
|
|
3047
3274
|
});
|
|
@@ -3051,12 +3278,12 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3051
3278
|
index: input.vout,
|
|
3052
3279
|
sequence: lockTime ? btcSigner.DEFAULT_SEQUENCE - 1 : void 0,
|
|
3053
3280
|
witnessUtxo: {
|
|
3054
|
-
script:
|
|
3281
|
+
script: chunkJZWLXNHV_cjs.VtxoScript.decode(input.tapTree).pkScript,
|
|
3055
3282
|
amount: BigInt(input.value)
|
|
3056
3283
|
},
|
|
3057
3284
|
tapLeafScript: [input.tapLeafScript]
|
|
3058
3285
|
});
|
|
3059
|
-
|
|
3286
|
+
chunkJZWLXNHV_cjs.setArkPsbtField(tx, i, chunkJZWLXNHV_cjs.VtxoTaprootTree, input.tapTree);
|
|
3060
3287
|
}
|
|
3061
3288
|
for (const output of outputs) {
|
|
3062
3289
|
tx.addOutput(output);
|
|
@@ -3065,8 +3292,8 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3065
3292
|
return tx;
|
|
3066
3293
|
}
|
|
3067
3294
|
function buildCheckpointTx(vtxo, serverUnrollScript) {
|
|
3068
|
-
const collaborativeClosure =
|
|
3069
|
-
const checkpointVtxoScript = new
|
|
3295
|
+
const collaborativeClosure = chunkJZWLXNHV_cjs.decodeTapscript(chunkJZWLXNHV_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
|
|
3296
|
+
const checkpointVtxoScript = new chunkJZWLXNHV_cjs.VtxoScript([
|
|
3070
3297
|
serverUnrollScript.script,
|
|
3071
3298
|
collaborativeClosure.script
|
|
3072
3299
|
]);
|
|
@@ -3142,7 +3369,7 @@ function verifyTapscriptSignatures(tx, inputIndex, requiredSigners, excludePubke
|
|
|
3142
3369
|
const sighashType = signature.length === 65 ? signature[64] : btcSigner.SigHash.DEFAULT;
|
|
3143
3370
|
const sig = signature.subarray(0, 64);
|
|
3144
3371
|
if (!allowedSighashTypes.includes(sighashType)) {
|
|
3145
|
-
const sighashName =
|
|
3372
|
+
const sighashName = chunkJZWLXNHV_cjs.formatSighash(sighashType);
|
|
3146
3373
|
throw new Error(
|
|
3147
3374
|
`Unallowed sighash type ${sighashName} for input ${inputIndex}, pubkey ${pubKeyHex}.`
|
|
3148
3375
|
);
|
|
@@ -3216,7 +3443,7 @@ function combineTapscriptSigs(signedTx, originalTx) {
|
|
|
3216
3443
|
}
|
|
3217
3444
|
function isValidArkAddress(address) {
|
|
3218
3445
|
try {
|
|
3219
|
-
|
|
3446
|
+
chunkJZWLXNHV_cjs.ArkAddress.decode(address);
|
|
3220
3447
|
return true;
|
|
3221
3448
|
} catch (e) {
|
|
3222
3449
|
return false;
|
|
@@ -3224,16 +3451,16 @@ function isValidArkAddress(address) {
|
|
|
3224
3451
|
}
|
|
3225
3452
|
function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, context) {
|
|
3226
3453
|
if (serverCheckpointTxs.length !== expectedCheckpoints.length) {
|
|
3227
|
-
throw new
|
|
3454
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
3228
3455
|
`${context} returned ${serverCheckpointTxs.length} checkpoints, expected ${expectedCheckpoints.length}`
|
|
3229
3456
|
);
|
|
3230
3457
|
}
|
|
3231
3458
|
const byTxid = new Map(expectedCheckpoints.map((c) => [c.id, c]));
|
|
3232
3459
|
return serverCheckpointTxs.map((encoded, index) => {
|
|
3233
|
-
const server =
|
|
3460
|
+
const server = chunkJZWLXNHV_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
|
|
3234
3461
|
const local = byTxid.get(server.id);
|
|
3235
3462
|
if (!local) {
|
|
3236
|
-
throw new
|
|
3463
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
3237
3464
|
`${context} checkpoint ${index} txid ${server.id} does not match any submitted checkpoint`
|
|
3238
3465
|
);
|
|
3239
3466
|
}
|
|
@@ -3243,14 +3470,14 @@ function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, contex
|
|
|
3243
3470
|
}
|
|
3244
3471
|
function assertSubmittedArkTxid(response, signedArkTx, context) {
|
|
3245
3472
|
if (response.arkTxid !== signedArkTx.id) {
|
|
3246
|
-
throw new
|
|
3473
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
3247
3474
|
`${context} returned ark txid ${response.arkTxid}, expected ${signedArkTx.id}`
|
|
3248
3475
|
);
|
|
3249
3476
|
}
|
|
3250
3477
|
if (response.finalArkTx === void 0) return;
|
|
3251
|
-
const finalTxid =
|
|
3478
|
+
const finalTxid = chunkJZWLXNHV_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
|
|
3252
3479
|
if (finalTxid !== signedArkTx.id) {
|
|
3253
|
-
throw new
|
|
3480
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
3254
3481
|
`${context} returned final ark tx ${finalTxid}, expected ${signedArkTx.id}`
|
|
3255
3482
|
);
|
|
3256
3483
|
}
|
|
@@ -3269,10 +3496,10 @@ function assertServerSignedLeaf(serverTx, localTx, inputIndex, serverPubkeyHex,
|
|
|
3269
3496
|
[serverPubkeyHex],
|
|
3270
3497
|
void 0,
|
|
3271
3498
|
void 0,
|
|
3272
|
-
payment_js.tapLeafHash(
|
|
3499
|
+
payment_js.tapLeafHash(chunkJZWLXNHV_cjs.scriptFromTapLeafScript(leaf))
|
|
3273
3500
|
);
|
|
3274
3501
|
} catch (error) {
|
|
3275
|
-
throw new
|
|
3502
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
3276
3503
|
`${context}: input ${inputIndex} is not signed by the server on the leaf being spent (${error instanceof Error ? error.message : String(error)})`
|
|
3277
3504
|
);
|
|
3278
3505
|
}
|
|
@@ -3281,20 +3508,20 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
|
|
|
3281
3508
|
const byOutpoint = new Map(inputs.map((input) => [`${input.txid}:${input.vout}`, input]));
|
|
3282
3509
|
for (const [index, checkpoint] of checkpoints.entries()) {
|
|
3283
3510
|
if (checkpoint.inputsLength !== 1) {
|
|
3284
|
-
throw new
|
|
3511
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
3285
3512
|
`${context}: checkpoint ${index} spends ${checkpoint.inputsLength} inputs, expected 1`
|
|
3286
3513
|
);
|
|
3287
3514
|
}
|
|
3288
3515
|
const spent = checkpoint.getInput(0);
|
|
3289
3516
|
if (!spent.txid || spent.index === void 0) {
|
|
3290
|
-
throw new
|
|
3517
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
3291
3518
|
`${context}: checkpoint ${index} has no input outpoint`
|
|
3292
3519
|
);
|
|
3293
3520
|
}
|
|
3294
3521
|
const outpoint = `${base.hex.encode(spent.txid)}:${spent.index}`;
|
|
3295
3522
|
const input = byOutpoint.get(outpoint);
|
|
3296
3523
|
if (!input) {
|
|
3297
|
-
throw new
|
|
3524
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
3298
3525
|
`${context}: checkpoint ${index} spends ${outpoint}, which is not one of the requested virtual outputs`
|
|
3299
3526
|
);
|
|
3300
3527
|
}
|
|
@@ -3302,7 +3529,7 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
|
|
|
3302
3529
|
(unroll) => buildCheckpointTx(input, unroll).tx.id === checkpoint.id
|
|
3303
3530
|
);
|
|
3304
3531
|
if (!rebuilt) {
|
|
3305
|
-
throw new
|
|
3532
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
3306
3533
|
`${context}: checkpoint ${index} txid ${checkpoint.id} differs from the checkpoint built locally for ${outpoint}`
|
|
3307
3534
|
);
|
|
3308
3535
|
}
|
|
@@ -3328,9 +3555,9 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
|
|
|
3328
3555
|
const matched = matchServerCheckpoints(signedCheckpointTxs, offchainTx.checkpoints, "submitTx");
|
|
3329
3556
|
matched.forEach(({ server }, index) => {
|
|
3330
3557
|
try {
|
|
3331
|
-
|
|
3558
|
+
chunkJZWLXNHV_cjs.assertAllowedSighashTypes(server);
|
|
3332
3559
|
} catch (error) {
|
|
3333
|
-
throw new
|
|
3560
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
3334
3561
|
`submitTx checkpoint ${index}: ${error instanceof Error ? error.message : String(error)}`
|
|
3335
3562
|
);
|
|
3336
3563
|
}
|
|
@@ -3338,12 +3565,12 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
|
|
|
3338
3565
|
const verify = options?.verifyServerSignatures;
|
|
3339
3566
|
if (verify) {
|
|
3340
3567
|
if (response.finalArkTx === void 0) {
|
|
3341
|
-
throw new
|
|
3568
|
+
throw new chunkJZWLXNHV_cjs.ServerResponseMismatchError(
|
|
3342
3569
|
"submitTx: server returned no final ark tx to verify its signatures against"
|
|
3343
3570
|
);
|
|
3344
3571
|
}
|
|
3345
|
-
const finalArkTx =
|
|
3346
|
-
const serverPubkeyHex = base.hex.encode(
|
|
3572
|
+
const finalArkTx = chunkJZWLXNHV_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx));
|
|
3573
|
+
const serverPubkeyHex = base.hex.encode(chunk43FKNLX4_cjs.toXOnly(verify.serverPubkey, "server key"));
|
|
3347
3574
|
for (let i = 0; i < offchainTx.arkTx.inputsLength; i++) {
|
|
3348
3575
|
assertServerSignedLeaf(
|
|
3349
3576
|
finalArkTx,
|
|
@@ -3399,12 +3626,12 @@ function claimWithPreimageIdentity(identity, preimage) {
|
|
|
3399
3626
|
return {
|
|
3400
3627
|
...identity,
|
|
3401
3628
|
sign: async (tx, inputIndexes) => {
|
|
3402
|
-
const signed =
|
|
3629
|
+
const signed = chunkJZWLXNHV_cjs.Transaction.fromPSBT(
|
|
3403
3630
|
(await identity.sign(tx.clone(), inputIndexes)).toPSBT()
|
|
3404
3631
|
);
|
|
3405
3632
|
const indexes = inputIndexes ?? Array.from({ length: signed.inputsLength }, (_, i) => i);
|
|
3406
3633
|
for (const index of indexes) {
|
|
3407
|
-
|
|
3634
|
+
chunkJZWLXNHV_cjs.setArkPsbtField(signed, index, chunkJZWLXNHV_cjs.ConditionWitness, [preimage]);
|
|
3408
3635
|
}
|
|
3409
3636
|
return signed;
|
|
3410
3637
|
}
|
|
@@ -3596,7 +3823,7 @@ function extendCoinWithTapscript(boardingTapscript, utxo) {
|
|
|
3596
3823
|
};
|
|
3597
3824
|
}
|
|
3598
3825
|
function deriveContractTapscripts(contract) {
|
|
3599
|
-
const handler =
|
|
3826
|
+
const handler = chunk43FKNLX4_cjs.contractHandlers.get(contract.type);
|
|
3600
3827
|
if (!handler) {
|
|
3601
3828
|
throw new Error(`No handler for contract type '${contract.type}'`);
|
|
3602
3829
|
}
|
|
@@ -3667,7 +3894,7 @@ function getRandomId() {
|
|
|
3667
3894
|
}
|
|
3668
3895
|
function isValidArkAddress2(address) {
|
|
3669
3896
|
try {
|
|
3670
|
-
|
|
3897
|
+
chunkJZWLXNHV_cjs.ArkAddress.decode(address);
|
|
3671
3898
|
return true;
|
|
3672
3899
|
} catch (e) {
|
|
3673
3900
|
return false;
|
|
@@ -3695,7 +3922,7 @@ function assertRecipientArkadeAddress(encoded, address, context) {
|
|
|
3695
3922
|
function assertTapTreeDerivesAddress(encoded, tapTree, address) {
|
|
3696
3923
|
let derived;
|
|
3697
3924
|
try {
|
|
3698
|
-
derived =
|
|
3925
|
+
derived = chunkJZWLXNHV_cjs.VtxoScript.decode(tapTree).pkScript;
|
|
3699
3926
|
} catch (e) {
|
|
3700
3927
|
throw new Error(
|
|
3701
3928
|
`Invalid tapTree for ${encoded}: ${e instanceof Error ? e.message : String(e)}`
|
|
@@ -3712,7 +3939,7 @@ function validateRecipients(recipients, dustAmount, context) {
|
|
|
3712
3939
|
for (const recipient of recipients) {
|
|
3713
3940
|
let address;
|
|
3714
3941
|
try {
|
|
3715
|
-
address =
|
|
3942
|
+
address = chunkJZWLXNHV_cjs.ArkAddress.decode(recipient.address);
|
|
3716
3943
|
} catch (e) {
|
|
3717
3944
|
throw new Error(`Invalid Arkade address: ${recipient.address}`);
|
|
3718
3945
|
}
|
|
@@ -3737,7 +3964,7 @@ function validateRecipients(recipients, dustAmount, context) {
|
|
|
3737
3964
|
|
|
3738
3965
|
// src/contracts/spendability.ts
|
|
3739
3966
|
function isContractGenericallySpendable(contract) {
|
|
3740
|
-
return
|
|
3967
|
+
return chunk43FKNLX4_cjs.contractHandlers.get(contract.type)?.isGenericallySpendable?.(contract) === true;
|
|
3741
3968
|
}
|
|
3742
3969
|
function gatedContracts(contracts) {
|
|
3743
3970
|
const gated = /* @__PURE__ */ new Map();
|
|
@@ -3750,7 +3977,7 @@ function gateExclusion(gated) {
|
|
|
3750
3977
|
return (vtxo) => {
|
|
3751
3978
|
const type = vtxo.script === void 0 ? void 0 : gated.get(vtxo.script);
|
|
3752
3979
|
if (type === void 0) return void 0;
|
|
3753
|
-
if (!
|
|
3980
|
+
if (!chunk43FKNLX4_cjs.contractHandlers.has(type)) {
|
|
3754
3981
|
return `at ${vtxo.script} (contract type '${type}') has no handler registered in this build`;
|
|
3755
3982
|
}
|
|
3756
3983
|
return `at ${vtxo.script} (contract type '${type}') is not generically spendable`;
|
|
@@ -3786,7 +4013,7 @@ function selectPendingRecoveryOutpoints(contractsWithVtxos, signerSet, nowSecond
|
|
|
3786
4013
|
continue;
|
|
3787
4014
|
}
|
|
3788
4015
|
for (const v of vtxos) {
|
|
3789
|
-
if (!
|
|
4016
|
+
if (!chunkJZWLXNHV_cjs.hasTerminalSpend(v) && !v.isSwept && !v.isUnrolled) {
|
|
3790
4017
|
out.add(`${v.txid}:${v.vout}`);
|
|
3791
4018
|
}
|
|
3792
4019
|
}
|
|
@@ -3821,10 +4048,10 @@ function byValueDescending(vtxos) {
|
|
|
3821
4048
|
return [...vtxos].sort((a, b) => b.value - a.value);
|
|
3822
4049
|
}
|
|
3823
4050
|
async function fetchTimeHeight(wallet) {
|
|
3824
|
-
return
|
|
4051
|
+
return chunkJZWLXNHV_cjs.resolveTimeHeight(wallet.onchainProvider);
|
|
3825
4052
|
}
|
|
3826
4053
|
function canMigrateBySend(vtxo, now) {
|
|
3827
|
-
if (!
|
|
4054
|
+
if (!chunkJZWLXNHV_cjs.canSpendOffchain(vtxo, now)) return false;
|
|
3828
4055
|
return vtxo.expiresAt !== void 0 || vtxo.expiresAtHeight !== void 0;
|
|
3829
4056
|
}
|
|
3830
4057
|
function byExpiryAscending(vtxos, now) {
|
|
@@ -3832,7 +4059,7 @@ function byExpiryAscending(vtxos, now) {
|
|
|
3832
4059
|
if (vtxo.isSwept) return -Infinity;
|
|
3833
4060
|
if (vtxo.expiresAt !== void 0) return vtxo.expiresAt.getTime();
|
|
3834
4061
|
if (vtxo.expiresAtHeight !== void 0) {
|
|
3835
|
-
return
|
|
4062
|
+
return chunkJZWLXNHV_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
|
|
3836
4063
|
}
|
|
3837
4064
|
return Infinity;
|
|
3838
4065
|
};
|
|
@@ -3859,7 +4086,7 @@ function priceSettlementInputs(vtxos, estimator) {
|
|
|
3859
4086
|
const payable = [];
|
|
3860
4087
|
const net = /* @__PURE__ */ new Map();
|
|
3861
4088
|
for (const vtxo of vtxos) {
|
|
3862
|
-
const inputFee = estimator.evalOffchainInput(
|
|
4089
|
+
const inputFee = estimator.evalOffchainInput(chunkJZWLXNHV_cjs.toOffchainInputFeeParams(vtxo));
|
|
3863
4090
|
if (inputFee.satoshis >= vtxo.value) {
|
|
3864
4091
|
continue;
|
|
3865
4092
|
}
|
|
@@ -3885,7 +4112,7 @@ function deductOffchainOutputFee(subtotal, estimator, arkAddress) {
|
|
|
3885
4112
|
}
|
|
3886
4113
|
const outputFee = estimator.evalOffchainOutput({
|
|
3887
4114
|
amount: subtotal,
|
|
3888
|
-
script: base.hex.encode(
|
|
4115
|
+
script: base.hex.encode(chunkJZWLXNHV_cjs.ArkAddress.decode(arkAddress).pkScript)
|
|
3889
4116
|
});
|
|
3890
4117
|
return subtotal - BigInt(outputFee.satoshis);
|
|
3891
4118
|
}
|
|
@@ -3903,10 +4130,10 @@ var DEFAULT_SETTLEMENT_CONFIG = {
|
|
|
3903
4130
|
};
|
|
3904
4131
|
function getRecoverableVtxos(vtxos, dustAmount, now) {
|
|
3905
4132
|
return vtxos.filter((vtxo) => {
|
|
3906
|
-
if (
|
|
4133
|
+
if (chunkJZWLXNHV_cjs.canRecoverOnchain(vtxo, now)) {
|
|
3907
4134
|
return true;
|
|
3908
4135
|
}
|
|
3909
|
-
if (
|
|
4136
|
+
if (chunkJZWLXNHV_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
|
|
3910
4137
|
return true;
|
|
3911
4138
|
}
|
|
3912
4139
|
return false;
|
|
@@ -3938,7 +4165,7 @@ function getRecoverableWithSubdust(vtxos, dustAmount, now) {
|
|
|
3938
4165
|
function isVtxoExpiringSoon(vtxo, thresholdMs) {
|
|
3939
4166
|
if (vtxo.isUnrolled) return false;
|
|
3940
4167
|
const realThresholdMs = thresholdMs <= 100 ? DEFAULT_THRESHOLD_MS : thresholdMs;
|
|
3941
|
-
const expiresAt =
|
|
4168
|
+
const expiresAt = chunkJZWLXNHV_cjs.normalizeVtxo(vtxo).expiresAt;
|
|
3942
4169
|
if (expiresAt === void 0) return false;
|
|
3943
4170
|
const now = Date.now();
|
|
3944
4171
|
const batchExpiry = expiresAt.getTime();
|
|
@@ -3949,7 +4176,7 @@ function getExpiringAndRecoverableVtxos(vtxos, thresholdMs, dustAmount, now) {
|
|
|
3949
4176
|
return vtxos.filter(
|
|
3950
4177
|
// The leading exclusion covers the `isSubdust` arm too, which is a value
|
|
3951
4178
|
// property and would otherwise re-admit an exited coin on its own.
|
|
3952
|
-
(vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) ||
|
|
4179
|
+
(vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) || chunkJZWLXNHV_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount))
|
|
3953
4180
|
);
|
|
3954
4181
|
}
|
|
3955
4182
|
function isMigrationCapable(wallet) {
|
|
@@ -4548,11 +4775,11 @@ var VtxoManager = class _VtxoManager {
|
|
|
4548
4775
|
`Sweep not economical: output ${outputAmount} sats after ${fee} sats fee is below dust (${dustAmount} sats)`
|
|
4549
4776
|
);
|
|
4550
4777
|
}
|
|
4551
|
-
const tx = new
|
|
4778
|
+
const tx = new chunkJZWLXNHV_cjs.Transaction();
|
|
4552
4779
|
for (const utxo of expiredUtxos) {
|
|
4553
|
-
const utxoScript =
|
|
4780
|
+
const utxoScript = chunkJZWLXNHV_cjs.VtxoScript.decode(utxo.tapTree);
|
|
4554
4781
|
const utxoExitLeaf = utxoScript.leaves.find(
|
|
4555
|
-
(leaf) =>
|
|
4782
|
+
(leaf) => chunkJZWLXNHV_cjs.CSVMultisigTapscript.isScriptValid(chunkJZWLXNHV_cjs.scriptFromTapLeafScript(leaf)) === true
|
|
4556
4783
|
);
|
|
4557
4784
|
if (!utxoExitLeaf) {
|
|
4558
4785
|
throw new Error(
|
|
@@ -4567,7 +4794,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
4567
4794
|
amount: BigInt(utxo.value)
|
|
4568
4795
|
},
|
|
4569
4796
|
tapLeafScript: [utxoExitLeaf],
|
|
4570
|
-
sequence:
|
|
4797
|
+
sequence: chunkJZWLXNHV_cjs.getSequence(utxoExitLeaf)
|
|
4571
4798
|
});
|
|
4572
4799
|
}
|
|
4573
4800
|
tx.addOutputAddress(boardingAddress, outputAmount, this.getNetwork());
|
|
@@ -4810,8 +5037,8 @@ var VtxoManager = class _VtxoManager {
|
|
|
4810
5037
|
const cls = classifyAgainstSignerSet(serverPubKey, signerSet, nowSeconds);
|
|
4811
5038
|
if (cls.status === "CURRENT") continue;
|
|
4812
5039
|
const live = vtxos.filter((v) => !v.isUnrolled);
|
|
4813
|
-
const recoverable = live.filter((v) => v.isSwept && !
|
|
4814
|
-
const spendable = live.filter((v) => !
|
|
5040
|
+
const recoverable = live.filter((v) => v.isSwept && !chunkJZWLXNHV_cjs.hasTerminalSpend(v));
|
|
5041
|
+
const spendable = live.filter((v) => !chunkJZWLXNHV_cjs.hasTerminalSpend(v) && !v.isSwept);
|
|
4815
5042
|
const value = spendable.reduce((sum, v) => sum + v.value, 0);
|
|
4816
5043
|
let recoverableCount = 0;
|
|
4817
5044
|
let recoverableValue = 0;
|
|
@@ -4824,7 +5051,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
4824
5051
|
awaitingSweepCount = spendable.length;
|
|
4825
5052
|
awaitingSweepValue = value;
|
|
4826
5053
|
for (const v of spendable) {
|
|
4827
|
-
const exp =
|
|
5054
|
+
const exp = chunkJZWLXNHV_cjs.toBatchExpiry(v);
|
|
4828
5055
|
if (exp !== void 0 && (nextSweepEta === void 0 || exp < nextSweepEta)) {
|
|
4829
5056
|
nextSweepEta = exp;
|
|
4830
5057
|
}
|
|
@@ -5085,7 +5312,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5085
5312
|
/** Decodes the boarding tapscript exit path to extract the CSV timelock. */
|
|
5086
5313
|
getBoardingTimelock() {
|
|
5087
5314
|
const wallet = this.getSweepWallet();
|
|
5088
|
-
const exitScript =
|
|
5315
|
+
const exitScript = chunkJZWLXNHV_cjs.CSVMultisigTapscript.decode(
|
|
5089
5316
|
base.hex.decode(wallet.boardingTapscript.exitScript)
|
|
5090
5317
|
);
|
|
5091
5318
|
return exitScript.params.timelock;
|
|
@@ -5216,8 +5443,8 @@ var VtxoManager = class _VtxoManager {
|
|
|
5216
5443
|
* or doesn't carry the metadata.
|
|
5217
5444
|
*/
|
|
5218
5445
|
extractSpentOutpoint(error) {
|
|
5219
|
-
const ark =
|
|
5220
|
-
if (!
|
|
5446
|
+
const ark = chunkJZWLXNHV_cjs.maybeArkError(error);
|
|
5447
|
+
if (!chunkJZWLXNHV_cjs.isArkError(ark, chunkJZWLXNHV_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
|
|
5221
5448
|
const raw = ark.metadata?.vtxo_outpoint;
|
|
5222
5449
|
if (typeof raw !== "string") return void 0;
|
|
5223
5450
|
const [txid, voutStr] = raw.split(":");
|
|
@@ -5407,7 +5634,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5407
5634
|
if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
|
|
5408
5635
|
break;
|
|
5409
5636
|
}
|
|
5410
|
-
const inputFee = estimator.evalOffchainInput(
|
|
5637
|
+
const inputFee = estimator.evalOffchainInput(chunkJZWLXNHV_cjs.toOffchainInputFeeParams(v));
|
|
5411
5638
|
if (inputFee.satoshis >= v.value) {
|
|
5412
5639
|
continue;
|
|
5413
5640
|
}
|
|
@@ -5427,7 +5654,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5427
5654
|
const arkAddress = await this.wallet.getAddress();
|
|
5428
5655
|
const outputFee = estimator.evalOffchainOutput({
|
|
5429
5656
|
amount: totalAmount,
|
|
5430
|
-
script: base.hex.encode(
|
|
5657
|
+
script: base.hex.encode(chunkJZWLXNHV_cjs.ArkAddress.decode(arkAddress).pkScript)
|
|
5431
5658
|
});
|
|
5432
5659
|
totalAmount -= BigInt(outputFee.satoshis);
|
|
5433
5660
|
if (totalAmount < dustAmount) return;
|
|
@@ -5507,7 +5734,7 @@ var ArkNote = class _ArkNote {
|
|
|
5507
5734
|
this.value = value;
|
|
5508
5735
|
this.HRP = HRP;
|
|
5509
5736
|
const preimageHash = utils_js.sha256(this.preimage);
|
|
5510
|
-
this.vtxoScript = new
|
|
5737
|
+
this.vtxoScript = new chunkJZWLXNHV_cjs.VtxoScript([noteTapscript(preimageHash)]);
|
|
5511
5738
|
const leaf = this.vtxoScript.leaves[0];
|
|
5512
5739
|
this.txid = base.hex.encode(new Uint8Array(preimageHash).reverse());
|
|
5513
5740
|
this.tapTree = this.vtxoScript.encode();
|
|
@@ -5674,7 +5901,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
5674
5901
|
const privateKey = data.slice(1, 33);
|
|
5675
5902
|
const serverPubKey = data.slice(33, 65);
|
|
5676
5903
|
const sequence = new DataView(data.buffer, data.byteOffset + 65, 4).getUint32(0, false);
|
|
5677
|
-
const csvTimelock =
|
|
5904
|
+
const csvTimelock = chunkJZWLXNHV_cjs.sequenceToTimelock(sequence);
|
|
5678
5905
|
return new _ArkadeCash(privateKey, serverPubKey, csvTimelock, decoded.prefix);
|
|
5679
5906
|
}
|
|
5680
5907
|
toString() {
|
|
@@ -5682,7 +5909,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
5682
5909
|
data[0] = _ArkadeCash.Version;
|
|
5683
5910
|
data.set(this._privateKey, 1);
|
|
5684
5911
|
data.set(this._serverPubKey, 33);
|
|
5685
|
-
const sequence =
|
|
5912
|
+
const sequence = chunkJZWLXNHV_cjs.timelockToSequence(this.csvTimelock);
|
|
5686
5913
|
new DataView(data.buffer, data.byteOffset + 65, 4).setUint32(0, sequence, false);
|
|
5687
5914
|
const words = base.bech32m.toWords(data);
|
|
5688
5915
|
return base.bech32m.encode(this.hrp, words, 1023);
|
|
@@ -5691,7 +5918,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
5691
5918
|
return SingleKey.fromPrivateKey(this._privateKey);
|
|
5692
5919
|
}
|
|
5693
5920
|
get vtxoScript() {
|
|
5694
|
-
return new
|
|
5921
|
+
return new chunk43FKNLX4_cjs.DefaultVtxo.Script({
|
|
5695
5922
|
pubKey: this._publicKey,
|
|
5696
5923
|
serverPubKey: this._serverPubKey,
|
|
5697
5924
|
csvTimelock: this.csvTimelock
|
|
@@ -5952,7 +6179,7 @@ async function captureExitBranch(params) {
|
|
|
5952
6179
|
const nonCommitment = ordered.filter((c) => chainTxTypeToChainedExit(c.type) !== 1 /* Commitment */).map((c) => c.txid);
|
|
5953
6180
|
if (nonCommitment.length > 0) {
|
|
5954
6181
|
for (const psbt of await resolver.getVirtualTxs(nonCommitment)) {
|
|
5955
|
-
psbtByTxid.set(
|
|
6182
|
+
psbtByTxid.set(chunkJZWLXNHV_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
5956
6183
|
}
|
|
5957
6184
|
}
|
|
5958
6185
|
}
|
|
@@ -5995,10 +6222,10 @@ var IndexerExitDataSource = class {
|
|
|
5995
6222
|
while (hasMore) {
|
|
5996
6223
|
const { chain: page, page: meta } = await this.indexer.getVtxoChain(
|
|
5997
6224
|
{ txid: vtxo.txid, vout: vtxo.vout },
|
|
5998
|
-
{ pageIndex, pageSize:
|
|
6225
|
+
{ pageIndex, pageSize: chunkJZWLXNHV_cjs.DEFAULT_PAGE_SIZE }
|
|
5999
6226
|
);
|
|
6000
6227
|
chain.push(...page);
|
|
6001
|
-
hasMore = meta ? page.length ===
|
|
6228
|
+
hasMore = meta ? page.length === chunkJZWLXNHV_cjs.DEFAULT_PAGE_SIZE : false;
|
|
6002
6229
|
pageIndex++;
|
|
6003
6230
|
}
|
|
6004
6231
|
return chain;
|
|
@@ -6010,12 +6237,12 @@ var IndexerExitDataSource = class {
|
|
|
6010
6237
|
while (hasMore) {
|
|
6011
6238
|
const { txs, page } = await this.indexer.getVirtualTxs(txids, {
|
|
6012
6239
|
pageIndex,
|
|
6013
|
-
pageSize:
|
|
6240
|
+
pageSize: chunkJZWLXNHV_cjs.DEFAULT_PAGE_SIZE
|
|
6014
6241
|
});
|
|
6015
6242
|
for (const psbt of txs) {
|
|
6016
|
-
out.set(
|
|
6243
|
+
out.set(chunkJZWLXNHV_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
6017
6244
|
}
|
|
6018
|
-
hasMore = page ? txs.length ===
|
|
6245
|
+
hasMore = page ? txs.length === chunkJZWLXNHV_cjs.DEFAULT_PAGE_SIZE : false;
|
|
6019
6246
|
pageIndex++;
|
|
6020
6247
|
}
|
|
6021
6248
|
return out;
|
|
@@ -6036,7 +6263,7 @@ function chainedTxTypeToChainTxType(t) {
|
|
|
6036
6263
|
}
|
|
6037
6264
|
}
|
|
6038
6265
|
function psbtInputTxids(psbtBase64) {
|
|
6039
|
-
const tx =
|
|
6266
|
+
const tx = chunkJZWLXNHV_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
|
|
6040
6267
|
const ids = [];
|
|
6041
6268
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
6042
6269
|
const txid = tx.getInput(i).txid;
|
|
@@ -6395,10 +6622,10 @@ async function resolveArkInfo(arkProvider, walletRepository, opts) {
|
|
|
6395
6622
|
try {
|
|
6396
6623
|
info = await arkProvider.getInfo();
|
|
6397
6624
|
} catch (err) {
|
|
6398
|
-
if (opts?.requireLive || !
|
|
6625
|
+
if (opts?.requireLive || !chunkJZWLXNHV_cjs.isRetryableProviderError(err)) throw err;
|
|
6399
6626
|
const snapshot = await loadArkInfoSnapshot(walletRepository);
|
|
6400
6627
|
if (!snapshot) {
|
|
6401
|
-
throw new
|
|
6628
|
+
throw new chunkJZWLXNHV_cjs.ProviderUnavailableError(
|
|
6402
6629
|
"Arkade server info is unavailable and no cached snapshot exists",
|
|
6403
6630
|
{ cause: err }
|
|
6404
6631
|
);
|
|
@@ -6788,7 +7015,7 @@ function collectArkTxidsNeedingCreatedAt(vtxos) {
|
|
|
6788
7015
|
return [...txids];
|
|
6789
7016
|
}
|
|
6790
7017
|
async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnore, resolveTxCreatedAt) {
|
|
6791
|
-
const fromOldestVtxo = vtxos.map(
|
|
7018
|
+
const fromOldestVtxo = vtxos.map(chunkJZWLXNHV_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
|
|
6792
7019
|
const txidsNeedingCreatedAt = resolveTxCreatedAt ? collectArkTxidsNeedingCreatedAt(fromOldestVtxo) : [];
|
|
6793
7020
|
const resolvedCreatedAt = resolveTxCreatedAt && txidsNeedingCreatedAt.length > 0 ? await resolveTxCreatedAt(txidsNeedingCreatedAt) : /* @__PURE__ */ new Map();
|
|
6794
7021
|
const unmatchedSettledBoardingTxs = allBoardingTxs.filter(isSettledBoardingReceive).sort((a, b) => a.createdAt - b.createdAt);
|
|
@@ -6952,7 +7179,7 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
6952
7179
|
const virtualCoins = await this.wallet.getSpendableVtxos({
|
|
6953
7180
|
withRecoverable: false
|
|
6954
7181
|
});
|
|
6955
|
-
const controlAssetRef = params.controlAssetId ?
|
|
7182
|
+
const controlAssetRef = params.controlAssetId ? chunkNVZJSKZS_cjs.AssetRef.fromId(chunkNVZJSKZS_cjs.AssetId.fromString(params.controlAssetId)) : null;
|
|
6956
7183
|
const coinSelection = selectVirtualCoins(virtualCoins, Number(this.wallet.dustAmount));
|
|
6957
7184
|
let totalBtcSelected = 0n;
|
|
6958
7185
|
const assetChanges = /* @__PURE__ */ new Map();
|
|
@@ -6965,8 +7192,8 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
6965
7192
|
}
|
|
6966
7193
|
}
|
|
6967
7194
|
const groups = [];
|
|
6968
|
-
const issuedAssetOutput =
|
|
6969
|
-
const issuedAssetGroup =
|
|
7195
|
+
const issuedAssetOutput = chunkNVZJSKZS_cjs.AssetOutput.create(0, params.amount);
|
|
7196
|
+
const issuedAssetGroup = chunkNVZJSKZS_cjs.AssetGroup.create(
|
|
6970
7197
|
null,
|
|
6971
7198
|
controlAssetRef,
|
|
6972
7199
|
[],
|
|
@@ -6981,28 +7208,28 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
6981
7208
|
for (const [inputIndex, assets] of assetInputs) {
|
|
6982
7209
|
for (const asset of assets) {
|
|
6983
7210
|
if (asset.assetId !== assetId) continue;
|
|
6984
|
-
changeInputs.push(
|
|
7211
|
+
changeInputs.push(chunkNVZJSKZS_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
6985
7212
|
}
|
|
6986
7213
|
}
|
|
6987
7214
|
groups.push(
|
|
6988
|
-
|
|
6989
|
-
|
|
7215
|
+
chunkNVZJSKZS_cjs.AssetGroup.create(
|
|
7216
|
+
chunkNVZJSKZS_cjs.AssetId.fromString(assetId),
|
|
6990
7217
|
null,
|
|
6991
7218
|
changeInputs,
|
|
6992
|
-
[
|
|
7219
|
+
[chunkNVZJSKZS_cjs.AssetOutput.create(0, amount)],
|
|
6993
7220
|
[]
|
|
6994
7221
|
)
|
|
6995
7222
|
);
|
|
6996
7223
|
}
|
|
6997
7224
|
}
|
|
6998
7225
|
const address = await this.wallet.getAddress();
|
|
6999
|
-
const outputAddress =
|
|
7226
|
+
const outputAddress = chunkJZWLXNHV_cjs.ArkAddress.decode(address);
|
|
7000
7227
|
const outputs = [
|
|
7001
7228
|
{
|
|
7002
7229
|
script: outputAddress.pkScript,
|
|
7003
7230
|
amount: BigInt(totalBtcSelected)
|
|
7004
7231
|
},
|
|
7005
|
-
Extension.create([
|
|
7232
|
+
Extension.create([chunkNVZJSKZS_cjs.Packet.create(groups)]).txOut()
|
|
7006
7233
|
];
|
|
7007
7234
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(
|
|
7008
7235
|
coinSelection.inputs,
|
|
@@ -7010,7 +7237,7 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7010
7237
|
);
|
|
7011
7238
|
return {
|
|
7012
7239
|
arkTxId: arkTxid,
|
|
7013
|
-
assetId:
|
|
7240
|
+
assetId: chunkNVZJSKZS_cjs.AssetId.create(arkTxid, 0).toString()
|
|
7014
7241
|
};
|
|
7015
7242
|
}
|
|
7016
7243
|
/**
|
|
@@ -7082,16 +7309,16 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7082
7309
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7083
7310
|
for (const asset of assets) {
|
|
7084
7311
|
if (asset.assetId !== params.assetId) continue;
|
|
7085
|
-
reissueInputs.push(
|
|
7312
|
+
reissueInputs.push(chunkNVZJSKZS_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7086
7313
|
}
|
|
7087
7314
|
}
|
|
7088
7315
|
const totalAssetAmount = assetToReissueAmount + params.amount;
|
|
7089
|
-
const reissueAssetIdObj =
|
|
7090
|
-
const reissueAssetGroup =
|
|
7316
|
+
const reissueAssetIdObj = chunkNVZJSKZS_cjs.AssetId.fromString(params.assetId);
|
|
7317
|
+
const reissueAssetGroup = chunkNVZJSKZS_cjs.AssetGroup.create(
|
|
7091
7318
|
reissueAssetIdObj,
|
|
7092
7319
|
null,
|
|
7093
7320
|
reissueInputs,
|
|
7094
|
-
[
|
|
7321
|
+
[chunkNVZJSKZS_cjs.AssetOutput.create(0, totalAssetAmount)],
|
|
7095
7322
|
[]
|
|
7096
7323
|
);
|
|
7097
7324
|
const groups = [reissueAssetGroup];
|
|
@@ -7100,27 +7327,27 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7100
7327
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7101
7328
|
for (const asset of assets) {
|
|
7102
7329
|
if (asset.assetId !== assetId) continue;
|
|
7103
|
-
changeInputs.push(
|
|
7330
|
+
changeInputs.push(chunkNVZJSKZS_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7104
7331
|
}
|
|
7105
7332
|
}
|
|
7106
7333
|
groups.push(
|
|
7107
|
-
|
|
7108
|
-
|
|
7334
|
+
chunkNVZJSKZS_cjs.AssetGroup.create(
|
|
7335
|
+
chunkNVZJSKZS_cjs.AssetId.fromString(assetId),
|
|
7109
7336
|
null,
|
|
7110
7337
|
changeInputs,
|
|
7111
|
-
[
|
|
7338
|
+
[chunkNVZJSKZS_cjs.AssetOutput.create(0, amount)],
|
|
7112
7339
|
[]
|
|
7113
7340
|
)
|
|
7114
7341
|
);
|
|
7115
7342
|
}
|
|
7116
7343
|
const address = await this.wallet.getAddress();
|
|
7117
|
-
const outputAddress =
|
|
7344
|
+
const outputAddress = chunkJZWLXNHV_cjs.ArkAddress.decode(address);
|
|
7118
7345
|
const outputs = [
|
|
7119
7346
|
{
|
|
7120
7347
|
script: outputAddress.pkScript,
|
|
7121
7348
|
amount: BigInt(totalBtcSelected)
|
|
7122
7349
|
},
|
|
7123
|
-
Extension.create([
|
|
7350
|
+
Extension.create([chunkNVZJSKZS_cjs.Packet.create(groups)]).txOut()
|
|
7124
7351
|
];
|
|
7125
7352
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
|
|
7126
7353
|
return arkTxid;
|
|
@@ -7187,27 +7414,27 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7187
7414
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7188
7415
|
for (const asset of assets) {
|
|
7189
7416
|
if (asset.assetId !== assetId) continue;
|
|
7190
|
-
changeInputs.push(
|
|
7417
|
+
changeInputs.push(chunkNVZJSKZS_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7191
7418
|
}
|
|
7192
7419
|
}
|
|
7193
7420
|
groups.push(
|
|
7194
|
-
|
|
7195
|
-
|
|
7421
|
+
chunkNVZJSKZS_cjs.AssetGroup.create(
|
|
7422
|
+
chunkNVZJSKZS_cjs.AssetId.fromString(assetId),
|
|
7196
7423
|
null,
|
|
7197
7424
|
changeInputs,
|
|
7198
|
-
amount > 0n ? [
|
|
7425
|
+
amount > 0n ? [chunkNVZJSKZS_cjs.AssetOutput.create(0, amount)] : [],
|
|
7199
7426
|
[]
|
|
7200
7427
|
)
|
|
7201
7428
|
);
|
|
7202
7429
|
}
|
|
7203
7430
|
const address = await this.wallet.getAddress();
|
|
7204
|
-
const outputAddress =
|
|
7431
|
+
const outputAddress = chunkJZWLXNHV_cjs.ArkAddress.decode(address);
|
|
7205
7432
|
const outputs = [
|
|
7206
7433
|
{
|
|
7207
7434
|
script: outputAddress.pkScript,
|
|
7208
7435
|
amount: BigInt(totalBtcSelected)
|
|
7209
7436
|
},
|
|
7210
|
-
Extension.create([
|
|
7437
|
+
Extension.create([chunkNVZJSKZS_cjs.Packet.create(groups)]).txOut()
|
|
7211
7438
|
];
|
|
7212
7439
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
|
|
7213
7440
|
return arkTxid;
|
|
@@ -7232,7 +7459,7 @@ function castMetadata(metadata) {
|
|
|
7232
7459
|
} else {
|
|
7233
7460
|
throw new Error("Invalid metadata value type");
|
|
7234
7461
|
}
|
|
7235
|
-
md.push(
|
|
7462
|
+
md.push(chunkNVZJSKZS_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
|
|
7236
7463
|
}
|
|
7237
7464
|
return md;
|
|
7238
7465
|
}
|
|
@@ -7253,10 +7480,10 @@ var DelegateManagerImpl = class {
|
|
|
7253
7480
|
if (vtxos.length === 0) {
|
|
7254
7481
|
return { delegated: [], failed: [] };
|
|
7255
7482
|
}
|
|
7256
|
-
const destinationScript =
|
|
7483
|
+
const destinationScript = chunkJZWLXNHV_cjs.ArkAddress.decode(destination).pkScript;
|
|
7257
7484
|
const arkInfo = await this.arkInfoProvider.getInfo();
|
|
7258
7485
|
const delegateInfo = await this.delegateProvider.getDelegateInfo();
|
|
7259
|
-
const eligible = vtxos.map(
|
|
7486
|
+
const eligible = vtxos.map(chunkJZWLXNHV_cjs.normalizeVtxo).filter(
|
|
7260
7487
|
(v) => isAnnotated(v) && findDelegateTapLeaf(v, delegateInfo.pubkey) !== void 0
|
|
7261
7488
|
);
|
|
7262
7489
|
if (eligible.length === 0) {
|
|
@@ -7285,11 +7512,11 @@ var DelegateManagerImpl = class {
|
|
|
7285
7512
|
const groupByExpiry = /* @__PURE__ */ new Map();
|
|
7286
7513
|
let recoverableVtxos = [];
|
|
7287
7514
|
for (const vtxo of eligible) {
|
|
7288
|
-
if (
|
|
7515
|
+
if (chunkJZWLXNHV_cjs.canRecoverOnchain(vtxo, now)) {
|
|
7289
7516
|
recoverableVtxos.push(vtxo);
|
|
7290
7517
|
continue;
|
|
7291
7518
|
}
|
|
7292
|
-
const expiry =
|
|
7519
|
+
const expiry = chunkJZWLXNHV_cjs.toBatchExpiry(vtxo);
|
|
7293
7520
|
if (!expiry) continue;
|
|
7294
7521
|
const dayKey = getDayTimestamp(expiry);
|
|
7295
7522
|
groupByExpiry.set(dayKey, [...groupByExpiry.get(dayKey) ?? [], vtxo]);
|
|
@@ -7354,7 +7581,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7354
7581
|
}
|
|
7355
7582
|
if (!delegateAt) {
|
|
7356
7583
|
const now = { timestamp: /* @__PURE__ */ new Date() };
|
|
7357
|
-
const expiryTimestamp = vtxos.filter((coin) => !
|
|
7584
|
+
const expiryTimestamp = vtxos.filter((coin) => !chunkJZWLXNHV_cjs.canRecoverOnchain(coin, now) && chunkJZWLXNHV_cjs.toBatchExpiry(coin)).reduce((min, coin) => Math.min(min, chunkJZWLXNHV_cjs.toBatchExpiry(coin)), Number.MAX_SAFE_INTEGER);
|
|
7358
7585
|
if (!expiryTimestamp || expiryTimestamp === Number.MAX_SAFE_INTEGER) {
|
|
7359
7586
|
delegateAt = new Date(Date.now() + 1 * 60 * 1e3);
|
|
7360
7587
|
} else {
|
|
@@ -7383,7 +7610,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7383
7610
|
let amount = 0n;
|
|
7384
7611
|
for (const coin of vtxos) {
|
|
7385
7612
|
const inputFee = estimator.evalOffchainInput({
|
|
7386
|
-
...
|
|
7613
|
+
...chunkJZWLXNHV_cjs.toOffchainInputFeeParams(coin),
|
|
7387
7614
|
type: "vtxo"
|
|
7388
7615
|
});
|
|
7389
7616
|
if (inputFee.value >= coin.value) {
|
|
@@ -7397,7 +7624,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7397
7624
|
const delegateFee = BigInt(Number(fee));
|
|
7398
7625
|
if (delegateFee > 0n) {
|
|
7399
7626
|
outputs.push({
|
|
7400
|
-
script:
|
|
7627
|
+
script: chunkJZWLXNHV_cjs.ArkAddress.decode(delegateAddress).pkScript,
|
|
7401
7628
|
amount: delegateFee
|
|
7402
7629
|
});
|
|
7403
7630
|
}
|
|
@@ -7430,10 +7657,10 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7430
7657
|
destinationScript
|
|
7431
7658
|
);
|
|
7432
7659
|
const forfeitOutputScript = btcSigner.OutScript.encode(
|
|
7433
|
-
btcSigner.Address(
|
|
7660
|
+
btcSigner.Address(chunkJZWLXNHV_cjs.getNetwork(network)).decode(forfeitAddress)
|
|
7434
7661
|
);
|
|
7435
7662
|
const forfeits = await Promise.all(
|
|
7436
|
-
vtxos.filter((v) => !
|
|
7663
|
+
vtxos.filter((v) => !chunkJZWLXNHV_cjs.canRecoverOnchain(v, { timestamp: /* @__PURE__ */ new Date() })).map(async (coin) => {
|
|
7437
7664
|
const forfeit = await makeDelegateForfeitTx(
|
|
7438
7665
|
coin,
|
|
7439
7666
|
dust,
|
|
@@ -7458,7 +7685,7 @@ async function makeDelegateForfeitTx(input, connectorAmount, delegatePubkey, for
|
|
|
7458
7685
|
index: input.vout,
|
|
7459
7686
|
witnessUtxo: {
|
|
7460
7687
|
amount: BigInt(input.value),
|
|
7461
|
-
script:
|
|
7688
|
+
script: chunkJZWLXNHV_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
7462
7689
|
},
|
|
7463
7690
|
sighashType: btcSigner.SigHash.ALL_ANYONECANPAY,
|
|
7464
7691
|
tapLeafScript: [delegateTapLeaf]
|
|
@@ -7516,7 +7743,7 @@ async function makeSignedDelegateIntent(identity, coins, outputs, onchainOutputs
|
|
|
7516
7743
|
expire_at: 0,
|
|
7517
7744
|
cosigners_public_keys: cosignerPubKeys
|
|
7518
7745
|
};
|
|
7519
|
-
const proof =
|
|
7746
|
+
const proof = chunkJZWLXNHV_cjs.Intent.create(message, coins, outputs);
|
|
7520
7747
|
const signedProof = await identity.sign(proof);
|
|
7521
7748
|
return {
|
|
7522
7749
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -7534,10 +7761,10 @@ function getDayTimestamp(timestamp) {
|
|
|
7534
7761
|
function findDelegateTapLeaf(vtxo, delegatePubkey) {
|
|
7535
7762
|
if (!vtxo.tapTree) return void 0;
|
|
7536
7763
|
const pk = delegatePubkey.length === 66 ? delegatePubkey.slice(2) : delegatePubkey;
|
|
7537
|
-
const vtxoScript =
|
|
7764
|
+
const vtxoScript = chunkJZWLXNHV_cjs.VtxoScript.decode(vtxo.tapTree);
|
|
7538
7765
|
return vtxoScript.leaves.find((tapLeaf) => {
|
|
7539
|
-
const arkTapscript =
|
|
7540
|
-
if (!
|
|
7766
|
+
const arkTapscript = chunkJZWLXNHV_cjs.decodeTapscript(chunkJZWLXNHV_cjs.scriptFromTapLeafScript(tapLeaf));
|
|
7767
|
+
if (!chunkJZWLXNHV_cjs.MultisigTapscript.is(arkTapscript)) return false;
|
|
7541
7768
|
return arkTapscript.params.pubkeys.map(base.hex.encode).includes(pk);
|
|
7542
7769
|
});
|
|
7543
7770
|
}
|
|
@@ -7818,7 +8045,7 @@ function createManagedConnection(dbName, version, initDatabase2) {
|
|
|
7818
8045
|
};
|
|
7819
8046
|
}
|
|
7820
8047
|
function scriptFromArkAddress(address) {
|
|
7821
|
-
return base.hex.encode(
|
|
8048
|
+
return base.hex.encode(chunkJZWLXNHV_cjs.ArkAddress.decode(address).pkScript);
|
|
7822
8049
|
}
|
|
7823
8050
|
|
|
7824
8051
|
// src/repositories/indexedDB/schema.ts
|
|
@@ -8313,7 +8540,7 @@ function validateVtxosForScript(vtxos, script, context) {
|
|
|
8313
8540
|
}
|
|
8314
8541
|
async function getVtxosForContract(repo, contract) {
|
|
8315
8542
|
const vtxos = repo.getVtxosForScript ? await repo.getVtxosForScript(contract.script) : filterVtxosForScript(await repo.getVtxos(contract.address), contract.script);
|
|
8316
|
-
return vtxos.map(
|
|
8543
|
+
return vtxos.map(chunkJZWLXNHV_cjs.normalizeVtxo);
|
|
8317
8544
|
}
|
|
8318
8545
|
async function saveVtxosForContract(repo, contract, vtxos) {
|
|
8319
8546
|
if (repo.saveVtxosForScript) {
|
|
@@ -8455,7 +8682,7 @@ function decodeArkContract(encoded) {
|
|
|
8455
8682
|
}
|
|
8456
8683
|
function contractFromArkContract(encoded, options = {}) {
|
|
8457
8684
|
const parsed = decodeArkContract(encoded);
|
|
8458
|
-
const handler =
|
|
8685
|
+
const handler = chunk43FKNLX4_cjs.contractHandlers.get(parsed.type);
|
|
8459
8686
|
if (!handler) {
|
|
8460
8687
|
throw new Error(`No handler registered for contract type '${parsed.type}'`);
|
|
8461
8688
|
}
|
|
@@ -8469,9 +8696,9 @@ function contractFromArkContract(encoded, options = {}) {
|
|
|
8469
8696
|
metadata: options.metadata
|
|
8470
8697
|
};
|
|
8471
8698
|
}
|
|
8472
|
-
function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix =
|
|
8699
|
+
function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunkJZWLXNHV_cjs.DEFAULT_NETWORK.hrp, options = {}) {
|
|
8473
8700
|
const parsed = decodeArkContract(encoded);
|
|
8474
|
-
const handler =
|
|
8701
|
+
const handler = chunk43FKNLX4_cjs.contractHandlers.getOrThrow(parsed.type);
|
|
8475
8702
|
const params = parsed.data;
|
|
8476
8703
|
const vtxoScript = handler.createScript(params);
|
|
8477
8704
|
return {
|
|
@@ -8725,9 +8952,9 @@ var ContractWatcher = class {
|
|
|
8725
8952
|
this.connectionState = "connected";
|
|
8726
8953
|
this.reconnectAttempts = 0;
|
|
8727
8954
|
this.listenLoop().catch((e) => {
|
|
8728
|
-
if (
|
|
8955
|
+
if (chunkJZWLXNHV_cjs.isEventSourceError(e)) {
|
|
8729
8956
|
console.debug("ContractWatcher subscription disconnected; reconnecting");
|
|
8730
|
-
} else if (!
|
|
8957
|
+
} else if (!chunkJZWLXNHV_cjs.isEventSourceUnavailableError(e)) {
|
|
8731
8958
|
console.error(e);
|
|
8732
8959
|
}
|
|
8733
8960
|
this.connectionState = "disconnected";
|
|
@@ -8739,7 +8966,7 @@ var ContractWatcher = class {
|
|
|
8739
8966
|
this.scheduleReconnect();
|
|
8740
8967
|
});
|
|
8741
8968
|
} catch (error) {
|
|
8742
|
-
if (!
|
|
8969
|
+
if (!chunkJZWLXNHV_cjs.isEventSourceUnavailableError(error)) {
|
|
8743
8970
|
console.error("ContractWatcher connection failed:", error);
|
|
8744
8971
|
}
|
|
8745
8972
|
this.connectionState = "disconnected";
|
|
@@ -8765,7 +8992,7 @@ var ContractWatcher = class {
|
|
|
8765
8992
|
* slower; what it loses is push latency.
|
|
8766
8993
|
*/
|
|
8767
8994
|
reportEventSourceUnavailable(error) {
|
|
8768
|
-
if (!
|
|
8995
|
+
if (!chunkJZWLXNHV_cjs.isEventSourceUnavailableError(error)) return false;
|
|
8769
8996
|
if (!this.eventSourceReported) {
|
|
8770
8997
|
this.eventSourceReported = true;
|
|
8771
8998
|
console.warn(
|
|
@@ -8981,14 +9208,14 @@ var ContractWatcher = class {
|
|
|
8981
9208
|
const timestamp = Date.now();
|
|
8982
9209
|
if (update.newVtxos?.length) {
|
|
8983
9210
|
this.processSubscriptionVtxos(
|
|
8984
|
-
update.newVtxos.map(
|
|
9211
|
+
update.newVtxos.map(chunkJZWLXNHV_cjs.normalizeVtxo),
|
|
8985
9212
|
"vtxo_received",
|
|
8986
9213
|
timestamp
|
|
8987
9214
|
);
|
|
8988
9215
|
}
|
|
8989
9216
|
if (update.spentVtxos?.length) {
|
|
8990
9217
|
this.processSubscriptionVtxos(
|
|
8991
|
-
update.spentVtxos.map(
|
|
9218
|
+
update.spentVtxos.map(chunkJZWLXNHV_cjs.normalizeVtxo),
|
|
8992
9219
|
"vtxo_spent",
|
|
8993
9220
|
timestamp
|
|
8994
9221
|
);
|
|
@@ -9083,7 +9310,7 @@ var NON_TERMINAL_INTENT_STATES = ALL_INTENT_STATES.filter(
|
|
|
9083
9310
|
(s) => !isTerminalIntentState(s)
|
|
9084
9311
|
);
|
|
9085
9312
|
function isConsumed(vtxo) {
|
|
9086
|
-
return vtxo !== void 0 &&
|
|
9313
|
+
return vtxo !== void 0 && chunkJZWLXNHV_cjs.hasTerminalSpend(vtxo);
|
|
9087
9314
|
}
|
|
9088
9315
|
async function classifyIntent(intent, vtxosByOutpoint, now) {
|
|
9089
9316
|
if (isTerminalIntentState(intent.state)) return void 0;
|
|
@@ -9126,7 +9353,7 @@ async function reconcileIntents(deps) {
|
|
|
9126
9353
|
let vtxosByOutpoint = /* @__PURE__ */ new Map();
|
|
9127
9354
|
if (outpoints.length > 0) {
|
|
9128
9355
|
try {
|
|
9129
|
-
const { vtxos } = await
|
|
9356
|
+
const { vtxos } = await chunkJZWLXNHV_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
|
|
9130
9357
|
vtxosByOutpoint = new Map(vtxos.map((v) => [outpointKey(v), v]));
|
|
9131
9358
|
} catch (e) {
|
|
9132
9359
|
console.error("reconcileIntents: failed to fetch input VTXO state", e);
|
|
@@ -9300,7 +9527,7 @@ var ContractManager = class _ContractManager {
|
|
|
9300
9527
|
await this.reconcileWatched();
|
|
9301
9528
|
this.markSyncOnline();
|
|
9302
9529
|
} catch (err) {
|
|
9303
|
-
if (!
|
|
9530
|
+
if (!chunkJZWLXNHV_cjs.isRetryableProviderError(err)) throw err;
|
|
9304
9531
|
this.markSyncDegraded(err);
|
|
9305
9532
|
}
|
|
9306
9533
|
this.initialized = true;
|
|
@@ -9432,7 +9659,7 @@ var ContractManager = class _ContractManager {
|
|
|
9432
9659
|
const from = Math.max(0, watermark - lookAhead.size);
|
|
9433
9660
|
const to = watermark + lookAhead.size;
|
|
9434
9661
|
const deps = lookAhead.candidateDeps();
|
|
9435
|
-
const handlers =
|
|
9662
|
+
const handlers = chunk43FKNLX4_cjs.contractHandlers.getRegisteredTypes().map((t) => chunk43FKNLX4_cjs.contractHandlers.get(t)).filter(hasCandidates);
|
|
9436
9663
|
const band = /* @__PURE__ */ new Map();
|
|
9437
9664
|
for (let index = from; index <= to; index++) {
|
|
9438
9665
|
const descriptor = lookAhead.materialize(index);
|
|
@@ -9443,7 +9670,7 @@ var ContractManager = class _ContractManager {
|
|
|
9443
9670
|
index,
|
|
9444
9671
|
params: {
|
|
9445
9672
|
...candidate,
|
|
9446
|
-
...
|
|
9673
|
+
...chunk43FKNLX4_cjs.speculativeReceiveMetadata(descriptor)
|
|
9447
9674
|
}
|
|
9448
9675
|
});
|
|
9449
9676
|
}
|
|
@@ -9505,7 +9732,7 @@ var ContractManager = class _ContractManager {
|
|
|
9505
9732
|
});
|
|
9506
9733
|
for (const entry of pending) entry.catchUpPending = false;
|
|
9507
9734
|
} catch (err) {
|
|
9508
|
-
if (!
|
|
9735
|
+
if (!chunkJZWLXNHV_cjs.isRetryableProviderError(err)) throw err;
|
|
9509
9736
|
this.markSyncDegraded(err);
|
|
9510
9737
|
}
|
|
9511
9738
|
}
|
|
@@ -9555,7 +9782,7 @@ var ContractManager = class _ContractManager {
|
|
|
9555
9782
|
await this.fetchContractVxosFromIndexer([contract]);
|
|
9556
9783
|
this.markSyncOnline();
|
|
9557
9784
|
} catch (err) {
|
|
9558
|
-
if (!
|
|
9785
|
+
if (!chunkJZWLXNHV_cjs.isRetryableProviderError(err)) throw err;
|
|
9559
9786
|
this.markSyncDegraded(err);
|
|
9560
9787
|
}
|
|
9561
9788
|
await this.watcher.addContract(contract);
|
|
@@ -9592,7 +9819,7 @@ var ContractManager = class _ContractManager {
|
|
|
9592
9819
|
return result;
|
|
9593
9820
|
}
|
|
9594
9821
|
async upsertContractRow(params) {
|
|
9595
|
-
const handler =
|
|
9822
|
+
const handler = chunk43FKNLX4_cjs.contractHandlers.get(params.type);
|
|
9596
9823
|
if (!handler) {
|
|
9597
9824
|
throw new Error(`No handler registered for contract type '${params.type}'`);
|
|
9598
9825
|
}
|
|
@@ -9692,7 +9919,7 @@ var ContractManager = class _ContractManager {
|
|
|
9692
9919
|
`scanContracts: batchSize must be a positive integer (got ${String(opts.batchSize)})`
|
|
9693
9920
|
);
|
|
9694
9921
|
}
|
|
9695
|
-
const registered =
|
|
9922
|
+
const registered = chunk43FKNLX4_cjs.contractHandlers.getRegisteredTypes().map((t) => chunk43FKNLX4_cjs.contractHandlers.get(t)).filter(isDiscoverable);
|
|
9696
9923
|
const discoverables = [
|
|
9697
9924
|
...registered.filter((h) => h.type === "boarding"),
|
|
9698
9925
|
...registered.filter((h) => h.type !== "boarding")
|
|
@@ -9827,7 +10054,7 @@ var ContractManager = class _ContractManager {
|
|
|
9827
10054
|
await this.syncContracts({ contracts, pageSize });
|
|
9828
10055
|
this.markSyncOnline();
|
|
9829
10056
|
} catch (err) {
|
|
9830
|
-
if (!
|
|
10057
|
+
if (!chunkJZWLXNHV_cjs.isRetryableProviderError(err)) throw err;
|
|
9831
10058
|
this.markSyncDegraded(err);
|
|
9832
10059
|
}
|
|
9833
10060
|
const vtxos = await this.getVtxosForContracts(contracts);
|
|
@@ -9848,7 +10075,7 @@ var ContractManager = class _ContractManager {
|
|
|
9848
10075
|
}
|
|
9849
10076
|
const tapscriptCache = tapscripts ?? /* @__PURE__ */ new Map();
|
|
9850
10077
|
return vtxos.map(
|
|
9851
|
-
(vtxo) => extendVirtualCoinForContract(
|
|
10078
|
+
(vtxo) => extendVirtualCoinForContract(chunkJZWLXNHV_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
|
|
9852
10079
|
);
|
|
9853
10080
|
}
|
|
9854
10081
|
/** @inheritdoc */
|
|
@@ -9892,14 +10119,14 @@ var ContractManager = class _ContractManager {
|
|
|
9892
10119
|
const byScript = new Map(contracts.map((contract) => [contract.script, contract]));
|
|
9893
10120
|
const asking = vtxos.filter((vtxo) => {
|
|
9894
10121
|
const contract = byScript.get(vtxo.script);
|
|
9895
|
-
return contract !== void 0 &&
|
|
10122
|
+
return contract !== void 0 && chunk43FKNLX4_cjs.contractHandlers.get(contract.type)?.assertSpendableNow !== void 0;
|
|
9896
10123
|
});
|
|
9897
10124
|
if (asking.length === 0) return refused;
|
|
9898
10125
|
const tip = await this.currentChainTip();
|
|
9899
10126
|
const walletKey = await walletPubKey?.();
|
|
9900
10127
|
for (const vtxo of asking) {
|
|
9901
10128
|
const contract = byScript.get(vtxo.script);
|
|
9902
|
-
const handler =
|
|
10129
|
+
const handler = chunk43FKNLX4_cjs.contractHandlers.get(contract.type);
|
|
9903
10130
|
if (!handler?.assertSpendableNow) continue;
|
|
9904
10131
|
const context = {
|
|
9905
10132
|
collaborative: true,
|
|
@@ -9914,7 +10141,7 @@ var ContractManager = class _ContractManager {
|
|
|
9914
10141
|
// the next handler to answer a CSV question would meet a
|
|
9915
10142
|
// TypeError instead of a `false`. Carry the coin only when it
|
|
9916
10143
|
// really is one.
|
|
9917
|
-
vtxo:
|
|
10144
|
+
vtxo: chunkJZWLXNHV_cjs.isVirtualCoin(vtxo) && "status" in vtxo ? vtxo : void 0
|
|
9918
10145
|
};
|
|
9919
10146
|
try {
|
|
9920
10147
|
await handler.assertSpendableNow(
|
|
@@ -10070,7 +10297,7 @@ var ContractManager = class _ContractManager {
|
|
|
10070
10297
|
const { contractScript, collaborative = true, walletPubKey, vtxo } = options;
|
|
10071
10298
|
const [contract] = await this.getContracts({ script: contractScript });
|
|
10072
10299
|
if (!contract) return [];
|
|
10073
|
-
const handler =
|
|
10300
|
+
const handler = chunk43FKNLX4_cjs.contractHandlers.get(contract.type);
|
|
10074
10301
|
if (!handler) return [];
|
|
10075
10302
|
const script = handler.createScript(contract.params);
|
|
10076
10303
|
const tip = await this.currentChainTip();
|
|
@@ -10098,7 +10325,7 @@ var ContractManager = class _ContractManager {
|
|
|
10098
10325
|
const { contractScript, collaborative = true, walletPubKey } = options;
|
|
10099
10326
|
const [contract] = await this.getContracts({ script: contractScript });
|
|
10100
10327
|
if (!contract) return [];
|
|
10101
|
-
const handler =
|
|
10328
|
+
const handler = chunk43FKNLX4_cjs.contractHandlers.get(contract.type);
|
|
10102
10329
|
if (!handler) return [];
|
|
10103
10330
|
const script = handler.createScript(contract.params);
|
|
10104
10331
|
const context = {
|
|
@@ -10154,7 +10381,7 @@ var ContractManager = class _ContractManager {
|
|
|
10154
10381
|
}
|
|
10155
10382
|
async refreshOutpoints(outpoints) {
|
|
10156
10383
|
if (outpoints.length === 0) return;
|
|
10157
|
-
const { vtxos } = await
|
|
10384
|
+
const { vtxos } = await chunkJZWLXNHV_cjs.getNormalizedVtxos(this.config.indexerProvider, {
|
|
10158
10385
|
outpoints
|
|
10159
10386
|
});
|
|
10160
10387
|
if (vtxos.length === 0) return;
|
|
@@ -10233,7 +10460,7 @@ var ContractManager = class _ContractManager {
|
|
|
10233
10460
|
break;
|
|
10234
10461
|
}
|
|
10235
10462
|
} catch (err) {
|
|
10236
|
-
if (!
|
|
10463
|
+
if (!chunkJZWLXNHV_cjs.isRetryableProviderError(err)) throw err;
|
|
10237
10464
|
this.markSyncDegraded(err);
|
|
10238
10465
|
}
|
|
10239
10466
|
this.emitEvent(event);
|
|
@@ -10312,7 +10539,7 @@ var ContractManager = class _ContractManager {
|
|
|
10312
10539
|
*/
|
|
10313
10540
|
async reconcilePendingFrontier(contracts) {
|
|
10314
10541
|
const scriptToContract = new Map(contracts.map((c) => [c.script, c]));
|
|
10315
|
-
const vtxos = await
|
|
10542
|
+
const vtxos = await chunkJZWLXNHV_cjs.getAllNormalizedVtxos(
|
|
10316
10543
|
this.config.indexerProvider,
|
|
10317
10544
|
contracts.map((c) => c.script),
|
|
10318
10545
|
{ pendingOnly: true }
|
|
@@ -10395,7 +10622,7 @@ var ContractManager = class _ContractManager {
|
|
|
10395
10622
|
}
|
|
10396
10623
|
return result;
|
|
10397
10624
|
}
|
|
10398
|
-
async fetchContractVtxosBulk(contracts, pageSize =
|
|
10625
|
+
async fetchContractVtxosBulk(contracts, pageSize = chunkJZWLXNHV_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
|
|
10399
10626
|
if (contracts.length === 0) {
|
|
10400
10627
|
return { vtxosByScript: /* @__PURE__ */ new Map(), promoted: /* @__PURE__ */ new Map() };
|
|
10401
10628
|
}
|
|
@@ -10411,7 +10638,7 @@ var ContractManager = class _ContractManager {
|
|
|
10411
10638
|
before: syncWindow.before
|
|
10412
10639
|
}
|
|
10413
10640
|
} : {};
|
|
10414
|
-
const vtxos = await
|
|
10641
|
+
const vtxos = await chunkJZWLXNHV_cjs.getAllNormalizedVtxos(
|
|
10415
10642
|
this.config.indexerProvider,
|
|
10416
10643
|
contracts.map((c) => c.script),
|
|
10417
10644
|
{ ...windowOpts, pageSize }
|
|
@@ -10556,7 +10783,7 @@ var deserializeTapLeaf = (t) => {
|
|
|
10556
10783
|
const s = base.hex.decode(t.s);
|
|
10557
10784
|
return [cb, s];
|
|
10558
10785
|
};
|
|
10559
|
-
var deserializeVtxo = (o) =>
|
|
10786
|
+
var deserializeVtxo = (o) => chunkJZWLXNHV_cjs.normalizeVtxo({
|
|
10560
10787
|
...o,
|
|
10561
10788
|
createdAt: new Date(o.createdAt),
|
|
10562
10789
|
tapTree: base.hex.decode(o.tapTree),
|
|
@@ -11379,7 +11606,7 @@ var HDDescriptorProvider = class _HDDescriptorProvider {
|
|
|
11379
11606
|
*/
|
|
11380
11607
|
materializeDescriptorAt(index) {
|
|
11381
11608
|
const descriptor = this.identity.descriptor;
|
|
11382
|
-
const network =
|
|
11609
|
+
const network = chunk43FKNLX4_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
11383
11610
|
const expansion = descriptorsScure.expand({ descriptor, network, index });
|
|
11384
11611
|
const keyInfo = expansion.expansionMap?.["@0"];
|
|
11385
11612
|
if (!keyInfo?.keyExpression) {
|
|
@@ -11527,7 +11754,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
|
|
|
11527
11754
|
const provider = await resolveDescriptorProvider(config, setup.walletRepository);
|
|
11528
11755
|
if (!provider) return void 0;
|
|
11529
11756
|
const allowSilentFallback = (config.walletMode ?? "auto") === "auto";
|
|
11530
|
-
const expectedContractType = setup.offchainTapscript instanceof
|
|
11757
|
+
const expectedContractType = setup.offchainTapscript instanceof chunk43FKNLX4_cjs.DelegateVtxo.Script ? "delegate" : "default";
|
|
11531
11758
|
const factoryOpts = {
|
|
11532
11759
|
walletRepository: setup.walletRepository,
|
|
11533
11760
|
contractRepository: setup.contractRepository,
|
|
@@ -11728,7 +11955,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
|
|
|
11728
11955
|
};
|
|
11729
11956
|
function deriveLeafPubkey(descriptor) {
|
|
11730
11957
|
try {
|
|
11731
|
-
return
|
|
11958
|
+
return chunk43FKNLX4_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
11732
11959
|
} catch (e) {
|
|
11733
11960
|
throw new NonRangeableDescriptorError(
|
|
11734
11961
|
"Cannot derive leaf pubkey: descriptor is not a materialized, parsable tr(...) shape.",
|
|
@@ -11740,7 +11967,7 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
11740
11967
|
const pubKey = deriveLeafPubkey(descriptor);
|
|
11741
11968
|
const tapscript = rebuildTapscript(current, pubKey);
|
|
11742
11969
|
const serverPubKey = tapscript.options.serverPubKey;
|
|
11743
|
-
const csvTimelock =
|
|
11970
|
+
const csvTimelock = chunkJZWLXNHV_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
|
|
11744
11971
|
const base$1 = {
|
|
11745
11972
|
script: base.hex.encode(tapscript.pkScript),
|
|
11746
11973
|
address: tapscript.address(hrp, serverPubKey).encode(),
|
|
@@ -11751,11 +11978,11 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
11751
11978
|
// index-0 key. Without it, spends produce unsigned PSBTs that the
|
|
11752
11979
|
// server rejects with `INVALID_PSBT_INPUT (5): missing tapscript spend sig`.
|
|
11753
11980
|
metadata: {
|
|
11754
|
-
...tagSource && { source:
|
|
11981
|
+
...tagSource && { source: chunk43FKNLX4_cjs.WALLET_RECEIVE_SOURCE },
|
|
11755
11982
|
signingDescriptor: descriptor
|
|
11756
11983
|
}
|
|
11757
11984
|
};
|
|
11758
|
-
const params = tapscript instanceof
|
|
11985
|
+
const params = tapscript instanceof chunk43FKNLX4_cjs.DelegateVtxo.Script ? {
|
|
11759
11986
|
...base$1,
|
|
11760
11987
|
type: "delegate",
|
|
11761
11988
|
params: {
|
|
@@ -11776,10 +12003,10 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
11776
12003
|
return { tapscript, params };
|
|
11777
12004
|
}
|
|
11778
12005
|
function rebuildTapscript(current, pubKey) {
|
|
11779
|
-
if (current instanceof
|
|
11780
|
-
return new
|
|
12006
|
+
if (current instanceof chunk43FKNLX4_cjs.DelegateVtxo.Script) {
|
|
12007
|
+
return new chunk43FKNLX4_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
|
|
11781
12008
|
}
|
|
11782
|
-
return new
|
|
12009
|
+
return new chunk43FKNLX4_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
|
|
11783
12010
|
}
|
|
11784
12011
|
async function pickActiveReceive(contractRepository, serverPubKey, expectedType) {
|
|
11785
12012
|
const candidates = await contractRepository.getContracts({
|
|
@@ -11788,7 +12015,7 @@ async function pickActiveReceive(contractRepository, serverPubKey, expectedType)
|
|
|
11788
12015
|
});
|
|
11789
12016
|
const serverPubKeyHex = base.hex.encode(serverPubKey);
|
|
11790
12017
|
const matching = candidates.filter(
|
|
11791
|
-
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source ===
|
|
12018
|
+
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunk43FKNLX4_cjs.WALLET_RECEIVE_SOURCE
|
|
11792
12019
|
).sort((a, b) => {
|
|
11793
12020
|
if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
|
|
11794
12021
|
return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
|
|
@@ -11844,7 +12071,7 @@ function computeOffchainBalance(vtxos, caps) {
|
|
|
11844
12071
|
}
|
|
11845
12072
|
};
|
|
11846
12073
|
for (const vtxo of vtxos) {
|
|
11847
|
-
if (
|
|
12074
|
+
if (chunkJZWLXNHV_cjs.hasTerminalSpend(vtxo)) continue;
|
|
11848
12075
|
addAssets(owned, vtxo);
|
|
11849
12076
|
if (vtxo.isUnrolled) {
|
|
11850
12077
|
unrolled += vtxo.value;
|
|
@@ -11854,11 +12081,11 @@ function computeOffchainBalance(vtxos, caps) {
|
|
|
11854
12081
|
pendingRecovery += vtxo.value;
|
|
11855
12082
|
continue;
|
|
11856
12083
|
}
|
|
11857
|
-
if (
|
|
12084
|
+
if (chunkJZWLXNHV_cjs.canRecoverOnchain(vtxo, now)) {
|
|
11858
12085
|
recoverable += vtxo.value;
|
|
11859
12086
|
continue;
|
|
11860
12087
|
}
|
|
11861
|
-
if (!
|
|
12088
|
+
if (!chunkJZWLXNHV_cjs.canSpendOffchain(vtxo, now)) continue;
|
|
11862
12089
|
if (vtxo.isPreconfirmed) {
|
|
11863
12090
|
preconfirmed += vtxo.value;
|
|
11864
12091
|
} else {
|
|
@@ -12028,12 +12255,12 @@ var InputSignerRouter = class {
|
|
|
12028
12255
|
};
|
|
12029
12256
|
|
|
12030
12257
|
// src/wallet/wallet.ts
|
|
12031
|
-
var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl ||
|
|
12258
|
+
var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunkJZWLXNHV_cjs.DEFAULT_ARKADE_SERVER_URL;
|
|
12032
12259
|
function intentProofJobs(coins) {
|
|
12033
12260
|
if (coins.length === 0) return [];
|
|
12034
12261
|
const coinJobs = coins.map((coin, i) => ({
|
|
12035
12262
|
index: i + 1,
|
|
12036
|
-
lookupScript:
|
|
12263
|
+
lookupScript: chunkJZWLXNHV_cjs.VtxoScript.decode(coin.tapTree).pkScript
|
|
12037
12264
|
}));
|
|
12038
12265
|
return [{ index: 0, lookupScript: coinJobs[0].lookupScript }, ...coinJobs];
|
|
12039
12266
|
}
|
|
@@ -12065,7 +12292,7 @@ function dedupeTimelocks(timelocks) {
|
|
|
12065
12292
|
const seen = /* @__PURE__ */ new Set();
|
|
12066
12293
|
const deduped = [];
|
|
12067
12294
|
for (const timelock of timelocks) {
|
|
12068
|
-
const sequence =
|
|
12295
|
+
const sequence = chunkJZWLXNHV_cjs.timelockToSequence(timelock).toString();
|
|
12069
12296
|
if (seen.has(sequence)) continue;
|
|
12070
12297
|
seen.add(sequence);
|
|
12071
12298
|
deduped.push(timelock);
|
|
@@ -12082,7 +12309,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
|
|
|
12082
12309
|
state: "active"
|
|
12083
12310
|
});
|
|
12084
12311
|
const newest = candidates.filter(
|
|
12085
|
-
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source ===
|
|
12312
|
+
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunk43FKNLX4_cjs.WALLET_RECEIVE_SOURCE
|
|
12086
12313
|
).sort((a, b) => {
|
|
12087
12314
|
if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
|
|
12088
12315
|
return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
|
|
@@ -12090,7 +12317,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
|
|
|
12090
12317
|
if (!newest?.params.pubKey) return baseline;
|
|
12091
12318
|
try {
|
|
12092
12319
|
const pubKey = base.hex.decode(newest.params.pubKey);
|
|
12093
|
-
return new
|
|
12320
|
+
return new chunk43FKNLX4_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
|
|
12094
12321
|
} catch (e) {
|
|
12095
12322
|
console.warn("Skipping malformed boarding contract at boot", newest.script, e);
|
|
12096
12323
|
return baseline;
|
|
@@ -12109,10 +12336,10 @@ function filterSnapshotVtxos(snapshot, filter, pendingSpendOutpoints) {
|
|
|
12109
12336
|
if (vtxo.isUnrolled) {
|
|
12110
12337
|
return !!f.withUnrolled;
|
|
12111
12338
|
}
|
|
12112
|
-
if (
|
|
12339
|
+
if (chunkJZWLXNHV_cjs.hasTerminalSpend(vtxo)) {
|
|
12113
12340
|
return false;
|
|
12114
12341
|
}
|
|
12115
|
-
if (!f.withRecoverable &&
|
|
12342
|
+
if (!f.withRecoverable && chunkJZWLXNHV_cjs.canRecoverOnchain(vtxo, now)) {
|
|
12116
12343
|
return false;
|
|
12117
12344
|
}
|
|
12118
12345
|
return true;
|
|
@@ -12463,7 +12690,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12463
12690
|
async getArkadeReader() {
|
|
12464
12691
|
const indexer = this.indexerProvider;
|
|
12465
12692
|
return {
|
|
12466
|
-
getVtxos: (opts) =>
|
|
12693
|
+
getVtxos: (opts) => chunkJZWLXNHV_cjs.getNormalizedVtxos(indexer, opts),
|
|
12467
12694
|
getVirtualTxs: (txids, opts) => indexer.getVirtualTxs(txids, opts)
|
|
12468
12695
|
};
|
|
12469
12696
|
}
|
|
@@ -12519,7 +12746,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12519
12746
|
*/
|
|
12520
12747
|
static async setupWalletConfig(config, pubKey) {
|
|
12521
12748
|
const arkadeServerUrl = getArkadeServerUrl(config);
|
|
12522
|
-
const arkProvider = config.arkProvider || new
|
|
12749
|
+
const arkProvider = config.arkProvider || new chunkJZWLXNHV_cjs.RestArkProvider(arkadeServerUrl);
|
|
12523
12750
|
let indexerProvider = config.indexerProvider;
|
|
12524
12751
|
if (!indexerProvider) {
|
|
12525
12752
|
let indexerUrl = config.indexerUrl;
|
|
@@ -12536,7 +12763,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12536
12763
|
indexerUrl = arkadeServerUrl;
|
|
12537
12764
|
}
|
|
12538
12765
|
}
|
|
12539
|
-
indexerProvider = new
|
|
12766
|
+
indexerProvider = new chunkNVZJSKZS_cjs.RestIndexerProvider(indexerUrl);
|
|
12540
12767
|
}
|
|
12541
12768
|
const walletRepository = config.storage?.walletRepository ?? new IndexedDBWalletRepository();
|
|
12542
12769
|
const contractRepository = config.storage?.contractRepository ?? new IndexedDBContractRepository();
|
|
@@ -12545,7 +12772,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12545
12772
|
source: serverInfoSource,
|
|
12546
12773
|
lastOnlineAt: serverInfoLastOnlineAt
|
|
12547
12774
|
} = await resolveArkInfo(arkProvider, walletRepository);
|
|
12548
|
-
const network =
|
|
12775
|
+
const network = chunkJZWLXNHV_cjs.networkFromArkadeInfo(info);
|
|
12549
12776
|
if ("descriptor" in config.identity) {
|
|
12550
12777
|
const descriptor = config.identity.descriptor;
|
|
12551
12778
|
const identityIsMainnet = !descriptor.includes("tpub");
|
|
@@ -12585,18 +12812,18 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12585
12812
|
value: info.boardingExitDelay,
|
|
12586
12813
|
type: info.boardingExitDelay < 512n ? "blocks" : "seconds"
|
|
12587
12814
|
};
|
|
12588
|
-
const serverPubKey =
|
|
12589
|
-
const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) =>
|
|
12815
|
+
const serverPubKey = chunk43FKNLX4_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
|
|
12816
|
+
const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => chunk43FKNLX4_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : config.delegatorProvider ? await config.delegatorProvider.getDelegateInfo().then((info2) => chunk43FKNLX4_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : void 0;
|
|
12590
12817
|
const offchainOptions = {
|
|
12591
12818
|
pubKey,
|
|
12592
12819
|
serverPubKey,
|
|
12593
12820
|
csvTimelock: exitTimelock
|
|
12594
12821
|
};
|
|
12595
|
-
const offchainTapscript = !delegatePubKey ? new
|
|
12596
|
-
const boardingTapscript =
|
|
12822
|
+
const offchainTapscript = !delegatePubKey ? new chunk43FKNLX4_cjs.DefaultVtxo.Script(offchainOptions) : new chunk43FKNLX4_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
|
|
12823
|
+
const boardingTapscript = chunk43FKNLX4_cjs.BoardingContractHandler.createScript({
|
|
12597
12824
|
pubKey: base.hex.encode(pubKey),
|
|
12598
12825
|
serverPubKey: base.hex.encode(serverPubKey),
|
|
12599
|
-
csvTimelock:
|
|
12826
|
+
csvTimelock: chunkJZWLXNHV_cjs.timelockToSequence(boardingTimelock).toString()
|
|
12600
12827
|
});
|
|
12601
12828
|
return {
|
|
12602
12829
|
arkProvider,
|
|
@@ -12763,7 +12990,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12763
12990
|
if (!filter?.withUnrolled) {
|
|
12764
12991
|
logExcludedVtxos(
|
|
12765
12992
|
"getSpendableVtxos",
|
|
12766
|
-
snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !
|
|
12993
|
+
snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !chunkJZWLXNHV_cjs.hasTerminalSpend(vtxo)),
|
|
12767
12994
|
[() => UNROLLED_REASON]
|
|
12768
12995
|
);
|
|
12769
12996
|
}
|
|
@@ -12906,7 +13133,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12906
13133
|
const response = await contractManager.getContractsWithVtxos();
|
|
12907
13134
|
const allVtxos = response.flatMap((_) => _.vtxos);
|
|
12908
13135
|
const { boardingTxs, commitmentsToIgnore } = await this.getBoardingTxs();
|
|
12909
|
-
const resolveTxCreatedAt = (txids) =>
|
|
13136
|
+
const resolveTxCreatedAt = (txids) => chunkJZWLXNHV_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
|
|
12910
13137
|
return buildTransactionHistory(
|
|
12911
13138
|
allVtxos,
|
|
12912
13139
|
boardingTxs,
|
|
@@ -13000,7 +13227,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13000
13227
|
},
|
|
13001
13228
|
isUnrolled: true,
|
|
13002
13229
|
...boardingFacts,
|
|
13003
|
-
virtualStatus:
|
|
13230
|
+
virtualStatus: chunkJZWLXNHV_cjs.toVirtualStatus(boardingFacts),
|
|
13004
13231
|
spentBy: "",
|
|
13005
13232
|
createdAt: tx.status.confirmed ? new Date(tx.status.block_time * 1e3) : /* @__PURE__ */ new Date(0),
|
|
13006
13233
|
script: scriptHex
|
|
@@ -13056,9 +13283,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13056
13283
|
async getBoardingTapscripts(allowedSigners) {
|
|
13057
13284
|
const byScript = /* @__PURE__ */ new Map();
|
|
13058
13285
|
const add = (s) => byScript.set(base.hex.encode(s.pkScript), s);
|
|
13059
|
-
const boardingCsv = this.boardingTapscript.options.csvTimelock ??
|
|
13286
|
+
const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunk43FKNLX4_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
13060
13287
|
add(
|
|
13061
|
-
new
|
|
13288
|
+
new chunk43FKNLX4_cjs.DefaultVtxo.Script({
|
|
13062
13289
|
pubKey: await this.identity.xOnlyPublicKey(),
|
|
13063
13290
|
serverPubKey: this.boardingTapscript.options.serverPubKey,
|
|
13064
13291
|
csvTimelock: boardingCsv
|
|
@@ -13073,7 +13300,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13073
13300
|
for (const c of boardingContracts) {
|
|
13074
13301
|
if (!allowed.has(toXOnlySignerHex(c.params.serverPubKey))) continue;
|
|
13075
13302
|
try {
|
|
13076
|
-
add(
|
|
13303
|
+
add(chunk43FKNLX4_cjs.BoardingContractHandler.createScript(c.params));
|
|
13077
13304
|
} catch (e) {
|
|
13078
13305
|
console.warn("Skipping malformed boarding contract", c.script, e);
|
|
13079
13306
|
}
|
|
@@ -13111,7 +13338,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13111
13338
|
// Per-row CSV delay decoded from THIS tapscript's exit leaf —
|
|
13112
13339
|
// not the wallet's current boarding timelock, which a signer
|
|
13113
13340
|
// rotation may have changed.
|
|
13114
|
-
csvTimelock:
|
|
13341
|
+
csvTimelock: chunkJZWLXNHV_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
|
|
13115
13342
|
coins: utxos
|
|
13116
13343
|
});
|
|
13117
13344
|
}
|
|
@@ -13244,7 +13471,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13244
13471
|
/** Fetch Arkade transaction ids that are still pending final settlement. */
|
|
13245
13472
|
async fetchPendingTxs() {
|
|
13246
13473
|
const scripts = await this.getWalletScripts();
|
|
13247
|
-
const vtxos = await
|
|
13474
|
+
const vtxos = await chunkJZWLXNHV_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
|
|
13248
13475
|
return vtxos.filter(
|
|
13249
13476
|
(vtxo) => (vtxo.isSpent || vtxo.isPreconfirmed && !vtxo.isSwept) && vtxo.arkTxId !== void 0
|
|
13250
13477
|
).map((_) => _.arkTxId);
|
|
@@ -13275,7 +13502,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13275
13502
|
});
|
|
13276
13503
|
for (const contract of contracts) {
|
|
13277
13504
|
if (map.has(contract.script)) continue;
|
|
13278
|
-
const handler =
|
|
13505
|
+
const handler = chunk43FKNLX4_cjs.contractHandlers.get(contract.type);
|
|
13279
13506
|
if (handler) {
|
|
13280
13507
|
const script = handler.createScript(contract.params);
|
|
13281
13508
|
map.set(contract.script, script);
|
|
@@ -13387,7 +13614,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13387
13614
|
}
|
|
13388
13615
|
});
|
|
13389
13616
|
const baselinePubkey = await this.identity.xOnlyPublicKey();
|
|
13390
|
-
const delegatePubKey = this.offchainTapscript instanceof
|
|
13617
|
+
const delegatePubKey = this.offchainTapscript instanceof chunk43FKNLX4_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
|
|
13391
13618
|
const baselineSigners = [
|
|
13392
13619
|
this.offchainTapscript.options.serverPubKey,
|
|
13393
13620
|
...[...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h))
|
|
@@ -13395,8 +13622,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13395
13622
|
const seenBaselineScripts = /* @__PURE__ */ new Set();
|
|
13396
13623
|
for (const serverPubKey of baselineSigners) {
|
|
13397
13624
|
for (const csvTimelock of this.walletContractTimelocks) {
|
|
13398
|
-
const csvTimelockStr =
|
|
13399
|
-
const defaultScript = new
|
|
13625
|
+
const csvTimelockStr = chunkJZWLXNHV_cjs.timelockToSequence(csvTimelock).toString();
|
|
13626
|
+
const defaultScript = new chunk43FKNLX4_cjs.DefaultVtxo.Script({
|
|
13400
13627
|
pubKey: baselinePubkey,
|
|
13401
13628
|
serverPubKey,
|
|
13402
13629
|
csvTimelock
|
|
@@ -13417,7 +13644,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13417
13644
|
});
|
|
13418
13645
|
}
|
|
13419
13646
|
if (delegatePubKey) {
|
|
13420
|
-
const delegateScript = new
|
|
13647
|
+
const delegateScript = new chunk43FKNLX4_cjs.DelegateVtxo.Script({
|
|
13421
13648
|
pubKey: baselinePubkey,
|
|
13422
13649
|
serverPubKey,
|
|
13423
13650
|
delegatePubKey,
|
|
@@ -13441,9 +13668,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13441
13668
|
}
|
|
13442
13669
|
}
|
|
13443
13670
|
}
|
|
13444
|
-
const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ??
|
|
13671
|
+
const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunk43FKNLX4_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
13445
13672
|
for (const serverPubKey of baselineSigners) {
|
|
13446
|
-
const baselineBoarding = new
|
|
13673
|
+
const baselineBoarding = new chunk43FKNLX4_cjs.DefaultVtxo.Script({
|
|
13447
13674
|
pubKey: baselinePubkey,
|
|
13448
13675
|
serverPubKey,
|
|
13449
13676
|
csvTimelock: boardingCsvTimelock
|
|
@@ -13456,7 +13683,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13456
13683
|
params: {
|
|
13457
13684
|
pubKey: base.hex.encode(baselineBoarding.options.pubKey),
|
|
13458
13685
|
serverPubKey: base.hex.encode(serverPubKey),
|
|
13459
|
-
csvTimelock:
|
|
13686
|
+
csvTimelock: chunkJZWLXNHV_cjs.timelockToSequence(boardingCsvTimelock).toString()
|
|
13460
13687
|
},
|
|
13461
13688
|
script: boardingScriptHex,
|
|
13462
13689
|
address: baselineBoarding.address(this.network.hrp, serverPubKey).encode(),
|
|
@@ -13655,7 +13882,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13655
13882
|
serverPubKey: this.offchainTapscript.options.serverPubKey,
|
|
13656
13883
|
deprecatedSignerPubKeys: [...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h)),
|
|
13657
13884
|
csvTimelocks: this.walletContractTimelocks,
|
|
13658
|
-
delegatePubKey: this.offchainTapscript instanceof
|
|
13885
|
+
delegatePubKey: this.offchainTapscript instanceof chunk43FKNLX4_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
|
|
13659
13886
|
};
|
|
13660
13887
|
}
|
|
13661
13888
|
_signerRouter;
|
|
@@ -13900,7 +14127,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13900
14127
|
const [row] = await manager.getContracts({ script: base.hex.encode(display.pkScript) });
|
|
13901
14128
|
const persisted = row?.metadata?.signingDescriptor;
|
|
13902
14129
|
if (typeof persisted === "string") return persisted;
|
|
13903
|
-
return
|
|
14130
|
+
return chunk43FKNLX4_cjs.identityDescriptor(this.identity);
|
|
13904
14131
|
}
|
|
13905
14132
|
/**
|
|
13906
14133
|
* Build, persist and shape one address of `type` owned by `descriptor` —
|
|
@@ -13916,7 +14143,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13916
14143
|
async mintAddress(manager, type, descriptor, tagSource, allocated) {
|
|
13917
14144
|
if (type === "boarding") {
|
|
13918
14145
|
const built2 = this.buildBoardingContract(
|
|
13919
|
-
|
|
14146
|
+
chunk43FKNLX4_cjs.deriveDescriptorLeafPubKey(descriptor),
|
|
13920
14147
|
descriptor,
|
|
13921
14148
|
tagSource
|
|
13922
14149
|
);
|
|
@@ -13961,11 +14188,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13961
14188
|
* {@link buildReceiveContract}.
|
|
13962
14189
|
*/
|
|
13963
14190
|
buildBoardingContract(pubKey, descriptor, tagSource) {
|
|
13964
|
-
const tapscript = new
|
|
14191
|
+
const tapscript = new chunk43FKNLX4_cjs.DefaultVtxo.Script({
|
|
13965
14192
|
...this._boardingTapscript.options,
|
|
13966
14193
|
pubKey
|
|
13967
14194
|
});
|
|
13968
|
-
const csvTimelock = tapscript.options.csvTimelock ??
|
|
14195
|
+
const csvTimelock = tapscript.options.csvTimelock ?? chunk43FKNLX4_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
13969
14196
|
return {
|
|
13970
14197
|
tapscript,
|
|
13971
14198
|
params: {
|
|
@@ -13973,13 +14200,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13973
14200
|
params: {
|
|
13974
14201
|
pubKey: base.hex.encode(pubKey),
|
|
13975
14202
|
serverPubKey: base.hex.encode(tapscript.options.serverPubKey),
|
|
13976
|
-
csvTimelock:
|
|
14203
|
+
csvTimelock: chunkJZWLXNHV_cjs.timelockToSequence(csvTimelock).toString()
|
|
13977
14204
|
},
|
|
13978
14205
|
script: base.hex.encode(tapscript.pkScript),
|
|
13979
14206
|
address: tapscript.address(this.network.hrp, this.arkServerPublicKey).encode(),
|
|
13980
14207
|
state: "active",
|
|
13981
14208
|
metadata: {
|
|
13982
|
-
...tagSource && { source:
|
|
14209
|
+
...tagSource && { source: chunk43FKNLX4_cjs.WALLET_RECEIVE_SOURCE },
|
|
13983
14210
|
signingDescriptor: descriptor
|
|
13984
14211
|
}
|
|
13985
14212
|
}
|
|
@@ -14008,7 +14235,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14008
14235
|
if (this._descriptorProvider instanceof HDDescriptorProvider) {
|
|
14009
14236
|
return (await this.getContractManager()).getNextSigningDescriptor();
|
|
14010
14237
|
}
|
|
14011
|
-
return
|
|
14238
|
+
return chunk43FKNLX4_cjs.identityDescriptor(this.identity);
|
|
14012
14239
|
}
|
|
14013
14240
|
/**
|
|
14014
14241
|
* @see HDAllocationCapable.advanceSigningDescriptorWatermark
|
|
@@ -14104,7 +14331,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14104
14331
|
* the stable public API.
|
|
14105
14332
|
*/
|
|
14106
14333
|
async rotateServerSigner(newServerPubKey, checkpointTapscript) {
|
|
14107
|
-
const xonly =
|
|
14334
|
+
const xonly = chunk43FKNLX4_cjs.toXOnly(newServerPubKey, "ark signer key");
|
|
14108
14335
|
const newServerUnrollScript = assertValidServerUnrollScript(
|
|
14109
14336
|
checkpointTapscript,
|
|
14110
14337
|
resolveCheckpointExitDelayPolicy(this.network, this.checkpointExitDelayPolicy)
|
|
@@ -14133,21 +14360,21 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14133
14360
|
const [currentBoardingRow] = await manager.getContracts({
|
|
14134
14361
|
script: currentBoardingScript
|
|
14135
14362
|
});
|
|
14136
|
-
const newOffchain = this.offchainTapscript instanceof
|
|
14363
|
+
const newOffchain = this.offchainTapscript instanceof chunk43FKNLX4_cjs.DelegateVtxo.Script ? new chunk43FKNLX4_cjs.DelegateVtxo.Script({
|
|
14137
14364
|
...this.offchainTapscript.options,
|
|
14138
14365
|
serverPubKey: xonly
|
|
14139
|
-
}) : new
|
|
14366
|
+
}) : new chunk43FKNLX4_cjs.DefaultVtxo.Script({
|
|
14140
14367
|
...this.offchainTapscript.options,
|
|
14141
14368
|
serverPubKey: xonly
|
|
14142
14369
|
});
|
|
14143
|
-
const newBoarding = new
|
|
14370
|
+
const newBoarding = new chunk43FKNLX4_cjs.DefaultVtxo.Script({
|
|
14144
14371
|
...this._boardingTapscript.options,
|
|
14145
14372
|
serverPubKey: xonly
|
|
14146
14373
|
});
|
|
14147
|
-
const offchainCsv =
|
|
14374
|
+
const offchainCsv = chunkJZWLXNHV_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
|
|
14148
14375
|
const newOffchainScript = base.hex.encode(newOffchain.pkScript);
|
|
14149
14376
|
const newOffchainAddress = newOffchain.address(this.network.hrp, xonly).encode();
|
|
14150
|
-
if (newOffchain instanceof
|
|
14377
|
+
if (newOffchain instanceof chunk43FKNLX4_cjs.DelegateVtxo.Script) {
|
|
14151
14378
|
await manager.createContract({
|
|
14152
14379
|
type: "delegate",
|
|
14153
14380
|
params: {
|
|
@@ -14175,13 +14402,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14175
14402
|
metadata: currentOffchainRow?.metadata
|
|
14176
14403
|
});
|
|
14177
14404
|
}
|
|
14178
|
-
const boardingCsv = newBoarding.options.csvTimelock ??
|
|
14405
|
+
const boardingCsv = newBoarding.options.csvTimelock ?? chunk43FKNLX4_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
14179
14406
|
await manager.createContract({
|
|
14180
14407
|
type: "boarding",
|
|
14181
14408
|
params: {
|
|
14182
14409
|
pubKey: base.hex.encode(newBoarding.options.pubKey),
|
|
14183
14410
|
serverPubKey: base.hex.encode(xonly),
|
|
14184
|
-
csvTimelock:
|
|
14411
|
+
csvTimelock: chunkJZWLXNHV_cjs.timelockToSequence(boardingCsv).toString()
|
|
14185
14412
|
},
|
|
14186
14413
|
script: base.hex.encode(newBoarding.pkScript),
|
|
14187
14414
|
address: newBoarding.address(this.network.hrp, xonly).encode(),
|
|
@@ -14214,14 +14441,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14214
14441
|
_restoreInFlight;
|
|
14215
14442
|
_addPendingSpends(inputs) {
|
|
14216
14443
|
for (const input of inputs) {
|
|
14217
|
-
if (
|
|
14444
|
+
if (chunkJZWLXNHV_cjs.isVirtualCoin(input)) {
|
|
14218
14445
|
this._pendingSpendOutpoints.add(`${input.txid}:${input.vout}`);
|
|
14219
14446
|
}
|
|
14220
14447
|
}
|
|
14221
14448
|
}
|
|
14222
14449
|
_removePendingSpends(inputs) {
|
|
14223
14450
|
for (const input of inputs) {
|
|
14224
|
-
if (
|
|
14451
|
+
if (chunkJZWLXNHV_cjs.isVirtualCoin(input)) {
|
|
14225
14452
|
this._pendingSpendOutpoints.delete(`${input.txid}:${input.vout}`);
|
|
14226
14453
|
}
|
|
14227
14454
|
}
|
|
@@ -14279,13 +14506,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14279
14506
|
const manager = await this.getContractManager();
|
|
14280
14507
|
const provider = this._descriptorProvider;
|
|
14281
14508
|
const hd = provider instanceof HDDescriptorProvider;
|
|
14282
|
-
const staticDescriptor = hd ? void 0 : await
|
|
14509
|
+
const staticDescriptor = hd ? void 0 : await chunk43FKNLX4_cjs.identityDescriptor(this.identity);
|
|
14283
14510
|
const materialize = (index) => hd ? provider.materializeDescriptorAt(index) : staticDescriptor;
|
|
14284
|
-
const delegatePubKey = this.offchainTapscript instanceof
|
|
14511
|
+
const delegatePubKey = this.offchainTapscript instanceof chunk43FKNLX4_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
|
|
14285
14512
|
const arkInfo = await this.arkProvider.getInfo();
|
|
14286
|
-
const currentSignerPubKey =
|
|
14513
|
+
const currentSignerPubKey = chunk43FKNLX4_cjs.toXOnly(base.hex.decode(arkInfo.signerPubkey), "ark signer key");
|
|
14287
14514
|
const deprecatedSignerPubKeys = arkInfo.deprecatedSigners.map(
|
|
14288
|
-
(s) =>
|
|
14515
|
+
(s) => chunk43FKNLX4_cjs.toXOnly(base.hex.decode(s.pubkey), "deprecated signer key")
|
|
14289
14516
|
);
|
|
14290
14517
|
const deps = {
|
|
14291
14518
|
indexerProvider: this.indexerProvider,
|
|
@@ -14300,7 +14527,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14300
14527
|
csvTimelocks: this.walletContractTimelocks,
|
|
14301
14528
|
// Boarding-exit CSV so the boarding handler can build its
|
|
14302
14529
|
// candidate script (distinct from the unilateral-exit matrix).
|
|
14303
|
-
boardingTimelock: this.boardingTapscript.options.csvTimelock ??
|
|
14530
|
+
boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunk43FKNLX4_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
|
|
14304
14531
|
delegatePubKey
|
|
14305
14532
|
};
|
|
14306
14533
|
const result = await manager.scanContracts({
|
|
@@ -14429,7 +14656,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14429
14656
|
throw new Error("Invalid configured public key");
|
|
14430
14657
|
}
|
|
14431
14658
|
const setup = await ReadonlyWallet.setupWalletConfig(config, pubkey);
|
|
14432
|
-
const forfeitPubkey =
|
|
14659
|
+
const forfeitPubkey = chunk43FKNLX4_cjs.toXOnly(base.hex.decode(setup.info.forfeitPubkey), "forfeit key");
|
|
14433
14660
|
const forfeitAddress = btcSigner.Address(setup.network).decode(setup.info.forfeitAddress);
|
|
14434
14661
|
const forfeitOutputScript = btcSigner.OutScript.encode(forfeitAddress);
|
|
14435
14662
|
const checkpointExitDelayOverrides = {
|
|
@@ -14579,7 +14806,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14579
14806
|
inputs: params.selectedVtxos,
|
|
14580
14807
|
changeAmount: BigInt(changeAmount)
|
|
14581
14808
|
};
|
|
14582
|
-
const outputAddress =
|
|
14809
|
+
const outputAddress = chunkJZWLXNHV_cjs.ArkAddress.decode(params.address);
|
|
14583
14810
|
assertRecipientArkadeAddress(
|
|
14584
14811
|
params.address,
|
|
14585
14812
|
outputAddress,
|
|
@@ -14645,13 +14872,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14645
14872
|
void this.logUngatedInputs("settle({ inputs })", params.inputs);
|
|
14646
14873
|
}
|
|
14647
14874
|
const offchainAddress = await this.getAddress();
|
|
14648
|
-
const offchainPkScript =
|
|
14875
|
+
const offchainPkScript = chunkJZWLXNHV_cjs.ArkAddress.decode(offchainAddress).pkScript;
|
|
14649
14876
|
const offchainOutputScript = base.hex.encode(offchainPkScript);
|
|
14650
14877
|
if (!params) {
|
|
14651
14878
|
const { fees, vtxoMaxAmount } = await this.arkProvider.getInfo();
|
|
14652
14879
|
const estimator = new Estimator(fees.intentFee);
|
|
14653
14880
|
let amount = 0;
|
|
14654
|
-
const exitScript =
|
|
14881
|
+
const exitScript = chunkJZWLXNHV_cjs.CSVMultisigTapscript.decode(
|
|
14655
14882
|
base.hex.decode(this.boardingTapscript.exitScript)
|
|
14656
14883
|
);
|
|
14657
14884
|
const boardingTimelock = exitScript.params.timelock;
|
|
@@ -14680,7 +14907,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14680
14907
|
if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
|
|
14681
14908
|
break;
|
|
14682
14909
|
}
|
|
14683
|
-
const inputFee = estimator.evalOffchainInput(
|
|
14910
|
+
const inputFee = estimator.evalOffchainInput(chunkJZWLXNHV_cjs.toOffchainInputFeeParams(vtxo));
|
|
14684
14911
|
if (inputFee.satoshis >= vtxo.value) {
|
|
14685
14912
|
continue;
|
|
14686
14913
|
}
|
|
@@ -14727,7 +14954,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14727
14954
|
let script;
|
|
14728
14955
|
let arkAddress;
|
|
14729
14956
|
try {
|
|
14730
|
-
arkAddress =
|
|
14957
|
+
arkAddress = chunkJZWLXNHV_cjs.ArkAddress.decode(output.address);
|
|
14731
14958
|
} catch {
|
|
14732
14959
|
arkAddress = void 0;
|
|
14733
14960
|
}
|
|
@@ -14817,7 +15044,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14817
15044
|
const abortController = new AbortController();
|
|
14818
15045
|
let stream;
|
|
14819
15046
|
let committedTxid;
|
|
14820
|
-
const settleInputVtxos = params.inputs.filter(
|
|
15047
|
+
const settleInputVtxos = params.inputs.filter(chunkJZWLXNHV_cjs.isVirtualCoin);
|
|
14821
15048
|
const contractManager = await this.getContractManager();
|
|
14822
15049
|
await contractManager.assertAnnotatable(settleInputVtxos);
|
|
14823
15050
|
await contractManager.assertSpendableNow?.(
|
|
@@ -14929,7 +15156,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14929
15156
|
async maybeRotateBoardingAfterBoard(inputs) {
|
|
14930
15157
|
if (!this._descriptorProvider) return;
|
|
14931
15158
|
const consumedBoarding = inputs.some(
|
|
14932
|
-
(input) => typeof input !== "string" && !
|
|
15159
|
+
(input) => typeof input !== "string" && !chunkJZWLXNHV_cjs.isVirtualCoin(input)
|
|
14933
15160
|
);
|
|
14934
15161
|
if (!consumedBoarding) return;
|
|
14935
15162
|
try {
|
|
@@ -14953,7 +15180,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14953
15180
|
let connectorIndex = 0;
|
|
14954
15181
|
const connectorsLeaves = connectorsGraph?.leaves() || [];
|
|
14955
15182
|
for (const input of inputs) {
|
|
14956
|
-
if (!
|
|
15183
|
+
if (!chunkJZWLXNHV_cjs.isVirtualCoin(input)) {
|
|
14957
15184
|
for (let i = 0; i < settlementPsbt.inputsLength; i++) {
|
|
14958
15185
|
const settlementInput = settlementPsbt.getInput(i);
|
|
14959
15186
|
if (!settlementInput.txid || settlementInput.index === void 0) {
|
|
@@ -14984,7 +15211,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14984
15211
|
}
|
|
14985
15212
|
continue;
|
|
14986
15213
|
}
|
|
14987
|
-
if (
|
|
15214
|
+
if (chunkJZWLXNHV_cjs.canRecoverOnchain(input, { timestamp: /* @__PURE__ */ new Date() }) || isSubdust({ value: input.value }, this.dustAmount)) {
|
|
14988
15215
|
continue;
|
|
14989
15216
|
}
|
|
14990
15217
|
if (connectorsLeaves.length === 0) {
|
|
@@ -15012,7 +15239,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15012
15239
|
index: input.vout,
|
|
15013
15240
|
witnessUtxo: {
|
|
15014
15241
|
amount: BigInt(input.value),
|
|
15015
|
-
script:
|
|
15242
|
+
script: chunkJZWLXNHV_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
15016
15243
|
},
|
|
15017
15244
|
sighashType: btcSigner.SigHash.DEFAULT,
|
|
15018
15245
|
tapLeafScript: [input.forfeitTapLeafScript]
|
|
@@ -15031,7 +15258,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15031
15258
|
forfeitTx = await this._signerRouter.sign(forfeitTx, [
|
|
15032
15259
|
{
|
|
15033
15260
|
index: 0,
|
|
15034
|
-
lookupScript:
|
|
15261
|
+
lookupScript: chunkJZWLXNHV_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
15035
15262
|
}
|
|
15036
15263
|
]);
|
|
15037
15264
|
signedForfeits.push(base.base64.encode(forfeitTx.toPSBT()));
|
|
@@ -15089,7 +15316,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15089
15316
|
resolveBatchExpiryPolicy(this.network, this.batchExpiryPolicy)
|
|
15090
15317
|
);
|
|
15091
15318
|
await this.arkProvider.confirmRegistration(intentId);
|
|
15092
|
-
const sweepTapscript =
|
|
15319
|
+
const sweepTapscript = chunkJZWLXNHV_cjs.CSVMultisigTapscript.encode({
|
|
15093
15320
|
timelock,
|
|
15094
15321
|
pubkeys: [this.forfeitPubkey]
|
|
15095
15322
|
}).script;
|
|
@@ -15104,10 +15331,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15104
15331
|
throw new Error("Sweep tap tree root not set");
|
|
15105
15332
|
}
|
|
15106
15333
|
const xOnlyPublicKeys = event.cosignersPublicKeys.map(
|
|
15107
|
-
(k) => base.hex.encode(
|
|
15334
|
+
(k) => base.hex.encode(chunk43FKNLX4_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
|
|
15108
15335
|
);
|
|
15109
15336
|
const signerPublicKey = await session.getPublicKey();
|
|
15110
|
-
const xonlySignerPublicKey =
|
|
15337
|
+
const xonlySignerPublicKey = chunk43FKNLX4_cjs.toXOnly(signerPublicKey, "signer key");
|
|
15111
15338
|
if (!xOnlyPublicKeys.includes(base.hex.encode(xonlySignerPublicKey))) {
|
|
15112
15339
|
return { skip: true };
|
|
15113
15340
|
}
|
|
@@ -15197,9 +15424,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15197
15424
|
...existing ?? {},
|
|
15198
15425
|
intentTxId,
|
|
15199
15426
|
registerProof: intent.proof,
|
|
15200
|
-
registerProofMessage:
|
|
15427
|
+
registerProofMessage: chunkJZWLXNHV_cjs.Intent.encodeMessage(intent.message),
|
|
15201
15428
|
deleteProof: deleteIntent.proof,
|
|
15202
|
-
deleteProofMessage:
|
|
15429
|
+
deleteProofMessage: chunkJZWLXNHV_cjs.Intent.encodeMessage(deleteIntent.message),
|
|
15203
15430
|
intentVtxos: inputs.map((i) => ({
|
|
15204
15431
|
txid: i.txid,
|
|
15205
15432
|
vout: i.vout
|
|
@@ -15231,7 +15458,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15231
15458
|
try {
|
|
15232
15459
|
return await this.arkProvider.registerIntent(intent);
|
|
15233
15460
|
} catch (error) {
|
|
15234
|
-
if (error instanceof
|
|
15461
|
+
if (error instanceof chunkJZWLXNHV_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
|
|
15235
15462
|
const deleteIntent = await this.makeDeleteIntentSignature(inputs);
|
|
15236
15463
|
await this.arkProvider.deleteIntent(deleteIntent);
|
|
15237
15464
|
return this.arkProvider.registerIntent(intent);
|
|
@@ -15247,7 +15474,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15247
15474
|
expire_at: 0,
|
|
15248
15475
|
cosigners_public_keys: cosignerPubKeys
|
|
15249
15476
|
};
|
|
15250
|
-
const proof =
|
|
15477
|
+
const proof = chunkJZWLXNHV_cjs.Intent.create(message, coins, outputs);
|
|
15251
15478
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15252
15479
|
return {
|
|
15253
15480
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15259,7 +15486,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15259
15486
|
type: "delete",
|
|
15260
15487
|
expire_at: 0
|
|
15261
15488
|
};
|
|
15262
|
-
const proof =
|
|
15489
|
+
const proof = chunkJZWLXNHV_cjs.Intent.create(message, coins, []);
|
|
15263
15490
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15264
15491
|
return {
|
|
15265
15492
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15271,7 +15498,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15271
15498
|
type: "get-pending-tx",
|
|
15272
15499
|
expire_at: 0
|
|
15273
15500
|
};
|
|
15274
|
-
const proof =
|
|
15501
|
+
const proof = chunkJZWLXNHV_cjs.Intent.create(message, coins, []);
|
|
15275
15502
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15276
15503
|
return {
|
|
15277
15504
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15292,7 +15519,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15292
15519
|
if (!vtxos || vtxos.length === 0) {
|
|
15293
15520
|
const scriptMap = await this.getScriptMap();
|
|
15294
15521
|
const allExtended = [];
|
|
15295
|
-
const fetchedVtxos = await
|
|
15522
|
+
const fetchedVtxos = await chunkJZWLXNHV_cjs.getAllNormalizedVtxos(this.indexerProvider, [
|
|
15296
15523
|
...scriptMap.keys()
|
|
15297
15524
|
]);
|
|
15298
15525
|
for (const vtxo of fetchedVtxos) {
|
|
@@ -15336,7 +15563,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15336
15563
|
try {
|
|
15337
15564
|
const checkpointTxs = pendingTx.signedCheckpointTxs.map((c) => {
|
|
15338
15565
|
const tx = btcSigner.Transaction.fromPSBT(base.base64.decode(c));
|
|
15339
|
-
|
|
15566
|
+
chunkJZWLXNHV_cjs.assertAllowedSighashTypes(tx);
|
|
15340
15567
|
return tx;
|
|
15341
15568
|
});
|
|
15342
15569
|
assertCheckpointsMatchInputs(
|
|
@@ -15408,11 +15635,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15408
15635
|
* against the current key alone would leave it pending forever.
|
|
15409
15636
|
*/
|
|
15410
15637
|
checkpointUnrollCandidates(info) {
|
|
15411
|
-
const current =
|
|
15638
|
+
const current = chunkJZWLXNHV_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
|
|
15412
15639
|
const candidates = [this._serverUnrollScript, current];
|
|
15413
15640
|
for (const deprecated of signerSetFromInfo(info).deprecated.keys()) {
|
|
15414
15641
|
candidates.push(
|
|
15415
|
-
|
|
15642
|
+
chunkJZWLXNHV_cjs.CSVMultisigTapscript.encode({
|
|
15416
15643
|
...current.params,
|
|
15417
15644
|
pubkeys: [base.hex.decode(deprecated)]
|
|
15418
15645
|
})
|
|
@@ -15503,7 +15730,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15503
15730
|
if (vtxos.length === 0) {
|
|
15504
15731
|
throw new Error("No VTXOs found for this arkadeCash");
|
|
15505
15732
|
}
|
|
15506
|
-
const myPkScript =
|
|
15733
|
+
const myPkScript = chunkJZWLXNHV_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
|
|
15507
15734
|
let { spendable, unclaimed } = this.classifyCashVtxos(vtxos);
|
|
15508
15735
|
let swept = 0;
|
|
15509
15736
|
const drainable = vtxos.filter(
|
|
@@ -15579,7 +15806,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15579
15806
|
const spendable = [];
|
|
15580
15807
|
const unclaimed = [];
|
|
15581
15808
|
for (const vtxo of vtxos) {
|
|
15582
|
-
if (
|
|
15809
|
+
if (chunkJZWLXNHV_cjs.hasTerminalSpend(vtxo)) {
|
|
15583
15810
|
unclaimed.push(cashReport(vtxo, "already-spent"));
|
|
15584
15811
|
} else if (vtxo.isUnrolled) {
|
|
15585
15812
|
unclaimed.push(cashReport(vtxo, "exited"));
|
|
@@ -15601,7 +15828,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15601
15828
|
const all = [];
|
|
15602
15829
|
const seen = /* @__PURE__ */ new Set();
|
|
15603
15830
|
for (let pageIndex = 0; ; pageIndex++) {
|
|
15604
|
-
const { vtxos, page } = await
|
|
15831
|
+
const { vtxos, page } = await chunkJZWLXNHV_cjs.getNormalizedVtxos(this.indexerProvider, {
|
|
15605
15832
|
scripts,
|
|
15606
15833
|
pageIndex,
|
|
15607
15834
|
pageSize
|
|
@@ -15648,7 +15875,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15648
15875
|
for (let i = 0; i < inputs.length; i += MAX_INPUTS_PER_INTENT) {
|
|
15649
15876
|
const batch = inputs.slice(i, i + MAX_INPUTS_PER_INTENT);
|
|
15650
15877
|
const message = { type: "get-pending-tx", expire_at: 0 };
|
|
15651
|
-
const proof =
|
|
15878
|
+
const proof = chunkJZWLXNHV_cjs.Intent.create(message, batch, []);
|
|
15652
15879
|
const signedProof = await identity.sign(
|
|
15653
15880
|
proof,
|
|
15654
15881
|
Array.from({ length: batch.length + 1 }, (_, j) => j)
|
|
@@ -15670,7 +15897,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15670
15897
|
try {
|
|
15671
15898
|
const checkpointTxs = pendingTx.signedCheckpointTxs.map((checkpoint) => {
|
|
15672
15899
|
const tx = btcSigner.Transaction.fromPSBT(base.base64.decode(checkpoint));
|
|
15673
|
-
|
|
15900
|
+
chunkJZWLXNHV_cjs.assertAllowedSighashTypes(tx);
|
|
15674
15901
|
return tx;
|
|
15675
15902
|
});
|
|
15676
15903
|
assertCheckpointsMatchInputs(
|
|
@@ -15869,7 +16096,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
15869
16096
|
script: recipient.script,
|
|
15870
16097
|
amount: BigInt(recipient.amount),
|
|
15871
16098
|
// Already checked against the recipient address in `validateRecipients`.
|
|
15872
|
-
...recipient.tapTree ? { tapTree:
|
|
16099
|
+
...recipient.tapTree ? { tapTree: chunkJZWLXNHV_cjs.TapTreeCoder.decode(recipient.tapTree) } : {}
|
|
15873
16100
|
}));
|
|
15874
16101
|
const totalBtcOutput = outputs.reduce((sum, o) => sum + Number(o.amount), 0);
|
|
15875
16102
|
let changeAmount = totalBtcSelected - totalBtcOutput;
|
|
@@ -16013,10 +16240,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16013
16240
|
const serverPubKey = this.arkServerPublicKey;
|
|
16014
16241
|
const serverUnrollScript = this.serverUnrollScript;
|
|
16015
16242
|
const arkAddress = offchainTapscript.address(this.network.hrp, serverPubKey);
|
|
16016
|
-
const normalizedInputs = inputs.map(
|
|
16017
|
-
const at = now ?? await
|
|
16243
|
+
const normalizedInputs = inputs.map(chunkJZWLXNHV_cjs.normalizeVtxo);
|
|
16244
|
+
const at = now ?? await chunkJZWLXNHV_cjs.resolveTimeHeight(this.onchainProvider);
|
|
16018
16245
|
for (const input of normalizedInputs) {
|
|
16019
|
-
if (!
|
|
16246
|
+
if (!chunkJZWLXNHV_cjs.canSpendOffchain(input, at)) {
|
|
16020
16247
|
throw new Error(
|
|
16021
16248
|
`sendSelectedVtxosToSelf: input ${input.txid}:${input.vout} is not cooperatively spendable`
|
|
16022
16249
|
);
|
|
@@ -16086,7 +16313,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16086
16313
|
);
|
|
16087
16314
|
const arkTxJobs = inputs.map((input, index) => ({
|
|
16088
16315
|
index,
|
|
16089
|
-
lookupScript:
|
|
16316
|
+
lookupScript: chunkJZWLXNHV_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
16090
16317
|
}));
|
|
16091
16318
|
const identity = this.identity;
|
|
16092
16319
|
const signer = {
|
|
@@ -16172,14 +16399,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16172
16399
|
const spentBy = checkpointIdByOutpoint.get(`${vtxo.txid}:${vtxo.vout}`);
|
|
16173
16400
|
spentVtxos.push({
|
|
16174
16401
|
...spentFacts,
|
|
16175
|
-
virtualStatus:
|
|
16402
|
+
virtualStatus: chunkJZWLXNHV_cjs.toVirtualStatus(spentFacts),
|
|
16176
16403
|
...spentBy ? { spentBy } : {},
|
|
16177
16404
|
arkTxId: arkTxid
|
|
16178
16405
|
});
|
|
16179
16406
|
for (const id of vtxo.commitmentTxIds) {
|
|
16180
16407
|
commitmentTxIds.add(id);
|
|
16181
16408
|
}
|
|
16182
|
-
const vtxoExpiry =
|
|
16409
|
+
const vtxoExpiry = chunkJZWLXNHV_cjs.toBatchExpiry(vtxo);
|
|
16183
16410
|
if (vtxoExpiry) {
|
|
16184
16411
|
batchExpiry = Math.min(batchExpiry, vtxoExpiry);
|
|
16185
16412
|
}
|
|
@@ -16192,7 +16419,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16192
16419
|
isSwept: false,
|
|
16193
16420
|
isPreconfirmed: true,
|
|
16194
16421
|
commitmentTxIds: Array.from(commitmentTxIds),
|
|
16195
|
-
...
|
|
16422
|
+
...chunkJZWLXNHV_cjs.parseLegacyExpiry(batchExpiry)
|
|
16196
16423
|
};
|
|
16197
16424
|
changeVtxo = {
|
|
16198
16425
|
txid: arkTxid,
|
|
@@ -16204,7 +16431,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16204
16431
|
tapTree: offchainTapscript.encode(),
|
|
16205
16432
|
value: Number(changeAmount),
|
|
16206
16433
|
...changeFacts,
|
|
16207
|
-
virtualStatus:
|
|
16434
|
+
virtualStatus: chunkJZWLXNHV_cjs.toVirtualStatus(changeFacts),
|
|
16208
16435
|
spentBy: "",
|
|
16209
16436
|
status: {
|
|
16210
16437
|
confirmed: false
|
|
@@ -16273,12 +16500,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16273
16500
|
const spentVtxos = [];
|
|
16274
16501
|
const inputArkTxIds = /* @__PURE__ */ new Set();
|
|
16275
16502
|
const boardingRemovalsByAddress = /* @__PURE__ */ new Map();
|
|
16276
|
-
const vtxoInputs = inputs.filter(
|
|
16503
|
+
const vtxoInputs = inputs.filter(chunkJZWLXNHV_cjs.isVirtualCoin);
|
|
16277
16504
|
const cm = await this.getContractManager();
|
|
16278
16505
|
const annotatedVtxos = await cm.annotateVtxos(vtxoInputs);
|
|
16279
16506
|
const annotatedByKey = new Map(annotatedVtxos.map((v) => [`${v.txid}:${v.vout}`, v]));
|
|
16280
16507
|
for (const input of inputs) {
|
|
16281
|
-
if (
|
|
16508
|
+
if (chunkJZWLXNHV_cjs.isVirtualCoin(input)) {
|
|
16282
16509
|
const outpoint = `${input.txid}:${input.vout}`;
|
|
16283
16510
|
const vtxo = annotatedByKey.get(outpoint);
|
|
16284
16511
|
if (!vtxo) {
|
|
@@ -16290,13 +16517,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16290
16517
|
const settledFacts = { ...vtxo, isSpent: true };
|
|
16291
16518
|
spentVtxos.push({
|
|
16292
16519
|
...settledFacts,
|
|
16293
|
-
virtualStatus:
|
|
16520
|
+
virtualStatus: chunkJZWLXNHV_cjs.toVirtualStatus(settledFacts),
|
|
16294
16521
|
settledBy: commitmentTxid
|
|
16295
16522
|
});
|
|
16296
16523
|
} else {
|
|
16297
16524
|
let sourceAddress;
|
|
16298
16525
|
try {
|
|
16299
|
-
sourceAddress =
|
|
16526
|
+
sourceAddress = chunkJZWLXNHV_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
|
|
16300
16527
|
this.network
|
|
16301
16528
|
);
|
|
16302
16529
|
} catch {
|
|
@@ -16354,9 +16581,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
16354
16581
|
}
|
|
16355
16582
|
};
|
|
16356
16583
|
function selectVirtualCoins(coins, targetAmount) {
|
|
16357
|
-
const sortedCoins = coins.map(
|
|
16358
|
-
const expiryA =
|
|
16359
|
-
const expiryB =
|
|
16584
|
+
const sortedCoins = coins.map(chunkJZWLXNHV_cjs.normalizeVtxo).sort((a, b) => {
|
|
16585
|
+
const expiryA = chunkJZWLXNHV_cjs.toBatchExpiry(a) || Number.MAX_SAFE_INTEGER;
|
|
16586
|
+
const expiryB = chunkJZWLXNHV_cjs.toBatchExpiry(b) || Number.MAX_SAFE_INTEGER;
|
|
16360
16587
|
if (expiryA !== expiryB) {
|
|
16361
16588
|
return expiryA - expiryB;
|
|
16362
16589
|
}
|
|
@@ -16383,19 +16610,53 @@ function selectVirtualCoins(coins, targetAmount) {
|
|
|
16383
16610
|
changeAmount
|
|
16384
16611
|
};
|
|
16385
16612
|
}
|
|
16386
|
-
|
|
16613
|
+
var AbortError = class extends Error {
|
|
16614
|
+
constructor(message = "Operation aborted") {
|
|
16615
|
+
super(message);
|
|
16616
|
+
this.name = "AbortError";
|
|
16617
|
+
}
|
|
16618
|
+
};
|
|
16619
|
+
function abortReason(signal) {
|
|
16620
|
+
const { reason } = signal;
|
|
16621
|
+
if (reason instanceof Error) return reason;
|
|
16622
|
+
return new AbortError(typeof reason === "string" ? reason : void 0);
|
|
16623
|
+
}
|
|
16624
|
+
async function waitForIncomingFunds(wallet, options) {
|
|
16625
|
+
const { signal, timeoutMs } = options ?? {};
|
|
16626
|
+
if (signal?.aborted) throw abortReason(signal);
|
|
16387
16627
|
let stopFunc;
|
|
16388
16628
|
let settled = false;
|
|
16389
|
-
|
|
16629
|
+
let timeoutId;
|
|
16630
|
+
let onAbort;
|
|
16631
|
+
return new Promise((resolve, reject) => {
|
|
16632
|
+
const settle = (deliver) => {
|
|
16633
|
+
if (settled) return;
|
|
16634
|
+
settled = true;
|
|
16635
|
+
if (timeoutId !== void 0) clearTimeout(timeoutId);
|
|
16636
|
+
if (onAbort) signal?.removeEventListener("abort", onAbort);
|
|
16637
|
+
stopFunc?.();
|
|
16638
|
+
deliver();
|
|
16639
|
+
};
|
|
16640
|
+
const cancel = (reason) => settle(() => reject(reason));
|
|
16641
|
+
if (signal) {
|
|
16642
|
+
onAbort = () => cancel(abortReason(signal));
|
|
16643
|
+
signal.addEventListener("abort", onAbort);
|
|
16644
|
+
}
|
|
16645
|
+
if (timeoutMs !== void 0) {
|
|
16646
|
+
timeoutId = setTimeout(
|
|
16647
|
+
() => cancel(new AbortError(`waitForIncomingFunds timed out after ${timeoutMs}ms`)),
|
|
16648
|
+
timeoutMs
|
|
16649
|
+
);
|
|
16650
|
+
}
|
|
16390
16651
|
wallet.notifyIncomingFunds((funds) => {
|
|
16391
16652
|
const hasFunds = funds.type === "utxo" ? funds.coins.length > 0 : funds.newVtxos.length > 0;
|
|
16392
16653
|
if (settled || !hasFunds) return;
|
|
16393
|
-
|
|
16394
|
-
resolve(funds);
|
|
16395
|
-
stopFunc?.();
|
|
16654
|
+
settle(() => resolve(funds));
|
|
16396
16655
|
}).then((stop) => {
|
|
16397
16656
|
stopFunc = stop;
|
|
16398
16657
|
if (settled) stop();
|
|
16658
|
+
}).catch((error) => {
|
|
16659
|
+
cancel(error);
|
|
16399
16660
|
});
|
|
16400
16661
|
});
|
|
16401
16662
|
}
|
|
@@ -16691,7 +16952,7 @@ var MessageBus = class {
|
|
|
16691
16952
|
this.initialized = true;
|
|
16692
16953
|
}
|
|
16693
16954
|
async buildServices(config) {
|
|
16694
|
-
const arkProvider = new
|
|
16955
|
+
const arkProvider = new chunkJZWLXNHV_cjs.RestArkProvider(config.arkServer.url);
|
|
16695
16956
|
const storage = {
|
|
16696
16957
|
walletRepository: this.walletRepository,
|
|
16697
16958
|
contractRepository: this.contractRepository,
|
|
@@ -17036,7 +17297,7 @@ var offboardNetworkNames = [
|
|
|
17036
17297
|
function offboardDestinationScript(destinationAddress) {
|
|
17037
17298
|
for (const networkName of offboardNetworkNames) {
|
|
17038
17299
|
try {
|
|
17039
|
-
const network =
|
|
17300
|
+
const network = chunkJZWLXNHV_cjs.networks[networkName];
|
|
17040
17301
|
const addr = btcSigner.Address(network).decode(destinationAddress);
|
|
17041
17302
|
return btcSigner.OutScript.encode(addr);
|
|
17042
17303
|
} catch {
|
|
@@ -17100,7 +17361,7 @@ var Ramps = class {
|
|
|
17100
17361
|
}
|
|
17101
17362
|
amount = amount ?? totalAmount;
|
|
17102
17363
|
const offchainAddress = await this.wallet.getAddress();
|
|
17103
|
-
const offchainAddr =
|
|
17364
|
+
const offchainAddr = chunkJZWLXNHV_cjs.ArkAddress.decode(offchainAddress);
|
|
17104
17365
|
const offchainScript = base.hex.encode(offchainAddr.pkScript);
|
|
17105
17366
|
const outputFee = estimator.evalOffchainOutput({
|
|
17106
17367
|
amount,
|
|
@@ -17160,7 +17421,7 @@ var Ramps = class {
|
|
|
17160
17421
|
const filteredVtxos = [];
|
|
17161
17422
|
let totalAmount = 0n;
|
|
17162
17423
|
for (const vtxo of vtxos) {
|
|
17163
|
-
const inputFee = estimator.evalOffchainInput(
|
|
17424
|
+
const inputFee = estimator.evalOffchainInput(chunkJZWLXNHV_cjs.toOffchainInputFeeParams(vtxo));
|
|
17164
17425
|
if (inputFee.satoshis >= vtxo.value) {
|
|
17165
17426
|
continue;
|
|
17166
17427
|
}
|
|
@@ -18039,7 +18300,7 @@ var WalletMessageHandler = class {
|
|
|
18039
18300
|
// Wallet methods
|
|
18040
18301
|
async handleInitWallet({ payload }) {
|
|
18041
18302
|
const { arkServerUrl } = payload;
|
|
18042
|
-
this.indexerProvider = new
|
|
18303
|
+
this.indexerProvider = new chunkNVZJSKZS_cjs.RestIndexerProvider(arkServerUrl);
|
|
18043
18304
|
await this.onWalletInitialized();
|
|
18044
18305
|
}
|
|
18045
18306
|
/**
|
|
@@ -18328,7 +18589,7 @@ var WalletMessageHandler = class {
|
|
|
18328
18589
|
if (v.isUnrolled) {
|
|
18329
18590
|
return withUnrolled;
|
|
18330
18591
|
}
|
|
18331
|
-
if (
|
|
18592
|
+
if (chunkJZWLXNHV_cjs.hasTerminalSpend(v)) {
|
|
18332
18593
|
return false;
|
|
18333
18594
|
}
|
|
18334
18595
|
if (includeRecoverable) {
|
|
@@ -18337,10 +18598,10 @@ var WalletMessageHandler = class {
|
|
|
18337
18598
|
if (dustAmount != null && isSubdust(v, dustAmount)) {
|
|
18338
18599
|
return false;
|
|
18339
18600
|
}
|
|
18340
|
-
if (
|
|
18601
|
+
if (chunkJZWLXNHV_cjs.isRecoverable(v)) {
|
|
18341
18602
|
return false;
|
|
18342
18603
|
}
|
|
18343
|
-
if (
|
|
18604
|
+
if (chunkJZWLXNHV_cjs.isExpired(v)) {
|
|
18344
18605
|
return false;
|
|
18345
18606
|
}
|
|
18346
18607
|
return true;
|
|
@@ -18438,7 +18699,7 @@ var WalletMessageHandler = class {
|
|
|
18438
18699
|
if (!this.readonlyWallet) return null;
|
|
18439
18700
|
const { boardingTxs, commitmentsToIgnore } = await this.readonlyWallet.getBoardingTxs();
|
|
18440
18701
|
const indexerProvider = this.indexerProvider;
|
|
18441
|
-
const resolveTxCreatedAt = indexerProvider ? (txids) =>
|
|
18702
|
+
const resolveTxCreatedAt = indexerProvider ? (txids) => chunkJZWLXNHV_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
|
|
18442
18703
|
return buildTransactionHistory(vtxos, boardingTxs, commitmentsToIgnore, resolveTxCreatedAt);
|
|
18443
18704
|
}
|
|
18444
18705
|
async ensureContractEventBroadcasting() {
|
|
@@ -18501,7 +18762,7 @@ var DEFAULT_MESSAGE_TIMEOUTS = {
|
|
|
18501
18762
|
// budget so the worker's snapshot fallback stays reachable before this
|
|
18502
18763
|
// page deadline fires — lowering it below the budget would time the page
|
|
18503
18764
|
// out while the worker is still seconds from answering from cache.
|
|
18504
|
-
GET_ARKADE_INFO:
|
|
18765
|
+
GET_ARKADE_INFO: chunkJZWLXNHV_cjs.INFO_FETCH_TIMEOUT_MS + 8e3,
|
|
18505
18766
|
INDEXER_GET_VTXOS: 2e4,
|
|
18506
18767
|
INDEXER_GET_VIRTUAL_TXS: 2e4,
|
|
18507
18768
|
GET_VTXOS: 2e4,
|
|
@@ -19114,7 +19375,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19114
19375
|
try {
|
|
19115
19376
|
const response = await this.sendMessage(message);
|
|
19116
19377
|
const { vtxos, page } = response.payload;
|
|
19117
|
-
return { vtxos: vtxos.map(
|
|
19378
|
+
return { vtxos: vtxos.map(chunkJZWLXNHV_cjs.normalizeVtxo), page: page && { ...page } };
|
|
19118
19379
|
} catch (error) {
|
|
19119
19380
|
throw new Error(`Failed to get vtxos: ${error}`, { cause: error });
|
|
19120
19381
|
}
|
|
@@ -19218,7 +19479,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19218
19479
|
};
|
|
19219
19480
|
try {
|
|
19220
19481
|
const response = await this.sendMessage(message);
|
|
19221
|
-
return response.payload.vtxos.map(
|
|
19482
|
+
return response.payload.vtxos.map(chunkJZWLXNHV_cjs.normalizeVtxo);
|
|
19222
19483
|
} catch (error) {
|
|
19223
19484
|
throw new Error(`Failed to get vtxos: ${error}`);
|
|
19224
19485
|
}
|
|
@@ -19243,7 +19504,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19243
19504
|
};
|
|
19244
19505
|
try {
|
|
19245
19506
|
const response = await this.sendMessage(message);
|
|
19246
|
-
return response.payload.vtxos.map(
|
|
19507
|
+
return response.payload.vtxos.map(chunkJZWLXNHV_cjs.normalizeVtxo);
|
|
19247
19508
|
} catch (error) {
|
|
19248
19509
|
throw new Error(`Failed to get spendable vtxos: ${error}`);
|
|
19249
19510
|
}
|
|
@@ -19374,7 +19635,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19374
19635
|
};
|
|
19375
19636
|
try {
|
|
19376
19637
|
const response = await sendContractMessage(message);
|
|
19377
|
-
return response.payload.vtxos.map(
|
|
19638
|
+
return response.payload.vtxos.map(chunkJZWLXNHV_cjs.normalizeVtxo);
|
|
19378
19639
|
} catch (e) {
|
|
19379
19640
|
throw new Error("Failed to annotate vtxos");
|
|
19380
19641
|
}
|
|
@@ -20012,7 +20273,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
|
|
|
20012
20273
|
};
|
|
20013
20274
|
try {
|
|
20014
20275
|
const response = await wallet.sendMessage(message);
|
|
20015
|
-
return response.payload.vtxos.map(
|
|
20276
|
+
return response.payload.vtxos.map(chunkJZWLXNHV_cjs.normalizeVtxo);
|
|
20016
20277
|
} catch (e) {
|
|
20017
20278
|
throw new Error(`Failed to get expiring vtxos: ${e}`);
|
|
20018
20279
|
}
|
|
@@ -20124,12 +20385,12 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
20124
20385
|
* @returns Configured onchain wallet
|
|
20125
20386
|
* @throws Error if the configured identity cannot produce a valid x-only public key
|
|
20126
20387
|
*/
|
|
20127
|
-
static async create(identity, networkName =
|
|
20388
|
+
static async create(identity, networkName = chunkJZWLXNHV_cjs.DEFAULT_NETWORK_NAME, provider) {
|
|
20128
20389
|
const pubkey = await identity.xOnlyPublicKey();
|
|
20129
20390
|
if (!pubkey) {
|
|
20130
20391
|
throw new Error("Invalid configured public key");
|
|
20131
20392
|
}
|
|
20132
|
-
const network =
|
|
20393
|
+
const network = chunkJZWLXNHV_cjs.getNetwork(networkName);
|
|
20133
20394
|
const onchainProvider = provider || new EsploraProvider(ESPLORA_URL[networkName]);
|
|
20134
20395
|
const onchainP2TR = btcSigner.p2tr(pubkey, void 0, network);
|
|
20135
20396
|
return new _OnchainWallet(identity, network, onchainP2TR, onchainProvider);
|
|
@@ -20235,7 +20496,7 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
20235
20496
|
if (!inputs) {
|
|
20236
20497
|
throw new Error("Fee estimation failed");
|
|
20237
20498
|
}
|
|
20238
|
-
let tx = new
|
|
20499
|
+
let tx = new chunkJZWLXNHV_cjs.Transaction();
|
|
20239
20500
|
for (const input of inputs) {
|
|
20240
20501
|
tx.addInput({
|
|
20241
20502
|
txid: input.txid,
|
|
@@ -20293,7 +20554,7 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
20293
20554
|
* @throws If the parent has no anchor, or funding cannot be selected/signed
|
|
20294
20555
|
*/
|
|
20295
20556
|
async bumpAnchor(parentHex, feeRate) {
|
|
20296
|
-
const parent =
|
|
20557
|
+
const parent = chunkJZWLXNHV_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
|
|
20297
20558
|
const coins = (await this.getCoins()).filter((c) => c.status.confirmed);
|
|
20298
20559
|
const child = await this.buildBumpPackage(parent, feeRate, coins);
|
|
20299
20560
|
return [parent.hex, child.hex];
|
|
@@ -20392,6 +20653,7 @@ var ListUnspentMethod = "blockchain.scripthash.listunspent";
|
|
|
20392
20653
|
var MISSING_TRANSACTION = "missingtransaction";
|
|
20393
20654
|
var MAX_FETCH_TRANSACTIONS_ATTEMPTS = 5;
|
|
20394
20655
|
var BLOCK_HEADER_SIZE = 80;
|
|
20656
|
+
var MTP_WINDOW = 11;
|
|
20395
20657
|
function parseBlockHeader(headerHex) {
|
|
20396
20658
|
const headerBytes = base.hex.decode(headerHex);
|
|
20397
20659
|
if (headerBytes.length !== BLOCK_HEADER_SIZE) {
|
|
@@ -20698,6 +20960,8 @@ var ElectrumOnchainProvider = class {
|
|
|
20698
20960
|
ws;
|
|
20699
20961
|
network;
|
|
20700
20962
|
chain;
|
|
20963
|
+
mtpCache;
|
|
20964
|
+
mtpInflight;
|
|
20701
20965
|
async getCoins(address) {
|
|
20702
20966
|
const script = this.encodeAddress(address);
|
|
20703
20967
|
const scriptHash = toScriptHash(script);
|
|
@@ -20953,15 +21217,58 @@ var ElectrumOnchainProvider = class {
|
|
|
20953
21217
|
blockTime
|
|
20954
21218
|
};
|
|
20955
21219
|
}
|
|
21220
|
+
/** `time` is median-time-past, per {@link OnchainProvider.getChainTip};
|
|
21221
|
+
* Electrum serves raw headers and no MTP, so it is computed here. */
|
|
20956
21222
|
async getChainTip() {
|
|
20957
21223
|
const tip = await this.chain.subscribeHeaders();
|
|
20958
21224
|
const { hash, timestamp } = parseBlockHeader(tip.hex);
|
|
20959
21225
|
return {
|
|
20960
21226
|
height: tip.height,
|
|
20961
|
-
time: timestamp,
|
|
21227
|
+
time: await this.medianTimePast(tip.height, timestamp, hash),
|
|
20962
21228
|
hash
|
|
20963
21229
|
};
|
|
20964
21230
|
}
|
|
21231
|
+
/**
|
|
21232
|
+
* Consensus's `GetMedianTimePast`, ending at and including `height`.
|
|
21233
|
+
*
|
|
21234
|
+
* Cached per tip HASH, not height: this runs on every balance read, and
|
|
21235
|
+
* hashing means a reorg at the same height recomputes rather than serving
|
|
21236
|
+
* the orphaned chain's median.
|
|
21237
|
+
*/
|
|
21238
|
+
async medianTimePast(height, tipTime, hash) {
|
|
21239
|
+
if (this.mtpCache?.hash === hash) return this.mtpCache.mtp;
|
|
21240
|
+
if (this.mtpInflight?.hash === hash) return this.mtpInflight.mtp;
|
|
21241
|
+
const mtp = this.readMedianTimePast(height, tipTime, hash).finally(() => {
|
|
21242
|
+
this.mtpInflight = void 0;
|
|
21243
|
+
});
|
|
21244
|
+
this.mtpInflight = { hash, mtp };
|
|
21245
|
+
return mtp;
|
|
21246
|
+
}
|
|
21247
|
+
/** Degrades to the tip's `nTime` rather than throwing — a caller that
|
|
21248
|
+
* cannot read the tip at all is worse off. */
|
|
21249
|
+
async readMedianTimePast(height, tipTime, hash) {
|
|
21250
|
+
const heights = [];
|
|
21251
|
+
for (let h = height - 1; h >= 0 && heights.length < MTP_WINDOW - 1; h--) heights.push(h);
|
|
21252
|
+
if (heights.length === 0) return tipTime;
|
|
21253
|
+
let timestamps;
|
|
21254
|
+
try {
|
|
21255
|
+
const headers = await this.chain.fetchBlockHeaders(heights);
|
|
21256
|
+
timestamps = [
|
|
21257
|
+
tipTime,
|
|
21258
|
+
...headers.map((header) => parseBlockHeader(header.hex).timestamp)
|
|
21259
|
+
];
|
|
21260
|
+
} catch (e) {
|
|
21261
|
+
console.warn(
|
|
21262
|
+
"Failed to fetch the median-time-past window; using the tip's own time",
|
|
21263
|
+
e
|
|
21264
|
+
);
|
|
21265
|
+
return tipTime;
|
|
21266
|
+
}
|
|
21267
|
+
timestamps.sort((a, b) => a - b);
|
|
21268
|
+
const mtp = timestamps[Math.floor(timestamps.length / 2)];
|
|
21269
|
+
this.mtpCache = { hash, mtp };
|
|
21270
|
+
return mtp;
|
|
21271
|
+
}
|
|
20965
21272
|
async watchAddresses(addresses, eventCallback) {
|
|
20966
21273
|
const scripts = addresses.map((addr) => this.encodeAddress(addr));
|
|
20967
21274
|
const scriptHashes = scripts.map(toScriptHash);
|
|
@@ -21154,7 +21461,7 @@ async function resolvePrevTxs(txids, source, onchain) {
|
|
|
21154
21461
|
try {
|
|
21155
21462
|
const { txs } = await source.getVirtualTxs(wanted);
|
|
21156
21463
|
for (const psbt of txs) {
|
|
21157
|
-
const tx =
|
|
21464
|
+
const tx = chunkJZWLXNHV_cjs.Transaction.fromPSBT(base.base64.decode(psbt));
|
|
21158
21465
|
resolved.set(tx.id, tx.toBytes());
|
|
21159
21466
|
}
|
|
21160
21467
|
} catch (err) {
|
|
@@ -21187,7 +21494,7 @@ async function resolvePrevTxs(txids, source, onchain) {
|
|
|
21187
21494
|
async function attachPrevArkTxs(tx, txids, source, onchain) {
|
|
21188
21495
|
const pending = [];
|
|
21189
21496
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
21190
|
-
if (
|
|
21497
|
+
if (chunkJZWLXNHV_cjs.getArkPsbtFields(tx, i, chunkJZWLXNHV_cjs.PrevArkTxField).length === 0) pending.push(i);
|
|
21191
21498
|
}
|
|
21192
21499
|
if (pending.length === 0) return;
|
|
21193
21500
|
const resolved = await resolvePrevTxs(
|
|
@@ -21196,13 +21503,13 @@ async function attachPrevArkTxs(tx, txids, source, onchain) {
|
|
|
21196
21503
|
onchain
|
|
21197
21504
|
);
|
|
21198
21505
|
for (const i of pending) {
|
|
21199
|
-
|
|
21506
|
+
chunkJZWLXNHV_cjs.setArkPsbtField(tx, i, chunkJZWLXNHV_cjs.PrevArkTxField, resolved.get(txidAt(txids, i)));
|
|
21200
21507
|
}
|
|
21201
21508
|
}
|
|
21202
21509
|
async function attachPrevoutTxs(tx, source) {
|
|
21203
21510
|
const pending = [];
|
|
21204
21511
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
21205
|
-
if (
|
|
21512
|
+
if (chunkJZWLXNHV_cjs.getArkPsbtFields(tx, i, chunkJZWLXNHV_cjs.PrevoutTxField).length > 0) continue;
|
|
21206
21513
|
const input = tx.getInput(i);
|
|
21207
21514
|
if (!input?.txid) throw new PrevTxUnavailableError(`input ${i} has no outpoint`);
|
|
21208
21515
|
pending.push({ index: i, txid: base.hex.encode(input.txid) });
|
|
@@ -21213,7 +21520,7 @@ async function attachPrevoutTxs(tx, source) {
|
|
|
21213
21520
|
resolved.set(txid, await source.getRawTransaction(txid));
|
|
21214
21521
|
}
|
|
21215
21522
|
for (const { index, txid } of pending) {
|
|
21216
|
-
|
|
21523
|
+
chunkJZWLXNHV_cjs.setArkPsbtField(tx, index, chunkJZWLXNHV_cjs.PrevoutTxField, resolved.get(txid));
|
|
21217
21524
|
}
|
|
21218
21525
|
}
|
|
21219
21526
|
async function withPrevTxs(coins, source, onchain) {
|
|
@@ -21239,7 +21546,7 @@ exports.BIP322 = void 0;
|
|
|
21239
21546
|
async function sign2(message, identity, network) {
|
|
21240
21547
|
const xOnlyPubKey = await identity.xOnlyPublicKey();
|
|
21241
21548
|
const payment = btcSigner.p2tr(xOnlyPubKey, void 0, network);
|
|
21242
|
-
const toSpend =
|
|
21549
|
+
const toSpend = chunkJZWLXNHV_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
|
|
21243
21550
|
const toSign = craftBIP322ToSignP2TR(toSpend, payment.script, xOnlyPubKey);
|
|
21244
21551
|
const signed = await identity.sign(toSign, [0]);
|
|
21245
21552
|
signed.finalizeIdx(0);
|
|
@@ -21297,7 +21604,7 @@ function verifyP2TR(message, witnessItems, pkScript, pubkey) {
|
|
|
21297
21604
|
if (sighashType !== btcSigner.SigHash.DEFAULT && sighashType !== btcSigner.SigHash.ALL) {
|
|
21298
21605
|
return false;
|
|
21299
21606
|
}
|
|
21300
|
-
const toSpend =
|
|
21607
|
+
const toSpend = chunkJZWLXNHV_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
|
|
21301
21608
|
const toSign = craftBIP322ToSignP2TR(toSpend, pkScript, pubkey);
|
|
21302
21609
|
const sighash = toSign.preimageWitnessV1(0, [pkScript], sighashType, [0n]);
|
|
21303
21610
|
const rawSig = sig.length === 65 ? sig.subarray(0, 64) : sig;
|
|
@@ -21318,7 +21625,7 @@ function verifyP2WPKH(message, witnessItems, pkScript, addressHash) {
|
|
|
21318
21625
|
}
|
|
21319
21626
|
const sighashType = sigWithHash[sigWithHash.length - 1];
|
|
21320
21627
|
const derSig = sigWithHash.subarray(0, sigWithHash.length - 1);
|
|
21321
|
-
const toSpend =
|
|
21628
|
+
const toSpend = chunkJZWLXNHV_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
|
|
21322
21629
|
const toSign = craftBIP322ToSignSimple(toSpend, pkScript);
|
|
21323
21630
|
const scriptCode = btcSigner.OutScript.encode({ type: "pkh", hash: addressHash });
|
|
21324
21631
|
const sighash = toSign.preimageWitnessV0(0, scriptCode, sighashType, 0n);
|
|
@@ -21371,7 +21678,7 @@ function encodeCompactSize(n) {
|
|
|
21371
21678
|
return buf;
|
|
21372
21679
|
}
|
|
21373
21680
|
function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
|
|
21374
|
-
const tx = new
|
|
21681
|
+
const tx = new chunkJZWLXNHV_cjs.Transaction({ version: 0 });
|
|
21375
21682
|
tx.addInput({
|
|
21376
21683
|
txid: toSpend.id,
|
|
21377
21684
|
index: 0,
|
|
@@ -21385,12 +21692,12 @@ function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
|
|
|
21385
21692
|
});
|
|
21386
21693
|
tx.addOutput({
|
|
21387
21694
|
amount: 0n,
|
|
21388
|
-
script:
|
|
21695
|
+
script: chunkJZWLXNHV_cjs.OP_RETURN_EMPTY_PKSCRIPT
|
|
21389
21696
|
});
|
|
21390
21697
|
return tx;
|
|
21391
21698
|
}
|
|
21392
21699
|
function craftBIP322ToSignSimple(toSpend, pkScript) {
|
|
21393
|
-
const tx = new
|
|
21700
|
+
const tx = new chunkJZWLXNHV_cjs.Transaction({ version: 0 });
|
|
21394
21701
|
tx.addInput({
|
|
21395
21702
|
txid: toSpend.id,
|
|
21396
21703
|
index: 0,
|
|
@@ -21402,7 +21709,7 @@ function craftBIP322ToSignSimple(toSpend, pkScript) {
|
|
|
21402
21709
|
});
|
|
21403
21710
|
tx.addOutput({
|
|
21404
21711
|
amount: 0n,
|
|
21405
|
-
script:
|
|
21712
|
+
script: chunkJZWLXNHV_cjs.OP_RETURN_EMPTY_PKSCRIPT
|
|
21406
21713
|
});
|
|
21407
21714
|
return tx;
|
|
21408
21715
|
}
|
|
@@ -21533,7 +21840,7 @@ var RestEmulatorProvider = class {
|
|
|
21533
21840
|
}
|
|
21534
21841
|
};
|
|
21535
21842
|
function finalizeVirtualTx(type, psbtBase64) {
|
|
21536
|
-
const tx =
|
|
21843
|
+
const tx = chunkJZWLXNHV_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
|
|
21537
21844
|
if (type === "INDEXER_CHAINED_TX_TYPE_TREE" /* TREE */) {
|
|
21538
21845
|
const input = tx.getInput(0);
|
|
21539
21846
|
if (!input) {
|
|
@@ -21560,14 +21867,14 @@ var ExitPathError = class extends Error {
|
|
|
21560
21867
|
reason;
|
|
21561
21868
|
};
|
|
21562
21869
|
function delayWeight(sequence) {
|
|
21563
|
-
const t =
|
|
21870
|
+
const t = chunkJZWLXNHV_cjs.sequenceToTimelock(sequence);
|
|
21564
21871
|
return t.type === "blocks" ? Number(t.value) : Number(t.value) / 600;
|
|
21565
21872
|
}
|
|
21566
21873
|
async function resolveUnilateralPath(params) {
|
|
21567
21874
|
const { vtxo, scriptHex, contractRepository } = params;
|
|
21568
21875
|
const contract = contractRepository ? (await contractRepository.getContracts({ script: scriptHex }))[0] : void 0;
|
|
21569
21876
|
if (contract) {
|
|
21570
|
-
const handler =
|
|
21877
|
+
const handler = chunk43FKNLX4_cjs.contractHandlers.get(contract.type);
|
|
21571
21878
|
if (!handler) {
|
|
21572
21879
|
throw new ExitPathError(
|
|
21573
21880
|
"no-handler",
|
|
@@ -21590,12 +21897,12 @@ async function resolveUnilateralPath(params) {
|
|
|
21590
21897
|
paths.sort((a, b) => delayWeight(a.sequence) - delayWeight(b.sequence));
|
|
21591
21898
|
return { selection: paths[0], label: `${contract.type}:unilateral` };
|
|
21592
21899
|
}
|
|
21593
|
-
const decoded =
|
|
21900
|
+
const decoded = chunkJZWLXNHV_cjs.VtxoScript.decode(vtxo.tapTree);
|
|
21594
21901
|
let best;
|
|
21595
21902
|
for (const exit of decoded.exitPaths()) {
|
|
21596
21903
|
const leaf = decoded.findLeaf(base.hex.encode(exit.script));
|
|
21597
21904
|
if (!leaf) continue;
|
|
21598
|
-
const sequence =
|
|
21905
|
+
const sequence = chunkJZWLXNHV_cjs.timelockToSequence(exit.params.timelock);
|
|
21599
21906
|
const weight = delayWeight(sequence);
|
|
21600
21907
|
if (!best || weight < best.weight) {
|
|
21601
21908
|
best = { selection: { leaf, sequence }, weight };
|
|
@@ -21815,7 +22122,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
21815
22122
|
let totalAmount = 0n;
|
|
21816
22123
|
const txWeightEstimator = TxWeightEstimator.create();
|
|
21817
22124
|
for (const vtxo of vtxos) {
|
|
21818
|
-
if (!
|
|
22125
|
+
if (!chunkJZWLXNHV_cjs.canSweepOnchain(vtxo)) {
|
|
21819
22126
|
throw new Error(
|
|
21820
22127
|
`Vtxo ${vtxo.txid}:${vtxo.vout} cannot be swept onchain: it is not fully unrolled (use unroll first), or its exit output was already spent`
|
|
21821
22128
|
);
|
|
@@ -21826,14 +22133,14 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
21826
22133
|
}
|
|
21827
22134
|
const resolved = await resolveUnilateralPath({
|
|
21828
22135
|
vtxo,
|
|
21829
|
-
scriptHex: base.hex.encode(
|
|
22136
|
+
scriptHex: base.hex.encode(chunkJZWLXNHV_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
|
|
21830
22137
|
contractRepository: wallet.contractRepository,
|
|
21831
22138
|
walletPubKeyHex: base.hex.encode(await wallet.identity.xOnlyPublicKey()),
|
|
21832
22139
|
currentTime: Date.now()
|
|
21833
22140
|
});
|
|
21834
22141
|
const spendingLeaf = resolved.selection.leaf;
|
|
21835
22142
|
const sequence = resolved.selection.sequence;
|
|
21836
|
-
const timelock =
|
|
22143
|
+
const timelock = chunkJZWLXNHV_cjs.sequenceToTimelock(sequence);
|
|
21837
22144
|
const elapsed = timelock.type === "blocks" ? chainTip.height >= txStatus.blockHeight + Number(timelock.value) : chainTip.time >= txStatus.blockTime + Number(timelock.value);
|
|
21838
22145
|
if (!elapsed) {
|
|
21839
22146
|
throw new Error(`no available exit path found for vtxo ${vtxo.txid}:${vtxo.vout}`);
|
|
@@ -21846,7 +22153,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
21846
22153
|
sequence,
|
|
21847
22154
|
witnessUtxo: {
|
|
21848
22155
|
amount: BigInt(vtxo.value),
|
|
21849
|
-
script:
|
|
22156
|
+
script: chunkJZWLXNHV_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
|
|
21850
22157
|
},
|
|
21851
22158
|
sighashType: btcSigner.SigHash.DEFAULT
|
|
21852
22159
|
});
|
|
@@ -21856,7 +22163,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
21856
22163
|
btcSigner.TaprootControlBlock.encode(spendingLeaf[0]).length
|
|
21857
22164
|
);
|
|
21858
22165
|
}
|
|
21859
|
-
const tx = new
|
|
22166
|
+
const tx = new chunkJZWLXNHV_cjs.Transaction({ version: 2 });
|
|
21860
22167
|
for (const input of inputs) {
|
|
21861
22168
|
tx.addInput(input);
|
|
21862
22169
|
}
|
|
@@ -21939,7 +22246,7 @@ async function buildSignedSweep(params) {
|
|
|
21939
22246
|
`uneconomic vtxo ${vtxo.txid}:${vtxo.vout}: value ${vtxo.value} - fee ${fee} < dust`
|
|
21940
22247
|
);
|
|
21941
22248
|
}
|
|
21942
|
-
const tx = new
|
|
22249
|
+
const tx = new chunkJZWLXNHV_cjs.Transaction({ version: 2 });
|
|
21943
22250
|
tx.addInput({
|
|
21944
22251
|
txid: vtxo.txid,
|
|
21945
22252
|
index: vtxo.vout,
|
|
@@ -21964,7 +22271,7 @@ async function buildSignedSweep(params) {
|
|
|
21964
22271
|
finalScriptWitness: [
|
|
21965
22272
|
tapScriptSig[0][1],
|
|
21966
22273
|
...path.extraWitness,
|
|
21967
|
-
|
|
22274
|
+
chunkJZWLXNHV_cjs.scriptFromTapLeafScript(path.leaf),
|
|
21968
22275
|
btcSigner.TaprootControlBlock.encode(controlBlock)
|
|
21969
22276
|
]
|
|
21970
22277
|
});
|
|
@@ -21994,7 +22301,7 @@ async function resolveFeeRate(opts) {
|
|
|
21994
22301
|
}
|
|
21995
22302
|
async function selectExitVtxos(opts) {
|
|
21996
22303
|
if (!opts.vtxos) return opts.wallet.getVtxos();
|
|
21997
|
-
const res = await
|
|
22304
|
+
const res = await chunkJZWLXNHV_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
|
|
21998
22305
|
const tapTrees = /* @__PURE__ */ new Map();
|
|
21999
22306
|
const out = [];
|
|
22000
22307
|
for (const vtxo of res.vtxos) {
|
|
@@ -22009,7 +22316,7 @@ async function selectExitVtxos(opts) {
|
|
|
22009
22316
|
`no contract registered for vtxo script ${vtxo.script} \u2014 register the contract before exiting`
|
|
22010
22317
|
);
|
|
22011
22318
|
}
|
|
22012
|
-
const handler =
|
|
22319
|
+
const handler = chunk43FKNLX4_cjs.contractHandlers.get(contract.type);
|
|
22013
22320
|
if (!handler) {
|
|
22014
22321
|
throw new Error(`no contract handler registered for type '${contract.type}'`);
|
|
22015
22322
|
}
|
|
@@ -22039,7 +22346,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
22039
22346
|
if (pendingNodes.length > 0) {
|
|
22040
22347
|
const txs = await resolver.getVirtualTxs(pendingNodes.map((n) => n.txid));
|
|
22041
22348
|
for (const psbt of txs) {
|
|
22042
|
-
psbts.set(
|
|
22349
|
+
psbts.set(chunkJZWLXNHV_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
22043
22350
|
}
|
|
22044
22351
|
}
|
|
22045
22352
|
const childVsize = Number(
|
|
@@ -22075,7 +22382,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
22075
22382
|
try {
|
|
22076
22383
|
const resolved = await resolveUnilateralPath({
|
|
22077
22384
|
vtxo,
|
|
22078
|
-
scriptHex: base.hex.encode(
|
|
22385
|
+
scriptHex: base.hex.encode(chunkJZWLXNHV_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
|
|
22079
22386
|
contractRepository: wallet.contractRepository,
|
|
22080
22387
|
walletPubKeyHex,
|
|
22081
22388
|
currentTime: Date.now()
|
|
@@ -22094,7 +22401,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
22094
22401
|
});
|
|
22095
22402
|
continue;
|
|
22096
22403
|
}
|
|
22097
|
-
const t =
|
|
22404
|
+
const t = chunkJZWLXNHV_cjs.sequenceToTimelock(resolved.selection.sequence);
|
|
22098
22405
|
const delay = { type: t.type, value: Number(t.value) };
|
|
22099
22406
|
infos.push({ outpoint, value: vtxo.value, sweepFee, path: resolved.label, delay });
|
|
22100
22407
|
sweeps.push({ vtxo, resolved, sweepFee, delay });
|
|
@@ -22495,7 +22802,7 @@ async function prepare(opts) {
|
|
|
22495
22802
|
txid: sweep.vtxo.txid,
|
|
22496
22803
|
vout: sweep.vtxo.vout,
|
|
22497
22804
|
value: sweep.vtxo.value,
|
|
22498
|
-
pkScript:
|
|
22805
|
+
pkScript: chunkJZWLXNHV_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
|
|
22499
22806
|
},
|
|
22500
22807
|
path: sweep.resolved.selection,
|
|
22501
22808
|
outputAddress: opts.sweepAddress,
|
|
@@ -22583,7 +22890,7 @@ async function prepare(opts) {
|
|
|
22583
22890
|
if (newFee <= splitterFee) break;
|
|
22584
22891
|
splitterFee = newFee;
|
|
22585
22892
|
}
|
|
22586
|
-
const splitter = new
|
|
22893
|
+
const splitter = new chunkJZWLXNHV_cjs.Transaction({ version: 2 });
|
|
22587
22894
|
for (const coin of selected.inputs) {
|
|
22588
22895
|
splitter.addInput({
|
|
22589
22896
|
txid: coin.txid,
|
|
@@ -22727,41 +23034,41 @@ var UnilateralExit = {
|
|
|
22727
23034
|
// src/arkade/index.ts
|
|
22728
23035
|
var arkade_exports = {};
|
|
22729
23036
|
chunk5BLDMQED_cjs.__export(arkade_exports, {
|
|
22730
|
-
ARKADE_OP: () =>
|
|
22731
|
-
ARKADE_OPCODES: () =>
|
|
22732
|
-
ARKADE_OPCODE_NAMES: () =>
|
|
22733
|
-
ARKADE_OPCODE_VALUES: () =>
|
|
22734
|
-
ARKADE_OPS: () =>
|
|
23037
|
+
ARKADE_OP: () => chunk43FKNLX4_cjs.ARKADE_OP,
|
|
23038
|
+
ARKADE_OPCODES: () => chunk43FKNLX4_cjs.ARKADE_OPCODES,
|
|
23039
|
+
ARKADE_OPCODE_NAMES: () => chunk43FKNLX4_cjs.ARKADE_OPCODE_NAMES,
|
|
23040
|
+
ARKADE_OPCODE_VALUES: () => chunk43FKNLX4_cjs.ARKADE_OPCODE_VALUES,
|
|
23041
|
+
ARKADE_OPS: () => chunk43FKNLX4_cjs.ARKADE_OPS,
|
|
22735
23042
|
Arkade: () => Arkade,
|
|
22736
23043
|
ArkadeContract: () => ArkadeContract,
|
|
22737
|
-
ArkadeProgramScript: () =>
|
|
22738
|
-
ArkadeScript: () =>
|
|
23044
|
+
ArkadeProgramScript: () => chunk43FKNLX4_cjs.ArkadeProgramScript,
|
|
23045
|
+
ArkadeScript: () => chunk43FKNLX4_cjs.ArkadeScript,
|
|
22739
23046
|
ArkadeTransactionBuilder: () => ArkadeTransactionBuilder,
|
|
22740
|
-
BigNum: () =>
|
|
23047
|
+
BigNum: () => chunk43FKNLX4_cjs.bignum_exports,
|
|
22741
23048
|
OP: () => btcSigner.OP,
|
|
22742
|
-
OPCODE_NAMES: () =>
|
|
22743
|
-
OPCODE_VALUES: () =>
|
|
22744
|
-
SUPPORTED_PROGRAM_VERSION: () =>
|
|
23049
|
+
OPCODE_NAMES: () => chunk43FKNLX4_cjs.OPCODE_NAMES,
|
|
23050
|
+
OPCODE_VALUES: () => chunk43FKNLX4_cjs.OPCODE_VALUES,
|
|
23051
|
+
SUPPORTED_PROGRAM_VERSION: () => chunk43FKNLX4_cjs.SUPPORTED_PROGRAM_VERSION,
|
|
22745
23052
|
Script: () => btcSigner.Script,
|
|
22746
|
-
arkadeScriptHash: () =>
|
|
22747
|
-
arkadeWitnessHash: () =>
|
|
22748
|
-
asmToBytes: () =>
|
|
22749
|
-
bytesToASM: () =>
|
|
22750
|
-
computeArkadeScriptPublicKey: () =>
|
|
23053
|
+
arkadeScriptHash: () => chunk43FKNLX4_cjs.arkadeScriptHash,
|
|
23054
|
+
arkadeWitnessHash: () => chunk43FKNLX4_cjs.arkadeWitnessHash,
|
|
23055
|
+
asmToBytes: () => chunk43FKNLX4_cjs.asmToBytes,
|
|
23056
|
+
bytesToASM: () => chunk43FKNLX4_cjs.bytesToASM,
|
|
23057
|
+
computeArkadeScriptPublicKey: () => chunk43FKNLX4_cjs.computeArkadeScriptPublicKey,
|
|
22751
23058
|
createArkadeBatchHandler: () => createArkadeBatchHandler,
|
|
22752
|
-
deserializeArkadeContractParams: () =>
|
|
22753
|
-
fromASM: () =>
|
|
22754
|
-
getOpcodeName: () =>
|
|
22755
|
-
getOpcodeValue: () =>
|
|
22756
|
-
parseArtifact: () =>
|
|
22757
|
-
resolveAsm: () =>
|
|
22758
|
-
serializeArkadeContractParams: () =>
|
|
22759
|
-
stringifyArtifact: () =>
|
|
22760
|
-
toASM: () =>
|
|
22761
|
-
validateProgram: () =>
|
|
22762
|
-
witnessRefToBytes: () =>
|
|
23059
|
+
deserializeArkadeContractParams: () => chunk43FKNLX4_cjs.deserializeArkadeContractParams,
|
|
23060
|
+
fromASM: () => chunk43FKNLX4_cjs.fromASM,
|
|
23061
|
+
getOpcodeName: () => chunk43FKNLX4_cjs.getOpcodeName,
|
|
23062
|
+
getOpcodeValue: () => chunk43FKNLX4_cjs.getOpcodeValue,
|
|
23063
|
+
parseArtifact: () => chunk43FKNLX4_cjs.parseArtifact,
|
|
23064
|
+
resolveAsm: () => chunk43FKNLX4_cjs.resolveAsm,
|
|
23065
|
+
serializeArkadeContractParams: () => chunk43FKNLX4_cjs.serializeArkadeContractParams,
|
|
23066
|
+
stringifyArtifact: () => chunk43FKNLX4_cjs.stringifyArtifact,
|
|
23067
|
+
toASM: () => chunk43FKNLX4_cjs.toASM,
|
|
23068
|
+
validateProgram: () => chunk43FKNLX4_cjs.validateProgram,
|
|
23069
|
+
witnessRefToBytes: () => chunk43FKNLX4_cjs.witnessRefToBytes
|
|
22763
23070
|
});
|
|
22764
|
-
var isVtxoCoin = (input) =>
|
|
23071
|
+
var isVtxoCoin = (input) => chunkJZWLXNHV_cjs.isVirtualCoin(input);
|
|
22765
23072
|
function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message, session, arkProvider, emulator, network, recipients, batchExpiryPolicy) {
|
|
22766
23073
|
let batchId;
|
|
22767
23074
|
let sweepTapTreeRoot;
|
|
@@ -22782,23 +23089,23 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
22782
23089
|
);
|
|
22783
23090
|
await arkProvider.confirmRegistration(intentId);
|
|
22784
23091
|
batchId = event.id;
|
|
22785
|
-
const sweepTapscript =
|
|
23092
|
+
const sweepTapscript = chunkJZWLXNHV_cjs.CSVMultisigTapscript.encode({
|
|
22786
23093
|
timelock,
|
|
22787
|
-
pubkeys: [
|
|
23094
|
+
pubkeys: [chunk43FKNLX4_cjs.toXOnly(base.hex.decode(info.forfeitPubkey), "forfeit key")]
|
|
22788
23095
|
}).script;
|
|
22789
23096
|
sweepTapTreeRoot = payment_js.tapLeafHash(sweepTapscript);
|
|
22790
23097
|
return { skip: false };
|
|
22791
23098
|
},
|
|
22792
23099
|
onTreeSigningStarted: async (event, vtxoTree) => {
|
|
22793
23100
|
const signerPubKey = await session.getPublicKey();
|
|
22794
|
-
const xonlySignerPubKey =
|
|
23101
|
+
const xonlySignerPubKey = chunk43FKNLX4_cjs.toXOnly(signerPubKey, "signer key");
|
|
22795
23102
|
const xOnlyPubkeys = event.cosignersPublicKeys.map(
|
|
22796
|
-
(k) => base.hex.encode(
|
|
23103
|
+
(k) => base.hex.encode(chunk43FKNLX4_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
|
|
22797
23104
|
);
|
|
22798
23105
|
if (!xOnlyPubkeys.includes(base.hex.encode(xonlySignerPubKey))) {
|
|
22799
23106
|
return { skip: true };
|
|
22800
23107
|
}
|
|
22801
|
-
const commitmentTx =
|
|
23108
|
+
const commitmentTx = chunkJZWLXNHV_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
|
|
22802
23109
|
validateVtxoTxGraph(vtxoTree, commitmentTx, sweepTapTreeRoot);
|
|
22803
23110
|
if (recipients && recipients.length > 0) {
|
|
22804
23111
|
validateBatchRecipients(commitmentTx, vtxoTree.leaves(), recipients, network);
|
|
@@ -22830,7 +23137,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
22830
23137
|
if (connectorTree) {
|
|
22831
23138
|
validateConnectorsTxGraph(event.commitmentTx, connectorTree);
|
|
22832
23139
|
}
|
|
22833
|
-
let commitmentPsbt =
|
|
23140
|
+
let commitmentPsbt = chunkJZWLXNHV_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
|
|
22834
23141
|
assertFinalCommitmentMatchesValidated(
|
|
22835
23142
|
commitmentPsbt,
|
|
22836
23143
|
validatedCommitmentTxid,
|
|
@@ -22865,7 +23172,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
22865
23172
|
boardingIndices.push(boardingIdx);
|
|
22866
23173
|
continue;
|
|
22867
23174
|
}
|
|
22868
|
-
if (
|
|
23175
|
+
if (chunkJZWLXNHV_cjs.isRecoverable(input) || isSubdust(input, info.dust)) {
|
|
22869
23176
|
continue;
|
|
22870
23177
|
}
|
|
22871
23178
|
if (connectorIndex >= connectorLeaves.length) {
|
|
@@ -22886,7 +23193,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
22886
23193
|
index: input.vout,
|
|
22887
23194
|
witnessUtxo: {
|
|
22888
23195
|
amount: BigInt(input.value),
|
|
22889
|
-
script:
|
|
23196
|
+
script: chunkJZWLXNHV_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
22890
23197
|
},
|
|
22891
23198
|
sighashType: btcSigner.SigHash.DEFAULT,
|
|
22892
23199
|
tapLeafScript: [input.forfeitTapLeafScript]
|
|
@@ -22977,16 +23284,16 @@ var Arkade = class _Arkade {
|
|
|
22977
23284
|
/** Connect and resolve the server key, checkpoint closure and (if present) the co-signer key. */
|
|
22978
23285
|
static async connect(opts) {
|
|
22979
23286
|
const info = await opts.arkade.getInfo();
|
|
22980
|
-
const serverKey =
|
|
22981
|
-
const checkpoint =
|
|
22982
|
-
const network = opts.network ??
|
|
23287
|
+
const serverKey = chunk43FKNLX4_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
|
|
23288
|
+
const checkpoint = chunkJZWLXNHV_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
|
|
23289
|
+
const network = opts.network ?? chunkJZWLXNHV_cjs.DEFAULT_NETWORK;
|
|
22983
23290
|
let emulatorKey;
|
|
22984
23291
|
if (opts.emulator) {
|
|
22985
|
-
emulatorKey = base.hex.decode(
|
|
23292
|
+
emulatorKey = base.hex.decode(chunkJZWLXNHV_cjs.resolveEmulatorPubkey(network, opts.emulatorPubkey));
|
|
22986
23293
|
}
|
|
22987
23294
|
let userKey;
|
|
22988
23295
|
if (opts.identity) {
|
|
22989
|
-
userKey =
|
|
23296
|
+
userKey = chunk43FKNLX4_cjs.toXOnly(await opts.identity.xOnlyPublicKey(), "identity key");
|
|
22990
23297
|
}
|
|
22991
23298
|
return new _Arkade({
|
|
22992
23299
|
arkProvider: opts.arkade,
|
|
@@ -23012,7 +23319,7 @@ var Arkade = class _Arkade {
|
|
|
23012
23319
|
* key respectively; explicit args always win.
|
|
23013
23320
|
*/
|
|
23014
23321
|
contract(program, args = {}) {
|
|
23015
|
-
const declared = (program.params ?? []).map(
|
|
23322
|
+
const declared = (program.params ?? []).map(chunk43FKNLX4_cjs.inputName);
|
|
23016
23323
|
if (declared.includes("server") && args.server === void 0) {
|
|
23017
23324
|
args = { ...args, server: this.serverKey };
|
|
23018
23325
|
}
|
|
@@ -23032,7 +23339,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
23032
23339
|
userKey: client.userKey,
|
|
23033
23340
|
emulatorKey: client.emulatorKey
|
|
23034
23341
|
};
|
|
23035
|
-
this.vtxoScript = new
|
|
23342
|
+
this.vtxoScript = new chunk43FKNLX4_cjs.ArkadeProgramScript(program, args, this.keys);
|
|
23036
23343
|
this.tapTree = this.vtxoScript.encode();
|
|
23037
23344
|
this.compiled = this.vtxoScript.compiled;
|
|
23038
23345
|
}
|
|
@@ -23060,7 +23367,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
23060
23367
|
`ArkadeContract.fromContract: expected contract type 'arkade', got '${contract.type}'`
|
|
23061
23368
|
);
|
|
23062
23369
|
}
|
|
23063
|
-
const typed =
|
|
23370
|
+
const typed = chunk43FKNLX4_cjs.deserializeArkadeContractParams(contract.params);
|
|
23064
23371
|
return new _ArkadeContract(client, typed.program, typed.args, {
|
|
23065
23372
|
serverKey: typed.serverKey,
|
|
23066
23373
|
userKey: typed.userKey,
|
|
@@ -23101,7 +23408,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
23101
23408
|
toContractParams() {
|
|
23102
23409
|
return {
|
|
23103
23410
|
type: "arkade",
|
|
23104
|
-
params:
|
|
23411
|
+
params: chunk43FKNLX4_cjs.serializeArkadeContractParams({
|
|
23105
23412
|
program: this.program,
|
|
23106
23413
|
args: this.args,
|
|
23107
23414
|
serverKey: this.keys.serverKey,
|
|
@@ -23151,18 +23458,18 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
23151
23458
|
if (registered) {
|
|
23152
23459
|
const [withVtxos] = await manager.getContractsWithVtxos({ script: scriptHex });
|
|
23153
23460
|
return (withVtxos?.vtxos ?? []).filter(
|
|
23154
|
-
(v) => !
|
|
23461
|
+
(v) => !chunkJZWLXNHV_cjs.hasTerminalSpend(v) && !v.isUnrolled
|
|
23155
23462
|
);
|
|
23156
23463
|
}
|
|
23157
23464
|
}
|
|
23158
23465
|
if (!this.client.indexer) {
|
|
23159
23466
|
throw new Error("ArkadeContract.getUtxos: an indexer is required");
|
|
23160
23467
|
}
|
|
23161
|
-
const { vtxos } = await
|
|
23468
|
+
const { vtxos } = await chunkJZWLXNHV_cjs.getNormalizedVtxos(this.client.indexer, {
|
|
23162
23469
|
scripts: [scriptHex],
|
|
23163
23470
|
spendableOnly: true
|
|
23164
23471
|
});
|
|
23165
|
-
return vtxos.filter((v) => !
|
|
23472
|
+
return vtxos.filter((v) => !chunkJZWLXNHV_cjs.hasTerminalSpend(v) && !v.isUnrolled);
|
|
23166
23473
|
}
|
|
23167
23474
|
/** Total spendable balance (requires an indexer). */
|
|
23168
23475
|
async getBalance() {
|
|
@@ -23260,7 +23567,7 @@ var ArkadeTransactionBuilder = class {
|
|
|
23260
23567
|
this.contract.client.checkpoint
|
|
23261
23568
|
);
|
|
23262
23569
|
if (coin.sourceTx) {
|
|
23263
|
-
|
|
23570
|
+
chunkJZWLXNHV_cjs.setArkPsbtField(arkTx, 0, chunkJZWLXNHV_cjs.PrevArkTxField, coin.sourceTx);
|
|
23264
23571
|
}
|
|
23265
23572
|
if (this.fn.arkadeScript) {
|
|
23266
23573
|
const indexer = this.contract.client.indexer;
|
|
@@ -23277,8 +23584,8 @@ var ArkadeTransactionBuilder = class {
|
|
|
23277
23584
|
}
|
|
23278
23585
|
const condition = (def.tapscript.witness ?? []).map((w) => this.witnessBytes(w));
|
|
23279
23586
|
if (condition.length > 0) {
|
|
23280
|
-
|
|
23281
|
-
|
|
23587
|
+
chunkJZWLXNHV_cjs.setArkPsbtField(arkTx, 0, chunkJZWLXNHV_cjs.ConditionWitness, condition);
|
|
23588
|
+
chunkJZWLXNHV_cjs.setArkPsbtField(checkpoints[0], 0, chunkJZWLXNHV_cjs.ConditionWitness, condition);
|
|
23282
23589
|
}
|
|
23283
23590
|
const packets = [];
|
|
23284
23591
|
if (this.assetSpecs.length > 0) {
|
|
@@ -23317,7 +23624,7 @@ var ArkadeTransactionBuilder = class {
|
|
|
23317
23624
|
base.base64.encode(signedArk2.toPSBT()),
|
|
23318
23625
|
signedCps.map((c) => base.base64.encode(c.toPSBT()))
|
|
23319
23626
|
);
|
|
23320
|
-
const txid =
|
|
23627
|
+
const txid = chunkJZWLXNHV_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
|
|
23321
23628
|
return {
|
|
23322
23629
|
txid,
|
|
23323
23630
|
signedArkTx: res2.signedArkTx,
|
|
@@ -23382,23 +23689,23 @@ var ArkadeTransactionBuilder = class {
|
|
|
23382
23689
|
}
|
|
23383
23690
|
buildAssetPacket() {
|
|
23384
23691
|
const groups = this.assetSpecs.map((s) => {
|
|
23385
|
-
const id = typeof s.assetId === "string" ?
|
|
23386
|
-
return
|
|
23692
|
+
const id = typeof s.assetId === "string" ? chunkNVZJSKZS_cjs.AssetId.fromString(s.assetId) : chunkNVZJSKZS_cjs.AssetId.fromBytes(s.assetId);
|
|
23693
|
+
return chunkNVZJSKZS_cjs.AssetGroup.create(
|
|
23387
23694
|
id,
|
|
23388
23695
|
null,
|
|
23389
|
-
s.inputs.map((i) =>
|
|
23390
|
-
s.outputs.map((o) =>
|
|
23391
|
-
(s.metadata ?? []).map((m) =>
|
|
23696
|
+
s.inputs.map((i) => chunkNVZJSKZS_cjs.AssetInput.create(i.vin, i.amount)),
|
|
23697
|
+
s.outputs.map((o) => chunkNVZJSKZS_cjs.AssetOutput.create(o.vout, o.amount)),
|
|
23698
|
+
(s.metadata ?? []).map((m) => chunkNVZJSKZS_cjs.Metadata.create(m.key, m.value))
|
|
23392
23699
|
);
|
|
23393
23700
|
});
|
|
23394
|
-
return
|
|
23701
|
+
return chunkNVZJSKZS_cjs.Packet.create(groups);
|
|
23395
23702
|
}
|
|
23396
23703
|
witnessBytes(ref) {
|
|
23397
|
-
return
|
|
23704
|
+
return chunk43FKNLX4_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
|
|
23398
23705
|
}
|
|
23399
23706
|
};
|
|
23400
23707
|
function bindInputs(fn, callArgs) {
|
|
23401
|
-
const names = (fn.def.inputs ?? []).map(
|
|
23708
|
+
const names = (fn.def.inputs ?? []).map(chunk43FKNLX4_cjs.inputName);
|
|
23402
23709
|
if (callArgs.length !== names.length) {
|
|
23403
23710
|
throw new Error(`${fn.name}: expected ${names.length} argument(s), got ${callArgs.length}`);
|
|
23404
23711
|
}
|
|
@@ -23592,6 +23899,33 @@ function tryResolveSendAmount(raw, amount) {
|
|
|
23592
23899
|
const amt = amount ?? BIP21.amountSats(raw);
|
|
23593
23900
|
return amt !== void 0 && Number.isInteger(amt) && amt > 0 ? amt : void 0;
|
|
23594
23901
|
}
|
|
23902
|
+
function assetsOf(req) {
|
|
23903
|
+
return req.assets ?? [];
|
|
23904
|
+
}
|
|
23905
|
+
function assertNoAssets(railId, req) {
|
|
23906
|
+
const assets = assetsOf(req);
|
|
23907
|
+
if (assets.length > 0) {
|
|
23908
|
+
throw new Error(
|
|
23909
|
+
`${railId}: cannot deliver ${assets.map((a) => a.assetId).join(", ")} \u2014 this rail moves BTC only`
|
|
23910
|
+
);
|
|
23911
|
+
}
|
|
23912
|
+
}
|
|
23913
|
+
function resolveAssetAmount(railId, req) {
|
|
23914
|
+
const assets = assetsOf(req);
|
|
23915
|
+
if (assets.length !== 1) {
|
|
23916
|
+
throw new Error(`${railId}: expected exactly one asset to pay, got ${assets.length}`);
|
|
23917
|
+
}
|
|
23918
|
+
const [asset] = assets;
|
|
23919
|
+
if (typeof asset.amount !== "bigint" || asset.amount <= 0n) {
|
|
23920
|
+
throw new Error(
|
|
23921
|
+
`${railId}: invalid amount ${String(asset.amount)} of ${asset.assetId} (expected a positive bigint of atomic units)`
|
|
23922
|
+
);
|
|
23923
|
+
}
|
|
23924
|
+
if (typeof asset.assetId !== "string" || asset.assetId.length === 0) {
|
|
23925
|
+
throw new Error(`${railId}: an asset amount must name an asset`);
|
|
23926
|
+
}
|
|
23927
|
+
return asset;
|
|
23928
|
+
}
|
|
23595
23929
|
|
|
23596
23930
|
// src/payment/handle.ts
|
|
23597
23931
|
function makeHandle(id, run) {
|
|
@@ -23714,8 +24048,10 @@ function arkRail() {
|
|
|
23714
24048
|
return {
|
|
23715
24049
|
id: "ark",
|
|
23716
24050
|
match: (req) => arkTarget(req.raw) !== void 0,
|
|
24051
|
+
available: (req) => assetsOf(req).length === 0,
|
|
23717
24052
|
quote: async (req, ctx) => {
|
|
23718
24053
|
const address = arkTarget(req.raw);
|
|
24054
|
+
assertNoAssets("ark", req);
|
|
23719
24055
|
const amt = resolveSendAmount("ark", req.raw, req.amount);
|
|
23720
24056
|
return {
|
|
23721
24057
|
railId: "ark",
|
|
@@ -23732,6 +24068,40 @@ function arkRail() {
|
|
|
23732
24068
|
}
|
|
23733
24069
|
};
|
|
23734
24070
|
}
|
|
24071
|
+
|
|
24072
|
+
// src/payment/rails/arkAsset.ts
|
|
24073
|
+
var ASSET_CARRIER_SATS = 330;
|
|
24074
|
+
function arkAssetRail() {
|
|
24075
|
+
return {
|
|
24076
|
+
id: "ark-asset",
|
|
24077
|
+
match: (req) => arkTarget(req.raw) !== void 0,
|
|
24078
|
+
// A malformed asset is `quote()`'s to name, not this rail's to drop.
|
|
24079
|
+
available: (req) => assetsOf(req).length > 0,
|
|
24080
|
+
quote: async (req, ctx) => {
|
|
24081
|
+
const address = arkTarget(req.raw);
|
|
24082
|
+
const asset = resolveAssetAmount("ark-asset", req);
|
|
24083
|
+
if (req.amount !== void 0) assertSendableAmount("ark-asset", req.amount);
|
|
24084
|
+
const carrier = tryResolveSendAmount(req.raw, req.amount) ?? ASSET_CARRIER_SATS;
|
|
24085
|
+
return {
|
|
24086
|
+
railId: "ark-asset",
|
|
24087
|
+
amount: carrier,
|
|
24088
|
+
fee: 0,
|
|
24089
|
+
total: carrier,
|
|
24090
|
+
assets: { delivered: asset, spent: asset },
|
|
24091
|
+
send: async () => makeHandle("ark-asset", async (emit) => {
|
|
24092
|
+
const txid = await ctx.wallet.send({
|
|
24093
|
+
address,
|
|
24094
|
+
amount: carrier,
|
|
24095
|
+
assets: [asset]
|
|
24096
|
+
});
|
|
24097
|
+
const result = { railId: "ark-asset", txid };
|
|
24098
|
+
emit({ status: "settled", result });
|
|
24099
|
+
return result;
|
|
24100
|
+
})
|
|
24101
|
+
};
|
|
24102
|
+
}
|
|
24103
|
+
};
|
|
24104
|
+
}
|
|
23735
24105
|
var GROSS_UP_MAX_ROUNDS = 8;
|
|
23736
24106
|
function grossUpOffboard(net, feeInfo, script) {
|
|
23737
24107
|
const estimator = new Estimator(feeInfo?.intentFee ?? {});
|
|
@@ -23748,7 +24118,10 @@ function onchainRail() {
|
|
|
23748
24118
|
return {
|
|
23749
24119
|
id: "onchain",
|
|
23750
24120
|
match: (req) => btcTarget(req.raw) !== void 0,
|
|
24121
|
+
// BTC only: an Arkade asset has no L1 representation to offboard to.
|
|
24122
|
+
available: (req) => assetsOf(req).length === 0,
|
|
23751
24123
|
quote: async (req, ctx) => {
|
|
24124
|
+
assertNoAssets("onchain", req);
|
|
23752
24125
|
const address = btcTarget(req.raw);
|
|
23753
24126
|
const amt = resolveSendAmount("onchain", req.raw, req.amount);
|
|
23754
24127
|
const { fees } = await ctx.wallet.arkProvider.getInfo();
|
|
@@ -23778,8 +24151,8 @@ function onchainRail() {
|
|
|
23778
24151
|
function createDefaultPaymentRouter(wallet) {
|
|
23779
24152
|
return new PaymentRouter({
|
|
23780
24153
|
wallet,
|
|
23781
|
-
prefs: { priority: ["ark", "onchain"] }
|
|
23782
|
-
}).use(arkRail()).use(onchainRail());
|
|
24154
|
+
prefs: { priority: ["ark", "ark-asset", "onchain"] }
|
|
24155
|
+
}).use(arkRail()).use(arkAssetRail()).use(onchainRail());
|
|
23783
24156
|
}
|
|
23784
24157
|
/*! Bundled license information:
|
|
23785
24158
|
|
|
@@ -23790,6 +24163,8 @@ function createDefaultPaymentRouter(wallet) {
|
|
|
23790
24163
|
exports.ARKADE_MAGIC = ARKADE_MAGIC;
|
|
23791
24164
|
exports.ARKADE_SALTED_PREIMAGE_TAG = ARKADE_SALTED_PREIMAGE_TAG;
|
|
23792
24165
|
exports.ARKADE_SWAP_PREIMAGE_TAG = ARKADE_SWAP_PREIMAGE_TAG;
|
|
24166
|
+
exports.ASSET_CARRIER_SATS = ASSET_CARRIER_SATS;
|
|
24167
|
+
exports.AbortError = AbortError;
|
|
23793
24168
|
exports.ActivityRegistry = ActivityRegistry;
|
|
23794
24169
|
exports.AmbiguousRouteError = AmbiguousRouteError;
|
|
23795
24170
|
exports.ArkNote = ArkNote;
|
|
@@ -23883,17 +24258,20 @@ exports.WalletNotInitializedError = WalletNotInitializedError;
|
|
|
23883
24258
|
exports.WalletRepositoryImpl = WalletRepositoryImpl;
|
|
23884
24259
|
exports.WsElectrumChainSource = WsElectrumChainSource;
|
|
23885
24260
|
exports.adoptContractDescriptor = adoptContractDescriptor;
|
|
24261
|
+
exports.arkAssetRail = arkAssetRail;
|
|
23886
24262
|
exports.arkRail = arkRail;
|
|
23887
24263
|
exports.arkTarget = arkTarget;
|
|
23888
24264
|
exports.arkade_exports = arkade_exports;
|
|
23889
24265
|
exports.assertFinalCommitmentMatchesValidated = assertFinalCommitmentMatchesValidated;
|
|
23890
24266
|
exports.assertIntentIdUnique = assertIntentIdUnique;
|
|
24267
|
+
exports.assertNoAssets = assertNoAssets;
|
|
23891
24268
|
exports.assertRecipientArkadeAddress = assertRecipientArkadeAddress;
|
|
23892
24269
|
exports.assertSendableAmount = assertSendableAmount;
|
|
23893
24270
|
exports.assertSubmittedArkTxid = assertSubmittedArkTxid;
|
|
23894
24271
|
exports.assertValidBatchExpiry = assertValidBatchExpiry;
|
|
23895
24272
|
exports.assertValidServerUnrollScript = assertValidServerUnrollScript;
|
|
23896
24273
|
exports.assetMintResolver = assetMintResolver;
|
|
24274
|
+
exports.assetsOf = assetsOf;
|
|
23897
24275
|
exports.attachPrevArkTxs = attachPrevArkTxs;
|
|
23898
24276
|
exports.attachPrevoutTxs = attachPrevoutTxs;
|
|
23899
24277
|
exports.awaitTransaction = awaitTransaction;
|
|
@@ -23977,6 +24355,7 @@ exports.promisifyRequest = promisifyRequest;
|
|
|
23977
24355
|
exports.provisionClaimSecret = provisionClaimSecret;
|
|
23978
24356
|
exports.provisionRefundKey = provisionRefundKey;
|
|
23979
24357
|
exports.requiresMigration = requiresMigration;
|
|
24358
|
+
exports.resolveAssetAmount = resolveAssetAmount;
|
|
23980
24359
|
exports.resolveBatchExpiryPolicy = resolveBatchExpiryPolicy;
|
|
23981
24360
|
exports.resolveCheckpointExitDelayPolicy = resolveCheckpointExitDelayPolicy;
|
|
23982
24361
|
exports.resolveDescriptorSigner = resolveDescriptorSigner;
|
|
@@ -24005,5 +24384,5 @@ exports.verifyTapscriptSignatures = verifyTapscriptSignatures;
|
|
|
24005
24384
|
exports.waitForIncomingFunds = waitForIncomingFunds;
|
|
24006
24385
|
exports.warnAndFilterVtxosForScript = warnAndFilterVtxosForScript;
|
|
24007
24386
|
exports.withPrevTxs = withPrevTxs;
|
|
24008
|
-
//# sourceMappingURL=chunk-
|
|
24009
|
-
//# sourceMappingURL=chunk-
|
|
24387
|
+
//# sourceMappingURL=chunk-GMZZQXV5.cjs.map
|
|
24388
|
+
//# sourceMappingURL=chunk-GMZZQXV5.cjs.map
|