@arkade-os/sdk 0.5.0-rc.25 → 0.5.0-rc.26
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 +65 -0
- package/dist/adapters/expo.cjs +5 -5
- package/dist/adapters/expo.d.cts +3 -3
- package/dist/adapters/expo.d.ts +3 -3
- package/dist/adapters/expo.js +3 -3
- package/dist/{asyncStorageTaskQueue-ww9Xeiia.d.cts → asyncStorageTaskQueue-CFWscYpG.d.cts} +2 -2
- package/dist/{asyncStorageTaskQueue-Cvk3eGnj.d.ts → asyncStorageTaskQueue-DrFapzPg.d.ts} +2 -2
- package/dist/{chunk-X4O26KCE.js → chunk-5JQ5EOYE.js} +22 -4
- package/dist/chunk-5JQ5EOYE.js.map +1 -0
- package/dist/{chunk-IX5XSR74.cjs → chunk-B2YMUJD5.cjs} +1000 -653
- package/dist/chunk-B2YMUJD5.cjs.map +1 -0
- package/dist/{chunk-EBCWETZM.cjs → chunk-CFOIHLON.cjs} +48 -48
- package/dist/{chunk-EBCWETZM.cjs.map → chunk-CFOIHLON.cjs.map} +1 -1
- package/dist/{chunk-FN27VWDK.cjs → chunk-FEBAG2K2.cjs} +37 -19
- package/dist/chunk-FEBAG2K2.cjs.map +1 -0
- package/dist/{chunk-HPLK4G7D.js → chunk-HPUKFTZV.js} +4 -4
- package/dist/{chunk-HPLK4G7D.js.map → chunk-HPUKFTZV.js.map} +1 -1
- package/dist/{chunk-ONTSMS6N.js → chunk-HTCIPDVW.js} +23 -7
- package/dist/chunk-HTCIPDVW.js.map +1 -0
- package/dist/{chunk-ZRZT2WPT.cjs → chunk-K2YTDYQF.cjs} +17 -17
- package/dist/chunk-K2YTDYQF.cjs.map +1 -0
- package/dist/{chunk-CF3PCS6K.js → chunk-N2VM6V6K.js} +3 -3
- package/dist/{chunk-CF3PCS6K.js.map → chunk-N2VM6V6K.js.map} +1 -1
- package/dist/{chunk-KLPIHGQY.cjs → chunk-QCD3SJOL.cjs} +10 -10
- package/dist/{chunk-KLPIHGQY.cjs.map → chunk-QCD3SJOL.cjs.map} +1 -1
- package/dist/{chunk-TAVS7Q3H.js → chunk-U5ZRDVVB.js} +520 -176
- package/dist/chunk-U5ZRDVVB.js.map +1 -0
- package/dist/{chunk-3LDVNVBW.cjs → chunk-VVFCCNU2.cjs} +23 -6
- package/dist/chunk-VVFCCNU2.cjs.map +1 -0
- package/dist/{chunk-FXFRRKKF.js → chunk-Y5VSJURH.js} +6 -6
- package/dist/chunk-Y5VSJURH.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-KiOcI_Pj.d.ts → delegate-Cz8FnLqi.d.ts} +1 -1
- package/dist/{delegate-D28BopQQ.d.cts → delegate-r3jh7UcH.d.cts} +1 -1
- package/dist/{index-U45fubju.d.cts → index-BfvbSL0W.d.cts} +56 -6
- package/dist/{index-U45fubju.d.ts → index-BfvbSL0W.d.ts} +56 -6
- package/dist/{index-DvHEUboO.d.ts → index-Chgwl4dO.d.ts} +2 -2
- package/dist/{index-BMFb9viE.d.cts → index-DOION7Ta.d.cts} +2 -2
- package/dist/index.cjs +328 -312
- package/dist/index.d.cts +129 -87
- package/dist/index.d.ts +129 -87
- package/dist/index.js +4 -4
- package/dist/repositories/realm/index.cjs +35 -35
- 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 +33 -33
- 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-D2ZvkPoN.d.cts → taskRunner-BO8a-SQh.d.cts} +2 -2
- package/dist/{taskRunner-D0Z_yl0z.d.ts → taskRunner-CXAcjtdU.d.ts} +2 -2
- package/dist/wallet/expo/background.cjs +14 -14
- package/dist/wallet/expo/background.d.cts +3 -3
- package/dist/wallet/expo/background.d.ts +3 -3
- package/dist/wallet/expo/background.js +6 -6
- package/dist/wallet/expo/index.cjs +19 -15
- package/dist/wallet/expo/index.cjs.map +1 -1
- package/dist/wallet/expo/index.d.cts +6 -4
- package/dist/wallet/expo/index.d.ts +6 -4
- package/dist/wallet/expo/index.js +9 -5
- package/dist/wallet/expo/index.js.map +1 -1
- package/dist/{wallet-SotLSq3X.d.cts → wallet-CFIfUlQP.d.ts} +72 -4
- package/dist/{wallet-B3RVL47q.d.ts → wallet-s90p-vIk.d.cts} +72 -4
- 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-3LDVNVBW.cjs.map +0 -1
- package/dist/chunk-FN27VWDK.cjs.map +0 -1
- package/dist/chunk-FXFRRKKF.js.map +0 -1
- package/dist/chunk-IX5XSR74.cjs.map +0 -1
- package/dist/chunk-ONTSMS6N.js.map +0 -1
- package/dist/chunk-TAVS7Q3H.js.map +0 -1
- package/dist/chunk-X4O26KCE.js.map +0 -1
- package/dist/chunk-ZRZT2WPT.cjs.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var chunkFEBAG2K2_cjs = require('./chunk-FEBAG2K2.cjs');
|
|
4
|
+
var chunkCFOIHLON_cjs = require('./chunk-CFOIHLON.cjs');
|
|
5
|
+
var chunkVVFCCNU2_cjs = require('./chunk-VVFCCNU2.cjs');
|
|
6
6
|
var utils_js = require('@scure/btc-signer/utils.js');
|
|
7
7
|
var btcSigner = require('@scure/btc-signer');
|
|
8
8
|
var base = require('@scure/base');
|
|
@@ -187,7 +187,7 @@ var TreeSignerSession = class _TreeSignerSession {
|
|
|
187
187
|
noncesByPubkey.set(base.hex.encode(myPublicKey.subarray(1)), myNonce);
|
|
188
188
|
const tx = this.graph.find(txid);
|
|
189
189
|
if (!tx) throw new Error(`missing tx for txid ${txid}`);
|
|
190
|
-
const cosigners =
|
|
190
|
+
const cosigners = chunkVVFCCNU2_cjs.getArkPsbtFields(tx.root, 0, chunkVVFCCNU2_cjs.CosignerPublicKey).map(
|
|
191
191
|
(c) => base.hex.encode(c.key.subarray(1))
|
|
192
192
|
// xonly pubkey
|
|
193
193
|
);
|
|
@@ -239,7 +239,7 @@ var TreeSignerSession = class _TreeSignerSession {
|
|
|
239
239
|
if (!aggNonce) throw new Error("missing aggregate nonce");
|
|
240
240
|
const prevoutAmounts = [];
|
|
241
241
|
const prevoutScripts = [];
|
|
242
|
-
const cosigners =
|
|
242
|
+
const cosigners = chunkVVFCCNU2_cjs.getArkPsbtFields(g.root, 0, chunkVVFCCNU2_cjs.CosignerPublicKey).map((c) => c.key);
|
|
243
243
|
const { finalKey } = aggregateKeys(cosigners, true, {
|
|
244
244
|
taprootTweak: this.scriptRoot
|
|
245
245
|
});
|
|
@@ -322,7 +322,7 @@ var SingleKey = class _SingleKey {
|
|
|
322
322
|
async sign(tx, inputIndexes) {
|
|
323
323
|
const txCpy = tx.clone();
|
|
324
324
|
if (!inputIndexes) {
|
|
325
|
-
|
|
325
|
+
chunkVVFCCNU2_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH);
|
|
326
326
|
try {
|
|
327
327
|
if (!txCpy.sign(this.key, ALLOWED_SIGHASH)) {
|
|
328
328
|
throw new Error("Failed to sign transaction");
|
|
@@ -422,7 +422,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
422
422
|
let network;
|
|
423
423
|
if ("descriptor" in opts && typeof opts.descriptor === "string") {
|
|
424
424
|
descriptor = opts.descriptor;
|
|
425
|
-
network =
|
|
425
|
+
network = chunkCFOIHLON_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
426
426
|
} else {
|
|
427
427
|
network = opts.isMainnet ?? true ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
428
428
|
descriptor = descriptorsScure.scriptExpressions.trBIP32({
|
|
@@ -499,7 +499,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
499
499
|
}
|
|
500
500
|
/** Returns true when `descriptor` is derived from this identity's seed. */
|
|
501
501
|
ownsDescriptor(descriptor) {
|
|
502
|
-
return
|
|
502
|
+
return chunkCFOIHLON_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
|
|
503
503
|
}
|
|
504
504
|
/**
|
|
505
505
|
* Signs each request with the key derived from its descriptor.
|
|
@@ -538,7 +538,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
538
538
|
}
|
|
539
539
|
// ── internal helpers ─────────────────────────────────────────────
|
|
540
540
|
derivePrivateKeyForDescriptor(descriptor) {
|
|
541
|
-
const network =
|
|
541
|
+
const network = chunkCFOIHLON_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
542
542
|
const expansion = descriptorsScure.expand({ descriptor, network });
|
|
543
543
|
if (expansion.isRanged) {
|
|
544
544
|
throw new Error(
|
|
@@ -563,7 +563,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
563
563
|
signTxWithKey(tx, key, inputIndexes) {
|
|
564
564
|
const txCpy = tx.clone();
|
|
565
565
|
if (!inputIndexes) {
|
|
566
|
-
|
|
566
|
+
chunkVVFCCNU2_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH2);
|
|
567
567
|
try {
|
|
568
568
|
if (!txCpy.sign(key, ALLOWED_SIGHASH2)) {
|
|
569
569
|
throw new Error("Failed to sign transaction");
|
|
@@ -615,7 +615,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
|
|
|
615
615
|
/** Wildcard account-descriptor template (e.g. `tr([fp/86'/0'/0']xpub/0/*)`). */
|
|
616
616
|
descriptor;
|
|
617
617
|
constructor(descriptor) {
|
|
618
|
-
const network =
|
|
618
|
+
const network = chunkCFOIHLON_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
619
619
|
let expansion;
|
|
620
620
|
try {
|
|
621
621
|
expansion = descriptorsScure.expand({ descriptor, network, index: 0 });
|
|
@@ -650,7 +650,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
|
|
|
650
650
|
}
|
|
651
651
|
/** Returns true when `descriptor` derives from this identity's xpub. */
|
|
652
652
|
ownsDescriptor(descriptor) {
|
|
653
|
-
return
|
|
653
|
+
return chunkCFOIHLON_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
|
|
654
654
|
}
|
|
655
655
|
};
|
|
656
656
|
function serializeSeedOwnedSigningIdentity(identity) {
|
|
@@ -793,10 +793,10 @@ var DescriptorIdentity = class {
|
|
|
793
793
|
this.base = base;
|
|
794
794
|
}
|
|
795
795
|
async xOnlyPublicKey() {
|
|
796
|
-
return
|
|
796
|
+
return chunkCFOIHLON_cjs.deriveDescriptorLeafPubKey(this.descriptor);
|
|
797
797
|
}
|
|
798
798
|
async compressedPublicKey() {
|
|
799
|
-
return
|
|
799
|
+
return chunkCFOIHLON_cjs.deriveDescriptorLeafCompressedPubKey(this.descriptor);
|
|
800
800
|
}
|
|
801
801
|
async sign(tx, inputIndexes) {
|
|
802
802
|
const [signed] = await this.signer.signWithDescriptor([
|
|
@@ -856,8 +856,8 @@ var StaticDescriptorProvider = class _StaticDescriptorProvider {
|
|
|
856
856
|
}
|
|
857
857
|
isOurs(descriptor) {
|
|
858
858
|
try {
|
|
859
|
-
const normalized =
|
|
860
|
-
const pubKey =
|
|
859
|
+
const normalized = chunkCFOIHLON_cjs.normalizeToDescriptor(descriptor);
|
|
860
|
+
const pubKey = chunkCFOIHLON_cjs.extractPubKey(normalized);
|
|
861
861
|
return pubKey.toLowerCase() === this.pubKeyHex.toLowerCase();
|
|
862
862
|
} catch {
|
|
863
863
|
return false;
|
|
@@ -1194,7 +1194,7 @@ function unwrapKeyring(provider) {
|
|
|
1194
1194
|
}
|
|
1195
1195
|
function keyOf(descriptor) {
|
|
1196
1196
|
try {
|
|
1197
|
-
return
|
|
1197
|
+
return chunkCFOIHLON_cjs.extractPubKey(chunkCFOIHLON_cjs.normalizeToDescriptor(descriptor)).toLowerCase();
|
|
1198
1198
|
} catch {
|
|
1199
1199
|
return void 0;
|
|
1200
1200
|
}
|
|
@@ -1285,12 +1285,12 @@ async function resolveDescriptorSigner(descriptor, identity, provider) {
|
|
|
1285
1285
|
signMessageWithDescriptor: (ownedDescriptor, message, signatureType) => identity.signDescriptorMessage(ownedDescriptor, message, signatureType)
|
|
1286
1286
|
} : void 0;
|
|
1287
1287
|
const owner = providerOwner ?? identityOwner;
|
|
1288
|
-
if (owner &&
|
|
1288
|
+
if (owner && chunkCFOIHLON_cjs.parseHDDescriptor(descriptor)) {
|
|
1289
1289
|
return new DescriptorIdentity({ descriptor, signer: owner, base: identity });
|
|
1290
1290
|
}
|
|
1291
1291
|
let key;
|
|
1292
1292
|
try {
|
|
1293
|
-
key =
|
|
1293
|
+
key = chunkCFOIHLON_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
1294
1294
|
} catch {
|
|
1295
1295
|
throw new ForeignDescriptorError(descriptor);
|
|
1296
1296
|
}
|
|
@@ -1343,14 +1343,14 @@ function buildSaltedPreimageMessage(xonly, salt) {
|
|
|
1343
1343
|
}
|
|
1344
1344
|
var PREIMAGE_INDEX = 0;
|
|
1345
1345
|
function isPerArtifactDescriptor(descriptor) {
|
|
1346
|
-
return
|
|
1346
|
+
return chunkCFOIHLON_cjs.parseHDDescriptor(descriptor) !== null;
|
|
1347
1347
|
}
|
|
1348
1348
|
async function provisionDescriptor(wallet) {
|
|
1349
1349
|
const allocated = isHDAllocationCapable(wallet) ? await wallet.getNextSigningDescriptor() : void 0;
|
|
1350
|
-
return allocated ?? await
|
|
1350
|
+
return allocated ?? await chunkCFOIHLON_cjs.identityDescriptor(wallet.identity);
|
|
1351
1351
|
}
|
|
1352
1352
|
async function provisionRefundKey(wallet) {
|
|
1353
|
-
const descriptor = await
|
|
1353
|
+
const descriptor = await chunkCFOIHLON_cjs.identityDescriptor(wallet.identity);
|
|
1354
1354
|
const signer = await contractSigner(wallet, descriptor);
|
|
1355
1355
|
const pubkey = await signer.xOnlyPublicKey();
|
|
1356
1356
|
const identityPubkey = await wallet.identity.xOnlyPublicKey();
|
|
@@ -1360,7 +1360,7 @@ async function provisionRefundKey(wallet) {
|
|
|
1360
1360
|
);
|
|
1361
1361
|
}
|
|
1362
1362
|
const address = await wallet.getAddress();
|
|
1363
|
-
const { pkScript } =
|
|
1363
|
+
const { pkScript } = chunkVVFCCNU2_cjs.ArkAddress.decode(address);
|
|
1364
1364
|
return { descriptor, pubkey, pkScript, address };
|
|
1365
1365
|
}
|
|
1366
1366
|
async function provisionClaimSecret(wallet, opts = {}) {
|
|
@@ -1406,7 +1406,7 @@ async function contractSigner(wallet, descriptor) {
|
|
|
1406
1406
|
const signer = isHDWalletCapable(wallet) ? await wallet.signerForDescriptor(descriptor) : wallet.identity;
|
|
1407
1407
|
let expected;
|
|
1408
1408
|
try {
|
|
1409
|
-
expected =
|
|
1409
|
+
expected = chunkCFOIHLON_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
1410
1410
|
} catch (cause) {
|
|
1411
1411
|
throw new ForeignDescriptorError(descriptor, { cause });
|
|
1412
1412
|
}
|
|
@@ -1488,7 +1488,7 @@ function debugLog(debug, ...args) {
|
|
|
1488
1488
|
}
|
|
1489
1489
|
function normalizeOptions(pathOrOptions) {
|
|
1490
1490
|
const o = typeof pathOrOptions === "string" ? { path: pathOrOptions } : pathOrOptions;
|
|
1491
|
-
|
|
1491
|
+
chunkVVFCCNU2_cjs.assertTimerMs("activationTimeoutMs", o.activationTimeoutMs);
|
|
1492
1492
|
return {
|
|
1493
1493
|
path: o.path,
|
|
1494
1494
|
updateViaCache: o.updateViaCache ?? "none",
|
|
@@ -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 chunkVVFCCNU2_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: chunkVVFCCNU2_cjs.Intent.encodeMessage(intent.message),
|
|
1622
1622
|
proof: intent.proof
|
|
1623
1623
|
},
|
|
1624
1624
|
forfeit_txs: forfeitTxs,
|
|
@@ -1637,7 +1637,7 @@ var RestDelegateProvider = class {
|
|
|
1637
1637
|
*/
|
|
1638
1638
|
async getDelegateInfo() {
|
|
1639
1639
|
const url = `${this.url}/v1/delegator/info`;
|
|
1640
|
-
const response = await
|
|
1640
|
+
const response = await chunkVVFCCNU2_cjs.rateGate.runHttp(url, () => chunkVVFCCNU2_cjs.baseFetch(url));
|
|
1641
1641
|
if (!response.ok) {
|
|
1642
1642
|
const errorText2 = await response.text();
|
|
1643
1643
|
throw new Error(`Failed to get delegate info: ${errorText2}`);
|
|
@@ -1693,7 +1693,7 @@ async function collectPages(read) {
|
|
|
1693
1693
|
return items;
|
|
1694
1694
|
}
|
|
1695
1695
|
function scriptFromArkAddress(address) {
|
|
1696
|
-
return base.hex.encode(
|
|
1696
|
+
return base.hex.encode(chunkVVFCCNU2_cjs.ArkAddress.decode(address).pkScript);
|
|
1697
1697
|
}
|
|
1698
1698
|
|
|
1699
1699
|
// src/repositories/walletRepository.ts
|
|
@@ -1755,9 +1755,9 @@ async function collectScriptVtxos(repository, script, options) {
|
|
|
1755
1755
|
return [...byOutpoint.values()].map((row) => row.vtxo);
|
|
1756
1756
|
}
|
|
1757
1757
|
function unspentScriptVtxos(rows, copies) {
|
|
1758
|
-
const spent = copies.filter((copy) =>
|
|
1758
|
+
const spent = copies.filter((copy) => chunkVVFCCNU2_cjs.isVtxoSpent(copy.vtxo));
|
|
1759
1759
|
return rows.filter(
|
|
1760
|
-
(row) => !
|
|
1760
|
+
(row) => !chunkVVFCCNU2_cjs.isVtxoSpent(row.vtxo) && !spent.some(
|
|
1761
1761
|
(copy) => copy.address !== row.address && copy.vtxo.txid === row.vtxo.txid && copy.vtxo.vout === row.vtxo.vout && shouldReplaceScriptVtxo(row, copy)
|
|
1762
1762
|
)
|
|
1763
1763
|
);
|
|
@@ -1840,7 +1840,7 @@ var ESPLORA_URL = {
|
|
|
1840
1840
|
regtest: "http://localhost:3000/api"
|
|
1841
1841
|
};
|
|
1842
1842
|
var EsploraProvider = class {
|
|
1843
|
-
constructor(baseUrl = ESPLORA_URL[
|
|
1843
|
+
constructor(baseUrl = ESPLORA_URL[chunkVVFCCNU2_cjs.DEFAULT_NETWORK_NAME], opts) {
|
|
1844
1844
|
this.baseUrl = baseUrl;
|
|
1845
1845
|
this.pollingInterval = opts?.pollingInterval ?? 15e3;
|
|
1846
1846
|
this.forcePolling = opts?.forcePolling ?? false;
|
|
@@ -1855,7 +1855,7 @@ var EsploraProvider = class {
|
|
|
1855
1855
|
*/
|
|
1856
1856
|
addressWatches = /* @__PURE__ */ new Map();
|
|
1857
1857
|
async getCoins(address) {
|
|
1858
|
-
const response = await
|
|
1858
|
+
const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
|
|
1859
1859
|
if (!response.ok) {
|
|
1860
1860
|
throw new Error(`Failed to fetch UTXOs: ${response.statusText}`);
|
|
1861
1861
|
}
|
|
@@ -1864,12 +1864,12 @@ var EsploraProvider = class {
|
|
|
1864
1864
|
async getFeeRate() {
|
|
1865
1865
|
let url = `${this.baseUrl}/fee-estimates`;
|
|
1866
1866
|
let key = "1";
|
|
1867
|
-
let response = await
|
|
1867
|
+
let response = await chunkVVFCCNU2_cjs.baseFetch(url);
|
|
1868
1868
|
if (response.status === 404) {
|
|
1869
1869
|
await response.body?.cancel();
|
|
1870
1870
|
url = `${this.baseUrl}/v1/fees/recommended`;
|
|
1871
1871
|
key = "fastestFee";
|
|
1872
|
-
response = await
|
|
1872
|
+
response = await chunkVVFCCNU2_cjs.baseFetch(url);
|
|
1873
1873
|
}
|
|
1874
1874
|
if (response.status === 404) {
|
|
1875
1875
|
await response.body?.cancel();
|
|
@@ -1906,7 +1906,7 @@ var EsploraProvider = class {
|
|
|
1906
1906
|
}
|
|
1907
1907
|
}
|
|
1908
1908
|
async getTxOutspends(txid) {
|
|
1909
|
-
const response = await
|
|
1909
|
+
const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
|
|
1910
1910
|
if (!response.ok) {
|
|
1911
1911
|
const error = await response.text();
|
|
1912
1912
|
throw new Error(`Failed to get transaction outspends: ${error}`);
|
|
@@ -1914,7 +1914,7 @@ var EsploraProvider = class {
|
|
|
1914
1914
|
return response.json();
|
|
1915
1915
|
}
|
|
1916
1916
|
async getTransactions(address) {
|
|
1917
|
-
const response = await
|
|
1917
|
+
const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
|
|
1918
1918
|
if (!response.ok) {
|
|
1919
1919
|
const error = await response.text();
|
|
1920
1920
|
throw new Error(`Failed to get transactions: ${error}`);
|
|
@@ -1923,14 +1923,14 @@ var EsploraProvider = class {
|
|
|
1923
1923
|
}
|
|
1924
1924
|
/** Orders of magnitude smaller than `/address/{addr}/txs`: the polling fallback's probe. */
|
|
1925
1925
|
async getAddressStats(address) {
|
|
1926
|
-
const response = await
|
|
1926
|
+
const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/address/${address}`);
|
|
1927
1927
|
if (!response.ok) {
|
|
1928
1928
|
throw new Error(`Failed to get address stats: ${response.statusText}`);
|
|
1929
1929
|
}
|
|
1930
1930
|
return response.json();
|
|
1931
1931
|
}
|
|
1932
1932
|
async getRawTransaction(txid) {
|
|
1933
|
-
const response = await
|
|
1933
|
+
const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/hex`);
|
|
1934
1934
|
if (!response.ok) {
|
|
1935
1935
|
const error = await response.text();
|
|
1936
1936
|
throw new Error(`Failed to get raw transaction ${txid}: ${error}`);
|
|
@@ -1938,7 +1938,7 @@ var EsploraProvider = class {
|
|
|
1938
1938
|
return base.hex.decode((await response.text()).trim());
|
|
1939
1939
|
}
|
|
1940
1940
|
async getTxStatus(txid) {
|
|
1941
|
-
const txresponse = await
|
|
1941
|
+
const txresponse = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
|
|
1942
1942
|
if (!txresponse.ok) {
|
|
1943
1943
|
throw new Error(txresponse.statusText);
|
|
1944
1944
|
}
|
|
@@ -1946,7 +1946,7 @@ var EsploraProvider = class {
|
|
|
1946
1946
|
if (!tx.status.confirmed) {
|
|
1947
1947
|
return { confirmed: false };
|
|
1948
1948
|
}
|
|
1949
|
-
const response = await
|
|
1949
|
+
const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
|
|
1950
1950
|
if (!response.ok) {
|
|
1951
1951
|
throw new Error(`Failed to get transaction status: ${response.statusText}`);
|
|
1952
1952
|
}
|
|
@@ -2220,9 +2220,9 @@ var EsploraProvider = class {
|
|
|
2220
2220
|
return { subscribers, teardown, started };
|
|
2221
2221
|
}
|
|
2222
2222
|
async getChainTip() {
|
|
2223
|
-
let tipBlocks = await
|
|
2223
|
+
let tipBlocks = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/blocks`);
|
|
2224
2224
|
if (tipBlocks.status === 404) {
|
|
2225
|
-
tipBlocks = await
|
|
2225
|
+
tipBlocks = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/v1/blocks`);
|
|
2226
2226
|
}
|
|
2227
2227
|
if (!tipBlocks.ok) {
|
|
2228
2228
|
throw new Error(`Failed to get chain tip: ${tipBlocks.statusText}`);
|
|
@@ -2243,7 +2243,7 @@ var EsploraProvider = class {
|
|
|
2243
2243
|
};
|
|
2244
2244
|
}
|
|
2245
2245
|
async broadcastPackage(parent, child) {
|
|
2246
|
-
const response = await
|
|
2246
|
+
const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
|
|
2247
2247
|
method: "POST",
|
|
2248
2248
|
headers: {
|
|
2249
2249
|
"Content-Type": "application/json"
|
|
@@ -2259,7 +2259,7 @@ var EsploraProvider = class {
|
|
|
2259
2259
|
return result;
|
|
2260
2260
|
}
|
|
2261
2261
|
async broadcastTx(tx) {
|
|
2262
|
-
const response = await
|
|
2262
|
+
const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/tx`, {
|
|
2263
2263
|
method: "POST",
|
|
2264
2264
|
headers: {
|
|
2265
2265
|
"Content-Type": "text/plain"
|
|
@@ -2431,7 +2431,7 @@ function findP2AOutput(tx) {
|
|
|
2431
2431
|
var CHILD_DUST_AMOUNT = 546;
|
|
2432
2432
|
function buildAnchorChild(params) {
|
|
2433
2433
|
const { parent, feeRate, fundingCoins, changeAddress, tapInternalKey, network } = params;
|
|
2434
|
-
const child = new
|
|
2434
|
+
const child = new chunkVVFCCNU2_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
|
|
2435
2435
|
const anchor = findP2AOutput(parent);
|
|
2436
2436
|
child.addInput(anchor);
|
|
2437
2437
|
const estimator = TxWeightEstimator.create().addP2AInput();
|
|
@@ -2480,7 +2480,7 @@ function buildForfeitTx(inputs, forfeitPkScript, txLocktime) {
|
|
|
2480
2480
|
);
|
|
2481
2481
|
}
|
|
2482
2482
|
function buildForfeitTxWithOutput(inputs, output, txLocktime) {
|
|
2483
|
-
const tx = new
|
|
2483
|
+
const tx = new chunkVVFCCNU2_cjs.Transaction({
|
|
2484
2484
|
version: 3,
|
|
2485
2485
|
lockTime: txLocktime
|
|
2486
2486
|
});
|
|
@@ -2507,7 +2507,7 @@ function validateConnectorsTxGraph(settlementTxB64, connectorsGraph) {
|
|
|
2507
2507
|
connectorsGraph.validate();
|
|
2508
2508
|
if (connectorsGraph.root.inputsLength !== 1) throw ErrNumberOfInputs;
|
|
2509
2509
|
const rootInput = connectorsGraph.root.getInput(0);
|
|
2510
|
-
const settlementTx =
|
|
2510
|
+
const settlementTx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(settlementTxB64));
|
|
2511
2511
|
if (settlementTx.outputsLength <= BATCH_OUTPUT_CONNECTORS_INDEX)
|
|
2512
2512
|
throw ErrInvalidSettlementTxOutputs;
|
|
2513
2513
|
const expectedRootTxid = settlementTx.id;
|
|
@@ -2556,7 +2556,7 @@ function validateVtxoTxGraph(graph, roundTransaction, sweepTapTreeRoot) {
|
|
|
2556
2556
|
if (previousScriptKey.length !== 32) {
|
|
2557
2557
|
throw new Error(`parent output ${childIndex} has invalid script`);
|
|
2558
2558
|
}
|
|
2559
|
-
const cosigners =
|
|
2559
|
+
const cosigners = chunkVVFCCNU2_cjs.getArkPsbtFields(child.root, 0, chunkVVFCCNU2_cjs.CosignerPublicKey);
|
|
2560
2560
|
if (cosigners.length === 0) {
|
|
2561
2561
|
throw ErrMissingCosignersPublicKeys;
|
|
2562
2562
|
}
|
|
@@ -2614,7 +2614,7 @@ var EmulatorPacket = class _EmulatorPacket {
|
|
|
2614
2614
|
return new _EmulatorPacket(entries);
|
|
2615
2615
|
}
|
|
2616
2616
|
static fromBytes(data) {
|
|
2617
|
-
const reader = new
|
|
2617
|
+
const reader = new chunkFEBAG2K2_cjs.BufferReader(data);
|
|
2618
2618
|
const entryCount = reader.readCompactSize();
|
|
2619
2619
|
const entries = [];
|
|
2620
2620
|
for (let i = 0; i < entryCount; i++) {
|
|
@@ -2632,7 +2632,7 @@ var EmulatorPacket = class _EmulatorPacket {
|
|
|
2632
2632
|
return _EmulatorPacket.PACKET_TYPE;
|
|
2633
2633
|
}
|
|
2634
2634
|
serialize() {
|
|
2635
|
-
const writer = new
|
|
2635
|
+
const writer = new chunkFEBAG2K2_cjs.BufferWriter();
|
|
2636
2636
|
writer.writeCompactSize(this.entries.length);
|
|
2637
2637
|
for (const entry of this.entries) {
|
|
2638
2638
|
writer.writeUint16LE(entry.vin);
|
|
@@ -2719,7 +2719,7 @@ var Extension = class _Extension {
|
|
|
2719
2719
|
`expected magic prefix ${base.hex.encode(ARKADE_MAGIC)}, got ${base.hex.encode(payload.slice(0, Math.min(payload.length, ARKADE_MAGIC.length)))}`
|
|
2720
2720
|
);
|
|
2721
2721
|
}
|
|
2722
|
-
const reader = new
|
|
2722
|
+
const reader = new chunkFEBAG2K2_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
|
|
2723
2723
|
const packets = [];
|
|
2724
2724
|
while (reader.remaining() > 0) {
|
|
2725
2725
|
const packetType = reader.readByte();
|
|
@@ -2792,7 +2792,7 @@ var Extension = class _Extension {
|
|
|
2792
2792
|
* getAssetPacket returns the embedded Packet, or null if not present.
|
|
2793
2793
|
*/
|
|
2794
2794
|
getAssetPacket() {
|
|
2795
|
-
return this.packets.find((p) => p instanceof
|
|
2795
|
+
return this.packets.find((p) => p instanceof chunkFEBAG2K2_cjs.Packet) ?? null;
|
|
2796
2796
|
}
|
|
2797
2797
|
/**
|
|
2798
2798
|
* getEmulatorPacket returns the embedded EmulatorPacket, or null if not present.
|
|
@@ -2816,8 +2816,8 @@ var Extension = class _Extension {
|
|
|
2816
2816
|
};
|
|
2817
2817
|
function parsePacket(packetType, data) {
|
|
2818
2818
|
switch (packetType) {
|
|
2819
|
-
case
|
|
2820
|
-
return
|
|
2819
|
+
case chunkFEBAG2K2_cjs.Packet.PACKET_TYPE:
|
|
2820
|
+
return chunkFEBAG2K2_cjs.Packet.fromBytes(data);
|
|
2821
2821
|
case EmulatorPacket.PACKET_TYPE:
|
|
2822
2822
|
return EmulatorPacket.fromBytes(data);
|
|
2823
2823
|
default:
|
|
@@ -2864,22 +2864,22 @@ function buildOpReturnScript(data) {
|
|
|
2864
2864
|
}
|
|
2865
2865
|
return script;
|
|
2866
2866
|
}
|
|
2867
|
-
var ErrOffchainOutputNotFound = (address) => new
|
|
2868
|
-
var ErrInvalidAssetOutputAmount = (got, want, assetId) => new
|
|
2867
|
+
var ErrOffchainOutputNotFound = (address) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(`offchain send output not found: ${address}`);
|
|
2868
|
+
var ErrInvalidAssetOutputAmount = (got, want, assetId) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
2869
2869
|
`invalid asset output amount for ${assetId}: got ${got}, want ${want}`
|
|
2870
2870
|
);
|
|
2871
|
-
var ErrAssetGroupNotFound = (assetId) => new
|
|
2872
|
-
var ErrAssetOutputNotFound = (assetId, outputIndex) => new
|
|
2871
|
+
var ErrAssetGroupNotFound = (assetId) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(`asset group not found in batch leaf: ${assetId}`);
|
|
2872
|
+
var ErrAssetOutputNotFound = (assetId, outputIndex) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
2873
2873
|
`asset output not found in asset group ${assetId} at index ${outputIndex}`
|
|
2874
2874
|
);
|
|
2875
|
-
var ErrOnchainOutputNotFound = (address) => new
|
|
2876
|
-
var ErrUnvalidatedOffchainOutput = (address) => new
|
|
2875
|
+
var ErrOnchainOutputNotFound = (address) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(`onchain output not found: ${address}`);
|
|
2876
|
+
var ErrUnvalidatedOffchainOutput = (address) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
2877
2877
|
`offchain output ${address} cannot be validated: virtual output tree signing did not run`
|
|
2878
2878
|
);
|
|
2879
|
-
var ErrIntentOutputNotFound = (index, kind) => new
|
|
2879
|
+
var ErrIntentOutputNotFound = (index, kind) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
2880
2880
|
`${kind} output ${index} of the intent proof is not present in what the server built`
|
|
2881
2881
|
);
|
|
2882
|
-
var ErrUnvalidatedIntentOutput = (index) => new
|
|
2882
|
+
var ErrUnvalidatedIntentOutput = (index) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
2883
2883
|
`offchain output ${index} of the intent proof cannot be validated: virtual output tree signing did not run`
|
|
2884
2884
|
);
|
|
2885
2885
|
var ErrInvalidOnchainOutputAmount = (address) => new Error(`invalid onchain output amount: ${address}`);
|
|
@@ -2888,7 +2888,7 @@ var ErrInvalidOffchainOutputAmount = (address) => new Error(`invalid offchain ou
|
|
|
2888
2888
|
function assertFinalCommitmentMatchesValidated(finalCommitmentTx, validatedCommitmentTxid, context) {
|
|
2889
2889
|
if (!validatedCommitmentTxid) return;
|
|
2890
2890
|
if (finalCommitmentTx.id === validatedCommitmentTxid) return;
|
|
2891
|
-
throw new
|
|
2891
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
2892
2892
|
`${context}: finalization commitment tx ${finalCommitmentTx.id} differs from the validated commitment tx ${validatedCommitmentTxid}`
|
|
2893
2893
|
);
|
|
2894
2894
|
}
|
|
@@ -2898,7 +2898,7 @@ function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, netwo
|
|
|
2898
2898
|
for (const recipient of recipients) {
|
|
2899
2899
|
let arkAddress;
|
|
2900
2900
|
try {
|
|
2901
|
-
arkAddress =
|
|
2901
|
+
arkAddress = chunkVVFCCNU2_cjs.ArkAddress.decode(recipient.address);
|
|
2902
2902
|
} catch {
|
|
2903
2903
|
validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
|
|
2904
2904
|
continue;
|
|
@@ -2910,7 +2910,7 @@ function validateBatchRecipientsWithoutTree(commitmentTx, recipients, network) {
|
|
|
2910
2910
|
const usedOnchainOutputs = /* @__PURE__ */ new Set();
|
|
2911
2911
|
for (const recipient of recipients) {
|
|
2912
2912
|
try {
|
|
2913
|
-
|
|
2913
|
+
chunkVVFCCNU2_cjs.ArkAddress.decode(recipient.address);
|
|
2914
2914
|
} catch {
|
|
2915
2915
|
validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
|
|
2916
2916
|
continue;
|
|
@@ -2919,7 +2919,7 @@ function validateBatchRecipientsWithoutTree(commitmentTx, recipients, network) {
|
|
|
2919
2919
|
}
|
|
2920
2920
|
}
|
|
2921
2921
|
function declaredIntentOutputs(signedProof, onchainOutputIndexes) {
|
|
2922
|
-
const proof =
|
|
2922
|
+
const proof = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(signedProof));
|
|
2923
2923
|
const onchain = new Set(onchainOutputIndexes);
|
|
2924
2924
|
const declared = [];
|
|
2925
2925
|
for (let i = 0; i < proof.outputsLength; i++) {
|
|
@@ -3211,7 +3211,7 @@ function assetMintResolver() {
|
|
|
3211
3211
|
if (!tx.assets?.length || !tx.key.arkTxid) return void 0;
|
|
3212
3212
|
const minted = tx.assets.filter((a) => {
|
|
3213
3213
|
try {
|
|
3214
|
-
return base.hex.encode(
|
|
3214
|
+
return base.hex.encode(chunkFEBAG2K2_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
|
|
3215
3215
|
} catch {
|
|
3216
3216
|
return false;
|
|
3217
3217
|
}
|
|
@@ -3288,7 +3288,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
3288
3288
|
const existing = inputsByAssetId.get(asset.assetId);
|
|
3289
3289
|
inputsByAssetId.set(asset.assetId, [
|
|
3290
3290
|
...existing ?? [],
|
|
3291
|
-
|
|
3291
|
+
chunkFEBAG2K2_cjs.AssetInput.create(inputIndex, asset.amount)
|
|
3292
3292
|
]);
|
|
3293
3293
|
}
|
|
3294
3294
|
}
|
|
@@ -3300,7 +3300,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
3300
3300
|
const existing = outputsByAssetId.get(asset.assetId);
|
|
3301
3301
|
outputsByAssetId.set(asset.assetId, [
|
|
3302
3302
|
...existing ?? [],
|
|
3303
|
-
|
|
3303
|
+
chunkFEBAG2K2_cjs.AssetOutput.create(outputIndex, asset.amount)
|
|
3304
3304
|
]);
|
|
3305
3305
|
}
|
|
3306
3306
|
}
|
|
@@ -3311,7 +3311,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
3311
3311
|
const existing = outputsByAssetId.get(asset.assetId);
|
|
3312
3312
|
outputsByAssetId.set(asset.assetId, [
|
|
3313
3313
|
...existing ?? [],
|
|
3314
|
-
|
|
3314
|
+
chunkFEBAG2K2_cjs.AssetOutput.create(outputIndex, asset.amount)
|
|
3315
3315
|
]);
|
|
3316
3316
|
}
|
|
3317
3317
|
}
|
|
@@ -3320,11 +3320,11 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
3320
3320
|
for (const assetIdStr of allAssetIds) {
|
|
3321
3321
|
const inputs = inputsByAssetId.get(assetIdStr);
|
|
3322
3322
|
const outputs = outputsByAssetId.get(assetIdStr);
|
|
3323
|
-
const assetId =
|
|
3324
|
-
const group =
|
|
3323
|
+
const assetId = chunkFEBAG2K2_cjs.AssetId.fromString(assetIdStr);
|
|
3324
|
+
const group = chunkFEBAG2K2_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
|
|
3325
3325
|
groups.push(group);
|
|
3326
3326
|
}
|
|
3327
|
-
return
|
|
3327
|
+
return chunkFEBAG2K2_cjs.Packet.create(groups);
|
|
3328
3328
|
}
|
|
3329
3329
|
function selectCoinsWithAsset(coins, assetId, requiredAmount) {
|
|
3330
3330
|
const coinsWithAsset = coins.filter((coin) => coin.assets?.some((a) => a.assetId === assetId));
|
|
@@ -3408,7 +3408,7 @@ function meetsInputExpiryFloor(coin, floor) {
|
|
|
3408
3408
|
}
|
|
3409
3409
|
function toXOnlySignerHex(pubkeyHex) {
|
|
3410
3410
|
const bytes = base.hex.decode(pubkeyHex);
|
|
3411
|
-
if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(
|
|
3411
|
+
if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(chunkCFOIHLON_cjs.toXOnly(bytes, "signer key"));
|
|
3412
3412
|
throw new Error(`invalid signer pubkey length: expected 32 or 33 bytes, got ${bytes.length}`);
|
|
3413
3413
|
}
|
|
3414
3414
|
function signerSetFromInfo(info) {
|
|
@@ -3455,13 +3455,13 @@ var toTimelock = (value) => ({
|
|
|
3455
3455
|
var toSeconds = (t) => t.type === "seconds" ? t.value : t.value * NOMINAL_BLOCK_SECONDS;
|
|
3456
3456
|
function assertTimelockInPolicy(timelock, policy, label, overrideOption) {
|
|
3457
3457
|
if (policy.requireSeconds && timelock.type === "blocks") {
|
|
3458
|
-
throw new
|
|
3458
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3459
3459
|
`${label} rejected: block-typed timelocks are not accepted (got ${timelock.value})`
|
|
3460
3460
|
);
|
|
3461
3461
|
}
|
|
3462
3462
|
const seconds = toSeconds(timelock);
|
|
3463
3463
|
if (seconds < policy.minSeconds) {
|
|
3464
|
-
throw new
|
|
3464
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3465
3465
|
`${label} rejected: ${timelock.value} ${timelock.type} is below the ${policy.minSeconds}s floor; pass ${overrideOption}: ${seconds}n to Wallet.create to lower it`
|
|
3466
3466
|
);
|
|
3467
3467
|
}
|
|
@@ -3482,7 +3482,7 @@ function resolveBatchExpiryPolicy(network, overrides) {
|
|
|
3482
3482
|
}
|
|
3483
3483
|
function assertValidBatchExpiry(batchExpiry, policy) {
|
|
3484
3484
|
if (policy.advertisedVtxoTreeExpiry !== void 0 && batchExpiry !== policy.advertisedVtxoTreeExpiry) {
|
|
3485
|
-
throw new
|
|
3485
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3486
3486
|
`batch expiry rejected: ${batchExpiry} does not match the advertised vtxoTreeExpiry ${policy.advertisedVtxoTreeExpiry}`
|
|
3487
3487
|
);
|
|
3488
3488
|
}
|
|
@@ -3512,21 +3512,21 @@ function resolveCheckpointExitDelayPolicy(network, overrides) {
|
|
|
3512
3512
|
function assertValidServerUnrollScript(checkpointTapscript, policy) {
|
|
3513
3513
|
let script;
|
|
3514
3514
|
try {
|
|
3515
|
-
script =
|
|
3515
|
+
script = chunkVVFCCNU2_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
|
|
3516
3516
|
} catch (e) {
|
|
3517
|
-
throw new
|
|
3517
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3518
3518
|
`checkpoint exit delay rejected: invalid checkpointTapscript from server (${e instanceof Error ? e.message : String(e)})`
|
|
3519
3519
|
);
|
|
3520
3520
|
}
|
|
3521
3521
|
if (policy.advertisedForfeitPubkey !== void 0) {
|
|
3522
3522
|
const { pubkeys } = script.params;
|
|
3523
3523
|
if (pubkeys.length !== 1) {
|
|
3524
|
-
throw new
|
|
3524
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3525
3525
|
`checkpoint exit delay rejected: checkpointTapscript must commit to exactly one pubkey, got ${pubkeys.length} [${pubkeys.map(base.hex.encode).join(", ")}]`
|
|
3526
3526
|
);
|
|
3527
3527
|
}
|
|
3528
3528
|
if (!utils_js.equalBytes(pubkeys[0], policy.advertisedForfeitPubkey)) {
|
|
3529
|
-
throw new
|
|
3529
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3530
3530
|
`checkpoint exit delay rejected: checkpointTapscript pubkey ${base.hex.encode(pubkeys[0])} does not match the advertised forfeitPubkey ${base.hex.encode(policy.advertisedForfeitPubkey)}`
|
|
3531
3531
|
);
|
|
3532
3532
|
}
|
|
@@ -3570,8 +3570,8 @@ function buildOffchainTx(inputs, outputs, serverUnrollScript) {
|
|
|
3570
3570
|
function buildVirtualTx(inputs, outputs) {
|
|
3571
3571
|
let lockTime = 0n;
|
|
3572
3572
|
for (const input of inputs) {
|
|
3573
|
-
const tapscript =
|
|
3574
|
-
if (
|
|
3573
|
+
const tapscript = chunkVVFCCNU2_cjs.decodeTapscript(chunkVVFCCNU2_cjs.scriptFromTapLeafScript(input.tapLeafScript));
|
|
3574
|
+
if (chunkVVFCCNU2_cjs.CLTVMultisigTapscript.is(tapscript)) {
|
|
3575
3575
|
if (lockTime !== 0n) {
|
|
3576
3576
|
if (isSeconds(lockTime) !== isSeconds(tapscript.params.absoluteTimelock)) {
|
|
3577
3577
|
throw new Error("cannot mix seconds and blocks locktime");
|
|
@@ -3582,7 +3582,7 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3582
3582
|
}
|
|
3583
3583
|
}
|
|
3584
3584
|
}
|
|
3585
|
-
const tx = new
|
|
3585
|
+
const tx = new chunkVVFCCNU2_cjs.Transaction({
|
|
3586
3586
|
version: 3,
|
|
3587
3587
|
lockTime: Number(lockTime)
|
|
3588
3588
|
});
|
|
@@ -3592,12 +3592,12 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3592
3592
|
index: input.vout,
|
|
3593
3593
|
sequence: lockTime ? btcSigner.DEFAULT_SEQUENCE - 1 : void 0,
|
|
3594
3594
|
witnessUtxo: {
|
|
3595
|
-
script:
|
|
3595
|
+
script: chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).pkScript,
|
|
3596
3596
|
amount: BigInt(input.value)
|
|
3597
3597
|
},
|
|
3598
3598
|
tapLeafScript: [input.tapLeafScript]
|
|
3599
3599
|
});
|
|
3600
|
-
|
|
3600
|
+
chunkVVFCCNU2_cjs.setArkPsbtField(tx, i, chunkVVFCCNU2_cjs.VtxoTaprootTree, input.tapTree);
|
|
3601
3601
|
}
|
|
3602
3602
|
for (const output of outputs) {
|
|
3603
3603
|
tx.addOutput(output);
|
|
@@ -3608,8 +3608,8 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
3608
3608
|
return tx;
|
|
3609
3609
|
}
|
|
3610
3610
|
function buildCheckpointTx(vtxo, serverUnrollScript) {
|
|
3611
|
-
const collaborativeClosure =
|
|
3612
|
-
const checkpointVtxoScript = new
|
|
3611
|
+
const collaborativeClosure = chunkVVFCCNU2_cjs.decodeTapscript(chunkVVFCCNU2_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
|
|
3612
|
+
const checkpointVtxoScript = new chunkVVFCCNU2_cjs.VtxoScript([
|
|
3613
3613
|
serverUnrollScript.script,
|
|
3614
3614
|
collaborativeClosure.script
|
|
3615
3615
|
]);
|
|
@@ -3685,7 +3685,7 @@ function verifyTapscriptSignatures(tx, inputIndex, requiredSigners, excludePubke
|
|
|
3685
3685
|
const sighashType = signature.length === 65 ? signature[64] : btcSigner.SigHash.DEFAULT;
|
|
3686
3686
|
const sig = signature.subarray(0, 64);
|
|
3687
3687
|
if (!allowedSighashTypes.includes(sighashType)) {
|
|
3688
|
-
const sighashName =
|
|
3688
|
+
const sighashName = chunkVVFCCNU2_cjs.formatSighash(sighashType);
|
|
3689
3689
|
throw new Error(
|
|
3690
3690
|
`Unallowed sighash type ${sighashName} for input ${inputIndex}, pubkey ${pubKeyHex}.`
|
|
3691
3691
|
);
|
|
@@ -3759,7 +3759,7 @@ function combineTapscriptSigs(signedTx, originalTx) {
|
|
|
3759
3759
|
}
|
|
3760
3760
|
function isValidArkAddress(address) {
|
|
3761
3761
|
try {
|
|
3762
|
-
|
|
3762
|
+
chunkVVFCCNU2_cjs.ArkAddress.decode(address);
|
|
3763
3763
|
return true;
|
|
3764
3764
|
} catch (e) {
|
|
3765
3765
|
return false;
|
|
@@ -3767,16 +3767,16 @@ function isValidArkAddress(address) {
|
|
|
3767
3767
|
}
|
|
3768
3768
|
function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, context) {
|
|
3769
3769
|
if (serverCheckpointTxs.length !== expectedCheckpoints.length) {
|
|
3770
|
-
throw new
|
|
3770
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3771
3771
|
`${context} returned ${serverCheckpointTxs.length} checkpoints, expected ${expectedCheckpoints.length}`
|
|
3772
3772
|
);
|
|
3773
3773
|
}
|
|
3774
3774
|
const byTxid = new Map(expectedCheckpoints.map((c) => [c.id, c]));
|
|
3775
3775
|
return serverCheckpointTxs.map((encoded, index) => {
|
|
3776
|
-
const server =
|
|
3776
|
+
const server = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
|
|
3777
3777
|
const local = byTxid.get(server.id);
|
|
3778
3778
|
if (!local) {
|
|
3779
|
-
throw new
|
|
3779
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3780
3780
|
`${context} checkpoint ${index} txid ${server.id} does not match any submitted checkpoint`
|
|
3781
3781
|
);
|
|
3782
3782
|
}
|
|
@@ -3786,14 +3786,14 @@ function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, contex
|
|
|
3786
3786
|
}
|
|
3787
3787
|
function assertSubmittedArkTxid(response, signedArkTx, context) {
|
|
3788
3788
|
if (response.arkTxid !== signedArkTx.id) {
|
|
3789
|
-
throw new
|
|
3789
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3790
3790
|
`${context} returned ark txid ${response.arkTxid}, expected ${signedArkTx.id}`
|
|
3791
3791
|
);
|
|
3792
3792
|
}
|
|
3793
3793
|
if (response.finalArkTx === void 0) return;
|
|
3794
|
-
const finalTxid =
|
|
3794
|
+
const finalTxid = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
|
|
3795
3795
|
if (finalTxid !== signedArkTx.id) {
|
|
3796
|
-
throw new
|
|
3796
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3797
3797
|
`${context} returned final ark tx ${finalTxid}, expected ${signedArkTx.id}`
|
|
3798
3798
|
);
|
|
3799
3799
|
}
|
|
@@ -3805,20 +3805,20 @@ function assertServerSignedLeaf(serverTx, localTx, inputIndex, serverPubkeys, co
|
|
|
3805
3805
|
`${context}: input ${inputIndex} carries no spend leaf to verify the server signature against`
|
|
3806
3806
|
);
|
|
3807
3807
|
}
|
|
3808
|
-
const script =
|
|
3808
|
+
const script = chunkVVFCCNU2_cjs.scriptFromTapLeafScript(leaf);
|
|
3809
3809
|
let leafPubkeys;
|
|
3810
3810
|
try {
|
|
3811
|
-
leafPubkeys =
|
|
3812
|
-
(key) => base.hex.encode(
|
|
3811
|
+
leafPubkeys = chunkVVFCCNU2_cjs.decodeTapscript(script).params.pubkeys.map(
|
|
3812
|
+
(key) => base.hex.encode(chunkCFOIHLON_cjs.toXOnly(key, "leaf key"))
|
|
3813
3813
|
);
|
|
3814
3814
|
} catch (error) {
|
|
3815
|
-
throw new
|
|
3815
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3816
3816
|
`${context}: input ${inputIndex} spend leaf cannot be decoded (${error instanceof Error ? error.message : String(error)})`
|
|
3817
3817
|
);
|
|
3818
3818
|
}
|
|
3819
3819
|
const signer = leafPubkeys.find((key) => serverPubkeys.has(key));
|
|
3820
3820
|
if (!signer) {
|
|
3821
|
-
throw new
|
|
3821
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3822
3822
|
`${context}: input ${inputIndex} spend leaf names no signer key the server advertises`
|
|
3823
3823
|
);
|
|
3824
3824
|
}
|
|
@@ -3832,7 +3832,7 @@ function assertServerSignedLeaf(serverTx, localTx, inputIndex, serverPubkeys, co
|
|
|
3832
3832
|
payment_js.tapLeafHash(script)
|
|
3833
3833
|
);
|
|
3834
3834
|
} catch (error) {
|
|
3835
|
-
throw new
|
|
3835
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3836
3836
|
`${context}: input ${inputIndex} is not signed by the server on the leaf being spent (${error instanceof Error ? error.message : String(error)})`
|
|
3837
3837
|
);
|
|
3838
3838
|
}
|
|
@@ -3841,20 +3841,20 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
|
|
|
3841
3841
|
const byOutpoint = new Map(inputs.map((input) => [`${input.txid}:${input.vout}`, input]));
|
|
3842
3842
|
for (const [index, checkpoint] of checkpoints.entries()) {
|
|
3843
3843
|
if (checkpoint.inputsLength !== 1) {
|
|
3844
|
-
throw new
|
|
3844
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3845
3845
|
`${context}: checkpoint ${index} spends ${checkpoint.inputsLength} inputs, expected 1`
|
|
3846
3846
|
);
|
|
3847
3847
|
}
|
|
3848
3848
|
const spent = checkpoint.getInput(0);
|
|
3849
3849
|
if (!spent.txid || spent.index === void 0) {
|
|
3850
|
-
throw new
|
|
3850
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3851
3851
|
`${context}: checkpoint ${index} has no input outpoint`
|
|
3852
3852
|
);
|
|
3853
3853
|
}
|
|
3854
3854
|
const outpoint = `${base.hex.encode(spent.txid)}:${spent.index}`;
|
|
3855
3855
|
const input = byOutpoint.get(outpoint);
|
|
3856
3856
|
if (!input) {
|
|
3857
|
-
throw new
|
|
3857
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3858
3858
|
`${context}: checkpoint ${index} spends ${outpoint}, which is not one of the requested virtual outputs`
|
|
3859
3859
|
);
|
|
3860
3860
|
}
|
|
@@ -3862,7 +3862,7 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
|
|
|
3862
3862
|
(unroll) => buildCheckpointTx(input, unroll).tx.id === checkpoint.id
|
|
3863
3863
|
);
|
|
3864
3864
|
if (!rebuilt) {
|
|
3865
|
-
throw new
|
|
3865
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3866
3866
|
`${context}: checkpoint ${index} txid ${checkpoint.id} differs from the checkpoint built locally for ${outpoint}`
|
|
3867
3867
|
);
|
|
3868
3868
|
}
|
|
@@ -3888,9 +3888,9 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
|
|
|
3888
3888
|
const matched = matchServerCheckpoints(signedCheckpointTxs, offchainTx.checkpoints, "submitTx");
|
|
3889
3889
|
matched.forEach(({ server }, index) => {
|
|
3890
3890
|
try {
|
|
3891
|
-
|
|
3891
|
+
chunkVVFCCNU2_cjs.assertAllowedSighashTypes(server);
|
|
3892
3892
|
} catch (error) {
|
|
3893
|
-
throw new
|
|
3893
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3894
3894
|
`submitTx checkpoint ${index}: ${error instanceof Error ? error.message : String(error)}`
|
|
3895
3895
|
);
|
|
3896
3896
|
}
|
|
@@ -3898,14 +3898,14 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
|
|
|
3898
3898
|
const verify = options?.verifyServerSignatures;
|
|
3899
3899
|
if (verify) {
|
|
3900
3900
|
if (response.finalArkTx === void 0) {
|
|
3901
|
-
throw new
|
|
3901
|
+
throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
|
|
3902
3902
|
"submitTx: server returned no final ark tx to verify its signatures against"
|
|
3903
3903
|
);
|
|
3904
3904
|
}
|
|
3905
|
-
const finalArkTx =
|
|
3905
|
+
const finalArkTx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx));
|
|
3906
3906
|
const serverPubkeys = new Set(
|
|
3907
3907
|
[verify.serverPubkey, ...verify.deprecatedServerPubkeys ?? []].map(
|
|
3908
|
-
(key) => base.hex.encode(
|
|
3908
|
+
(key) => base.hex.encode(chunkCFOIHLON_cjs.toXOnly(key, "server key"))
|
|
3909
3909
|
)
|
|
3910
3910
|
);
|
|
3911
3911
|
for (let i = 0; i < offchainTx.arkTx.inputsLength; i++) {
|
|
@@ -3953,16 +3953,36 @@ async function signAndSubmitOffchainTx(params) {
|
|
|
3953
3953
|
});
|
|
3954
3954
|
return arkTxid;
|
|
3955
3955
|
}
|
|
3956
|
+
async function submitViaEmulator(emulator, offchainTx, signer, opts) {
|
|
3957
|
+
const { inputIndexes } = opts;
|
|
3958
|
+
let { arkTx, checkpoints } = offchainTx;
|
|
3959
|
+
if (inputIndexes.length > 0) {
|
|
3960
|
+
if (!signer) {
|
|
3961
|
+
throw new Error(`this spend requires an \`identity\` to sign inputs ${inputIndexes}`);
|
|
3962
|
+
}
|
|
3963
|
+
arkTx = await signer.sign(arkTx, inputIndexes);
|
|
3964
|
+
checkpoints = await Promise.all(
|
|
3965
|
+
checkpoints.map((c, i) => inputIndexes.includes(i) ? signer.sign(c, [0]) : c)
|
|
3966
|
+
);
|
|
3967
|
+
}
|
|
3968
|
+
const res = await emulator.submitTx(
|
|
3969
|
+
base.base64.encode(arkTx.toPSBT()),
|
|
3970
|
+
checkpoints.map((c) => base.base64.encode(c.toPSBT()))
|
|
3971
|
+
);
|
|
3972
|
+
const txid = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(res.signedArkTx)).id;
|
|
3973
|
+
assertSubmittedArkTxid({ arkTxid: txid }, arkTx, "emulator submitTx");
|
|
3974
|
+
return { txid, signedArkTx: res.signedArkTx, signedCheckpointTxs: res.signedCheckpointTxs };
|
|
3975
|
+
}
|
|
3956
3976
|
function claimWithPreimageIdentity(identity, preimage) {
|
|
3957
3977
|
return {
|
|
3958
3978
|
...identity,
|
|
3959
3979
|
sign: async (tx, inputIndexes) => {
|
|
3960
|
-
const signed =
|
|
3980
|
+
const signed = chunkVVFCCNU2_cjs.Transaction.fromPSBT(
|
|
3961
3981
|
(await identity.sign(tx.clone(), inputIndexes)).toPSBT()
|
|
3962
3982
|
);
|
|
3963
3983
|
const indexes = inputIndexes ?? Array.from({ length: signed.inputsLength }, (_, i) => i);
|
|
3964
3984
|
for (const index of indexes) {
|
|
3965
|
-
|
|
3985
|
+
chunkVVFCCNU2_cjs.setArkPsbtField(signed, index, chunkVVFCCNU2_cjs.ConditionWitness, [preimage]);
|
|
3966
3986
|
}
|
|
3967
3987
|
return signed;
|
|
3968
3988
|
}
|
|
@@ -4145,7 +4165,7 @@ function extendCoinWithTapscript(boardingTapscript, utxo) {
|
|
|
4145
4165
|
};
|
|
4146
4166
|
}
|
|
4147
4167
|
function deriveContractTapscripts(contract) {
|
|
4148
|
-
const handler =
|
|
4168
|
+
const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
|
|
4149
4169
|
if (!handler) {
|
|
4150
4170
|
throw new Error(`No handler for contract type '${contract.type}'`);
|
|
4151
4171
|
}
|
|
@@ -4214,6 +4234,18 @@ function getRandomId() {
|
|
|
4214
4234
|
const randomValue = crypto.getRandomValues(new Uint8Array(16));
|
|
4215
4235
|
return base.hex.encode(randomValue);
|
|
4216
4236
|
}
|
|
4237
|
+
var sdkPicked = /* @__PURE__ */ new WeakSet();
|
|
4238
|
+
function markSdkPicked(params) {
|
|
4239
|
+
sdkPicked.add(params);
|
|
4240
|
+
return params;
|
|
4241
|
+
}
|
|
4242
|
+
function isSdkPicked(params) {
|
|
4243
|
+
return params !== void 0 && sdkPicked.has(params);
|
|
4244
|
+
}
|
|
4245
|
+
function getSelectableBoardingUtxos(wallet) {
|
|
4246
|
+
const selectable = wallet.getSelectableBoardingUtxos;
|
|
4247
|
+
return typeof selectable === "function" ? selectable.call(wallet) : wallet.getBoardingUtxos();
|
|
4248
|
+
}
|
|
4217
4249
|
function assertRecipientArkadeAddress(encoded, address, context) {
|
|
4218
4250
|
if (address.hrp !== context.hrp) {
|
|
4219
4251
|
throw new Error(
|
|
@@ -4236,7 +4268,7 @@ function assertRecipientArkadeAddress(encoded, address, context) {
|
|
|
4236
4268
|
function assertTapTreeDerivesAddress(encoded, tapTree, address) {
|
|
4237
4269
|
let derived;
|
|
4238
4270
|
try {
|
|
4239
|
-
derived =
|
|
4271
|
+
derived = chunkVVFCCNU2_cjs.VtxoScript.decode(tapTree).pkScript;
|
|
4240
4272
|
} catch (e) {
|
|
4241
4273
|
throw new Error(
|
|
4242
4274
|
`Invalid tapTree for ${encoded}: ${e instanceof Error ? e.message : String(e)}`
|
|
@@ -4253,7 +4285,7 @@ function validateRecipients(recipients, dustAmount, context) {
|
|
|
4253
4285
|
for (const recipient of recipients) {
|
|
4254
4286
|
let address;
|
|
4255
4287
|
try {
|
|
4256
|
-
address =
|
|
4288
|
+
address = chunkVVFCCNU2_cjs.ArkAddress.decode(recipient.address);
|
|
4257
4289
|
} catch (e) {
|
|
4258
4290
|
throw new Error(`Invalid Arkade address: ${recipient.address}`);
|
|
4259
4291
|
}
|
|
@@ -4278,7 +4310,7 @@ function validateRecipients(recipients, dustAmount, context) {
|
|
|
4278
4310
|
|
|
4279
4311
|
// src/contracts/spendability.ts
|
|
4280
4312
|
function isContractGenericallySpendable(contract) {
|
|
4281
|
-
return
|
|
4313
|
+
return chunkCFOIHLON_cjs.contractHandlers.get(contract.type)?.isGenericallySpendable?.(contract) === true;
|
|
4282
4314
|
}
|
|
4283
4315
|
function gatedContracts(contracts) {
|
|
4284
4316
|
const gated = /* @__PURE__ */ new Map();
|
|
@@ -4300,7 +4332,7 @@ function gateExclusion(gated) {
|
|
|
4300
4332
|
return (vtxo) => {
|
|
4301
4333
|
const type = gatedTypeOf(vtxo, gated);
|
|
4302
4334
|
if (type === void 0) return void 0;
|
|
4303
|
-
if (!
|
|
4335
|
+
if (!chunkCFOIHLON_cjs.contractHandlers.has(type)) {
|
|
4304
4336
|
return `at ${vtxo.script} (contract type '${type}') has no handler registered in this build`;
|
|
4305
4337
|
}
|
|
4306
4338
|
return `at ${vtxo.script} (contract type '${type}') is not generically spendable`;
|
|
@@ -4336,7 +4368,7 @@ function selectPendingRecoveryOutpoints(contractsWithVtxos, signerSet, nowSecond
|
|
|
4336
4368
|
continue;
|
|
4337
4369
|
}
|
|
4338
4370
|
for (const v of vtxos) {
|
|
4339
|
-
if (!
|
|
4371
|
+
if (!chunkVVFCCNU2_cjs.isVtxoSpent(v) && !v.isSwept && !v.isUnrolled) {
|
|
4340
4372
|
out.add(`${v.txid}:${v.vout}`);
|
|
4341
4373
|
}
|
|
4342
4374
|
}
|
|
@@ -4372,10 +4404,14 @@ function byValueDescending(vtxos) {
|
|
|
4372
4404
|
return [...vtxos].sort((a, b) => b.value - a.value);
|
|
4373
4405
|
}
|
|
4374
4406
|
async function fetchTimeHeight(wallet) {
|
|
4375
|
-
return
|
|
4407
|
+
return chunkVVFCCNU2_cjs.resolveTimeHeight(wallet.onchainProvider);
|
|
4408
|
+
}
|
|
4409
|
+
function heldVtxosOf(wallet) {
|
|
4410
|
+
const held = wallet.getHeldVtxos;
|
|
4411
|
+
return typeof held === "function" ? held.call(wallet) : Promise.resolve([]);
|
|
4376
4412
|
}
|
|
4377
4413
|
function canMigrateBySend(vtxo, now) {
|
|
4378
|
-
if (!
|
|
4414
|
+
if (!chunkVVFCCNU2_cjs.canSpendOffchain(vtxo, now)) return false;
|
|
4379
4415
|
return vtxo.expiresAt !== void 0 || vtxo.expiresAtHeight !== void 0;
|
|
4380
4416
|
}
|
|
4381
4417
|
function byExpiryAscending(vtxos, now) {
|
|
@@ -4383,7 +4419,7 @@ function byExpiryAscending(vtxos, now) {
|
|
|
4383
4419
|
if (vtxo.isSwept) return -Infinity;
|
|
4384
4420
|
if (vtxo.expiresAt !== void 0) return vtxo.expiresAt.getTime();
|
|
4385
4421
|
if (vtxo.expiresAtHeight !== void 0) {
|
|
4386
|
-
return
|
|
4422
|
+
return chunkVVFCCNU2_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
|
|
4387
4423
|
}
|
|
4388
4424
|
return Infinity;
|
|
4389
4425
|
};
|
|
@@ -4410,7 +4446,7 @@ function priceSettlementInputs(vtxos, estimator) {
|
|
|
4410
4446
|
const payable = [];
|
|
4411
4447
|
const net = /* @__PURE__ */ new Map();
|
|
4412
4448
|
for (const vtxo of vtxos) {
|
|
4413
|
-
const inputFee = estimator.evalOffchainInput(
|
|
4449
|
+
const inputFee = estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(vtxo));
|
|
4414
4450
|
if (inputFee.satoshis >= vtxo.value) {
|
|
4415
4451
|
continue;
|
|
4416
4452
|
}
|
|
@@ -4439,7 +4475,7 @@ function offchainOutputFee(amount, estimator, arkAddress) {
|
|
|
4439
4475
|
}
|
|
4440
4476
|
const outputFee = estimator.evalOffchainOutput({
|
|
4441
4477
|
amount,
|
|
4442
|
-
script: base.hex.encode(
|
|
4478
|
+
script: base.hex.encode(chunkVVFCCNU2_cjs.ArkAddress.decode(arkAddress).pkScript)
|
|
4443
4479
|
});
|
|
4444
4480
|
return BigInt(outputFee.satoshis);
|
|
4445
4481
|
}
|
|
@@ -4490,10 +4526,10 @@ var DEFAULT_SETTLEMENT_CONFIG = {
|
|
|
4490
4526
|
};
|
|
4491
4527
|
function getRecoverableVtxos(vtxos, dustAmount, now) {
|
|
4492
4528
|
return vtxos.filter((vtxo) => {
|
|
4493
|
-
if (
|
|
4529
|
+
if (chunkVVFCCNU2_cjs.canRecoverOnchain(vtxo, now)) {
|
|
4494
4530
|
return true;
|
|
4495
4531
|
}
|
|
4496
|
-
if (
|
|
4532
|
+
if (chunkVVFCCNU2_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
|
|
4497
4533
|
return true;
|
|
4498
4534
|
}
|
|
4499
4535
|
return false;
|
|
@@ -4525,7 +4561,7 @@ function getRecoverableWithSubdust(vtxos, dustAmount, now) {
|
|
|
4525
4561
|
function isVtxoExpiringSoon(vtxo, thresholdMs) {
|
|
4526
4562
|
if (vtxo.isUnrolled) return false;
|
|
4527
4563
|
const realThresholdMs = thresholdMs <= 100 ? DEFAULT_THRESHOLD_MS : thresholdMs;
|
|
4528
|
-
const expiresAt =
|
|
4564
|
+
const expiresAt = chunkVVFCCNU2_cjs.normalizeVtxo(vtxo).expiresAt;
|
|
4529
4565
|
if (expiresAt === void 0) return false;
|
|
4530
4566
|
const now = Date.now();
|
|
4531
4567
|
const batchExpiry = expiresAt.getTime();
|
|
@@ -4536,7 +4572,7 @@ function getExpiringAndRecoverableVtxos(vtxos, thresholdMs, dustAmount, now) {
|
|
|
4536
4572
|
return vtxos.filter(
|
|
4537
4573
|
// The leading exclusion covers the `isSubdust` arm too, which is a value
|
|
4538
4574
|
// property and would otherwise re-admit an exited coin on its own.
|
|
4539
|
-
(vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) ||
|
|
4575
|
+
(vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) || chunkVVFCCNU2_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount))
|
|
4540
4576
|
);
|
|
4541
4577
|
}
|
|
4542
4578
|
function isMigrationCapable(wallet) {
|
|
@@ -4596,7 +4632,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
4596
4632
|
constructor(wallet, settlementConfig) {
|
|
4597
4633
|
this.wallet = wallet;
|
|
4598
4634
|
if (settlementConfig !== false) {
|
|
4599
|
-
|
|
4635
|
+
chunkVVFCCNU2_cjs.assertTimerMs("pollIntervalMs", settlementConfig?.pollIntervalMs);
|
|
4600
4636
|
}
|
|
4601
4637
|
this.settlementConfig = settlementConfig !== void 0 ? settlementConfig : { ...DEFAULT_SETTLEMENT_CONFIG };
|
|
4602
4638
|
this.contractEventsSubscriptionReady = this.initializeSubscription();
|
|
@@ -4903,7 +4939,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
4903
4939
|
* {@link recoverImportedContracts}).
|
|
4904
4940
|
*/
|
|
4905
4941
|
async recoverOneImportedContract(wallet, contract, vtxos, info, dustAmount) {
|
|
4906
|
-
const recoverable = vtxos.filter((vtxo) => vtxo.isSwept && !
|
|
4942
|
+
const recoverable = vtxos.filter((vtxo) => vtxo.isSwept && !chunkVVFCCNU2_cjs.isVtxoSpent(vtxo));
|
|
4907
4943
|
const estimator = new Estimator(info?.fees.intentFee ?? {});
|
|
4908
4944
|
const { payable, net } = priceSettlementInputs(recoverable, estimator);
|
|
4909
4945
|
const vtxoMaxAmount = info?.vtxoMaxAmount ?? -1n;
|
|
@@ -4925,7 +4961,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
4925
4961
|
if (vtxos.length === 0) return;
|
|
4926
4962
|
const spent = new Set(batch.map((vtxo) => `${vtxo.txid}:${vtxo.vout}`));
|
|
4927
4963
|
const stillSpendable = vtxos.some(
|
|
4928
|
-
(vtxo) => !
|
|
4964
|
+
(vtxo) => !chunkVVFCCNU2_cjs.isVtxoSpent(vtxo) && !spent.has(`${vtxo.txid}:${vtxo.vout}`)
|
|
4929
4965
|
);
|
|
4930
4966
|
if (!stillSpendable) {
|
|
4931
4967
|
await wallet.removeRecoveryContract(contract.script);
|
|
@@ -4974,12 +5010,37 @@ var VtxoManager = class _VtxoManager {
|
|
|
4974
5010
|
genericallySpendableOnly: true
|
|
4975
5011
|
});
|
|
4976
5012
|
const threshold = thresholdMs !== void 0 ? thresholdMs : this.configuredThresholdMs();
|
|
4977
|
-
|
|
4978
|
-
|
|
4979
|
-
|
|
4980
|
-
|
|
4981
|
-
|
|
4982
|
-
|
|
5013
|
+
const tip = now ?? await fetchTimeHeight(this.wallet);
|
|
5014
|
+
await this.warnHeldExpiring(threshold, tip);
|
|
5015
|
+
return getExpiringAndRecoverableVtxos(vtxos, threshold, getDustAmount(this.wallet), tip);
|
|
5016
|
+
}
|
|
5017
|
+
/** Outpoints {@link warnHeldExpiring} last reported, so each is reported once while held. */
|
|
5018
|
+
heldExpiringWarned = /* @__PURE__ */ new Set();
|
|
5019
|
+
/**
|
|
5020
|
+
* A hold outranks renewal: renewing would change the outpoint under the holder, whose spend
|
|
5021
|
+
* by name would then fail. So the VTXO is skipped, and only this warning says it is drifting
|
|
5022
|
+
* toward a sweep. Best-effort: a failed read never blocks renewal.
|
|
5023
|
+
*/
|
|
5024
|
+
async warnHeldExpiring(threshold, now) {
|
|
5025
|
+
let keys;
|
|
5026
|
+
try {
|
|
5027
|
+
const held = await heldVtxosOf(this.wallet);
|
|
5028
|
+
keys = getExpiringAndRecoverableVtxos(
|
|
5029
|
+
held,
|
|
5030
|
+
threshold,
|
|
5031
|
+
getDustAmount(this.wallet),
|
|
5032
|
+
now
|
|
5033
|
+
).map((vtxo) => `${vtxo.txid}:${vtxo.vout}`);
|
|
5034
|
+
} catch {
|
|
5035
|
+
return;
|
|
5036
|
+
}
|
|
5037
|
+
const fresh = keys.filter((key) => !this.heldExpiringWarned.has(key));
|
|
5038
|
+
this.heldExpiringWarned = new Set(keys);
|
|
5039
|
+
if (fresh.length > 0) {
|
|
5040
|
+
console.warn(
|
|
5041
|
+
`Renewal: ${fresh.length} VTXO(s) due for renewal are held by reserveVtxos and will not be renewed; spend or release them before they expire: ${fresh.join(", ")}`
|
|
5042
|
+
);
|
|
5043
|
+
}
|
|
4983
5044
|
}
|
|
4984
5045
|
/**
|
|
4985
5046
|
* Renew expiring virtual outputs (including recoverable ones) by settling them back to the
|
|
@@ -5089,10 +5150,10 @@ var VtxoManager = class _VtxoManager {
|
|
|
5089
5150
|
}
|
|
5090
5151
|
}
|
|
5091
5152
|
const txid = await this.wallet.settle(
|
|
5092
|
-
{
|
|
5153
|
+
markSdkPicked({
|
|
5093
5154
|
inputs: vtxos,
|
|
5094
5155
|
outputs: amounts.map((amount) => ({ address: arkAddress, amount }))
|
|
5095
|
-
},
|
|
5156
|
+
}),
|
|
5096
5157
|
eventCallback
|
|
5097
5158
|
);
|
|
5098
5159
|
return txid;
|
|
@@ -5192,11 +5253,11 @@ var VtxoManager = class _VtxoManager {
|
|
|
5192
5253
|
`Sweep not economical: output ${outputAmount} sats after ${fee} sats fee is below dust (${dustAmount} sats)`
|
|
5193
5254
|
);
|
|
5194
5255
|
}
|
|
5195
|
-
const tx = new
|
|
5256
|
+
const tx = new chunkVVFCCNU2_cjs.Transaction();
|
|
5196
5257
|
for (const utxo of expiredUtxos) {
|
|
5197
|
-
const utxoScript =
|
|
5258
|
+
const utxoScript = chunkVVFCCNU2_cjs.VtxoScript.decode(utxo.tapTree);
|
|
5198
5259
|
const utxoExitLeaf = utxoScript.leaves.find(
|
|
5199
|
-
(leaf) =>
|
|
5260
|
+
(leaf) => chunkVVFCCNU2_cjs.CSVMultisigTapscript.isScriptValid(chunkVVFCCNU2_cjs.scriptFromTapLeafScript(leaf)) === true
|
|
5200
5261
|
);
|
|
5201
5262
|
if (!utxoExitLeaf) {
|
|
5202
5263
|
throw new Error(
|
|
@@ -5211,7 +5272,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5211
5272
|
amount: BigInt(utxo.value)
|
|
5212
5273
|
},
|
|
5213
5274
|
tapLeafScript: [utxoExitLeaf],
|
|
5214
|
-
sequence:
|
|
5275
|
+
sequence: chunkVVFCCNU2_cjs.getSequence(utxoExitLeaf)
|
|
5215
5276
|
});
|
|
5216
5277
|
}
|
|
5217
5278
|
tx.addOutputAddress(boardingAddress, outputAmount, this.getNetwork());
|
|
@@ -5437,8 +5498,8 @@ var VtxoManager = class _VtxoManager {
|
|
|
5437
5498
|
const cls = classifyAgainstSignerSet(serverPubKey, signerSet, nowSeconds);
|
|
5438
5499
|
if (cls.status === "CURRENT") continue;
|
|
5439
5500
|
const live = vtxos.filter((v) => !v.isUnrolled);
|
|
5440
|
-
const recoverable = live.filter((v) => v.isSwept && !
|
|
5441
|
-
const spendable = live.filter((v) => !
|
|
5501
|
+
const recoverable = live.filter((v) => v.isSwept && !chunkVVFCCNU2_cjs.isVtxoSpent(v));
|
|
5502
|
+
const spendable = live.filter((v) => !chunkVVFCCNU2_cjs.isVtxoSpent(v) && !v.isSwept);
|
|
5442
5503
|
const value = spendable.reduce((sum, v) => sum + v.value, 0);
|
|
5443
5504
|
let recoverableCount = 0;
|
|
5444
5505
|
let recoverableValue = 0;
|
|
@@ -5678,7 +5739,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5678
5739
|
}
|
|
5679
5740
|
getBoardingTimelock() {
|
|
5680
5741
|
const wallet = this.getSweepWallet();
|
|
5681
|
-
const exitScript =
|
|
5742
|
+
const exitScript = chunkVVFCCNU2_cjs.CSVMultisigTapscript.decode(
|
|
5682
5743
|
base.hex.decode(wallet.boardingTapscript.exitScript)
|
|
5683
5744
|
);
|
|
5684
5745
|
return exitScript.params.timelock;
|
|
@@ -5728,7 +5789,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5728
5789
|
if (e.message.includes("is below dust threshold")) {
|
|
5729
5790
|
return;
|
|
5730
5791
|
}
|
|
5731
|
-
if (e.message.includes("VTXO_ALREADY_REGISTERED") || e.message.includes("duplicated input")) {
|
|
5792
|
+
if (e.name === "VtxoReservedError" || e.message.includes("VTXO_ALREADY_REGISTERED") || e.message.includes("duplicated input")) {
|
|
5732
5793
|
return;
|
|
5733
5794
|
}
|
|
5734
5795
|
if (e.message.includes("VTXO_ALREADY_SPENT")) {
|
|
@@ -5786,8 +5847,8 @@ var VtxoManager = class _VtxoManager {
|
|
|
5786
5847
|
}
|
|
5787
5848
|
/** The outpoint a `VTXO_ALREADY_SPENT` error carries in `metadata.vtxo_outpoint`, if any. */
|
|
5788
5849
|
extractSpentOutpoint(error) {
|
|
5789
|
-
const ark =
|
|
5790
|
-
if (!
|
|
5850
|
+
const ark = chunkVVFCCNU2_cjs.maybeArkError(error);
|
|
5851
|
+
if (!chunkVVFCCNU2_cjs.isArkError(ark, chunkVVFCCNU2_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
|
|
5791
5852
|
const raw = ark.metadata?.vtxo_outpoint;
|
|
5792
5853
|
if (typeof raw !== "string") return void 0;
|
|
5793
5854
|
const [txid, voutStr] = raw.split(":");
|
|
@@ -5856,7 +5917,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5856
5917
|
let hadError = false;
|
|
5857
5918
|
try {
|
|
5858
5919
|
await runWithCrossInstanceLock(BOARDING_POLL_LOCK_NAME, async () => {
|
|
5859
|
-
const boardingUtxos = await this.wallet
|
|
5920
|
+
const boardingUtxos = await getSelectableBoardingUtxos(this.wallet);
|
|
5860
5921
|
try {
|
|
5861
5922
|
await this.runPeriodicSettle(boardingUtxos);
|
|
5862
5923
|
} catch (e) {
|
|
@@ -5961,7 +6022,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5961
6022
|
if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
|
|
5962
6023
|
break;
|
|
5963
6024
|
}
|
|
5964
|
-
const inputFee = estimator.evalOffchainInput(
|
|
6025
|
+
const inputFee = estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(v));
|
|
5965
6026
|
if (inputFee.satoshis >= v.value) {
|
|
5966
6027
|
continue;
|
|
5967
6028
|
}
|
|
@@ -5981,7 +6042,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
5981
6042
|
const arkAddress = await this.wallet.getAddress();
|
|
5982
6043
|
const outputFee = estimator.evalOffchainOutput({
|
|
5983
6044
|
amount: totalAmount,
|
|
5984
|
-
script: base.hex.encode(
|
|
6045
|
+
script: base.hex.encode(chunkVVFCCNU2_cjs.ArkAddress.decode(arkAddress).pkScript)
|
|
5985
6046
|
});
|
|
5986
6047
|
totalAmount -= BigInt(outputFee.satoshis);
|
|
5987
6048
|
if (totalAmount < dustAmount) return;
|
|
@@ -5990,20 +6051,24 @@ var VtxoManager = class _VtxoManager {
|
|
|
5990
6051
|
this.renewalInProgress = true;
|
|
5991
6052
|
}
|
|
5992
6053
|
let success = false;
|
|
5993
|
-
let
|
|
6054
|
+
let skipWithoutBackoff = false;
|
|
5994
6055
|
try {
|
|
5995
6056
|
try {
|
|
5996
|
-
await this.wallet.settle(
|
|
5997
|
-
|
|
5998
|
-
|
|
5999
|
-
|
|
6057
|
+
await this.wallet.settle(
|
|
6058
|
+
markSdkPicked({
|
|
6059
|
+
inputs: [...filteredBoarding, ...filteredVtxos],
|
|
6060
|
+
outputs: [{ address: arkAddress, amount: totalAmount }]
|
|
6061
|
+
})
|
|
6062
|
+
);
|
|
6000
6063
|
for (const u of filteredBoarding) {
|
|
6001
6064
|
this.knownBoardingUtxos.add(`${u.txid}:${u.vout}`);
|
|
6002
6065
|
}
|
|
6003
6066
|
success = true;
|
|
6004
6067
|
} catch (e) {
|
|
6005
|
-
if (e instanceof Error && e.
|
|
6006
|
-
|
|
6068
|
+
if (e instanceof Error && e.name === "VtxoReservedError") {
|
|
6069
|
+
skipWithoutBackoff = true;
|
|
6070
|
+
} else if (e instanceof Error && e.message.includes("VTXO_ALREADY_SPENT")) {
|
|
6071
|
+
skipWithoutBackoff = true;
|
|
6007
6072
|
void this.maybeRefreshAfterVtxoSpent(this.extractSpentOutpoint(e));
|
|
6008
6073
|
} else {
|
|
6009
6074
|
throw e;
|
|
@@ -6017,7 +6082,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
6017
6082
|
}
|
|
6018
6083
|
if (success) {
|
|
6019
6084
|
this.consecutivePeriodicSettleFailures = 0;
|
|
6020
|
-
} else if (!
|
|
6085
|
+
} else if (!skipWithoutBackoff) {
|
|
6021
6086
|
this.consecutivePeriodicSettleFailures++;
|
|
6022
6087
|
}
|
|
6023
6088
|
}
|
|
@@ -6061,7 +6126,7 @@ var ArkNote = class _ArkNote {
|
|
|
6061
6126
|
this.value = value;
|
|
6062
6127
|
this.HRP = HRP;
|
|
6063
6128
|
const preimageHash = utils_js.sha256(this.preimage);
|
|
6064
|
-
this.vtxoScript = new
|
|
6129
|
+
this.vtxoScript = new chunkVVFCCNU2_cjs.VtxoScript([noteTapscript(preimageHash)]);
|
|
6065
6130
|
const leaf = this.vtxoScript.leaves[0];
|
|
6066
6131
|
this.txid = base.hex.encode(new Uint8Array(preimageHash).reverse());
|
|
6067
6132
|
this.tapTree = this.vtxoScript.encode();
|
|
@@ -6234,7 +6299,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
6234
6299
|
const privateKey = data.slice(1, 33);
|
|
6235
6300
|
const serverPubKey = data.slice(33, 65);
|
|
6236
6301
|
const sequence = new DataView(data.buffer, data.byteOffset + 65, 4).getUint32(0, false);
|
|
6237
|
-
const csvTimelock2 =
|
|
6302
|
+
const csvTimelock2 = chunkVVFCCNU2_cjs.sequenceToTimelock(sequence);
|
|
6238
6303
|
return new _ArkadeCash(privateKey, serverPubKey, csvTimelock2, decoded.prefix);
|
|
6239
6304
|
}
|
|
6240
6305
|
toString() {
|
|
@@ -6242,7 +6307,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
6242
6307
|
data[0] = _ArkadeCash.Version;
|
|
6243
6308
|
data.set(this._privateKey, 1);
|
|
6244
6309
|
data.set(this._serverPubKey, 33);
|
|
6245
|
-
const sequence =
|
|
6310
|
+
const sequence = chunkVVFCCNU2_cjs.timelockToSequence(this.csvTimelock);
|
|
6246
6311
|
new DataView(data.buffer, data.byteOffset + 65, 4).setUint32(0, sequence, false);
|
|
6247
6312
|
const words = base.bech32m.toWords(data);
|
|
6248
6313
|
return base.bech32m.encode(this.hrp, words, 1023);
|
|
@@ -6251,7 +6316,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
6251
6316
|
return SingleKey.fromPrivateKey(this._privateKey);
|
|
6252
6317
|
}
|
|
6253
6318
|
get vtxoScript() {
|
|
6254
|
-
return new
|
|
6319
|
+
return new chunkCFOIHLON_cjs.DefaultVtxo.Script({
|
|
6255
6320
|
pubKey: this._publicKey,
|
|
6256
6321
|
serverPubKey: this._serverPubKey,
|
|
6257
6322
|
csvTimelock: this.csvTimelock
|
|
@@ -6267,7 +6332,7 @@ var NON_TERMINAL_INTENT_STATES = ALL_INTENT_STATES.filter(
|
|
|
6267
6332
|
(s) => !isTerminalIntentState(s)
|
|
6268
6333
|
);
|
|
6269
6334
|
function isConsumed(vtxo) {
|
|
6270
|
-
return vtxo !== void 0 &&
|
|
6335
|
+
return vtxo !== void 0 && chunkVVFCCNU2_cjs.isVtxoSpent(vtxo);
|
|
6271
6336
|
}
|
|
6272
6337
|
async function classifyIntent(intent, vtxosByOutpoint, now) {
|
|
6273
6338
|
if (isTerminalIntentState(intent.state)) return void 0;
|
|
@@ -6310,7 +6375,7 @@ async function reconcileIntents(deps) {
|
|
|
6310
6375
|
let vtxosByOutpoint = /* @__PURE__ */ new Map();
|
|
6311
6376
|
if (outpoints.length > 0) {
|
|
6312
6377
|
try {
|
|
6313
|
-
const { vtxos } = await
|
|
6378
|
+
const { vtxos } = await chunkVVFCCNU2_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
|
|
6314
6379
|
vtxosByOutpoint = new Map(vtxos.map((v) => [outpointKey(v), v]));
|
|
6315
6380
|
} catch (e) {
|
|
6316
6381
|
console.error("reconcileIntents: failed to fetch input VTXO state", e);
|
|
@@ -6370,7 +6435,7 @@ async function releaseFromServer(intent, deps, now) {
|
|
|
6370
6435
|
});
|
|
6371
6436
|
}
|
|
6372
6437
|
function isNoMatchingIntentsError(e) {
|
|
6373
|
-
return
|
|
6438
|
+
return chunkVVFCCNU2_cjs.isArkError(e, chunkVVFCCNU2_cjs.ArkErrorName.INVALID_INTENT_PROOF) && e.message.includes("no matching intents found");
|
|
6374
6439
|
}
|
|
6375
6440
|
function terminal(intent, state, now, patch) {
|
|
6376
6441
|
return { ...intent, ...patch, state, updatedAt: now };
|
|
@@ -6589,7 +6654,7 @@ async function captureExitBranch(params) {
|
|
|
6589
6654
|
const nonCommitment = ordered.filter((c) => chainTxTypeToChainedExit(c.type) !== 1 /* Commitment */).map((c) => c.txid);
|
|
6590
6655
|
if (nonCommitment.length > 0) {
|
|
6591
6656
|
for (const psbt of await resolver.getVirtualTxs(nonCommitment)) {
|
|
6592
|
-
psbtByTxid.set(
|
|
6657
|
+
psbtByTxid.set(chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
6593
6658
|
}
|
|
6594
6659
|
}
|
|
6595
6660
|
}
|
|
@@ -6632,10 +6697,10 @@ var IndexerExitDataSource = class {
|
|
|
6632
6697
|
while (hasMore) {
|
|
6633
6698
|
const { chain: page, page: meta } = await this.indexer.getVtxoChain(
|
|
6634
6699
|
{ txid: vtxo.txid, vout: vtxo.vout },
|
|
6635
|
-
{ pageIndex, pageSize:
|
|
6700
|
+
{ pageIndex, pageSize: chunkVVFCCNU2_cjs.DEFAULT_PAGE_SIZE }
|
|
6636
6701
|
);
|
|
6637
6702
|
chain.push(...page);
|
|
6638
|
-
hasMore = meta ? page.length ===
|
|
6703
|
+
hasMore = meta ? page.length === chunkVVFCCNU2_cjs.DEFAULT_PAGE_SIZE : false;
|
|
6639
6704
|
pageIndex++;
|
|
6640
6705
|
}
|
|
6641
6706
|
return chain;
|
|
@@ -6647,12 +6712,12 @@ var IndexerExitDataSource = class {
|
|
|
6647
6712
|
while (hasMore) {
|
|
6648
6713
|
const { txs, page } = await this.indexer.getVirtualTxs(txids, {
|
|
6649
6714
|
pageIndex,
|
|
6650
|
-
pageSize:
|
|
6715
|
+
pageSize: chunkVVFCCNU2_cjs.DEFAULT_PAGE_SIZE
|
|
6651
6716
|
});
|
|
6652
6717
|
for (const psbt of txs) {
|
|
6653
|
-
out.set(
|
|
6718
|
+
out.set(chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
6654
6719
|
}
|
|
6655
|
-
hasMore = page ? txs.length ===
|
|
6720
|
+
hasMore = page ? txs.length === chunkVVFCCNU2_cjs.DEFAULT_PAGE_SIZE : false;
|
|
6656
6721
|
pageIndex++;
|
|
6657
6722
|
}
|
|
6658
6723
|
return out;
|
|
@@ -6673,7 +6738,7 @@ function chainedTxTypeToChainTxType(t) {
|
|
|
6673
6738
|
}
|
|
6674
6739
|
}
|
|
6675
6740
|
function psbtInputTxids(psbtBase64) {
|
|
6676
|
-
return txInputTxids(
|
|
6741
|
+
return txInputTxids(chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64)));
|
|
6677
6742
|
}
|
|
6678
6743
|
function txInputTxids(tx) {
|
|
6679
6744
|
const ids = [];
|
|
@@ -6977,10 +7042,10 @@ async function resolveArkInfo(arkProvider, walletRepository, opts) {
|
|
|
6977
7042
|
try {
|
|
6978
7043
|
info = await arkProvider.getInfo();
|
|
6979
7044
|
} catch (err) {
|
|
6980
|
-
if (opts?.requireLive || !
|
|
7045
|
+
if (opts?.requireLive || !chunkVVFCCNU2_cjs.isRetryableProviderError(err)) throw err;
|
|
6981
7046
|
const snapshot = await loadArkInfoSnapshot(walletRepository);
|
|
6982
7047
|
if (!snapshot) {
|
|
6983
|
-
throw new
|
|
7048
|
+
throw new chunkVVFCCNU2_cjs.ProviderUnavailableError(
|
|
6984
7049
|
"Arkade server info is unavailable and no cached snapshot exists",
|
|
6985
7050
|
{ cause: err }
|
|
6986
7051
|
);
|
|
@@ -7172,7 +7237,7 @@ function buildGraph(rootTxid, chunksByTxid) {
|
|
|
7172
7237
|
return new TxTree(rootTx, children);
|
|
7173
7238
|
}
|
|
7174
7239
|
function decodeNode(chunk) {
|
|
7175
|
-
const tx =
|
|
7240
|
+
const tx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(chunk.tx));
|
|
7176
7241
|
return { tx, children: chunk.children };
|
|
7177
7242
|
}
|
|
7178
7243
|
exports.Batch = void 0;
|
|
@@ -7375,7 +7440,7 @@ function collectArkTxidsNeedingCreatedAt(vtxos, localCreatedAt) {
|
|
|
7375
7440
|
return [...txids];
|
|
7376
7441
|
}
|
|
7377
7442
|
async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnore, resolveTxCreatedAt, gatedScripts = /* @__PURE__ */ new Map()) {
|
|
7378
|
-
const normalized = vtxos.map(
|
|
7443
|
+
const normalized = vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
|
|
7379
7444
|
const localCreatedAt = localCreatedAtByTxid(normalized);
|
|
7380
7445
|
const gatedVtxos = normalized.filter((vtxo) => isGatedVtxo(vtxo, gatedScripts));
|
|
7381
7446
|
const ownVtxos = normalized.filter((vtxo) => !isGatedVtxo(vtxo, gatedScripts));
|
|
@@ -7542,6 +7607,9 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7542
7607
|
* ```
|
|
7543
7608
|
*/
|
|
7544
7609
|
async issue(params) {
|
|
7610
|
+
return this.wallet.withSpendLock((submit) => this.issueWith(params, submit));
|
|
7611
|
+
}
|
|
7612
|
+
async issueWith(params, submit) {
|
|
7545
7613
|
if (params.amount <= 0n) {
|
|
7546
7614
|
throw new Error(`Issue amount must be greater than 0, got ${params.amount}`);
|
|
7547
7615
|
}
|
|
@@ -7550,7 +7618,7 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7550
7618
|
withRecoverable: false,
|
|
7551
7619
|
genericallySpendableOnly: true
|
|
7552
7620
|
});
|
|
7553
|
-
const controlAssetRef = params.controlAssetId ?
|
|
7621
|
+
const controlAssetRef = params.controlAssetId ? chunkFEBAG2K2_cjs.AssetRef.fromId(chunkFEBAG2K2_cjs.AssetId.fromString(params.controlAssetId)) : null;
|
|
7554
7622
|
const coinSelection = selectVirtualCoins(virtualCoins, Number(this.wallet.dustAmount));
|
|
7555
7623
|
let totalBtcSelected = 0n;
|
|
7556
7624
|
const assetChanges = /* @__PURE__ */ new Map();
|
|
@@ -7563,8 +7631,8 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7563
7631
|
}
|
|
7564
7632
|
}
|
|
7565
7633
|
const groups = [];
|
|
7566
|
-
const issuedAssetOutput =
|
|
7567
|
-
const issuedAssetGroup =
|
|
7634
|
+
const issuedAssetOutput = chunkFEBAG2K2_cjs.AssetOutput.create(0, params.amount);
|
|
7635
|
+
const issuedAssetGroup = chunkFEBAG2K2_cjs.AssetGroup.create(
|
|
7568
7636
|
null,
|
|
7569
7637
|
controlAssetRef,
|
|
7570
7638
|
[],
|
|
@@ -7577,17 +7645,18 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7577
7645
|
for (const [assetId, amount] of assetChanges) {
|
|
7578
7646
|
const changeInputs = inputsForAsset(assetInputs, assetId);
|
|
7579
7647
|
groups.push(
|
|
7580
|
-
|
|
7581
|
-
|
|
7648
|
+
chunkFEBAG2K2_cjs.AssetGroup.create(
|
|
7649
|
+
chunkFEBAG2K2_cjs.AssetId.fromString(assetId),
|
|
7582
7650
|
null,
|
|
7583
7651
|
changeInputs,
|
|
7584
|
-
[
|
|
7652
|
+
[chunkFEBAG2K2_cjs.AssetOutput.create(0, amount)],
|
|
7585
7653
|
[]
|
|
7586
7654
|
)
|
|
7587
7655
|
);
|
|
7588
7656
|
}
|
|
7589
7657
|
}
|
|
7590
7658
|
const arkTxid = await submitToSelf(
|
|
7659
|
+
submit,
|
|
7591
7660
|
this.wallet,
|
|
7592
7661
|
coinSelection.inputs,
|
|
7593
7662
|
totalBtcSelected,
|
|
@@ -7595,7 +7664,7 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7595
7664
|
);
|
|
7596
7665
|
return {
|
|
7597
7666
|
arkTxId: arkTxid,
|
|
7598
|
-
assetId:
|
|
7667
|
+
assetId: chunkFEBAG2K2_cjs.AssetId.create(arkTxid, 0).toString()
|
|
7599
7668
|
};
|
|
7600
7669
|
}
|
|
7601
7670
|
/**
|
|
@@ -7616,6 +7685,9 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7616
7685
|
* ```
|
|
7617
7686
|
*/
|
|
7618
7687
|
async reissue(params) {
|
|
7688
|
+
return this.wallet.withSpendLock((submit) => this.reissueWith(params, submit));
|
|
7689
|
+
}
|
|
7690
|
+
async reissueWith(params, submit) {
|
|
7619
7691
|
if (params.amount <= 0n) {
|
|
7620
7692
|
throw new Error(`Reissuance amount must be greater than 0, got ${params.amount}`);
|
|
7621
7693
|
}
|
|
@@ -7666,28 +7738,28 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7666
7738
|
const assetInputs = selectedCoinsToAssetInputs(selectedCoins);
|
|
7667
7739
|
const reissueInputs = inputsForAsset(assetInputs, params.assetId);
|
|
7668
7740
|
const totalAssetAmount = assetToReissueAmount + params.amount;
|
|
7669
|
-
const reissueAssetIdObj =
|
|
7670
|
-
const reissueAssetGroup =
|
|
7741
|
+
const reissueAssetIdObj = chunkFEBAG2K2_cjs.AssetId.fromString(params.assetId);
|
|
7742
|
+
const reissueAssetGroup = chunkFEBAG2K2_cjs.AssetGroup.create(
|
|
7671
7743
|
reissueAssetIdObj,
|
|
7672
7744
|
null,
|
|
7673
7745
|
reissueInputs,
|
|
7674
|
-
[
|
|
7746
|
+
[chunkFEBAG2K2_cjs.AssetOutput.create(0, totalAssetAmount)],
|
|
7675
7747
|
[]
|
|
7676
7748
|
);
|
|
7677
7749
|
const groups = [reissueAssetGroup];
|
|
7678
7750
|
for (const [assetId, amount] of assetChanges) {
|
|
7679
7751
|
const changeInputs = inputsForAsset(assetInputs, assetId);
|
|
7680
7752
|
groups.push(
|
|
7681
|
-
|
|
7682
|
-
|
|
7753
|
+
chunkFEBAG2K2_cjs.AssetGroup.create(
|
|
7754
|
+
chunkFEBAG2K2_cjs.AssetId.fromString(assetId),
|
|
7683
7755
|
null,
|
|
7684
7756
|
changeInputs,
|
|
7685
|
-
[
|
|
7757
|
+
[chunkFEBAG2K2_cjs.AssetOutput.create(0, amount)],
|
|
7686
7758
|
[]
|
|
7687
7759
|
)
|
|
7688
7760
|
);
|
|
7689
7761
|
}
|
|
7690
|
-
return submitToSelf(this.wallet, selectedCoins, totalBtcSelected, groups);
|
|
7762
|
+
return submitToSelf(submit, this.wallet, selectedCoins, totalBtcSelected, groups);
|
|
7691
7763
|
}
|
|
7692
7764
|
/**
|
|
7693
7765
|
* Burn assets.
|
|
@@ -7705,6 +7777,9 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7705
7777
|
* ```
|
|
7706
7778
|
*/
|
|
7707
7779
|
async burn(params) {
|
|
7780
|
+
return this.wallet.withSpendLock((submit) => this.burnWith(params, submit));
|
|
7781
|
+
}
|
|
7782
|
+
async burnWith(params, submit) {
|
|
7708
7783
|
if (params.amount <= 0n) {
|
|
7709
7784
|
throw new Error(`Burn amount must be greater than 0, got ${params.amount}`);
|
|
7710
7785
|
}
|
|
@@ -7750,16 +7825,16 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
7750
7825
|
for (const [assetId, amount] of assetChanges) {
|
|
7751
7826
|
const changeInputs = inputsForAsset(assetInputs, assetId);
|
|
7752
7827
|
groups.push(
|
|
7753
|
-
|
|
7754
|
-
|
|
7828
|
+
chunkFEBAG2K2_cjs.AssetGroup.create(
|
|
7829
|
+
chunkFEBAG2K2_cjs.AssetId.fromString(assetId),
|
|
7755
7830
|
null,
|
|
7756
7831
|
changeInputs,
|
|
7757
|
-
amount > 0n ? [
|
|
7832
|
+
amount > 0n ? [chunkFEBAG2K2_cjs.AssetOutput.create(0, amount)] : [],
|
|
7758
7833
|
[]
|
|
7759
7834
|
)
|
|
7760
7835
|
);
|
|
7761
7836
|
}
|
|
7762
|
-
return submitToSelf(this.wallet, selectedCoins, totalBtcSelected, groups);
|
|
7837
|
+
return submitToSelf(submit, this.wallet, selectedCoins, totalBtcSelected, groups);
|
|
7763
7838
|
}
|
|
7764
7839
|
};
|
|
7765
7840
|
function inputsForAsset(assetInputs, assetId) {
|
|
@@ -7767,18 +7842,18 @@ function inputsForAsset(assetInputs, assetId) {
|
|
|
7767
7842
|
for (const [inputIndex, assets] of assetInputs) {
|
|
7768
7843
|
for (const asset of assets) {
|
|
7769
7844
|
if (asset.assetId !== assetId) continue;
|
|
7770
|
-
inputs.push(
|
|
7845
|
+
inputs.push(chunkFEBAG2K2_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
7771
7846
|
}
|
|
7772
7847
|
}
|
|
7773
7848
|
return inputs;
|
|
7774
7849
|
}
|
|
7775
|
-
async function submitToSelf(wallet, inputs, amount, groups) {
|
|
7776
|
-
const outputAddress =
|
|
7850
|
+
async function submitToSelf(submit, wallet, inputs, amount, groups) {
|
|
7851
|
+
const outputAddress = chunkVVFCCNU2_cjs.ArkAddress.decode(await wallet.getAddress());
|
|
7777
7852
|
const outputs = [
|
|
7778
7853
|
{ script: outputAddress.pkScript, amount: BigInt(amount) },
|
|
7779
|
-
Extension.create([
|
|
7854
|
+
Extension.create([chunkFEBAG2K2_cjs.Packet.create(groups)]).txOut()
|
|
7780
7855
|
];
|
|
7781
|
-
const { arkTxid } = await
|
|
7856
|
+
const { arkTxid } = await submit(inputs, outputs);
|
|
7782
7857
|
return arkTxid;
|
|
7783
7858
|
}
|
|
7784
7859
|
function castMetadata(metadata) {
|
|
@@ -7800,7 +7875,7 @@ function castMetadata(metadata) {
|
|
|
7800
7875
|
} else {
|
|
7801
7876
|
throw new Error("Invalid metadata value type");
|
|
7802
7877
|
}
|
|
7803
|
-
md.push(
|
|
7878
|
+
md.push(chunkFEBAG2K2_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
|
|
7804
7879
|
}
|
|
7805
7880
|
return md;
|
|
7806
7881
|
}
|
|
@@ -7821,10 +7896,10 @@ var DelegateManagerImpl = class {
|
|
|
7821
7896
|
if (vtxos.length === 0) {
|
|
7822
7897
|
return { delegated: [], failed: [] };
|
|
7823
7898
|
}
|
|
7824
|
-
const destinationScript =
|
|
7899
|
+
const destinationScript = chunkVVFCCNU2_cjs.ArkAddress.decode(destination).pkScript;
|
|
7825
7900
|
const arkInfo = await this.arkInfoProvider.getInfo();
|
|
7826
7901
|
const delegateInfo = await this.delegateProvider.getDelegateInfo();
|
|
7827
|
-
const eligible = vtxos.map(
|
|
7902
|
+
const eligible = vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo).filter(
|
|
7828
7903
|
(v) => isAnnotated(v) && findDelegateTapLeaf(v, delegateInfo.pubkey) !== void 0
|
|
7829
7904
|
);
|
|
7830
7905
|
if (eligible.length === 0) {
|
|
@@ -7856,7 +7931,7 @@ var DelegateManagerImpl = class {
|
|
|
7856
7931
|
const groupByExpiry = /* @__PURE__ */ new Map();
|
|
7857
7932
|
let recoverableVtxos = [];
|
|
7858
7933
|
for (const vtxo of eligible) {
|
|
7859
|
-
if (
|
|
7934
|
+
if (chunkVVFCCNU2_cjs.canRecoverOnchain(vtxo, now)) {
|
|
7860
7935
|
recoverableVtxos.push(vtxo);
|
|
7861
7936
|
continue;
|
|
7862
7937
|
}
|
|
@@ -7908,7 +7983,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7908
7983
|
}
|
|
7909
7984
|
if (!delegateAt) {
|
|
7910
7985
|
const now = { timestamp: /* @__PURE__ */ new Date() };
|
|
7911
|
-
const expiryTimestamp = vtxos.filter((coin) => !
|
|
7986
|
+
const expiryTimestamp = vtxos.filter((coin) => !chunkVVFCCNU2_cjs.canRecoverOnchain(coin, now) && coin.expiresAt).reduce(
|
|
7912
7987
|
(min, coin) => Math.min(min, coin.expiresAt.getTime()),
|
|
7913
7988
|
Number.MAX_SAFE_INTEGER
|
|
7914
7989
|
);
|
|
@@ -7935,7 +8010,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7935
8010
|
let amount = 0n;
|
|
7936
8011
|
for (const coin of vtxos) {
|
|
7937
8012
|
const inputFee = estimator.evalOffchainInput({
|
|
7938
|
-
...
|
|
8013
|
+
...chunkVVFCCNU2_cjs.toOffchainInputFeeParams(coin),
|
|
7939
8014
|
type: "vtxo"
|
|
7940
8015
|
});
|
|
7941
8016
|
if (inputFee.satoshis >= coin.value) {
|
|
@@ -7949,7 +8024,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7949
8024
|
const delegateFee = BigInt(Number(fee));
|
|
7950
8025
|
if (delegateFee > 0n) {
|
|
7951
8026
|
outputs.push({
|
|
7952
|
-
script:
|
|
8027
|
+
script: chunkVVFCCNU2_cjs.ArkAddress.decode(delegateAddress).pkScript,
|
|
7953
8028
|
amount: delegateFee
|
|
7954
8029
|
});
|
|
7955
8030
|
}
|
|
@@ -7982,10 +8057,10 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
7982
8057
|
destinationScript
|
|
7983
8058
|
);
|
|
7984
8059
|
const forfeitOutputScript = btcSigner.OutScript.encode(
|
|
7985
|
-
btcSigner.Address(
|
|
8060
|
+
btcSigner.Address(chunkVVFCCNU2_cjs.getNetwork(network)).decode(forfeitAddress)
|
|
7986
8061
|
);
|
|
7987
8062
|
const forfeits = await Promise.all(
|
|
7988
|
-
vtxos.filter((v) =>
|
|
8063
|
+
vtxos.filter((v) => chunkVVFCCNU2_cjs.requiresForfeit(v)).map(async (coin) => {
|
|
7989
8064
|
const forfeit = await makeDelegateForfeitTx(
|
|
7990
8065
|
coin,
|
|
7991
8066
|
dust,
|
|
@@ -8010,7 +8085,7 @@ async function makeDelegateForfeitTx(input, connectorAmount, delegatePubkey, for
|
|
|
8010
8085
|
index: input.vout,
|
|
8011
8086
|
witnessUtxo: {
|
|
8012
8087
|
amount: BigInt(input.value),
|
|
8013
|
-
script:
|
|
8088
|
+
script: chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
8014
8089
|
},
|
|
8015
8090
|
sighashType: btcSigner.SigHash.ALL_ANYONECANPAY,
|
|
8016
8091
|
tapLeafScript: [delegateTapLeaf]
|
|
@@ -8068,7 +8143,7 @@ async function makeSignedDelegateIntent(identity, coins, outputs, onchainOutputs
|
|
|
8068
8143
|
expire_at: 0,
|
|
8069
8144
|
cosigners_public_keys: cosignerPubKeys
|
|
8070
8145
|
};
|
|
8071
|
-
const proof =
|
|
8146
|
+
const proof = chunkVVFCCNU2_cjs.Intent.create(message, coins, outputs);
|
|
8072
8147
|
const signedProof = await identity.sign(proof);
|
|
8073
8148
|
return {
|
|
8074
8149
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -8094,10 +8169,10 @@ function getDayTimestamp(timestamp) {
|
|
|
8094
8169
|
function findDelegateTapLeaf(vtxo, delegatePubkey) {
|
|
8095
8170
|
if (!vtxo.tapTree) return void 0;
|
|
8096
8171
|
const pk = delegatePubkey.length === 66 ? delegatePubkey.slice(2) : delegatePubkey;
|
|
8097
|
-
const vtxoScript =
|
|
8172
|
+
const vtxoScript = chunkVVFCCNU2_cjs.VtxoScript.decode(vtxo.tapTree);
|
|
8098
8173
|
return vtxoScript.leaves.find((tapLeaf) => {
|
|
8099
|
-
const arkTapscript =
|
|
8100
|
-
if (!
|
|
8174
|
+
const arkTapscript = chunkVVFCCNU2_cjs.decodeTapscript(chunkVVFCCNU2_cjs.scriptFromTapLeafScript(tapLeaf));
|
|
8175
|
+
if (!chunkVVFCCNU2_cjs.MultisigTapscript.is(arkTapscript)) return false;
|
|
8101
8176
|
return arkTapscript.params.pubkeys.map(base.hex.encode).includes(pk);
|
|
8102
8177
|
});
|
|
8103
8178
|
}
|
|
@@ -8653,8 +8728,8 @@ function checkSaveVtxosForScript(backend, key, vtxos) {
|
|
|
8653
8728
|
}
|
|
8654
8729
|
async function getVtxosForContract(repo, contract, options) {
|
|
8655
8730
|
const vtxos = repo.getVtxosForScriptPage ? await collectScriptVtxos(repo, contract.script, options) : filterVtxosForScript(await collectVtxos(repo, contract.address), contract.script);
|
|
8656
|
-
const normalized = vtxos.map(
|
|
8657
|
-
return options?.unspentOnly ? normalized.filter((vtxo) => !
|
|
8731
|
+
const normalized = vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo);
|
|
8732
|
+
return options?.unspentOnly ? normalized.filter((vtxo) => !chunkVVFCCNU2_cjs.isVtxoSpent(vtxo)) : normalized;
|
|
8658
8733
|
}
|
|
8659
8734
|
async function hasVtxosForContract(repo, contract) {
|
|
8660
8735
|
if (repo.getVtxosForScriptPage) {
|
|
@@ -8885,7 +8960,7 @@ function decodeArkContract(encoded) {
|
|
|
8885
8960
|
}
|
|
8886
8961
|
function contractFromArkContract(encoded, options = {}) {
|
|
8887
8962
|
const parsed = decodeArkContract(encoded);
|
|
8888
|
-
const handler =
|
|
8963
|
+
const handler = chunkCFOIHLON_cjs.contractHandlers.get(parsed.type);
|
|
8889
8964
|
if (!handler) {
|
|
8890
8965
|
throw new Error(`No handler registered for contract type '${parsed.type}'`);
|
|
8891
8966
|
}
|
|
@@ -8899,9 +8974,9 @@ function contractFromArkContract(encoded, options = {}) {
|
|
|
8899
8974
|
metadata: options.metadata
|
|
8900
8975
|
};
|
|
8901
8976
|
}
|
|
8902
|
-
function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix =
|
|
8977
|
+
function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunkVVFCCNU2_cjs.DEFAULT_NETWORK.hrp, options = {}) {
|
|
8903
8978
|
const parsed = decodeArkContract(encoded);
|
|
8904
|
-
const handler =
|
|
8979
|
+
const handler = chunkCFOIHLON_cjs.contractHandlers.getOrThrow(parsed.type);
|
|
8905
8980
|
const params = parsed.data;
|
|
8906
8981
|
const vtxoScript = handler.createScript(params);
|
|
8907
8982
|
return {
|
|
@@ -8958,10 +9033,10 @@ var ContractWatcher = class {
|
|
|
8958
9033
|
eventSourceReported = false;
|
|
8959
9034
|
/** @see ContractWatcherConfig */
|
|
8960
9035
|
constructor(config) {
|
|
8961
|
-
|
|
8962
|
-
|
|
8963
|
-
|
|
8964
|
-
|
|
9036
|
+
chunkVVFCCNU2_cjs.assertTimerMs("failsafePollIntervalMs", config.failsafePollIntervalMs);
|
|
9037
|
+
chunkVVFCCNU2_cjs.assertTimerMs("reconnectDelayMs", config.reconnectDelayMs);
|
|
9038
|
+
chunkVVFCCNU2_cjs.assertTimerMs("maxReconnectDelayMs", config.maxReconnectDelayMs);
|
|
9039
|
+
chunkVVFCCNU2_cjs.assertTimerMs("subscriptionRequestTimeoutMs", config.subscriptionRequestTimeoutMs);
|
|
8965
9040
|
if (config.subscriptionRequestTimeoutMs === 0) {
|
|
8966
9041
|
throw new Error("subscriptionRequestTimeoutMs must be greater than 0");
|
|
8967
9042
|
}
|
|
@@ -9184,9 +9259,9 @@ var ContractWatcher = class {
|
|
|
9184
9259
|
this.reconnectAttempts = 0;
|
|
9185
9260
|
this.listenLoop().catch((e) => {
|
|
9186
9261
|
if (!this.isWatching || signal?.aborted) return;
|
|
9187
|
-
if (
|
|
9262
|
+
if (chunkVVFCCNU2_cjs.isEventSourceError(e)) {
|
|
9188
9263
|
console.debug("ContractWatcher subscription disconnected; reconnecting");
|
|
9189
|
-
} else if (!
|
|
9264
|
+
} else if (!chunkVVFCCNU2_cjs.isEventSourceUnavailableError(e)) {
|
|
9190
9265
|
console.error(e);
|
|
9191
9266
|
}
|
|
9192
9267
|
this.connectionState = "disconnected";
|
|
@@ -9196,7 +9271,7 @@ var ContractWatcher = class {
|
|
|
9196
9271
|
});
|
|
9197
9272
|
} catch (error) {
|
|
9198
9273
|
if (!this.isWatching || signal?.aborted) return;
|
|
9199
|
-
if (!
|
|
9274
|
+
if (!chunkVVFCCNU2_cjs.isEventSourceUnavailableError(error)) {
|
|
9200
9275
|
console.error("ContractWatcher connection failed:", error);
|
|
9201
9276
|
}
|
|
9202
9277
|
this.connectionState = "disconnected";
|
|
@@ -9212,7 +9287,7 @@ var ContractWatcher = class {
|
|
|
9212
9287
|
* few seconds.
|
|
9213
9288
|
*/
|
|
9214
9289
|
reportEventSourceUnavailable(error) {
|
|
9215
|
-
if (!
|
|
9290
|
+
if (!chunkVVFCCNU2_cjs.isEventSourceUnavailableError(error)) return false;
|
|
9216
9291
|
if (!this.eventSourceReported) {
|
|
9217
9292
|
this.eventSourceReported = true;
|
|
9218
9293
|
console.warn(
|
|
@@ -9277,7 +9352,7 @@ var ContractWatcher = class {
|
|
|
9277
9352
|
const now = Date.now();
|
|
9278
9353
|
let current;
|
|
9279
9354
|
try {
|
|
9280
|
-
current = await
|
|
9355
|
+
current = await chunkVVFCCNU2_cjs.getAllNormalizedVtxos(this.config.indexerProvider, scripts, {
|
|
9281
9356
|
spendableOnly: true
|
|
9282
9357
|
});
|
|
9283
9358
|
} catch (error) {
|
|
@@ -9559,14 +9634,14 @@ var ContractWatcher = class {
|
|
|
9559
9634
|
const timestamp = Date.now();
|
|
9560
9635
|
if (update.newVtxos?.length) {
|
|
9561
9636
|
this.processSubscriptionVtxos(
|
|
9562
|
-
update.newVtxos.map(
|
|
9637
|
+
update.newVtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo),
|
|
9563
9638
|
"vtxo_received",
|
|
9564
9639
|
timestamp
|
|
9565
9640
|
);
|
|
9566
9641
|
}
|
|
9567
9642
|
if (update.spentVtxos?.length) {
|
|
9568
9643
|
this.processSubscriptionVtxos(
|
|
9569
|
-
update.spentVtxos.map(
|
|
9644
|
+
update.spentVtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo),
|
|
9570
9645
|
"vtxo_spent",
|
|
9571
9646
|
timestamp
|
|
9572
9647
|
);
|
|
@@ -9591,8 +9666,8 @@ var ContractWatcher = class {
|
|
|
9591
9666
|
continue;
|
|
9592
9667
|
}
|
|
9593
9668
|
if (target === byWatchedScript && eventType === "vtxo_received") {
|
|
9594
|
-
const n =
|
|
9595
|
-
if (
|
|
9669
|
+
const n = chunkVVFCCNU2_cjs.normalizeVtxo(vtxo);
|
|
9670
|
+
if (chunkVVFCCNU2_cjs.isVtxoSpent(n) || n.isSwept || chunkVVFCCNU2_cjs.isPastExpiry(n, now)) continue;
|
|
9596
9671
|
}
|
|
9597
9672
|
let bucket = target.get(vtxo.script);
|
|
9598
9673
|
if (!bucket) {
|
|
@@ -9729,7 +9804,7 @@ function annotatableIn(scriptToContract, vtxos, memo) {
|
|
|
9729
9804
|
if (!contract) continue;
|
|
9730
9805
|
try {
|
|
9731
9806
|
const key = `${contract.type}\0${script}\0${JSON.stringify(contract.params)}`;
|
|
9732
|
-
const handler =
|
|
9807
|
+
const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
|
|
9733
9808
|
const hit = memo?.get(script);
|
|
9734
9809
|
let tapscripts;
|
|
9735
9810
|
if (hit && hit.key === key && hit.handler === handler) {
|
|
@@ -9757,6 +9832,11 @@ function annotatableIn(scriptToContract, vtxos, memo) {
|
|
|
9757
9832
|
}
|
|
9758
9833
|
return { scripts, cache, failures };
|
|
9759
9834
|
}
|
|
9835
|
+
function annotateAgainst(vtxos, byScript, tapscripts = /* @__PURE__ */ new Map()) {
|
|
9836
|
+
return vtxos.map(
|
|
9837
|
+
(vtxo) => extendVirtualCoinForContract(chunkVVFCCNU2_cjs.normalizeVtxo(vtxo), byScript, tapscripts)
|
|
9838
|
+
);
|
|
9839
|
+
}
|
|
9760
9840
|
var SCAN_MAX_INDEX = 1e4;
|
|
9761
9841
|
var DEFAULT_SCAN_BATCH = 10;
|
|
9762
9842
|
var CHAIN_TIP_TTL_MS = 3e4;
|
|
@@ -9798,8 +9878,8 @@ var ContractManager = class _ContractManager {
|
|
|
9798
9878
|
* `dispose()`, so it re-checks this at every await rather than run on a torn-down watcher. */
|
|
9799
9879
|
disposed = false;
|
|
9800
9880
|
constructor(config) {
|
|
9801
|
-
|
|
9802
|
-
|
|
9881
|
+
chunkVVFCCNU2_cjs.assertNonNegativeMs("vtxoSyncMaxAgeMs", config.vtxoSyncMaxAgeMs);
|
|
9882
|
+
chunkVVFCCNU2_cjs.assertNonNegativeMs("vtxoSyncOverlapMs", config.vtxoSyncOverlapMs);
|
|
9803
9883
|
this.config = { ...config };
|
|
9804
9884
|
this.watcher = new ContractWatcher({
|
|
9805
9885
|
indexerProvider: config.indexerProvider,
|
|
@@ -9835,12 +9915,12 @@ var ContractManager = class _ContractManager {
|
|
|
9835
9915
|
}
|
|
9836
9916
|
/** @see ContractManagerConfig.vtxoSyncMaxAgeMs — for factory-built managers. */
|
|
9837
9917
|
setVtxoSyncMaxAge(maxAgeMs) {
|
|
9838
|
-
|
|
9918
|
+
chunkVVFCCNU2_cjs.assertNonNegativeMs("vtxoSyncMaxAgeMs", maxAgeMs);
|
|
9839
9919
|
this.config.vtxoSyncMaxAgeMs = maxAgeMs;
|
|
9840
9920
|
}
|
|
9841
9921
|
/** @see ContractManagerConfig.vtxoSyncOverlapMs — for factory-built managers. */
|
|
9842
9922
|
setVtxoSyncOverlap(overlapMs) {
|
|
9843
|
-
|
|
9923
|
+
chunkVVFCCNU2_cjs.assertNonNegativeMs("vtxoSyncOverlapMs", overlapMs);
|
|
9844
9924
|
this.config.vtxoSyncOverlapMs = overlapMs;
|
|
9845
9925
|
}
|
|
9846
9926
|
markSyncOnline() {
|
|
@@ -9888,7 +9968,7 @@ var ContractManager = class _ContractManager {
|
|
|
9888
9968
|
this.markSyncOnline();
|
|
9889
9969
|
return void 0;
|
|
9890
9970
|
} catch (err) {
|
|
9891
|
-
if (!
|
|
9971
|
+
if (!chunkVVFCCNU2_cjs.isRetryableProviderError(err)) throw err;
|
|
9892
9972
|
this.markSyncDegraded(err);
|
|
9893
9973
|
return err;
|
|
9894
9974
|
}
|
|
@@ -9911,7 +9991,7 @@ var ContractManager = class _ContractManager {
|
|
|
9911
9991
|
try {
|
|
9912
9992
|
await this.scheduleLookAheadDrain();
|
|
9913
9993
|
} catch (err) {
|
|
9914
|
-
if (!
|
|
9994
|
+
if (!chunkVVFCCNU2_cjs.isRetryableProviderError(err)) throw err;
|
|
9915
9995
|
this.lookAheadRefillOwed = true;
|
|
9916
9996
|
this.markSyncDegraded(err);
|
|
9917
9997
|
}
|
|
@@ -9974,7 +10054,7 @@ var ContractManager = class _ContractManager {
|
|
|
9974
10054
|
/** No throw: construction returned long ago, so the state is the channel. */
|
|
9975
10055
|
reportBackgroundFailure(stage, err) {
|
|
9976
10056
|
this.markSyncDegraded(err);
|
|
9977
|
-
if (!
|
|
10057
|
+
if (!chunkVVFCCNU2_cjs.isRetryableProviderError(err)) {
|
|
9978
10058
|
console.error(`[contracts] background ${stage} failed`, err);
|
|
9979
10059
|
}
|
|
9980
10060
|
}
|
|
@@ -10076,7 +10156,7 @@ var ContractManager = class _ContractManager {
|
|
|
10076
10156
|
const from = Math.max(0, watermark - lookAhead.size);
|
|
10077
10157
|
const to = watermark + lookAhead.size;
|
|
10078
10158
|
const deps = lookAhead.candidateDeps();
|
|
10079
|
-
const handlers =
|
|
10159
|
+
const handlers = chunkCFOIHLON_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkCFOIHLON_cjs.contractHandlers.get(t)).filter(hasCandidates);
|
|
10080
10160
|
const band = /* @__PURE__ */ new Map();
|
|
10081
10161
|
for (let index = from; index <= to; index++) {
|
|
10082
10162
|
const descriptor = lookAhead.materialize(index);
|
|
@@ -10087,7 +10167,7 @@ var ContractManager = class _ContractManager {
|
|
|
10087
10167
|
index,
|
|
10088
10168
|
params: {
|
|
10089
10169
|
...candidate,
|
|
10090
|
-
...
|
|
10170
|
+
...chunkCFOIHLON_cjs.speculativeReceiveMetadata(descriptor)
|
|
10091
10171
|
}
|
|
10092
10172
|
});
|
|
10093
10173
|
}
|
|
@@ -10146,7 +10226,7 @@ var ContractManager = class _ContractManager {
|
|
|
10146
10226
|
});
|
|
10147
10227
|
for (const entry of pending) entry.catchUpPending = false;
|
|
10148
10228
|
} catch (err) {
|
|
10149
|
-
if (!
|
|
10229
|
+
if (!chunkVVFCCNU2_cjs.isRetryableProviderError(err)) throw err;
|
|
10150
10230
|
this.markSyncDegraded(err);
|
|
10151
10231
|
}
|
|
10152
10232
|
}
|
|
@@ -10237,7 +10317,7 @@ var ContractManager = class _ContractManager {
|
|
|
10237
10317
|
return result;
|
|
10238
10318
|
}
|
|
10239
10319
|
async upsertContractRow(params) {
|
|
10240
|
-
const handler =
|
|
10320
|
+
const handler = chunkCFOIHLON_cjs.contractHandlers.get(params.type);
|
|
10241
10321
|
if (!handler) {
|
|
10242
10322
|
throw new Error(`No handler registered for contract type '${params.type}'`);
|
|
10243
10323
|
}
|
|
@@ -10305,7 +10385,7 @@ var ContractManager = class _ContractManager {
|
|
|
10305
10385
|
`scanContracts: batchSize must be a positive integer (got ${String(opts.batchSize)})`
|
|
10306
10386
|
);
|
|
10307
10387
|
}
|
|
10308
|
-
const registered =
|
|
10388
|
+
const registered = chunkCFOIHLON_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkCFOIHLON_cjs.contractHandlers.get(t)).filter(isDiscoverable);
|
|
10309
10389
|
const discoverables = [
|
|
10310
10390
|
...registered.filter((h) => h.type === "boarding"),
|
|
10311
10391
|
...registered.filter((h) => h.type !== "boarding")
|
|
@@ -10431,7 +10511,7 @@ var ContractManager = class _ContractManager {
|
|
|
10431
10511
|
return await collectContracts(this.config.contractRepository, dbFilter);
|
|
10432
10512
|
}
|
|
10433
10513
|
async getContractsWithVtxos(filter, pageSize, options) {
|
|
10434
|
-
|
|
10514
|
+
chunkVVFCCNU2_cjs.assertNonNegativeMs("maxSyncAgeMs", options?.maxSyncAgeMs);
|
|
10435
10515
|
const contracts = await this.getContracts(filter);
|
|
10436
10516
|
if (this.syncedWithin(
|
|
10437
10517
|
contracts,
|
|
@@ -10494,10 +10574,7 @@ var ContractManager = class _ContractManager {
|
|
|
10494
10574
|
for (const contract of contracts) {
|
|
10495
10575
|
byScript.set(contract.script, contract);
|
|
10496
10576
|
}
|
|
10497
|
-
|
|
10498
|
-
return vtxos.map(
|
|
10499
|
-
(vtxo) => extendVirtualCoinForContract(chunk3LDVNVBW_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
|
|
10500
|
-
);
|
|
10577
|
+
return annotateAgainst(vtxos, byScript, tapscripts);
|
|
10501
10578
|
}
|
|
10502
10579
|
/** @inheritdoc */
|
|
10503
10580
|
async assertAnnotatable(vtxos) {
|
|
@@ -10541,14 +10618,14 @@ var ContractManager = class _ContractManager {
|
|
|
10541
10618
|
const byScript = new Map(contracts.map((contract) => [contract.script, contract]));
|
|
10542
10619
|
const asking = vtxos.filter((vtxo) => {
|
|
10543
10620
|
const contract = byScript.get(vtxo.script);
|
|
10544
|
-
return contract !== void 0 &&
|
|
10621
|
+
return contract !== void 0 && chunkCFOIHLON_cjs.contractHandlers.get(contract.type)?.assertSpendableNow !== void 0;
|
|
10545
10622
|
});
|
|
10546
10623
|
if (asking.length === 0) return refused;
|
|
10547
10624
|
const tip = await this.currentChainTip();
|
|
10548
10625
|
const walletDescriptorValue = await walletDescriptor?.();
|
|
10549
10626
|
for (const vtxo of asking) {
|
|
10550
10627
|
const contract = byScript.get(vtxo.script);
|
|
10551
|
-
const handler =
|
|
10628
|
+
const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
|
|
10552
10629
|
if (!handler?.assertSpendableNow) continue;
|
|
10553
10630
|
const context = {
|
|
10554
10631
|
collaborative: true,
|
|
@@ -10558,7 +10635,7 @@ var ContractManager = class _ContractManager {
|
|
|
10558
10635
|
walletDescriptor: walletDescriptorValue,
|
|
10559
10636
|
// `isVirtualCoin` only checks `script`, which every input has; `isCsvSpendable`
|
|
10560
10637
|
// reads `vtxo.status.block_time` unguarded, so require `status` too.
|
|
10561
|
-
vtxo:
|
|
10638
|
+
vtxo: chunkVVFCCNU2_cjs.isVirtualCoin(vtxo) && "status" in vtxo ? vtxo : void 0
|
|
10562
10639
|
};
|
|
10563
10640
|
try {
|
|
10564
10641
|
await handler.assertSpendableNow(
|
|
@@ -10671,7 +10748,7 @@ var ContractManager = class _ContractManager {
|
|
|
10671
10748
|
const { contractScript, collaborative = true, walletDescriptor, vtxo } = options;
|
|
10672
10749
|
const [contract] = await this.getContracts({ script: contractScript });
|
|
10673
10750
|
if (!contract) return [];
|
|
10674
|
-
const handler =
|
|
10751
|
+
const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
|
|
10675
10752
|
if (!handler) return [];
|
|
10676
10753
|
const script = handler.createScript(contract.params);
|
|
10677
10754
|
const tip = await this.currentChainTip();
|
|
@@ -10693,7 +10770,7 @@ var ContractManager = class _ContractManager {
|
|
|
10693
10770
|
const { contractScript, collaborative = true, walletDescriptor } = options;
|
|
10694
10771
|
const [contract] = await this.getContracts({ script: contractScript });
|
|
10695
10772
|
if (!contract) return [];
|
|
10696
|
-
const handler =
|
|
10773
|
+
const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
|
|
10697
10774
|
if (!handler) return [];
|
|
10698
10775
|
const script = handler.createScript(contract.params);
|
|
10699
10776
|
const context = {
|
|
@@ -10739,7 +10816,7 @@ var ContractManager = class _ContractManager {
|
|
|
10739
10816
|
}
|
|
10740
10817
|
async refreshOutpoints(outpoints) {
|
|
10741
10818
|
if (outpoints.length === 0) return;
|
|
10742
|
-
const { vtxos } = await
|
|
10819
|
+
const { vtxos } = await chunkVVFCCNU2_cjs.getNormalizedVtxos(this.config.indexerProvider, {
|
|
10743
10820
|
outpoints
|
|
10744
10821
|
});
|
|
10745
10822
|
if (vtxos.length === 0) return;
|
|
@@ -10748,9 +10825,15 @@ var ContractManager = class _ContractManager {
|
|
|
10748
10825
|
script: scripts
|
|
10749
10826
|
});
|
|
10750
10827
|
const scriptToContract = new Map(contracts.map((c) => [c.script, c]));
|
|
10751
|
-
const
|
|
10828
|
+
const {
|
|
10829
|
+
scripts: annotatable,
|
|
10830
|
+
cache,
|
|
10831
|
+
failures
|
|
10832
|
+
} = annotatableIn(scriptToContract, vtxos, this.tapscriptMemo);
|
|
10833
|
+
this.recordAnnotationFailures(annotatable, failures);
|
|
10834
|
+
const owned = vtxos.filter((v) => annotatable.has(v.script));
|
|
10752
10835
|
if (owned.length === 0) return;
|
|
10753
|
-
const annotated =
|
|
10836
|
+
const annotated = annotateAgainst(owned, scriptToContract, cache);
|
|
10754
10837
|
const byAddress = /* @__PURE__ */ new Map();
|
|
10755
10838
|
for (const vtxo of annotated) {
|
|
10756
10839
|
const contract = scriptToContract.get(vtxo.script);
|
|
@@ -10834,7 +10917,7 @@ var ContractManager = class _ContractManager {
|
|
|
10834
10917
|
break;
|
|
10835
10918
|
}
|
|
10836
10919
|
} catch (err) {
|
|
10837
|
-
if (!
|
|
10920
|
+
if (!chunkVVFCCNU2_cjs.isRetryableProviderError(err)) throw err;
|
|
10838
10921
|
this.markSyncDegraded(err);
|
|
10839
10922
|
synced = false;
|
|
10840
10923
|
}
|
|
@@ -10922,7 +11005,7 @@ var ContractManager = class _ContractManager {
|
|
|
10922
11005
|
*/
|
|
10923
11006
|
async reconcilePendingFrontier(contracts) {
|
|
10924
11007
|
const scriptToContract = new Map(contracts.map((c) => [c.script, c]));
|
|
10925
|
-
const vtxos = await
|
|
11008
|
+
const vtxos = await chunkVVFCCNU2_cjs.getAllNormalizedVtxos(
|
|
10926
11009
|
this.config.indexerProvider,
|
|
10927
11010
|
contracts.map((c) => c.script),
|
|
10928
11011
|
{ pendingOnly: true }
|
|
@@ -10937,7 +11020,7 @@ var ContractManager = class _ContractManager {
|
|
|
10937
11020
|
} = annotatableIn(scriptToContract, vtxos, this.tapscriptMemo);
|
|
10938
11021
|
this.recordAnnotationFailures(annotatable, failures);
|
|
10939
11022
|
const owned = vtxos.filter((v) => annotatable.has(v.script));
|
|
10940
|
-
const annotated =
|
|
11023
|
+
const annotated = annotateAgainst(owned, scriptToContract, cache);
|
|
10941
11024
|
const byContract = /* @__PURE__ */ new Map();
|
|
10942
11025
|
const contractByAddress = /* @__PURE__ */ new Map();
|
|
10943
11026
|
for (const vtxo of annotated) {
|
|
@@ -10996,7 +11079,7 @@ var ContractManager = class _ContractManager {
|
|
|
10996
11079
|
}
|
|
10997
11080
|
return result;
|
|
10998
11081
|
}
|
|
10999
|
-
async fetchContractVtxosBulk(contracts, pageSize =
|
|
11082
|
+
async fetchContractVtxosBulk(contracts, pageSize = chunkVVFCCNU2_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
|
|
11000
11083
|
if (contracts.length === 0) {
|
|
11001
11084
|
return { vtxosByScript: /* @__PURE__ */ new Map(), promoted: /* @__PURE__ */ new Map() };
|
|
11002
11085
|
}
|
|
@@ -11012,7 +11095,7 @@ var ContractManager = class _ContractManager {
|
|
|
11012
11095
|
before: syncWindow.before
|
|
11013
11096
|
}
|
|
11014
11097
|
} : {};
|
|
11015
|
-
const vtxos = await
|
|
11098
|
+
const vtxos = await chunkVVFCCNU2_cjs.getAllNormalizedVtxos(
|
|
11016
11099
|
this.config.indexerProvider,
|
|
11017
11100
|
contracts.map((c) => c.script),
|
|
11018
11101
|
{ ...windowOpts, pageSize }
|
|
@@ -11028,7 +11111,7 @@ var ContractManager = class _ContractManager {
|
|
|
11028
11111
|
} = annotatableIn(scriptToContract, vtxos, this.tapscriptMemo);
|
|
11029
11112
|
this.recordAnnotationFailures(annotatable, failures);
|
|
11030
11113
|
const owned = vtxos.filter((v) => annotatable.has(v.script));
|
|
11031
|
-
const annotated =
|
|
11114
|
+
const annotated = annotateAgainst(owned, scriptToContract, cache);
|
|
11032
11115
|
for (const vtxo of annotated) {
|
|
11033
11116
|
result.get(vtxo.script).push({
|
|
11034
11117
|
...vtxo,
|
|
@@ -11114,7 +11197,7 @@ function parseLegacyExpiry(batchExpiry) {
|
|
|
11114
11197
|
if (typeof batchExpiry !== "number" || !Number.isFinite(batchExpiry) || batchExpiry <= 0) {
|
|
11115
11198
|
return {};
|
|
11116
11199
|
}
|
|
11117
|
-
if (batchExpiry >=
|
|
11200
|
+
if (batchExpiry >= chunkVVFCCNU2_cjs.EXPIRY_MIN_PLAUSIBLE_MS) return { expiresAt: new Date(batchExpiry) };
|
|
11118
11201
|
return { expiresAtHeight: batchExpiry / 1e3 };
|
|
11119
11202
|
}
|
|
11120
11203
|
function legacyVtxoFacts(status) {
|
|
@@ -11352,7 +11435,7 @@ function backfillContractWatchState(store) {
|
|
|
11352
11435
|
};
|
|
11353
11436
|
readPage();
|
|
11354
11437
|
}
|
|
11355
|
-
var unspentFlag = (vtxo) =>
|
|
11438
|
+
var unspentFlag = (vtxo) => chunkVVFCCNU2_cjs.isVtxoSpent(vtxo) ? {} : { unspent: 1 };
|
|
11356
11439
|
function backfillVtxoIndexFields(transaction) {
|
|
11357
11440
|
const store = transaction.objectStore(STORE_VTXOS);
|
|
11358
11441
|
const pageSize = 1e3;
|
|
@@ -11383,7 +11466,7 @@ var DEFAULT_DB_NAME = "arkade-service-worker";
|
|
|
11383
11466
|
var DEFAULT_SERVICE_WORKER_ACTIVATION_TIMEOUT_MS = 1e4;
|
|
11384
11467
|
function normalizeOptions2(pathOrOptions) {
|
|
11385
11468
|
const o = typeof pathOrOptions === "string" ? { path: pathOrOptions } : pathOrOptions;
|
|
11386
|
-
|
|
11469
|
+
chunkVVFCCNU2_cjs.assertTimerMs("activationTimeoutMs", o.activationTimeoutMs);
|
|
11387
11470
|
return {
|
|
11388
11471
|
path: o.path,
|
|
11389
11472
|
activationTimeoutMs: o.activationTimeoutMs ?? DEFAULT_SERVICE_WORKER_ACTIVATION_TIMEOUT_MS
|
|
@@ -11602,7 +11685,7 @@ var deserializeTapLeaf = (t) => {
|
|
|
11602
11685
|
const s = base.hex.decode(t.s);
|
|
11603
11686
|
return [cb, s];
|
|
11604
11687
|
};
|
|
11605
|
-
var deserializeVtxo = (o) =>
|
|
11688
|
+
var deserializeVtxo = (o) => chunkVVFCCNU2_cjs.normalizeVtxo({
|
|
11606
11689
|
...o,
|
|
11607
11690
|
createdAt: new Date(o.createdAt),
|
|
11608
11691
|
tapTree: base.hex.decode(o.tapTree),
|
|
@@ -12026,7 +12109,7 @@ var HDDescriptorProvider = class _HDDescriptorProvider {
|
|
|
12026
12109
|
*/
|
|
12027
12110
|
materializeDescriptorAt(index) {
|
|
12028
12111
|
const descriptor = this.identity.descriptor;
|
|
12029
|
-
const network =
|
|
12112
|
+
const network = chunkCFOIHLON_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
12030
12113
|
const expansion = descriptorsScure.expand({ descriptor, network, index });
|
|
12031
12114
|
const keyInfo = expansion.expansionMap?.["@0"];
|
|
12032
12115
|
if (!keyInfo?.keyExpression) {
|
|
@@ -12094,7 +12177,7 @@ function signingDescriptorIndex(descriptor) {
|
|
|
12094
12177
|
}
|
|
12095
12178
|
function newestWalletReceiveContract(contracts, serverPubKeyHex) {
|
|
12096
12179
|
return contracts.filter(
|
|
12097
|
-
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source ===
|
|
12180
|
+
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkCFOIHLON_cjs.WALLET_RECEIVE_SOURCE
|
|
12098
12181
|
).sort((a, b) => {
|
|
12099
12182
|
if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
|
|
12100
12183
|
return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
|
|
@@ -12145,7 +12228,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
|
|
|
12145
12228
|
const provider = await resolveDescriptorProvider(config, setup.walletRepository);
|
|
12146
12229
|
if (!provider) return void 0;
|
|
12147
12230
|
const allowSilentFallback = (config.walletMode ?? "auto") === "auto";
|
|
12148
|
-
const expectedContractType = setup.offchainTapscript instanceof
|
|
12231
|
+
const expectedContractType = setup.offchainTapscript instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script ? "delegate" : "default";
|
|
12149
12232
|
const factoryOpts = {
|
|
12150
12233
|
walletRepository: setup.walletRepository,
|
|
12151
12234
|
contractRepository: setup.contractRepository,
|
|
@@ -12302,7 +12385,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
|
|
|
12302
12385
|
};
|
|
12303
12386
|
function deriveLeafPubkey(descriptor) {
|
|
12304
12387
|
try {
|
|
12305
|
-
return
|
|
12388
|
+
return chunkCFOIHLON_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
12306
12389
|
} catch (e) {
|
|
12307
12390
|
throw new NonRangeableDescriptorError(
|
|
12308
12391
|
"Cannot derive leaf pubkey: descriptor is not a materialized, parsable tr(...) shape.",
|
|
@@ -12314,7 +12397,7 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
12314
12397
|
const pubKey = deriveLeafPubkey(descriptor);
|
|
12315
12398
|
const tapscript = rebuildTapscript(current, pubKey);
|
|
12316
12399
|
const serverPubKey = tapscript.options.serverPubKey;
|
|
12317
|
-
const csvTimelock2 =
|
|
12400
|
+
const csvTimelock2 = chunkVVFCCNU2_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
|
|
12318
12401
|
const base$1 = {
|
|
12319
12402
|
script: base.hex.encode(tapscript.pkScript),
|
|
12320
12403
|
address: tapscript.address(hrp, serverPubKey).encode(),
|
|
@@ -12322,11 +12405,11 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
12322
12405
|
// Read at sign time to route rotated-pubkey inputs through `signWithDescriptor`; without
|
|
12323
12406
|
// it spends are rejected with `INVALID_PSBT_INPUT (5): missing tapscript spend sig`.
|
|
12324
12407
|
metadata: {
|
|
12325
|
-
...tagSource && { source:
|
|
12408
|
+
...tagSource && { source: chunkCFOIHLON_cjs.WALLET_RECEIVE_SOURCE },
|
|
12326
12409
|
signingDescriptor: descriptor
|
|
12327
12410
|
}
|
|
12328
12411
|
};
|
|
12329
|
-
const params = tapscript instanceof
|
|
12412
|
+
const params = tapscript instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script ? {
|
|
12330
12413
|
...base$1,
|
|
12331
12414
|
type: "delegate",
|
|
12332
12415
|
params: {
|
|
@@ -12347,10 +12430,10 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
12347
12430
|
return { tapscript, params };
|
|
12348
12431
|
}
|
|
12349
12432
|
function rebuildTapscript(current, pubKey) {
|
|
12350
|
-
if (current instanceof
|
|
12351
|
-
return new
|
|
12433
|
+
if (current instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script) {
|
|
12434
|
+
return new chunkCFOIHLON_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
|
|
12352
12435
|
}
|
|
12353
|
-
return new
|
|
12436
|
+
return new chunkCFOIHLON_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
|
|
12354
12437
|
}
|
|
12355
12438
|
async function pickActiveReceive(contractRepository, serverPubKey, expectedType) {
|
|
12356
12439
|
const candidates = await collectContracts(contractRepository, {
|
|
@@ -12391,12 +12474,13 @@ async function resolveDescriptorProvider(config, walletRepository) {
|
|
|
12391
12474
|
|
|
12392
12475
|
// src/wallet/balance.ts
|
|
12393
12476
|
function computeOffchainBalance(vtxos, caps) {
|
|
12394
|
-
const { now, isPendingRecovery, isGenericallySpendable, isUnlocked, dustCarrier } = caps;
|
|
12477
|
+
const { now, isPendingRecovery, isGenericallySpendable, isUnlocked, isReserved, dustCarrier } = caps;
|
|
12395
12478
|
let settled = 0;
|
|
12396
12479
|
let preconfirmed = 0;
|
|
12397
12480
|
let available = 0;
|
|
12398
12481
|
let gated = 0;
|
|
12399
12482
|
let intentLocked = 0;
|
|
12483
|
+
let reserved = 0;
|
|
12400
12484
|
let recoverable = 0;
|
|
12401
12485
|
let pendingRecovery = 0;
|
|
12402
12486
|
let unrolled = 0;
|
|
@@ -12408,7 +12492,7 @@ function computeOffchainBalance(vtxos, caps) {
|
|
|
12408
12492
|
}
|
|
12409
12493
|
};
|
|
12410
12494
|
for (const vtxo of vtxos) {
|
|
12411
|
-
if (
|
|
12495
|
+
if (chunkVVFCCNU2_cjs.isVtxoSpent(vtxo)) continue;
|
|
12412
12496
|
addAssets(owned, vtxo);
|
|
12413
12497
|
if (vtxo.isUnrolled) {
|
|
12414
12498
|
unrolled += vtxo.value;
|
|
@@ -12418,11 +12502,11 @@ function computeOffchainBalance(vtxos, caps) {
|
|
|
12418
12502
|
pendingRecovery += vtxo.value;
|
|
12419
12503
|
continue;
|
|
12420
12504
|
}
|
|
12421
|
-
if (
|
|
12505
|
+
if (chunkVVFCCNU2_cjs.canRecoverOnchain(vtxo, now)) {
|
|
12422
12506
|
recoverable += vtxo.value;
|
|
12423
12507
|
continue;
|
|
12424
12508
|
}
|
|
12425
|
-
if (!
|
|
12509
|
+
if (!chunkVVFCCNU2_cjs.canSpendOffchain(vtxo, now)) continue;
|
|
12426
12510
|
if (vtxo.isPreconfirmed) {
|
|
12427
12511
|
preconfirmed += vtxo.value;
|
|
12428
12512
|
} else {
|
|
@@ -12432,6 +12516,8 @@ function computeOffchainBalance(vtxos, caps) {
|
|
|
12432
12516
|
gated += vtxo.value;
|
|
12433
12517
|
} else if (!isUnlocked(vtxo)) {
|
|
12434
12518
|
intentLocked += vtxo.value;
|
|
12519
|
+
} else if (isReserved?.(vtxo)) {
|
|
12520
|
+
reserved += vtxo.value;
|
|
12435
12521
|
} else {
|
|
12436
12522
|
available += vtxo.value;
|
|
12437
12523
|
addAssets(spendable, vtxo);
|
|
@@ -12447,6 +12533,7 @@ function computeOffchainBalance(vtxos, caps) {
|
|
|
12447
12533
|
available,
|
|
12448
12534
|
gated,
|
|
12449
12535
|
intentLocked,
|
|
12536
|
+
reserved,
|
|
12450
12537
|
recoverable,
|
|
12451
12538
|
pendingRecovery,
|
|
12452
12539
|
unrolled,
|
|
@@ -12477,6 +12564,7 @@ function toWalletBalance(boardingUtxos, offchain) {
|
|
|
12477
12564
|
available: offchain.available,
|
|
12478
12565
|
gated: offchain.gated,
|
|
12479
12566
|
intentLocked: offchain.intentLocked,
|
|
12567
|
+
reserved: offchain.reserved,
|
|
12480
12568
|
recoverable: offchain.recoverable,
|
|
12481
12569
|
pendingRecovery: offchain.pendingRecovery,
|
|
12482
12570
|
unrolled: offchain.unrolled,
|
|
@@ -12633,7 +12721,7 @@ function intentProofJobs(coins) {
|
|
|
12633
12721
|
if (coins.length === 0) return [];
|
|
12634
12722
|
const coinJobs = coins.map((coin, i) => ({
|
|
12635
12723
|
index: i + 1,
|
|
12636
|
-
lookupScript:
|
|
12724
|
+
lookupScript: chunkVVFCCNU2_cjs.VtxoScript.decode(coin.tapTree).pkScript
|
|
12637
12725
|
}));
|
|
12638
12726
|
return [{ index: 0, lookupScript: coinJobs[0].lookupScript }, ...coinJobs];
|
|
12639
12727
|
}
|
|
@@ -12659,7 +12747,7 @@ function dedupeTimelocks(timelocks) {
|
|
|
12659
12747
|
const seen = /* @__PURE__ */ new Set();
|
|
12660
12748
|
const deduped = [];
|
|
12661
12749
|
for (const timelock of timelocks) {
|
|
12662
|
-
const sequence =
|
|
12750
|
+
const sequence = chunkVVFCCNU2_cjs.timelockToSequence(timelock).toString();
|
|
12663
12751
|
if (seen.has(sequence)) continue;
|
|
12664
12752
|
seen.add(sequence);
|
|
12665
12753
|
deduped.push(timelock);
|
|
@@ -12675,7 +12763,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
|
|
|
12675
12763
|
if (!newest?.params.pubKey) return baseline;
|
|
12676
12764
|
try {
|
|
12677
12765
|
const pubKey = base.hex.decode(newest.params.pubKey);
|
|
12678
|
-
return new
|
|
12766
|
+
return new chunkCFOIHLON_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
|
|
12679
12767
|
} catch (e) {
|
|
12680
12768
|
console.warn("Skipping malformed boarding contract at boot", newest.script, e);
|
|
12681
12769
|
return baseline;
|
|
@@ -12707,21 +12795,21 @@ function filterFlatVtxos(vtxos, filter, pendingSpendOutpoints) {
|
|
|
12707
12795
|
if (vtxo.isUnrolled) {
|
|
12708
12796
|
return !!f.withUnrolled;
|
|
12709
12797
|
}
|
|
12710
|
-
if (
|
|
12798
|
+
if (chunkVVFCCNU2_cjs.isVtxoSpent(vtxo)) {
|
|
12711
12799
|
return false;
|
|
12712
12800
|
}
|
|
12713
|
-
if (!f.withRecoverable &&
|
|
12801
|
+
if (!f.withRecoverable && chunkVVFCCNU2_cjs.canRecoverOnchain(vtxo, now)) {
|
|
12714
12802
|
return false;
|
|
12715
12803
|
}
|
|
12716
12804
|
return true;
|
|
12717
12805
|
});
|
|
12718
12806
|
}
|
|
12719
12807
|
async function refreshSweptStateOfExpiredInputs(wallet, inputs) {
|
|
12720
|
-
const candidates = inputs.filter(
|
|
12808
|
+
const candidates = inputs.filter(chunkVVFCCNU2_cjs.isVirtualCoin).map(chunkVVFCCNU2_cjs.normalizeVtxo).filter((v) => !v.isSwept);
|
|
12721
12809
|
if (candidates.length === 0) return inputs;
|
|
12722
|
-
const now = candidates.some((v) => v.expiresAtHeight !== void 0) ? await
|
|
12810
|
+
const now = candidates.some((v) => v.expiresAtHeight !== void 0) ? await chunkVVFCCNU2_cjs.resolveTimeHeight(wallet.onchainProvider) : { timestamp: /* @__PURE__ */ new Date() };
|
|
12723
12811
|
const suspects = candidates.filter(
|
|
12724
|
-
(v) =>
|
|
12812
|
+
(v) => chunkVVFCCNU2_cjs.isPastExpiry(v, now) || v.expiresAtHeight !== void 0 && now.height === void 0
|
|
12725
12813
|
);
|
|
12726
12814
|
if (suspects.length === 0) return inputs;
|
|
12727
12815
|
let sweptNow;
|
|
@@ -12735,12 +12823,12 @@ async function refreshSweptStateOfExpiredInputs(wallet, inputs) {
|
|
|
12735
12823
|
);
|
|
12736
12824
|
} catch (e) {
|
|
12737
12825
|
const message = "could not confirm the swept state of expired settlement inputs; retry the settlement";
|
|
12738
|
-
throw
|
|
12826
|
+
throw chunkVVFCCNU2_cjs.isRetryableProviderError(e) ? new chunkVVFCCNU2_cjs.ProviderUnavailableError(message, { cause: e }) : new Error(message, { cause: e });
|
|
12739
12827
|
}
|
|
12740
12828
|
if (sweptNow.size === 0) return inputs;
|
|
12741
12829
|
return inputs.map((input) => {
|
|
12742
|
-
if (!
|
|
12743
|
-
return { ...
|
|
12830
|
+
if (!chunkVVFCCNU2_cjs.isVirtualCoin(input) || !sweptNow.has(`${input.txid}:${input.vout}`)) return input;
|
|
12831
|
+
return { ...chunkVVFCCNU2_cjs.normalizeVtxo(input), isSwept: true };
|
|
12744
12832
|
});
|
|
12745
12833
|
}
|
|
12746
12834
|
var PENDING_RECOVERY_REASON = "is past its operator signer's rotation cutoff \u2014 the operator will not co-sign it until it recovers";
|
|
@@ -12752,6 +12840,9 @@ function omittedOutpoints(before, after) {
|
|
|
12752
12840
|
before.map((vtxo) => `${vtxo.txid}:${vtxo.vout}`).filter((outpoint) => !kept.has(outpoint))
|
|
12753
12841
|
);
|
|
12754
12842
|
}
|
|
12843
|
+
function coinKeys(inputs) {
|
|
12844
|
+
return inputs.filter((input) => typeof input === "object" && input !== null).map((input) => `${input.txid}:${input.vout}`);
|
|
12845
|
+
}
|
|
12755
12846
|
function excludeLockedOutpoints(vtxos, locked) {
|
|
12756
12847
|
if (locked.length === 0) return vtxos;
|
|
12757
12848
|
const lockedKeys = new Set(locked.map((o) => `${o.txid}:${o.vout}`));
|
|
@@ -12786,6 +12877,18 @@ var ArkadeCashCreateError = class extends Error {
|
|
|
12786
12877
|
cash;
|
|
12787
12878
|
cause;
|
|
12788
12879
|
};
|
|
12880
|
+
var ArkadeCashOperatorMismatchError = class extends Error {
|
|
12881
|
+
constructor(cashSignerPubKey, activeSignerPubKey) {
|
|
12882
|
+
super(
|
|
12883
|
+
`ArkadeCash comes from another operator: its signer ${cashSignerPubKey} is not the active signer ${activeSignerPubKey} of the connected operator, and not one of its deprecated signers. Connect to the operator that issued it to claim it.`
|
|
12884
|
+
);
|
|
12885
|
+
this.cashSignerPubKey = cashSignerPubKey;
|
|
12886
|
+
this.activeSignerPubKey = activeSignerPubKey;
|
|
12887
|
+
this.name = "ArkadeCashOperatorMismatchError";
|
|
12888
|
+
}
|
|
12889
|
+
cashSignerPubKey;
|
|
12890
|
+
activeSignerPubKey;
|
|
12891
|
+
};
|
|
12789
12892
|
var ReadonlyWallet = class _ReadonlyWallet {
|
|
12790
12893
|
constructor(identity, network, onchainProvider, arkProvider, indexerProvider, arkServerPublicKey, offchainTapscript, boardingTapscript, dustAmount, walletRepository, contractRepository, delegateProvider, watcherConfig, walletContractTimelocks) {
|
|
12791
12894
|
this.identity = identity;
|
|
@@ -12846,6 +12949,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
12846
12949
|
// Outpoints committed to an in-flight settle/send, filtered from getVtxos() so concurrent
|
|
12847
12950
|
// callers can't reselect them. In-memory only: a stale entry only hides a VTXO.
|
|
12848
12951
|
_pendingSpendOutpoints = /* @__PURE__ */ new Set();
|
|
12952
|
+
_heldOutpoints = /* @__PURE__ */ new Set();
|
|
12849
12953
|
/** Activity resolvers consumed by {@link getActivityHistory}. */
|
|
12850
12954
|
activity = createDefaultActivityRegistry();
|
|
12851
12955
|
get assetManager() {
|
|
@@ -13013,7 +13117,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13013
13117
|
async getArkadeReader() {
|
|
13014
13118
|
const indexer = this.indexerProvider;
|
|
13015
13119
|
return {
|
|
13016
|
-
getVtxos: (opts) =>
|
|
13120
|
+
getVtxos: (opts) => chunkVVFCCNU2_cjs.getNormalizedVtxos(indexer, opts),
|
|
13017
13121
|
getVirtualTxs: (txids, opts) => indexer.getVirtualTxs(txids, opts)
|
|
13018
13122
|
};
|
|
13019
13123
|
}
|
|
@@ -13048,7 +13152,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13048
13152
|
}
|
|
13049
13153
|
/** Shared setup for ReadonlyWallet.create() and Wallet.create(). */
|
|
13050
13154
|
static async setupWalletConfig(config, pubKey) {
|
|
13051
|
-
const arkProvider = config.arkProvider || new
|
|
13155
|
+
const arkProvider = config.arkProvider || new chunkVVFCCNU2_cjs.RestArkProvider();
|
|
13052
13156
|
let indexerProvider = config.indexerProvider;
|
|
13053
13157
|
if (!indexerProvider) {
|
|
13054
13158
|
const derived = extractArkProviderUrl(arkProvider);
|
|
@@ -13057,7 +13161,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13057
13161
|
"indexerProvider is required when arkProvider is provided without a discoverable serverUrl"
|
|
13058
13162
|
);
|
|
13059
13163
|
}
|
|
13060
|
-
indexerProvider = new
|
|
13164
|
+
indexerProvider = new chunkFEBAG2K2_cjs.RestIndexerProvider(derived ?? chunkVVFCCNU2_cjs.DEFAULT_ARKADE_SERVER_URL);
|
|
13061
13165
|
}
|
|
13062
13166
|
const walletRepository = config.storage?.walletRepository ?? new IndexedDBWalletRepository();
|
|
13063
13167
|
const contractRepository = config.storage?.contractRepository ?? new IndexedDBContractRepository();
|
|
@@ -13066,7 +13170,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13066
13170
|
source: serverInfoSource,
|
|
13067
13171
|
lastOnlineAt: serverInfoLastOnlineAt
|
|
13068
13172
|
} = await resolveArkInfo(arkProvider, walletRepository);
|
|
13069
|
-
const network =
|
|
13173
|
+
const network = chunkVVFCCNU2_cjs.networkFromArkadeInfo(info);
|
|
13070
13174
|
if ("descriptor" in config.identity) {
|
|
13071
13175
|
const descriptor = config.identity.descriptor;
|
|
13072
13176
|
const identityIsMainnet = !descriptor.includes("tpub");
|
|
@@ -13102,18 +13206,18 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13102
13206
|
}
|
|
13103
13207
|
}
|
|
13104
13208
|
const boardingTimelock = config.boardingTimelock ?? toTimelock(info.boardingExitDelay);
|
|
13105
|
-
const serverPubKey =
|
|
13106
|
-
const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) =>
|
|
13209
|
+
const serverPubKey = chunkCFOIHLON_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
|
|
13210
|
+
const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => chunkCFOIHLON_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : void 0;
|
|
13107
13211
|
const offchainOptions = {
|
|
13108
13212
|
pubKey,
|
|
13109
13213
|
serverPubKey,
|
|
13110
13214
|
csvTimelock: exitTimelock
|
|
13111
13215
|
};
|
|
13112
|
-
const offchainTapscript = !delegatePubKey ? new
|
|
13113
|
-
const boardingTapscript =
|
|
13216
|
+
const offchainTapscript = !delegatePubKey ? new chunkCFOIHLON_cjs.DefaultVtxo.Script(offchainOptions) : new chunkCFOIHLON_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
|
|
13217
|
+
const boardingTapscript = chunkCFOIHLON_cjs.BoardingContractHandler.createScript({
|
|
13114
13218
|
pubKey: base.hex.encode(pubKey),
|
|
13115
13219
|
serverPubKey: base.hex.encode(serverPubKey),
|
|
13116
|
-
csvTimelock:
|
|
13220
|
+
csvTimelock: chunkVVFCCNU2_cjs.timelockToSequence(boardingTimelock).toString()
|
|
13117
13221
|
});
|
|
13118
13222
|
return {
|
|
13119
13223
|
arkProvider,
|
|
@@ -13246,6 +13350,16 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13246
13350
|
this._pendingSpendOutpoints
|
|
13247
13351
|
);
|
|
13248
13352
|
}
|
|
13353
|
+
/**
|
|
13354
|
+
* @internal The stored VTXOs {@link reserveVtxos} holds, minus any being spent: for renewal,
|
|
13355
|
+
* which skips them, to report the ones it would have renewed. No sync.
|
|
13356
|
+
*/
|
|
13357
|
+
async getHeldVtxos() {
|
|
13358
|
+
if (this._heldOutpoints.size === 0) return [];
|
|
13359
|
+
return (await this.getStoredVtxos()).filter(
|
|
13360
|
+
(vtxo) => this._heldOutpoints.has(`${vtxo.txid}:${vtxo.vout}`)
|
|
13361
|
+
);
|
|
13362
|
+
}
|
|
13249
13363
|
/** @inheritdoc */
|
|
13250
13364
|
async getSpendableVtxos(filter) {
|
|
13251
13365
|
const snapshot = await this.contractSnapshot(filter, {
|
|
@@ -13254,12 +13368,13 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13254
13368
|
const vtxos = filterSnapshotVtxos(snapshot, filter, this._pendingSpendOutpoints);
|
|
13255
13369
|
const { gated, pendingRecovery } = this.spendabilityView(snapshot);
|
|
13256
13370
|
const selectable = vtxos.filter(
|
|
13257
|
-
(vtxo) => !isGatedVtxo(vtxo, gated) && !pendingRecovery.has(`${vtxo.txid}:${vtxo.vout}`)
|
|
13371
|
+
(vtxo) => !isGatedVtxo(vtxo, gated) && !pendingRecovery.has(`${vtxo.txid}:${vtxo.vout}`) && !this._heldOutpoints.has(`${vtxo.txid}:${vtxo.vout}`)
|
|
13258
13372
|
);
|
|
13259
13373
|
const unlocked = await spendableVtxosExcludingLocked(selectable, this.intentRepository);
|
|
13260
13374
|
logExcludedVtxos("getSpendableVtxos", vtxos, [
|
|
13261
13375
|
gateExclusion(gated),
|
|
13262
13376
|
outpointExclusion(pendingRecovery, PENDING_RECOVERY_REASON),
|
|
13377
|
+
outpointExclusion(this._heldOutpoints, "is held by reserveVtxos"),
|
|
13263
13378
|
outpointExclusion(
|
|
13264
13379
|
omittedOutpoints(selectable, unlocked),
|
|
13265
13380
|
"is locked by an in-flight settlement intent"
|
|
@@ -13268,7 +13383,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13268
13383
|
if (!filter?.withUnrolled) {
|
|
13269
13384
|
logExcludedVtxos(
|
|
13270
13385
|
"getSpendableVtxos",
|
|
13271
|
-
snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !
|
|
13386
|
+
snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !chunkVVFCCNU2_cjs.isVtxoSpent(vtxo)),
|
|
13272
13387
|
[() => UNROLLED_REASON]
|
|
13273
13388
|
);
|
|
13274
13389
|
}
|
|
@@ -13352,7 +13467,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13352
13467
|
}
|
|
13353
13468
|
async contractSnapshotStored() {
|
|
13354
13469
|
const contractManager = await this.getContractManager();
|
|
13355
|
-
return contractManager.getStoredContractsWithVtxos
|
|
13470
|
+
return contractManager.getStoredContractsWithVtxos();
|
|
13356
13471
|
}
|
|
13357
13472
|
/**
|
|
13358
13473
|
* The two exclusion sets the gate is made of, derived from one snapshot so
|
|
@@ -13377,6 +13492,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13377
13492
|
isPendingRecovery: (vtxo) => pendingRecovery.has(`${vtxo.txid}:${vtxo.vout}`),
|
|
13378
13493
|
isGenericallySpendable: (vtxo) => !isGatedVtxo(vtxo, gated),
|
|
13379
13494
|
isUnlocked: (vtxo) => unlocked.has(`${vtxo.txid}:${vtxo.vout}`),
|
|
13495
|
+
isReserved: (vtxo) => this._heldOutpoints.has(`${vtxo.txid}:${vtxo.vout}`),
|
|
13380
13496
|
dustCarrier: getDustAmount(this)
|
|
13381
13497
|
};
|
|
13382
13498
|
}
|
|
@@ -13410,7 +13526,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13410
13526
|
this.getBoardingTxs()
|
|
13411
13527
|
]);
|
|
13412
13528
|
const allVtxos = snapshot.flatMap((_) => _.vtxos);
|
|
13413
|
-
const resolveTxCreatedAt = (txids) =>
|
|
13529
|
+
const resolveTxCreatedAt = (txids) => chunkVVFCCNU2_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
|
|
13414
13530
|
return buildTransactionHistory(
|
|
13415
13531
|
allVtxos,
|
|
13416
13532
|
boardingTxs,
|
|
@@ -13564,9 +13680,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13564
13680
|
async getBoardingTapscripts(allowedSigners) {
|
|
13565
13681
|
const byScript = /* @__PURE__ */ new Map();
|
|
13566
13682
|
const add = (s) => byScript.set(base.hex.encode(s.pkScript), s);
|
|
13567
|
-
const boardingCsv = this.boardingTapscript.options.csvTimelock ??
|
|
13683
|
+
const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunkCFOIHLON_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
13568
13684
|
add(
|
|
13569
|
-
new
|
|
13685
|
+
new chunkCFOIHLON_cjs.DefaultVtxo.Script({
|
|
13570
13686
|
pubKey: await this.identity.xOnlyPublicKey(),
|
|
13571
13687
|
serverPubKey: this.boardingTapscript.options.serverPubKey,
|
|
13572
13688
|
csvTimelock: boardingCsv
|
|
@@ -13581,7 +13697,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13581
13697
|
for (const c of boardingContracts) {
|
|
13582
13698
|
if (!allowed.has(toXOnlySignerHex(c.params.serverPubKey))) continue;
|
|
13583
13699
|
try {
|
|
13584
|
-
add(
|
|
13700
|
+
add(chunkCFOIHLON_cjs.BoardingContractHandler.createScript(c.params));
|
|
13585
13701
|
} catch (e) {
|
|
13586
13702
|
console.warn("Skipping malformed boarding contract", c.script, e);
|
|
13587
13703
|
}
|
|
@@ -13610,7 +13726,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13610
13726
|
// Per-row CSV delay decoded from THIS tapscript's exit leaf —
|
|
13611
13727
|
// not the wallet's current boarding timelock, which a signer
|
|
13612
13728
|
// rotation may have changed.
|
|
13613
|
-
csvTimelock:
|
|
13729
|
+
csvTimelock: chunkVVFCCNU2_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
|
|
13614
13730
|
coins: utxos
|
|
13615
13731
|
};
|
|
13616
13732
|
})
|
|
@@ -13642,6 +13758,16 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13642
13758
|
this.boardingLoaded = true;
|
|
13643
13759
|
return groups.flatMap((g) => g.coins);
|
|
13644
13760
|
}
|
|
13761
|
+
/**
|
|
13762
|
+
* @internal {@link getBoardingUtxos} minus those an in-flight settle is spending, for SDK
|
|
13763
|
+
* picks. The getter itself lists them: callers that mirror it (the worker's cache and
|
|
13764
|
+
* broadcasts, balances) must not see a settle's inputs vanish, and then stay gone if it fails.
|
|
13765
|
+
*/
|
|
13766
|
+
async getSelectableBoardingUtxos() {
|
|
13767
|
+
return (await this.getBoardingUtxos()).filter(
|
|
13768
|
+
(coin) => !this._pendingSpendOutpoints.has(`${coin.txid}:${coin.vout}`)
|
|
13769
|
+
);
|
|
13770
|
+
}
|
|
13645
13771
|
async getStoredBoardingUtxos() {
|
|
13646
13772
|
const currentOnly = /* @__PURE__ */ new Set([
|
|
13647
13773
|
toXOnlySignerHex(base.hex.encode(this.boardingTapscript.options.serverPubKey))
|
|
@@ -13756,7 +13882,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13756
13882
|
/** Fetch Arkade transaction ids that are still pending final settlement. */
|
|
13757
13883
|
async fetchPendingTxs() {
|
|
13758
13884
|
const scripts = await this.getWalletScripts();
|
|
13759
|
-
const vtxos = await
|
|
13885
|
+
const vtxos = await chunkVVFCCNU2_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
|
|
13760
13886
|
return vtxos.filter(
|
|
13761
13887
|
(vtxo) => (vtxo.isSpent || vtxo.isPreconfirmed && !vtxo.isSwept) && vtxo.arkTxId !== void 0
|
|
13762
13888
|
).map((_) => _.arkTxId);
|
|
@@ -13787,7 +13913,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13787
13913
|
});
|
|
13788
13914
|
for (const contract of contracts) {
|
|
13789
13915
|
if (map.has(contract.script)) continue;
|
|
13790
|
-
const handler =
|
|
13916
|
+
const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
|
|
13791
13917
|
if (handler) {
|
|
13792
13918
|
const script = handler.createScript(contract.params);
|
|
13793
13919
|
map.set(contract.script, script);
|
|
@@ -13899,7 +14025,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13899
14025
|
}
|
|
13900
14026
|
});
|
|
13901
14027
|
const baselinePubkey = await this.identity.xOnlyPublicKey();
|
|
13902
|
-
const delegatePubKey = this.offchainTapscript instanceof
|
|
14028
|
+
const delegatePubKey = this.offchainTapscript instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
|
|
13903
14029
|
const baselineSigners = [
|
|
13904
14030
|
this.offchainTapscript.options.serverPubKey,
|
|
13905
14031
|
...[...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h))
|
|
@@ -13907,8 +14033,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13907
14033
|
const seenBaselineScripts = /* @__PURE__ */ new Set();
|
|
13908
14034
|
for (const serverPubKey of baselineSigners) {
|
|
13909
14035
|
for (const csvTimelock2 of this.walletContractTimelocks) {
|
|
13910
|
-
const csvTimelockStr =
|
|
13911
|
-
const defaultScript = new
|
|
14036
|
+
const csvTimelockStr = chunkVVFCCNU2_cjs.timelockToSequence(csvTimelock2).toString();
|
|
14037
|
+
const defaultScript = new chunkCFOIHLON_cjs.DefaultVtxo.Script({
|
|
13912
14038
|
pubKey: baselinePubkey,
|
|
13913
14039
|
serverPubKey,
|
|
13914
14040
|
csvTimelock: csvTimelock2
|
|
@@ -13929,7 +14055,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13929
14055
|
});
|
|
13930
14056
|
}
|
|
13931
14057
|
if (delegatePubKey) {
|
|
13932
|
-
const delegateScript = new
|
|
14058
|
+
const delegateScript = new chunkCFOIHLON_cjs.DelegateVtxo.Script({
|
|
13933
14059
|
pubKey: baselinePubkey,
|
|
13934
14060
|
serverPubKey,
|
|
13935
14061
|
delegatePubKey,
|
|
@@ -13953,9 +14079,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13953
14079
|
}
|
|
13954
14080
|
}
|
|
13955
14081
|
}
|
|
13956
|
-
const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ??
|
|
14082
|
+
const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunkCFOIHLON_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
13957
14083
|
for (const serverPubKey of baselineSigners) {
|
|
13958
|
-
const baselineBoarding = new
|
|
14084
|
+
const baselineBoarding = new chunkCFOIHLON_cjs.DefaultVtxo.Script({
|
|
13959
14085
|
pubKey: baselinePubkey,
|
|
13960
14086
|
serverPubKey,
|
|
13961
14087
|
csvTimelock: boardingCsvTimelock
|
|
@@ -13968,7 +14094,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
13968
14094
|
params: {
|
|
13969
14095
|
pubKey: base.hex.encode(baselineBoarding.options.pubKey),
|
|
13970
14096
|
serverPubKey: base.hex.encode(serverPubKey),
|
|
13971
|
-
csvTimelock:
|
|
14097
|
+
csvTimelock: chunkVVFCCNU2_cjs.timelockToSequence(boardingCsvTimelock).toString()
|
|
13972
14098
|
},
|
|
13973
14099
|
script: boardingScriptHex,
|
|
13974
14100
|
address: baselineBoarding.address(this.network.hrp, serverPubKey).encode(),
|
|
@@ -14155,7 +14281,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14155
14281
|
serverPubKey: this.offchainTapscript.options.serverPubKey,
|
|
14156
14282
|
deprecatedSignerPubKeys: [...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h)),
|
|
14157
14283
|
csvTimelocks: this.walletContractTimelocks,
|
|
14158
|
-
delegatePubKey: this.offchainTapscript instanceof
|
|
14284
|
+
delegatePubKey: this.offchainTapscript instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
|
|
14159
14285
|
};
|
|
14160
14286
|
}
|
|
14161
14287
|
_signerRouter;
|
|
@@ -14315,7 +14441,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14315
14441
|
const [row] = await manager.getContracts({ script: base.hex.encode(display.pkScript) });
|
|
14316
14442
|
const persisted = row?.metadata?.signingDescriptor;
|
|
14317
14443
|
if (typeof persisted === "string") return persisted;
|
|
14318
|
-
return
|
|
14444
|
+
return chunkCFOIHLON_cjs.identityDescriptor(this.identity);
|
|
14319
14445
|
}
|
|
14320
14446
|
/**
|
|
14321
14447
|
* Build, persist and shape one address of `type` owned by `descriptor`. The descriptor is the
|
|
@@ -14325,7 +14451,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14325
14451
|
async mintAddress(manager, type, descriptor, tagSource, allocated) {
|
|
14326
14452
|
if (type === "boarding") {
|
|
14327
14453
|
const built2 = this.buildBoardingContract(
|
|
14328
|
-
|
|
14454
|
+
chunkCFOIHLON_cjs.deriveDescriptorLeafPubKey(descriptor),
|
|
14329
14455
|
descriptor,
|
|
14330
14456
|
tagSource
|
|
14331
14457
|
);
|
|
@@ -14362,11 +14488,11 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14362
14488
|
* (offchain analogue: {@link buildReceiveContract}).
|
|
14363
14489
|
*/
|
|
14364
14490
|
buildBoardingContract(pubKey, descriptor, tagSource) {
|
|
14365
|
-
const tapscript = new
|
|
14491
|
+
const tapscript = new chunkCFOIHLON_cjs.DefaultVtxo.Script({
|
|
14366
14492
|
...this._boardingTapscript.options,
|
|
14367
14493
|
pubKey
|
|
14368
14494
|
});
|
|
14369
|
-
const csvTimelock2 = tapscript.options.csvTimelock ??
|
|
14495
|
+
const csvTimelock2 = tapscript.options.csvTimelock ?? chunkCFOIHLON_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
14370
14496
|
return {
|
|
14371
14497
|
tapscript,
|
|
14372
14498
|
params: {
|
|
@@ -14374,13 +14500,13 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14374
14500
|
params: {
|
|
14375
14501
|
pubKey: base.hex.encode(pubKey),
|
|
14376
14502
|
serverPubKey: base.hex.encode(tapscript.options.serverPubKey),
|
|
14377
|
-
csvTimelock:
|
|
14503
|
+
csvTimelock: chunkVVFCCNU2_cjs.timelockToSequence(csvTimelock2).toString()
|
|
14378
14504
|
},
|
|
14379
14505
|
script: base.hex.encode(tapscript.pkScript),
|
|
14380
14506
|
address: tapscript.address(this.network.hrp, this.arkServerPublicKey).encode(),
|
|
14381
14507
|
state: "active",
|
|
14382
14508
|
metadata: {
|
|
14383
|
-
...tagSource && { source:
|
|
14509
|
+
...tagSource && { source: chunkCFOIHLON_cjs.WALLET_RECEIVE_SOURCE },
|
|
14384
14510
|
signingDescriptor: descriptor
|
|
14385
14511
|
}
|
|
14386
14512
|
}
|
|
@@ -14402,7 +14528,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14402
14528
|
if (this._hdProvider) {
|
|
14403
14529
|
return (await this.getContractManager()).getNextSigningDescriptor();
|
|
14404
14530
|
}
|
|
14405
|
-
return
|
|
14531
|
+
return chunkCFOIHLON_cjs.identityDescriptor(this.identity);
|
|
14406
14532
|
}
|
|
14407
14533
|
/**
|
|
14408
14534
|
* @see HDAllocationCapable.advanceSigningDescriptorWatermark
|
|
@@ -14478,7 +14604,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14478
14604
|
* the stable public API.
|
|
14479
14605
|
*/
|
|
14480
14606
|
async rotateServerSigner(newServerPubKey, checkpointTapscript) {
|
|
14481
|
-
const xonly =
|
|
14607
|
+
const xonly = chunkCFOIHLON_cjs.toXOnly(newServerPubKey, "ark signer key");
|
|
14482
14608
|
const newServerUnrollScript = assertValidServerUnrollScript(
|
|
14483
14609
|
checkpointTapscript,
|
|
14484
14610
|
resolveCheckpointExitDelayPolicy(this.network, this.checkpointExitDelayPolicy)
|
|
@@ -14507,21 +14633,21 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14507
14633
|
const [currentBoardingRow] = await manager.getContracts({
|
|
14508
14634
|
script: currentBoardingScript
|
|
14509
14635
|
});
|
|
14510
|
-
const newOffchain = this.offchainTapscript instanceof
|
|
14636
|
+
const newOffchain = this.offchainTapscript instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script ? new chunkCFOIHLON_cjs.DelegateVtxo.Script({
|
|
14511
14637
|
...this.offchainTapscript.options,
|
|
14512
14638
|
serverPubKey: xonly
|
|
14513
|
-
}) : new
|
|
14639
|
+
}) : new chunkCFOIHLON_cjs.DefaultVtxo.Script({
|
|
14514
14640
|
...this.offchainTapscript.options,
|
|
14515
14641
|
serverPubKey: xonly
|
|
14516
14642
|
});
|
|
14517
|
-
const newBoarding = new
|
|
14643
|
+
const newBoarding = new chunkCFOIHLON_cjs.DefaultVtxo.Script({
|
|
14518
14644
|
...this._boardingTapscript.options,
|
|
14519
14645
|
serverPubKey: xonly
|
|
14520
14646
|
});
|
|
14521
|
-
const offchainCsv =
|
|
14647
|
+
const offchainCsv = chunkVVFCCNU2_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
|
|
14522
14648
|
const newOffchainScript = base.hex.encode(newOffchain.pkScript);
|
|
14523
14649
|
const newOffchainAddress = newOffchain.address(this.network.hrp, xonly).encode();
|
|
14524
|
-
if (newOffchain instanceof
|
|
14650
|
+
if (newOffchain instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script) {
|
|
14525
14651
|
await manager.createContract({
|
|
14526
14652
|
type: "delegate",
|
|
14527
14653
|
params: {
|
|
@@ -14549,13 +14675,13 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14549
14675
|
metadata: currentOffchainRow?.metadata
|
|
14550
14676
|
});
|
|
14551
14677
|
}
|
|
14552
|
-
const boardingCsv = newBoarding.options.csvTimelock ??
|
|
14678
|
+
const boardingCsv = newBoarding.options.csvTimelock ?? chunkCFOIHLON_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
14553
14679
|
await manager.createContract({
|
|
14554
14680
|
type: "boarding",
|
|
14555
14681
|
params: {
|
|
14556
14682
|
pubKey: base.hex.encode(newBoarding.options.pubKey),
|
|
14557
14683
|
serverPubKey: base.hex.encode(xonly),
|
|
14558
|
-
csvTimelock:
|
|
14684
|
+
csvTimelock: chunkVVFCCNU2_cjs.timelockToSequence(boardingCsv).toString()
|
|
14559
14685
|
},
|
|
14560
14686
|
script: base.hex.encode(newBoarding.pkScript),
|
|
14561
14687
|
address: newBoarding.address(this.network.hrp, xonly).encode(),
|
|
@@ -14574,7 +14700,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14574
14700
|
}
|
|
14575
14701
|
/**
|
|
14576
14702
|
* Serializes `settle`/`send` so VtxoManager's background renewal can't race user
|
|
14577
|
-
* transactions for the same inputs.
|
|
14703
|
+
* transactions for the same inputs; with `concurrentSpending`, only until inputs are reserved.
|
|
14578
14704
|
*/
|
|
14579
14705
|
_txLock = Promise.resolve();
|
|
14580
14706
|
// Every input (boarding included) of an intent a live settle owns; reconciliation skips them.
|
|
@@ -14583,18 +14709,59 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14583
14709
|
_restoreInFlight;
|
|
14584
14710
|
_addPendingSpends(inputs) {
|
|
14585
14711
|
for (const input of inputs) {
|
|
14586
|
-
if (
|
|
14712
|
+
if (chunkVVFCCNU2_cjs.isVirtualCoin(input)) {
|
|
14587
14713
|
this._pendingSpendOutpoints.add(`${input.txid}:${input.vout}`);
|
|
14588
14714
|
}
|
|
14589
14715
|
}
|
|
14590
14716
|
}
|
|
14591
14717
|
_removePendingSpends(inputs) {
|
|
14592
14718
|
for (const input of inputs) {
|
|
14593
|
-
if (
|
|
14719
|
+
if (chunkVVFCCNU2_cjs.isVirtualCoin(input)) {
|
|
14594
14720
|
this._pendingSpendOutpoints.delete(`${input.txid}:${input.vout}`);
|
|
14595
14721
|
}
|
|
14596
14722
|
}
|
|
14597
14723
|
}
|
|
14724
|
+
/**
|
|
14725
|
+
* Hold VTXOs so no SDK-chosen spend picks them; the holder still spends them by naming them.
|
|
14726
|
+
* All-or-nothing: throws {@link VtxoReservedError} if any is held or already being spent.
|
|
14727
|
+
* In-memory, for this `Wallet` instance only.
|
|
14728
|
+
*/
|
|
14729
|
+
reserveVtxos(outpoints) {
|
|
14730
|
+
const keys = outpoints.map((o) => `${o.txid}:${o.vout}`);
|
|
14731
|
+
const inFlight = keys.filter((k) => this._pendingSpendOutpoints.has(k));
|
|
14732
|
+
if (inFlight.length > 0) throw new VtxoReservedError(inFlight, "in-flight");
|
|
14733
|
+
const held = keys.filter((k) => this._heldOutpoints.has(k));
|
|
14734
|
+
if (held.length > 0) throw new VtxoReservedError(held, "held");
|
|
14735
|
+
for (const k of keys) this._heldOutpoints.add(k);
|
|
14736
|
+
let released = false;
|
|
14737
|
+
return {
|
|
14738
|
+
outpoints: [...outpoints],
|
|
14739
|
+
release: () => {
|
|
14740
|
+
if (released) return;
|
|
14741
|
+
released = true;
|
|
14742
|
+
for (const k of keys) this._heldOutpoints.delete(k);
|
|
14743
|
+
}
|
|
14744
|
+
};
|
|
14745
|
+
}
|
|
14746
|
+
/**
|
|
14747
|
+
* @internal For `AssetManager`: reserves what `fn` submits, hiding it from other picks until
|
|
14748
|
+
* the submit ends. With `concurrentSpending`, `fn` runs under the wallet lock, released once
|
|
14749
|
+
* the inputs are reserved; otherwise `fn` runs unlocked and only the submit takes the lock.
|
|
14750
|
+
*/
|
|
14751
|
+
withSpendLock(fn) {
|
|
14752
|
+
const run = (release) => fn(async (inputs, outputs) => {
|
|
14753
|
+
this._assertNotHeld(inputs);
|
|
14754
|
+
if (release) this._assertNotInFlight(inputs);
|
|
14755
|
+
this._addPendingSpends(inputs);
|
|
14756
|
+
release?.();
|
|
14757
|
+
try {
|
|
14758
|
+
return await (release ? this._buildAndSubmitOffchainTx(inputs, outputs, this.serverUnrollScript) : this.buildAndSubmitOffchainTx(inputs, outputs));
|
|
14759
|
+
} finally {
|
|
14760
|
+
this._removePendingSpends(inputs);
|
|
14761
|
+
}
|
|
14762
|
+
});
|
|
14763
|
+
return this._concurrentSpending ? this._withTxLock(run) : run();
|
|
14764
|
+
}
|
|
14598
14765
|
_withTxLock(fn) {
|
|
14599
14766
|
let release;
|
|
14600
14767
|
const lock = new Promise((r) => release = r);
|
|
@@ -14602,12 +14769,22 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14602
14769
|
this._txLock = lock;
|
|
14603
14770
|
return prev.then(async () => {
|
|
14604
14771
|
try {
|
|
14605
|
-
return await fn();
|
|
14772
|
+
return await fn(release);
|
|
14606
14773
|
} finally {
|
|
14607
14774
|
release();
|
|
14608
14775
|
}
|
|
14609
14776
|
});
|
|
14610
14777
|
}
|
|
14778
|
+
_assertNotInFlight(inputs) {
|
|
14779
|
+
const clashing = coinKeys(inputs).filter((key) => this._pendingSpendOutpoints.has(key));
|
|
14780
|
+
if (clashing.length > 0) throw new VtxoReservedError(clashing, "in-flight");
|
|
14781
|
+
}
|
|
14782
|
+
_assertNotHeld(inputs) {
|
|
14783
|
+
const held = coinKeys(inputs.filter(chunkVVFCCNU2_cjs.isVirtualCoin)).filter(
|
|
14784
|
+
(key) => this._heldOutpoints.has(key)
|
|
14785
|
+
);
|
|
14786
|
+
if (held.length > 0) throw new VtxoReservedError(held, "held");
|
|
14787
|
+
}
|
|
14611
14788
|
/**
|
|
14612
14789
|
* Explicitly recover this wallet's contracts and balance on a fresh repo: a gap-limit scan
|
|
14613
14790
|
* for HD wallets, the single default pubkey otherwise. Throws on operational failure (a
|
|
@@ -14641,13 +14818,13 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14641
14818
|
const manager = await this.getContractManager();
|
|
14642
14819
|
const provider = this._hdProvider;
|
|
14643
14820
|
const hd = provider !== void 0;
|
|
14644
|
-
const staticDescriptor = hd ? void 0 : await
|
|
14821
|
+
const staticDescriptor = hd ? void 0 : await chunkCFOIHLON_cjs.identityDescriptor(this.identity);
|
|
14645
14822
|
const materialize = (index) => hd ? provider.materializeDescriptorAt(index) : staticDescriptor;
|
|
14646
|
-
const delegatePubKey = this.offchainTapscript instanceof
|
|
14823
|
+
const delegatePubKey = this.offchainTapscript instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
|
|
14647
14824
|
const arkInfo = await this.arkProvider.getInfo();
|
|
14648
|
-
const currentSignerPubKey =
|
|
14825
|
+
const currentSignerPubKey = chunkCFOIHLON_cjs.toXOnly(base.hex.decode(arkInfo.signerPubkey), "ark signer key");
|
|
14649
14826
|
const deprecatedSignerPubKeys = arkInfo.deprecatedSigners.map(
|
|
14650
|
-
(s) =>
|
|
14827
|
+
(s) => chunkCFOIHLON_cjs.toXOnly(base.hex.decode(s.pubkey), "deprecated signer key")
|
|
14651
14828
|
);
|
|
14652
14829
|
const deps = {
|
|
14653
14830
|
indexerProvider: this.indexerProvider,
|
|
@@ -14659,7 +14836,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14659
14836
|
deprecatedSignerPubKeys,
|
|
14660
14837
|
csvTimelocks: this.walletContractTimelocks,
|
|
14661
14838
|
// Boarding-exit CSV, distinct from the unilateral-exit matrix.
|
|
14662
|
-
boardingTimelock: this.boardingTapscript.options.csvTimelock ??
|
|
14839
|
+
boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunkCFOIHLON_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
|
|
14663
14840
|
delegatePubKey
|
|
14664
14841
|
};
|
|
14665
14842
|
const result = await manager.scanContracts({
|
|
@@ -14690,6 +14867,12 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14690
14867
|
}
|
|
14691
14868
|
}
|
|
14692
14869
|
settlementConfig;
|
|
14870
|
+
_concurrentSpending = false;
|
|
14871
|
+
_submitsAwaitingFinalize = 0;
|
|
14872
|
+
/** @see WalletConfig.concurrentSpending */
|
|
14873
|
+
get concurrentSpending() {
|
|
14874
|
+
return this._concurrentSpending;
|
|
14875
|
+
}
|
|
14693
14876
|
/**
|
|
14694
14877
|
* Broadcast access bound to this wallet's server, so a plugin needs only the wallet. Not on
|
|
14695
14878
|
* {@link ReadonlyWallet}: a readonly wallet or `toReadonly()` view must not be able to submit.
|
|
@@ -14769,7 +14952,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14769
14952
|
throw new Error("Invalid configured public key");
|
|
14770
14953
|
}
|
|
14771
14954
|
const setup = await ReadonlyWallet.setupWalletConfig(config, pubkey);
|
|
14772
|
-
const forfeitPubkey =
|
|
14955
|
+
const forfeitPubkey = chunkCFOIHLON_cjs.toXOnly(base.hex.decode(setup.info.forfeitPubkey), "forfeit key");
|
|
14773
14956
|
const forfeitAddress = btcSigner.Address(setup.network).decode(setup.info.forfeitAddress);
|
|
14774
14957
|
const forfeitOutputScript = btcSigner.OutScript.encode(forfeitAddress);
|
|
14775
14958
|
const checkpointExitDelayOverrides = {
|
|
@@ -14855,6 +15038,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14855
15038
|
wallet.intentRepository = config.storage?.intentRepository;
|
|
14856
15039
|
wallet.virtualTxRepository = config.storage?.virtualTxRepository;
|
|
14857
15040
|
wallet.exitDataCapture = config.storage?.exitDataCapture;
|
|
15041
|
+
wallet._concurrentSpending = config.concurrentSpending === true;
|
|
14858
15042
|
await wallet.getVtxoManager();
|
|
14859
15043
|
return wallet;
|
|
14860
15044
|
}
|
|
@@ -14914,13 +15098,19 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14914
15098
|
* @returns The finalized Arkade transaction id
|
|
14915
15099
|
*/
|
|
14916
15100
|
async settle(params, eventCallback, hooks) {
|
|
14917
|
-
return this._withTxLock(() => {
|
|
15101
|
+
return this._withTxLock((release) => {
|
|
14918
15102
|
hooks?.onPhase?.("preparing");
|
|
14919
15103
|
const onRegistrationAttempt = hooks?.onPhase ? () => hooks.onPhase?.("registration_attempt") : void 0;
|
|
14920
|
-
return this._settleImpl(
|
|
15104
|
+
return this._settleImpl(
|
|
15105
|
+
params,
|
|
15106
|
+
eventCallback,
|
|
15107
|
+
this._concurrentSpending ? release : void 0,
|
|
15108
|
+
onRegistrationAttempt
|
|
15109
|
+
);
|
|
14921
15110
|
});
|
|
14922
15111
|
}
|
|
14923
|
-
async _settleImpl(params, eventCallback, onRegistrationAttempt) {
|
|
15112
|
+
async _settleImpl(params, eventCallback, onReserved, onRegistrationAttempt) {
|
|
15113
|
+
const picked = params === void 0 || isSdkPicked(params);
|
|
14924
15114
|
if (params?.inputs) {
|
|
14925
15115
|
for (const input of params.inputs) {
|
|
14926
15116
|
if (typeof input === "string") {
|
|
@@ -14934,13 +15124,13 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14934
15124
|
void this.logUngatedInputs("settle({ inputs })", params.inputs);
|
|
14935
15125
|
}
|
|
14936
15126
|
const offchainAddress = await this.getAddress();
|
|
14937
|
-
const offchainPkScript =
|
|
15127
|
+
const offchainPkScript = chunkVVFCCNU2_cjs.ArkAddress.decode(offchainAddress).pkScript;
|
|
14938
15128
|
const offchainOutputScript = base.hex.encode(offchainPkScript);
|
|
14939
15129
|
if (!params) {
|
|
14940
15130
|
const { fees, vtxoMaxAmount } = await this.arkProvider.getInfo();
|
|
14941
15131
|
const estimator = new Estimator(fees.intentFee);
|
|
14942
15132
|
let amount = 0;
|
|
14943
|
-
const exitScript =
|
|
15133
|
+
const exitScript = chunkVVFCCNU2_cjs.CSVMultisigTapscript.decode(
|
|
14944
15134
|
base.hex.decode(this.boardingTapscript.exitScript)
|
|
14945
15135
|
);
|
|
14946
15136
|
const boardingTimelock = exitScript.params.timelock;
|
|
@@ -14949,7 +15139,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14949
15139
|
const tip = await this.onchainProvider.getChainTip();
|
|
14950
15140
|
chainTipHeight = tip.height;
|
|
14951
15141
|
}
|
|
14952
|
-
const boardingUtxos = (await this.
|
|
15142
|
+
const boardingUtxos = (await this.getSelectableBoardingUtxos()).filter(
|
|
14953
15143
|
(utxo) => utxo.status.confirmed && !hasBoardingTxExpired(utxo, boardingTimelock, chainTipHeight)
|
|
14954
15144
|
);
|
|
14955
15145
|
const filteredBoardingUtxos = [];
|
|
@@ -14972,7 +15162,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
14972
15162
|
if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
|
|
14973
15163
|
break;
|
|
14974
15164
|
}
|
|
14975
|
-
const inputFee = estimator.evalOffchainInput(
|
|
15165
|
+
const inputFee = estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(vtxo));
|
|
14976
15166
|
if (inputFee.satoshis >= vtxo.value) {
|
|
14977
15167
|
continue;
|
|
14978
15168
|
}
|
|
@@ -15015,6 +15205,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15015
15205
|
...params,
|
|
15016
15206
|
inputs: await refreshSweptStateOfExpiredInputs(this, params.inputs)
|
|
15017
15207
|
};
|
|
15208
|
+
if (onReserved) this._assertNotInFlight(params.inputs);
|
|
15018
15209
|
const onchainOutputIndexes = [];
|
|
15019
15210
|
const outputs = [];
|
|
15020
15211
|
let hasOffchainOutputs = false;
|
|
@@ -15023,7 +15214,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15023
15214
|
let script;
|
|
15024
15215
|
let arkAddress;
|
|
15025
15216
|
try {
|
|
15026
|
-
arkAddress =
|
|
15217
|
+
arkAddress = chunkVVFCCNU2_cjs.ArkAddress.decode(output.address);
|
|
15027
15218
|
} catch {
|
|
15028
15219
|
arkAddress = void 0;
|
|
15029
15220
|
}
|
|
@@ -15095,20 +15286,24 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15095
15286
|
]);
|
|
15096
15287
|
let intentTxId;
|
|
15097
15288
|
try {
|
|
15098
|
-
intentTxId =
|
|
15289
|
+
intentTxId = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(intent.proof)).id;
|
|
15099
15290
|
} catch {
|
|
15100
15291
|
intentTxId = params.inputs.map((i) => `${i.txid}:${i.vout}`).sort().join("|");
|
|
15101
15292
|
}
|
|
15102
|
-
const settleInputVtxos = params.inputs.filter(
|
|
15293
|
+
const settleInputVtxos = params.inputs.filter(chunkVVFCCNU2_cjs.isVirtualCoin);
|
|
15103
15294
|
const contractManager = await this.getContractManager();
|
|
15104
15295
|
await contractManager.assertAnnotatable(settleInputVtxos);
|
|
15105
15296
|
await contractManager.assertSpendableNow?.(
|
|
15106
15297
|
settleInputVtxos,
|
|
15107
15298
|
async () => base.hex.encode(await this.identity.xOnlyPublicKey())
|
|
15108
15299
|
);
|
|
15300
|
+
if (picked) this._assertNotHeld(params.inputs);
|
|
15109
15301
|
this._addPendingSpends(params.inputs);
|
|
15302
|
+
const boardingKeys = onReserved ? coinKeys(params.inputs.filter((i) => !chunkVVFCCNU2_cjs.isVirtualCoin(i))) : [];
|
|
15303
|
+
for (const key of boardingKeys) this._pendingSpendOutpoints.add(key);
|
|
15110
15304
|
const settlingKeys = params.inputs.map((i) => `${i.txid}:${i.vout}`);
|
|
15111
15305
|
for (const key of settlingKeys) this._settlingOutpoints.add(key);
|
|
15306
|
+
onReserved?.();
|
|
15112
15307
|
await this.persistIntentSnapshot(
|
|
15113
15308
|
intentTxId,
|
|
15114
15309
|
"waiting_to_submit",
|
|
@@ -15122,6 +15317,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15122
15317
|
];
|
|
15123
15318
|
const abortController = new AbortController();
|
|
15124
15319
|
let stream;
|
|
15320
|
+
let registering = false;
|
|
15125
15321
|
let committedTxid;
|
|
15126
15322
|
try {
|
|
15127
15323
|
stream = this.arkProvider.getEventStream(abortController.signal, topics);
|
|
@@ -15135,6 +15331,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15135
15331
|
}
|
|
15136
15332
|
yield* stream;
|
|
15137
15333
|
})();
|
|
15334
|
+
registering = true;
|
|
15138
15335
|
onRegistrationAttempt?.();
|
|
15139
15336
|
const intentId = await this.safeRegisterIntent(intent, params.inputs);
|
|
15140
15337
|
await this.persistIntentSnapshot(
|
|
@@ -15175,13 +15372,15 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15175
15372
|
throw error;
|
|
15176
15373
|
}
|
|
15177
15374
|
const inputIds = params.inputs.map((i) => `${i.txid}:${i.vout}`).join(",");
|
|
15178
|
-
|
|
15179
|
-
|
|
15180
|
-
|
|
15181
|
-
|
|
15182
|
-
|
|
15183
|
-
|
|
15184
|
-
|
|
15375
|
+
if (registering) {
|
|
15376
|
+
await this.arkProvider.deleteIntent(deleteIntent).catch((e) => {
|
|
15377
|
+
if (isNoMatchingIntentsError(e)) return;
|
|
15378
|
+
console.warn(
|
|
15379
|
+
`Failed to delete intent after settle failure for inputs [${inputIds}]; intent may linger on server and cause 'duplicated input' on next settle`,
|
|
15380
|
+
e
|
|
15381
|
+
);
|
|
15382
|
+
});
|
|
15383
|
+
}
|
|
15185
15384
|
await this.persistIntentSnapshot(
|
|
15186
15385
|
intentTxId,
|
|
15187
15386
|
"cancelled",
|
|
@@ -15195,6 +15394,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15195
15394
|
throw error;
|
|
15196
15395
|
} finally {
|
|
15197
15396
|
this._removePendingSpends(params.inputs);
|
|
15397
|
+
for (const key of boardingKeys) this._pendingSpendOutpoints.delete(key);
|
|
15198
15398
|
for (const key of settlingKeys) this._settlingOutpoints.delete(key);
|
|
15199
15399
|
abortController.abort();
|
|
15200
15400
|
await stream?.return?.().catch(() => {
|
|
@@ -15210,7 +15410,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15210
15410
|
async maybeRotateBoardingAfterBoard(inputs) {
|
|
15211
15411
|
if (!this._descriptorProvider) return;
|
|
15212
15412
|
const consumedBoarding = inputs.some(
|
|
15213
|
-
(input) => typeof input !== "string" && !
|
|
15413
|
+
(input) => typeof input !== "string" && !chunkVVFCCNU2_cjs.isVirtualCoin(input)
|
|
15214
15414
|
);
|
|
15215
15415
|
if (!consumedBoarding) return;
|
|
15216
15416
|
try {
|
|
@@ -15221,7 +15421,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15221
15421
|
}
|
|
15222
15422
|
async handleSettlementFinalizationEvent(event, inputs, forfeitOutputScript, expectedRecipients, connectorsGraph, validatedCommitmentTxid) {
|
|
15223
15423
|
const signedForfeits = [];
|
|
15224
|
-
let settlementPsbt =
|
|
15424
|
+
let settlementPsbt = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
|
|
15225
15425
|
assertFinalCommitmentMatchesValidated(
|
|
15226
15426
|
settlementPsbt,
|
|
15227
15427
|
validatedCommitmentTxid,
|
|
@@ -15234,7 +15434,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15234
15434
|
let connectorIndex = 0;
|
|
15235
15435
|
const connectorsLeaves = connectorsGraph?.leaves() || [];
|
|
15236
15436
|
for (const input of inputs) {
|
|
15237
|
-
if (!
|
|
15437
|
+
if (!chunkVVFCCNU2_cjs.isVirtualCoin(input)) {
|
|
15238
15438
|
let matched = false;
|
|
15239
15439
|
for (let i = 0; i < settlementPsbt.inputsLength; i++) {
|
|
15240
15440
|
const settlementInput = settlementPsbt.getInput(i);
|
|
@@ -15272,7 +15472,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15272
15472
|
}
|
|
15273
15473
|
continue;
|
|
15274
15474
|
}
|
|
15275
|
-
if (!
|
|
15475
|
+
if (!chunkVVFCCNU2_cjs.requiresForfeit(input) || isSubdust({ value: input.value }, this.dustAmount)) {
|
|
15276
15476
|
continue;
|
|
15277
15477
|
}
|
|
15278
15478
|
if (connectorsLeaves.length === 0) {
|
|
@@ -15300,7 +15500,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15300
15500
|
index: input.vout,
|
|
15301
15501
|
witnessUtxo: {
|
|
15302
15502
|
amount: BigInt(input.value),
|
|
15303
|
-
script:
|
|
15503
|
+
script: chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
15304
15504
|
},
|
|
15305
15505
|
sighashType: btcSigner.SigHash.DEFAULT,
|
|
15306
15506
|
tapLeafScript: [input.forfeitTapLeafScript]
|
|
@@ -15319,7 +15519,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15319
15519
|
forfeitTx = await this._signerRouter.sign(forfeitTx, [
|
|
15320
15520
|
{
|
|
15321
15521
|
index: 0,
|
|
15322
|
-
lookupScript:
|
|
15522
|
+
lookupScript: chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
15323
15523
|
}
|
|
15324
15524
|
]);
|
|
15325
15525
|
signedForfeits.push(base.base64.encode(forfeitTx.toPSBT()));
|
|
@@ -15377,7 +15577,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15377
15577
|
resolveBatchExpiryPolicy(this.network, this.batchExpiryPolicy)
|
|
15378
15578
|
);
|
|
15379
15579
|
await this.arkProvider.confirmRegistration(intentId);
|
|
15380
|
-
const sweepTapscript =
|
|
15580
|
+
const sweepTapscript = chunkVVFCCNU2_cjs.CSVMultisigTapscript.encode({
|
|
15381
15581
|
timelock,
|
|
15382
15582
|
pubkeys: [this.forfeitPubkey]
|
|
15383
15583
|
}).script;
|
|
@@ -15392,14 +15592,14 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15392
15592
|
throw new Error("Sweep tap tree root not set");
|
|
15393
15593
|
}
|
|
15394
15594
|
const xOnlyPublicKeys = event.cosignersPublicKeys.map(
|
|
15395
|
-
(k) => base.hex.encode(
|
|
15595
|
+
(k) => base.hex.encode(chunkCFOIHLON_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
|
|
15396
15596
|
);
|
|
15397
15597
|
const signerPublicKey = await session.getPublicKey();
|
|
15398
|
-
const xonlySignerPublicKey =
|
|
15598
|
+
const xonlySignerPublicKey = chunkCFOIHLON_cjs.toXOnly(signerPublicKey, "signer key");
|
|
15399
15599
|
if (!xOnlyPublicKeys.includes(base.hex.encode(xonlySignerPublicKey))) {
|
|
15400
15600
|
return { skip: true };
|
|
15401
15601
|
}
|
|
15402
|
-
const commitmentTx =
|
|
15602
|
+
const commitmentTx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(
|
|
15403
15603
|
base.base64.decode(event.unsignedCommitmentTx)
|
|
15404
15604
|
);
|
|
15405
15605
|
validateVtxoTxGraph(vtxoTree, commitmentTx, sweepTapTreeRoot);
|
|
@@ -15481,9 +15681,9 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15481
15681
|
...existing ?? {},
|
|
15482
15682
|
intentTxId,
|
|
15483
15683
|
registerProof: intent.proof,
|
|
15484
|
-
registerProofMessage:
|
|
15684
|
+
registerProofMessage: chunkVVFCCNU2_cjs.Intent.encodeMessage(intent.message),
|
|
15485
15685
|
deleteProof: deleteIntent.proof,
|
|
15486
|
-
deleteProofMessage:
|
|
15686
|
+
deleteProofMessage: chunkVVFCCNU2_cjs.Intent.encodeMessage(deleteIntent.message),
|
|
15487
15687
|
intentVtxos: inputs.map((i) => ({
|
|
15488
15688
|
txid: i.txid,
|
|
15489
15689
|
vout: i.vout
|
|
@@ -15516,7 +15716,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15516
15716
|
try {
|
|
15517
15717
|
return await this.arkProvider.registerIntent(intent);
|
|
15518
15718
|
} catch (error) {
|
|
15519
|
-
if (error instanceof
|
|
15719
|
+
if (error instanceof chunkVVFCCNU2_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
|
|
15520
15720
|
const deleteIntent = await this.makeDeleteIntentSignature(inputs);
|
|
15521
15721
|
await this.arkProvider.deleteIntent(deleteIntent);
|
|
15522
15722
|
return this.arkProvider.registerIntent(intent);
|
|
@@ -15532,7 +15732,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15532
15732
|
expire_at: 0,
|
|
15533
15733
|
cosigners_public_keys: cosignerPubKeys
|
|
15534
15734
|
};
|
|
15535
|
-
const proof =
|
|
15735
|
+
const proof = chunkVVFCCNU2_cjs.Intent.create(message, coins, outputs);
|
|
15536
15736
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15537
15737
|
return {
|
|
15538
15738
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15544,7 +15744,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15544
15744
|
type: "delete",
|
|
15545
15745
|
expire_at: 0
|
|
15546
15746
|
};
|
|
15547
|
-
const proof =
|
|
15747
|
+
const proof = chunkVVFCCNU2_cjs.Intent.create(message, coins, []);
|
|
15548
15748
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15549
15749
|
return {
|
|
15550
15750
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15556,7 +15756,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15556
15756
|
type: "get-pending-tx",
|
|
15557
15757
|
expire_at: 0
|
|
15558
15758
|
};
|
|
15559
|
-
const proof =
|
|
15759
|
+
const proof = chunkVVFCCNU2_cjs.Intent.create(message, coins, []);
|
|
15560
15760
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
15561
15761
|
return {
|
|
15562
15762
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -15577,7 +15777,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15577
15777
|
if (!vtxos || vtxos.length === 0) {
|
|
15578
15778
|
const scriptMap = await this.getScriptMap();
|
|
15579
15779
|
const allExtended = [];
|
|
15580
|
-
const fetchedVtxos = await
|
|
15780
|
+
const fetchedVtxos = await chunkVVFCCNU2_cjs.getAllNormalizedVtxos(this.indexerProvider, [
|
|
15581
15781
|
...scriptMap.keys()
|
|
15582
15782
|
]);
|
|
15583
15783
|
for (const vtxo of fetchedVtxos) {
|
|
@@ -15620,8 +15820,8 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15620
15820
|
batchPending.push(pendingTx.arkTxid);
|
|
15621
15821
|
try {
|
|
15622
15822
|
const checkpointTxs = pendingTx.signedCheckpointTxs.map((c) => {
|
|
15623
|
-
const tx =
|
|
15624
|
-
|
|
15823
|
+
const tx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(c));
|
|
15824
|
+
chunkVVFCCNU2_cjs.assertAllowedSighashTypes(tx);
|
|
15625
15825
|
return tx;
|
|
15626
15826
|
});
|
|
15627
15827
|
assertCheckpointsMatchInputs(
|
|
@@ -15690,11 +15890,11 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15690
15890
|
* and one per deprecated signer — else a pre-rotation tx would stay pending forever.
|
|
15691
15891
|
*/
|
|
15692
15892
|
checkpointUnrollCandidates(info) {
|
|
15693
|
-
const current =
|
|
15893
|
+
const current = chunkVVFCCNU2_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
|
|
15694
15894
|
const candidates = [this._serverUnrollScript, current];
|
|
15695
15895
|
for (const deprecated of signerSetFromInfo(info).deprecated.keys()) {
|
|
15696
15896
|
candidates.push(
|
|
15697
|
-
|
|
15897
|
+
chunkVVFCCNU2_cjs.CSVMultisigTapscript.encode({
|
|
15698
15898
|
...current.params,
|
|
15699
15899
|
pubkeys: [base.hex.decode(deprecated)]
|
|
15700
15900
|
})
|
|
@@ -15776,6 +15976,12 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15776
15976
|
*/
|
|
15777
15977
|
async claimCash(cashStr) {
|
|
15778
15978
|
const cash = ArkadeCash.fromString(cashStr);
|
|
15979
|
+
const info = await this.arkProvider.getInfo();
|
|
15980
|
+
const signerSet = signerSetFromInfo(info);
|
|
15981
|
+
const signer = classifyAgainstSignerSet(base.hex.encode(cash.serverPubKey), signerSet);
|
|
15982
|
+
if (signer.status === "UNKNOWN_SIGNER") {
|
|
15983
|
+
throw new ArkadeCashOperatorMismatchError(signer.signerPubKey, signerSet.active);
|
|
15984
|
+
}
|
|
15779
15985
|
const cashScript = cash.vtxoScript;
|
|
15780
15986
|
const cashPkScript = base.hex.encode(cashScript.pkScript);
|
|
15781
15987
|
const scripts = [cashPkScript];
|
|
@@ -15783,7 +15989,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15783
15989
|
if (vtxos.length === 0) {
|
|
15784
15990
|
throw new Error("No VTXOs found for this arkadeCash");
|
|
15785
15991
|
}
|
|
15786
|
-
const myPkScript =
|
|
15992
|
+
const myPkScript = chunkVVFCCNU2_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
|
|
15787
15993
|
let { spendable, recoverable, unclaimed } = this.classifyCashVtxos(vtxos);
|
|
15788
15994
|
let swept = 0;
|
|
15789
15995
|
const drainable = vtxos.filter(
|
|
@@ -15811,7 +16017,6 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15811
16017
|
}
|
|
15812
16018
|
}
|
|
15813
16019
|
if (spendable.length > 0) {
|
|
15814
|
-
const info = await this.arkProvider.getInfo();
|
|
15815
16020
|
const serverUnrollScript = assertValidServerUnrollScript(
|
|
15816
16021
|
info.checkpointTapscript,
|
|
15817
16022
|
resolveCheckpointExitDelayPolicy(this.network, this.checkpointExitDelayPolicy)
|
|
@@ -15910,7 +16115,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15910
16115
|
params: {
|
|
15911
16116
|
pubKey: base.hex.encode(cash.publicKey),
|
|
15912
16117
|
serverPubKey: base.hex.encode(cash.serverPubKey),
|
|
15913
|
-
csvTimelock:
|
|
16118
|
+
csvTimelock: chunkVVFCCNU2_cjs.timelockToSequence(cash.csvTimelock).toString()
|
|
15914
16119
|
},
|
|
15915
16120
|
script: base.hex.encode(cashScript.pkScript),
|
|
15916
16121
|
address: cashAddress.encode(),
|
|
@@ -15991,7 +16196,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
15991
16196
|
const recoverable = [];
|
|
15992
16197
|
const unclaimed = [];
|
|
15993
16198
|
for (const vtxo of vtxos) {
|
|
15994
|
-
if (
|
|
16199
|
+
if (chunkVVFCCNU2_cjs.isVtxoSpent(vtxo)) {
|
|
15995
16200
|
unclaimed.push(cashReport(vtxo, "already-spent"));
|
|
15996
16201
|
} else if (vtxo.isUnrolled) {
|
|
15997
16202
|
unclaimed.push(cashReport(vtxo, "exited"));
|
|
@@ -16013,7 +16218,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16013
16218
|
const all = [];
|
|
16014
16219
|
const seen = /* @__PURE__ */ new Set();
|
|
16015
16220
|
for (let pageIndex = 0; ; pageIndex++) {
|
|
16016
|
-
const { vtxos, page } = await
|
|
16221
|
+
const { vtxos, page } = await chunkVVFCCNU2_cjs.getNormalizedVtxos(this.indexerProvider, {
|
|
16017
16222
|
scripts,
|
|
16018
16223
|
pageIndex,
|
|
16019
16224
|
pageSize
|
|
@@ -16051,7 +16256,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16051
16256
|
for (let i = 0; i < inputs.length; i += MAX_INPUTS_PER_INTENT) {
|
|
16052
16257
|
const batch = inputs.slice(i, i + MAX_INPUTS_PER_INTENT);
|
|
16053
16258
|
const message = { type: "get-pending-tx", expire_at: 0 };
|
|
16054
|
-
const proof =
|
|
16259
|
+
const proof = chunkVVFCCNU2_cjs.Intent.create(message, batch, []);
|
|
16055
16260
|
const signedProof = await identity.sign(
|
|
16056
16261
|
proof,
|
|
16057
16262
|
Array.from({ length: batch.length + 1 }, (_, j) => j)
|
|
@@ -16072,8 +16277,8 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16072
16277
|
for (const pendingTx of pendingTxs) {
|
|
16073
16278
|
try {
|
|
16074
16279
|
const checkpointTxs = pendingTx.signedCheckpointTxs.map((checkpoint) => {
|
|
16075
|
-
const tx =
|
|
16076
|
-
|
|
16280
|
+
const tx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(checkpoint));
|
|
16281
|
+
chunkVVFCCNU2_cjs.assertAllowedSighashTypes(tx);
|
|
16077
16282
|
return tx;
|
|
16078
16283
|
});
|
|
16079
16284
|
assertCheckpointsMatchInputs(
|
|
@@ -16113,7 +16318,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16113
16318
|
}
|
|
16114
16319
|
/** Sum the outputs of an ark tx PSBT that pay the given scriptPubKey. */
|
|
16115
16320
|
arkTxAmountPaidTo(arkTxPsbt, pkScriptHex) {
|
|
16116
|
-
const arkTx =
|
|
16321
|
+
const arkTx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(arkTxPsbt));
|
|
16117
16322
|
let total = 0;
|
|
16118
16323
|
for (let i = 0; i < arkTx.outputsLength; i++) {
|
|
16119
16324
|
const output = arkTx.getOutput(i);
|
|
@@ -16151,9 +16356,16 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16151
16356
|
const validUntil = captureSendDeadline(params.validUntil);
|
|
16152
16357
|
const inputExpiryFloor = captureInputExpiryFloor(params.inputExpiryFloor);
|
|
16153
16358
|
assertSendDeadline(validUntil);
|
|
16154
|
-
return this._withTxLock(
|
|
16359
|
+
return this._withTxLock(
|
|
16360
|
+
(release) => this._sendImpl(
|
|
16361
|
+
params,
|
|
16362
|
+
validUntil,
|
|
16363
|
+
inputExpiryFloor,
|
|
16364
|
+
this._concurrentSpending ? release : void 0
|
|
16365
|
+
)
|
|
16366
|
+
);
|
|
16155
16367
|
}
|
|
16156
|
-
async _sendImpl({ recipients: args, selectedVtxos, maxChangeFee }, validUntil, inputExpiryFloor) {
|
|
16368
|
+
async _sendImpl({ recipients: args, selectedVtxos, maxChangeFee }, validUntil, inputExpiryFloor, onReserved) {
|
|
16157
16369
|
assertSendDeadline(validUntil);
|
|
16158
16370
|
if (args.length === 0) {
|
|
16159
16371
|
throw new Error("At least one receiver is required");
|
|
@@ -16165,7 +16377,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16165
16377
|
throw new Error("send({ maxChangeFee }): expected a non-negative safe integer");
|
|
16166
16378
|
}
|
|
16167
16379
|
if (selectedVtxos) {
|
|
16168
|
-
if (inputExpiryFloor) selectedVtxos = selectedVtxos.map(
|
|
16380
|
+
if (inputExpiryFloor) selectedVtxos = selectedVtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo);
|
|
16169
16381
|
if (inputExpiryFloor && selectedVtxos.some((coin) => !meetsInputExpiryFloor(coin, inputExpiryFloor))) {
|
|
16170
16382
|
throw new Error("send({ selectedVtxos }): input expiry floor not met");
|
|
16171
16383
|
}
|
|
@@ -16300,7 +16512,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16300
16512
|
script: recipient.script,
|
|
16301
16513
|
amount: BigInt(recipient.amount),
|
|
16302
16514
|
// Already checked against the recipient address in `validateRecipients`.
|
|
16303
|
-
...recipient.tapTree ? { tapTree:
|
|
16515
|
+
...recipient.tapTree ? { tapTree: chunkVVFCCNU2_cjs.toBIP371TapTree(recipient.tapTree) } : {}
|
|
16304
16516
|
}));
|
|
16305
16517
|
const totalBtcOutput = outputs.reduce((sum, o) => sum + Number(o.amount), 0);
|
|
16306
16518
|
let changeAmount = totalBtcSelected - totalBtcOutput;
|
|
@@ -16438,6 +16650,8 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16438
16650
|
serverUnrollScript,
|
|
16439
16651
|
changeAssets: changeReceiver?.assets
|
|
16440
16652
|
},
|
|
16653
|
+
onReserved,
|
|
16654
|
+
!selectedVtxos,
|
|
16441
16655
|
{ validUntil }
|
|
16442
16656
|
);
|
|
16443
16657
|
}
|
|
@@ -16445,8 +16659,11 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16445
16659
|
* Shared submit/persist tail of `send` and {@link sendSelectedVtxosToSelf}; callers own coin
|
|
16446
16660
|
* selection, outputs and the synchronous epoch snapshot.
|
|
16447
16661
|
*/
|
|
16448
|
-
async _submitOffchainSpend(inputs, outputs, persist, options) {
|
|
16662
|
+
async _submitOffchainSpend(inputs, outputs, persist, onReserved, picked = false, options) {
|
|
16663
|
+
if (picked) this._assertNotHeld(inputs);
|
|
16664
|
+
if (onReserved) this._assertNotInFlight(inputs);
|
|
16449
16665
|
this._addPendingSpends(inputs);
|
|
16666
|
+
onReserved?.();
|
|
16450
16667
|
try {
|
|
16451
16668
|
const { arkTxid, signedCheckpointTxs } = await this._buildAndSubmitOffchainTx(
|
|
16452
16669
|
inputs,
|
|
@@ -16482,15 +16699,15 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16482
16699
|
if (inputs.length === 0) {
|
|
16483
16700
|
throw new Error("sendSelectedVtxosToSelf: no inputs");
|
|
16484
16701
|
}
|
|
16485
|
-
return this._withTxLock(async () => {
|
|
16702
|
+
return this._withTxLock(async (release) => {
|
|
16486
16703
|
const offchainTapscript = this.offchainTapscript;
|
|
16487
16704
|
const serverPubKey = this.arkServerPublicKey;
|
|
16488
16705
|
const serverUnrollScript = this.serverUnrollScript;
|
|
16489
16706
|
const arkAddress = offchainTapscript.address(this.network.hrp, serverPubKey);
|
|
16490
|
-
const normalizedInputs = inputs.map(
|
|
16491
|
-
const at = now ?? await
|
|
16707
|
+
const normalizedInputs = inputs.map(chunkVVFCCNU2_cjs.normalizeVtxo);
|
|
16708
|
+
const at = now ?? await chunkVVFCCNU2_cjs.resolveTimeHeight(this.onchainProvider);
|
|
16492
16709
|
for (const input of normalizedInputs) {
|
|
16493
|
-
if (!
|
|
16710
|
+
if (!chunkVVFCCNU2_cjs.canSpendOffchain(input, at)) {
|
|
16494
16711
|
throw new Error(
|
|
16495
16712
|
`sendSelectedVtxosToSelf: input ${input.txid}:${input.vout} is not cooperatively spendable`
|
|
16496
16713
|
);
|
|
@@ -16525,16 +16742,21 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16525
16742
|
const packet = createAssetPacket(assetInputs, [], selfReceiver);
|
|
16526
16743
|
outputs.push(Extension.create([packet]).txOut());
|
|
16527
16744
|
}
|
|
16528
|
-
return this._submitOffchainSpend(
|
|
16529
|
-
|
|
16530
|
-
|
|
16531
|
-
|
|
16532
|
-
|
|
16533
|
-
|
|
16534
|
-
|
|
16535
|
-
|
|
16536
|
-
|
|
16537
|
-
|
|
16745
|
+
return this._submitOffchainSpend(
|
|
16746
|
+
normalizedInputs,
|
|
16747
|
+
outputs,
|
|
16748
|
+
{
|
|
16749
|
+
sentAmount: 0,
|
|
16750
|
+
changeAmount: total,
|
|
16751
|
+
changeVout: 0,
|
|
16752
|
+
offchainTapscript,
|
|
16753
|
+
serverPubKey,
|
|
16754
|
+
changeAssets: selfAssets,
|
|
16755
|
+
recordSentHistory: false,
|
|
16756
|
+
serverUnrollScript
|
|
16757
|
+
},
|
|
16758
|
+
this._concurrentSpending ? release : void 0
|
|
16759
|
+
);
|
|
16538
16760
|
});
|
|
16539
16761
|
}
|
|
16540
16762
|
/**
|
|
@@ -16569,7 +16791,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16569
16791
|
);
|
|
16570
16792
|
const arkTxJobs = inputs.map((input, index) => ({
|
|
16571
16793
|
index,
|
|
16572
|
-
lookupScript:
|
|
16794
|
+
lookupScript: chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
16573
16795
|
}));
|
|
16574
16796
|
const identity = this.identity;
|
|
16575
16797
|
const signer = {
|
|
@@ -16605,51 +16827,63 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16605
16827
|
this.inputSigningJobsFromWitnessUtxos(checkpoint)
|
|
16606
16828
|
)
|
|
16607
16829
|
};
|
|
16608
|
-
|
|
16609
|
-
|
|
16610
|
-
|
|
16611
|
-
|
|
16612
|
-
|
|
16613
|
-
|
|
16614
|
-
|
|
16615
|
-
|
|
16616
|
-
|
|
16617
|
-
|
|
16618
|
-
|
|
16619
|
-
|
|
16620
|
-
|
|
16621
|
-
|
|
16622
|
-
|
|
16623
|
-
|
|
16624
|
-
|
|
16625
|
-
|
|
16626
|
-
|
|
16627
|
-
|
|
16628
|
-
|
|
16830
|
+
let awaitingFinalize = false;
|
|
16831
|
+
try {
|
|
16832
|
+
return await submitOffchainTx(
|
|
16833
|
+
this.arkProvider,
|
|
16834
|
+
offchainTx,
|
|
16835
|
+
signer,
|
|
16836
|
+
{
|
|
16837
|
+
// Mark pending before submitting — if we crash between submit and
|
|
16838
|
+
// finalize, the next init recovers via finalizePendingTxs.
|
|
16839
|
+
beforeSubmit: async () => {
|
|
16840
|
+
const ownsPendingFlag = validUntil !== void 0 && !await this.hasPendingTxFlag();
|
|
16841
|
+
this._submitsAwaitingFinalize++;
|
|
16842
|
+
awaitingFinalize = true;
|
|
16843
|
+
await this.setPendingTxFlag(true);
|
|
16844
|
+
try {
|
|
16845
|
+
assertSendDeadline(validUntil);
|
|
16846
|
+
} catch (error) {
|
|
16847
|
+
this._submitsAwaitingFinalize--;
|
|
16848
|
+
awaitingFinalize = false;
|
|
16849
|
+
if (ownsPendingFlag && this._submitsAwaitingFinalize === 0) {
|
|
16850
|
+
try {
|
|
16851
|
+
await this.setPendingTxFlag(false);
|
|
16852
|
+
} catch (clearError) {
|
|
16853
|
+
console.error(
|
|
16854
|
+
"Failed to clear pending tx flag after deadline expiry:",
|
|
16855
|
+
clearError
|
|
16856
|
+
);
|
|
16857
|
+
}
|
|
16629
16858
|
}
|
|
16859
|
+
throw error;
|
|
16860
|
+
}
|
|
16861
|
+
},
|
|
16862
|
+
afterFinalize: async () => {
|
|
16863
|
+
this._submitsAwaitingFinalize--;
|
|
16864
|
+
awaitingFinalize = false;
|
|
16865
|
+
if (this._submitsAwaitingFinalize > 0) return;
|
|
16866
|
+
try {
|
|
16867
|
+
await this.setPendingTxFlag(false);
|
|
16868
|
+
} catch (error) {
|
|
16869
|
+
console.error("Failed to clear pending tx flag:", error);
|
|
16630
16870
|
}
|
|
16631
|
-
throw error;
|
|
16632
16871
|
}
|
|
16633
16872
|
},
|
|
16634
|
-
|
|
16635
|
-
|
|
16636
|
-
|
|
16637
|
-
|
|
16638
|
-
|
|
16873
|
+
{
|
|
16874
|
+
// Deprecated keys too: a vtxo built before a rotation is still
|
|
16875
|
+
// spent under the signer its leaf names.
|
|
16876
|
+
verifyServerSignatures: {
|
|
16877
|
+
serverPubkey: this._arkServerPublicKey,
|
|
16878
|
+
deprecatedServerPubkeys: [...this._deprecatedSigners.keys()].map(
|
|
16879
|
+
(h) => base.hex.decode(h)
|
|
16880
|
+
)
|
|
16639
16881
|
}
|
|
16640
16882
|
}
|
|
16641
|
-
|
|
16642
|
-
|
|
16643
|
-
|
|
16644
|
-
|
|
16645
|
-
verifyServerSignatures: {
|
|
16646
|
-
serverPubkey: this._arkServerPublicKey,
|
|
16647
|
-
deprecatedServerPubkeys: [...this._deprecatedSigners.keys()].map(
|
|
16648
|
-
(h) => base.hex.decode(h)
|
|
16649
|
-
)
|
|
16650
|
-
}
|
|
16651
|
-
}
|
|
16652
|
-
);
|
|
16883
|
+
);
|
|
16884
|
+
} finally {
|
|
16885
|
+
if (awaitingFinalize) this._submitsAwaitingFinalize--;
|
|
16886
|
+
}
|
|
16653
16887
|
}
|
|
16654
16888
|
// Mark inputs spent and save change. `offchainTapscript`/`serverPubKey` are the caller's epoch
|
|
16655
16889
|
// snapshot, so the record matches what the server saw even if a rotation lands mid-flight.
|
|
@@ -16666,7 +16900,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16666
16900
|
}
|
|
16667
16901
|
const checkpointIdByOutpoint = /* @__PURE__ */ new Map();
|
|
16668
16902
|
for (const encoded of signedCheckpointTxs) {
|
|
16669
|
-
const checkpoint =
|
|
16903
|
+
const checkpoint = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
|
|
16670
16904
|
for (let i = 0; i < checkpoint.inputsLength; i++) {
|
|
16671
16905
|
const input = checkpoint.getInput(i);
|
|
16672
16906
|
if (!input.txid) continue;
|
|
@@ -16782,12 +17016,12 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16782
17016
|
const spentVtxos = [];
|
|
16783
17017
|
const inputArkTxIds = /* @__PURE__ */ new Set();
|
|
16784
17018
|
const boardingRemovalsByAddress = /* @__PURE__ */ new Map();
|
|
16785
|
-
const vtxoInputs = inputs.filter(
|
|
17019
|
+
const vtxoInputs = inputs.filter(chunkVVFCCNU2_cjs.isVirtualCoin);
|
|
16786
17020
|
const cm = await this.getContractManager();
|
|
16787
17021
|
const annotatedVtxos = await cm.annotateVtxos(vtxoInputs);
|
|
16788
17022
|
const annotatedByKey = new Map(annotatedVtxos.map((v) => [`${v.txid}:${v.vout}`, v]));
|
|
16789
17023
|
for (const input of inputs) {
|
|
16790
|
-
if (
|
|
17024
|
+
if (chunkVVFCCNU2_cjs.isVirtualCoin(input)) {
|
|
16791
17025
|
const outpoint = `${input.txid}:${input.vout}`;
|
|
16792
17026
|
const vtxo = annotatedByKey.get(outpoint);
|
|
16793
17027
|
if (!vtxo) {
|
|
@@ -16804,7 +17038,7 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16804
17038
|
} else {
|
|
16805
17039
|
let sourceAddress;
|
|
16806
17040
|
try {
|
|
16807
|
-
sourceAddress =
|
|
17041
|
+
sourceAddress = chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
|
|
16808
17042
|
this.network
|
|
16809
17043
|
);
|
|
16810
17044
|
} catch {
|
|
@@ -16847,13 +17081,19 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16847
17081
|
);
|
|
16848
17082
|
}
|
|
16849
17083
|
}
|
|
16850
|
-
|
|
16851
|
-
|
|
16852
|
-
|
|
16853
|
-
|
|
16854
|
-
|
|
16855
|
-
|
|
16856
|
-
|
|
17084
|
+
if (boardingRemovalsByAddress.size > 0) {
|
|
17085
|
+
await inVtxoWriteOrder(this.walletRepository, async () => {
|
|
17086
|
+
for (const [address, toRemove] of boardingRemovalsByAddress) {
|
|
17087
|
+
const currentUtxos = await collectUtxos(this.walletRepository, address);
|
|
17088
|
+
const filtered = currentUtxos.filter(
|
|
17089
|
+
(u) => !toRemove.has(`${u.txid}:${u.vout}`)
|
|
17090
|
+
);
|
|
17091
|
+
await this.walletRepository.deleteUtxos(address);
|
|
17092
|
+
if (filtered.length > 0) {
|
|
17093
|
+
await this.walletRepository.saveUtxos(address, filtered);
|
|
17094
|
+
}
|
|
17095
|
+
}
|
|
17096
|
+
});
|
|
16857
17097
|
}
|
|
16858
17098
|
} catch (e) {
|
|
16859
17099
|
console.warn("error updating repository after settle", e);
|
|
@@ -16861,15 +17101,16 @@ var Wallet2 = class extends ReadonlyWallet {
|
|
|
16861
17101
|
}
|
|
16862
17102
|
}
|
|
16863
17103
|
};
|
|
17104
|
+
function bySelectionOrder(a, b) {
|
|
17105
|
+
const expiryA = a.expiresAt?.getTime() || Number.MAX_SAFE_INTEGER;
|
|
17106
|
+
const expiryB = b.expiresAt?.getTime() || Number.MAX_SAFE_INTEGER;
|
|
17107
|
+
if (expiryA !== expiryB) {
|
|
17108
|
+
return expiryA - expiryB;
|
|
17109
|
+
}
|
|
17110
|
+
return b.value - a.value;
|
|
17111
|
+
}
|
|
16864
17112
|
function selectVirtualCoins(coins, targetAmount) {
|
|
16865
|
-
const sortedCoins = coins.map(
|
|
16866
|
-
const expiryA = a.expiresAt?.getTime() || Number.MAX_SAFE_INTEGER;
|
|
16867
|
-
const expiryB = b.expiresAt?.getTime() || Number.MAX_SAFE_INTEGER;
|
|
16868
|
-
if (expiryA !== expiryB) {
|
|
16869
|
-
return expiryA - expiryB;
|
|
16870
|
-
}
|
|
16871
|
-
return b.value - a.value;
|
|
16872
|
-
});
|
|
17113
|
+
const sortedCoins = coins.map(chunkVVFCCNU2_cjs.normalizeVtxo).sort(bySelectionOrder);
|
|
16873
17114
|
const selectedCoins = [];
|
|
16874
17115
|
let selectedAmount = 0;
|
|
16875
17116
|
for (const coin of sortedCoins) {
|
|
@@ -16897,6 +17138,18 @@ var AbortError = class extends Error {
|
|
|
16897
17138
|
this.name = "AbortError";
|
|
16898
17139
|
}
|
|
16899
17140
|
};
|
|
17141
|
+
var VtxoReservedError = class extends Error {
|
|
17142
|
+
constructor(outpoints, holder) {
|
|
17143
|
+
super(
|
|
17144
|
+
`${outpoints.join(", ")} ${holder === "held" ? "held by reserveVtxos" : "already being spent by another operation"}`
|
|
17145
|
+
);
|
|
17146
|
+
this.outpoints = outpoints;
|
|
17147
|
+
this.holder = holder;
|
|
17148
|
+
}
|
|
17149
|
+
outpoints;
|
|
17150
|
+
holder;
|
|
17151
|
+
name = "VtxoReservedError";
|
|
17152
|
+
};
|
|
16900
17153
|
function abortReason(signal) {
|
|
16901
17154
|
const { reason } = signal;
|
|
16902
17155
|
if (reason instanceof Error) return reason;
|
|
@@ -16974,7 +17227,7 @@ function assertTimeoutMap(name, timeouts) {
|
|
|
16974
17227
|
if (value === void 0) {
|
|
16975
17228
|
throw new Error(`${name}.${key} must be a non-negative safe integer`);
|
|
16976
17229
|
}
|
|
16977
|
-
|
|
17230
|
+
chunkVVFCCNU2_cjs.assertTimerMs(`${name}.${key}`, value);
|
|
16978
17231
|
}
|
|
16979
17232
|
}
|
|
16980
17233
|
var MessageBus = class {
|
|
@@ -16990,8 +17243,8 @@ var MessageBus = class {
|
|
|
16990
17243
|
}) {
|
|
16991
17244
|
this.walletRepository = walletRepository;
|
|
16992
17245
|
this.contractRepository = contractRepository;
|
|
16993
|
-
|
|
16994
|
-
|
|
17246
|
+
chunkVVFCCNU2_cjs.assertTimerMs("tickIntervalMs", tickIntervalMs);
|
|
17247
|
+
chunkVVFCCNU2_cjs.assertTimerMs("messageTimeoutMs", messageTimeoutMs);
|
|
16995
17248
|
assertTimeoutMap("messageTimeoutOverrides", messageTimeoutOverrides);
|
|
16996
17249
|
this.intentRepository = intentRepository;
|
|
16997
17250
|
this.handlers = new Map(messageHandlers.map((u) => [u.messageTag, u]));
|
|
@@ -17245,14 +17498,14 @@ var MessageBus = class {
|
|
|
17245
17498
|
this.initialized = true;
|
|
17246
17499
|
}
|
|
17247
17500
|
async buildServices(config) {
|
|
17248
|
-
const arkProvider = new
|
|
17501
|
+
const arkProvider = new chunkVVFCCNU2_cjs.RestArkProvider(config.arkServer.url);
|
|
17249
17502
|
const storage = {
|
|
17250
17503
|
walletRepository: this.walletRepository,
|
|
17251
17504
|
contractRepository: this.contractRepository,
|
|
17252
17505
|
...this.intentRepository && { intentRepository: this.intentRepository }
|
|
17253
17506
|
};
|
|
17254
17507
|
const delegateProvider = config.delegateUrl ? new RestDelegateProvider(config.delegateUrl) : void 0;
|
|
17255
|
-
const indexerProvider = new
|
|
17508
|
+
const indexerProvider = new chunkFEBAG2K2_cjs.RestIndexerProvider(config.arkServer.url);
|
|
17256
17509
|
const serialized = normalizeSerializedIdentity(config.wallet);
|
|
17257
17510
|
if (isSigningSerialized(serialized)) {
|
|
17258
17511
|
const identity2 = hydrateIdentity(serialized);
|
|
@@ -17264,6 +17517,7 @@ var MessageBus = class {
|
|
|
17264
17517
|
storage,
|
|
17265
17518
|
delegateProvider,
|
|
17266
17519
|
settlementConfig: config.settlementConfig,
|
|
17520
|
+
concurrentSpending: config.concurrentSpending,
|
|
17267
17521
|
walletMode: config.walletMode,
|
|
17268
17522
|
lazyInitialization: config.lazyInitialization,
|
|
17269
17523
|
watcherConfig: config.watcherConfig,
|
|
@@ -17592,7 +17846,7 @@ var offboardNetworkNames = [
|
|
|
17592
17846
|
function offboardDestinationScript(destinationAddress) {
|
|
17593
17847
|
for (const networkName of offboardNetworkNames) {
|
|
17594
17848
|
try {
|
|
17595
|
-
const network =
|
|
17849
|
+
const network = chunkVVFCCNU2_cjs.networks[networkName];
|
|
17596
17850
|
const addr = btcSigner.Address(network).decode(destinationAddress);
|
|
17597
17851
|
return btcSigner.OutScript.encode(addr);
|
|
17598
17852
|
} catch {
|
|
@@ -17623,12 +17877,16 @@ function reportUngatedInputs(wallet, inputs) {
|
|
|
17623
17877
|
const logger = wallet;
|
|
17624
17878
|
void logger.logUngatedInputs("Ramps.offboard({ vtxos })", inputs);
|
|
17625
17879
|
}
|
|
17880
|
+
var MAX_EXIT_PICKS = 3;
|
|
17881
|
+
function picksCovering(wallet) {
|
|
17882
|
+
return wallet.concurrentSpending === true;
|
|
17883
|
+
}
|
|
17626
17884
|
function filterOffboardInputs(vtxos, feeInfo, named) {
|
|
17627
17885
|
const estimator = new Estimator(feeInfo?.intentFee ?? {});
|
|
17628
17886
|
const inputs = [];
|
|
17629
17887
|
let subtotal = 0n;
|
|
17630
17888
|
for (const vtxo of vtxos) {
|
|
17631
|
-
const inputFee = estimator.evalOffchainInput(
|
|
17889
|
+
const inputFee = estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(vtxo));
|
|
17632
17890
|
if (inputFee.satoshis >= vtxo.value) {
|
|
17633
17891
|
if (named) {
|
|
17634
17892
|
throw new Error(
|
|
@@ -17686,7 +17944,7 @@ var Ramps = class {
|
|
|
17686
17944
|
* ```
|
|
17687
17945
|
*/
|
|
17688
17946
|
async onboard(feeInfo, boardingUtxos, amount, eventCallback) {
|
|
17689
|
-
boardingUtxos = boardingUtxos ?? await this.wallet
|
|
17947
|
+
boardingUtxos = boardingUtxos ?? await getSelectableBoardingUtxos(this.wallet);
|
|
17690
17948
|
const estimator = new Estimator(feeInfo?.intentFee ?? {});
|
|
17691
17949
|
const filteredBoardingUtxos = [];
|
|
17692
17950
|
let totalAmount = 0n;
|
|
@@ -17725,7 +17983,7 @@ var Ramps = class {
|
|
|
17725
17983
|
}
|
|
17726
17984
|
amount = amount ?? totalAmount;
|
|
17727
17985
|
const offchainAddress = await this.wallet.getAddress();
|
|
17728
|
-
const offchainAddr =
|
|
17986
|
+
const offchainAddr = chunkVVFCCNU2_cjs.ArkAddress.decode(offchainAddress);
|
|
17729
17987
|
const offchainScript = base.hex.encode(offchainAddr.pkScript);
|
|
17730
17988
|
const outputFee = estimator.evalOffchainOutput({
|
|
17731
17989
|
amount,
|
|
@@ -17780,29 +18038,39 @@ var Ramps = class {
|
|
|
17780
18038
|
* ```
|
|
17781
18039
|
*/
|
|
17782
18040
|
async offboard(destinationAddress, feeInfo, amount, eventCallback, vtxos) {
|
|
17783
|
-
|
|
17784
|
-
|
|
17785
|
-
|
|
17786
|
-
|
|
17787
|
-
|
|
17788
|
-
|
|
17789
|
-
amount
|
|
17790
|
-
|
|
17791
|
-
|
|
17792
|
-
|
|
17793
|
-
|
|
17794
|
-
|
|
17795
|
-
|
|
17796
|
-
|
|
17797
|
-
|
|
17798
|
-
|
|
18041
|
+
return this.withRepick(vtxos !== void 0, async () => {
|
|
18042
|
+
const {
|
|
18043
|
+
estimator,
|
|
18044
|
+
inputs: candidates,
|
|
18045
|
+
subtotal
|
|
18046
|
+
} = await this.offboardInputs(feeInfo, vtxos);
|
|
18047
|
+
if (amount && amount > subtotal) {
|
|
18048
|
+
throw new Error("Amount is greater than total amount of vtxos after fees");
|
|
18049
|
+
}
|
|
18050
|
+
const handed = amount || subtotal;
|
|
18051
|
+
const { inputs, change, changeAddress } = await this.fundExit(
|
|
18052
|
+
candidates,
|
|
18053
|
+
subtotal,
|
|
18054
|
+
handed,
|
|
18055
|
+
estimator,
|
|
18056
|
+
Boolean(amount) && vtxos === void 0
|
|
17799
18057
|
);
|
|
17800
|
-
|
|
17801
|
-
|
|
17802
|
-
|
|
17803
|
-
|
|
17804
|
-
|
|
17805
|
-
|
|
18058
|
+
const outputFee = estimator.evalOnchainOutput({
|
|
18059
|
+
amount: handed,
|
|
18060
|
+
script: base.hex.encode(offboardDestinationScript(destinationAddress))
|
|
18061
|
+
});
|
|
18062
|
+
if (BigInt(outputFee.satoshis) > handed) {
|
|
18063
|
+
throw new Error(
|
|
18064
|
+
`can't deduct fees from offboard amount (${outputFee.satoshis} > ${handed})`
|
|
18065
|
+
);
|
|
18066
|
+
}
|
|
18067
|
+
const outputs = [
|
|
18068
|
+
{ address: destinationAddress, amount: handed - BigInt(outputFee.satoshis) }
|
|
18069
|
+
];
|
|
18070
|
+
if (change > 0n) outputs.push({ address: changeAddress, amount: change });
|
|
18071
|
+
const params = { inputs, outputs };
|
|
18072
|
+
return this.wallet.settle(vtxos ? params : markSdkPicked(params), eventCallback);
|
|
18073
|
+
});
|
|
17806
18074
|
}
|
|
17807
18075
|
/**
|
|
17808
18076
|
* Collaboratively exit with the DESTINATION paid exactly `amount`, pricing the
|
|
@@ -17815,23 +18083,36 @@ var Ramps = class {
|
|
|
17815
18083
|
if (amount <= 0n) {
|
|
17816
18084
|
throw new Error(`offboard amount must be positive, got ${amount}`);
|
|
17817
18085
|
}
|
|
17818
|
-
|
|
17819
|
-
|
|
17820
|
-
|
|
17821
|
-
|
|
17822
|
-
|
|
17823
|
-
})
|
|
17824
|
-
|
|
17825
|
-
|
|
17826
|
-
|
|
17827
|
-
|
|
17828
|
-
|
|
18086
|
+
return this.withRepick(vtxos !== void 0, async () => {
|
|
18087
|
+
const {
|
|
18088
|
+
estimator,
|
|
18089
|
+
inputs: candidates,
|
|
18090
|
+
subtotal
|
|
18091
|
+
} = await this.offboardInputs(feeInfo, vtxos);
|
|
18092
|
+
const outputFee = BigInt(
|
|
18093
|
+
estimator.evalOnchainOutput({
|
|
18094
|
+
amount,
|
|
18095
|
+
script: base.hex.encode(offboardDestinationScript(destinationAddress))
|
|
18096
|
+
}).satoshis
|
|
17829
18097
|
);
|
|
17830
|
-
|
|
17831
|
-
|
|
17832
|
-
|
|
17833
|
-
|
|
17834
|
-
|
|
18098
|
+
const needed = amount + outputFee;
|
|
18099
|
+
if (needed > subtotal) {
|
|
18100
|
+
throw new Error(
|
|
18101
|
+
`selected vtxos net ${subtotal} sats, ${needed} needed to deliver ${amount} exactly (${amount} + a ${outputFee} sat exit fee)`
|
|
18102
|
+
);
|
|
18103
|
+
}
|
|
18104
|
+
const { inputs, change, changeAddress } = await this.fundExit(
|
|
18105
|
+
candidates,
|
|
18106
|
+
subtotal,
|
|
18107
|
+
needed,
|
|
18108
|
+
estimator,
|
|
18109
|
+
vtxos === void 0
|
|
18110
|
+
);
|
|
18111
|
+
const outputs = [{ address: destinationAddress, amount }];
|
|
18112
|
+
if (change > 0n) outputs.push({ address: changeAddress, amount: change });
|
|
18113
|
+
const params2 = { inputs, outputs };
|
|
18114
|
+
return this.wallet.settle(vtxos ? params2 : markSdkPicked(params2), eventCallback);
|
|
18115
|
+
});
|
|
17835
18116
|
}
|
|
17836
18117
|
async offboardInputs(feeInfo, vtxos) {
|
|
17837
18118
|
const named = vtxos !== void 0;
|
|
@@ -17844,12 +18125,49 @@ var Ramps = class {
|
|
|
17844
18125
|
const estimator = new Estimator(feeInfo?.intentFee ?? {});
|
|
17845
18126
|
return { estimator, ...filterOffboardInputs(spendable, feeInfo, named) };
|
|
17846
18127
|
}
|
|
18128
|
+
/** Every candidate, or with `concurrentSpending` the shortest covering prefix in send order. */
|
|
18129
|
+
async fundExit(candidates, subtotal, needed, estimator, cover) {
|
|
18130
|
+
if (!cover || !picksCovering(this.wallet)) {
|
|
18131
|
+
return { inputs: candidates, ...await this.fundChange(subtotal - needed, estimator) };
|
|
18132
|
+
}
|
|
18133
|
+
const ordered = [...candidates].sort(bySelectionOrder);
|
|
18134
|
+
let covered = 0n;
|
|
18135
|
+
for (let i = 0; i < ordered.length && i < MAX_VTXOS_PER_SETTLEMENT; i++) {
|
|
18136
|
+
const fee = estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(ordered[i])).satoshis;
|
|
18137
|
+
covered += BigInt(ordered[i].value) - BigInt(fee);
|
|
18138
|
+
if (covered < needed) continue;
|
|
18139
|
+
try {
|
|
18140
|
+
return {
|
|
18141
|
+
inputs: ordered.slice(0, i + 1),
|
|
18142
|
+
...await this.fundChange(covered - needed, estimator)
|
|
18143
|
+
};
|
|
18144
|
+
} catch (error) {
|
|
18145
|
+
if (!(error instanceof DustChangeError) || i + 1 === ordered.length) throw error;
|
|
18146
|
+
}
|
|
18147
|
+
}
|
|
18148
|
+
throw new Error(
|
|
18149
|
+
`this exit needs more than ${MAX_VTXOS_PER_SETTLEMENT} inputs; exit less, or consolidate first`
|
|
18150
|
+
);
|
|
18151
|
+
}
|
|
18152
|
+
/** Re-runs an SDK-picked exit that lost a coin to a concurrent spend. */
|
|
18153
|
+
async withRepick(named, exit) {
|
|
18154
|
+
for (let attempt = 1; ; attempt++) {
|
|
18155
|
+
try {
|
|
18156
|
+
return await exit();
|
|
18157
|
+
} catch (error) {
|
|
18158
|
+
const lostRace = error?.name === "VtxoReservedError";
|
|
18159
|
+
if (named || !lostRace || !picksCovering(this.wallet) || attempt >= MAX_EXIT_PICKS) {
|
|
18160
|
+
throw error;
|
|
18161
|
+
}
|
|
18162
|
+
}
|
|
18163
|
+
}
|
|
18164
|
+
}
|
|
17847
18165
|
/** Fund the change output: pay its own fee, then judge it against both
|
|
17848
18166
|
* server-side bounds. `0n` in is `0n` out — no change output at all. */
|
|
17849
18167
|
async fundChange(left, estimator) {
|
|
17850
18168
|
if (left <= 0n) return { change: 0n };
|
|
17851
18169
|
const changeAddress = await this.wallet.getAddress();
|
|
17852
|
-
const changeScript = base.hex.encode(
|
|
18170
|
+
const changeScript = base.hex.encode(chunkVVFCCNU2_cjs.ArkAddress.decode(changeAddress).pkScript);
|
|
17853
18171
|
const { change } = changeAfterOutputFee(
|
|
17854
18172
|
left,
|
|
17855
18173
|
(amount) => BigInt(estimator.evalOffchainOutput({ amount, script: changeScript }).satoshis)
|
|
@@ -18340,6 +18658,17 @@ var WalletMessageHandler = class {
|
|
|
18340
18658
|
payload: { contracts, filterApplied: true }
|
|
18341
18659
|
});
|
|
18342
18660
|
}
|
|
18661
|
+
case "GET_STORED_CONTRACTS_WITH_VTXOS": {
|
|
18662
|
+
const manager = await this.readonlyWallet.getContractManager();
|
|
18663
|
+
const contracts = await manager.getStoredContractsWithVtxos(
|
|
18664
|
+
message.payload.filter
|
|
18665
|
+
);
|
|
18666
|
+
return this.tagged({
|
|
18667
|
+
id,
|
|
18668
|
+
type: "STORED_CONTRACTS_WITH_VTXOS",
|
|
18669
|
+
payload: { contracts }
|
|
18670
|
+
});
|
|
18671
|
+
}
|
|
18343
18672
|
case "WATCH_SCRIPT": {
|
|
18344
18673
|
const manager = await this.readonlyWallet.getContractManager();
|
|
18345
18674
|
if (!manager.watchScript) throw unsupportedByManager("watchScript");
|
|
@@ -18763,7 +19092,7 @@ var WalletMessageHandler = class {
|
|
|
18763
19092
|
this.lazyBoardingInit = payload.lazyBoarding ?? false;
|
|
18764
19093
|
this.boardingEpoch++;
|
|
18765
19094
|
this.boardingLoaded = false;
|
|
18766
|
-
this.indexerProvider = new
|
|
19095
|
+
this.indexerProvider = new chunkFEBAG2K2_cjs.RestIndexerProvider(arkServerUrl);
|
|
18767
19096
|
await this.onWalletInitialized();
|
|
18768
19097
|
}
|
|
18769
19098
|
/** @see RequestInitWallet.payload.lazyBoarding */
|
|
@@ -19185,7 +19514,7 @@ var WalletMessageHandler = class {
|
|
|
19185
19514
|
this.readonlyWallet.getBoardingTxs()
|
|
19186
19515
|
]);
|
|
19187
19516
|
const indexerProvider = this.indexerProvider;
|
|
19188
|
-
const resolveTxCreatedAt = indexerProvider ? (txids) =>
|
|
19517
|
+
const resolveTxCreatedAt = indexerProvider ? (txids) => chunkVVFCCNU2_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
|
|
19189
19518
|
return buildTransactionHistory(
|
|
19190
19519
|
vtxos,
|
|
19191
19520
|
boardingTxs,
|
|
@@ -19254,7 +19583,7 @@ var DEFAULT_MESSAGE_TIMEOUTS = {
|
|
|
19254
19583
|
// budget so the worker's snapshot fallback stays reachable before this
|
|
19255
19584
|
// page deadline fires — lowering it below the budget would time the page
|
|
19256
19585
|
// out while the worker is still seconds from answering from cache.
|
|
19257
|
-
GET_ARKADE_INFO:
|
|
19586
|
+
GET_ARKADE_INFO: chunkVVFCCNU2_cjs.INFO_FETCH_TIMEOUT_MS + 8e3,
|
|
19258
19587
|
INDEXER_GET_VTXOS: 2e4,
|
|
19259
19588
|
INDEXER_GET_VIRTUAL_TXS: 2e4,
|
|
19260
19589
|
GET_VTXOS: 2e4,
|
|
@@ -19263,6 +19592,7 @@ var DEFAULT_MESSAGE_TIMEOUTS = {
|
|
|
19263
19592
|
GET_TRANSACTION_HISTORY: 2e4,
|
|
19264
19593
|
GET_CONTRACTS: 2e4,
|
|
19265
19594
|
GET_CONTRACTS_WITH_VTXOS: 2e4,
|
|
19595
|
+
GET_STORED_CONTRACTS_WITH_VTXOS: 2e4,
|
|
19266
19596
|
GET_WATCHED_SCRIPTS: 1e4,
|
|
19267
19597
|
ANNOTATE_VTXOS: 2e4,
|
|
19268
19598
|
GET_SPENDABLE_PATHS: 2e4,
|
|
@@ -19332,6 +19662,7 @@ var DEDUPABLE_REQUEST_TYPES = /* @__PURE__ */ new Set([
|
|
|
19332
19662
|
"GET_SPENDABLE_VTXOS",
|
|
19333
19663
|
"GET_CONTRACTS",
|
|
19334
19664
|
"GET_CONTRACTS_WITH_VTXOS",
|
|
19665
|
+
"GET_STORED_CONTRACTS_WITH_VTXOS",
|
|
19335
19666
|
"GET_WATCHED_SCRIPTS",
|
|
19336
19667
|
"ANNOTATE_VTXOS",
|
|
19337
19668
|
"GET_SPENDABLE_PATHS",
|
|
@@ -19395,7 +19726,7 @@ var ServiceWorkerAssetManager = class extends ServiceWorkerReadonlyAssetManager
|
|
|
19395
19726
|
}
|
|
19396
19727
|
};
|
|
19397
19728
|
var initializeMessageBus = (serviceWorker, config, timeoutMs = 2e3) => {
|
|
19398
|
-
|
|
19729
|
+
chunkVVFCCNU2_cjs.assertTimerMs("messageBusTimeoutMs", timeoutMs);
|
|
19399
19730
|
const initCmd = {
|
|
19400
19731
|
tag: "INITIALIZE_MESSAGE_BUS",
|
|
19401
19732
|
id: getRandomId(),
|
|
@@ -19483,7 +19814,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19483
19814
|
}
|
|
19484
19815
|
/** Shared tail of both `create()` factories: boot the bus, INIT_WALLET, cache for reinit. */
|
|
19485
19816
|
static async bootstrap(wallet, options, serializedWallet, busConfig) {
|
|
19486
|
-
const arkServer = options.arkServer ?? { url:
|
|
19817
|
+
const arkServer = options.arkServer ?? { url: chunkVVFCCNU2_cjs.DEFAULT_ARKADE_SERVER_URL };
|
|
19487
19818
|
const initWalletPayload = {
|
|
19488
19819
|
lazyBoarding: options.lazyBoarding,
|
|
19489
19820
|
arkServerUrl: arkServer.url,
|
|
@@ -19493,7 +19824,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19493
19824
|
Object.entries(options.messageTimeouts ?? {}).filter(([, ms]) => ms !== void 0)
|
|
19494
19825
|
);
|
|
19495
19826
|
for (const [key, value] of Object.entries(overrides)) {
|
|
19496
|
-
|
|
19827
|
+
chunkVVFCCNU2_cjs.assertTimerMs(`messageTimeouts.${key}`, value);
|
|
19497
19828
|
}
|
|
19498
19829
|
const messageTimeouts = {
|
|
19499
19830
|
...DEFAULT_MESSAGE_TIMEOUTS,
|
|
@@ -19833,7 +20164,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19833
20164
|
try {
|
|
19834
20165
|
const response = await this.sendMessage(message);
|
|
19835
20166
|
const { vtxos, page } = response.payload;
|
|
19836
|
-
return { vtxos: vtxos.map(
|
|
20167
|
+
return { vtxos: vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo), page: page && { ...page } };
|
|
19837
20168
|
} catch (cause) {
|
|
19838
20169
|
throw new Error(`Failed to get vtxos: ${cause}`, { cause });
|
|
19839
20170
|
}
|
|
@@ -19937,7 +20268,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19937
20268
|
};
|
|
19938
20269
|
try {
|
|
19939
20270
|
const response = await this.sendMessage(message);
|
|
19940
|
-
return response.payload.vtxos.map(
|
|
20271
|
+
return response.payload.vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo);
|
|
19941
20272
|
} catch (error) {
|
|
19942
20273
|
throw new Error(`Failed to get vtxos: ${error}`);
|
|
19943
20274
|
}
|
|
@@ -19968,7 +20299,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
19968
20299
|
"Service worker does not support the requested contract scope or freshness check"
|
|
19969
20300
|
);
|
|
19970
20301
|
}
|
|
19971
|
-
return payload.vtxos.map(
|
|
20302
|
+
return payload.vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo);
|
|
19972
20303
|
} catch (error) {
|
|
19973
20304
|
throw new Error(`Failed to get spendable vtxos: ${error}`);
|
|
19974
20305
|
}
|
|
@@ -20075,6 +20406,23 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
20075
20406
|
});
|
|
20076
20407
|
}
|
|
20077
20408
|
},
|
|
20409
|
+
async getStoredContractsWithVtxos(filter) {
|
|
20410
|
+
const message = {
|
|
20411
|
+
type: "GET_STORED_CONTRACTS_WITH_VTXOS",
|
|
20412
|
+
id: getRandomId(),
|
|
20413
|
+
tag: messageTag,
|
|
20414
|
+
payload: { filter }
|
|
20415
|
+
};
|
|
20416
|
+
try {
|
|
20417
|
+
const response = await sendContractMessage(message);
|
|
20418
|
+
await refreshSyncState();
|
|
20419
|
+
return response.payload.contracts;
|
|
20420
|
+
} catch (cause) {
|
|
20421
|
+
throw new Error(`Failed to get stored contracts with vtxos: ${cause}`, {
|
|
20422
|
+
cause
|
|
20423
|
+
});
|
|
20424
|
+
}
|
|
20425
|
+
},
|
|
20078
20426
|
async watchScript(script, options) {
|
|
20079
20427
|
const message = {
|
|
20080
20428
|
type: "WATCH_SCRIPT",
|
|
@@ -20146,7 +20494,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
20146
20494
|
};
|
|
20147
20495
|
try {
|
|
20148
20496
|
const response = await sendContractMessage(message);
|
|
20149
|
-
return response.payload.vtxos.map(
|
|
20497
|
+
return response.payload.vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo);
|
|
20150
20498
|
} catch (cause) {
|
|
20151
20499
|
throw new Error(`Failed to annotate vtxos: ${cause}`, { cause });
|
|
20152
20500
|
}
|
|
@@ -20349,6 +20697,11 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
|
|
|
20349
20697
|
_assetManager;
|
|
20350
20698
|
hasDelegate;
|
|
20351
20699
|
_restoreInFlight;
|
|
20700
|
+
_concurrentSpending = false;
|
|
20701
|
+
/** @see WalletConfig.concurrentSpending */
|
|
20702
|
+
get concurrentSpending() {
|
|
20703
|
+
return this._concurrentSpending;
|
|
20704
|
+
}
|
|
20352
20705
|
get assetManager() {
|
|
20353
20706
|
return this._assetManager;
|
|
20354
20707
|
}
|
|
@@ -20376,9 +20729,11 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
|
|
|
20376
20729
|
messageTag,
|
|
20377
20730
|
!!options.delegateUrl
|
|
20378
20731
|
);
|
|
20732
|
+
wallet._concurrentSpending = options.concurrentSpending === true;
|
|
20379
20733
|
return _ServiceWorkerWallet.bootstrap(wallet, options, serializedWallet, {
|
|
20380
20734
|
delegateUrl: options.delegateUrl,
|
|
20381
20735
|
settlementConfig: options.settlementConfig,
|
|
20736
|
+
concurrentSpending: options.concurrentSpending,
|
|
20382
20737
|
walletMode: options.walletMode,
|
|
20383
20738
|
lazyInitialization: options.lazyInitialization,
|
|
20384
20739
|
watcherConfig: options.watcherConfig,
|
|
@@ -20572,6 +20927,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
|
|
|
20572
20927
|
});
|
|
20573
20928
|
return response.payload.txid;
|
|
20574
20929
|
} catch (error) {
|
|
20930
|
+
if (error instanceof Error && error.name === "VtxoReservedError") throw error;
|
|
20575
20931
|
throw new Error(`Settlement failed: ${error}`);
|
|
20576
20932
|
}
|
|
20577
20933
|
}
|
|
@@ -20662,6 +21018,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
|
|
|
20662
21018
|
const response = await this.sendMessage(message);
|
|
20663
21019
|
return response.payload.txid;
|
|
20664
21020
|
} catch (error) {
|
|
21021
|
+
if (error instanceof Error && error.name === "VtxoReservedError") throw error;
|
|
20665
21022
|
if (error instanceof SendDeadlineExceededError) throw error;
|
|
20666
21023
|
throw new Error(`Send failed: ${error}`);
|
|
20667
21024
|
}
|
|
@@ -20765,7 +21122,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
|
|
|
20765
21122
|
};
|
|
20766
21123
|
try {
|
|
20767
21124
|
const response = await wallet.sendMessage(message);
|
|
20768
|
-
return response.payload.vtxos.map(
|
|
21125
|
+
return response.payload.vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo);
|
|
20769
21126
|
} catch (e) {
|
|
20770
21127
|
throw new Error(`Failed to get expiring vtxos: ${e}`);
|
|
20771
21128
|
}
|
|
@@ -20882,12 +21239,12 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
20882
21239
|
* @returns Configured onchain wallet
|
|
20883
21240
|
* @throws Error if the configured identity cannot produce a valid x-only public key
|
|
20884
21241
|
*/
|
|
20885
|
-
static async create(identity, networkName =
|
|
21242
|
+
static async create(identity, networkName = chunkVVFCCNU2_cjs.DEFAULT_NETWORK_NAME, provider) {
|
|
20886
21243
|
const pubkey = await identity.xOnlyPublicKey();
|
|
20887
21244
|
if (!pubkey) {
|
|
20888
21245
|
throw new Error("Invalid configured public key");
|
|
20889
21246
|
}
|
|
20890
|
-
const network =
|
|
21247
|
+
const network = chunkVVFCCNU2_cjs.getNetwork(networkName);
|
|
20891
21248
|
const onchainProvider = provider || new EsploraProvider(ESPLORA_URL[networkName]);
|
|
20892
21249
|
const onchainP2TR = btcSigner.p2tr(pubkey, void 0, network);
|
|
20893
21250
|
return new _OnchainWallet(identity, network, onchainP2TR, onchainProvider);
|
|
@@ -20987,7 +21344,7 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
20987
21344
|
feeRate,
|
|
20988
21345
|
params.address
|
|
20989
21346
|
);
|
|
20990
|
-
let tx = new
|
|
21347
|
+
let tx = new chunkVVFCCNU2_cjs.Transaction();
|
|
20991
21348
|
for (const input of inputs) {
|
|
20992
21349
|
tx.addInput({
|
|
20993
21350
|
txid: input.txid,
|
|
@@ -21045,7 +21402,7 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
21045
21402
|
* @throws If the parent has no anchor, or funding cannot be selected/signed
|
|
21046
21403
|
*/
|
|
21047
21404
|
async bumpAnchor(parentHex, feeRate) {
|
|
21048
|
-
const parent =
|
|
21405
|
+
const parent = chunkVVFCCNU2_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
|
|
21049
21406
|
const coins = (await this.getCoins()).filter((c) => c.status.confirmed);
|
|
21050
21407
|
const child = await this.buildBumpPackage(parent, feeRate, coins);
|
|
21051
21408
|
return [parent.hex, child.hex];
|
|
@@ -21861,7 +22218,7 @@ var CachingArkProvider = class {
|
|
|
21861
22218
|
constructor(inner, ttlMs = DEFAULT_TTL_MS) {
|
|
21862
22219
|
this.inner = inner;
|
|
21863
22220
|
this.ttlMs = ttlMs;
|
|
21864
|
-
|
|
22221
|
+
chunkVVFCCNU2_cjs.assertNonNegativeMs("ttlMs", ttlMs);
|
|
21865
22222
|
this.unsubscribe = inner.onServerInfoChanged?.((info) => {
|
|
21866
22223
|
this.cached = info;
|
|
21867
22224
|
this.expiresAt = Date.now() + this.ttlMs;
|
|
@@ -21953,7 +22310,7 @@ async function resolvePrevTxs(txids, source, onchain) {
|
|
|
21953
22310
|
try {
|
|
21954
22311
|
const { txs } = await source.getVirtualTxs(wanted);
|
|
21955
22312
|
for (const psbt of txs) {
|
|
21956
|
-
const tx =
|
|
22313
|
+
const tx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(psbt));
|
|
21957
22314
|
resolved.set(tx.id, tx.toBytes());
|
|
21958
22315
|
}
|
|
21959
22316
|
} catch (err) {
|
|
@@ -21986,7 +22343,7 @@ async function resolvePrevTxs(txids, source, onchain) {
|
|
|
21986
22343
|
async function attachPrevArkTxs(tx, txids, source, onchain) {
|
|
21987
22344
|
const pending = [];
|
|
21988
22345
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
21989
|
-
if (
|
|
22346
|
+
if (chunkVVFCCNU2_cjs.getArkPsbtFields(tx, i, chunkVVFCCNU2_cjs.PrevArkTxField).length === 0) pending.push(i);
|
|
21990
22347
|
}
|
|
21991
22348
|
if (pending.length === 0) return;
|
|
21992
22349
|
const resolved = await resolvePrevTxs(
|
|
@@ -21995,13 +22352,13 @@ async function attachPrevArkTxs(tx, txids, source, onchain) {
|
|
|
21995
22352
|
onchain
|
|
21996
22353
|
);
|
|
21997
22354
|
for (const i of pending) {
|
|
21998
|
-
|
|
22355
|
+
chunkVVFCCNU2_cjs.setArkPsbtField(tx, i, chunkVVFCCNU2_cjs.PrevArkTxField, resolved.get(txidAt(txids, i)));
|
|
21999
22356
|
}
|
|
22000
22357
|
}
|
|
22001
22358
|
async function attachPrevoutTxs(tx, source) {
|
|
22002
22359
|
const pending = [];
|
|
22003
22360
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
22004
|
-
if (
|
|
22361
|
+
if (chunkVVFCCNU2_cjs.getArkPsbtFields(tx, i, chunkVVFCCNU2_cjs.PrevoutTxField).length > 0) continue;
|
|
22005
22362
|
const input = tx.getInput(i);
|
|
22006
22363
|
if (!input?.txid) throw new PrevTxUnavailableError(`input ${i} has no outpoint`);
|
|
22007
22364
|
pending.push({ index: i, txid: base.hex.encode(input.txid) });
|
|
@@ -22012,7 +22369,7 @@ async function attachPrevoutTxs(tx, source) {
|
|
|
22012
22369
|
resolved.set(txid, await source.getRawTransaction(txid));
|
|
22013
22370
|
}
|
|
22014
22371
|
for (const { index, txid } of pending) {
|
|
22015
|
-
|
|
22372
|
+
chunkVVFCCNU2_cjs.setArkPsbtField(tx, index, chunkVVFCCNU2_cjs.PrevoutTxField, resolved.get(txid));
|
|
22016
22373
|
}
|
|
22017
22374
|
}
|
|
22018
22375
|
async function withPrevTxs(coins, source, onchain) {
|
|
@@ -22038,7 +22395,7 @@ exports.BIP322 = void 0;
|
|
|
22038
22395
|
async function sign2(message, identity, network) {
|
|
22039
22396
|
const xOnlyPubKey = await identity.xOnlyPublicKey();
|
|
22040
22397
|
const payment = btcSigner.p2tr(xOnlyPubKey, void 0, network);
|
|
22041
|
-
const toSpend =
|
|
22398
|
+
const toSpend = chunkVVFCCNU2_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
|
|
22042
22399
|
const toSign = craftBIP322ToSignP2TR(toSpend, payment.script, xOnlyPubKey);
|
|
22043
22400
|
const signed = await identity.sign(toSign, [0]);
|
|
22044
22401
|
signed.finalizeIdx(0);
|
|
@@ -22096,7 +22453,7 @@ function verifyP2TR(message, witnessItems, pkScript, pubkey) {
|
|
|
22096
22453
|
if (sighashType !== btcSigner.SigHash.DEFAULT && sighashType !== btcSigner.SigHash.ALL) {
|
|
22097
22454
|
return false;
|
|
22098
22455
|
}
|
|
22099
|
-
const toSpend =
|
|
22456
|
+
const toSpend = chunkVVFCCNU2_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
|
|
22100
22457
|
const toSign = craftBIP322ToSignP2TR(toSpend, pkScript);
|
|
22101
22458
|
const sighash = toSign.preimageWitnessV1(0, [pkScript], sighashType, [0n]);
|
|
22102
22459
|
const rawSig = sig.length === 65 ? sig.subarray(0, 64) : sig;
|
|
@@ -22117,7 +22474,7 @@ function verifyP2WPKH(message, witnessItems, pkScript, addressHash) {
|
|
|
22117
22474
|
}
|
|
22118
22475
|
const sighashType = sigWithHash[sigWithHash.length - 1];
|
|
22119
22476
|
const derSig = sigWithHash.subarray(0, sigWithHash.length - 1);
|
|
22120
|
-
const toSpend =
|
|
22477
|
+
const toSpend = chunkVVFCCNU2_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
|
|
22121
22478
|
const toSign = craftBIP322ToSignSimple(toSpend, pkScript);
|
|
22122
22479
|
const scriptCode = btcSigner.OutScript.encode({ type: "pkh", hash: addressHash });
|
|
22123
22480
|
const sighash = toSign.preimageWitnessV0(0, scriptCode, sighashType, 0n);
|
|
@@ -22170,7 +22527,7 @@ function encodeCompactSize(n) {
|
|
|
22170
22527
|
return buf;
|
|
22171
22528
|
}
|
|
22172
22529
|
function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
|
|
22173
|
-
const tx = new
|
|
22530
|
+
const tx = new chunkVVFCCNU2_cjs.Transaction({ version: 0 });
|
|
22174
22531
|
tx.addInput({
|
|
22175
22532
|
txid: toSpend.id,
|
|
22176
22533
|
index: 0,
|
|
@@ -22184,12 +22541,12 @@ function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
|
|
|
22184
22541
|
});
|
|
22185
22542
|
tx.addOutput({
|
|
22186
22543
|
amount: 0n,
|
|
22187
|
-
script:
|
|
22544
|
+
script: chunkVVFCCNU2_cjs.OP_RETURN_EMPTY_PKSCRIPT
|
|
22188
22545
|
});
|
|
22189
22546
|
return tx;
|
|
22190
22547
|
}
|
|
22191
22548
|
function craftBIP322ToSignSimple(toSpend, pkScript) {
|
|
22192
|
-
const tx = new
|
|
22549
|
+
const tx = new chunkVVFCCNU2_cjs.Transaction({ version: 0 });
|
|
22193
22550
|
tx.addInput({
|
|
22194
22551
|
txid: toSpend.id,
|
|
22195
22552
|
index: 0,
|
|
@@ -22201,7 +22558,7 @@ function craftBIP322ToSignSimple(toSpend, pkScript) {
|
|
|
22201
22558
|
});
|
|
22202
22559
|
tx.addOutput({
|
|
22203
22560
|
amount: 0n,
|
|
22204
|
-
script:
|
|
22561
|
+
script: chunkVVFCCNU2_cjs.OP_RETURN_EMPTY_PKSCRIPT
|
|
22205
22562
|
});
|
|
22206
22563
|
return tx;
|
|
22207
22564
|
}
|
|
@@ -22214,7 +22571,7 @@ var RestEmulatorProvider = class {
|
|
|
22214
22571
|
serverUrl;
|
|
22215
22572
|
async getInfo() {
|
|
22216
22573
|
const url = `${this.serverUrl}/v1/info`;
|
|
22217
|
-
const response = await
|
|
22574
|
+
const response = await chunkVVFCCNU2_cjs.baseFetch(url);
|
|
22218
22575
|
if (!response.ok) {
|
|
22219
22576
|
const errorText2 = await response.text();
|
|
22220
22577
|
throw new Error(`Failed to get emulator info: ${errorText2}`);
|
|
@@ -22332,7 +22689,7 @@ var RestEmulatorProvider = class {
|
|
|
22332
22689
|
}
|
|
22333
22690
|
};
|
|
22334
22691
|
function finalizeVirtualTx(type, psbtBase64) {
|
|
22335
|
-
const tx =
|
|
22692
|
+
const tx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
|
|
22336
22693
|
if (type === "INDEXER_CHAINED_TX_TYPE_TREE" /* TREE */) {
|
|
22337
22694
|
const input = tx.getInput(0);
|
|
22338
22695
|
if (!input) {
|
|
@@ -22359,14 +22716,14 @@ var ExitPathError = class extends Error {
|
|
|
22359
22716
|
reason;
|
|
22360
22717
|
};
|
|
22361
22718
|
function delayWeight(sequence) {
|
|
22362
|
-
const t =
|
|
22719
|
+
const t = chunkVVFCCNU2_cjs.sequenceToTimelock(sequence);
|
|
22363
22720
|
return t.type === "blocks" ? Number(t.value) : Number(t.value) / 600;
|
|
22364
22721
|
}
|
|
22365
22722
|
async function resolveUnilateralPath(params) {
|
|
22366
22723
|
const { vtxo, scriptHex, contractRepository } = params;
|
|
22367
22724
|
const contract = contractRepository ? (await collectContracts(contractRepository, { script: scriptHex }))[0] : void 0;
|
|
22368
22725
|
if (contract) {
|
|
22369
|
-
const handler =
|
|
22726
|
+
const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
|
|
22370
22727
|
if (!handler) {
|
|
22371
22728
|
throw new ExitPathError(
|
|
22372
22729
|
"no-handler",
|
|
@@ -22388,12 +22745,12 @@ async function resolveUnilateralPath(params) {
|
|
|
22388
22745
|
paths.sort((a, b) => delayWeight(a.sequence) - delayWeight(b.sequence));
|
|
22389
22746
|
return { selection: paths[0], label: `${contract.type}:unilateral` };
|
|
22390
22747
|
}
|
|
22391
|
-
const decoded =
|
|
22748
|
+
const decoded = chunkVVFCCNU2_cjs.VtxoScript.decode(vtxo.tapTree);
|
|
22392
22749
|
let best;
|
|
22393
22750
|
for (const exit of decoded.exitPaths()) {
|
|
22394
22751
|
const leaf = decoded.findLeaf(base.hex.encode(exit.script));
|
|
22395
22752
|
if (!leaf) continue;
|
|
22396
|
-
const sequence =
|
|
22753
|
+
const sequence = chunkVVFCCNU2_cjs.timelockToSequence(exit.params.timelock);
|
|
22397
22754
|
const weight = delayWeight(sequence);
|
|
22398
22755
|
if (!best || weight < best.weight) {
|
|
22399
22756
|
best = { selection: { leaf, sequence }, weight };
|
|
@@ -22600,7 +22957,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
22600
22957
|
const txWeightEstimator = TxWeightEstimator.create();
|
|
22601
22958
|
const walletDescriptor = base.hex.encode(await wallet.identity.xOnlyPublicKey());
|
|
22602
22959
|
for (const vtxo of vtxos) {
|
|
22603
|
-
if (!
|
|
22960
|
+
if (!chunkVVFCCNU2_cjs.canSweepOnchain(vtxo)) {
|
|
22604
22961
|
throw new Error(
|
|
22605
22962
|
`Vtxo ${vtxo.txid}:${vtxo.vout} cannot be swept onchain: it is not fully unrolled (use unroll first), or its exit output was already spent`
|
|
22606
22963
|
);
|
|
@@ -22611,14 +22968,14 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
22611
22968
|
}
|
|
22612
22969
|
const resolved = await resolveUnilateralPath({
|
|
22613
22970
|
vtxo,
|
|
22614
|
-
scriptHex: base.hex.encode(
|
|
22971
|
+
scriptHex: base.hex.encode(chunkVVFCCNU2_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
|
|
22615
22972
|
contractRepository: wallet.contractRepository,
|
|
22616
22973
|
walletDescriptor,
|
|
22617
22974
|
currentTime: Date.now()
|
|
22618
22975
|
});
|
|
22619
22976
|
const spendingLeaf = resolved.selection.leaf;
|
|
22620
22977
|
const sequence = resolved.selection.sequence;
|
|
22621
|
-
const timelock =
|
|
22978
|
+
const timelock = chunkVVFCCNU2_cjs.sequenceToTimelock(sequence);
|
|
22622
22979
|
const elapsed = timelock.type === "blocks" ? chainTip.height >= txStatus.blockHeight + Number(timelock.value) : chainTip.time >= txStatus.blockTime + Number(timelock.value);
|
|
22623
22980
|
if (!elapsed) {
|
|
22624
22981
|
throw new Error(`no available exit path found for vtxo ${vtxo.txid}:${vtxo.vout}`);
|
|
@@ -22631,7 +22988,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
22631
22988
|
sequence,
|
|
22632
22989
|
witnessUtxo: {
|
|
22633
22990
|
amount: BigInt(vtxo.value),
|
|
22634
|
-
script:
|
|
22991
|
+
script: chunkVVFCCNU2_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
|
|
22635
22992
|
},
|
|
22636
22993
|
sighashType: btcSigner.SigHash.DEFAULT
|
|
22637
22994
|
});
|
|
@@ -22641,7 +22998,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
22641
22998
|
btcSigner.TaprootControlBlock.encode(spendingLeaf[0]).length
|
|
22642
22999
|
);
|
|
22643
23000
|
}
|
|
22644
|
-
const tx = new
|
|
23001
|
+
const tx = new chunkVVFCCNU2_cjs.Transaction({ version: 2 });
|
|
22645
23002
|
for (const input of inputs) {
|
|
22646
23003
|
tx.addInput(input);
|
|
22647
23004
|
}
|
|
@@ -22724,7 +23081,7 @@ async function buildSignedSweep(params) {
|
|
|
22724
23081
|
`uneconomic vtxo ${vtxo.txid}:${vtxo.vout}: value ${vtxo.value} - fee ${fee} < dust`
|
|
22725
23082
|
);
|
|
22726
23083
|
}
|
|
22727
|
-
const tx = new
|
|
23084
|
+
const tx = new chunkVVFCCNU2_cjs.Transaction({ version: 2 });
|
|
22728
23085
|
tx.addInput({
|
|
22729
23086
|
txid: vtxo.txid,
|
|
22730
23087
|
index: vtxo.vout,
|
|
@@ -22749,7 +23106,7 @@ async function buildSignedSweep(params) {
|
|
|
22749
23106
|
finalScriptWitness: [
|
|
22750
23107
|
tapScriptSig[0][1],
|
|
22751
23108
|
...path.extraWitness,
|
|
22752
|
-
|
|
23109
|
+
chunkVVFCCNU2_cjs.scriptFromTapLeafScript(path.leaf),
|
|
22753
23110
|
btcSigner.TaprootControlBlock.encode(controlBlock)
|
|
22754
23111
|
]
|
|
22755
23112
|
});
|
|
@@ -22779,7 +23136,7 @@ async function resolveFeeRate(opts) {
|
|
|
22779
23136
|
}
|
|
22780
23137
|
async function selectExitVtxos(opts) {
|
|
22781
23138
|
if (!opts.vtxos) return opts.wallet.getVtxos();
|
|
22782
|
-
const res = await
|
|
23139
|
+
const res = await chunkVVFCCNU2_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
|
|
22783
23140
|
const tapTrees = /* @__PURE__ */ new Map();
|
|
22784
23141
|
const out = [];
|
|
22785
23142
|
for (const vtxo of res.vtxos) {
|
|
@@ -22794,7 +23151,7 @@ async function selectExitVtxos(opts) {
|
|
|
22794
23151
|
`no contract registered for vtxo script ${vtxo.script} \u2014 register the contract before exiting`
|
|
22795
23152
|
);
|
|
22796
23153
|
}
|
|
22797
|
-
const handler =
|
|
23154
|
+
const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
|
|
22798
23155
|
if (!handler) {
|
|
22799
23156
|
throw new Error(`no contract handler registered for type '${contract.type}'`);
|
|
22800
23157
|
}
|
|
@@ -22824,7 +23181,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
22824
23181
|
if (pendingNodes.length > 0) {
|
|
22825
23182
|
const txs = await resolver.getVirtualTxs(pendingNodes.map((n) => n.txid));
|
|
22826
23183
|
for (const psbt of txs) {
|
|
22827
|
-
psbts.set(
|
|
23184
|
+
psbts.set(chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
22828
23185
|
}
|
|
22829
23186
|
}
|
|
22830
23187
|
const childVsize = Number(
|
|
@@ -22852,7 +23209,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
22852
23209
|
try {
|
|
22853
23210
|
const resolved = await resolveUnilateralPath({
|
|
22854
23211
|
vtxo,
|
|
22855
|
-
scriptHex: base.hex.encode(
|
|
23212
|
+
scriptHex: base.hex.encode(chunkVVFCCNU2_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
|
|
22856
23213
|
contractRepository: wallet.contractRepository,
|
|
22857
23214
|
walletDescriptor,
|
|
22858
23215
|
currentTime: Date.now()
|
|
@@ -22871,7 +23228,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
22871
23228
|
});
|
|
22872
23229
|
continue;
|
|
22873
23230
|
}
|
|
22874
|
-
const t =
|
|
23231
|
+
const t = chunkVVFCCNU2_cjs.sequenceToTimelock(resolved.selection.sequence);
|
|
22875
23232
|
const delay = { type: t.type, value: Number(t.value) };
|
|
22876
23233
|
infos.push({ outpoint, value: vtxo.value, sweepFee, path: resolved.label, delay });
|
|
22877
23234
|
sweeps.push({ vtxo, resolved, sweepFee, delay });
|
|
@@ -22978,7 +23335,7 @@ var Executor = class {
|
|
|
22978
23335
|
constructor(pkg, provider, opts) {
|
|
22979
23336
|
this.pkg = pkg;
|
|
22980
23337
|
this.provider = provider;
|
|
22981
|
-
|
|
23338
|
+
chunkVVFCCNU2_cjs.assertTimerMs("pollIntervalMs", opts?.pollIntervalMs);
|
|
22982
23339
|
this.pollIntervalMs = opts?.pollIntervalMs ?? 5e3;
|
|
22983
23340
|
this.feeWallet = opts?.feeWallet;
|
|
22984
23341
|
this.signal = opts?.signal;
|
|
@@ -23273,7 +23630,7 @@ async function prepare(opts) {
|
|
|
23273
23630
|
txid: sweep.vtxo.txid,
|
|
23274
23631
|
vout: sweep.vtxo.vout,
|
|
23275
23632
|
value: sweep.vtxo.value,
|
|
23276
|
-
pkScript:
|
|
23633
|
+
pkScript: chunkVVFCCNU2_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
|
|
23277
23634
|
},
|
|
23278
23635
|
path: sweep.resolved.selection,
|
|
23279
23636
|
outputAddress: opts.sweepAddress,
|
|
@@ -23362,7 +23719,7 @@ async function prepare(opts) {
|
|
|
23362
23719
|
if (newFee <= splitterFee) break;
|
|
23363
23720
|
splitterFee = newFee;
|
|
23364
23721
|
}
|
|
23365
|
-
const splitter = new
|
|
23722
|
+
const splitter = new chunkVVFCCNU2_cjs.Transaction({ version: 2 });
|
|
23366
23723
|
for (const coin of selected.inputs) {
|
|
23367
23724
|
splitter.addInput({
|
|
23368
23725
|
txid: coin.txid,
|
|
@@ -23501,44 +23858,44 @@ var UnilateralExit = {
|
|
|
23501
23858
|
|
|
23502
23859
|
// src/arkade/index.ts
|
|
23503
23860
|
var arkade_exports = {};
|
|
23504
|
-
|
|
23505
|
-
ARKADE_OP: () =>
|
|
23506
|
-
ARKADE_OPCODES: () =>
|
|
23507
|
-
ARKADE_OPCODE_NAMES: () =>
|
|
23508
|
-
ARKADE_OPCODE_VALUES: () =>
|
|
23509
|
-
ARKADE_OPS: () =>
|
|
23861
|
+
chunkVVFCCNU2_cjs.__export(arkade_exports, {
|
|
23862
|
+
ARKADE_OP: () => chunkCFOIHLON_cjs.ARKADE_OP,
|
|
23863
|
+
ARKADE_OPCODES: () => chunkCFOIHLON_cjs.ARKADE_OPCODES,
|
|
23864
|
+
ARKADE_OPCODE_NAMES: () => chunkCFOIHLON_cjs.ARKADE_OPCODE_NAMES,
|
|
23865
|
+
ARKADE_OPCODE_VALUES: () => chunkCFOIHLON_cjs.ARKADE_OPCODE_VALUES,
|
|
23866
|
+
ARKADE_OPS: () => chunkCFOIHLON_cjs.ARKADE_OPS,
|
|
23510
23867
|
Arkade: () => Arkade,
|
|
23511
23868
|
ArkadeContract: () => ArkadeContract,
|
|
23512
|
-
ArkadeProgramScript: () =>
|
|
23513
|
-
ArkadeScript: () =>
|
|
23869
|
+
ArkadeProgramScript: () => chunkCFOIHLON_cjs.ArkadeProgramScript,
|
|
23870
|
+
ArkadeScript: () => chunkCFOIHLON_cjs.ArkadeScript,
|
|
23514
23871
|
ArkadeTransactionBuilder: () => ArkadeTransactionBuilder,
|
|
23515
|
-
BigNum: () =>
|
|
23872
|
+
BigNum: () => chunkCFOIHLON_cjs.bignum_exports,
|
|
23516
23873
|
OP: () => btcSigner.OP,
|
|
23517
|
-
OPCODE_NAMES: () =>
|
|
23518
|
-
OPCODE_VALUES: () =>
|
|
23519
|
-
SUPPORTED_PROGRAM_VERSION: () =>
|
|
23874
|
+
OPCODE_NAMES: () => chunkCFOIHLON_cjs.OPCODE_NAMES,
|
|
23875
|
+
OPCODE_VALUES: () => chunkCFOIHLON_cjs.OPCODE_VALUES,
|
|
23876
|
+
SUPPORTED_PROGRAM_VERSION: () => chunkCFOIHLON_cjs.SUPPORTED_PROGRAM_VERSION,
|
|
23520
23877
|
Script: () => btcSigner.Script,
|
|
23521
|
-
arkadeScriptHash: () =>
|
|
23522
|
-
arkadeWitnessHash: () =>
|
|
23523
|
-
asmToBytes: () =>
|
|
23524
|
-
bytesToASM: () =>
|
|
23525
|
-
computeArkadeScriptPublicKey: () =>
|
|
23878
|
+
arkadeScriptHash: () => chunkCFOIHLON_cjs.arkadeScriptHash,
|
|
23879
|
+
arkadeWitnessHash: () => chunkCFOIHLON_cjs.arkadeWitnessHash,
|
|
23880
|
+
asmToBytes: () => chunkCFOIHLON_cjs.asmToBytes,
|
|
23881
|
+
bytesToASM: () => chunkCFOIHLON_cjs.bytesToASM,
|
|
23882
|
+
computeArkadeScriptPublicKey: () => chunkCFOIHLON_cjs.computeArkadeScriptPublicKey,
|
|
23526
23883
|
createArkadeBatchHandler: () => createArkadeBatchHandler,
|
|
23527
|
-
deserializeArkadeContractParams: () =>
|
|
23528
|
-
fromASM: () =>
|
|
23529
|
-
getOpcodeName: () =>
|
|
23530
|
-
getOpcodeValue: () =>
|
|
23884
|
+
deserializeArkadeContractParams: () => chunkCFOIHLON_cjs.deserializeArkadeContractParams,
|
|
23885
|
+
fromASM: () => chunkCFOIHLON_cjs.fromASM,
|
|
23886
|
+
getOpcodeName: () => chunkCFOIHLON_cjs.getOpcodeName,
|
|
23887
|
+
getOpcodeValue: () => chunkCFOIHLON_cjs.getOpcodeValue,
|
|
23531
23888
|
isContractArtifact: () => isContractArtifact,
|
|
23532
|
-
parseArtifact: () =>
|
|
23889
|
+
parseArtifact: () => chunkCFOIHLON_cjs.parseArtifact,
|
|
23533
23890
|
programFromArtifact: () => programFromArtifact,
|
|
23534
|
-
resolveAsm: () =>
|
|
23535
|
-
serializeArkadeContractParams: () =>
|
|
23536
|
-
stringifyArtifact: () =>
|
|
23537
|
-
toASM: () =>
|
|
23538
|
-
validateProgram: () =>
|
|
23539
|
-
witnessRefToBytes: () =>
|
|
23891
|
+
resolveAsm: () => chunkCFOIHLON_cjs.resolveAsm,
|
|
23892
|
+
serializeArkadeContractParams: () => chunkCFOIHLON_cjs.serializeArkadeContractParams,
|
|
23893
|
+
stringifyArtifact: () => chunkCFOIHLON_cjs.stringifyArtifact,
|
|
23894
|
+
toASM: () => chunkCFOIHLON_cjs.toASM,
|
|
23895
|
+
validateProgram: () => chunkCFOIHLON_cjs.validateProgram,
|
|
23896
|
+
witnessRefToBytes: () => chunkCFOIHLON_cjs.witnessRefToBytes
|
|
23540
23897
|
});
|
|
23541
|
-
var isVtxoCoin = (input) =>
|
|
23898
|
+
var isVtxoCoin = (input) => chunkVVFCCNU2_cjs.isVirtualCoin(input);
|
|
23542
23899
|
function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message, session, arkProvider, emulator, network, recipients, batchExpiryPolicy) {
|
|
23543
23900
|
let batchId;
|
|
23544
23901
|
let sweepTapTreeRoot;
|
|
@@ -23559,23 +23916,23 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
23559
23916
|
);
|
|
23560
23917
|
await arkProvider.confirmRegistration(intentId);
|
|
23561
23918
|
batchId = event.id;
|
|
23562
|
-
const sweepTapscript =
|
|
23919
|
+
const sweepTapscript = chunkVVFCCNU2_cjs.CSVMultisigTapscript.encode({
|
|
23563
23920
|
timelock,
|
|
23564
|
-
pubkeys: [
|
|
23921
|
+
pubkeys: [chunkCFOIHLON_cjs.toXOnly(base.hex.decode(info.forfeitPubkey), "forfeit key")]
|
|
23565
23922
|
}).script;
|
|
23566
23923
|
sweepTapTreeRoot = payment_js.tapLeafHash(sweepTapscript);
|
|
23567
23924
|
return { skip: false };
|
|
23568
23925
|
},
|
|
23569
23926
|
onTreeSigningStarted: async (event, vtxoTree) => {
|
|
23570
23927
|
const signerPubKey = await session.getPublicKey();
|
|
23571
|
-
const xonlySignerPubKey =
|
|
23928
|
+
const xonlySignerPubKey = chunkCFOIHLON_cjs.toXOnly(signerPubKey, "signer key");
|
|
23572
23929
|
const xOnlyPubkeys = event.cosignersPublicKeys.map(
|
|
23573
|
-
(k) => base.hex.encode(
|
|
23930
|
+
(k) => base.hex.encode(chunkCFOIHLON_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
|
|
23574
23931
|
);
|
|
23575
23932
|
if (!xOnlyPubkeys.includes(base.hex.encode(xonlySignerPubKey))) {
|
|
23576
23933
|
return { skip: true };
|
|
23577
23934
|
}
|
|
23578
|
-
const commitmentTx =
|
|
23935
|
+
const commitmentTx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
|
|
23579
23936
|
validateVtxoTxGraph(vtxoTree, commitmentTx, sweepTapTreeRoot);
|
|
23580
23937
|
if (recipients && recipients.length > 0) {
|
|
23581
23938
|
validateBatchRecipients(commitmentTx, vtxoTree.leaves(), recipients, network);
|
|
@@ -23613,7 +23970,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
23613
23970
|
if (connectorTree) {
|
|
23614
23971
|
validateConnectorsTxGraph(event.commitmentTx, connectorTree);
|
|
23615
23972
|
}
|
|
23616
|
-
let commitmentPsbt =
|
|
23973
|
+
let commitmentPsbt = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
|
|
23617
23974
|
assertFinalCommitmentMatchesValidated(
|
|
23618
23975
|
commitmentPsbt,
|
|
23619
23976
|
validatedCommitmentTxid,
|
|
@@ -23655,7 +24012,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
23655
24012
|
boardingIndices.push(boardingIdx);
|
|
23656
24013
|
continue;
|
|
23657
24014
|
}
|
|
23658
|
-
if (!
|
|
24015
|
+
if (!chunkVVFCCNU2_cjs.requiresForfeit(input) || isSubdust(input, info.dust)) {
|
|
23659
24016
|
continue;
|
|
23660
24017
|
}
|
|
23661
24018
|
if (connectorIndex >= connectorLeaves.length) {
|
|
@@ -23676,7 +24033,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
23676
24033
|
index: input.vout,
|
|
23677
24034
|
witnessUtxo: {
|
|
23678
24035
|
amount: BigInt(input.value),
|
|
23679
|
-
script:
|
|
24036
|
+
script: chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
23680
24037
|
},
|
|
23681
24038
|
sighashType: btcSigner.SigHash.DEFAULT,
|
|
23682
24039
|
tapLeafScript: [input.forfeitTapLeafScript]
|
|
@@ -23821,7 +24178,7 @@ function flatten(param, structs, stack = []) {
|
|
|
23821
24178
|
function opcodeToken(token) {
|
|
23822
24179
|
const base = token.slice(3);
|
|
23823
24180
|
const name = base === "0" || /^([1-9]|1[0-6])$/.test(base) ? token : base;
|
|
23824
|
-
if (!Object.hasOwn(
|
|
24181
|
+
if (!Object.hasOwn(chunkCFOIHLON_cjs.ARKADE_OPS, name)) {
|
|
23825
24182
|
fail(`opcode '${token}' is not in this SDK's table`);
|
|
23826
24183
|
}
|
|
23827
24184
|
return name;
|
|
@@ -23868,7 +24225,7 @@ function providedWitness(witness) {
|
|
|
23868
24225
|
}
|
|
23869
24226
|
function csvTimelock(leafName, operand) {
|
|
23870
24227
|
if (typeof operand === "string") return { type: "sequence", value: operand };
|
|
23871
|
-
const timelock =
|
|
24228
|
+
const timelock = chunkVVFCCNU2_cjs.sequenceToCanonicalTimelock(operand);
|
|
23872
24229
|
if (!timelock) {
|
|
23873
24230
|
fail(`leaf '${leafName}': CSV literal ${operand} is not a canonical BIP68 sequence`);
|
|
23874
24231
|
}
|
|
@@ -23987,7 +24344,7 @@ function programFromArtifact(artifact) {
|
|
|
23987
24344
|
const paramNames = /* @__PURE__ */ new Set();
|
|
23988
24345
|
for (const param of params) claim(paramNames, param.name, "program parameter");
|
|
23989
24346
|
return {
|
|
23990
|
-
version:
|
|
24347
|
+
version: chunkCFOIHLON_cjs.SUPPORTED_PROGRAM_VERSION,
|
|
23991
24348
|
name: artifact.contractName,
|
|
23992
24349
|
params,
|
|
23993
24350
|
functions
|
|
@@ -24028,16 +24385,16 @@ var Arkade = class _Arkade {
|
|
|
24028
24385
|
/** Connect and resolve the server key, checkpoint closure and (if present) the co-signer key. */
|
|
24029
24386
|
static async connect(opts) {
|
|
24030
24387
|
const info = await opts.arkade.getInfo();
|
|
24031
|
-
const serverKey =
|
|
24032
|
-
const checkpoint =
|
|
24033
|
-
const network = opts.network ?? (Object.hasOwn(
|
|
24388
|
+
const serverKey = chunkCFOIHLON_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
|
|
24389
|
+
const checkpoint = chunkVVFCCNU2_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
|
|
24390
|
+
const network = opts.network ?? (Object.hasOwn(chunkVVFCCNU2_cjs.networks, info.network) ? chunkVVFCCNU2_cjs.getNetwork(info.network) : chunkVVFCCNU2_cjs.DEFAULT_NETWORK);
|
|
24034
24391
|
let emulatorKey;
|
|
24035
24392
|
if (opts.emulator) {
|
|
24036
|
-
emulatorKey = base.hex.decode(
|
|
24393
|
+
emulatorKey = base.hex.decode(chunkVVFCCNU2_cjs.resolveEmulatorPubkey(network, opts.emulatorPubkey));
|
|
24037
24394
|
}
|
|
24038
24395
|
let userKey;
|
|
24039
24396
|
if (opts.identity) {
|
|
24040
|
-
userKey =
|
|
24397
|
+
userKey = chunkCFOIHLON_cjs.toXOnly(await opts.identity.xOnlyPublicKey(), "identity key");
|
|
24041
24398
|
}
|
|
24042
24399
|
return new _Arkade({
|
|
24043
24400
|
arkProvider: opts.arkade,
|
|
@@ -24060,7 +24417,7 @@ var Arkade = class _Arkade {
|
|
|
24060
24417
|
* explicit args win.
|
|
24061
24418
|
*/
|
|
24062
24419
|
contract(program, args = {}) {
|
|
24063
|
-
const declared = (program.params ?? []).map(
|
|
24420
|
+
const declared = (program.params ?? []).map(chunkCFOIHLON_cjs.inputName);
|
|
24064
24421
|
if (declared.includes("server") && args.server === void 0) {
|
|
24065
24422
|
args = { ...args, server: this.serverKey };
|
|
24066
24423
|
}
|
|
@@ -24080,7 +24437,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
24080
24437
|
userKey: client.userKey,
|
|
24081
24438
|
emulatorKey: client.emulatorKey
|
|
24082
24439
|
};
|
|
24083
|
-
this.vtxoScript = new
|
|
24440
|
+
this.vtxoScript = new chunkCFOIHLON_cjs.ArkadeProgramScript(program, args, this.keys);
|
|
24084
24441
|
this.tapTree = this.vtxoScript.encode();
|
|
24085
24442
|
this.compiled = this.vtxoScript.compiled;
|
|
24086
24443
|
}
|
|
@@ -24105,7 +24462,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
24105
24462
|
`ArkadeContract.fromContract: expected contract type 'arkade', got '${contract.type}'`
|
|
24106
24463
|
);
|
|
24107
24464
|
}
|
|
24108
|
-
const typed =
|
|
24465
|
+
const typed = chunkCFOIHLON_cjs.deserializeArkadeContractParams(contract.params);
|
|
24109
24466
|
return new _ArkadeContract(client, typed.program, typed.args, {
|
|
24110
24467
|
serverKey: typed.serverKey,
|
|
24111
24468
|
userKey: typed.userKey,
|
|
@@ -24141,7 +24498,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
24141
24498
|
toContractParams() {
|
|
24142
24499
|
return {
|
|
24143
24500
|
type: "arkade",
|
|
24144
|
-
params:
|
|
24501
|
+
params: chunkCFOIHLON_cjs.serializeArkadeContractParams({
|
|
24145
24502
|
program: this.program,
|
|
24146
24503
|
args: this.args,
|
|
24147
24504
|
serverKey: this.keys.serverKey,
|
|
@@ -24181,17 +24538,17 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
24181
24538
|
const [registered] = await manager.getContracts({ script: scriptHex });
|
|
24182
24539
|
if (registered) {
|
|
24183
24540
|
const [withVtxos] = await manager.getContractsWithVtxos({ script: scriptHex });
|
|
24184
|
-
return (withVtxos?.vtxos ?? []).filter((v) => !
|
|
24541
|
+
return (withVtxos?.vtxos ?? []).filter((v) => !chunkVVFCCNU2_cjs.isVtxoSpent(v) && !v.isUnrolled);
|
|
24185
24542
|
}
|
|
24186
24543
|
}
|
|
24187
24544
|
if (!this.client.indexer) {
|
|
24188
24545
|
throw new Error("ArkadeContract.getUtxos: an indexer is required");
|
|
24189
24546
|
}
|
|
24190
|
-
const { vtxos } = await
|
|
24547
|
+
const { vtxos } = await chunkVVFCCNU2_cjs.getNormalizedVtxos(this.client.indexer, {
|
|
24191
24548
|
scripts: [scriptHex],
|
|
24192
24549
|
spendableOnly: true
|
|
24193
24550
|
});
|
|
24194
|
-
return vtxos.filter((v) => !
|
|
24551
|
+
return vtxos.filter((v) => !chunkVVFCCNU2_cjs.isVtxoSpent(v) && !v.isUnrolled);
|
|
24195
24552
|
}
|
|
24196
24553
|
/** Total spendable balance (requires an indexer). */
|
|
24197
24554
|
async getBalance() {
|
|
@@ -24295,7 +24652,7 @@ var ArkadeTransactionBuilder = class {
|
|
|
24295
24652
|
this.contract.client.checkpoint
|
|
24296
24653
|
);
|
|
24297
24654
|
if (coin.sourceTx) {
|
|
24298
|
-
|
|
24655
|
+
chunkVVFCCNU2_cjs.setArkPsbtField(arkTx, 0, chunkVVFCCNU2_cjs.PrevArkTxField, coin.sourceTx);
|
|
24299
24656
|
}
|
|
24300
24657
|
if (this.fn.arkadeScript) {
|
|
24301
24658
|
const indexer = this.contract.client.indexer;
|
|
@@ -24312,8 +24669,8 @@ var ArkadeTransactionBuilder = class {
|
|
|
24312
24669
|
}
|
|
24313
24670
|
const condition = (def.tapscript.witness ?? []).map((w) => this.witnessBytes(w));
|
|
24314
24671
|
if (condition.length > 0) {
|
|
24315
|
-
|
|
24316
|
-
|
|
24672
|
+
chunkVVFCCNU2_cjs.setArkPsbtField(arkTx, 0, chunkVVFCCNU2_cjs.ConditionWitness, condition);
|
|
24673
|
+
chunkVVFCCNU2_cjs.setArkPsbtField(checkpoints[0], 0, chunkVVFCCNU2_cjs.ConditionWitness, condition);
|
|
24317
24674
|
}
|
|
24318
24675
|
const packets = [];
|
|
24319
24676
|
if (this.assetSpecs.length > 0) {
|
|
@@ -24343,22 +24700,9 @@ var ArkadeTransactionBuilder = class {
|
|
|
24343
24700
|
if (!client.emulator) {
|
|
24344
24701
|
throw new Error("covenant spends require an `emulator` on the Arkade client");
|
|
24345
24702
|
}
|
|
24346
|
-
|
|
24347
|
-
|
|
24348
|
-
|
|
24349
|
-
(c, i) => userInputs.includes(i) ? client.identity.sign(c, [0]) : c
|
|
24350
|
-
)
|
|
24351
|
-
) : checkpoints;
|
|
24352
|
-
const res2 = await client.emulator.submitTx(
|
|
24353
|
-
base.base64.encode(signedArk2.toPSBT()),
|
|
24354
|
-
signedCps.map((c) => base.base64.encode(c.toPSBT()))
|
|
24355
|
-
);
|
|
24356
|
-
const txid = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
|
|
24357
|
-
return {
|
|
24358
|
-
txid,
|
|
24359
|
-
signedArkTx: res2.signedArkTx,
|
|
24360
|
-
signedCheckpointTxs: res2.signedCheckpointTxs
|
|
24361
|
-
};
|
|
24703
|
+
return submitViaEmulator(client.emulator, { arkTx, checkpoints }, client.identity, {
|
|
24704
|
+
inputIndexes: userInputs
|
|
24705
|
+
});
|
|
24362
24706
|
}
|
|
24363
24707
|
if (!client.identity) {
|
|
24364
24708
|
throw new Error("a signing identity is required for non-covenant spends");
|
|
@@ -24418,23 +24762,23 @@ var ArkadeTransactionBuilder = class {
|
|
|
24418
24762
|
}
|
|
24419
24763
|
buildAssetPacket() {
|
|
24420
24764
|
const groups = this.assetSpecs.map((s) => {
|
|
24421
|
-
const id = typeof s.assetId === "string" ?
|
|
24422
|
-
return
|
|
24765
|
+
const id = typeof s.assetId === "string" ? chunkFEBAG2K2_cjs.AssetId.fromString(s.assetId) : chunkFEBAG2K2_cjs.AssetId.fromBytes(s.assetId);
|
|
24766
|
+
return chunkFEBAG2K2_cjs.AssetGroup.create(
|
|
24423
24767
|
id,
|
|
24424
24768
|
null,
|
|
24425
|
-
s.inputs.map((i) =>
|
|
24426
|
-
s.outputs.map((o) =>
|
|
24427
|
-
(s.metadata ?? []).map((m) =>
|
|
24769
|
+
s.inputs.map((i) => chunkFEBAG2K2_cjs.AssetInput.create(i.vin, i.amount)),
|
|
24770
|
+
s.outputs.map((o) => chunkFEBAG2K2_cjs.AssetOutput.create(o.vout, o.amount)),
|
|
24771
|
+
(s.metadata ?? []).map((m) => chunkFEBAG2K2_cjs.Metadata.create(m.key, m.value))
|
|
24428
24772
|
);
|
|
24429
24773
|
});
|
|
24430
|
-
return
|
|
24774
|
+
return chunkFEBAG2K2_cjs.Packet.create(groups);
|
|
24431
24775
|
}
|
|
24432
24776
|
witnessBytes(ref) {
|
|
24433
|
-
return
|
|
24777
|
+
return chunkCFOIHLON_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
|
|
24434
24778
|
}
|
|
24435
24779
|
};
|
|
24436
24780
|
function bindInputs(fn, callArgs) {
|
|
24437
|
-
const names = (fn.def.inputs ?? []).map(
|
|
24781
|
+
const names = (fn.def.inputs ?? []).map(chunkCFOIHLON_cjs.inputName);
|
|
24438
24782
|
if (callArgs.length !== names.length) {
|
|
24439
24783
|
throw new Error(`${fn.name}: expected ${names.length} argument(s), got ${callArgs.length}`);
|
|
24440
24784
|
}
|
|
@@ -24848,17 +25192,17 @@ var walletFeeSource = (wallet) => async () => (await wallet.arkProvider.getInfo(
|
|
|
24848
25192
|
function offchainInputFees(vtxos, fees) {
|
|
24849
25193
|
const estimator = new Estimator(fees?.intentFee ?? {});
|
|
24850
25194
|
return vtxos.reduce(
|
|
24851
|
-
(total, vtxo) => total + estimator.evalOffchainInput(
|
|
25195
|
+
(total, vtxo) => total + estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(vtxo)).satoshis,
|
|
24852
25196
|
0
|
|
24853
25197
|
);
|
|
24854
25198
|
}
|
|
24855
25199
|
async function changeOutputFee(wallet, inputs, needed, fees) {
|
|
24856
25200
|
const estimator = new Estimator(fees?.intentFee ?? {});
|
|
24857
25201
|
const net = inputs.reduce(
|
|
24858
|
-
(total, vtxo) => total + BigInt(vtxo.value) - BigInt(estimator.evalOffchainInput(
|
|
25202
|
+
(total, vtxo) => total + BigInt(vtxo.value) - BigInt(estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(vtxo)).satoshis),
|
|
24859
25203
|
0n
|
|
24860
25204
|
);
|
|
24861
|
-
const script = base.hex.encode(
|
|
25205
|
+
const script = base.hex.encode(chunkVVFCCNU2_cjs.ArkAddress.decode(await wallet.getAddress()).pkScript);
|
|
24862
25206
|
return changeAfterOutputFee(
|
|
24863
25207
|
net - needed,
|
|
24864
25208
|
(amount) => BigInt(estimator.evalOffchainOutput({ amount, script }).satoshis)
|
|
@@ -24934,6 +25278,7 @@ exports.AmbiguousRouteError = AmbiguousRouteError;
|
|
|
24934
25278
|
exports.ArkNote = ArkNote;
|
|
24935
25279
|
exports.ArkadeCash = ArkadeCash;
|
|
24936
25280
|
exports.ArkadeCashCreateError = ArkadeCashCreateError;
|
|
25281
|
+
exports.ArkadeCashOperatorMismatchError = ArkadeCashOperatorMismatchError;
|
|
24937
25282
|
exports.AssetManager = AssetManager;
|
|
24938
25283
|
exports.BIP21 = BIP21;
|
|
24939
25284
|
exports.BIP21Error = BIP21Error;
|
|
@@ -25013,6 +25358,7 @@ exports.UnannotatableInputError = UnannotatableInputError;
|
|
|
25013
25358
|
exports.UnilateralExit = UnilateralExit;
|
|
25014
25359
|
exports.UnknownPacket = UnknownPacket;
|
|
25015
25360
|
exports.VtxoManager = VtxoManager;
|
|
25361
|
+
exports.VtxoReservedError = VtxoReservedError;
|
|
25016
25362
|
exports.Wallet = Wallet2;
|
|
25017
25363
|
exports.WalletCannotAllocateAddressError = WalletCannotAllocateAddressError;
|
|
25018
25364
|
exports.WalletCannotSignError = WalletCannotSignError;
|
|
@@ -25152,6 +25498,7 @@ exports.signAndSubmitOffchainTx = signAndSubmitOffchainTx;
|
|
|
25152
25498
|
exports.signerSetFromInfo = signerSetFromInfo;
|
|
25153
25499
|
exports.signingDescriptorIndex = signingDescriptorIndex;
|
|
25154
25500
|
exports.strictSigningDescriptorIndex = strictSigningDescriptorIndex;
|
|
25501
|
+
exports.submitViaEmulator = submitViaEmulator;
|
|
25155
25502
|
exports.toXOnlySignerHex = toXOnlySignerHex;
|
|
25156
25503
|
exports.tryResolveSendAmount = tryResolveSendAmount;
|
|
25157
25504
|
exports.utxoEntries = utxoEntries;
|
|
@@ -25163,5 +25510,5 @@ exports.waitForIncomingFunds = waitForIncomingFunds;
|
|
|
25163
25510
|
exports.walletFeeSource = walletFeeSource;
|
|
25164
25511
|
exports.warnAndFilterVtxosForScript = warnAndFilterVtxosForScript;
|
|
25165
25512
|
exports.withPrevTxs = withPrevTxs;
|
|
25166
|
-
//# sourceMappingURL=chunk-
|
|
25167
|
-
//# sourceMappingURL=chunk-
|
|
25513
|
+
//# sourceMappingURL=chunk-B2YMUJD5.cjs.map
|
|
25514
|
+
//# sourceMappingURL=chunk-B2YMUJD5.cjs.map
|