@arkade-os/sdk 0.4.54 → 0.4.56
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/dist/adapters/expo.cjs +5 -5
- package/dist/adapters/expo.d.cts +2 -2
- package/dist/adapters/expo.d.ts +2 -2
- package/dist/adapters/expo.js +3 -3
- package/dist/adapters/indexedDB.cjs +5 -5
- package/dist/adapters/indexedDB.js +4 -4
- package/dist/{ark-acFuA57I.d.cts → ark-Cgsd9tMd.d.cts} +40 -3
- package/dist/{ark-acFuA57I.d.ts → ark-Cgsd9tMd.d.ts} +40 -3
- package/dist/{asyncStorageTaskQueue-BO3cvMpP.d.cts → asyncStorageTaskQueue-C0ZsDE60.d.cts} +2 -2
- package/dist/{asyncStorageTaskQueue-DACXtP0I.d.ts → asyncStorageTaskQueue-CXz4PRBW.d.ts} +2 -2
- package/dist/{chunk-RNECH3TA.cjs → chunk-24YNIQSW.cjs} +15 -15
- package/dist/{chunk-RNECH3TA.cjs.map → chunk-24YNIQSW.cjs.map} +1 -1
- package/dist/{chunk-53XNU2EL.cjs → chunk-37XKN5DZ.cjs} +60 -40
- package/dist/chunk-37XKN5DZ.cjs.map +1 -0
- package/dist/{chunk-7L3P3EP5.js → chunk-5IMBONCK.js} +4 -4
- package/dist/{chunk-7L3P3EP5.js.map → chunk-5IMBONCK.js.map} +1 -1
- package/dist/{chunk-GMUVWKOK.cjs → chunk-CDWLZQQW.cjs} +11 -3
- package/dist/chunk-CDWLZQQW.cjs.map +1 -0
- package/dist/{chunk-D5LUPJJP.cjs → chunk-ENRRZFZ4.cjs} +774 -399
- package/dist/chunk-ENRRZFZ4.cjs.map +1 -0
- package/dist/{chunk-4EIKOJLD.js → chunk-IFGN2GB2.js} +11 -4
- package/dist/chunk-IFGN2GB2.js.map +1 -0
- package/dist/{chunk-YRLBZJYO.cjs → chunk-IMVKQQHU.cjs} +9 -9
- package/dist/{chunk-YRLBZJYO.cjs.map → chunk-IMVKQQHU.cjs.map} +1 -1
- package/dist/{chunk-BYJJIITU.cjs → chunk-MXPBHDOI.cjs} +17 -17
- package/dist/{chunk-BYJJIITU.cjs.map → chunk-MXPBHDOI.cjs.map} +1 -1
- package/dist/{chunk-ZOY5JSVA.js → chunk-NN7BNNF5.js} +3 -3
- package/dist/{chunk-ZOY5JSVA.js.map → chunk-NN7BNNF5.js.map} +1 -1
- package/dist/{chunk-A37WVZ5T.js → chunk-OOPDT2WV.js} +23 -4
- package/dist/chunk-OOPDT2WV.js.map +1 -0
- package/dist/{chunk-TEHJCEF3.js → chunk-T22257HW.js} +422 -56
- package/dist/chunk-T22257HW.js.map +1 -0
- package/dist/{chunk-QY2YVFZT.js → chunk-VNDVUM2W.js} +4 -4
- package/dist/{chunk-QY2YVFZT.js.map → chunk-VNDVUM2W.js.map} +1 -1
- package/dist/contracts/handlers/index.cjs +8 -8
- 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-DjwZZi6L.d.ts → delegate-CZPXtd2F.d.ts} +1 -1
- package/dist/{delegate-Ca_wXiYE.d.cts → delegate-xXT8O-Kn.d.cts} +1 -1
- package/dist/{index-Ddq0mIKX.d.ts → index-BBJ466mM.d.ts} +2 -2
- package/dist/{index-DFfefdpc.d.cts → index-BYG2eKOA.d.cts} +2 -2
- package/dist/index.cjs +246 -202
- package/dist/index.d.cts +169 -16
- package/dist/index.d.ts +169 -16
- package/dist/index.js +4 -4
- package/dist/repositories/realm/index.cjs +19 -19
- package/dist/repositories/realm/index.d.cts +2 -2
- package/dist/repositories/realm/index.d.ts +2 -2
- package/dist/repositories/realm/index.js +5 -5
- package/dist/repositories/sqlite/index.cjs +18 -18
- package/dist/repositories/sqlite/index.d.cts +2 -2
- package/dist/repositories/sqlite/index.d.ts +2 -2
- package/dist/repositories/sqlite/index.js +5 -5
- package/dist/{taskRunner-DEwlrgId.d.cts → taskRunner-BG1PRFps.d.cts} +2 -2
- package/dist/{taskRunner-DbCNRP31.d.ts → taskRunner-C46NnRsY.d.ts} +2 -2
- package/dist/wallet/expo/background.cjs +14 -14
- package/dist/wallet/expo/background.d.cts +3 -3
- package/dist/wallet/expo/background.d.ts +3 -3
- package/dist/wallet/expo/background.js +6 -6
- package/dist/wallet/expo/index.cjs +14 -14
- package/dist/wallet/expo/index.d.cts +5 -5
- package/dist/wallet/expo/index.d.ts +5 -5
- package/dist/wallet/expo/index.js +5 -5
- package/dist/{wallet-B9rpddG2.d.ts → wallet-1yWg75gN.d.cts} +100 -6
- package/dist/{wallet-ByjM6L20.d.cts → wallet-DuCm55EC.d.ts} +100 -6
- 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-4EIKOJLD.js.map +0 -1
- package/dist/chunk-53XNU2EL.cjs.map +0 -1
- package/dist/chunk-A37WVZ5T.js.map +0 -1
- package/dist/chunk-D5LUPJJP.cjs.map +0 -1
- package/dist/chunk-GMUVWKOK.cjs.map +0 -1
- package/dist/chunk-TEHJCEF3.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var chunk24YNIQSW_cjs = require('./chunk-24YNIQSW.cjs');
|
|
4
|
+
var chunk37XKN5DZ_cjs = require('./chunk-37XKN5DZ.cjs');
|
|
5
|
+
var chunkCDWLZQQW_cjs = require('./chunk-CDWLZQQW.cjs');
|
|
6
6
|
var chunk5BLDMQED_cjs = require('./chunk-5BLDMQED.cjs');
|
|
7
7
|
var utils_js = require('@scure/btc-signer/utils.js');
|
|
8
8
|
var btcSigner = require('@scure/btc-signer');
|
|
@@ -188,7 +188,7 @@ var TreeSignerSession = class _TreeSignerSession {
|
|
|
188
188
|
noncesByPubkey.set(base.hex.encode(myPublicKey.subarray(1)), myNonce);
|
|
189
189
|
const tx = this.graph.find(txid);
|
|
190
190
|
if (!tx) throw new Error(`missing tx for txid ${txid}`);
|
|
191
|
-
const cosigners =
|
|
191
|
+
const cosigners = chunkCDWLZQQW_cjs.getArkPsbtFields(tx.root, 0, chunkCDWLZQQW_cjs.CosignerPublicKey).map(
|
|
192
192
|
(c) => base.hex.encode(c.key.subarray(1))
|
|
193
193
|
// xonly pubkey
|
|
194
194
|
);
|
|
@@ -240,7 +240,7 @@ var TreeSignerSession = class _TreeSignerSession {
|
|
|
240
240
|
if (!aggNonce) throw new Error("missing aggregate nonce");
|
|
241
241
|
const prevoutAmounts = [];
|
|
242
242
|
const prevoutScripts = [];
|
|
243
|
-
const cosigners =
|
|
243
|
+
const cosigners = chunkCDWLZQQW_cjs.getArkPsbtFields(g.root, 0, chunkCDWLZQQW_cjs.CosignerPublicKey).map((c) => c.key);
|
|
244
244
|
const { finalKey } = aggregateKeys(cosigners, true, {
|
|
245
245
|
taprootTweak: this.scriptRoot
|
|
246
246
|
});
|
|
@@ -419,7 +419,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
419
419
|
let network;
|
|
420
420
|
if ("descriptor" in opts && typeof opts.descriptor === "string") {
|
|
421
421
|
descriptor = opts.descriptor;
|
|
422
|
-
network =
|
|
422
|
+
network = chunk37XKN5DZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
423
423
|
} else {
|
|
424
424
|
network = opts.isMainnet ?? true ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
425
425
|
descriptor = descriptorsScure.scriptExpressions.trBIP32({
|
|
@@ -504,7 +504,7 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
504
504
|
* `StaticDescriptorProvider` for legacy single-key wallets.
|
|
505
505
|
*/
|
|
506
506
|
isOurs(descriptor) {
|
|
507
|
-
return
|
|
507
|
+
return chunk37XKN5DZ_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
|
|
508
508
|
}
|
|
509
509
|
/**
|
|
510
510
|
* Signs each request with the key derived from its descriptor.
|
|
@@ -539,9 +539,21 @@ var SeedIdentity = class _SeedIdentity {
|
|
|
539
539
|
const key = this.derivePrivateKeyForDescriptor(descriptor);
|
|
540
540
|
return this.signMessageWithKey(key, message, signatureType);
|
|
541
541
|
}
|
|
542
|
+
/**
|
|
543
|
+
* BIP-340 sign `messageHash` with the key derived from `descriptor`,
|
|
544
|
+
* aux_rand = 0. Backs {@link DescriptorIdentity.signSchnorrDeterministic},
|
|
545
|
+
* which swap preimage derivation reads through.
|
|
546
|
+
*/
|
|
547
|
+
async signSchnorrDeterministicWithDescriptor(descriptor, messageHash) {
|
|
548
|
+
if (!this.isOurs(descriptor)) {
|
|
549
|
+
throw new Error(`Descriptor ${descriptor} does not belong to this identity`);
|
|
550
|
+
}
|
|
551
|
+
const key = this.derivePrivateKeyForDescriptor(descriptor);
|
|
552
|
+
return secp256k1.schnorr.signAsync(messageHash, key, new Uint8Array(32));
|
|
553
|
+
}
|
|
542
554
|
// ── internal helpers ─────────────────────────────────────────────
|
|
543
555
|
derivePrivateKeyForDescriptor(descriptor) {
|
|
544
|
-
const network =
|
|
556
|
+
const network = chunk37XKN5DZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
545
557
|
const expansion = descriptorsScure.expand({ descriptor, network });
|
|
546
558
|
if (expansion.isRanged) {
|
|
547
559
|
throw new Error(
|
|
@@ -627,7 +639,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
|
|
|
627
639
|
*/
|
|
628
640
|
descriptor;
|
|
629
641
|
constructor(descriptor) {
|
|
630
|
-
const network =
|
|
642
|
+
const network = chunk37XKN5DZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
631
643
|
let expansion;
|
|
632
644
|
try {
|
|
633
645
|
expansion = descriptorsScure.expand({ descriptor, network, index: 0 });
|
|
@@ -677,7 +689,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
|
|
|
677
689
|
* `StaticDescriptorProvider` for legacy single-key wallets.
|
|
678
690
|
*/
|
|
679
691
|
isOurs(descriptor) {
|
|
680
|
-
return
|
|
692
|
+
return chunk37XKN5DZ_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
|
|
681
693
|
}
|
|
682
694
|
};
|
|
683
695
|
function serializeSeedOwnedSigningIdentity(identity) {
|
|
@@ -825,6 +837,59 @@ function assertValidSerializedIdentity(s) {
|
|
|
825
837
|
}
|
|
826
838
|
}
|
|
827
839
|
|
|
840
|
+
// src/identity/descriptorIdentity.ts
|
|
841
|
+
function isHDDeterministicSignCapable(value) {
|
|
842
|
+
return typeof value === "object" && value !== null && typeof value.signSchnorrDeterministicWithDescriptor === "function";
|
|
843
|
+
}
|
|
844
|
+
var DescriptorIdentity = class {
|
|
845
|
+
descriptor;
|
|
846
|
+
signer;
|
|
847
|
+
base;
|
|
848
|
+
constructor({ descriptor, signer, base }) {
|
|
849
|
+
this.descriptor = descriptor;
|
|
850
|
+
this.signer = signer;
|
|
851
|
+
this.base = base;
|
|
852
|
+
}
|
|
853
|
+
async xOnlyPublicKey() {
|
|
854
|
+
return chunk37XKN5DZ_cjs.deriveDescriptorLeafPubKey(this.descriptor);
|
|
855
|
+
}
|
|
856
|
+
async compressedPublicKey() {
|
|
857
|
+
return chunk37XKN5DZ_cjs.deriveDescriptorLeafCompressedPubKey(this.descriptor);
|
|
858
|
+
}
|
|
859
|
+
async sign(tx, inputIndexes) {
|
|
860
|
+
const [signed] = await this.signer.signWithDescriptor([
|
|
861
|
+
{ descriptor: this.descriptor, tx, inputIndexes }
|
|
862
|
+
]);
|
|
863
|
+
if (!signed) {
|
|
864
|
+
throw new Error(`Descriptor signer returned no transaction for ${this.descriptor}`);
|
|
865
|
+
}
|
|
866
|
+
return signed;
|
|
867
|
+
}
|
|
868
|
+
async signMessage(message, signatureType = "schnorr") {
|
|
869
|
+
return this.signer.signMessageWithDescriptor(this.descriptor, message, signatureType);
|
|
870
|
+
}
|
|
871
|
+
/**
|
|
872
|
+
* Delegated: `TreeSignerSession.random()` consults no key material, so the
|
|
873
|
+
* session is index-independent.
|
|
874
|
+
*/
|
|
875
|
+
signerSession() {
|
|
876
|
+
return this.base.signerSession();
|
|
877
|
+
}
|
|
878
|
+
/**
|
|
879
|
+
* Throws rather than falling back to the baseline key: a preimage derived
|
|
880
|
+
* from the wrong index is unrecoverable, and callers probe this member
|
|
881
|
+
* through a structural guard that cannot tell the two apart.
|
|
882
|
+
*/
|
|
883
|
+
async signSchnorrDeterministic(messageHash) {
|
|
884
|
+
if (!isHDDeterministicSignCapable(this.base)) {
|
|
885
|
+
throw new Error(
|
|
886
|
+
`Identity cannot sign deterministically for descriptor ${this.descriptor}`
|
|
887
|
+
);
|
|
888
|
+
}
|
|
889
|
+
return this.base.signSchnorrDeterministicWithDescriptor(this.descriptor, messageHash);
|
|
890
|
+
}
|
|
891
|
+
};
|
|
892
|
+
|
|
828
893
|
// src/identity/hdCapableIdentity.ts
|
|
829
894
|
function isHDCapableIdentity(value) {
|
|
830
895
|
if (typeof value !== "object" || value === null) return false;
|
|
@@ -837,6 +902,13 @@ function isBatchSignable(identity) {
|
|
|
837
902
|
return "signMultiple" in identity && typeof identity.signMultiple === "function";
|
|
838
903
|
}
|
|
839
904
|
|
|
905
|
+
// src/wallet/hdWalletCapable.ts
|
|
906
|
+
function isHDWalletCapable(value) {
|
|
907
|
+
if (typeof value !== "object" || value === null) return false;
|
|
908
|
+
const v = value;
|
|
909
|
+
return typeof v.getCurrentSigningDescriptor === "function" && typeof v.getUsedSigningDescriptors === "function" && typeof v.signerForDescriptor === "function";
|
|
910
|
+
}
|
|
911
|
+
|
|
840
912
|
// src/worker/browser/service-worker-manager.ts
|
|
841
913
|
var registrations = /* @__PURE__ */ new Map();
|
|
842
914
|
var handshakes = /* @__PURE__ */ new WeakSet();
|
|
@@ -989,14 +1061,14 @@ var RestDelegateProvider = class {
|
|
|
989
1061
|
*/
|
|
990
1062
|
async delegate(intent, forfeitTxs, options) {
|
|
991
1063
|
const url = `${this.url}/v1/delegate`;
|
|
992
|
-
const response = await
|
|
1064
|
+
const response = await chunkCDWLZQQW_cjs.baseFetch(url, {
|
|
993
1065
|
method: "POST",
|
|
994
1066
|
headers: {
|
|
995
1067
|
"Content-Type": "application/json"
|
|
996
1068
|
},
|
|
997
1069
|
body: JSON.stringify({
|
|
998
1070
|
intent: {
|
|
999
|
-
message:
|
|
1071
|
+
message: chunkCDWLZQQW_cjs.Intent.encodeMessage(intent.message),
|
|
1000
1072
|
proof: intent.proof
|
|
1001
1073
|
},
|
|
1002
1074
|
forfeit_txs: forfeitTxs,
|
|
@@ -1016,7 +1088,7 @@ var RestDelegateProvider = class {
|
|
|
1016
1088
|
*/
|
|
1017
1089
|
async getDelegateInfo() {
|
|
1018
1090
|
const url = `${this.url}/v1/delegator/info`;
|
|
1019
|
-
const response = await
|
|
1091
|
+
const response = await chunkCDWLZQQW_cjs.rateGate.runHttp(url, () => chunkCDWLZQQW_cjs.baseFetch(url));
|
|
1020
1092
|
if (!response.ok) {
|
|
1021
1093
|
const errorText2 = await response.text();
|
|
1022
1094
|
throw new Error(`Failed to get delegate info: ${errorText2}`);
|
|
@@ -1043,7 +1115,7 @@ var ESPLORA_URL = {
|
|
|
1043
1115
|
regtest: "http://localhost:3000/api"
|
|
1044
1116
|
};
|
|
1045
1117
|
var EsploraProvider = class {
|
|
1046
|
-
constructor(baseUrl = ESPLORA_URL[
|
|
1118
|
+
constructor(baseUrl = ESPLORA_URL[chunkCDWLZQQW_cjs.DEFAULT_NETWORK_NAME], opts) {
|
|
1047
1119
|
this.baseUrl = baseUrl;
|
|
1048
1120
|
this.pollingInterval = opts?.pollingInterval ?? 15e3;
|
|
1049
1121
|
this.forcePolling = opts?.forcePolling ?? false;
|
|
@@ -1052,14 +1124,14 @@ var EsploraProvider = class {
|
|
|
1052
1124
|
pollingInterval;
|
|
1053
1125
|
forcePolling;
|
|
1054
1126
|
async getCoins(address) {
|
|
1055
|
-
const response = await
|
|
1127
|
+
const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
|
|
1056
1128
|
if (!response.ok) {
|
|
1057
1129
|
throw new Error(`Failed to fetch UTXOs: ${response.statusText}`);
|
|
1058
1130
|
}
|
|
1059
1131
|
return response.json();
|
|
1060
1132
|
}
|
|
1061
1133
|
async getFeeRate() {
|
|
1062
|
-
const response = await
|
|
1134
|
+
const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
|
|
1063
1135
|
if (response.status === 404) {
|
|
1064
1136
|
return void 0;
|
|
1065
1137
|
}
|
|
@@ -1080,7 +1152,7 @@ var EsploraProvider = class {
|
|
|
1080
1152
|
}
|
|
1081
1153
|
}
|
|
1082
1154
|
async getTxOutspends(txid) {
|
|
1083
|
-
const response = await
|
|
1155
|
+
const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
|
|
1084
1156
|
if (!response.ok) {
|
|
1085
1157
|
const error = await response.text();
|
|
1086
1158
|
throw new Error(`Failed to get transaction outspends: ${error}`);
|
|
@@ -1088,7 +1160,7 @@ var EsploraProvider = class {
|
|
|
1088
1160
|
return response.json();
|
|
1089
1161
|
}
|
|
1090
1162
|
async getTransactions(address) {
|
|
1091
|
-
const response = await
|
|
1163
|
+
const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
|
|
1092
1164
|
if (!response.ok) {
|
|
1093
1165
|
const error = await response.text();
|
|
1094
1166
|
throw new Error(`Failed to get transactions: ${error}`);
|
|
@@ -1096,7 +1168,7 @@ var EsploraProvider = class {
|
|
|
1096
1168
|
return response.json();
|
|
1097
1169
|
}
|
|
1098
1170
|
async getTxStatus(txid) {
|
|
1099
|
-
const txresponse = await
|
|
1171
|
+
const txresponse = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
|
|
1100
1172
|
if (!txresponse.ok) {
|
|
1101
1173
|
throw new Error(txresponse.statusText);
|
|
1102
1174
|
}
|
|
@@ -1104,7 +1176,7 @@ var EsploraProvider = class {
|
|
|
1104
1176
|
if (!tx.status.confirmed) {
|
|
1105
1177
|
return { confirmed: false };
|
|
1106
1178
|
}
|
|
1107
|
-
const response = await
|
|
1179
|
+
const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
|
|
1108
1180
|
if (!response.ok) {
|
|
1109
1181
|
throw new Error(`Failed to get transaction status: ${response.statusText}`);
|
|
1110
1182
|
}
|
|
@@ -1188,7 +1260,7 @@ var EsploraProvider = class {
|
|
|
1188
1260
|
return stopFunc;
|
|
1189
1261
|
}
|
|
1190
1262
|
async getChainTip() {
|
|
1191
|
-
const tipBlocks = await
|
|
1263
|
+
const tipBlocks = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/blocks`);
|
|
1192
1264
|
if (!tipBlocks.ok) {
|
|
1193
1265
|
throw new Error(`Failed to get chain tip: ${tipBlocks.statusText}`);
|
|
1194
1266
|
}
|
|
@@ -1207,7 +1279,7 @@ var EsploraProvider = class {
|
|
|
1207
1279
|
};
|
|
1208
1280
|
}
|
|
1209
1281
|
async broadcastPackage(parent, child) {
|
|
1210
|
-
const response = await
|
|
1282
|
+
const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
|
|
1211
1283
|
method: "POST",
|
|
1212
1284
|
headers: {
|
|
1213
1285
|
"Content-Type": "application/json"
|
|
@@ -1221,7 +1293,7 @@ var EsploraProvider = class {
|
|
|
1221
1293
|
return response.json();
|
|
1222
1294
|
}
|
|
1223
1295
|
async broadcastTx(tx) {
|
|
1224
|
-
const response = await
|
|
1296
|
+
const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/tx`, {
|
|
1225
1297
|
method: "POST",
|
|
1226
1298
|
headers: {
|
|
1227
1299
|
"Content-Type": "text/plain"
|
|
@@ -1383,7 +1455,7 @@ function findP2AOutput(tx) {
|
|
|
1383
1455
|
var CHILD_DUST_AMOUNT = 546;
|
|
1384
1456
|
function buildAnchorChild(params) {
|
|
1385
1457
|
const { parent, feeRate, fundingCoins, changeAddress, tapInternalKey, network } = params;
|
|
1386
|
-
const child = new
|
|
1458
|
+
const child = new chunkCDWLZQQW_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
|
|
1387
1459
|
child.addInput(findP2AOutput(parent));
|
|
1388
1460
|
const estimator = TxWeightEstimator.create().addP2AInput();
|
|
1389
1461
|
for (const _ of fundingCoins) {
|
|
@@ -1431,7 +1503,7 @@ function buildForfeitTx(inputs, forfeitPkScript, txLocktime) {
|
|
|
1431
1503
|
);
|
|
1432
1504
|
}
|
|
1433
1505
|
function buildForfeitTxWithOutput(inputs, output, txLocktime) {
|
|
1434
|
-
const tx = new
|
|
1506
|
+
const tx = new chunkCDWLZQQW_cjs.Transaction({
|
|
1435
1507
|
version: 3,
|
|
1436
1508
|
lockTime: txLocktime
|
|
1437
1509
|
});
|
|
@@ -1507,7 +1579,7 @@ function validateVtxoTxGraph(graph, roundTransaction, sweepTapTreeRoot) {
|
|
|
1507
1579
|
if (previousScriptKey.length !== 32) {
|
|
1508
1580
|
throw new Error(`parent output ${childIndex} has invalid script`);
|
|
1509
1581
|
}
|
|
1510
|
-
const cosigners =
|
|
1582
|
+
const cosigners = chunkCDWLZQQW_cjs.getArkPsbtFields(child.root, 0, chunkCDWLZQQW_cjs.CosignerPublicKey);
|
|
1511
1583
|
if (cosigners.length === 0) {
|
|
1512
1584
|
throw ErrMissingCosignersPublicKeys;
|
|
1513
1585
|
}
|
|
@@ -1565,7 +1637,7 @@ var EmulatorPacket = class _EmulatorPacket {
|
|
|
1565
1637
|
return new _EmulatorPacket(entries);
|
|
1566
1638
|
}
|
|
1567
1639
|
static fromBytes(data) {
|
|
1568
|
-
const reader = new
|
|
1640
|
+
const reader = new chunk24YNIQSW_cjs.BufferReader(data);
|
|
1569
1641
|
const entryCount = reader.readCompactSize();
|
|
1570
1642
|
const entries = [];
|
|
1571
1643
|
for (let i = 0; i < entryCount; i++) {
|
|
@@ -1583,7 +1655,7 @@ var EmulatorPacket = class _EmulatorPacket {
|
|
|
1583
1655
|
return _EmulatorPacket.PACKET_TYPE;
|
|
1584
1656
|
}
|
|
1585
1657
|
serialize() {
|
|
1586
|
-
const writer = new
|
|
1658
|
+
const writer = new chunk24YNIQSW_cjs.BufferWriter();
|
|
1587
1659
|
writer.writeCompactSize(this.entries.length);
|
|
1588
1660
|
for (const entry of this.entries) {
|
|
1589
1661
|
writer.writeUint16LE(entry.vin);
|
|
@@ -1670,7 +1742,7 @@ var Extension = class _Extension {
|
|
|
1670
1742
|
`expected magic prefix ${base.hex.encode(ARKADE_MAGIC)}, got ${base.hex.encode(payload.slice(0, Math.min(payload.length, ARKADE_MAGIC.length)))}`
|
|
1671
1743
|
);
|
|
1672
1744
|
}
|
|
1673
|
-
const reader = new
|
|
1745
|
+
const reader = new chunk24YNIQSW_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
|
|
1674
1746
|
const packets = [];
|
|
1675
1747
|
while (reader.remaining() > 0) {
|
|
1676
1748
|
const packetType = reader.readByte();
|
|
@@ -1744,7 +1816,7 @@ var Extension = class _Extension {
|
|
|
1744
1816
|
*/
|
|
1745
1817
|
getAssetPacket() {
|
|
1746
1818
|
for (const p of this.packets) {
|
|
1747
|
-
if (p instanceof
|
|
1819
|
+
if (p instanceof chunk24YNIQSW_cjs.Packet) {
|
|
1748
1820
|
return p;
|
|
1749
1821
|
}
|
|
1750
1822
|
}
|
|
@@ -1782,8 +1854,8 @@ var Extension = class _Extension {
|
|
|
1782
1854
|
};
|
|
1783
1855
|
function parsePacket(packetType, data) {
|
|
1784
1856
|
switch (packetType) {
|
|
1785
|
-
case
|
|
1786
|
-
return
|
|
1857
|
+
case chunk24YNIQSW_cjs.Packet.PACKET_TYPE:
|
|
1858
|
+
return chunk24YNIQSW_cjs.Packet.fromBytes(data);
|
|
1787
1859
|
case EmulatorPacket.PACKET_TYPE:
|
|
1788
1860
|
return EmulatorPacket.fromBytes(data);
|
|
1789
1861
|
default:
|
|
@@ -1830,21 +1902,35 @@ function buildOpReturnScript(data) {
|
|
|
1830
1902
|
}
|
|
1831
1903
|
return script;
|
|
1832
1904
|
}
|
|
1833
|
-
var ErrOffchainOutputNotFound = (address) => new
|
|
1834
|
-
var ErrInvalidAssetOutputAmount = (got, want, assetId) => new
|
|
1835
|
-
|
|
1836
|
-
|
|
1905
|
+
var ErrOffchainOutputNotFound = (address) => new chunkCDWLZQQW_cjs.ServerResponseMismatchError(`offchain send output not found: ${address}`);
|
|
1906
|
+
var ErrInvalidAssetOutputAmount = (got, want, assetId) => new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
|
|
1907
|
+
`invalid asset output amount for ${assetId}: got ${got}, want ${want}`
|
|
1908
|
+
);
|
|
1909
|
+
var ErrAssetGroupNotFound = (assetId) => new chunkCDWLZQQW_cjs.ServerResponseMismatchError(`asset group not found in batch leaf: ${assetId}`);
|
|
1910
|
+
var ErrAssetOutputNotFound = (assetId, outputIndex) => new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
|
|
1911
|
+
`asset output not found in asset group ${assetId} at index ${outputIndex}`
|
|
1912
|
+
);
|
|
1913
|
+
var ErrOnchainOutputNotFound = (address) => new chunkCDWLZQQW_cjs.ServerResponseMismatchError(`onchain output not found: ${address}`);
|
|
1914
|
+
var ErrUnvalidatedOffchainOutput = (address) => new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
|
|
1915
|
+
`offchain output ${address} cannot be validated: virtual output tree signing did not run`
|
|
1916
|
+
);
|
|
1837
1917
|
var ErrInvalidOnchainOutputAmount = (address) => new Error(`invalid onchain output amount: ${address}`);
|
|
1838
1918
|
var ErrInvalidOnchainOutputAssets = (address) => new Error(`onchain output ${address} cannot have assets`);
|
|
1839
|
-
var ErrOnchainOutputNotFound = (address) => new Error(`onchain output not found: ${address}`);
|
|
1840
1919
|
var ErrInvalidOffchainOutputAmount = (address) => new Error(`invalid offchain output ${address}, missing amount`);
|
|
1920
|
+
function assertFinalCommitmentMatchesValidated(finalCommitmentTx, validatedCommitmentTxid, context) {
|
|
1921
|
+
if (!validatedCommitmentTxid) return;
|
|
1922
|
+
if (finalCommitmentTx.id === validatedCommitmentTxid) return;
|
|
1923
|
+
throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
|
|
1924
|
+
`${context}: finalization commitment tx ${finalCommitmentTx.id} differs from the validated commitment tx ${validatedCommitmentTxid}`
|
|
1925
|
+
);
|
|
1926
|
+
}
|
|
1841
1927
|
function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, network) {
|
|
1842
1928
|
const usedOutputs = /* @__PURE__ */ new Set();
|
|
1843
1929
|
const usedOnchainOutputs = /* @__PURE__ */ new Set();
|
|
1844
1930
|
for (const recipient of recipients) {
|
|
1845
1931
|
let arkAddress;
|
|
1846
1932
|
try {
|
|
1847
|
-
arkAddress =
|
|
1933
|
+
arkAddress = chunkCDWLZQQW_cjs.ArkAddress.decode(recipient.address);
|
|
1848
1934
|
} catch {
|
|
1849
1935
|
validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
|
|
1850
1936
|
continue;
|
|
@@ -1852,6 +1938,18 @@ function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, netwo
|
|
|
1852
1938
|
validateOffchainRecipient(vtxoTreeLeaves, arkAddress, recipient, usedOutputs);
|
|
1853
1939
|
}
|
|
1854
1940
|
}
|
|
1941
|
+
function validateBatchRecipientsWithoutTree(commitmentTx, recipients, network) {
|
|
1942
|
+
const usedOnchainOutputs = /* @__PURE__ */ new Set();
|
|
1943
|
+
for (const recipient of recipients) {
|
|
1944
|
+
try {
|
|
1945
|
+
chunkCDWLZQQW_cjs.ArkAddress.decode(recipient.address);
|
|
1946
|
+
} catch {
|
|
1947
|
+
validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
|
|
1948
|
+
continue;
|
|
1949
|
+
}
|
|
1950
|
+
throw ErrUnvalidatedOffchainOutput(recipient.address);
|
|
1951
|
+
}
|
|
1952
|
+
}
|
|
1855
1953
|
function validateOnchainRecipient(commitmentTx, recipient, network, usedOutputs) {
|
|
1856
1954
|
const addr = btcSigner.Address(network).decode(recipient.address);
|
|
1857
1955
|
const expectedPkScript = btcSigner.OutScript.encode(addr);
|
|
@@ -1944,8 +2042,6 @@ function validateAssetGroupOutput(packet, outputIndex, assetId, expectedAmount)
|
|
|
1944
2042
|
throw ErrInvalidAssetOutputAmount(assetOutput.amount, expectedAmount, assetId);
|
|
1945
2043
|
}
|
|
1946
2044
|
}
|
|
1947
|
-
|
|
1948
|
-
// src/wallet/activity.ts
|
|
1949
2045
|
async function buildActivities(txs, resolvers) {
|
|
1950
2046
|
const preparedResolvers = (await Promise.all(
|
|
1951
2047
|
resolvers.map(async (r) => {
|
|
@@ -2055,9 +2151,49 @@ function boardingResolver() {
|
|
|
2055
2151
|
}
|
|
2056
2152
|
};
|
|
2057
2153
|
}
|
|
2154
|
+
function collabExitResolver() {
|
|
2155
|
+
return {
|
|
2156
|
+
id: "collab-exit",
|
|
2157
|
+
resolve(tx) {
|
|
2158
|
+
if (tx.tag !== "exit" || !tx.key.commitmentTxid) return void 0;
|
|
2159
|
+
return [
|
|
2160
|
+
{
|
|
2161
|
+
groupId: `exit:${tx.key.commitmentTxid}`,
|
|
2162
|
+
label: "Collaborative exit",
|
|
2163
|
+
kind: "exit"
|
|
2164
|
+
}
|
|
2165
|
+
];
|
|
2166
|
+
}
|
|
2167
|
+
};
|
|
2168
|
+
}
|
|
2169
|
+
function assetMintResolver() {
|
|
2170
|
+
return {
|
|
2171
|
+
id: "asset-mint",
|
|
2172
|
+
resolve(tx) {
|
|
2173
|
+
if (!tx.assets?.length || !tx.key.arkTxid) return void 0;
|
|
2174
|
+
const minted = tx.assets.filter((a) => {
|
|
2175
|
+
try {
|
|
2176
|
+
return base.hex.encode(chunk24YNIQSW_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
|
|
2177
|
+
} catch {
|
|
2178
|
+
return false;
|
|
2179
|
+
}
|
|
2180
|
+
});
|
|
2181
|
+
if (minted.length === 0) return void 0;
|
|
2182
|
+
const received = tx.type === "RECEIVED" /* TxReceived */;
|
|
2183
|
+
return minted.map((a) => ({
|
|
2184
|
+
groupId: `mint:${a.assetId}`,
|
|
2185
|
+
label: received ? "Asset receive" : "Asset mint",
|
|
2186
|
+
kind: received ? "asset-receive" : "asset-mint",
|
|
2187
|
+
metadata: { assetId: a.assetId, amount: a.amount.toString() }
|
|
2188
|
+
}));
|
|
2189
|
+
}
|
|
2190
|
+
};
|
|
2191
|
+
}
|
|
2058
2192
|
function createDefaultActivityRegistry() {
|
|
2059
2193
|
const registry = new ActivityRegistry();
|
|
2060
2194
|
registry.use(boardingResolver());
|
|
2195
|
+
registry.use(collabExitResolver());
|
|
2196
|
+
registry.use(assetMintResolver());
|
|
2061
2197
|
return registry;
|
|
2062
2198
|
}
|
|
2063
2199
|
|
|
@@ -2080,7 +2216,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2080
2216
|
const existing = inputsByAssetId.get(asset.assetId);
|
|
2081
2217
|
inputsByAssetId.set(asset.assetId, [
|
|
2082
2218
|
...existing ?? [],
|
|
2083
|
-
|
|
2219
|
+
chunk24YNIQSW_cjs.AssetInput.create(inputIndex, asset.amount)
|
|
2084
2220
|
]);
|
|
2085
2221
|
}
|
|
2086
2222
|
}
|
|
@@ -2092,7 +2228,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2092
2228
|
const existing = outputsByAssetId.get(asset.assetId);
|
|
2093
2229
|
outputsByAssetId.set(asset.assetId, [
|
|
2094
2230
|
...existing ?? [],
|
|
2095
|
-
|
|
2231
|
+
chunk24YNIQSW_cjs.AssetOutput.create(outputIndex, asset.amount)
|
|
2096
2232
|
]);
|
|
2097
2233
|
}
|
|
2098
2234
|
}
|
|
@@ -2103,7 +2239,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2103
2239
|
const existing = outputsByAssetId.get(asset.assetId);
|
|
2104
2240
|
outputsByAssetId.set(asset.assetId, [
|
|
2105
2241
|
...existing ?? [],
|
|
2106
|
-
|
|
2242
|
+
chunk24YNIQSW_cjs.AssetOutput.create(outputIndex, asset.amount)
|
|
2107
2243
|
]);
|
|
2108
2244
|
}
|
|
2109
2245
|
}
|
|
@@ -2112,11 +2248,11 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
|
|
|
2112
2248
|
for (const assetIdStr of allAssetIds) {
|
|
2113
2249
|
const inputs = inputsByAssetId.get(assetIdStr);
|
|
2114
2250
|
const outputs = outputsByAssetId.get(assetIdStr);
|
|
2115
|
-
const assetId =
|
|
2116
|
-
const group =
|
|
2251
|
+
const assetId = chunk24YNIQSW_cjs.AssetId.fromString(assetIdStr);
|
|
2252
|
+
const group = chunk24YNIQSW_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
|
|
2117
2253
|
groups.push(group);
|
|
2118
2254
|
}
|
|
2119
|
-
return
|
|
2255
|
+
return chunk24YNIQSW_cjs.Packet.create(groups);
|
|
2120
2256
|
}
|
|
2121
2257
|
function selectCoinsWithAsset(coins, assetId, requiredAmount) {
|
|
2122
2258
|
const coinsWithAsset = coins.filter((coin) => coin.assets?.some((a) => a.assetId === assetId));
|
|
@@ -2221,8 +2357,8 @@ function buildOffchainTx(inputs, outputs, serverUnrollScript) {
|
|
|
2221
2357
|
function buildVirtualTx(inputs, outputs) {
|
|
2222
2358
|
let lockTime = 0n;
|
|
2223
2359
|
for (const input of inputs) {
|
|
2224
|
-
const tapscript =
|
|
2225
|
-
if (
|
|
2360
|
+
const tapscript = chunkCDWLZQQW_cjs.decodeTapscript(chunkCDWLZQQW_cjs.scriptFromTapLeafScript(input.tapLeafScript));
|
|
2361
|
+
if (chunkCDWLZQQW_cjs.CLTVMultisigTapscript.is(tapscript)) {
|
|
2226
2362
|
if (lockTime !== 0n) {
|
|
2227
2363
|
if (isSeconds(lockTime) !== isSeconds(tapscript.params.absoluteTimelock)) {
|
|
2228
2364
|
throw new Error("cannot mix seconds and blocks locktime");
|
|
@@ -2233,7 +2369,7 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
2233
2369
|
}
|
|
2234
2370
|
}
|
|
2235
2371
|
}
|
|
2236
|
-
const tx = new
|
|
2372
|
+
const tx = new chunkCDWLZQQW_cjs.Transaction({
|
|
2237
2373
|
version: 3,
|
|
2238
2374
|
lockTime: Number(lockTime)
|
|
2239
2375
|
});
|
|
@@ -2243,12 +2379,12 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
2243
2379
|
index: input.vout,
|
|
2244
2380
|
sequence: lockTime ? btcSigner.DEFAULT_SEQUENCE - 1 : void 0,
|
|
2245
2381
|
witnessUtxo: {
|
|
2246
|
-
script:
|
|
2382
|
+
script: chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).pkScript,
|
|
2247
2383
|
amount: BigInt(input.value)
|
|
2248
2384
|
},
|
|
2249
2385
|
tapLeafScript: [input.tapLeafScript]
|
|
2250
2386
|
});
|
|
2251
|
-
|
|
2387
|
+
chunkCDWLZQQW_cjs.setArkPsbtField(tx, i, chunkCDWLZQQW_cjs.VtxoTaprootTree, input.tapTree);
|
|
2252
2388
|
}
|
|
2253
2389
|
for (const output of outputs) {
|
|
2254
2390
|
tx.addOutput(output);
|
|
@@ -2257,8 +2393,8 @@ function buildVirtualTx(inputs, outputs) {
|
|
|
2257
2393
|
return tx;
|
|
2258
2394
|
}
|
|
2259
2395
|
function buildCheckpointTx(vtxo, serverUnrollScript) {
|
|
2260
|
-
const collaborativeClosure =
|
|
2261
|
-
const checkpointVtxoScript = new
|
|
2396
|
+
const collaborativeClosure = chunkCDWLZQQW_cjs.decodeTapscript(chunkCDWLZQQW_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
|
|
2397
|
+
const checkpointVtxoScript = new chunkCDWLZQQW_cjs.VtxoScript([
|
|
2262
2398
|
serverUnrollScript.script,
|
|
2263
2399
|
collaborativeClosure.script
|
|
2264
2400
|
]);
|
|
@@ -2411,12 +2547,76 @@ function combineTapscriptSigs(signedTx, originalTx) {
|
|
|
2411
2547
|
}
|
|
2412
2548
|
function isValidArkAddress(address) {
|
|
2413
2549
|
try {
|
|
2414
|
-
|
|
2550
|
+
chunkCDWLZQQW_cjs.ArkAddress.decode(address);
|
|
2415
2551
|
return true;
|
|
2416
2552
|
} catch (e) {
|
|
2417
2553
|
return false;
|
|
2418
2554
|
}
|
|
2419
2555
|
}
|
|
2556
|
+
function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, context) {
|
|
2557
|
+
if (serverCheckpointTxs.length !== expectedCheckpoints.length) {
|
|
2558
|
+
throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
|
|
2559
|
+
`${context} returned ${serverCheckpointTxs.length} checkpoints, expected ${expectedCheckpoints.length}`
|
|
2560
|
+
);
|
|
2561
|
+
}
|
|
2562
|
+
const byTxid = new Map(expectedCheckpoints.map((c) => [c.id, c]));
|
|
2563
|
+
return serverCheckpointTxs.map((encoded, index) => {
|
|
2564
|
+
const server = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
|
|
2565
|
+
const local = byTxid.get(server.id);
|
|
2566
|
+
if (!local) {
|
|
2567
|
+
throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
|
|
2568
|
+
`${context} checkpoint ${index} txid ${server.id} does not match any submitted checkpoint`
|
|
2569
|
+
);
|
|
2570
|
+
}
|
|
2571
|
+
byTxid.delete(server.id);
|
|
2572
|
+
return { server, local };
|
|
2573
|
+
});
|
|
2574
|
+
}
|
|
2575
|
+
function assertSubmittedArkTxid(response, signedArkTx, context) {
|
|
2576
|
+
if (response.arkTxid !== signedArkTx.id) {
|
|
2577
|
+
throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
|
|
2578
|
+
`${context} returned ark txid ${response.arkTxid}, expected ${signedArkTx.id}`
|
|
2579
|
+
);
|
|
2580
|
+
}
|
|
2581
|
+
if (response.finalArkTx === void 0) return;
|
|
2582
|
+
const finalTxid = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
|
|
2583
|
+
if (finalTxid !== signedArkTx.id) {
|
|
2584
|
+
throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
|
|
2585
|
+
`${context} returned final ark tx ${finalTxid}, expected ${signedArkTx.id}`
|
|
2586
|
+
);
|
|
2587
|
+
}
|
|
2588
|
+
}
|
|
2589
|
+
function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, context) {
|
|
2590
|
+
const byOutpoint = new Map(inputs.map((input) => [`${input.txid}:${input.vout}`, input]));
|
|
2591
|
+
for (const [index, checkpoint] of checkpoints.entries()) {
|
|
2592
|
+
if (checkpoint.inputsLength !== 1) {
|
|
2593
|
+
throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
|
|
2594
|
+
`${context}: checkpoint ${index} spends ${checkpoint.inputsLength} inputs, expected 1`
|
|
2595
|
+
);
|
|
2596
|
+
}
|
|
2597
|
+
const spent = checkpoint.getInput(0);
|
|
2598
|
+
if (!spent.txid || spent.index === void 0) {
|
|
2599
|
+
throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
|
|
2600
|
+
`${context}: checkpoint ${index} has no input outpoint`
|
|
2601
|
+
);
|
|
2602
|
+
}
|
|
2603
|
+
const outpoint = `${base.hex.encode(spent.txid)}:${spent.index}`;
|
|
2604
|
+
const input = byOutpoint.get(outpoint);
|
|
2605
|
+
if (!input) {
|
|
2606
|
+
throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
|
|
2607
|
+
`${context}: checkpoint ${index} spends ${outpoint}, which is not one of the requested virtual outputs`
|
|
2608
|
+
);
|
|
2609
|
+
}
|
|
2610
|
+
const rebuilt = unrollCandidates.some(
|
|
2611
|
+
(unroll) => buildCheckpointTx(input, unroll).tx.id === checkpoint.id
|
|
2612
|
+
);
|
|
2613
|
+
if (!rebuilt) {
|
|
2614
|
+
throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
|
|
2615
|
+
`${context}: checkpoint ${index} txid ${checkpoint.id} differs from the checkpoint built locally for ${outpoint}`
|
|
2616
|
+
);
|
|
2617
|
+
}
|
|
2618
|
+
}
|
|
2619
|
+
}
|
|
2420
2620
|
async function submitOffchainTx(provider, offchainTx, signer, hooks) {
|
|
2421
2621
|
const { arkTx: signedArkTx, userSignedCheckpoints } = await signer.signArkTx(
|
|
2422
2622
|
offchainTx.arkTx,
|
|
@@ -2428,27 +2628,26 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks) {
|
|
|
2428
2628
|
);
|
|
2429
2629
|
}
|
|
2430
2630
|
await hooks?.beforeSubmit?.();
|
|
2431
|
-
const
|
|
2631
|
+
const response = await provider.submitTx(
|
|
2432
2632
|
base.base64.encode(signedArkTx.toPSBT()),
|
|
2433
2633
|
offchainTx.checkpoints.map((c) => base.base64.encode(c.toPSBT()))
|
|
2434
2634
|
);
|
|
2435
|
-
|
|
2436
|
-
|
|
2437
|
-
|
|
2438
|
-
);
|
|
2439
|
-
}
|
|
2635
|
+
assertSubmittedArkTxid(response, signedArkTx, "submitTx");
|
|
2636
|
+
const { arkTxid, signedCheckpointTxs } = response;
|
|
2637
|
+
const matched = matchServerCheckpoints(signedCheckpointTxs, offchainTx.checkpoints, "submitTx");
|
|
2440
2638
|
let finalCheckpoints;
|
|
2441
2639
|
if (userSignedCheckpoints) {
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2640
|
+
const userByTxid = new Map(
|
|
2641
|
+
userSignedCheckpoints.map((c, i) => [offchainTx.checkpoints[i].id, c])
|
|
2642
|
+
);
|
|
2643
|
+
finalCheckpoints = matched.map(({ server, local }) => {
|
|
2644
|
+
combineTapscriptSigs(userByTxid.get(local.id), server);
|
|
2645
|
+
return base.base64.encode(server.toPSBT());
|
|
2446
2646
|
});
|
|
2447
2647
|
} else {
|
|
2448
2648
|
finalCheckpoints = await Promise.all(
|
|
2449
|
-
|
|
2450
|
-
const
|
|
2451
|
-
const signed = await signer.signCheckpoint(tx);
|
|
2649
|
+
matched.map(async ({ server }) => {
|
|
2650
|
+
const signed = await signer.signCheckpoint(server);
|
|
2452
2651
|
return base.base64.encode(signed.toPSBT());
|
|
2453
2652
|
})
|
|
2454
2653
|
);
|
|
@@ -2646,7 +2845,7 @@ function extendCoinWithTapscript(boardingTapscript, utxo) {
|
|
|
2646
2845
|
};
|
|
2647
2846
|
}
|
|
2648
2847
|
function deriveContractTapscripts(contract) {
|
|
2649
|
-
const handler =
|
|
2848
|
+
const handler = chunk37XKN5DZ_cjs.contractHandlers.get(contract.type);
|
|
2650
2849
|
if (!handler) {
|
|
2651
2850
|
throw new Error(`No handler for contract type '${contract.type}'`);
|
|
2652
2851
|
}
|
|
@@ -2717,21 +2916,41 @@ function getRandomId() {
|
|
|
2717
2916
|
}
|
|
2718
2917
|
function isValidArkAddress2(address) {
|
|
2719
2918
|
try {
|
|
2720
|
-
|
|
2919
|
+
chunkCDWLZQQW_cjs.ArkAddress.decode(address);
|
|
2721
2920
|
return true;
|
|
2722
2921
|
} catch (e) {
|
|
2723
2922
|
return false;
|
|
2724
2923
|
}
|
|
2725
2924
|
}
|
|
2726
|
-
function
|
|
2925
|
+
function assertRecipientArkAddress(encoded, address, context) {
|
|
2926
|
+
if (address.hrp !== context.hrp) {
|
|
2927
|
+
throw new Error(
|
|
2928
|
+
`Invalid Arkade address ${encoded}: expected prefix "${context.hrp}", got "${address.hrp}"`
|
|
2929
|
+
);
|
|
2930
|
+
}
|
|
2931
|
+
const { status } = classifyAgainstSignerSet(
|
|
2932
|
+
base.hex.encode(address.serverPubKey),
|
|
2933
|
+
context.signerSet
|
|
2934
|
+
);
|
|
2935
|
+
if (status === "UNKNOWN_SIGNER") {
|
|
2936
|
+
throw new Error(`Invalid Arkade address ${encoded}: unknown operator signer key`);
|
|
2937
|
+
}
|
|
2938
|
+
if (status === "EXPIRED") {
|
|
2939
|
+
throw new Error(
|
|
2940
|
+
`Invalid Arkade address ${encoded}: operator signer key is past its rotation cutoff`
|
|
2941
|
+
);
|
|
2942
|
+
}
|
|
2943
|
+
}
|
|
2944
|
+
function validateRecipients(recipients, dustAmount, context) {
|
|
2727
2945
|
const validatedRecipients = [];
|
|
2728
2946
|
for (const recipient of recipients) {
|
|
2729
2947
|
let address;
|
|
2730
2948
|
try {
|
|
2731
|
-
address =
|
|
2949
|
+
address = chunkCDWLZQQW_cjs.ArkAddress.decode(recipient.address);
|
|
2732
2950
|
} catch (e) {
|
|
2733
2951
|
throw new Error(`Invalid Arkade address: ${recipient.address}`);
|
|
2734
2952
|
}
|
|
2953
|
+
assertRecipientArkAddress(recipient.address, address, context);
|
|
2735
2954
|
const amount = recipient.amount || dustAmount;
|
|
2736
2955
|
if (amount <= 0) {
|
|
2737
2956
|
throw new Error("Amount must be positive");
|
|
@@ -2756,7 +2975,7 @@ function selectPendingRecoveryOutpoints(contractsWithVtxos, signerSet, nowSecond
|
|
|
2756
2975
|
continue;
|
|
2757
2976
|
}
|
|
2758
2977
|
for (const v of vtxos) {
|
|
2759
|
-
if (!
|
|
2978
|
+
if (!chunkCDWLZQQW_cjs.hasTerminalSpend(v) && !v.isSwept) out.add(`${v.txid}:${v.vout}`);
|
|
2760
2979
|
}
|
|
2761
2980
|
}
|
|
2762
2981
|
return out;
|
|
@@ -2789,10 +3008,10 @@ function byValueDescending(vtxos) {
|
|
|
2789
3008
|
return [...vtxos].sort((a, b) => b.value - a.value);
|
|
2790
3009
|
}
|
|
2791
3010
|
async function fetchTimeHeight(wallet) {
|
|
2792
|
-
return
|
|
3011
|
+
return chunkCDWLZQQW_cjs.resolveTimeHeight(wallet.onchainProvider);
|
|
2793
3012
|
}
|
|
2794
3013
|
function canMigrateBySend(vtxo, now) {
|
|
2795
|
-
if (!
|
|
3014
|
+
if (!chunkCDWLZQQW_cjs.canSpendOffchain(vtxo, now)) return false;
|
|
2796
3015
|
return vtxo.expiresAt !== void 0 || vtxo.expiresAtHeight !== void 0;
|
|
2797
3016
|
}
|
|
2798
3017
|
function byExpiryAscending(vtxos, now) {
|
|
@@ -2800,7 +3019,7 @@ function byExpiryAscending(vtxos, now) {
|
|
|
2800
3019
|
if (vtxo.isSwept) return -Infinity;
|
|
2801
3020
|
if (vtxo.expiresAt !== void 0) return vtxo.expiresAt.getTime();
|
|
2802
3021
|
if (vtxo.expiresAtHeight !== void 0) {
|
|
2803
|
-
return
|
|
3022
|
+
return chunkCDWLZQQW_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
|
|
2804
3023
|
}
|
|
2805
3024
|
return Infinity;
|
|
2806
3025
|
};
|
|
@@ -2837,10 +3056,10 @@ var DEFAULT_SETTLEMENT_CONFIG = {
|
|
|
2837
3056
|
};
|
|
2838
3057
|
function getRecoverableVtxos(vtxos, dustAmount, now) {
|
|
2839
3058
|
return vtxos.filter((vtxo) => {
|
|
2840
|
-
if (
|
|
3059
|
+
if (chunkCDWLZQQW_cjs.canRecoverOnchain(vtxo, now)) {
|
|
2841
3060
|
return true;
|
|
2842
3061
|
}
|
|
2843
|
-
if (
|
|
3062
|
+
if (chunkCDWLZQQW_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
|
|
2844
3063
|
return true;
|
|
2845
3064
|
}
|
|
2846
3065
|
return false;
|
|
@@ -2871,7 +3090,7 @@ function getRecoverableWithSubdust(vtxos, dustAmount, now) {
|
|
|
2871
3090
|
}
|
|
2872
3091
|
function isVtxoExpiringSoon(vtxo, thresholdMs) {
|
|
2873
3092
|
const realThresholdMs = thresholdMs <= 100 ? DEFAULT_THRESHOLD_MS : thresholdMs;
|
|
2874
|
-
const expiresAt =
|
|
3093
|
+
const expiresAt = chunkCDWLZQQW_cjs.normalizeVtxo(vtxo).expiresAt;
|
|
2875
3094
|
if (expiresAt === void 0) return false;
|
|
2876
3095
|
const now = Date.now();
|
|
2877
3096
|
const batchExpiry = expiresAt.getTime();
|
|
@@ -2880,7 +3099,7 @@ function isVtxoExpiringSoon(vtxo, thresholdMs) {
|
|
|
2880
3099
|
}
|
|
2881
3100
|
function getExpiringAndRecoverableVtxos(vtxos, thresholdMs, dustAmount, now) {
|
|
2882
3101
|
return vtxos.filter(
|
|
2883
|
-
(vtxo) => isVtxoExpiringSoon(vtxo, thresholdMs) ||
|
|
3102
|
+
(vtxo) => isVtxoExpiringSoon(vtxo, thresholdMs) || chunkCDWLZQQW_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount)
|
|
2884
3103
|
);
|
|
2885
3104
|
}
|
|
2886
3105
|
function isMigrationCapable(wallet) {
|
|
@@ -3362,11 +3581,11 @@ var VtxoManager = class _VtxoManager {
|
|
|
3362
3581
|
`Sweep not economical: output ${outputAmount} sats after ${fee} sats fee is below dust (${dustAmount} sats)`
|
|
3363
3582
|
);
|
|
3364
3583
|
}
|
|
3365
|
-
const tx = new
|
|
3584
|
+
const tx = new chunkCDWLZQQW_cjs.Transaction();
|
|
3366
3585
|
for (const utxo of expiredUtxos) {
|
|
3367
|
-
const utxoScript =
|
|
3586
|
+
const utxoScript = chunkCDWLZQQW_cjs.VtxoScript.decode(utxo.tapTree);
|
|
3368
3587
|
const utxoExitLeaf = utxoScript.leaves.find(
|
|
3369
|
-
(leaf) =>
|
|
3588
|
+
(leaf) => chunkCDWLZQQW_cjs.CSVMultisigTapscript.isScriptValid(chunkCDWLZQQW_cjs.scriptFromTapLeafScript(leaf)) === true
|
|
3370
3589
|
);
|
|
3371
3590
|
if (!utxoExitLeaf) {
|
|
3372
3591
|
throw new Error(
|
|
@@ -3381,7 +3600,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
3381
3600
|
amount: BigInt(utxo.value)
|
|
3382
3601
|
},
|
|
3383
3602
|
tapLeafScript: [utxoExitLeaf],
|
|
3384
|
-
sequence:
|
|
3603
|
+
sequence: chunkCDWLZQQW_cjs.getSequence(utxoExitLeaf)
|
|
3385
3604
|
});
|
|
3386
3605
|
}
|
|
3387
3606
|
tx.addOutputAddress(boardingAddress, outputAmount, this.getNetwork());
|
|
@@ -3615,8 +3834,8 @@ var VtxoManager = class _VtxoManager {
|
|
|
3615
3834
|
if (!serverPubKey) continue;
|
|
3616
3835
|
const cls = classifyAgainstSignerSet(serverPubKey, signerSet, nowSeconds);
|
|
3617
3836
|
if (cls.status === "CURRENT") continue;
|
|
3618
|
-
const recoverable = vtxos.filter((v) => v.isSwept && !
|
|
3619
|
-
const spendable = vtxos.filter((v) => !
|
|
3837
|
+
const recoverable = vtxos.filter((v) => v.isSwept && !chunkCDWLZQQW_cjs.hasTerminalSpend(v));
|
|
3838
|
+
const spendable = vtxos.filter((v) => !chunkCDWLZQQW_cjs.hasTerminalSpend(v) && !v.isSwept);
|
|
3620
3839
|
const value = spendable.reduce((sum, v) => sum + v.value, 0);
|
|
3621
3840
|
let recoverableCount = 0;
|
|
3622
3841
|
let recoverableValue = 0;
|
|
@@ -3629,7 +3848,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
3629
3848
|
awaitingSweepCount = spendable.length;
|
|
3630
3849
|
awaitingSweepValue = value;
|
|
3631
3850
|
for (const v of spendable) {
|
|
3632
|
-
const exp =
|
|
3851
|
+
const exp = chunkCDWLZQQW_cjs.toBatchExpiry(v);
|
|
3633
3852
|
if (exp !== void 0 && (nextSweepEta === void 0 || exp < nextSweepEta)) {
|
|
3634
3853
|
nextSweepEta = exp;
|
|
3635
3854
|
}
|
|
@@ -3890,7 +4109,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
3890
4109
|
/** Decodes the boarding tapscript exit path to extract the CSV timelock. */
|
|
3891
4110
|
getBoardingTimelock() {
|
|
3892
4111
|
const wallet = this.getSweepWallet();
|
|
3893
|
-
const exitScript =
|
|
4112
|
+
const exitScript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(
|
|
3894
4113
|
base.hex.decode(wallet.boardingTapscript.exitScript)
|
|
3895
4114
|
);
|
|
3896
4115
|
return exitScript.params.timelock;
|
|
@@ -4021,8 +4240,8 @@ var VtxoManager = class _VtxoManager {
|
|
|
4021
4240
|
* or doesn't carry the metadata.
|
|
4022
4241
|
*/
|
|
4023
4242
|
extractSpentOutpoint(error) {
|
|
4024
|
-
const ark =
|
|
4025
|
-
if (!
|
|
4243
|
+
const ark = chunkCDWLZQQW_cjs.maybeArkError(error);
|
|
4244
|
+
if (!chunkCDWLZQQW_cjs.isArkError(ark, chunkCDWLZQQW_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
|
|
4026
4245
|
const raw = ark.metadata?.vtxo_outpoint;
|
|
4027
4246
|
if (typeof raw !== "string") return void 0;
|
|
4028
4247
|
const [txid, voutStr] = raw.split(":");
|
|
@@ -4212,7 +4431,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
4212
4431
|
if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
|
|
4213
4432
|
break;
|
|
4214
4433
|
}
|
|
4215
|
-
const inputFee = estimator.evalOffchainInput(
|
|
4434
|
+
const inputFee = estimator.evalOffchainInput(chunkCDWLZQQW_cjs.toOffchainInputFeeParams(v));
|
|
4216
4435
|
if (inputFee.satoshis >= v.value) {
|
|
4217
4436
|
continue;
|
|
4218
4437
|
}
|
|
@@ -4232,7 +4451,7 @@ var VtxoManager = class _VtxoManager {
|
|
|
4232
4451
|
const arkAddress = await this.wallet.getAddress();
|
|
4233
4452
|
const outputFee = estimator.evalOffchainOutput({
|
|
4234
4453
|
amount: totalAmount,
|
|
4235
|
-
script: base.hex.encode(
|
|
4454
|
+
script: base.hex.encode(chunkCDWLZQQW_cjs.ArkAddress.decode(arkAddress).pkScript)
|
|
4236
4455
|
});
|
|
4237
4456
|
totalAmount -= BigInt(outputFee.satoshis);
|
|
4238
4457
|
if (totalAmount < dustAmount) return;
|
|
@@ -4312,7 +4531,7 @@ var ArkNote = class _ArkNote {
|
|
|
4312
4531
|
this.value = value;
|
|
4313
4532
|
this.HRP = HRP;
|
|
4314
4533
|
const preimageHash = utils_js.sha256(this.preimage);
|
|
4315
|
-
this.vtxoScript = new
|
|
4534
|
+
this.vtxoScript = new chunkCDWLZQQW_cjs.VtxoScript([noteTapscript(preimageHash)]);
|
|
4316
4535
|
const leaf = this.vtxoScript.leaves[0];
|
|
4317
4536
|
this.txid = base.hex.encode(new Uint8Array(preimageHash).reverse());
|
|
4318
4537
|
this.tapTree = this.vtxoScript.encode();
|
|
@@ -4479,7 +4698,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
4479
4698
|
const privateKey = data.slice(1, 33);
|
|
4480
4699
|
const serverPubKey = data.slice(33, 65);
|
|
4481
4700
|
const sequence = new DataView(data.buffer, data.byteOffset + 65, 4).getUint32(0, false);
|
|
4482
|
-
const csvTimelock =
|
|
4701
|
+
const csvTimelock = chunkCDWLZQQW_cjs.sequenceToTimelock(sequence);
|
|
4483
4702
|
return new _ArkadeCash(privateKey, serverPubKey, csvTimelock, decoded.prefix);
|
|
4484
4703
|
}
|
|
4485
4704
|
toString() {
|
|
@@ -4487,7 +4706,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
4487
4706
|
data[0] = _ArkadeCash.Version;
|
|
4488
4707
|
data.set(this._privateKey, 1);
|
|
4489
4708
|
data.set(this._serverPubKey, 33);
|
|
4490
|
-
const sequence =
|
|
4709
|
+
const sequence = chunkCDWLZQQW_cjs.timelockToSequence(this.csvTimelock);
|
|
4491
4710
|
new DataView(data.buffer, data.byteOffset + 65, 4).setUint32(0, sequence, false);
|
|
4492
4711
|
const words = base.bech32m.toWords(data);
|
|
4493
4712
|
return base.bech32m.encode(this.hrp, words, 1023);
|
|
@@ -4496,7 +4715,7 @@ var ArkadeCash = class _ArkadeCash {
|
|
|
4496
4715
|
return SingleKey.fromPrivateKey(this._privateKey);
|
|
4497
4716
|
}
|
|
4498
4717
|
get vtxoScript() {
|
|
4499
|
-
return new
|
|
4718
|
+
return new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
|
|
4500
4719
|
pubKey: this._publicKey,
|
|
4501
4720
|
serverPubKey: this._serverPubKey,
|
|
4502
4721
|
csvTimelock: this.csvTimelock
|
|
@@ -4757,7 +4976,7 @@ async function captureExitBranch(params) {
|
|
|
4757
4976
|
const nonCommitment = ordered.filter((c) => chainTxTypeToChainedExit(c.type) !== 1 /* Commitment */).map((c) => c.txid);
|
|
4758
4977
|
if (nonCommitment.length > 0) {
|
|
4759
4978
|
for (const psbt of await resolver.getVirtualTxs(nonCommitment)) {
|
|
4760
|
-
psbtByTxid.set(
|
|
4979
|
+
psbtByTxid.set(chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
4761
4980
|
}
|
|
4762
4981
|
}
|
|
4763
4982
|
}
|
|
@@ -4800,10 +5019,10 @@ var IndexerExitDataSource = class {
|
|
|
4800
5019
|
while (hasMore) {
|
|
4801
5020
|
const { chain: page, page: meta } = await this.indexer.getVtxoChain(
|
|
4802
5021
|
{ txid: vtxo.txid, vout: vtxo.vout },
|
|
4803
|
-
{ pageIndex, pageSize:
|
|
5022
|
+
{ pageIndex, pageSize: chunkCDWLZQQW_cjs.DEFAULT_PAGE_SIZE }
|
|
4804
5023
|
);
|
|
4805
5024
|
chain.push(...page);
|
|
4806
|
-
hasMore = meta ? page.length ===
|
|
5025
|
+
hasMore = meta ? page.length === chunkCDWLZQQW_cjs.DEFAULT_PAGE_SIZE : false;
|
|
4807
5026
|
pageIndex++;
|
|
4808
5027
|
}
|
|
4809
5028
|
return chain;
|
|
@@ -4815,12 +5034,12 @@ var IndexerExitDataSource = class {
|
|
|
4815
5034
|
while (hasMore) {
|
|
4816
5035
|
const { txs, page } = await this.indexer.getVirtualTxs(txids, {
|
|
4817
5036
|
pageIndex,
|
|
4818
|
-
pageSize:
|
|
5037
|
+
pageSize: chunkCDWLZQQW_cjs.DEFAULT_PAGE_SIZE
|
|
4819
5038
|
});
|
|
4820
5039
|
for (const psbt of txs) {
|
|
4821
|
-
out.set(
|
|
5040
|
+
out.set(chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
4822
5041
|
}
|
|
4823
|
-
hasMore = page ? txs.length ===
|
|
5042
|
+
hasMore = page ? txs.length === chunkCDWLZQQW_cjs.DEFAULT_PAGE_SIZE : false;
|
|
4824
5043
|
pageIndex++;
|
|
4825
5044
|
}
|
|
4826
5045
|
return out;
|
|
@@ -4841,7 +5060,7 @@ function chainedTxTypeToChainTxType(t) {
|
|
|
4841
5060
|
}
|
|
4842
5061
|
}
|
|
4843
5062
|
function psbtInputTxids(psbtBase64) {
|
|
4844
|
-
const tx =
|
|
5063
|
+
const tx = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
|
|
4845
5064
|
const ids = [];
|
|
4846
5065
|
for (let i = 0; i < tx.inputsLength; i++) {
|
|
4847
5066
|
const txid = tx.getInput(i).txid;
|
|
@@ -5189,10 +5408,10 @@ async function resolveArkInfo(arkProvider, walletRepository) {
|
|
|
5189
5408
|
try {
|
|
5190
5409
|
info = await arkProvider.getInfo();
|
|
5191
5410
|
} catch (err) {
|
|
5192
|
-
if (!
|
|
5411
|
+
if (!chunkCDWLZQQW_cjs.isRetryableProviderError(err)) throw err;
|
|
5193
5412
|
const snapshot = await loadArkInfoSnapshot(walletRepository);
|
|
5194
5413
|
if (!snapshot) {
|
|
5195
|
-
throw new
|
|
5414
|
+
throw new chunkCDWLZQQW_cjs.ProviderUnavailableError(
|
|
5196
5415
|
"Arkade server info is unavailable and no cached snapshot exists",
|
|
5197
5416
|
{ cause: err }
|
|
5198
5417
|
);
|
|
@@ -5575,7 +5794,7 @@ function collectArkTxidsNeedingCreatedAt(vtxos) {
|
|
|
5575
5794
|
return [...txids];
|
|
5576
5795
|
}
|
|
5577
5796
|
async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnore, resolveTxCreatedAt) {
|
|
5578
|
-
const fromOldestVtxo = vtxos.map(
|
|
5797
|
+
const fromOldestVtxo = vtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
|
|
5579
5798
|
const txidsNeedingCreatedAt = resolveTxCreatedAt ? collectArkTxidsNeedingCreatedAt(fromOldestVtxo) : [];
|
|
5580
5799
|
const resolvedCreatedAt = resolveTxCreatedAt && txidsNeedingCreatedAt.length > 0 ? await resolveTxCreatedAt(txidsNeedingCreatedAt) : /* @__PURE__ */ new Map();
|
|
5581
5800
|
const unmatchedSettledBoardingTxs = allBoardingTxs.filter(isSettledBoardingReceive).sort((a, b) => a.createdAt - b.createdAt);
|
|
@@ -5739,7 +5958,7 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
5739
5958
|
const virtualCoins = await this.wallet.getVtxos({
|
|
5740
5959
|
withRecoverable: false
|
|
5741
5960
|
});
|
|
5742
|
-
const controlAssetRef = params.controlAssetId ?
|
|
5961
|
+
const controlAssetRef = params.controlAssetId ? chunk24YNIQSW_cjs.AssetRef.fromId(chunk24YNIQSW_cjs.AssetId.fromString(params.controlAssetId)) : null;
|
|
5743
5962
|
const coinSelection = selectVirtualCoins(virtualCoins, Number(this.wallet.dustAmount));
|
|
5744
5963
|
let totalBtcSelected = 0n;
|
|
5745
5964
|
const assetChanges = /* @__PURE__ */ new Map();
|
|
@@ -5752,8 +5971,8 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
5752
5971
|
}
|
|
5753
5972
|
}
|
|
5754
5973
|
const groups = [];
|
|
5755
|
-
const issuedAssetOutput =
|
|
5756
|
-
const issuedAssetGroup =
|
|
5974
|
+
const issuedAssetOutput = chunk24YNIQSW_cjs.AssetOutput.create(0, params.amount);
|
|
5975
|
+
const issuedAssetGroup = chunk24YNIQSW_cjs.AssetGroup.create(
|
|
5757
5976
|
null,
|
|
5758
5977
|
controlAssetRef,
|
|
5759
5978
|
[],
|
|
@@ -5768,28 +5987,28 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
5768
5987
|
for (const [inputIndex, assets] of assetInputs) {
|
|
5769
5988
|
for (const asset of assets) {
|
|
5770
5989
|
if (asset.assetId !== assetId) continue;
|
|
5771
|
-
changeInputs.push(
|
|
5990
|
+
changeInputs.push(chunk24YNIQSW_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
5772
5991
|
}
|
|
5773
5992
|
}
|
|
5774
5993
|
groups.push(
|
|
5775
|
-
|
|
5776
|
-
|
|
5994
|
+
chunk24YNIQSW_cjs.AssetGroup.create(
|
|
5995
|
+
chunk24YNIQSW_cjs.AssetId.fromString(assetId),
|
|
5777
5996
|
null,
|
|
5778
5997
|
changeInputs,
|
|
5779
|
-
[
|
|
5998
|
+
[chunk24YNIQSW_cjs.AssetOutput.create(0, amount)],
|
|
5780
5999
|
[]
|
|
5781
6000
|
)
|
|
5782
6001
|
);
|
|
5783
6002
|
}
|
|
5784
6003
|
}
|
|
5785
6004
|
const address = await this.wallet.getAddress();
|
|
5786
|
-
const outputAddress =
|
|
6005
|
+
const outputAddress = chunkCDWLZQQW_cjs.ArkAddress.decode(address);
|
|
5787
6006
|
const outputs = [
|
|
5788
6007
|
{
|
|
5789
6008
|
script: outputAddress.pkScript,
|
|
5790
6009
|
amount: BigInt(totalBtcSelected)
|
|
5791
6010
|
},
|
|
5792
|
-
Extension.create([
|
|
6011
|
+
Extension.create([chunk24YNIQSW_cjs.Packet.create(groups)]).txOut()
|
|
5793
6012
|
];
|
|
5794
6013
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(
|
|
5795
6014
|
coinSelection.inputs,
|
|
@@ -5797,7 +6016,7 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
5797
6016
|
);
|
|
5798
6017
|
return {
|
|
5799
6018
|
arkTxId: arkTxid,
|
|
5800
|
-
assetId:
|
|
6019
|
+
assetId: chunk24YNIQSW_cjs.AssetId.create(arkTxid, 0).toString()
|
|
5801
6020
|
};
|
|
5802
6021
|
}
|
|
5803
6022
|
/**
|
|
@@ -5869,16 +6088,16 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
5869
6088
|
for (const [inputIndex, assets] of assetInputs) {
|
|
5870
6089
|
for (const asset of assets) {
|
|
5871
6090
|
if (asset.assetId !== params.assetId) continue;
|
|
5872
|
-
reissueInputs.push(
|
|
6091
|
+
reissueInputs.push(chunk24YNIQSW_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
5873
6092
|
}
|
|
5874
6093
|
}
|
|
5875
6094
|
const totalAssetAmount = assetToReissueAmount + params.amount;
|
|
5876
|
-
const reissueAssetIdObj =
|
|
5877
|
-
const reissueAssetGroup =
|
|
6095
|
+
const reissueAssetIdObj = chunk24YNIQSW_cjs.AssetId.fromString(params.assetId);
|
|
6096
|
+
const reissueAssetGroup = chunk24YNIQSW_cjs.AssetGroup.create(
|
|
5878
6097
|
reissueAssetIdObj,
|
|
5879
6098
|
null,
|
|
5880
6099
|
reissueInputs,
|
|
5881
|
-
[
|
|
6100
|
+
[chunk24YNIQSW_cjs.AssetOutput.create(0, totalAssetAmount)],
|
|
5882
6101
|
[]
|
|
5883
6102
|
);
|
|
5884
6103
|
const groups = [reissueAssetGroup];
|
|
@@ -5887,27 +6106,27 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
5887
6106
|
for (const [inputIndex, assets] of assetInputs) {
|
|
5888
6107
|
for (const asset of assets) {
|
|
5889
6108
|
if (asset.assetId !== assetId) continue;
|
|
5890
|
-
changeInputs.push(
|
|
6109
|
+
changeInputs.push(chunk24YNIQSW_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
5891
6110
|
}
|
|
5892
6111
|
}
|
|
5893
6112
|
groups.push(
|
|
5894
|
-
|
|
5895
|
-
|
|
6113
|
+
chunk24YNIQSW_cjs.AssetGroup.create(
|
|
6114
|
+
chunk24YNIQSW_cjs.AssetId.fromString(assetId),
|
|
5896
6115
|
null,
|
|
5897
6116
|
changeInputs,
|
|
5898
|
-
[
|
|
6117
|
+
[chunk24YNIQSW_cjs.AssetOutput.create(0, amount)],
|
|
5899
6118
|
[]
|
|
5900
6119
|
)
|
|
5901
6120
|
);
|
|
5902
6121
|
}
|
|
5903
6122
|
const address = await this.wallet.getAddress();
|
|
5904
|
-
const outputAddress =
|
|
6123
|
+
const outputAddress = chunkCDWLZQQW_cjs.ArkAddress.decode(address);
|
|
5905
6124
|
const outputs = [
|
|
5906
6125
|
{
|
|
5907
6126
|
script: outputAddress.pkScript,
|
|
5908
6127
|
amount: BigInt(totalBtcSelected)
|
|
5909
6128
|
},
|
|
5910
|
-
Extension.create([
|
|
6129
|
+
Extension.create([chunk24YNIQSW_cjs.Packet.create(groups)]).txOut()
|
|
5911
6130
|
];
|
|
5912
6131
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
|
|
5913
6132
|
return arkTxid;
|
|
@@ -5974,27 +6193,27 @@ var AssetManager = class extends ReadonlyAssetManager {
|
|
|
5974
6193
|
for (const [inputIndex, assets] of assetInputs) {
|
|
5975
6194
|
for (const asset of assets) {
|
|
5976
6195
|
if (asset.assetId !== assetId) continue;
|
|
5977
|
-
changeInputs.push(
|
|
6196
|
+
changeInputs.push(chunk24YNIQSW_cjs.AssetInput.create(inputIndex, asset.amount));
|
|
5978
6197
|
}
|
|
5979
6198
|
}
|
|
5980
6199
|
groups.push(
|
|
5981
|
-
|
|
5982
|
-
|
|
6200
|
+
chunk24YNIQSW_cjs.AssetGroup.create(
|
|
6201
|
+
chunk24YNIQSW_cjs.AssetId.fromString(assetId),
|
|
5983
6202
|
null,
|
|
5984
6203
|
changeInputs,
|
|
5985
|
-
amount > 0n ? [
|
|
6204
|
+
amount > 0n ? [chunk24YNIQSW_cjs.AssetOutput.create(0, amount)] : [],
|
|
5986
6205
|
[]
|
|
5987
6206
|
)
|
|
5988
6207
|
);
|
|
5989
6208
|
}
|
|
5990
6209
|
const address = await this.wallet.getAddress();
|
|
5991
|
-
const outputAddress =
|
|
6210
|
+
const outputAddress = chunkCDWLZQQW_cjs.ArkAddress.decode(address);
|
|
5992
6211
|
const outputs = [
|
|
5993
6212
|
{
|
|
5994
6213
|
script: outputAddress.pkScript,
|
|
5995
6214
|
amount: BigInt(totalBtcSelected)
|
|
5996
6215
|
},
|
|
5997
|
-
Extension.create([
|
|
6216
|
+
Extension.create([chunk24YNIQSW_cjs.Packet.create(groups)]).txOut()
|
|
5998
6217
|
];
|
|
5999
6218
|
const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
|
|
6000
6219
|
return arkTxid;
|
|
@@ -6019,7 +6238,7 @@ function castMetadata(metadata) {
|
|
|
6019
6238
|
} else {
|
|
6020
6239
|
throw new Error("Invalid metadata value type");
|
|
6021
6240
|
}
|
|
6022
|
-
md.push(
|
|
6241
|
+
md.push(chunk24YNIQSW_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
|
|
6023
6242
|
}
|
|
6024
6243
|
return md;
|
|
6025
6244
|
}
|
|
@@ -6040,10 +6259,10 @@ var DelegateManagerImpl = class {
|
|
|
6040
6259
|
if (vtxos.length === 0) {
|
|
6041
6260
|
return { delegated: [], failed: [] };
|
|
6042
6261
|
}
|
|
6043
|
-
const destinationScript =
|
|
6262
|
+
const destinationScript = chunkCDWLZQQW_cjs.ArkAddress.decode(destination).pkScript;
|
|
6044
6263
|
const arkInfo = await this.arkInfoProvider.getInfo();
|
|
6045
6264
|
const delegateInfo = await this.delegateProvider.getDelegateInfo();
|
|
6046
|
-
const eligible = vtxos.map(
|
|
6265
|
+
const eligible = vtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo).filter(
|
|
6047
6266
|
(v) => isAnnotated(v) && findDelegateTapLeaf(v, delegateInfo.pubkey) !== void 0
|
|
6048
6267
|
);
|
|
6049
6268
|
if (eligible.length === 0) {
|
|
@@ -6072,11 +6291,11 @@ var DelegateManagerImpl = class {
|
|
|
6072
6291
|
const groupByExpiry = /* @__PURE__ */ new Map();
|
|
6073
6292
|
let recoverableVtxos = [];
|
|
6074
6293
|
for (const vtxo of eligible) {
|
|
6075
|
-
if (
|
|
6294
|
+
if (chunkCDWLZQQW_cjs.canRecoverOnchain(vtxo, now)) {
|
|
6076
6295
|
recoverableVtxos.push(vtxo);
|
|
6077
6296
|
continue;
|
|
6078
6297
|
}
|
|
6079
|
-
const expiry =
|
|
6298
|
+
const expiry = chunkCDWLZQQW_cjs.toBatchExpiry(vtxo);
|
|
6080
6299
|
if (!expiry) continue;
|
|
6081
6300
|
const dayKey = getDayTimestamp(expiry);
|
|
6082
6301
|
groupByExpiry.set(dayKey, [...groupByExpiry.get(dayKey) ?? [], vtxo]);
|
|
@@ -6141,7 +6360,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
6141
6360
|
}
|
|
6142
6361
|
if (!delegateAt) {
|
|
6143
6362
|
const now = { timestamp: /* @__PURE__ */ new Date() };
|
|
6144
|
-
const expiryTimestamp = vtxos.filter((coin) => !
|
|
6363
|
+
const expiryTimestamp = vtxos.filter((coin) => !chunkCDWLZQQW_cjs.canRecoverOnchain(coin, now) && chunkCDWLZQQW_cjs.toBatchExpiry(coin)).reduce((min, coin) => Math.min(min, chunkCDWLZQQW_cjs.toBatchExpiry(coin)), Number.MAX_SAFE_INTEGER);
|
|
6145
6364
|
if (!expiryTimestamp || expiryTimestamp === Number.MAX_SAFE_INTEGER) {
|
|
6146
6365
|
delegateAt = new Date(Date.now() + 1 * 60 * 1e3);
|
|
6147
6366
|
} else {
|
|
@@ -6170,7 +6389,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
6170
6389
|
let amount = 0n;
|
|
6171
6390
|
for (const coin of vtxos) {
|
|
6172
6391
|
const inputFee = estimator.evalOffchainInput({
|
|
6173
|
-
...
|
|
6392
|
+
...chunkCDWLZQQW_cjs.toOffchainInputFeeParams(coin),
|
|
6174
6393
|
type: "vtxo"
|
|
6175
6394
|
});
|
|
6176
6395
|
if (inputFee.value >= coin.value) {
|
|
@@ -6184,7 +6403,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
6184
6403
|
const delegateFee = BigInt(Number(fee));
|
|
6185
6404
|
if (delegateFee > 0n) {
|
|
6186
6405
|
outputs.push({
|
|
6187
|
-
script:
|
|
6406
|
+
script: chunkCDWLZQQW_cjs.ArkAddress.decode(delegateAddress).pkScript,
|
|
6188
6407
|
amount: delegateFee
|
|
6189
6408
|
});
|
|
6190
6409
|
}
|
|
@@ -6217,10 +6436,10 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
|
|
|
6217
6436
|
destinationScript
|
|
6218
6437
|
);
|
|
6219
6438
|
const forfeitOutputScript = btcSigner.OutScript.encode(
|
|
6220
|
-
btcSigner.Address(
|
|
6439
|
+
btcSigner.Address(chunkCDWLZQQW_cjs.getNetwork(network)).decode(forfeitAddress)
|
|
6221
6440
|
);
|
|
6222
6441
|
const forfeits = await Promise.all(
|
|
6223
|
-
vtxos.filter((v) => !
|
|
6442
|
+
vtxos.filter((v) => !chunkCDWLZQQW_cjs.canRecoverOnchain(v, { timestamp: /* @__PURE__ */ new Date() })).map(async (coin) => {
|
|
6224
6443
|
const forfeit = await makeDelegateForfeitTx(
|
|
6225
6444
|
coin,
|
|
6226
6445
|
dust,
|
|
@@ -6245,7 +6464,7 @@ async function makeDelegateForfeitTx(input, connectorAmount, delegatePubkey, for
|
|
|
6245
6464
|
index: input.vout,
|
|
6246
6465
|
witnessUtxo: {
|
|
6247
6466
|
amount: BigInt(input.value),
|
|
6248
|
-
script:
|
|
6467
|
+
script: chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
6249
6468
|
},
|
|
6250
6469
|
sighashType: btcSigner.SigHash.ALL_ANYONECANPAY,
|
|
6251
6470
|
tapLeafScript: [delegateTapLeaf]
|
|
@@ -6303,7 +6522,7 @@ async function makeSignedDelegateIntent(identity, coins, outputs, onchainOutputs
|
|
|
6303
6522
|
expire_at: 0,
|
|
6304
6523
|
cosigners_public_keys: cosignerPubKeys
|
|
6305
6524
|
};
|
|
6306
|
-
const proof =
|
|
6525
|
+
const proof = chunkCDWLZQQW_cjs.Intent.create(message, coins, outputs);
|
|
6307
6526
|
const signedProof = await identity.sign(proof);
|
|
6308
6527
|
return {
|
|
6309
6528
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -6321,10 +6540,10 @@ function getDayTimestamp(timestamp) {
|
|
|
6321
6540
|
function findDelegateTapLeaf(vtxo, delegatePubkey) {
|
|
6322
6541
|
if (!vtxo.tapTree) return void 0;
|
|
6323
6542
|
const pk = delegatePubkey.length === 66 ? delegatePubkey.slice(2) : delegatePubkey;
|
|
6324
|
-
const vtxoScript =
|
|
6543
|
+
const vtxoScript = chunkCDWLZQQW_cjs.VtxoScript.decode(vtxo.tapTree);
|
|
6325
6544
|
return vtxoScript.leaves.find((tapLeaf) => {
|
|
6326
|
-
const arkTapscript =
|
|
6327
|
-
if (!
|
|
6545
|
+
const arkTapscript = chunkCDWLZQQW_cjs.decodeTapscript(chunkCDWLZQQW_cjs.scriptFromTapLeafScript(tapLeaf));
|
|
6546
|
+
if (!chunkCDWLZQQW_cjs.MultisigTapscript.is(arkTapscript)) return false;
|
|
6328
6547
|
return arkTapscript.params.pubkeys.map(base.hex.encode).includes(pk);
|
|
6329
6548
|
});
|
|
6330
6549
|
}
|
|
@@ -6512,7 +6731,7 @@ async function closeDatabase(dbName) {
|
|
|
6512
6731
|
return true;
|
|
6513
6732
|
}
|
|
6514
6733
|
function scriptFromArkAddress(address) {
|
|
6515
|
-
return base.hex.encode(
|
|
6734
|
+
return base.hex.encode(chunkCDWLZQQW_cjs.ArkAddress.decode(address).pkScript);
|
|
6516
6735
|
}
|
|
6517
6736
|
|
|
6518
6737
|
// src/repositories/indexedDB/schema.ts
|
|
@@ -7009,7 +7228,7 @@ function validateVtxosForScript(vtxos, script, context) {
|
|
|
7009
7228
|
}
|
|
7010
7229
|
async function getVtxosForContract(repo, contract) {
|
|
7011
7230
|
const vtxos = repo.getVtxosForScript ? await repo.getVtxosForScript(contract.script) : filterVtxosForScript(await repo.getVtxos(contract.address), contract.script);
|
|
7012
|
-
return vtxos.map(
|
|
7231
|
+
return vtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo);
|
|
7013
7232
|
}
|
|
7014
7233
|
async function saveVtxosForContract(repo, contract, vtxos) {
|
|
7015
7234
|
if (repo.saveVtxosForScript) {
|
|
@@ -7213,7 +7432,7 @@ var deserializeTapLeaf = (t) => {
|
|
|
7213
7432
|
const s = base.hex.decode(t.s);
|
|
7214
7433
|
return [cb, s];
|
|
7215
7434
|
};
|
|
7216
|
-
var deserializeVtxo = (o) =>
|
|
7435
|
+
var deserializeVtxo = (o) => chunkCDWLZQQW_cjs.normalizeVtxo({
|
|
7217
7436
|
...o,
|
|
7218
7437
|
createdAt: new Date(o.createdAt),
|
|
7219
7438
|
tapTree: base.hex.decode(o.tapTree),
|
|
@@ -8352,7 +8571,7 @@ var ContractWatcher = class {
|
|
|
8352
8571
|
this.connectionState = "connected";
|
|
8353
8572
|
this.reconnectAttempts = 0;
|
|
8354
8573
|
this.listenLoop().catch((e) => {
|
|
8355
|
-
if (
|
|
8574
|
+
if (chunkCDWLZQQW_cjs.isEventSourceError(e)) {
|
|
8356
8575
|
console.debug("ContractWatcher subscription disconnected; reconnecting");
|
|
8357
8576
|
} else {
|
|
8358
8577
|
console.error(e);
|
|
@@ -8581,14 +8800,14 @@ var ContractWatcher = class {
|
|
|
8581
8800
|
const timestamp = Date.now();
|
|
8582
8801
|
if (update.newVtxos?.length) {
|
|
8583
8802
|
this.processSubscriptionVtxos(
|
|
8584
|
-
update.newVtxos.map(
|
|
8803
|
+
update.newVtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo),
|
|
8585
8804
|
"vtxo_received",
|
|
8586
8805
|
timestamp
|
|
8587
8806
|
);
|
|
8588
8807
|
}
|
|
8589
8808
|
if (update.spentVtxos?.length) {
|
|
8590
8809
|
this.processSubscriptionVtxos(
|
|
8591
|
-
update.spentVtxos.map(
|
|
8810
|
+
update.spentVtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo),
|
|
8592
8811
|
"vtxo_spent",
|
|
8593
8812
|
timestamp
|
|
8594
8813
|
);
|
|
@@ -8721,7 +8940,7 @@ async function reconcileIntents(deps) {
|
|
|
8721
8940
|
let vtxosByOutpoint = /* @__PURE__ */ new Map();
|
|
8722
8941
|
if (outpoints.length > 0) {
|
|
8723
8942
|
try {
|
|
8724
|
-
const { vtxos } = await
|
|
8943
|
+
const { vtxos } = await chunkCDWLZQQW_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
|
|
8725
8944
|
vtxosByOutpoint = new Map(vtxos.map((v) => [outpointKey(v), v]));
|
|
8726
8945
|
} catch (e) {
|
|
8727
8946
|
console.error("reconcileIntents: failed to fetch input VTXO state", e);
|
|
@@ -8841,7 +9060,7 @@ var ContractManager = class _ContractManager {
|
|
|
8841
9060
|
await this.reconcileWatched();
|
|
8842
9061
|
this.markSyncOnline();
|
|
8843
9062
|
} catch (err) {
|
|
8844
|
-
if (!
|
|
9063
|
+
if (!chunkCDWLZQQW_cjs.isRetryableProviderError(err)) throw err;
|
|
8845
9064
|
this.markSyncDegraded(err);
|
|
8846
9065
|
}
|
|
8847
9066
|
this.initialized = true;
|
|
@@ -8953,7 +9172,7 @@ var ContractManager = class _ContractManager {
|
|
|
8953
9172
|
const from = Math.max(0, watermark - lookAhead.size);
|
|
8954
9173
|
const to = watermark + lookAhead.size;
|
|
8955
9174
|
const deps = lookAhead.candidateDeps();
|
|
8956
|
-
const handlers =
|
|
9175
|
+
const handlers = chunk37XKN5DZ_cjs.contractHandlers.getRegisteredTypes().map((t) => chunk37XKN5DZ_cjs.contractHandlers.get(t)).filter(hasCandidates);
|
|
8957
9176
|
const band = /* @__PURE__ */ new Map();
|
|
8958
9177
|
for (let index = from; index <= to; index++) {
|
|
8959
9178
|
const descriptor = lookAhead.materialize(index);
|
|
@@ -8964,7 +9183,7 @@ var ContractManager = class _ContractManager {
|
|
|
8964
9183
|
index,
|
|
8965
9184
|
params: {
|
|
8966
9185
|
...candidate,
|
|
8967
|
-
...
|
|
9186
|
+
...chunk37XKN5DZ_cjs.speculativeReceiveMetadata(descriptor)
|
|
8968
9187
|
}
|
|
8969
9188
|
});
|
|
8970
9189
|
}
|
|
@@ -9024,7 +9243,7 @@ var ContractManager = class _ContractManager {
|
|
|
9024
9243
|
});
|
|
9025
9244
|
for (const entry of pending) entry.catchUpPending = false;
|
|
9026
9245
|
} catch (err) {
|
|
9027
|
-
if (!
|
|
9246
|
+
if (!chunkCDWLZQQW_cjs.isRetryableProviderError(err)) throw err;
|
|
9028
9247
|
this.markSyncDegraded(err);
|
|
9029
9248
|
}
|
|
9030
9249
|
}
|
|
@@ -9068,7 +9287,7 @@ var ContractManager = class _ContractManager {
|
|
|
9068
9287
|
await this.fetchContractVxosFromIndexer([contract]);
|
|
9069
9288
|
this.markSyncOnline();
|
|
9070
9289
|
} catch (err) {
|
|
9071
|
-
if (!
|
|
9290
|
+
if (!chunkCDWLZQQW_cjs.isRetryableProviderError(err)) throw err;
|
|
9072
9291
|
this.markSyncDegraded(err);
|
|
9073
9292
|
}
|
|
9074
9293
|
await this.watcher.addContract(contract);
|
|
@@ -9105,7 +9324,7 @@ var ContractManager = class _ContractManager {
|
|
|
9105
9324
|
return result;
|
|
9106
9325
|
}
|
|
9107
9326
|
async upsertContractRow(params) {
|
|
9108
|
-
const handler =
|
|
9327
|
+
const handler = chunk37XKN5DZ_cjs.contractHandlers.get(params.type);
|
|
9109
9328
|
if (!handler) {
|
|
9110
9329
|
throw new Error(`No handler registered for contract type '${params.type}'`);
|
|
9111
9330
|
}
|
|
@@ -9205,7 +9424,7 @@ var ContractManager = class _ContractManager {
|
|
|
9205
9424
|
`scanContracts: batchSize must be a positive integer (got ${String(opts.batchSize)})`
|
|
9206
9425
|
);
|
|
9207
9426
|
}
|
|
9208
|
-
const registered =
|
|
9427
|
+
const registered = chunk37XKN5DZ_cjs.contractHandlers.getRegisteredTypes().map((t) => chunk37XKN5DZ_cjs.contractHandlers.get(t)).filter(isDiscoverable);
|
|
9209
9428
|
const discoverables = [
|
|
9210
9429
|
...registered.filter((h) => h.type === "boarding"),
|
|
9211
9430
|
...registered.filter((h) => h.type !== "boarding")
|
|
@@ -9340,7 +9559,7 @@ var ContractManager = class _ContractManager {
|
|
|
9340
9559
|
await this.syncContracts({ contracts, pageSize });
|
|
9341
9560
|
this.markSyncOnline();
|
|
9342
9561
|
} catch (err) {
|
|
9343
|
-
if (!
|
|
9562
|
+
if (!chunkCDWLZQQW_cjs.isRetryableProviderError(err)) throw err;
|
|
9344
9563
|
this.markSyncDegraded(err);
|
|
9345
9564
|
}
|
|
9346
9565
|
const vtxos = await this.getVtxosForContracts(contracts);
|
|
@@ -9361,7 +9580,7 @@ var ContractManager = class _ContractManager {
|
|
|
9361
9580
|
}
|
|
9362
9581
|
const tapscriptCache = /* @__PURE__ */ new Map();
|
|
9363
9582
|
return vtxos.map(
|
|
9364
|
-
(vtxo) => extendVirtualCoinForContract(
|
|
9583
|
+
(vtxo) => extendVirtualCoinForContract(chunkCDWLZQQW_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
|
|
9365
9584
|
);
|
|
9366
9585
|
}
|
|
9367
9586
|
buildContractsDbFilter(filter) {
|
|
@@ -9446,7 +9665,7 @@ var ContractManager = class _ContractManager {
|
|
|
9446
9665
|
const { contractScript, collaborative = true, walletPubKey, vtxo } = options;
|
|
9447
9666
|
const [contract] = await this.getContracts({ script: contractScript });
|
|
9448
9667
|
if (!contract) return [];
|
|
9449
|
-
const handler =
|
|
9668
|
+
const handler = chunk37XKN5DZ_cjs.contractHandlers.get(contract.type);
|
|
9450
9669
|
if (!handler) return [];
|
|
9451
9670
|
const script = handler.createScript(contract.params);
|
|
9452
9671
|
const context = {
|
|
@@ -9466,7 +9685,7 @@ var ContractManager = class _ContractManager {
|
|
|
9466
9685
|
const { contractScript, collaborative = true, walletPubKey } = options;
|
|
9467
9686
|
const [contract] = await this.getContracts({ script: contractScript });
|
|
9468
9687
|
if (!contract) return [];
|
|
9469
|
-
const handler =
|
|
9688
|
+
const handler = chunk37XKN5DZ_cjs.contractHandlers.get(contract.type);
|
|
9470
9689
|
if (!handler) return [];
|
|
9471
9690
|
const script = handler.createScript(contract.params);
|
|
9472
9691
|
const context = {
|
|
@@ -9522,7 +9741,7 @@ var ContractManager = class _ContractManager {
|
|
|
9522
9741
|
}
|
|
9523
9742
|
async refreshOutpoints(outpoints) {
|
|
9524
9743
|
if (outpoints.length === 0) return;
|
|
9525
|
-
const { vtxos } = await
|
|
9744
|
+
const { vtxos } = await chunkCDWLZQQW_cjs.getNormalizedVtxos(this.config.indexerProvider, {
|
|
9526
9745
|
outpoints
|
|
9527
9746
|
});
|
|
9528
9747
|
if (vtxos.length === 0) return;
|
|
@@ -9600,7 +9819,7 @@ var ContractManager = class _ContractManager {
|
|
|
9600
9819
|
break;
|
|
9601
9820
|
}
|
|
9602
9821
|
} catch (err) {
|
|
9603
|
-
if (!
|
|
9822
|
+
if (!chunkCDWLZQQW_cjs.isRetryableProviderError(err)) throw err;
|
|
9604
9823
|
this.markSyncDegraded(err);
|
|
9605
9824
|
}
|
|
9606
9825
|
this.emitEvent(event);
|
|
@@ -9649,7 +9868,7 @@ var ContractManager = class _ContractManager {
|
|
|
9649
9868
|
*/
|
|
9650
9869
|
async reconcilePendingFrontier(contracts) {
|
|
9651
9870
|
const scriptToContract = new Map(contracts.map((c) => [c.script, c]));
|
|
9652
|
-
const vtxos = await
|
|
9871
|
+
const vtxos = await chunkCDWLZQQW_cjs.getAllNormalizedVtxos(
|
|
9653
9872
|
this.config.indexerProvider,
|
|
9654
9873
|
contracts.map((c) => c.script),
|
|
9655
9874
|
{ pendingOnly: true }
|
|
@@ -9730,7 +9949,7 @@ var ContractManager = class _ContractManager {
|
|
|
9730
9949
|
}
|
|
9731
9950
|
return result;
|
|
9732
9951
|
}
|
|
9733
|
-
async fetchContractVtxosBulk(contracts, pageSize =
|
|
9952
|
+
async fetchContractVtxosBulk(contracts, pageSize = chunkCDWLZQQW_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
|
|
9734
9953
|
if (contracts.length === 0) {
|
|
9735
9954
|
return { vtxosByScript: /* @__PURE__ */ new Map(), promoted: /* @__PURE__ */ new Map() };
|
|
9736
9955
|
}
|
|
@@ -9746,7 +9965,7 @@ var ContractManager = class _ContractManager {
|
|
|
9746
9965
|
before: syncWindow.before
|
|
9747
9966
|
}
|
|
9748
9967
|
} : {};
|
|
9749
|
-
const vtxos = await
|
|
9968
|
+
const vtxos = await chunkCDWLZQQW_cjs.getAllNormalizedVtxos(
|
|
9750
9969
|
this.config.indexerProvider,
|
|
9751
9970
|
contracts.map((c) => c.script),
|
|
9752
9971
|
{ ...windowOpts, pageSize }
|
|
@@ -9913,7 +10132,7 @@ var HDDescriptorProvider = class _HDDescriptorProvider {
|
|
|
9913
10132
|
*/
|
|
9914
10133
|
materializeDescriptorAt(index) {
|
|
9915
10134
|
const descriptor = this.identity.descriptor;
|
|
9916
|
-
const network =
|
|
10135
|
+
const network = chunk37XKN5DZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
|
|
9917
10136
|
const expansion = descriptorsScure.expand({ descriptor, network, index });
|
|
9918
10137
|
const keyInfo = expansion.expansionMap?.["@0"];
|
|
9919
10138
|
if (!keyInfo?.keyExpression) {
|
|
@@ -10057,7 +10276,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
|
|
|
10057
10276
|
const provider = await resolveDescriptorProvider(config, setup.walletRepository);
|
|
10058
10277
|
if (!provider) return void 0;
|
|
10059
10278
|
const allowSilentFallback = (config.walletMode ?? "auto") === "auto";
|
|
10060
|
-
const expectedContractType = setup.offchainTapscript instanceof
|
|
10279
|
+
const expectedContractType = setup.offchainTapscript instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script ? "delegate" : "default";
|
|
10061
10280
|
const factoryOpts = {
|
|
10062
10281
|
walletRepository: setup.walletRepository,
|
|
10063
10282
|
contractRepository: setup.contractRepository,
|
|
@@ -10256,7 +10475,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
|
|
|
10256
10475
|
};
|
|
10257
10476
|
function deriveLeafPubkey(descriptor) {
|
|
10258
10477
|
try {
|
|
10259
|
-
return
|
|
10478
|
+
return chunk37XKN5DZ_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
10260
10479
|
} catch (e) {
|
|
10261
10480
|
throw new NonRangeableDescriptorError(
|
|
10262
10481
|
"Cannot derive leaf pubkey: descriptor is not a materialized, parsable tr(...) shape.",
|
|
@@ -10268,7 +10487,7 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
10268
10487
|
const pubKey = deriveLeafPubkey(descriptor);
|
|
10269
10488
|
const tapscript = rebuildTapscript(current, pubKey);
|
|
10270
10489
|
const serverPubKey = tapscript.options.serverPubKey;
|
|
10271
|
-
const csvTimelock =
|
|
10490
|
+
const csvTimelock = chunkCDWLZQQW_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
|
|
10272
10491
|
const base$1 = {
|
|
10273
10492
|
script: base.hex.encode(tapscript.pkScript),
|
|
10274
10493
|
address: tapscript.address(hrp, serverPubKey).encode(),
|
|
@@ -10279,11 +10498,11 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
10279
10498
|
// index-0 key. Without it, spends produce unsigned PSBTs that the
|
|
10280
10499
|
// server rejects with `INVALID_PSBT_INPUT (5): missing tapscript spend sig`.
|
|
10281
10500
|
metadata: {
|
|
10282
|
-
...{ source:
|
|
10501
|
+
...{ source: chunk37XKN5DZ_cjs.WALLET_RECEIVE_SOURCE },
|
|
10283
10502
|
signingDescriptor: descriptor
|
|
10284
10503
|
}
|
|
10285
10504
|
};
|
|
10286
|
-
const params = tapscript instanceof
|
|
10505
|
+
const params = tapscript instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script ? {
|
|
10287
10506
|
...base$1,
|
|
10288
10507
|
type: "delegate",
|
|
10289
10508
|
params: {
|
|
@@ -10304,10 +10523,10 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
|
|
|
10304
10523
|
return { tapscript, params };
|
|
10305
10524
|
}
|
|
10306
10525
|
function rebuildTapscript(current, pubKey) {
|
|
10307
|
-
if (current instanceof
|
|
10308
|
-
return new
|
|
10526
|
+
if (current instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script) {
|
|
10527
|
+
return new chunk37XKN5DZ_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
|
|
10309
10528
|
}
|
|
10310
|
-
return new
|
|
10529
|
+
return new chunk37XKN5DZ_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
|
|
10311
10530
|
}
|
|
10312
10531
|
async function pickActiveReceive(contractRepository, serverPubKey, expectedType) {
|
|
10313
10532
|
const candidates = await contractRepository.getContracts({
|
|
@@ -10316,7 +10535,7 @@ async function pickActiveReceive(contractRepository, serverPubKey, expectedType)
|
|
|
10316
10535
|
});
|
|
10317
10536
|
const serverPubKeyHex = base.hex.encode(serverPubKey);
|
|
10318
10537
|
const matching = candidates.filter(
|
|
10319
|
-
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source ===
|
|
10538
|
+
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunk37XKN5DZ_cjs.WALLET_RECEIVE_SOURCE
|
|
10320
10539
|
).sort((a, b) => {
|
|
10321
10540
|
if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
|
|
10322
10541
|
return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
|
|
@@ -10492,12 +10711,12 @@ var InputSignerRouter = class {
|
|
|
10492
10711
|
};
|
|
10493
10712
|
|
|
10494
10713
|
// src/wallet/wallet.ts
|
|
10495
|
-
var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl ||
|
|
10714
|
+
var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunkCDWLZQQW_cjs.DEFAULT_ARKADE_SERVER_URL;
|
|
10496
10715
|
function intentProofJobs(coins) {
|
|
10497
10716
|
if (coins.length === 0) return [];
|
|
10498
10717
|
const coinJobs = coins.map((coin, i) => ({
|
|
10499
10718
|
index: i + 1,
|
|
10500
|
-
lookupScript:
|
|
10719
|
+
lookupScript: chunkCDWLZQQW_cjs.VtxoScript.decode(coin.tapTree).pkScript
|
|
10501
10720
|
}));
|
|
10502
10721
|
return [{ index: 0, lookupScript: coinJobs[0].lookupScript }, ...coinJobs];
|
|
10503
10722
|
}
|
|
@@ -10522,7 +10741,7 @@ function dedupeTimelocks(timelocks) {
|
|
|
10522
10741
|
const seen = /* @__PURE__ */ new Set();
|
|
10523
10742
|
const deduped = [];
|
|
10524
10743
|
for (const timelock of timelocks) {
|
|
10525
|
-
const sequence =
|
|
10744
|
+
const sequence = chunkCDWLZQQW_cjs.timelockToSequence(timelock).toString();
|
|
10526
10745
|
if (seen.has(sequence)) continue;
|
|
10527
10746
|
seen.add(sequence);
|
|
10528
10747
|
deduped.push(timelock);
|
|
@@ -10539,7 +10758,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
|
|
|
10539
10758
|
state: "active"
|
|
10540
10759
|
});
|
|
10541
10760
|
const newest = candidates.filter(
|
|
10542
|
-
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source ===
|
|
10761
|
+
(c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunk37XKN5DZ_cjs.WALLET_RECEIVE_SOURCE
|
|
10543
10762
|
).sort((a, b) => {
|
|
10544
10763
|
if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
|
|
10545
10764
|
return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
|
|
@@ -10547,7 +10766,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
|
|
|
10547
10766
|
if (!newest?.params.pubKey) return baseline;
|
|
10548
10767
|
try {
|
|
10549
10768
|
const pubKey = base.hex.decode(newest.params.pubKey);
|
|
10550
|
-
return new
|
|
10769
|
+
return new chunk37XKN5DZ_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
|
|
10551
10770
|
} catch (e) {
|
|
10552
10771
|
console.warn("Skipping malformed boarding contract at boot", newest.script, e);
|
|
10553
10772
|
return baseline;
|
|
@@ -10797,6 +11016,20 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
10797
11016
|
...this._deprecatedSigners.keys()
|
|
10798
11017
|
]);
|
|
10799
11018
|
}
|
|
11019
|
+
/**
|
|
11020
|
+
* `serverPubKey` defaults to the live key; spend paths that snapshot it
|
|
11021
|
+
* against mid-flight rotation pass their snapshot, so the check reads from
|
|
11022
|
+
* one rotation epoch.
|
|
11023
|
+
*/
|
|
11024
|
+
recipientAddressContext(serverPubKey = this._arkServerPublicKey) {
|
|
11025
|
+
return {
|
|
11026
|
+
hrp: this.network.hrp,
|
|
11027
|
+
signerSet: {
|
|
11028
|
+
active: toXOnlySignerHex(base.hex.encode(serverPubKey)),
|
|
11029
|
+
deprecated: this._deprecatedSigners
|
|
11030
|
+
}
|
|
11031
|
+
};
|
|
11032
|
+
}
|
|
10800
11033
|
/**
|
|
10801
11034
|
* Currently-active receive tapscript. Read-only from the outside;
|
|
10802
11035
|
* mutated only via {@link Wallet.setOffchainTapscriptForRotation}
|
|
@@ -10867,7 +11100,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
10867
11100
|
*/
|
|
10868
11101
|
static async setupWalletConfig(config, pubKey) {
|
|
10869
11102
|
const arkadeServerUrl = getArkadeServerUrl(config);
|
|
10870
|
-
const arkProvider = config.arkProvider || new
|
|
11103
|
+
const arkProvider = config.arkProvider || new chunkCDWLZQQW_cjs.RestArkProvider(arkadeServerUrl);
|
|
10871
11104
|
let indexerProvider = config.indexerProvider;
|
|
10872
11105
|
if (!indexerProvider) {
|
|
10873
11106
|
let indexerUrl = config.indexerUrl;
|
|
@@ -10884,7 +11117,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
10884
11117
|
indexerUrl = arkadeServerUrl;
|
|
10885
11118
|
}
|
|
10886
11119
|
}
|
|
10887
|
-
indexerProvider = new
|
|
11120
|
+
indexerProvider = new chunk24YNIQSW_cjs.RestIndexerProvider(indexerUrl);
|
|
10888
11121
|
}
|
|
10889
11122
|
const walletRepository = config.storage?.walletRepository ?? new IndexedDBWalletRepository();
|
|
10890
11123
|
const contractRepository = config.storage?.contractRepository ?? new IndexedDBContractRepository();
|
|
@@ -10893,7 +11126,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
10893
11126
|
source: serverInfoSource,
|
|
10894
11127
|
lastOnlineAt: serverInfoLastOnlineAt
|
|
10895
11128
|
} = await resolveArkInfo(arkProvider, walletRepository);
|
|
10896
|
-
const network =
|
|
11129
|
+
const network = chunkCDWLZQQW_cjs.getNetwork(info.network);
|
|
10897
11130
|
if ("descriptor" in config.identity) {
|
|
10898
11131
|
const descriptor = config.identity.descriptor;
|
|
10899
11132
|
const identityIsMainnet = !descriptor.includes("tpub");
|
|
@@ -10940,11 +11173,11 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
10940
11173
|
serverPubKey,
|
|
10941
11174
|
csvTimelock: exitTimelock
|
|
10942
11175
|
};
|
|
10943
|
-
const offchainTapscript = !delegatePubKey ? new
|
|
10944
|
-
const boardingTapscript =
|
|
11176
|
+
const offchainTapscript = !delegatePubKey ? new chunk37XKN5DZ_cjs.DefaultVtxo.Script(offchainOptions) : new chunk37XKN5DZ_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
|
|
11177
|
+
const boardingTapscript = chunk37XKN5DZ_cjs.BoardingContractHandler.createScript({
|
|
10945
11178
|
pubKey: base.hex.encode(pubKey),
|
|
10946
11179
|
serverPubKey: base.hex.encode(serverPubKey),
|
|
10947
|
-
csvTimelock:
|
|
11180
|
+
csvTimelock: chunkCDWLZQQW_cjs.timelockToSequence(boardingTimelock).toString()
|
|
10948
11181
|
});
|
|
10949
11182
|
return {
|
|
10950
11183
|
arkProvider,
|
|
@@ -11050,19 +11283,19 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11050
11283
|
let pendingRecovery = 0;
|
|
11051
11284
|
const now = { timestamp: /* @__PURE__ */ new Date() };
|
|
11052
11285
|
const settled = vtxos.filter(
|
|
11053
|
-
(coin) =>
|
|
11286
|
+
(coin) => chunkCDWLZQQW_cjs.canSpendOffchain(coin, now) && !coin.isPreconfirmed && !isPendingRecovery(coin)
|
|
11054
11287
|
).reduce((sum, coin) => sum + coin.value, 0);
|
|
11055
11288
|
const preconfirmed = vtxos.filter(
|
|
11056
|
-
(coin) =>
|
|
11289
|
+
(coin) => chunkCDWLZQQW_cjs.canSpendOffchain(coin, now) && coin.isPreconfirmed && !isPendingRecovery(coin)
|
|
11057
11290
|
).reduce((sum, coin) => sum + coin.value, 0);
|
|
11058
|
-
const available = unlockedVtxos.filter((coin) =>
|
|
11059
|
-
recoverable = vtxos.filter((coin) =>
|
|
11291
|
+
const available = unlockedVtxos.filter((coin) => chunkCDWLZQQW_cjs.canSpendOffchain(coin, now) && !isPendingRecovery(coin)).reduce((sum, coin) => sum + coin.value, 0);
|
|
11292
|
+
recoverable = vtxos.filter((coin) => chunkCDWLZQQW_cjs.canRecoverOnchain(coin, now) && !isPendingRecovery(coin)).reduce((sum, coin) => sum + coin.value, 0);
|
|
11060
11293
|
pendingRecovery = vtxos.filter(isPendingRecovery).reduce((sum, coin) => sum + coin.value, 0);
|
|
11061
11294
|
const totalBoarding = confirmed + unconfirmed;
|
|
11062
11295
|
const totalOffchain = settled + preconfirmed + recoverable + pendingRecovery;
|
|
11063
11296
|
const assetBalances = /* @__PURE__ */ new Map();
|
|
11064
11297
|
for (const vtxo of vtxos) {
|
|
11065
|
-
if (
|
|
11298
|
+
if (chunkCDWLZQQW_cjs.hasTerminalSpend(vtxo)) continue;
|
|
11066
11299
|
if (vtxo.assets) {
|
|
11067
11300
|
for (const a of vtxo.assets) {
|
|
11068
11301
|
const current = assetBalances.get(a.assetId) ?? 0n;
|
|
@@ -11103,8 +11336,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11103
11336
|
if (this._pendingSpendOutpoints.has(`${vtxo.txid}:${vtxo.vout}`)) {
|
|
11104
11337
|
return false;
|
|
11105
11338
|
}
|
|
11106
|
-
if (!
|
|
11107
|
-
if (!f.withRecoverable &&
|
|
11339
|
+
if (!chunkCDWLZQQW_cjs.hasTerminalSpend(vtxo)) {
|
|
11340
|
+
if (!f.withRecoverable && chunkCDWLZQQW_cjs.canRecoverOnchain(vtxo, now)) {
|
|
11108
11341
|
return false;
|
|
11109
11342
|
}
|
|
11110
11343
|
return true;
|
|
@@ -11137,7 +11370,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11137
11370
|
const response = await contractManager.getContractsWithVtxos();
|
|
11138
11371
|
const allVtxos = response.flatMap((_) => _.vtxos);
|
|
11139
11372
|
const { boardingTxs, commitmentsToIgnore } = await this.getBoardingTxs();
|
|
11140
|
-
const resolveTxCreatedAt = (txids) =>
|
|
11373
|
+
const resolveTxCreatedAt = (txids) => chunkCDWLZQQW_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
|
|
11141
11374
|
return buildTransactionHistory(
|
|
11142
11375
|
allVtxos,
|
|
11143
11376
|
boardingTxs,
|
|
@@ -11231,7 +11464,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11231
11464
|
},
|
|
11232
11465
|
isUnrolled: true,
|
|
11233
11466
|
...boardingFacts,
|
|
11234
|
-
virtualStatus:
|
|
11467
|
+
virtualStatus: chunkCDWLZQQW_cjs.toVirtualStatus(boardingFacts),
|
|
11235
11468
|
spentBy: "",
|
|
11236
11469
|
createdAt: tx.status.confirmed ? new Date(tx.status.block_time * 1e3) : /* @__PURE__ */ new Date(0),
|
|
11237
11470
|
script: scriptHex
|
|
@@ -11287,9 +11520,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11287
11520
|
async getBoardingTapscripts(allowedSigners) {
|
|
11288
11521
|
const byScript = /* @__PURE__ */ new Map();
|
|
11289
11522
|
const add = (s) => byScript.set(base.hex.encode(s.pkScript), s);
|
|
11290
|
-
const boardingCsv = this.boardingTapscript.options.csvTimelock ??
|
|
11523
|
+
const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunk37XKN5DZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
11291
11524
|
add(
|
|
11292
|
-
new
|
|
11525
|
+
new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
|
|
11293
11526
|
pubKey: await this.identity.xOnlyPublicKey(),
|
|
11294
11527
|
serverPubKey: this.boardingTapscript.options.serverPubKey,
|
|
11295
11528
|
csvTimelock: boardingCsv
|
|
@@ -11304,7 +11537,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11304
11537
|
for (const c of boardingContracts) {
|
|
11305
11538
|
if (!allowed.has(toXOnlySignerHex(c.params.serverPubKey))) continue;
|
|
11306
11539
|
try {
|
|
11307
|
-
add(
|
|
11540
|
+
add(chunk37XKN5DZ_cjs.BoardingContractHandler.createScript(c.params));
|
|
11308
11541
|
} catch (e) {
|
|
11309
11542
|
console.warn("Skipping malformed boarding contract", c.script, e);
|
|
11310
11543
|
}
|
|
@@ -11342,7 +11575,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11342
11575
|
// Per-row CSV delay decoded from THIS tapscript's exit leaf —
|
|
11343
11576
|
// not the wallet's current boarding timelock, which a signer
|
|
11344
11577
|
// rotation may have changed.
|
|
11345
|
-
csvTimelock:
|
|
11578
|
+
csvTimelock: chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
|
|
11346
11579
|
coins: utxos
|
|
11347
11580
|
});
|
|
11348
11581
|
}
|
|
@@ -11475,7 +11708,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11475
11708
|
/** Fetch Arkade transaction ids that are still pending final settlement. */
|
|
11476
11709
|
async fetchPendingTxs() {
|
|
11477
11710
|
const scripts = await this.getWalletScripts();
|
|
11478
|
-
const vtxos = await
|
|
11711
|
+
const vtxos = await chunkCDWLZQQW_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
|
|
11479
11712
|
return vtxos.filter(
|
|
11480
11713
|
(vtxo) => (vtxo.isSpent || vtxo.isPreconfirmed && !vtxo.isSwept) && vtxo.arkTxId !== void 0
|
|
11481
11714
|
).map((_) => _.arkTxId);
|
|
@@ -11506,7 +11739,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11506
11739
|
});
|
|
11507
11740
|
for (const contract of contracts) {
|
|
11508
11741
|
if (map.has(contract.script)) continue;
|
|
11509
|
-
const handler =
|
|
11742
|
+
const handler = chunk37XKN5DZ_cjs.contractHandlers.get(contract.type);
|
|
11510
11743
|
if (handler) {
|
|
11511
11744
|
const script = handler.createScript(contract.params);
|
|
11512
11745
|
map.set(contract.script, script);
|
|
@@ -11609,7 +11842,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11609
11842
|
lookAhead: this.lookAheadConfig()
|
|
11610
11843
|
});
|
|
11611
11844
|
const baselinePubkey = await this.identity.xOnlyPublicKey();
|
|
11612
|
-
const delegatePubKey = this.offchainTapscript instanceof
|
|
11845
|
+
const delegatePubKey = this.offchainTapscript instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
|
|
11613
11846
|
const baselineSigners = [
|
|
11614
11847
|
this.offchainTapscript.options.serverPubKey,
|
|
11615
11848
|
...[...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h))
|
|
@@ -11617,8 +11850,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11617
11850
|
const seenBaselineScripts = /* @__PURE__ */ new Set();
|
|
11618
11851
|
for (const serverPubKey of baselineSigners) {
|
|
11619
11852
|
for (const csvTimelock of this.walletContractTimelocks) {
|
|
11620
|
-
const csvTimelockStr =
|
|
11621
|
-
const defaultScript = new
|
|
11853
|
+
const csvTimelockStr = chunkCDWLZQQW_cjs.timelockToSequence(csvTimelock).toString();
|
|
11854
|
+
const defaultScript = new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
|
|
11622
11855
|
pubKey: baselinePubkey,
|
|
11623
11856
|
serverPubKey,
|
|
11624
11857
|
csvTimelock
|
|
@@ -11639,7 +11872,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11639
11872
|
});
|
|
11640
11873
|
}
|
|
11641
11874
|
if (delegatePubKey) {
|
|
11642
|
-
const delegateScript = new
|
|
11875
|
+
const delegateScript = new chunk37XKN5DZ_cjs.DelegateVtxo.Script({
|
|
11643
11876
|
pubKey: baselinePubkey,
|
|
11644
11877
|
serverPubKey,
|
|
11645
11878
|
delegatePubKey,
|
|
@@ -11663,9 +11896,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11663
11896
|
}
|
|
11664
11897
|
}
|
|
11665
11898
|
}
|
|
11666
|
-
const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ??
|
|
11899
|
+
const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunk37XKN5DZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
11667
11900
|
for (const serverPubKey of baselineSigners) {
|
|
11668
|
-
const baselineBoarding = new
|
|
11901
|
+
const baselineBoarding = new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
|
|
11669
11902
|
pubKey: baselinePubkey,
|
|
11670
11903
|
serverPubKey,
|
|
11671
11904
|
csvTimelock: boardingCsvTimelock
|
|
@@ -11678,7 +11911,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
|
|
|
11678
11911
|
params: {
|
|
11679
11912
|
pubKey: base.hex.encode(baselineBoarding.options.pubKey),
|
|
11680
11913
|
serverPubKey: base.hex.encode(serverPubKey),
|
|
11681
|
-
csvTimelock:
|
|
11914
|
+
csvTimelock: chunkCDWLZQQW_cjs.timelockToSequence(boardingCsvTimelock).toString()
|
|
11682
11915
|
},
|
|
11683
11916
|
script: boardingScriptHex,
|
|
11684
11917
|
address: baselineBoarding.address(this.network.hrp, serverPubKey).encode(),
|
|
@@ -11852,7 +12085,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
11852
12085
|
serverPubKey: this.offchainTapscript.options.serverPubKey,
|
|
11853
12086
|
deprecatedSignerPubKeys: [...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h)),
|
|
11854
12087
|
csvTimelocks: this.walletContractTimelocks,
|
|
11855
|
-
delegatePubKey: this.offchainTapscript instanceof
|
|
12088
|
+
delegatePubKey: this.offchainTapscript instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
|
|
11856
12089
|
};
|
|
11857
12090
|
}
|
|
11858
12091
|
_signerRouter;
|
|
@@ -11944,25 +12177,25 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
11944
12177
|
return this.getBoardingAddress();
|
|
11945
12178
|
}
|
|
11946
12179
|
const descriptor = await provider.getNextSigningDescriptor();
|
|
11947
|
-
const pubKey =
|
|
11948
|
-
const newBoarding = new
|
|
12180
|
+
const pubKey = chunk37XKN5DZ_cjs.deriveDescriptorLeafPubKey(descriptor);
|
|
12181
|
+
const newBoarding = new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
|
|
11949
12182
|
...this._boardingTapscript.options,
|
|
11950
12183
|
pubKey
|
|
11951
12184
|
});
|
|
11952
|
-
const csvTimelock = newBoarding.options.csvTimelock ??
|
|
12185
|
+
const csvTimelock = newBoarding.options.csvTimelock ?? chunk37XKN5DZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
11953
12186
|
const manager = await this.getContractManager();
|
|
11954
12187
|
await manager.createContract({
|
|
11955
12188
|
type: "boarding",
|
|
11956
12189
|
params: {
|
|
11957
12190
|
pubKey: base.hex.encode(pubKey),
|
|
11958
12191
|
serverPubKey: base.hex.encode(newBoarding.options.serverPubKey),
|
|
11959
|
-
csvTimelock:
|
|
12192
|
+
csvTimelock: chunkCDWLZQQW_cjs.timelockToSequence(csvTimelock).toString()
|
|
11960
12193
|
},
|
|
11961
12194
|
script: base.hex.encode(newBoarding.pkScript),
|
|
11962
12195
|
address: newBoarding.address(this.network.hrp, this.arkServerPublicKey).encode(),
|
|
11963
12196
|
state: "active",
|
|
11964
12197
|
metadata: {
|
|
11965
|
-
source:
|
|
12198
|
+
source: chunk37XKN5DZ_cjs.WALLET_RECEIVE_SOURCE,
|
|
11966
12199
|
signingDescriptor: descriptor
|
|
11967
12200
|
}
|
|
11968
12201
|
});
|
|
@@ -11974,6 +12207,51 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
11974
12207
|
}
|
|
11975
12208
|
return newBoarding.onchainAddress(this.network);
|
|
11976
12209
|
}
|
|
12210
|
+
/**
|
|
12211
|
+
* @see HDWalletCapable.getCurrentSigningDescriptor
|
|
12212
|
+
*/
|
|
12213
|
+
async getCurrentSigningDescriptor() {
|
|
12214
|
+
const provider = this._descriptorProvider;
|
|
12215
|
+
if (!(provider instanceof HDDescriptorProvider)) return void 0;
|
|
12216
|
+
return provider.getCurrentSigningDescriptor();
|
|
12217
|
+
}
|
|
12218
|
+
/**
|
|
12219
|
+
* @see HDWalletCapable.getUsedSigningDescriptors
|
|
12220
|
+
*
|
|
12221
|
+
* Union of the watermark band and the descriptors persisted on contracts:
|
|
12222
|
+
* the band alone would miss rows a restore scan wrote, and the contracts
|
|
12223
|
+
* alone would miss indices allocated for something the wallet never
|
|
12224
|
+
* persisted (a swap, an externally issued invoice).
|
|
12225
|
+
*/
|
|
12226
|
+
async getUsedSigningDescriptors() {
|
|
12227
|
+
const provider = this._descriptorProvider;
|
|
12228
|
+
const descriptors = /* @__PURE__ */ new Set();
|
|
12229
|
+
if (provider instanceof HDDescriptorProvider) {
|
|
12230
|
+
const lastIndexUsed = await provider.getLastIndexUsed();
|
|
12231
|
+
for (let i = 0; i <= (lastIndexUsed ?? -1); i++) {
|
|
12232
|
+
descriptors.add(provider.materializeDescriptorAt(i));
|
|
12233
|
+
}
|
|
12234
|
+
}
|
|
12235
|
+
for (const contract of await this.contractRepository.getContracts()) {
|
|
12236
|
+
const descriptor = contract.metadata?.signingDescriptor;
|
|
12237
|
+
if (typeof descriptor === "string" && descriptor.length > 0) {
|
|
12238
|
+
descriptors.add(descriptor);
|
|
12239
|
+
}
|
|
12240
|
+
}
|
|
12241
|
+
return [...descriptors].sort(
|
|
12242
|
+
(a, b) => signingDescriptorIndex(a) - signingDescriptorIndex(b)
|
|
12243
|
+
);
|
|
12244
|
+
}
|
|
12245
|
+
/**
|
|
12246
|
+
* @see HDWalletCapable.signerForDescriptor
|
|
12247
|
+
*/
|
|
12248
|
+
async signerForDescriptor(descriptor) {
|
|
12249
|
+
const provider = this._descriptorProvider;
|
|
12250
|
+
if (!(provider instanceof HDDescriptorProvider) || !provider.isOurs(descriptor)) {
|
|
12251
|
+
return this.identity;
|
|
12252
|
+
}
|
|
12253
|
+
return new DescriptorIdentity({ descriptor, signer: provider, base: this.identity });
|
|
12254
|
+
}
|
|
11977
12255
|
/**
|
|
11978
12256
|
* Mid-session server-signer rotation (plan §4). When arkd rotates its
|
|
11979
12257
|
* active signer mid-session — the case the long-lived service worker and
|
|
@@ -12006,7 +12284,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12006
12284
|
const xonly = toXOnlyPubKey(newServerPubKey);
|
|
12007
12285
|
let newServerUnrollScript;
|
|
12008
12286
|
try {
|
|
12009
|
-
newServerUnrollScript =
|
|
12287
|
+
newServerUnrollScript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
|
|
12010
12288
|
} catch (e) {
|
|
12011
12289
|
throw new Error("Invalid checkpointTapscript from server");
|
|
12012
12290
|
}
|
|
@@ -12034,21 +12312,21 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12034
12312
|
const [currentBoardingRow] = await manager.getContracts({
|
|
12035
12313
|
script: currentBoardingScript
|
|
12036
12314
|
});
|
|
12037
|
-
const newOffchain = this.offchainTapscript instanceof
|
|
12315
|
+
const newOffchain = this.offchainTapscript instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script ? new chunk37XKN5DZ_cjs.DelegateVtxo.Script({
|
|
12038
12316
|
...this.offchainTapscript.options,
|
|
12039
12317
|
serverPubKey: xonly
|
|
12040
|
-
}) : new
|
|
12318
|
+
}) : new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
|
|
12041
12319
|
...this.offchainTapscript.options,
|
|
12042
12320
|
serverPubKey: xonly
|
|
12043
12321
|
});
|
|
12044
|
-
const newBoarding = new
|
|
12322
|
+
const newBoarding = new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
|
|
12045
12323
|
...this._boardingTapscript.options,
|
|
12046
12324
|
serverPubKey: xonly
|
|
12047
12325
|
});
|
|
12048
|
-
const offchainCsv =
|
|
12326
|
+
const offchainCsv = chunkCDWLZQQW_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
|
|
12049
12327
|
const newOffchainScript = base.hex.encode(newOffchain.pkScript);
|
|
12050
12328
|
const newOffchainAddress = newOffchain.address(this.network.hrp, xonly).encode();
|
|
12051
|
-
if (newOffchain instanceof
|
|
12329
|
+
if (newOffchain instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script) {
|
|
12052
12330
|
await manager.createContract({
|
|
12053
12331
|
type: "delegate",
|
|
12054
12332
|
params: {
|
|
@@ -12076,13 +12354,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12076
12354
|
metadata: currentOffchainRow?.metadata
|
|
12077
12355
|
});
|
|
12078
12356
|
}
|
|
12079
|
-
const boardingCsv = newBoarding.options.csvTimelock ??
|
|
12357
|
+
const boardingCsv = newBoarding.options.csvTimelock ?? chunk37XKN5DZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
|
|
12080
12358
|
await manager.createContract({
|
|
12081
12359
|
type: "boarding",
|
|
12082
12360
|
params: {
|
|
12083
12361
|
pubKey: base.hex.encode(newBoarding.options.pubKey),
|
|
12084
12362
|
serverPubKey: base.hex.encode(xonly),
|
|
12085
|
-
csvTimelock:
|
|
12363
|
+
csvTimelock: chunkCDWLZQQW_cjs.timelockToSequence(boardingCsv).toString()
|
|
12086
12364
|
},
|
|
12087
12365
|
script: base.hex.encode(newBoarding.pkScript),
|
|
12088
12366
|
address: newBoarding.address(this.network.hrp, xonly).encode(),
|
|
@@ -12115,14 +12393,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12115
12393
|
_restoreInFlight;
|
|
12116
12394
|
_addPendingSpends(inputs) {
|
|
12117
12395
|
for (const input of inputs) {
|
|
12118
|
-
if (
|
|
12396
|
+
if (chunkCDWLZQQW_cjs.isVirtualCoin(input)) {
|
|
12119
12397
|
this._pendingSpendOutpoints.add(`${input.txid}:${input.vout}`);
|
|
12120
12398
|
}
|
|
12121
12399
|
}
|
|
12122
12400
|
}
|
|
12123
12401
|
_removePendingSpends(inputs) {
|
|
12124
12402
|
for (const input of inputs) {
|
|
12125
|
-
if (
|
|
12403
|
+
if (chunkCDWLZQQW_cjs.isVirtualCoin(input)) {
|
|
12126
12404
|
this._pendingSpendOutpoints.delete(`${input.txid}:${input.vout}`);
|
|
12127
12405
|
}
|
|
12128
12406
|
}
|
|
@@ -12182,7 +12460,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12182
12460
|
const hd = provider instanceof HDDescriptorProvider;
|
|
12183
12461
|
const staticDescriptor = hd ? void 0 : `tr(${base.hex.encode(await this.identity.xOnlyPublicKey())})`;
|
|
12184
12462
|
const materialize = (index) => hd ? provider.materializeDescriptorAt(index) : staticDescriptor;
|
|
12185
|
-
const delegatePubKey = this.offchainTapscript instanceof
|
|
12463
|
+
const delegatePubKey = this.offchainTapscript instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
|
|
12186
12464
|
const arkInfo = await this.arkProvider.getInfo();
|
|
12187
12465
|
const currentSignerPubKey = toXOnlyPubKey(base.hex.decode(arkInfo.signerPubkey));
|
|
12188
12466
|
const deprecatedSignerPubKeys = arkInfo.deprecatedSigners.map(
|
|
@@ -12201,7 +12479,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12201
12479
|
csvTimelocks: this.walletContractTimelocks,
|
|
12202
12480
|
// Boarding-exit CSV so the boarding handler can build its
|
|
12203
12481
|
// candidate script (distinct from the unilateral-exit matrix).
|
|
12204
|
-
boardingTimelock: this.boardingTapscript.options.csvTimelock ??
|
|
12482
|
+
boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunk37XKN5DZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
|
|
12205
12483
|
delegatePubKey
|
|
12206
12484
|
};
|
|
12207
12485
|
const result = await manager.scanContracts({
|
|
@@ -12318,7 +12596,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12318
12596
|
let serverUnrollScript;
|
|
12319
12597
|
try {
|
|
12320
12598
|
const raw = base.hex.decode(setup.info.checkpointTapscript);
|
|
12321
|
-
serverUnrollScript =
|
|
12599
|
+
serverUnrollScript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(raw);
|
|
12322
12600
|
} catch (e) {
|
|
12323
12601
|
throw new Error("Invalid checkpointTapscript from server");
|
|
12324
12602
|
}
|
|
@@ -12456,7 +12734,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12456
12734
|
inputs: params.selectedVtxos,
|
|
12457
12735
|
changeAmount: BigInt(changeAmount)
|
|
12458
12736
|
};
|
|
12459
|
-
const outputAddress =
|
|
12737
|
+
const outputAddress = chunkCDWLZQQW_cjs.ArkAddress.decode(params.address);
|
|
12738
|
+
assertRecipientArkAddress(
|
|
12739
|
+
params.address,
|
|
12740
|
+
outputAddress,
|
|
12741
|
+
this.recipientAddressContext(serverPubKey)
|
|
12742
|
+
);
|
|
12460
12743
|
const outputScript = BigInt(params.amount) < this.dustAmount ? outputAddress.subdustPkScript : outputAddress.pkScript;
|
|
12461
12744
|
const outputs = [
|
|
12462
12745
|
{
|
|
@@ -12509,13 +12792,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12509
12792
|
}
|
|
12510
12793
|
}
|
|
12511
12794
|
const offchainAddress = await this.getAddress();
|
|
12512
|
-
const offchainPkScript =
|
|
12795
|
+
const offchainPkScript = chunkCDWLZQQW_cjs.ArkAddress.decode(offchainAddress).pkScript;
|
|
12513
12796
|
const offchainOutputScript = base.hex.encode(offchainPkScript);
|
|
12514
12797
|
if (!params) {
|
|
12515
12798
|
const { fees, vtxoMaxAmount } = await this.arkProvider.getInfo();
|
|
12516
12799
|
const estimator = new Estimator(fees.intentFee);
|
|
12517
12800
|
let amount = 0;
|
|
12518
|
-
const exitScript =
|
|
12801
|
+
const exitScript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(
|
|
12519
12802
|
base.hex.decode(this.boardingTapscript.exitScript)
|
|
12520
12803
|
);
|
|
12521
12804
|
const boardingTimelock = exitScript.params.timelock;
|
|
@@ -12544,7 +12827,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12544
12827
|
if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
|
|
12545
12828
|
break;
|
|
12546
12829
|
}
|
|
12547
|
-
const inputFee = estimator.evalOffchainInput(
|
|
12830
|
+
const inputFee = estimator.evalOffchainInput(chunkCDWLZQQW_cjs.toOffchainInputFeeParams(vtxo));
|
|
12548
12831
|
if (inputFee.satoshis >= vtxo.value) {
|
|
12549
12832
|
continue;
|
|
12550
12833
|
}
|
|
@@ -12586,13 +12869,21 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12586
12869
|
const onchainOutputIndexes = [];
|
|
12587
12870
|
const outputs = [];
|
|
12588
12871
|
let hasOffchainOutputs = false;
|
|
12872
|
+
let recipientContext;
|
|
12589
12873
|
for (const [index, output] of params.outputs.entries()) {
|
|
12590
12874
|
let script;
|
|
12875
|
+
let arkAddress;
|
|
12591
12876
|
try {
|
|
12592
|
-
|
|
12593
|
-
script = addr.pkScript;
|
|
12594
|
-
hasOffchainOutputs = true;
|
|
12877
|
+
arkAddress = chunkCDWLZQQW_cjs.ArkAddress.decode(output.address);
|
|
12595
12878
|
} catch {
|
|
12879
|
+
arkAddress = void 0;
|
|
12880
|
+
}
|
|
12881
|
+
if (arkAddress) {
|
|
12882
|
+
recipientContext ??= this.recipientAddressContext();
|
|
12883
|
+
assertRecipientArkAddress(output.address, arkAddress, recipientContext);
|
|
12884
|
+
script = arkAddress.pkScript;
|
|
12885
|
+
hasOffchainOutputs = true;
|
|
12886
|
+
} else {
|
|
12596
12887
|
const addr = btcSigner.Address(this.network).decode(output.address);
|
|
12597
12888
|
script = btcSigner.OutScript.encode(addr);
|
|
12598
12889
|
onchainOutputIndexes.push(index);
|
|
@@ -12775,7 +13066,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12775
13066
|
async maybeRotateBoardingAfterBoard(inputs) {
|
|
12776
13067
|
if (!this._descriptorProvider) return;
|
|
12777
13068
|
const consumedBoarding = inputs.some(
|
|
12778
|
-
(input) => typeof input !== "string" && !
|
|
13069
|
+
(input) => typeof input !== "string" && !chunkCDWLZQQW_cjs.isVirtualCoin(input)
|
|
12779
13070
|
);
|
|
12780
13071
|
if (!consumedBoarding) return;
|
|
12781
13072
|
try {
|
|
@@ -12784,14 +13075,22 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12784
13075
|
console.warn("Failed to rotate boarding address after board", e);
|
|
12785
13076
|
}
|
|
12786
13077
|
}
|
|
12787
|
-
async handleSettlementFinalizationEvent(event, inputs, forfeitOutputScript, connectorsGraph) {
|
|
13078
|
+
async handleSettlementFinalizationEvent(event, inputs, forfeitOutputScript, expectedRecipients, connectorsGraph, validatedCommitmentTxid) {
|
|
12788
13079
|
const signedForfeits = [];
|
|
12789
13080
|
let settlementPsbt = btcSigner.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
|
|
13081
|
+
assertFinalCommitmentMatchesValidated(
|
|
13082
|
+
settlementPsbt,
|
|
13083
|
+
validatedCommitmentTxid,
|
|
13084
|
+
"settlement finalization"
|
|
13085
|
+
);
|
|
13086
|
+
if (!validatedCommitmentTxid && expectedRecipients.length > 0) {
|
|
13087
|
+
validateBatchRecipientsWithoutTree(settlementPsbt, expectedRecipients, this.network);
|
|
13088
|
+
}
|
|
12790
13089
|
let hasBoardingUtxos = false;
|
|
12791
13090
|
let connectorIndex = 0;
|
|
12792
13091
|
const connectorsLeaves = connectorsGraph?.leaves() || [];
|
|
12793
13092
|
for (const input of inputs) {
|
|
12794
|
-
if (!
|
|
13093
|
+
if (!chunkCDWLZQQW_cjs.isVirtualCoin(input)) {
|
|
12795
13094
|
for (let i = 0; i < settlementPsbt.inputsLength; i++) {
|
|
12796
13095
|
const settlementInput = settlementPsbt.getInput(i);
|
|
12797
13096
|
if (!settlementInput.txid || settlementInput.index === void 0) {
|
|
@@ -12822,7 +13121,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12822
13121
|
}
|
|
12823
13122
|
continue;
|
|
12824
13123
|
}
|
|
12825
|
-
if (
|
|
13124
|
+
if (chunkCDWLZQQW_cjs.canRecoverOnchain(input, { timestamp: /* @__PURE__ */ new Date() }) || isSubdust({ value: input.value }, this.dustAmount)) {
|
|
12826
13125
|
continue;
|
|
12827
13126
|
}
|
|
12828
13127
|
if (connectorsLeaves.length === 0) {
|
|
@@ -12850,7 +13149,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12850
13149
|
index: input.vout,
|
|
12851
13150
|
witnessUtxo: {
|
|
12852
13151
|
amount: BigInt(input.value),
|
|
12853
|
-
script:
|
|
13152
|
+
script: chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
12854
13153
|
},
|
|
12855
13154
|
sighashType: btcSigner.SigHash.DEFAULT,
|
|
12856
13155
|
tapLeafScript: [input.forfeitTapLeafScript]
|
|
@@ -12869,7 +13168,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12869
13168
|
forfeitTx = await this._signerRouter.sign(forfeitTx, [
|
|
12870
13169
|
{
|
|
12871
13170
|
index: 0,
|
|
12872
|
-
lookupScript:
|
|
13171
|
+
lookupScript: chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
12873
13172
|
}
|
|
12874
13173
|
]);
|
|
12875
13174
|
signedForfeits.push(base.base64.encode(forfeitTx.toPSBT()));
|
|
@@ -12909,6 +13208,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12909
13208
|
*/
|
|
12910
13209
|
createBatchHandler(intentId, inputs, expectedRecipients, session) {
|
|
12911
13210
|
let sweepTapTreeRoot;
|
|
13211
|
+
let validatedCommitmentTxid;
|
|
12912
13212
|
return {
|
|
12913
13213
|
onBatchStarted: async (event) => {
|
|
12914
13214
|
const utf8IntentId = new TextEncoder().encode(intentId);
|
|
@@ -12927,7 +13227,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12927
13227
|
if (skip) {
|
|
12928
13228
|
return { skip };
|
|
12929
13229
|
}
|
|
12930
|
-
const sweepTapscript =
|
|
13230
|
+
const sweepTapscript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.encode({
|
|
12931
13231
|
timelock: {
|
|
12932
13232
|
value: event.batchExpiry,
|
|
12933
13233
|
type: event.batchExpiry >= 512n ? "seconds" : "blocks"
|
|
@@ -12966,6 +13266,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12966
13266
|
if (!sharedOutput?.amount) {
|
|
12967
13267
|
throw new Error("Shared output not found");
|
|
12968
13268
|
}
|
|
13269
|
+
validatedCommitmentTxid = commitmentTx.id;
|
|
12969
13270
|
await session.init(vtxoTree, sweepTapTreeRoot, sharedOutput.amount);
|
|
12970
13271
|
const pubkey = base.hex.encode(await session.getPublicKey());
|
|
12971
13272
|
const nonces = await session.getNonces();
|
|
@@ -12994,7 +13295,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
12994
13295
|
event,
|
|
12995
13296
|
inputs,
|
|
12996
13297
|
this.forfeitOutputScript,
|
|
12997
|
-
|
|
13298
|
+
expectedRecipients,
|
|
13299
|
+
connectorTree,
|
|
13300
|
+
validatedCommitmentTxid
|
|
12998
13301
|
);
|
|
12999
13302
|
}
|
|
13000
13303
|
};
|
|
@@ -13033,9 +13336,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13033
13336
|
...existing ?? {},
|
|
13034
13337
|
intentTxId,
|
|
13035
13338
|
registerProof: intent.proof,
|
|
13036
|
-
registerProofMessage:
|
|
13339
|
+
registerProofMessage: chunkCDWLZQQW_cjs.Intent.encodeMessage(intent.message),
|
|
13037
13340
|
deleteProof: deleteIntent.proof,
|
|
13038
|
-
deleteProofMessage:
|
|
13341
|
+
deleteProofMessage: chunkCDWLZQQW_cjs.Intent.encodeMessage(deleteIntent.message),
|
|
13039
13342
|
intentVtxos: inputs.map((i) => ({
|
|
13040
13343
|
txid: i.txid,
|
|
13041
13344
|
vout: i.vout
|
|
@@ -13067,7 +13370,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13067
13370
|
try {
|
|
13068
13371
|
return await this.arkProvider.registerIntent(intent);
|
|
13069
13372
|
} catch (error) {
|
|
13070
|
-
if (error instanceof
|
|
13373
|
+
if (error instanceof chunkCDWLZQQW_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
|
|
13071
13374
|
const deleteIntent = await this.makeDeleteIntentSignature(inputs);
|
|
13072
13375
|
await this.arkProvider.deleteIntent(deleteIntent);
|
|
13073
13376
|
return this.arkProvider.registerIntent(intent);
|
|
@@ -13083,7 +13386,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13083
13386
|
expire_at: 0,
|
|
13084
13387
|
cosigners_public_keys: cosignerPubKeys
|
|
13085
13388
|
};
|
|
13086
|
-
const proof =
|
|
13389
|
+
const proof = chunkCDWLZQQW_cjs.Intent.create(message, coins, outputs);
|
|
13087
13390
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
13088
13391
|
return {
|
|
13089
13392
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -13095,7 +13398,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13095
13398
|
type: "delete",
|
|
13096
13399
|
expire_at: 0
|
|
13097
13400
|
};
|
|
13098
|
-
const proof =
|
|
13401
|
+
const proof = chunkCDWLZQQW_cjs.Intent.create(message, coins, []);
|
|
13099
13402
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
13100
13403
|
return {
|
|
13101
13404
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -13107,7 +13410,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13107
13410
|
type: "get-pending-tx",
|
|
13108
13411
|
expire_at: 0
|
|
13109
13412
|
};
|
|
13110
|
-
const proof =
|
|
13413
|
+
const proof = chunkCDWLZQQW_cjs.Intent.create(message, coins, []);
|
|
13111
13414
|
const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
|
|
13112
13415
|
return {
|
|
13113
13416
|
proof: base.base64.encode(signedProof.toPSBT()),
|
|
@@ -13128,7 +13431,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13128
13431
|
if (!vtxos || vtxos.length === 0) {
|
|
13129
13432
|
const scriptMap = await this.getScriptMap();
|
|
13130
13433
|
const allExtended = [];
|
|
13131
|
-
const fetchedVtxos = await
|
|
13434
|
+
const fetchedVtxos = await chunkCDWLZQQW_cjs.getAllNormalizedVtxos(this.indexerProvider, [
|
|
13132
13435
|
...scriptMap.keys()
|
|
13133
13436
|
]);
|
|
13134
13437
|
for (const vtxo of fetchedVtxos) {
|
|
@@ -13153,6 +13456,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13153
13456
|
for (let i = 0; i < vtxos.length; i += MAX_INPUTS_PER_INTENT) {
|
|
13154
13457
|
batches.push(vtxos.slice(i, i + MAX_INPUTS_PER_INTENT));
|
|
13155
13458
|
}
|
|
13459
|
+
const unrollCandidates = this.checkpointUnrollCandidates(await this.arkProvider.getInfo());
|
|
13460
|
+
const checkpointInputs = vtxos.map((vtxo) => ({
|
|
13461
|
+
...vtxo,
|
|
13462
|
+
tapLeafScript: vtxo.forfeitTapLeafScript
|
|
13463
|
+
}));
|
|
13156
13464
|
const seen = /* @__PURE__ */ new Set();
|
|
13157
13465
|
const results = await Promise.all(
|
|
13158
13466
|
batches.map(async (batch) => {
|
|
@@ -13168,6 +13476,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13168
13476
|
const checkpointTxs = pendingTx.signedCheckpointTxs.map(
|
|
13169
13477
|
(c) => btcSigner.Transaction.fromPSBT(base.base64.decode(c))
|
|
13170
13478
|
);
|
|
13479
|
+
assertCheckpointsMatchInputs(
|
|
13480
|
+
checkpointTxs,
|
|
13481
|
+
checkpointInputs,
|
|
13482
|
+
unrollCandidates,
|
|
13483
|
+
`pending tx ${pendingTx.arkTxid}`
|
|
13484
|
+
);
|
|
13171
13485
|
const checkpointJobs = checkpointTxs.map(
|
|
13172
13486
|
(tx) => this.inputSigningJobsFromWitnessUtxos(tx)
|
|
13173
13487
|
);
|
|
@@ -13223,6 +13537,32 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13223
13537
|
}
|
|
13224
13538
|
return { finalized, pending };
|
|
13225
13539
|
}
|
|
13540
|
+
/**
|
|
13541
|
+
* The server unroll scripts a pending checkpoint may legitimately have been
|
|
13542
|
+
* built under: this wallet's configured one, the server's current one, and
|
|
13543
|
+
* one per deprecated signer (same closure, deprecated key). A tx submitted
|
|
13544
|
+
* before a signer rotation was built under the old key, so rebuilding
|
|
13545
|
+
* against the current key alone would leave it pending forever.
|
|
13546
|
+
*/
|
|
13547
|
+
checkpointUnrollCandidates(info) {
|
|
13548
|
+
const current = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
|
|
13549
|
+
const candidates = [this._serverUnrollScript, current];
|
|
13550
|
+
for (const deprecated of signerSetFromInfo(info).deprecated.keys()) {
|
|
13551
|
+
candidates.push(
|
|
13552
|
+
chunkCDWLZQQW_cjs.CSVMultisigTapscript.encode({
|
|
13553
|
+
...current.params,
|
|
13554
|
+
pubkeys: [base.hex.decode(deprecated)]
|
|
13555
|
+
})
|
|
13556
|
+
);
|
|
13557
|
+
}
|
|
13558
|
+
const seen = /* @__PURE__ */ new Set();
|
|
13559
|
+
return candidates.filter((candidate) => {
|
|
13560
|
+
const script = base.hex.encode(candidate.script);
|
|
13561
|
+
if (seen.has(script)) return false;
|
|
13562
|
+
seen.add(script);
|
|
13563
|
+
return true;
|
|
13564
|
+
});
|
|
13565
|
+
}
|
|
13226
13566
|
async hasPendingTxFlag() {
|
|
13227
13567
|
const state = await this.walletRepository.getWalletState();
|
|
13228
13568
|
return state?.settings?.hasPendingTx === true;
|
|
@@ -13300,7 +13640,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13300
13640
|
if (vtxos.length === 0) {
|
|
13301
13641
|
throw new Error("No VTXOs found for this arkadeCash");
|
|
13302
13642
|
}
|
|
13303
|
-
const myPkScript =
|
|
13643
|
+
const myPkScript = chunkCDWLZQQW_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
|
|
13304
13644
|
let { spendable, unclaimed } = this.classifyCashVtxos(vtxos);
|
|
13305
13645
|
let swept = 0;
|
|
13306
13646
|
const drainable = vtxos.filter((vtxo) => !isSubdust(vtxo, this.dustAmount));
|
|
@@ -13327,7 +13667,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13327
13667
|
}
|
|
13328
13668
|
if (spendable.length > 0) {
|
|
13329
13669
|
const info = await this.arkProvider.getInfo();
|
|
13330
|
-
const serverUnrollScript =
|
|
13670
|
+
const serverUnrollScript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(
|
|
13331
13671
|
base.hex.decode(info.checkpointTapscript)
|
|
13332
13672
|
);
|
|
13333
13673
|
for (const vtxo of spendable) {
|
|
@@ -13373,7 +13713,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13373
13713
|
const spendable = [];
|
|
13374
13714
|
const unclaimed = [];
|
|
13375
13715
|
for (const vtxo of vtxos) {
|
|
13376
|
-
if (
|
|
13716
|
+
if (chunkCDWLZQQW_cjs.hasTerminalSpend(vtxo)) {
|
|
13377
13717
|
unclaimed.push(cashReport(vtxo, "already-spent"));
|
|
13378
13718
|
} else if (isSubdust(vtxo, this.dustAmount)) {
|
|
13379
13719
|
unclaimed.push(cashReport(vtxo, "subdust"));
|
|
@@ -13393,7 +13733,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13393
13733
|
const all = [];
|
|
13394
13734
|
const seen = /* @__PURE__ */ new Set();
|
|
13395
13735
|
for (let pageIndex = 0; ; pageIndex++) {
|
|
13396
|
-
const { vtxos, page } = await
|
|
13736
|
+
const { vtxos, page } = await chunkCDWLZQQW_cjs.getNormalizedVtxos(this.indexerProvider, {
|
|
13397
13737
|
scripts,
|
|
13398
13738
|
pageIndex,
|
|
13399
13739
|
pageSize
|
|
@@ -13440,7 +13780,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13440
13780
|
for (let i = 0; i < inputs.length; i += MAX_INPUTS_PER_INTENT) {
|
|
13441
13781
|
const batch = inputs.slice(i, i + MAX_INPUTS_PER_INTENT);
|
|
13442
13782
|
const message = { type: "get-pending-tx", expire_at: 0 };
|
|
13443
|
-
const proof =
|
|
13783
|
+
const proof = chunkCDWLZQQW_cjs.Intent.create(message, batch, []);
|
|
13444
13784
|
const signedProof = await identity.sign(
|
|
13445
13785
|
proof,
|
|
13446
13786
|
Array.from({ length: batch.length + 1 }, (_, j) => j)
|
|
@@ -13455,12 +13795,23 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13455
13795
|
pendingTxs.push(pendingTx);
|
|
13456
13796
|
}
|
|
13457
13797
|
}
|
|
13798
|
+
if (pendingTxs.length === 0) return result;
|
|
13458
13799
|
const myPkScriptHex = base.hex.encode(myPkScript);
|
|
13800
|
+
const unrollCandidates = this.checkpointUnrollCandidates(await this.arkProvider.getInfo());
|
|
13459
13801
|
for (const pendingTx of pendingTxs) {
|
|
13460
13802
|
try {
|
|
13461
13803
|
const checkpointTxs = pendingTx.signedCheckpointTxs.map(
|
|
13462
13804
|
(checkpoint) => btcSigner.Transaction.fromPSBT(base.base64.decode(checkpoint))
|
|
13463
13805
|
);
|
|
13806
|
+
assertCheckpointsMatchInputs(
|
|
13807
|
+
checkpointTxs,
|
|
13808
|
+
inputs.map((input) => ({
|
|
13809
|
+
...input,
|
|
13810
|
+
tapLeafScript: input.forfeitTapLeafScript
|
|
13811
|
+
})),
|
|
13812
|
+
unrollCandidates,
|
|
13813
|
+
`pending arkadeCash tx ${pendingTx.arkTxid}`
|
|
13814
|
+
);
|
|
13464
13815
|
const finalCheckpoints = await Promise.all(
|
|
13465
13816
|
checkpointTxs.map(
|
|
13466
13817
|
async (checkpoint) => base.base64.encode((await identity.sign(checkpoint)).toPSBT())
|
|
@@ -13525,7 +13876,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13525
13876
|
const serverUnrollScript = this.serverUnrollScript;
|
|
13526
13877
|
const outputAddress = offchainTapscript.address(this.network.hrp, serverPubKey);
|
|
13527
13878
|
const address = outputAddress.encode();
|
|
13528
|
-
const recipients = validateRecipients(
|
|
13879
|
+
const recipients = validateRecipients(
|
|
13880
|
+
args,
|
|
13881
|
+
Number(this.dustAmount),
|
|
13882
|
+
this.recipientAddressContext(serverPubKey)
|
|
13883
|
+
);
|
|
13529
13884
|
const allVirtualCoins = await this.getVtxos({
|
|
13530
13885
|
withRecoverable: false
|
|
13531
13886
|
});
|
|
@@ -13735,10 +14090,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13735
14090
|
const serverPubKey = this.arkServerPublicKey;
|
|
13736
14091
|
const serverUnrollScript = this.serverUnrollScript;
|
|
13737
14092
|
const arkAddress = offchainTapscript.address(this.network.hrp, serverPubKey);
|
|
13738
|
-
const normalizedInputs = inputs.map(
|
|
13739
|
-
const at = now ?? await
|
|
14093
|
+
const normalizedInputs = inputs.map(chunkCDWLZQQW_cjs.normalizeVtxo);
|
|
14094
|
+
const at = now ?? await chunkCDWLZQQW_cjs.resolveTimeHeight(this.onchainProvider);
|
|
13740
14095
|
for (const input of normalizedInputs) {
|
|
13741
|
-
if (!
|
|
14096
|
+
if (!chunkCDWLZQQW_cjs.canSpendOffchain(input, at)) {
|
|
13742
14097
|
throw new Error(
|
|
13743
14098
|
`sendSelectedVtxosToSelf: input ${input.txid}:${input.vout} is not cooperatively spendable`
|
|
13744
14099
|
);
|
|
@@ -13803,7 +14158,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13803
14158
|
);
|
|
13804
14159
|
const arkTxJobs = inputs.map((input, index) => ({
|
|
13805
14160
|
index,
|
|
13806
|
-
lookupScript:
|
|
14161
|
+
lookupScript: chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
13807
14162
|
}));
|
|
13808
14163
|
const identity = this.identity;
|
|
13809
14164
|
const signer = {
|
|
@@ -13870,32 +14225,33 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13870
14225
|
`updateDbAfterOffchainTx: inputs length (${inputs.length}) differs from signedCheckpointTxs length (${signedCheckpointTxs.length})`
|
|
13871
14226
|
);
|
|
13872
14227
|
}
|
|
13873
|
-
const
|
|
14228
|
+
const checkpointIdByOutpoint = /* @__PURE__ */ new Map();
|
|
14229
|
+
for (const encoded of signedCheckpointTxs) {
|
|
14230
|
+
const checkpoint = btcSigner.Transaction.fromPSBT(base.base64.decode(encoded));
|
|
14231
|
+
for (let i = 0; i < checkpoint.inputsLength; i++) {
|
|
14232
|
+
const input = checkpoint.getInput(i);
|
|
14233
|
+
if (!input.txid) continue;
|
|
14234
|
+
checkpointIdByOutpoint.set(
|
|
14235
|
+
`${base.hex.encode(input.txid)}:${input.index}`,
|
|
14236
|
+
checkpoint.id
|
|
14237
|
+
);
|
|
14238
|
+
}
|
|
14239
|
+
}
|
|
13874
14240
|
const cm = await this.getContractManager();
|
|
13875
14241
|
const annotatedInputs = await cm.annotateVtxos(inputs);
|
|
13876
|
-
for (const
|
|
14242
|
+
for (const vtxo of annotatedInputs) {
|
|
13877
14243
|
const spentFacts = { ...vtxo, isSpent: true };
|
|
13878
|
-
|
|
13879
|
-
|
|
13880
|
-
|
|
13881
|
-
)
|
|
13882
|
-
|
|
13883
|
-
|
|
13884
|
-
|
|
13885
|
-
spentBy: checkpoint.id,
|
|
13886
|
-
arkTxId: arkTxid
|
|
13887
|
-
});
|
|
13888
|
-
} else {
|
|
13889
|
-
spentVtxos.push({
|
|
13890
|
-
...spentFacts,
|
|
13891
|
-
virtualStatus: chunkGMUVWKOK_cjs.toVirtualStatus(spentFacts),
|
|
13892
|
-
arkTxId: arkTxid
|
|
13893
|
-
});
|
|
13894
|
-
}
|
|
14244
|
+
const spentBy = checkpointIdByOutpoint.get(`${vtxo.txid}:${vtxo.vout}`);
|
|
14245
|
+
spentVtxos.push({
|
|
14246
|
+
...spentFacts,
|
|
14247
|
+
virtualStatus: chunkCDWLZQQW_cjs.toVirtualStatus(spentFacts),
|
|
14248
|
+
...spentBy ? { spentBy } : {},
|
|
14249
|
+
arkTxId: arkTxid
|
|
14250
|
+
});
|
|
13895
14251
|
for (const id of vtxo.commitmentTxIds) {
|
|
13896
14252
|
commitmentTxIds.add(id);
|
|
13897
14253
|
}
|
|
13898
|
-
const vtxoExpiry =
|
|
14254
|
+
const vtxoExpiry = chunkCDWLZQQW_cjs.toBatchExpiry(vtxo);
|
|
13899
14255
|
if (vtxoExpiry) {
|
|
13900
14256
|
batchExpiry = Math.min(batchExpiry, vtxoExpiry);
|
|
13901
14257
|
}
|
|
@@ -13908,7 +14264,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13908
14264
|
isSwept: false,
|
|
13909
14265
|
isPreconfirmed: true,
|
|
13910
14266
|
commitmentTxIds: Array.from(commitmentTxIds),
|
|
13911
|
-
...
|
|
14267
|
+
...chunkCDWLZQQW_cjs.parseLegacyExpiry(batchExpiry)
|
|
13912
14268
|
};
|
|
13913
14269
|
changeVtxo = {
|
|
13914
14270
|
txid: arkTxid,
|
|
@@ -13920,7 +14276,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13920
14276
|
tapTree: offchainTapscript.encode(),
|
|
13921
14277
|
value: Number(changeAmount),
|
|
13922
14278
|
...changeFacts,
|
|
13923
|
-
virtualStatus:
|
|
14279
|
+
virtualStatus: chunkCDWLZQQW_cjs.toVirtualStatus(changeFacts),
|
|
13924
14280
|
spentBy: "",
|
|
13925
14281
|
status: {
|
|
13926
14282
|
confirmed: false
|
|
@@ -13989,12 +14345,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
13989
14345
|
const spentVtxos = [];
|
|
13990
14346
|
const inputArkTxIds = /* @__PURE__ */ new Set();
|
|
13991
14347
|
const boardingRemovalsByAddress = /* @__PURE__ */ new Map();
|
|
13992
|
-
const vtxoInputs = inputs.filter(
|
|
14348
|
+
const vtxoInputs = inputs.filter(chunkCDWLZQQW_cjs.isVirtualCoin);
|
|
13993
14349
|
const cm = await this.getContractManager();
|
|
13994
14350
|
const annotatedVtxos = await cm.annotateVtxos(vtxoInputs);
|
|
13995
14351
|
const annotatedByKey = new Map(annotatedVtxos.map((v) => [`${v.txid}:${v.vout}`, v]));
|
|
13996
14352
|
for (const input of inputs) {
|
|
13997
|
-
if (
|
|
14353
|
+
if (chunkCDWLZQQW_cjs.isVirtualCoin(input)) {
|
|
13998
14354
|
const outpoint = `${input.txid}:${input.vout}`;
|
|
13999
14355
|
const vtxo = annotatedByKey.get(outpoint);
|
|
14000
14356
|
if (!vtxo) {
|
|
@@ -14006,13 +14362,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14006
14362
|
const settledFacts = { ...vtxo, isSpent: true };
|
|
14007
14363
|
spentVtxos.push({
|
|
14008
14364
|
...settledFacts,
|
|
14009
|
-
virtualStatus:
|
|
14365
|
+
virtualStatus: chunkCDWLZQQW_cjs.toVirtualStatus(settledFacts),
|
|
14010
14366
|
settledBy: commitmentTxid
|
|
14011
14367
|
});
|
|
14012
14368
|
} else {
|
|
14013
14369
|
let sourceAddress;
|
|
14014
14370
|
try {
|
|
14015
|
-
sourceAddress =
|
|
14371
|
+
sourceAddress = chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
|
|
14016
14372
|
this.network
|
|
14017
14373
|
);
|
|
14018
14374
|
} catch {
|
|
@@ -14070,9 +14426,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
|
|
|
14070
14426
|
}
|
|
14071
14427
|
};
|
|
14072
14428
|
function selectVirtualCoins(coins, targetAmount) {
|
|
14073
|
-
const sortedCoins = coins.map(
|
|
14074
|
-
const expiryA =
|
|
14075
|
-
const expiryB =
|
|
14429
|
+
const sortedCoins = coins.map(chunkCDWLZQQW_cjs.normalizeVtxo).sort((a, b) => {
|
|
14430
|
+
const expiryA = chunkCDWLZQQW_cjs.toBatchExpiry(a) || Number.MAX_SAFE_INTEGER;
|
|
14431
|
+
const expiryB = chunkCDWLZQQW_cjs.toBatchExpiry(b) || Number.MAX_SAFE_INTEGER;
|
|
14076
14432
|
if (expiryA !== expiryB) {
|
|
14077
14433
|
return expiryA - expiryB;
|
|
14078
14434
|
}
|
|
@@ -14329,7 +14685,7 @@ var MessageBus = class {
|
|
|
14329
14685
|
this.initialized = true;
|
|
14330
14686
|
}
|
|
14331
14687
|
async buildServices(config) {
|
|
14332
|
-
const arkProvider = new
|
|
14688
|
+
const arkProvider = new chunkCDWLZQQW_cjs.RestArkProvider(config.arkServer.url);
|
|
14333
14689
|
const storage = {
|
|
14334
14690
|
walletRepository: this.walletRepository,
|
|
14335
14691
|
contractRepository: this.contractRepository
|
|
@@ -14668,7 +15024,7 @@ var offboardNetworkNames = [
|
|
|
14668
15024
|
function offboardDestinationScript(destinationAddress) {
|
|
14669
15025
|
for (const networkName of offboardNetworkNames) {
|
|
14670
15026
|
try {
|
|
14671
|
-
const network =
|
|
15027
|
+
const network = chunkCDWLZQQW_cjs.networks[networkName];
|
|
14672
15028
|
const addr = btcSigner.Address(network).decode(destinationAddress);
|
|
14673
15029
|
return btcSigner.OutScript.encode(addr);
|
|
14674
15030
|
} catch {
|
|
@@ -14732,7 +15088,7 @@ var Ramps = class {
|
|
|
14732
15088
|
}
|
|
14733
15089
|
amount = amount ?? totalAmount;
|
|
14734
15090
|
const offchainAddress = await this.wallet.getAddress();
|
|
14735
|
-
const offchainAddr =
|
|
15091
|
+
const offchainAddr = chunkCDWLZQQW_cjs.ArkAddress.decode(offchainAddress);
|
|
14736
15092
|
const offchainScript = base.hex.encode(offchainAddr.pkScript);
|
|
14737
15093
|
const outputFee = estimator.evalOffchainOutput({
|
|
14738
15094
|
amount,
|
|
@@ -14792,7 +15148,7 @@ var Ramps = class {
|
|
|
14792
15148
|
const filteredVtxos = [];
|
|
14793
15149
|
let totalAmount = 0n;
|
|
14794
15150
|
for (const vtxo of vtxos) {
|
|
14795
|
-
const inputFee = estimator.evalOffchainInput(
|
|
15151
|
+
const inputFee = estimator.evalOffchainInput(chunkCDWLZQQW_cjs.toOffchainInputFeeParams(vtxo));
|
|
14796
15152
|
if (inputFee.satoshis >= vtxo.value) {
|
|
14797
15153
|
continue;
|
|
14798
15154
|
}
|
|
@@ -15489,7 +15845,7 @@ var WalletMessageHandler = class {
|
|
|
15489
15845
|
// Wallet methods
|
|
15490
15846
|
async handleInitWallet({ payload }) {
|
|
15491
15847
|
const { arkServerUrl } = payload;
|
|
15492
|
-
this.indexerProvider = new
|
|
15848
|
+
this.indexerProvider = new chunk24YNIQSW_cjs.RestIndexerProvider(arkServerUrl);
|
|
15493
15849
|
await this.onWalletInitialized();
|
|
15494
15850
|
}
|
|
15495
15851
|
async handleGetBalance() {
|
|
@@ -15513,12 +15869,12 @@ var WalletMessageHandler = class {
|
|
|
15513
15869
|
let recoverable = 0;
|
|
15514
15870
|
let pendingRecovery = 0;
|
|
15515
15871
|
for (const vtxo of allVtxos) {
|
|
15516
|
-
if (
|
|
15872
|
+
if (chunkCDWLZQQW_cjs.hasTerminalSpend(vtxo)) continue;
|
|
15517
15873
|
if (pendingOutpoints.has(`${vtxo.txid}:${vtxo.vout}`)) {
|
|
15518
15874
|
pendingRecovery += vtxo.value;
|
|
15519
|
-
} else if (
|
|
15875
|
+
} else if (chunkCDWLZQQW_cjs.canRecoverOnchain(vtxo, now)) {
|
|
15520
15876
|
recoverable += vtxo.value;
|
|
15521
|
-
} else if (
|
|
15877
|
+
} else if (chunkCDWLZQQW_cjs.canSpendOffchain(vtxo, now)) {
|
|
15522
15878
|
if (vtxo.isPreconfirmed) {
|
|
15523
15879
|
preconfirmed += vtxo.value;
|
|
15524
15880
|
} else {
|
|
@@ -15530,7 +15886,7 @@ var WalletMessageHandler = class {
|
|
|
15530
15886
|
const totalOffchain = settled + preconfirmed + recoverable + pendingRecovery;
|
|
15531
15887
|
const assetBalances = /* @__PURE__ */ new Map();
|
|
15532
15888
|
for (const vtxo of allVtxos) {
|
|
15533
|
-
if (
|
|
15889
|
+
if (chunkCDWLZQQW_cjs.hasTerminalSpend(vtxo)) continue;
|
|
15534
15890
|
if (vtxo.assets) {
|
|
15535
15891
|
for (const a of vtxo.assets) {
|
|
15536
15892
|
const current = assetBalances.get(a.assetId) ?? 0n;
|
|
@@ -15566,7 +15922,7 @@ var WalletMessageHandler = class {
|
|
|
15566
15922
|
*/
|
|
15567
15923
|
async getSpendableVtxos() {
|
|
15568
15924
|
const vtxos = await this.getVtxosFromRepo();
|
|
15569
|
-
return vtxos.filter((v) => !
|
|
15925
|
+
return vtxos.filter((v) => !chunkCDWLZQQW_cjs.hasTerminalSpend(v));
|
|
15570
15926
|
}
|
|
15571
15927
|
async onWalletInitialized() {
|
|
15572
15928
|
if (!this.readonlyWallet || !this.arkProvider || !this.indexerProvider || !this.walletRepository) {
|
|
@@ -15778,10 +16134,10 @@ var WalletMessageHandler = class {
|
|
|
15778
16134
|
if (dustAmount != null && isSubdust(v, dustAmount)) {
|
|
15779
16135
|
return false;
|
|
15780
16136
|
}
|
|
15781
|
-
if (
|
|
16137
|
+
if (chunkCDWLZQQW_cjs.isRecoverable(v)) {
|
|
15782
16138
|
return false;
|
|
15783
16139
|
}
|
|
15784
|
-
if (
|
|
16140
|
+
if (chunkCDWLZQQW_cjs.isExpired(v)) {
|
|
15785
16141
|
return false;
|
|
15786
16142
|
}
|
|
15787
16143
|
return true;
|
|
@@ -15853,7 +16209,7 @@ var WalletMessageHandler = class {
|
|
|
15853
16209
|
if (!this.readonlyWallet) return null;
|
|
15854
16210
|
const { boardingTxs, commitmentsToIgnore } = await this.readonlyWallet.getBoardingTxs();
|
|
15855
16211
|
const indexerProvider = this.indexerProvider;
|
|
15856
|
-
const resolveTxCreatedAt = indexerProvider ? (txids) =>
|
|
16212
|
+
const resolveTxCreatedAt = indexerProvider ? (txids) => chunkCDWLZQQW_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
|
|
15857
16213
|
return buildTransactionHistory(vtxos, boardingTxs, commitmentsToIgnore, resolveTxCreatedAt);
|
|
15858
16214
|
}
|
|
15859
16215
|
async ensureContractEventBroadcasting() {
|
|
@@ -16538,7 +16894,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
16538
16894
|
};
|
|
16539
16895
|
try {
|
|
16540
16896
|
const response = await this.sendMessage(message);
|
|
16541
|
-
return response.payload.vtxos.map(
|
|
16897
|
+
return response.payload.vtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo);
|
|
16542
16898
|
} catch (error) {
|
|
16543
16899
|
throw new Error(`Failed to get vtxos: ${error}`);
|
|
16544
16900
|
}
|
|
@@ -16651,7 +17007,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
|
|
|
16651
17007
|
};
|
|
16652
17008
|
try {
|
|
16653
17009
|
const response = await sendContractMessage(message);
|
|
16654
|
-
return response.payload.vtxos.map(
|
|
17010
|
+
return response.payload.vtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo);
|
|
16655
17011
|
} catch (e) {
|
|
16656
17012
|
throw new Error("Failed to annotate vtxos");
|
|
16657
17013
|
}
|
|
@@ -17105,7 +17461,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
|
|
|
17105
17461
|
};
|
|
17106
17462
|
try {
|
|
17107
17463
|
const response = await wallet.sendMessage(message);
|
|
17108
|
-
return response.payload.vtxos.map(
|
|
17464
|
+
return response.payload.vtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo);
|
|
17109
17465
|
} catch (e) {
|
|
17110
17466
|
throw new Error(`Failed to get expiring vtxos: ${e}`);
|
|
17111
17467
|
}
|
|
@@ -17217,12 +17573,12 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
17217
17573
|
* @returns Configured onchain wallet
|
|
17218
17574
|
* @throws Error if the configured identity cannot produce a valid x-only public key
|
|
17219
17575
|
*/
|
|
17220
|
-
static async create(identity, networkName =
|
|
17576
|
+
static async create(identity, networkName = chunkCDWLZQQW_cjs.DEFAULT_NETWORK_NAME, provider) {
|
|
17221
17577
|
const pubkey = await identity.xOnlyPublicKey();
|
|
17222
17578
|
if (!pubkey) {
|
|
17223
17579
|
throw new Error("Invalid configured public key");
|
|
17224
17580
|
}
|
|
17225
|
-
const network =
|
|
17581
|
+
const network = chunkCDWLZQQW_cjs.getNetwork(networkName);
|
|
17226
17582
|
const onchainProvider = provider || new EsploraProvider(ESPLORA_URL[networkName]);
|
|
17227
17583
|
const onchainP2TR = btcSigner.p2tr(pubkey, void 0, network);
|
|
17228
17584
|
return new _OnchainWallet(identity, network, onchainP2TR, onchainProvider);
|
|
@@ -17328,7 +17684,7 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
17328
17684
|
if (!inputs) {
|
|
17329
17685
|
throw new Error("Fee estimation failed");
|
|
17330
17686
|
}
|
|
17331
|
-
let tx = new
|
|
17687
|
+
let tx = new chunkCDWLZQQW_cjs.Transaction();
|
|
17332
17688
|
for (const input of inputs) {
|
|
17333
17689
|
tx.addInput({
|
|
17334
17690
|
txid: input.txid,
|
|
@@ -17386,7 +17742,7 @@ var OnchainWallet = class _OnchainWallet {
|
|
|
17386
17742
|
* @throws If the parent has no anchor, or funding cannot be selected/signed
|
|
17387
17743
|
*/
|
|
17388
17744
|
async bumpAnchor(parentHex, feeRate) {
|
|
17389
|
-
const parent =
|
|
17745
|
+
const parent = chunkCDWLZQQW_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
|
|
17390
17746
|
const coins = (await this.getCoins()).filter((c) => c.status.confirmed);
|
|
17391
17747
|
const child = await this.buildBumpPackage(parent, feeRate, coins);
|
|
17392
17748
|
return [parent.hex, child.hex];
|
|
@@ -18151,7 +18507,7 @@ exports.BIP322 = void 0;
|
|
|
18151
18507
|
async function sign2(message, identity, network) {
|
|
18152
18508
|
const xOnlyPubKey = await identity.xOnlyPublicKey();
|
|
18153
18509
|
const payment = btcSigner.p2tr(xOnlyPubKey, void 0, network);
|
|
18154
|
-
const toSpend =
|
|
18510
|
+
const toSpend = chunkCDWLZQQW_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
|
|
18155
18511
|
const toSign = craftBIP322ToSignP2TR(toSpend, payment.script, xOnlyPubKey);
|
|
18156
18512
|
const signed = await identity.sign(toSign, [0]);
|
|
18157
18513
|
signed.finalizeIdx(0);
|
|
@@ -18209,7 +18565,7 @@ function verifyP2TR(message, witnessItems, pkScript, pubkey) {
|
|
|
18209
18565
|
if (sighashType !== btcSigner.SigHash.DEFAULT && sighashType !== btcSigner.SigHash.ALL) {
|
|
18210
18566
|
return false;
|
|
18211
18567
|
}
|
|
18212
|
-
const toSpend =
|
|
18568
|
+
const toSpend = chunkCDWLZQQW_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
|
|
18213
18569
|
const toSign = craftBIP322ToSignP2TR(toSpend, pkScript, pubkey);
|
|
18214
18570
|
const sighash = toSign.preimageWitnessV1(0, [pkScript], sighashType, [0n]);
|
|
18215
18571
|
const rawSig = sig.length === 65 ? sig.subarray(0, 64) : sig;
|
|
@@ -18230,7 +18586,7 @@ function verifyP2WPKH(message, witnessItems, pkScript, addressHash) {
|
|
|
18230
18586
|
}
|
|
18231
18587
|
const sighashType = sigWithHash[sigWithHash.length - 1];
|
|
18232
18588
|
const derSig = sigWithHash.subarray(0, sigWithHash.length - 1);
|
|
18233
|
-
const toSpend =
|
|
18589
|
+
const toSpend = chunkCDWLZQQW_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
|
|
18234
18590
|
const toSign = craftBIP322ToSignSimple(toSpend, pkScript);
|
|
18235
18591
|
const scriptCode = btcSigner.OutScript.encode({ type: "pkh", hash: addressHash });
|
|
18236
18592
|
const sighash = toSign.preimageWitnessV0(0, scriptCode, sighashType, 0n);
|
|
@@ -18283,7 +18639,7 @@ function encodeCompactSize(n) {
|
|
|
18283
18639
|
return buf;
|
|
18284
18640
|
}
|
|
18285
18641
|
function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
|
|
18286
|
-
const tx = new
|
|
18642
|
+
const tx = new chunkCDWLZQQW_cjs.Transaction({ version: 0 });
|
|
18287
18643
|
tx.addInput({
|
|
18288
18644
|
txid: toSpend.id,
|
|
18289
18645
|
index: 0,
|
|
@@ -18297,12 +18653,12 @@ function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
|
|
|
18297
18653
|
});
|
|
18298
18654
|
tx.addOutput({
|
|
18299
18655
|
amount: 0n,
|
|
18300
|
-
script:
|
|
18656
|
+
script: chunkCDWLZQQW_cjs.OP_RETURN_EMPTY_PKSCRIPT
|
|
18301
18657
|
});
|
|
18302
18658
|
return tx;
|
|
18303
18659
|
}
|
|
18304
18660
|
function craftBIP322ToSignSimple(toSpend, pkScript) {
|
|
18305
|
-
const tx = new
|
|
18661
|
+
const tx = new chunkCDWLZQQW_cjs.Transaction({ version: 0 });
|
|
18306
18662
|
tx.addInput({
|
|
18307
18663
|
txid: toSpend.id,
|
|
18308
18664
|
index: 0,
|
|
@@ -18314,7 +18670,7 @@ function craftBIP322ToSignSimple(toSpend, pkScript) {
|
|
|
18314
18670
|
});
|
|
18315
18671
|
tx.addOutput({
|
|
18316
18672
|
amount: 0n,
|
|
18317
|
-
script:
|
|
18673
|
+
script: chunkCDWLZQQW_cjs.OP_RETURN_EMPTY_PKSCRIPT
|
|
18318
18674
|
});
|
|
18319
18675
|
return tx;
|
|
18320
18676
|
}
|
|
@@ -18445,7 +18801,7 @@ var RestEmulatorProvider = class {
|
|
|
18445
18801
|
}
|
|
18446
18802
|
};
|
|
18447
18803
|
function finalizeVirtualTx(type, psbtBase64) {
|
|
18448
|
-
const tx =
|
|
18804
|
+
const tx = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
|
|
18449
18805
|
if (type === "INDEXER_CHAINED_TX_TYPE_TREE" /* TREE */) {
|
|
18450
18806
|
const input = tx.getInput(0);
|
|
18451
18807
|
if (!input) {
|
|
@@ -18472,14 +18828,14 @@ var ExitPathError = class extends Error {
|
|
|
18472
18828
|
reason;
|
|
18473
18829
|
};
|
|
18474
18830
|
function delayWeight(sequence) {
|
|
18475
|
-
const t =
|
|
18831
|
+
const t = chunkCDWLZQQW_cjs.sequenceToTimelock(sequence);
|
|
18476
18832
|
return t.type === "blocks" ? Number(t.value) : Number(t.value) / 600;
|
|
18477
18833
|
}
|
|
18478
18834
|
async function resolveUnilateralPath(params) {
|
|
18479
18835
|
const { vtxo, scriptHex, contractRepository } = params;
|
|
18480
18836
|
const contract = contractRepository ? (await contractRepository.getContracts({ script: scriptHex }))[0] : void 0;
|
|
18481
18837
|
if (contract) {
|
|
18482
|
-
const handler =
|
|
18838
|
+
const handler = chunk37XKN5DZ_cjs.contractHandlers.get(contract.type);
|
|
18483
18839
|
if (!handler) {
|
|
18484
18840
|
throw new ExitPathError(
|
|
18485
18841
|
"no-handler",
|
|
@@ -18502,12 +18858,12 @@ async function resolveUnilateralPath(params) {
|
|
|
18502
18858
|
paths.sort((a, b) => delayWeight(a.sequence) - delayWeight(b.sequence));
|
|
18503
18859
|
return { selection: paths[0], label: `${contract.type}:unilateral` };
|
|
18504
18860
|
}
|
|
18505
|
-
const decoded =
|
|
18861
|
+
const decoded = chunkCDWLZQQW_cjs.VtxoScript.decode(vtxo.tapTree);
|
|
18506
18862
|
let best;
|
|
18507
18863
|
for (const exit of decoded.exitPaths()) {
|
|
18508
18864
|
const leaf = decoded.findLeaf(base.hex.encode(exit.script));
|
|
18509
18865
|
if (!leaf) continue;
|
|
18510
|
-
const sequence =
|
|
18866
|
+
const sequence = chunkCDWLZQQW_cjs.timelockToSequence(exit.params.timelock);
|
|
18511
18867
|
const weight = delayWeight(sequence);
|
|
18512
18868
|
if (!best || weight < best.weight) {
|
|
18513
18869
|
best = { selection: { leaf, sequence }, weight };
|
|
@@ -18693,14 +19049,14 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
18693
19049
|
}
|
|
18694
19050
|
const resolved = await resolveUnilateralPath({
|
|
18695
19051
|
vtxo,
|
|
18696
|
-
scriptHex: base.hex.encode(
|
|
19052
|
+
scriptHex: base.hex.encode(chunkCDWLZQQW_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
|
|
18697
19053
|
contractRepository: wallet.contractRepository,
|
|
18698
19054
|
walletPubKeyHex: base.hex.encode(await wallet.identity.xOnlyPublicKey()),
|
|
18699
19055
|
currentTime: Date.now()
|
|
18700
19056
|
});
|
|
18701
19057
|
const spendingLeaf = resolved.selection.leaf;
|
|
18702
19058
|
const sequence = resolved.selection.sequence;
|
|
18703
|
-
const timelock =
|
|
19059
|
+
const timelock = chunkCDWLZQQW_cjs.sequenceToTimelock(sequence);
|
|
18704
19060
|
const elapsed = timelock.type === "blocks" ? chainTip.height >= txStatus.blockHeight + Number(timelock.value) : chainTip.time >= txStatus.blockTime + Number(timelock.value);
|
|
18705
19061
|
if (!elapsed) {
|
|
18706
19062
|
throw new Error(`no available exit path found for vtxo ${vtxo.txid}:${vtxo.vout}`);
|
|
@@ -18713,7 +19069,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
18713
19069
|
sequence,
|
|
18714
19070
|
witnessUtxo: {
|
|
18715
19071
|
amount: BigInt(vtxo.value),
|
|
18716
|
-
script:
|
|
19072
|
+
script: chunkCDWLZQQW_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
|
|
18717
19073
|
},
|
|
18718
19074
|
sighashType: btcSigner.SigHash.DEFAULT
|
|
18719
19075
|
});
|
|
@@ -18723,7 +19079,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
|
|
|
18723
19079
|
btcSigner.TaprootControlBlock.encode(spendingLeaf[0]).length
|
|
18724
19080
|
);
|
|
18725
19081
|
}
|
|
18726
|
-
const tx = new
|
|
19082
|
+
const tx = new chunkCDWLZQQW_cjs.Transaction({ version: 2 });
|
|
18727
19083
|
for (const input of inputs) {
|
|
18728
19084
|
tx.addInput(input);
|
|
18729
19085
|
}
|
|
@@ -18790,7 +19146,7 @@ async function buildSignedSweep(params) {
|
|
|
18790
19146
|
`uneconomic vtxo ${vtxo.txid}:${vtxo.vout}: value ${vtxo.value} - fee ${fee} < dust`
|
|
18791
19147
|
);
|
|
18792
19148
|
}
|
|
18793
|
-
const tx = new
|
|
19149
|
+
const tx = new chunkCDWLZQQW_cjs.Transaction({ version: 2 });
|
|
18794
19150
|
tx.addInput({
|
|
18795
19151
|
txid: vtxo.txid,
|
|
18796
19152
|
index: vtxo.vout,
|
|
@@ -18815,7 +19171,7 @@ async function buildSignedSweep(params) {
|
|
|
18815
19171
|
finalScriptWitness: [
|
|
18816
19172
|
tapScriptSig[0][1],
|
|
18817
19173
|
...path.extraWitness,
|
|
18818
|
-
|
|
19174
|
+
chunkCDWLZQQW_cjs.scriptFromTapLeafScript(path.leaf),
|
|
18819
19175
|
btcSigner.TaprootControlBlock.encode(controlBlock)
|
|
18820
19176
|
]
|
|
18821
19177
|
});
|
|
@@ -18845,7 +19201,7 @@ async function resolveFeeRate(opts) {
|
|
|
18845
19201
|
}
|
|
18846
19202
|
async function selectExitVtxos(opts) {
|
|
18847
19203
|
if (!opts.vtxos) return opts.wallet.getVtxos();
|
|
18848
|
-
const res = await
|
|
19204
|
+
const res = await chunkCDWLZQQW_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
|
|
18849
19205
|
const tapTrees = /* @__PURE__ */ new Map();
|
|
18850
19206
|
const out = [];
|
|
18851
19207
|
for (const vtxo of res.vtxos) {
|
|
@@ -18860,7 +19216,7 @@ async function selectExitVtxos(opts) {
|
|
|
18860
19216
|
`no contract registered for vtxo script ${vtxo.script} \u2014 register the contract before exiting`
|
|
18861
19217
|
);
|
|
18862
19218
|
}
|
|
18863
|
-
const handler =
|
|
19219
|
+
const handler = chunk37XKN5DZ_cjs.contractHandlers.get(contract.type);
|
|
18864
19220
|
if (!handler) {
|
|
18865
19221
|
throw new Error(`no contract handler registered for type '${contract.type}'`);
|
|
18866
19222
|
}
|
|
@@ -18890,7 +19246,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
18890
19246
|
if (pendingNodes.length > 0) {
|
|
18891
19247
|
const txs = await resolver.getVirtualTxs(pendingNodes.map((n) => n.txid));
|
|
18892
19248
|
for (const psbt of txs) {
|
|
18893
|
-
psbts.set(
|
|
19249
|
+
psbts.set(chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
|
|
18894
19250
|
}
|
|
18895
19251
|
}
|
|
18896
19252
|
const childVsize = Number(
|
|
@@ -18926,7 +19282,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
18926
19282
|
try {
|
|
18927
19283
|
const resolved = await resolveUnilateralPath({
|
|
18928
19284
|
vtxo,
|
|
18929
|
-
scriptHex: base.hex.encode(
|
|
19285
|
+
scriptHex: base.hex.encode(chunkCDWLZQQW_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
|
|
18930
19286
|
contractRepository: wallet.contractRepository,
|
|
18931
19287
|
walletPubKeyHex,
|
|
18932
19288
|
currentTime: Date.now()
|
|
@@ -18945,7 +19301,7 @@ async function computeExitLayout(opts, feeRate) {
|
|
|
18945
19301
|
});
|
|
18946
19302
|
continue;
|
|
18947
19303
|
}
|
|
18948
|
-
const t =
|
|
19304
|
+
const t = chunkCDWLZQQW_cjs.sequenceToTimelock(resolved.selection.sequence);
|
|
18949
19305
|
const delay = { type: t.type, value: Number(t.value) };
|
|
18950
19306
|
infos.push({ outpoint, value: vtxo.value, sweepFee, path: resolved.label, delay });
|
|
18951
19307
|
sweeps.push({ vtxo, resolved, sweepFee, delay });
|
|
@@ -19284,7 +19640,7 @@ async function prepare(opts) {
|
|
|
19284
19640
|
txid: sweep.vtxo.txid,
|
|
19285
19641
|
vout: sweep.vtxo.vout,
|
|
19286
19642
|
value: sweep.vtxo.value,
|
|
19287
|
-
pkScript:
|
|
19643
|
+
pkScript: chunkCDWLZQQW_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
|
|
19288
19644
|
},
|
|
19289
19645
|
path: sweep.resolved.selection,
|
|
19290
19646
|
outputAddress: opts.sweepAddress,
|
|
@@ -19369,7 +19725,7 @@ async function prepare(opts) {
|
|
|
19369
19725
|
if (newFee <= splitterFee) break;
|
|
19370
19726
|
splitterFee = newFee;
|
|
19371
19727
|
}
|
|
19372
|
-
const splitter = new
|
|
19728
|
+
const splitter = new chunkCDWLZQQW_cjs.Transaction({ version: 2 });
|
|
19373
19729
|
for (const coin of selected.inputs) {
|
|
19374
19730
|
splitter.addInput({
|
|
19375
19731
|
txid: coin.txid,
|
|
@@ -19512,44 +19868,45 @@ var UnilateralExit = {
|
|
|
19512
19868
|
// src/arkade/index.ts
|
|
19513
19869
|
var arkade_exports = {};
|
|
19514
19870
|
chunk5BLDMQED_cjs.__export(arkade_exports, {
|
|
19515
|
-
ARKADE_OP: () =>
|
|
19516
|
-
ARKADE_OPCODES: () =>
|
|
19517
|
-
ARKADE_OPCODE_NAMES: () =>
|
|
19518
|
-
ARKADE_OPCODE_VALUES: () =>
|
|
19519
|
-
ARKADE_OPS: () =>
|
|
19871
|
+
ARKADE_OP: () => chunk37XKN5DZ_cjs.ARKADE_OP,
|
|
19872
|
+
ARKADE_OPCODES: () => chunk37XKN5DZ_cjs.ARKADE_OPCODES,
|
|
19873
|
+
ARKADE_OPCODE_NAMES: () => chunk37XKN5DZ_cjs.ARKADE_OPCODE_NAMES,
|
|
19874
|
+
ARKADE_OPCODE_VALUES: () => chunk37XKN5DZ_cjs.ARKADE_OPCODE_VALUES,
|
|
19875
|
+
ARKADE_OPS: () => chunk37XKN5DZ_cjs.ARKADE_OPS,
|
|
19520
19876
|
Arkade: () => Arkade,
|
|
19521
19877
|
ArkadeContract: () => ArkadeContract,
|
|
19522
|
-
ArkadeProgramScript: () =>
|
|
19523
|
-
ArkadeScript: () =>
|
|
19878
|
+
ArkadeProgramScript: () => chunk37XKN5DZ_cjs.ArkadeProgramScript,
|
|
19879
|
+
ArkadeScript: () => chunk37XKN5DZ_cjs.ArkadeScript,
|
|
19524
19880
|
ArkadeTransactionBuilder: () => ArkadeTransactionBuilder,
|
|
19525
|
-
BigNum: () =>
|
|
19881
|
+
BigNum: () => chunk37XKN5DZ_cjs.bignum_exports,
|
|
19526
19882
|
OP: () => btcSigner.OP,
|
|
19527
|
-
OPCODE_NAMES: () =>
|
|
19528
|
-
OPCODE_VALUES: () =>
|
|
19529
|
-
SUPPORTED_PROGRAM_VERSION: () =>
|
|
19883
|
+
OPCODE_NAMES: () => chunk37XKN5DZ_cjs.OPCODE_NAMES,
|
|
19884
|
+
OPCODE_VALUES: () => chunk37XKN5DZ_cjs.OPCODE_VALUES,
|
|
19885
|
+
SUPPORTED_PROGRAM_VERSION: () => chunk37XKN5DZ_cjs.SUPPORTED_PROGRAM_VERSION,
|
|
19530
19886
|
Script: () => btcSigner.Script,
|
|
19531
|
-
arkadeScriptHash: () =>
|
|
19532
|
-
arkadeWitnessHash: () =>
|
|
19533
|
-
asmToBytes: () =>
|
|
19534
|
-
bytesToASM: () =>
|
|
19535
|
-
computeArkadeScriptPublicKey: () =>
|
|
19887
|
+
arkadeScriptHash: () => chunk37XKN5DZ_cjs.arkadeScriptHash,
|
|
19888
|
+
arkadeWitnessHash: () => chunk37XKN5DZ_cjs.arkadeWitnessHash,
|
|
19889
|
+
asmToBytes: () => chunk37XKN5DZ_cjs.asmToBytes,
|
|
19890
|
+
bytesToASM: () => chunk37XKN5DZ_cjs.bytesToASM,
|
|
19891
|
+
computeArkadeScriptPublicKey: () => chunk37XKN5DZ_cjs.computeArkadeScriptPublicKey,
|
|
19536
19892
|
createArkadeBatchHandler: () => createArkadeBatchHandler,
|
|
19537
|
-
deserializeArkadeContractParams: () =>
|
|
19538
|
-
fromASM: () =>
|
|
19539
|
-
getOpcodeName: () =>
|
|
19540
|
-
getOpcodeValue: () =>
|
|
19541
|
-
parseArtifact: () =>
|
|
19542
|
-
resolveAsm: () =>
|
|
19543
|
-
serializeArkadeContractParams: () =>
|
|
19544
|
-
stringifyArtifact: () =>
|
|
19545
|
-
toASM: () =>
|
|
19546
|
-
validateProgram: () =>
|
|
19547
|
-
witnessRefToBytes: () =>
|
|
19893
|
+
deserializeArkadeContractParams: () => chunk37XKN5DZ_cjs.deserializeArkadeContractParams,
|
|
19894
|
+
fromASM: () => chunk37XKN5DZ_cjs.fromASM,
|
|
19895
|
+
getOpcodeName: () => chunk37XKN5DZ_cjs.getOpcodeName,
|
|
19896
|
+
getOpcodeValue: () => chunk37XKN5DZ_cjs.getOpcodeValue,
|
|
19897
|
+
parseArtifact: () => chunk37XKN5DZ_cjs.parseArtifact,
|
|
19898
|
+
resolveAsm: () => chunk37XKN5DZ_cjs.resolveAsm,
|
|
19899
|
+
serializeArkadeContractParams: () => chunk37XKN5DZ_cjs.serializeArkadeContractParams,
|
|
19900
|
+
stringifyArtifact: () => chunk37XKN5DZ_cjs.stringifyArtifact,
|
|
19901
|
+
toASM: () => chunk37XKN5DZ_cjs.toASM,
|
|
19902
|
+
validateProgram: () => chunk37XKN5DZ_cjs.validateProgram,
|
|
19903
|
+
witnessRefToBytes: () => chunk37XKN5DZ_cjs.witnessRefToBytes
|
|
19548
19904
|
});
|
|
19549
|
-
var isVtxoCoin = (input) =>
|
|
19905
|
+
var isVtxoCoin = (input) => chunkCDWLZQQW_cjs.isVirtualCoin(input);
|
|
19550
19906
|
function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message, session, arkProvider, emulator, network, recipients) {
|
|
19551
19907
|
let batchId;
|
|
19552
19908
|
let sweepTapTreeRoot;
|
|
19909
|
+
let validatedCommitmentTxid;
|
|
19553
19910
|
return {
|
|
19554
19911
|
onBatchStarted: async (event) => {
|
|
19555
19912
|
const utf8IntentId = new TextEncoder().encode(intentId);
|
|
@@ -19558,7 +19915,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
19558
19915
|
if (!event.intentIdHashes.includes(intentIdHashStr)) return { skip: true };
|
|
19559
19916
|
await arkProvider.confirmRegistration(intentId);
|
|
19560
19917
|
batchId = event.id;
|
|
19561
|
-
const sweepTapscript =
|
|
19918
|
+
const sweepTapscript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.encode({
|
|
19562
19919
|
timelock: {
|
|
19563
19920
|
value: event.batchExpiry,
|
|
19564
19921
|
// BIP-65: values >= 512 are interpreted as seconds, below as blocks
|
|
@@ -19576,7 +19933,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
19576
19933
|
if (!xOnlyPubkeys.includes(base.hex.encode(xonlySignerPubKey))) {
|
|
19577
19934
|
return { skip: true };
|
|
19578
19935
|
}
|
|
19579
|
-
const commitmentTx =
|
|
19936
|
+
const commitmentTx = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
|
|
19580
19937
|
validateVtxoTxGraph(vtxoTree, commitmentTx, sweepTapTreeRoot);
|
|
19581
19938
|
if (recipients && recipients.length > 0) {
|
|
19582
19939
|
validateBatchRecipients(commitmentTx, vtxoTree.leaves(), recipients, network);
|
|
@@ -19585,6 +19942,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
19585
19942
|
if (!sharedOutput?.amount) {
|
|
19586
19943
|
throw new Error("Shared output not found");
|
|
19587
19944
|
}
|
|
19945
|
+
validatedCommitmentTxid = commitmentTx.id;
|
|
19588
19946
|
await session.init(vtxoTree, sweepTapTreeRoot, sharedOutput.amount);
|
|
19589
19947
|
const pubkey = base.hex.encode(await session.getPublicKey());
|
|
19590
19948
|
const nonces = await session.getNonces();
|
|
@@ -19607,7 +19965,15 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
19607
19965
|
if (connectorTree) {
|
|
19608
19966
|
validateConnectorsTxGraph(event.commitmentTx, connectorTree);
|
|
19609
19967
|
}
|
|
19610
|
-
let commitmentPsbt =
|
|
19968
|
+
let commitmentPsbt = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
|
|
19969
|
+
assertFinalCommitmentMatchesValidated(
|
|
19970
|
+
commitmentPsbt,
|
|
19971
|
+
validatedCommitmentTxid,
|
|
19972
|
+
"arkade batch finalization"
|
|
19973
|
+
);
|
|
19974
|
+
if (!validatedCommitmentTxid && recipients && recipients.length > 0) {
|
|
19975
|
+
validateBatchRecipientsWithoutTree(commitmentPsbt, recipients, network);
|
|
19976
|
+
}
|
|
19611
19977
|
const signedForfeits = [];
|
|
19612
19978
|
let connectorIndex = 0;
|
|
19613
19979
|
const connectorLeaves = connectorTree?.leaves() || [];
|
|
@@ -19634,7 +20000,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
19634
20000
|
boardingIndices.push(boardingIdx);
|
|
19635
20001
|
continue;
|
|
19636
20002
|
}
|
|
19637
|
-
if (
|
|
20003
|
+
if (chunkCDWLZQQW_cjs.isRecoverable(input) || isSubdust(input, info.dust)) {
|
|
19638
20004
|
continue;
|
|
19639
20005
|
}
|
|
19640
20006
|
if (connectorIndex >= connectorLeaves.length) {
|
|
@@ -19655,7 +20021,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
|
|
|
19655
20021
|
index: input.vout,
|
|
19656
20022
|
witnessUtxo: {
|
|
19657
20023
|
amount: BigInt(input.value),
|
|
19658
|
-
script:
|
|
20024
|
+
script: chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).pkScript
|
|
19659
20025
|
},
|
|
19660
20026
|
sighashType: btcSigner.SigHash.DEFAULT,
|
|
19661
20027
|
tapLeafScript: [input.forfeitTapLeafScript]
|
|
@@ -19738,7 +20104,7 @@ var Arkade = class _Arkade {
|
|
|
19738
20104
|
static async connect(opts) {
|
|
19739
20105
|
const info = await opts.arkade.getInfo();
|
|
19740
20106
|
const serverKey = base.hex.decode(info.signerPubkey).slice(1);
|
|
19741
|
-
const checkpoint =
|
|
20107
|
+
const checkpoint = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
|
|
19742
20108
|
let emulatorKey;
|
|
19743
20109
|
if (opts.emulator) {
|
|
19744
20110
|
const eInfo = await opts.emulator.getInfo();
|
|
@@ -19752,7 +20118,7 @@ var Arkade = class _Arkade {
|
|
|
19752
20118
|
return new _Arkade({
|
|
19753
20119
|
arkProvider: opts.arkade,
|
|
19754
20120
|
emulator: opts.emulator,
|
|
19755
|
-
network: opts.network ??
|
|
20121
|
+
network: opts.network ?? chunkCDWLZQQW_cjs.DEFAULT_NETWORK,
|
|
19756
20122
|
serverKey,
|
|
19757
20123
|
emulatorKey,
|
|
19758
20124
|
checkpoint,
|
|
@@ -19773,7 +20139,7 @@ var Arkade = class _Arkade {
|
|
|
19773
20139
|
* key respectively; explicit args always win.
|
|
19774
20140
|
*/
|
|
19775
20141
|
contract(program, args = {}) {
|
|
19776
|
-
const declared = (program.params ?? []).map(
|
|
20142
|
+
const declared = (program.params ?? []).map(chunk37XKN5DZ_cjs.inputName);
|
|
19777
20143
|
if (declared.includes("server") && args.server === void 0) {
|
|
19778
20144
|
args = { ...args, server: this.serverKey };
|
|
19779
20145
|
}
|
|
@@ -19793,7 +20159,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
19793
20159
|
userKey: client.userKey,
|
|
19794
20160
|
emulatorKey: client.emulatorKey
|
|
19795
20161
|
};
|
|
19796
|
-
this.vtxoScript = new
|
|
20162
|
+
this.vtxoScript = new chunk37XKN5DZ_cjs.ArkadeProgramScript(program, args, this.keys);
|
|
19797
20163
|
this.tapTree = this.vtxoScript.encode();
|
|
19798
20164
|
this.compiled = this.vtxoScript.compiled;
|
|
19799
20165
|
}
|
|
@@ -19821,7 +20187,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
19821
20187
|
`ArkadeContract.fromContract: expected contract type 'arkade', got '${contract.type}'`
|
|
19822
20188
|
);
|
|
19823
20189
|
}
|
|
19824
|
-
const typed =
|
|
20190
|
+
const typed = chunk37XKN5DZ_cjs.deserializeArkadeContractParams(contract.params);
|
|
19825
20191
|
return new _ArkadeContract(client, typed.program, typed.args, {
|
|
19826
20192
|
serverKey: typed.serverKey,
|
|
19827
20193
|
userKey: typed.userKey,
|
|
@@ -19862,7 +20228,7 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
19862
20228
|
toContractParams() {
|
|
19863
20229
|
return {
|
|
19864
20230
|
type: "arkade",
|
|
19865
|
-
params:
|
|
20231
|
+
params: chunk37XKN5DZ_cjs.serializeArkadeContractParams({
|
|
19866
20232
|
program: this.program,
|
|
19867
20233
|
args: this.args,
|
|
19868
20234
|
serverKey: this.keys.serverKey,
|
|
@@ -19907,13 +20273,13 @@ var ArkadeContract = class _ArkadeContract {
|
|
|
19907
20273
|
const [registered] = await manager.getContracts({ script: scriptHex });
|
|
19908
20274
|
if (registered) {
|
|
19909
20275
|
const [withVtxos] = await manager.getContractsWithVtxos({ script: scriptHex });
|
|
19910
|
-
return (withVtxos?.vtxos ?? []).filter((v) => !
|
|
20276
|
+
return (withVtxos?.vtxos ?? []).filter((v) => !chunkCDWLZQQW_cjs.hasTerminalSpend(v));
|
|
19911
20277
|
}
|
|
19912
20278
|
}
|
|
19913
20279
|
if (!this.client.indexer) {
|
|
19914
20280
|
throw new Error("ArkadeContract.getUtxos: an indexer is required");
|
|
19915
20281
|
}
|
|
19916
|
-
const { vtxos } = await
|
|
20282
|
+
const { vtxos } = await chunkCDWLZQQW_cjs.getNormalizedVtxos(this.client.indexer, {
|
|
19917
20283
|
scripts: [scriptHex],
|
|
19918
20284
|
spendableOnly: true
|
|
19919
20285
|
});
|
|
@@ -20015,12 +20381,12 @@ var ArkadeTransactionBuilder = class {
|
|
|
20015
20381
|
this.contract.client.checkpoint
|
|
20016
20382
|
);
|
|
20017
20383
|
if (coin.sourceTx) {
|
|
20018
|
-
|
|
20384
|
+
chunkCDWLZQQW_cjs.setArkPsbtField(arkTx, 0, chunkCDWLZQQW_cjs.PrevArkTxField, coin.sourceTx);
|
|
20019
20385
|
}
|
|
20020
20386
|
const condition = (def.tapscript.witness ?? []).map((w) => this.witnessBytes(w));
|
|
20021
20387
|
if (condition.length > 0) {
|
|
20022
|
-
|
|
20023
|
-
|
|
20388
|
+
chunkCDWLZQQW_cjs.setArkPsbtField(arkTx, 0, chunkCDWLZQQW_cjs.ConditionWitness, condition);
|
|
20389
|
+
chunkCDWLZQQW_cjs.setArkPsbtField(checkpoints[0], 0, chunkCDWLZQQW_cjs.ConditionWitness, condition);
|
|
20024
20390
|
}
|
|
20025
20391
|
const packets = [];
|
|
20026
20392
|
if (this.assetSpecs.length > 0) {
|
|
@@ -20059,7 +20425,7 @@ var ArkadeTransactionBuilder = class {
|
|
|
20059
20425
|
base.base64.encode(signedArk2.toPSBT()),
|
|
20060
20426
|
signedCps.map((c) => base.base64.encode(c.toPSBT()))
|
|
20061
20427
|
);
|
|
20062
|
-
const txid =
|
|
20428
|
+
const txid = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
|
|
20063
20429
|
return {
|
|
20064
20430
|
txid,
|
|
20065
20431
|
signedArkTx: res2.signedArkTx,
|
|
@@ -20074,11 +20440,11 @@ var ArkadeTransactionBuilder = class {
|
|
|
20074
20440
|
base.base64.encode(signedArk.toPSBT()),
|
|
20075
20441
|
checkpoints.map((c) => base.base64.encode(c.toPSBT()))
|
|
20076
20442
|
);
|
|
20443
|
+
assertSubmittedArkTxid(res, signedArk, "submitTx");
|
|
20444
|
+
const matched = matchServerCheckpoints(res.signedCheckpointTxs, checkpoints, "submitTx");
|
|
20077
20445
|
const finalCps = await Promise.all(
|
|
20078
|
-
|
|
20079
|
-
async (
|
|
20080
|
-
(await client.identity.sign(chunkGMUVWKOK_cjs.Transaction.fromPSBT(base.base64.decode(b)), [0])).toPSBT()
|
|
20081
|
-
)
|
|
20446
|
+
matched.map(
|
|
20447
|
+
async ({ server }) => base.base64.encode((await client.identity.sign(server, [0])).toPSBT())
|
|
20082
20448
|
)
|
|
20083
20449
|
);
|
|
20084
20450
|
await client.arkProvider.finalizeTx(res.arkTxid, finalCps);
|
|
@@ -20118,23 +20484,23 @@ var ArkadeTransactionBuilder = class {
|
|
|
20118
20484
|
}
|
|
20119
20485
|
buildAssetPacket() {
|
|
20120
20486
|
const groups = this.assetSpecs.map((s) => {
|
|
20121
|
-
const id = typeof s.assetId === "string" ?
|
|
20122
|
-
return
|
|
20487
|
+
const id = typeof s.assetId === "string" ? chunk24YNIQSW_cjs.AssetId.fromString(s.assetId) : chunk24YNIQSW_cjs.AssetId.fromBytes(s.assetId);
|
|
20488
|
+
return chunk24YNIQSW_cjs.AssetGroup.create(
|
|
20123
20489
|
id,
|
|
20124
20490
|
null,
|
|
20125
|
-
s.inputs.map((i) =>
|
|
20126
|
-
s.outputs.map((o) =>
|
|
20127
|
-
(s.metadata ?? []).map((m) =>
|
|
20491
|
+
s.inputs.map((i) => chunk24YNIQSW_cjs.AssetInput.create(i.vin, i.amount)),
|
|
20492
|
+
s.outputs.map((o) => chunk24YNIQSW_cjs.AssetOutput.create(o.vout, o.amount)),
|
|
20493
|
+
(s.metadata ?? []).map((m) => chunk24YNIQSW_cjs.Metadata.create(m.key, m.value))
|
|
20128
20494
|
);
|
|
20129
20495
|
});
|
|
20130
|
-
return
|
|
20496
|
+
return chunk24YNIQSW_cjs.Packet.create(groups);
|
|
20131
20497
|
}
|
|
20132
20498
|
witnessBytes(ref) {
|
|
20133
|
-
return
|
|
20499
|
+
return chunk37XKN5DZ_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
|
|
20134
20500
|
}
|
|
20135
20501
|
};
|
|
20136
20502
|
function bindInputs(fn, callArgs) {
|
|
20137
|
-
const names = (fn.def.inputs ?? []).map(
|
|
20503
|
+
const names = (fn.def.inputs ?? []).map(chunk37XKN5DZ_cjs.inputName);
|
|
20138
20504
|
if (callArgs.length !== names.length) {
|
|
20139
20505
|
throw new Error(`${fn.name}: expected ${names.length} argument(s), got ${callArgs.length}`);
|
|
20140
20506
|
}
|
|
@@ -20541,7 +20907,7 @@ function decodeArkContract(encoded) {
|
|
|
20541
20907
|
}
|
|
20542
20908
|
function contractFromArkContract(encoded, options = {}) {
|
|
20543
20909
|
const parsed = decodeArkContract(encoded);
|
|
20544
|
-
const handler =
|
|
20910
|
+
const handler = chunk37XKN5DZ_cjs.contractHandlers.get(parsed.type);
|
|
20545
20911
|
if (!handler) {
|
|
20546
20912
|
throw new Error(`No handler registered for contract type '${parsed.type}'`);
|
|
20547
20913
|
}
|
|
@@ -20555,9 +20921,9 @@ function contractFromArkContract(encoded, options = {}) {
|
|
|
20555
20921
|
metadata: options.metadata
|
|
20556
20922
|
};
|
|
20557
20923
|
}
|
|
20558
|
-
function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix =
|
|
20924
|
+
function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunkCDWLZQQW_cjs.DEFAULT_NETWORK.hrp, options = {}) {
|
|
20559
20925
|
const parsed = decodeArkContract(encoded);
|
|
20560
|
-
const handler =
|
|
20926
|
+
const handler = chunk37XKN5DZ_cjs.contractHandlers.getOrThrow(parsed.type);
|
|
20561
20927
|
const params = parsed.data;
|
|
20562
20928
|
const vtxoScript = handler.createScript(params);
|
|
20563
20929
|
return {
|
|
@@ -20594,6 +20960,7 @@ exports.DelegateManagerImpl = DelegateManagerImpl;
|
|
|
20594
20960
|
exports.DelegateNotConfiguredError = DelegateNotConfiguredError;
|
|
20595
20961
|
exports.DelegatorManagerImpl = DelegatorManagerImpl;
|
|
20596
20962
|
exports.DelegatorNotConfiguredError = DelegatorNotConfiguredError;
|
|
20963
|
+
exports.DescriptorIdentity = DescriptorIdentity;
|
|
20597
20964
|
exports.DescriptorSigningProviderMissingError = DescriptorSigningProviderMissingError;
|
|
20598
20965
|
exports.DustChangeError = DustChangeError;
|
|
20599
20966
|
exports.ELECTRUM_TCP_HOST = ELECTRUM_TCP_HOST;
|
|
@@ -20654,8 +21021,11 @@ exports.WsElectrumChainSource = WsElectrumChainSource;
|
|
|
20654
21021
|
exports.arkRail = arkRail;
|
|
20655
21022
|
exports.arkTarget = arkTarget;
|
|
20656
21023
|
exports.arkade_exports = arkade_exports;
|
|
21024
|
+
exports.assertFinalCommitmentMatchesValidated = assertFinalCommitmentMatchesValidated;
|
|
20657
21025
|
exports.assertIntentIdUnique = assertIntentIdUnique;
|
|
20658
21026
|
exports.assertSendableAmount = assertSendableAmount;
|
|
21027
|
+
exports.assertSubmittedArkTxid = assertSubmittedArkTxid;
|
|
21028
|
+
exports.assetMintResolver = assetMintResolver;
|
|
20659
21029
|
exports.boardingResolver = boardingResolver;
|
|
20660
21030
|
exports.btcTarget = btcTarget;
|
|
20661
21031
|
exports.buildForfeitTx = buildForfeitTx;
|
|
@@ -20663,6 +21033,7 @@ exports.buildOffchainTx = buildOffchainTx;
|
|
|
20663
21033
|
exports.classifyAgainstSignerSet = classifyAgainstSignerSet;
|
|
20664
21034
|
exports.classifyContractSigner = classifyContractSigner;
|
|
20665
21035
|
exports.closeDatabase = closeDatabase;
|
|
21036
|
+
exports.collabExitResolver = collabExitResolver;
|
|
20666
21037
|
exports.combineTapscriptSigs = combineTapscriptSigs;
|
|
20667
21038
|
exports.contractFromArkContract = contractFromArkContract;
|
|
20668
21039
|
exports.contractFromArkContractWithAddress = contractFromArkContractWithAddress;
|
|
@@ -20689,6 +21060,8 @@ exports.isBatchSignable = isBatchSignable;
|
|
|
20689
21060
|
exports.isBtcAddress = isBtcAddress;
|
|
20690
21061
|
exports.isCooperativelyMigratable = isCooperativelyMigratable;
|
|
20691
21062
|
exports.isDiscoverable = isDiscoverable;
|
|
21063
|
+
exports.isHDDeterministicSignCapable = isHDDeterministicSignCapable;
|
|
21064
|
+
exports.isHDWalletCapable = isHDWalletCapable;
|
|
20692
21065
|
exports.isLightningInvoice = isLightningInvoice;
|
|
20693
21066
|
exports.isLnurl = isLnurl;
|
|
20694
21067
|
exports.isMessageBusInitializingError = isMessageBusInitializingError;
|
|
@@ -20699,6 +21072,7 @@ exports.isValidArkAddress = isValidArkAddress;
|
|
|
20699
21072
|
exports.isVtxoExpiringSoon = isVtxoExpiringSoon;
|
|
20700
21073
|
exports.isVtxoForScript = isVtxoForScript;
|
|
20701
21074
|
exports.makeHandle = makeHandle;
|
|
21075
|
+
exports.matchServerCheckpoints = matchServerCheckpoints;
|
|
20702
21076
|
exports.mergeChainedTxType = mergeChainedTxType;
|
|
20703
21077
|
exports.migrateWalletRepository = migrateWalletRepository;
|
|
20704
21078
|
exports.onchainRail = onchainRail;
|
|
@@ -20718,10 +21092,11 @@ exports.setupServiceWorker = setupServiceWorker;
|
|
|
20718
21092
|
exports.signerSetFromInfo = signerSetFromInfo;
|
|
20719
21093
|
exports.toXOnlySignerHex = toXOnlySignerHex;
|
|
20720
21094
|
exports.tryResolveSendAmount = tryResolveSendAmount;
|
|
21095
|
+
exports.validateBatchRecipients = validateBatchRecipients;
|
|
20721
21096
|
exports.validateConnectorsTxGraph = validateConnectorsTxGraph;
|
|
20722
21097
|
exports.validateVtxoTxGraph = validateVtxoTxGraph;
|
|
20723
21098
|
exports.verifyTapscriptSignatures = verifyTapscriptSignatures;
|
|
20724
21099
|
exports.waitForIncomingFunds = waitForIncomingFunds;
|
|
20725
21100
|
exports.warnAndFilterVtxosForScript = warnAndFilterVtxosForScript;
|
|
20726
|
-
//# sourceMappingURL=chunk-
|
|
20727
|
-
//# sourceMappingURL=chunk-
|
|
21101
|
+
//# sourceMappingURL=chunk-ENRRZFZ4.cjs.map
|
|
21102
|
+
//# sourceMappingURL=chunk-ENRRZFZ4.cjs.map
|