@toon-protocol/client-mcp 0.4.0 → 0.4.1
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/app/index.html +125 -47
- package/dist/{chunk-HDAH6TAT.js → chunk-APL3TRE6.js} +2 -2
- package/dist/{chunk-WGR4UZ34.js → chunk-R75M6TK6.js} +514 -133
- package/dist/chunk-R75M6TK6.js.map +1 -0
- package/dist/{chunk-MAQ3UZPR.js → chunk-YTUDCEXE.js} +2 -2
- package/dist/daemon.js +2 -2
- package/dist/index.js +3 -3
- package/dist/mcp.js +2 -2
- package/package.json +3 -3
- package/dist/chunk-WGR4UZ34.js.map +0 -1
- /package/dist/{chunk-HDAH6TAT.js.map → chunk-APL3TRE6.js.map} +0 -0
- /package/dist/{chunk-MAQ3UZPR.js.map → chunk-YTUDCEXE.js.map} +0 -0
|
@@ -30,11 +30,7 @@ import {
|
|
|
30
30
|
utf8ToBytes
|
|
31
31
|
} from "./chunk-VA7XC4FD.js";
|
|
32
32
|
|
|
33
|
-
//
|
|
34
|
-
import { generateSecretKey as generateSecretKey3, getPublicKey as getPublicKey22, finalizeEvent as finalizeEvent11 } from "nostr-tools/pure";
|
|
35
|
-
import { generateSecretKey as generateSecretKey2 } from "nostr-tools/pure";
|
|
36
|
-
|
|
37
|
-
// ../../node_modules/.pnpm/@toon-protocol+core@1.4.2_@toon-protocol+connector@3.13.0_typescript@5.9.3/node_modules/@toon-protocol/core/dist/chunk-5WT7ISKC.js
|
|
33
|
+
// ../../node_modules/.pnpm/@toon-protocol+core@1.6.0_@toon-protocol+connector@3.13.0_typescript@5.9.3/node_modules/@toon-protocol/core/dist/chunk-5WT7ISKC.js
|
|
38
34
|
import { encode } from "@toon-format/toon";
|
|
39
35
|
import { decode } from "@toon-format/toon";
|
|
40
36
|
import { decode as decode2 } from "@toon-format/toon";
|
|
@@ -58,99 +54,8 @@ var PeerDiscoveryError = class extends ToonError {
|
|
|
58
54
|
this.name = "PeerDiscoveryError";
|
|
59
55
|
}
|
|
60
56
|
};
|
|
61
|
-
var ToonEncodeError = class extends ToonError {
|
|
62
|
-
constructor(message, cause) {
|
|
63
|
-
super(message, "TOON_ENCODE_ERROR", cause);
|
|
64
|
-
this.name = "ToonEncodeError";
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
function encodeEventToToon(event) {
|
|
68
|
-
try {
|
|
69
|
-
const toonString = encode(event);
|
|
70
|
-
return new TextEncoder().encode(toonString);
|
|
71
|
-
} catch (error) {
|
|
72
|
-
throw new ToonEncodeError(
|
|
73
|
-
`Failed to encode event to TOON: ${error instanceof Error ? error.message : String(error)}`,
|
|
74
|
-
error instanceof Error ? error : void 0
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
function isValidHex(value, length) {
|
|
79
|
-
if (typeof value !== "string") return false;
|
|
80
|
-
if (value.length !== length) return false;
|
|
81
|
-
return /^[0-9a-f]+$/i.test(value);
|
|
82
|
-
}
|
|
83
|
-
var ToonDecodeError = class extends ToonError {
|
|
84
|
-
constructor(message, cause) {
|
|
85
|
-
super(message, "TOON_DECODE_ERROR", cause);
|
|
86
|
-
this.name = "ToonDecodeError";
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
function validateNostrEvent(obj) {
|
|
90
|
-
if (typeof obj !== "object" || obj === null) {
|
|
91
|
-
throw new ToonDecodeError("Decoded value is not an object");
|
|
92
|
-
}
|
|
93
|
-
const event = obj;
|
|
94
|
-
if (!isValidHex(event["id"], 64)) {
|
|
95
|
-
throw new ToonDecodeError(
|
|
96
|
-
"Invalid event id: must be a 64-character hex string"
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
if (!isValidHex(event["pubkey"], 64)) {
|
|
100
|
-
throw new ToonDecodeError(
|
|
101
|
-
"Invalid event pubkey: must be a 64-character hex string"
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
if (typeof event["kind"] !== "number" || !Number.isInteger(event["kind"])) {
|
|
105
|
-
throw new ToonDecodeError("Invalid event kind: must be an integer");
|
|
106
|
-
}
|
|
107
|
-
if (typeof event["content"] !== "string") {
|
|
108
|
-
throw new ToonDecodeError("Invalid event content: must be a string");
|
|
109
|
-
}
|
|
110
|
-
const tags = event["tags"];
|
|
111
|
-
if (!Array.isArray(tags)) {
|
|
112
|
-
throw new ToonDecodeError("Invalid event tags: must be an array");
|
|
113
|
-
}
|
|
114
|
-
for (let i = 0; i < tags.length; i++) {
|
|
115
|
-
const tag = tags[i];
|
|
116
|
-
if (!Array.isArray(tag)) {
|
|
117
|
-
throw new ToonDecodeError(`Invalid event tags[${i}]: must be an array`);
|
|
118
|
-
}
|
|
119
|
-
for (let j = 0; j < tag.length; j++) {
|
|
120
|
-
if (typeof tag[j] !== "string") {
|
|
121
|
-
throw new ToonDecodeError(
|
|
122
|
-
`Invalid event tags[${i}][${j}]: must be a string`
|
|
123
|
-
);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
if (typeof event["created_at"] !== "number" || !Number.isInteger(event["created_at"])) {
|
|
128
|
-
throw new ToonDecodeError("Invalid event created_at: must be an integer");
|
|
129
|
-
}
|
|
130
|
-
if (!isValidHex(event["sig"], 128)) {
|
|
131
|
-
throw new ToonDecodeError(
|
|
132
|
-
"Invalid event sig: must be a 128-character hex string"
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
function decodeEventFromToon(data) {
|
|
137
|
-
try {
|
|
138
|
-
const toonString = new TextDecoder().decode(data);
|
|
139
|
-
const decoded = decode(toonString);
|
|
140
|
-
validateNostrEvent(decoded);
|
|
141
|
-
return decoded;
|
|
142
|
-
} catch (error) {
|
|
143
|
-
if (error instanceof ToonDecodeError) {
|
|
144
|
-
throw error;
|
|
145
|
-
}
|
|
146
|
-
throw new ToonDecodeError(
|
|
147
|
-
`Failed to decode TOON data: ${error instanceof Error ? error.message : String(error)}`,
|
|
148
|
-
error instanceof Error ? error : void 0
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
57
|
|
|
153
|
-
// ../../node_modules/.pnpm/@toon-protocol+core@1.
|
|
58
|
+
// ../../node_modules/.pnpm/@toon-protocol+core@1.6.0_@toon-protocol+connector@3.13.0_typescript@5.9.3/node_modules/@toon-protocol/core/dist/index.js
|
|
154
59
|
import { finalizeEvent } from "nostr-tools/pure";
|
|
155
60
|
import { finalizeEvent as finalizeEvent2 } from "nostr-tools/pure";
|
|
156
61
|
import { finalizeEvent as finalizeEvent3 } from "nostr-tools/pure";
|
|
@@ -317,6 +222,8 @@ function parseIlpPeerInfo(event) {
|
|
|
317
222
|
const {
|
|
318
223
|
ilpAddress,
|
|
319
224
|
btpEndpoint,
|
|
225
|
+
httpEndpoint,
|
|
226
|
+
supportsUpgrade,
|
|
320
227
|
blsHttpEndpoint,
|
|
321
228
|
settlementEngine,
|
|
322
229
|
assetCode,
|
|
@@ -331,6 +238,12 @@ function parseIlpPeerInfo(event) {
|
|
|
331
238
|
if (btpEndpoint !== void 0 && typeof btpEndpoint !== "string") {
|
|
332
239
|
throw new InvalidEventError("Invalid field: btpEndpoint must be a string");
|
|
333
240
|
}
|
|
241
|
+
if (httpEndpoint !== void 0 && typeof httpEndpoint !== "string") {
|
|
242
|
+
throw new InvalidEventError("Invalid field: httpEndpoint must be a string");
|
|
243
|
+
}
|
|
244
|
+
if (supportsUpgrade !== void 0 && typeof supportsUpgrade !== "boolean") {
|
|
245
|
+
throw new InvalidEventError("Invalid field: supportsUpgrade must be a boolean");
|
|
246
|
+
}
|
|
334
247
|
if (typeof assetCode !== "string" || assetCode.length === 0) {
|
|
335
248
|
throw new InvalidEventError("Missing or invalid required field: assetCode");
|
|
336
249
|
}
|
|
@@ -464,6 +377,8 @@ function parseIlpPeerInfo(event) {
|
|
|
464
377
|
return {
|
|
465
378
|
ilpAddress,
|
|
466
379
|
btpEndpoint: typeof btpEndpoint === "string" ? btpEndpoint : "",
|
|
380
|
+
...httpEndpoint !== void 0 && typeof httpEndpoint === "string" && { httpEndpoint },
|
|
381
|
+
...supportsUpgrade !== void 0 && typeof supportsUpgrade === "boolean" && { supportsUpgrade },
|
|
467
382
|
...blsHttpEndpoint !== void 0 && typeof blsHttpEndpoint === "string" && { blsHttpEndpoint },
|
|
468
383
|
assetCode,
|
|
469
384
|
assetScale,
|
|
@@ -483,17 +398,6 @@ function parseIlpPeerInfo(event) {
|
|
|
483
398
|
};
|
|
484
399
|
}
|
|
485
400
|
var EXPIRATION_TAG = "expiration";
|
|
486
|
-
function getEventExpiration(event) {
|
|
487
|
-
const tag = event.tags.find((t) => t[0] === EXPIRATION_TAG);
|
|
488
|
-
if (!tag || tag[1] === void 0) return void 0;
|
|
489
|
-
const ts = Number(tag[1]);
|
|
490
|
-
if (!Number.isFinite(ts) || ts < 0) return void 0;
|
|
491
|
-
return ts;
|
|
492
|
-
}
|
|
493
|
-
function isEventExpired(event, nowSeconds = Math.floor(Date.now() / 1e3)) {
|
|
494
|
-
const exp = getEventExpiration(event);
|
|
495
|
-
return exp !== void 0 && exp <= nowSeconds;
|
|
496
|
-
}
|
|
497
401
|
function buildIlpPeerInfoEvent(info, secretKey, options = {}) {
|
|
498
402
|
if (info.feePerByte !== void 0) {
|
|
499
403
|
if (typeof info.feePerByte !== "string" || !/^\d+$/.test(info.feePerByte)) {
|
|
@@ -1953,15 +1857,14 @@ function resolveClientNetwork(network) {
|
|
|
1953
1857
|
status
|
|
1954
1858
|
};
|
|
1955
1859
|
}
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
data: Buffer.from(params.data).toString("base64")
|
|
1961
|
-
};
|
|
1962
|
-
}
|
|
1860
|
+
|
|
1861
|
+
// ../client/dist/chunk-QEMD5EAI.js
|
|
1862
|
+
import { verifyEvent as verifyEvent2 } from "nostr-tools/pure";
|
|
1863
|
+
import { verifyEvent as verifyEvent22 } from "nostr-tools/pure";
|
|
1963
1864
|
|
|
1964
1865
|
// ../client/dist/index.js
|
|
1866
|
+
import { generateSecretKey as generateSecretKey3, getPublicKey as getPublicKey22, finalizeEvent as finalizeEvent11 } from "nostr-tools/pure";
|
|
1867
|
+
import { generateSecretKey as generateSecretKey2 } from "nostr-tools/pure";
|
|
1965
1868
|
import { generateSecretKey, getPublicKey as getPublicKey6 } from "nostr-tools/pure";
|
|
1966
1869
|
import { privateKeyToAccount } from "viem/accounts";
|
|
1967
1870
|
import { toHex } from "viem";
|
|
@@ -2056,9 +1959,9 @@ function anumArr(label, input) {
|
|
|
2056
1959
|
function chain(...args) {
|
|
2057
1960
|
const id = (a) => a;
|
|
2058
1961
|
const wrap = (a, b) => (c) => a(b(c));
|
|
2059
|
-
const
|
|
2060
|
-
const
|
|
2061
|
-
return { encode:
|
|
1962
|
+
const encode3 = args.map((x) => x.encode).reduceRight(wrap, id);
|
|
1963
|
+
const decode4 = args.map((x) => x.decode).reduce(wrap, id);
|
|
1964
|
+
return { encode: encode3, decode: decode4 };
|
|
2062
1965
|
}
|
|
2063
1966
|
// @__NO_SIDE_EFFECTS__
|
|
2064
1967
|
function alphabet(letters) {
|
|
@@ -5831,12 +5734,12 @@ function ecdh(Point2, ecdhOpts = {}) {
|
|
|
5831
5734
|
function randomSecretKey(seed = randomBytes_(lengths.seed)) {
|
|
5832
5735
|
return mapHashToField(_abytes2(seed, lengths.seed, "seed"), Fn.ORDER);
|
|
5833
5736
|
}
|
|
5834
|
-
function
|
|
5737
|
+
function getPublicKey8(secretKey, isCompressed = true) {
|
|
5835
5738
|
return Point2.BASE.multiply(_normFnElement(Fn, secretKey)).toBytes(isCompressed);
|
|
5836
5739
|
}
|
|
5837
5740
|
function keygen(seed) {
|
|
5838
5741
|
const secretKey = randomSecretKey(seed);
|
|
5839
|
-
return { secretKey, publicKey:
|
|
5742
|
+
return { secretKey, publicKey: getPublicKey8(secretKey) };
|
|
5840
5743
|
}
|
|
5841
5744
|
function isProbPub(item) {
|
|
5842
5745
|
if (typeof item === "bigint")
|
|
@@ -5870,7 +5773,7 @@ function ecdh(Point2, ecdhOpts = {}) {
|
|
|
5870
5773
|
return point.precompute(windowSize, false);
|
|
5871
5774
|
}
|
|
5872
5775
|
};
|
|
5873
|
-
return Object.freeze({ getPublicKey:
|
|
5776
|
+
return Object.freeze({ getPublicKey: getPublicKey8, getSharedSecret, keygen, Point: Point2, utils: utils2, lengths });
|
|
5874
5777
|
}
|
|
5875
5778
|
function ecdsa(Point2, hash, ecdsaOpts = {}) {
|
|
5876
5779
|
ahash(hash);
|
|
@@ -5885,7 +5788,7 @@ function ecdsa(Point2, hash, ecdsaOpts = {}) {
|
|
|
5885
5788
|
const hmac2 = ecdsaOpts.hmac || ((key, ...msgs) => hmac(hash, key, concatBytes(...msgs)));
|
|
5886
5789
|
const { Fp, Fn } = Point2;
|
|
5887
5790
|
const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;
|
|
5888
|
-
const { keygen, getPublicKey:
|
|
5791
|
+
const { keygen, getPublicKey: getPublicKey8, getSharedSecret, utils: utils2, lengths } = ecdh(Point2, ecdsaOpts);
|
|
5889
5792
|
const defaultSigOpts = {
|
|
5890
5793
|
prehash: false,
|
|
5891
5794
|
lowS: typeof ecdsaOpts.lowS === "boolean" ? ecdsaOpts.lowS : false,
|
|
@@ -6131,7 +6034,7 @@ function ecdsa(Point2, hash, ecdsaOpts = {}) {
|
|
|
6131
6034
|
}
|
|
6132
6035
|
return Object.freeze({
|
|
6133
6036
|
keygen,
|
|
6134
|
-
getPublicKey:
|
|
6037
|
+
getPublicKey: getPublicKey8,
|
|
6135
6038
|
getSharedSecret,
|
|
6136
6039
|
utils: utils2,
|
|
6137
6040
|
lengths,
|
|
@@ -11231,6 +11134,484 @@ function writeKeystoreFile(path, keystore) {
|
|
|
11231
11134
|
import { readFileSync as readFileSync3 } from "fs";
|
|
11232
11135
|
import { homedir } from "os";
|
|
11233
11136
|
import { join as join2 } from "path";
|
|
11137
|
+
|
|
11138
|
+
// ../../node_modules/.pnpm/@toon-protocol+core@1.4.2_@toon-protocol+connector@3.13.0_typescript@5.9.3/node_modules/@toon-protocol/core/dist/chunk-5WT7ISKC.js
|
|
11139
|
+
import { encode as encode2 } from "@toon-format/toon";
|
|
11140
|
+
import { decode as decode3 } from "@toon-format/toon";
|
|
11141
|
+
import { decode as decode22 } from "@toon-format/toon";
|
|
11142
|
+
var ToonError2 = class extends Error {
|
|
11143
|
+
code;
|
|
11144
|
+
constructor(message, code, cause) {
|
|
11145
|
+
super(message, { cause });
|
|
11146
|
+
this.name = "ToonError";
|
|
11147
|
+
this.code = code;
|
|
11148
|
+
}
|
|
11149
|
+
};
|
|
11150
|
+
var InvalidEventError2 = class extends ToonError2 {
|
|
11151
|
+
constructor(message, cause) {
|
|
11152
|
+
super(message, "INVALID_EVENT", cause);
|
|
11153
|
+
this.name = "InvalidEventError";
|
|
11154
|
+
}
|
|
11155
|
+
};
|
|
11156
|
+
var ToonEncodeError2 = class extends ToonError2 {
|
|
11157
|
+
constructor(message, cause) {
|
|
11158
|
+
super(message, "TOON_ENCODE_ERROR", cause);
|
|
11159
|
+
this.name = "ToonEncodeError";
|
|
11160
|
+
}
|
|
11161
|
+
};
|
|
11162
|
+
function encodeEventToToon2(event) {
|
|
11163
|
+
try {
|
|
11164
|
+
const toonString = encode2(event);
|
|
11165
|
+
return new TextEncoder().encode(toonString);
|
|
11166
|
+
} catch (error) {
|
|
11167
|
+
throw new ToonEncodeError2(
|
|
11168
|
+
`Failed to encode event to TOON: ${error instanceof Error ? error.message : String(error)}`,
|
|
11169
|
+
error instanceof Error ? error : void 0
|
|
11170
|
+
);
|
|
11171
|
+
}
|
|
11172
|
+
}
|
|
11173
|
+
function isValidHex(value, length) {
|
|
11174
|
+
if (typeof value !== "string") return false;
|
|
11175
|
+
if (value.length !== length) return false;
|
|
11176
|
+
return /^[0-9a-f]+$/i.test(value);
|
|
11177
|
+
}
|
|
11178
|
+
var ToonDecodeError2 = class extends ToonError2 {
|
|
11179
|
+
constructor(message, cause) {
|
|
11180
|
+
super(message, "TOON_DECODE_ERROR", cause);
|
|
11181
|
+
this.name = "ToonDecodeError";
|
|
11182
|
+
}
|
|
11183
|
+
};
|
|
11184
|
+
function validateNostrEvent(obj) {
|
|
11185
|
+
if (typeof obj !== "object" || obj === null) {
|
|
11186
|
+
throw new ToonDecodeError2("Decoded value is not an object");
|
|
11187
|
+
}
|
|
11188
|
+
const event = obj;
|
|
11189
|
+
if (!isValidHex(event["id"], 64)) {
|
|
11190
|
+
throw new ToonDecodeError2(
|
|
11191
|
+
"Invalid event id: must be a 64-character hex string"
|
|
11192
|
+
);
|
|
11193
|
+
}
|
|
11194
|
+
if (!isValidHex(event["pubkey"], 64)) {
|
|
11195
|
+
throw new ToonDecodeError2(
|
|
11196
|
+
"Invalid event pubkey: must be a 64-character hex string"
|
|
11197
|
+
);
|
|
11198
|
+
}
|
|
11199
|
+
if (typeof event["kind"] !== "number" || !Number.isInteger(event["kind"])) {
|
|
11200
|
+
throw new ToonDecodeError2("Invalid event kind: must be an integer");
|
|
11201
|
+
}
|
|
11202
|
+
if (typeof event["content"] !== "string") {
|
|
11203
|
+
throw new ToonDecodeError2("Invalid event content: must be a string");
|
|
11204
|
+
}
|
|
11205
|
+
const tags = event["tags"];
|
|
11206
|
+
if (!Array.isArray(tags)) {
|
|
11207
|
+
throw new ToonDecodeError2("Invalid event tags: must be an array");
|
|
11208
|
+
}
|
|
11209
|
+
for (let i = 0; i < tags.length; i++) {
|
|
11210
|
+
const tag = tags[i];
|
|
11211
|
+
if (!Array.isArray(tag)) {
|
|
11212
|
+
throw new ToonDecodeError2(`Invalid event tags[${i}]: must be an array`);
|
|
11213
|
+
}
|
|
11214
|
+
for (let j = 0; j < tag.length; j++) {
|
|
11215
|
+
if (typeof tag[j] !== "string") {
|
|
11216
|
+
throw new ToonDecodeError2(
|
|
11217
|
+
`Invalid event tags[${i}][${j}]: must be a string`
|
|
11218
|
+
);
|
|
11219
|
+
}
|
|
11220
|
+
}
|
|
11221
|
+
}
|
|
11222
|
+
if (typeof event["created_at"] !== "number" || !Number.isInteger(event["created_at"])) {
|
|
11223
|
+
throw new ToonDecodeError2("Invalid event created_at: must be an integer");
|
|
11224
|
+
}
|
|
11225
|
+
if (!isValidHex(event["sig"], 128)) {
|
|
11226
|
+
throw new ToonDecodeError2(
|
|
11227
|
+
"Invalid event sig: must be a 128-character hex string"
|
|
11228
|
+
);
|
|
11229
|
+
}
|
|
11230
|
+
}
|
|
11231
|
+
function decodeEventFromToon2(data) {
|
|
11232
|
+
try {
|
|
11233
|
+
const toonString = new TextDecoder().decode(data);
|
|
11234
|
+
const decoded = decode3(toonString);
|
|
11235
|
+
validateNostrEvent(decoded);
|
|
11236
|
+
return decoded;
|
|
11237
|
+
} catch (error) {
|
|
11238
|
+
if (error instanceof ToonDecodeError2) {
|
|
11239
|
+
throw error;
|
|
11240
|
+
}
|
|
11241
|
+
throw new ToonDecodeError2(
|
|
11242
|
+
`Failed to decode TOON data: ${error instanceof Error ? error.message : String(error)}`,
|
|
11243
|
+
error instanceof Error ? error : void 0
|
|
11244
|
+
);
|
|
11245
|
+
}
|
|
11246
|
+
}
|
|
11247
|
+
|
|
11248
|
+
// ../../node_modules/.pnpm/@toon-protocol+core@1.4.2_@toon-protocol+connector@3.13.0_typescript@5.9.3/node_modules/@toon-protocol/core/dist/index.js
|
|
11249
|
+
import { finalizeEvent as finalizeEvent12 } from "nostr-tools/pure";
|
|
11250
|
+
import { finalizeEvent as finalizeEvent23 } from "nostr-tools/pure";
|
|
11251
|
+
import { finalizeEvent as finalizeEvent32 } from "nostr-tools/pure";
|
|
11252
|
+
import { finalizeEvent as finalizeEvent42 } from "nostr-tools/pure";
|
|
11253
|
+
import { finalizeEvent as finalizeEvent52 } from "nostr-tools/pure";
|
|
11254
|
+
import { finalizeEvent as finalizeEvent62 } from "nostr-tools/pure";
|
|
11255
|
+
import { finalizeEvent as finalizeEvent72 } from "nostr-tools/pure";
|
|
11256
|
+
import { finalizeEvent as finalizeEvent82 } from "nostr-tools/pure";
|
|
11257
|
+
import { finalizeEvent as finalizeEvent92 } from "nostr-tools/pure";
|
|
11258
|
+
import { finalizeEvent as finalizeEvent102 } from "nostr-tools/pure";
|
|
11259
|
+
import { SimplePool as SimplePool4 } from "nostr-tools/pool";
|
|
11260
|
+
import { SimplePool as SimplePool22 } from "nostr-tools/pool";
|
|
11261
|
+
import { getPublicKey as getPublicKey7 } from "nostr-tools/pure";
|
|
11262
|
+
import WebSocket3 from "ws";
|
|
11263
|
+
import { getPublicKey as getPublicKey23, verifyEvent as verifyEvent3 } from "nostr-tools/pure";
|
|
11264
|
+
import { SimplePool as SimplePool32 } from "nostr-tools/pool";
|
|
11265
|
+
import { getPublicKey as getPublicKey33 } from "nostr-tools/pure";
|
|
11266
|
+
import WebSocket23 from "ws";
|
|
11267
|
+
import { getPublicKey as getPublicKey42 } from "nostr-tools/pure";
|
|
11268
|
+
import { getPublicKey as getPublicKey52 } from "nostr-tools/pure";
|
|
11269
|
+
var ILP_PEER_INFO_KIND2 = 10032;
|
|
11270
|
+
var ILP_SEGMENT_PATTERN2 = /^[a-z0-9-]+$/;
|
|
11271
|
+
var MAX_ILP_ADDRESS_LENGTH2 = 1023;
|
|
11272
|
+
function isValidIlpAddressStructure2(address) {
|
|
11273
|
+
if (!address) return false;
|
|
11274
|
+
if (address.length > MAX_ILP_ADDRESS_LENGTH2) return false;
|
|
11275
|
+
const segments = address.split(".");
|
|
11276
|
+
for (const segment of segments) {
|
|
11277
|
+
if (segment.length === 0) return false;
|
|
11278
|
+
if (!ILP_SEGMENT_PATTERN2.test(segment)) return false;
|
|
11279
|
+
}
|
|
11280
|
+
return true;
|
|
11281
|
+
}
|
|
11282
|
+
function validateChainId2(chainId) {
|
|
11283
|
+
if (!chainId) return false;
|
|
11284
|
+
const segments = chainId.split(":");
|
|
11285
|
+
if (segments.length < 2 || segments.length > 3) return false;
|
|
11286
|
+
return segments.every((s) => s.length > 0);
|
|
11287
|
+
}
|
|
11288
|
+
var RATE_REGEX2 = /^(0|[1-9]\d*)(\.\d+)?$/;
|
|
11289
|
+
var AMOUNT_REGEX2 = /^\d+$/;
|
|
11290
|
+
var MAX_NUMERIC_STRING_LENGTH2 = 80;
|
|
11291
|
+
function isObject3(value) {
|
|
11292
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
11293
|
+
}
|
|
11294
|
+
function isNonEmptyString2(value) {
|
|
11295
|
+
return typeof value === "string" && value.length > 0;
|
|
11296
|
+
}
|
|
11297
|
+
function isNonNegativeInteger2(value) {
|
|
11298
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 0;
|
|
11299
|
+
}
|
|
11300
|
+
function validateAsset2(asset, side) {
|
|
11301
|
+
if (!isObject3(asset)) {
|
|
11302
|
+
return {
|
|
11303
|
+
valid: false,
|
|
11304
|
+
reason: `${side} must be an object`,
|
|
11305
|
+
field: side
|
|
11306
|
+
};
|
|
11307
|
+
}
|
|
11308
|
+
if (!isNonEmptyString2(asset.assetCode)) {
|
|
11309
|
+
return {
|
|
11310
|
+
valid: false,
|
|
11311
|
+
reason: `${side}.assetCode must be a non-empty string`,
|
|
11312
|
+
field: `${side}.assetCode`
|
|
11313
|
+
};
|
|
11314
|
+
}
|
|
11315
|
+
if (!isNonNegativeInteger2(asset.assetScale)) {
|
|
11316
|
+
return {
|
|
11317
|
+
valid: false,
|
|
11318
|
+
reason: `${side}.assetScale must be a non-negative integer`,
|
|
11319
|
+
field: `${side}.assetScale`
|
|
11320
|
+
};
|
|
11321
|
+
}
|
|
11322
|
+
if (typeof asset.chain !== "string" || !validateChainId2(asset.chain)) {
|
|
11323
|
+
return {
|
|
11324
|
+
valid: false,
|
|
11325
|
+
reason: `${side}.chain must be a valid chain identifier (e.g., "evm:base:8453")`,
|
|
11326
|
+
field: `${side}.chain`
|
|
11327
|
+
};
|
|
11328
|
+
}
|
|
11329
|
+
return { valid: true };
|
|
11330
|
+
}
|
|
11331
|
+
function isValidSwapPair2(pair) {
|
|
11332
|
+
if (!isObject3(pair)) {
|
|
11333
|
+
return { valid: false, reason: "pair must be an object", field: "" };
|
|
11334
|
+
}
|
|
11335
|
+
const fromResult = validateAsset2(pair.from, "from");
|
|
11336
|
+
if (!fromResult.valid) return fromResult;
|
|
11337
|
+
const toResult = validateAsset2(pair.to, "to");
|
|
11338
|
+
if (!toResult.valid) return toResult;
|
|
11339
|
+
if (typeof pair.rate !== "string" || pair.rate.length > MAX_NUMERIC_STRING_LENGTH2 || !RATE_REGEX2.test(pair.rate)) {
|
|
11340
|
+
return {
|
|
11341
|
+
valid: false,
|
|
11342
|
+
reason: `rate must be a non-negative decimal string (no leading zeros, no exponent, max ${MAX_NUMERIC_STRING_LENGTH2} chars)`,
|
|
11343
|
+
field: "rate"
|
|
11344
|
+
};
|
|
11345
|
+
}
|
|
11346
|
+
if (pair.minAmount !== void 0) {
|
|
11347
|
+
if (typeof pair.minAmount !== "string" || pair.minAmount.length > MAX_NUMERIC_STRING_LENGTH2 || !AMOUNT_REGEX2.test(pair.minAmount)) {
|
|
11348
|
+
return {
|
|
11349
|
+
valid: false,
|
|
11350
|
+
reason: `minAmount must be a non-negative integer string (max ${MAX_NUMERIC_STRING_LENGTH2} digits)`,
|
|
11351
|
+
field: "minAmount"
|
|
11352
|
+
};
|
|
11353
|
+
}
|
|
11354
|
+
}
|
|
11355
|
+
if (pair.maxAmount !== void 0) {
|
|
11356
|
+
if (typeof pair.maxAmount !== "string" || pair.maxAmount.length > MAX_NUMERIC_STRING_LENGTH2 || !AMOUNT_REGEX2.test(pair.maxAmount)) {
|
|
11357
|
+
return {
|
|
11358
|
+
valid: false,
|
|
11359
|
+
reason: `maxAmount must be a non-negative integer string (max ${MAX_NUMERIC_STRING_LENGTH2} digits)`,
|
|
11360
|
+
field: "maxAmount"
|
|
11361
|
+
};
|
|
11362
|
+
}
|
|
11363
|
+
}
|
|
11364
|
+
if (pair.minAmount !== void 0 && pair.maxAmount !== void 0) {
|
|
11365
|
+
if (BigInt(pair.minAmount) > BigInt(pair.maxAmount)) {
|
|
11366
|
+
return {
|
|
11367
|
+
valid: false,
|
|
11368
|
+
reason: "minAmount must not exceed maxAmount",
|
|
11369
|
+
field: "minAmount/maxAmount"
|
|
11370
|
+
};
|
|
11371
|
+
}
|
|
11372
|
+
}
|
|
11373
|
+
return { valid: true };
|
|
11374
|
+
}
|
|
11375
|
+
function formatMessage2(index, result) {
|
|
11376
|
+
return `swapPairs[${index}]: ${result.reason} (field: ${result.field})`;
|
|
11377
|
+
}
|
|
11378
|
+
function assertSwapPairForParse2(pair, index) {
|
|
11379
|
+
const result = isValidSwapPair2(pair);
|
|
11380
|
+
if (!result.valid) {
|
|
11381
|
+
throw new InvalidEventError2(formatMessage2(index, result));
|
|
11382
|
+
}
|
|
11383
|
+
}
|
|
11384
|
+
function isObject22(value) {
|
|
11385
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
11386
|
+
}
|
|
11387
|
+
function parseIlpPeerInfo2(event) {
|
|
11388
|
+
if (event.kind !== ILP_PEER_INFO_KIND2) {
|
|
11389
|
+
throw new InvalidEventError2(
|
|
11390
|
+
`Expected event kind ${ILP_PEER_INFO_KIND2}, got ${event.kind}`
|
|
11391
|
+
);
|
|
11392
|
+
}
|
|
11393
|
+
let parsed;
|
|
11394
|
+
try {
|
|
11395
|
+
parsed = JSON.parse(event.content);
|
|
11396
|
+
} catch (err) {
|
|
11397
|
+
throw new InvalidEventError2(
|
|
11398
|
+
"Failed to parse event content as JSON",
|
|
11399
|
+
err instanceof Error ? err : void 0
|
|
11400
|
+
);
|
|
11401
|
+
}
|
|
11402
|
+
if (!isObject22(parsed)) {
|
|
11403
|
+
throw new InvalidEventError2("Event content must be a JSON object");
|
|
11404
|
+
}
|
|
11405
|
+
const {
|
|
11406
|
+
ilpAddress,
|
|
11407
|
+
btpEndpoint,
|
|
11408
|
+
blsHttpEndpoint,
|
|
11409
|
+
settlementEngine,
|
|
11410
|
+
assetCode,
|
|
11411
|
+
assetScale,
|
|
11412
|
+
ilpAddresses: rawIlpAddresses
|
|
11413
|
+
} = parsed;
|
|
11414
|
+
if (typeof ilpAddress !== "string" || ilpAddress.length === 0) {
|
|
11415
|
+
throw new InvalidEventError2(
|
|
11416
|
+
"Missing or invalid required field: ilpAddress"
|
|
11417
|
+
);
|
|
11418
|
+
}
|
|
11419
|
+
if (btpEndpoint !== void 0 && typeof btpEndpoint !== "string") {
|
|
11420
|
+
throw new InvalidEventError2("Invalid field: btpEndpoint must be a string");
|
|
11421
|
+
}
|
|
11422
|
+
if (typeof assetCode !== "string" || assetCode.length === 0) {
|
|
11423
|
+
throw new InvalidEventError2("Missing or invalid required field: assetCode");
|
|
11424
|
+
}
|
|
11425
|
+
if (typeof assetScale !== "number" || !Number.isInteger(assetScale)) {
|
|
11426
|
+
throw new InvalidEventError2(
|
|
11427
|
+
"Missing or invalid required field: assetScale"
|
|
11428
|
+
);
|
|
11429
|
+
}
|
|
11430
|
+
if (settlementEngine !== void 0 && typeof settlementEngine !== "string") {
|
|
11431
|
+
throw new InvalidEventError2(
|
|
11432
|
+
"Invalid optional field: settlementEngine must be a string"
|
|
11433
|
+
);
|
|
11434
|
+
}
|
|
11435
|
+
const {
|
|
11436
|
+
supportedChains,
|
|
11437
|
+
settlementAddresses,
|
|
11438
|
+
preferredTokens,
|
|
11439
|
+
tokenNetworks
|
|
11440
|
+
} = parsed;
|
|
11441
|
+
if (supportedChains !== void 0) {
|
|
11442
|
+
if (!Array.isArray(supportedChains)) {
|
|
11443
|
+
throw new InvalidEventError2("supportedChains must be an array");
|
|
11444
|
+
}
|
|
11445
|
+
if (supportedChains.length === 0) {
|
|
11446
|
+
throw new InvalidEventError2(
|
|
11447
|
+
"supportedChains must be a non-empty array when provided"
|
|
11448
|
+
);
|
|
11449
|
+
}
|
|
11450
|
+
for (const chainId of supportedChains) {
|
|
11451
|
+
if (typeof chainId !== "string" || !validateChainId2(chainId)) {
|
|
11452
|
+
throw new InvalidEventError2(
|
|
11453
|
+
`Invalid chain identifier: ${String(chainId)}`
|
|
11454
|
+
);
|
|
11455
|
+
}
|
|
11456
|
+
}
|
|
11457
|
+
}
|
|
11458
|
+
if (settlementAddresses !== void 0) {
|
|
11459
|
+
if (!isObject22(settlementAddresses)) {
|
|
11460
|
+
throw new InvalidEventError2("settlementAddresses must be an object");
|
|
11461
|
+
}
|
|
11462
|
+
for (const [key, value] of Object.entries(settlementAddresses)) {
|
|
11463
|
+
if (!validateChainId2(key)) {
|
|
11464
|
+
throw new InvalidEventError2(
|
|
11465
|
+
`Invalid chain identifier in settlementAddresses: ${key}`
|
|
11466
|
+
);
|
|
11467
|
+
}
|
|
11468
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
11469
|
+
throw new InvalidEventError2(
|
|
11470
|
+
"settlementAddresses values must be non-empty strings"
|
|
11471
|
+
);
|
|
11472
|
+
}
|
|
11473
|
+
}
|
|
11474
|
+
if (Array.isArray(supportedChains)) {
|
|
11475
|
+
const chainSet = new Set(supportedChains);
|
|
11476
|
+
for (const key of Object.keys(settlementAddresses)) {
|
|
11477
|
+
if (!chainSet.has(key)) {
|
|
11478
|
+
throw new InvalidEventError2(
|
|
11479
|
+
`settlementAddresses key '${key}' is not in supportedChains`
|
|
11480
|
+
);
|
|
11481
|
+
}
|
|
11482
|
+
}
|
|
11483
|
+
}
|
|
11484
|
+
}
|
|
11485
|
+
if (preferredTokens !== void 0) {
|
|
11486
|
+
if (!isObject22(preferredTokens)) {
|
|
11487
|
+
throw new InvalidEventError2("preferredTokens must be an object");
|
|
11488
|
+
}
|
|
11489
|
+
}
|
|
11490
|
+
if (tokenNetworks !== void 0) {
|
|
11491
|
+
if (!isObject22(tokenNetworks)) {
|
|
11492
|
+
throw new InvalidEventError2("tokenNetworks must be an object");
|
|
11493
|
+
}
|
|
11494
|
+
}
|
|
11495
|
+
const { feePerByte: rawFeePerByte } = parsed;
|
|
11496
|
+
let feePerByte;
|
|
11497
|
+
if (rawFeePerByte === void 0) {
|
|
11498
|
+
feePerByte = "0";
|
|
11499
|
+
} else if (typeof rawFeePerByte !== "string" || !/^\d+$/.test(rawFeePerByte)) {
|
|
11500
|
+
throw new InvalidEventError2(
|
|
11501
|
+
`Invalid feePerByte: "${String(rawFeePerByte)}" must be a non-negative integer string`
|
|
11502
|
+
);
|
|
11503
|
+
} else {
|
|
11504
|
+
feePerByte = rawFeePerByte;
|
|
11505
|
+
}
|
|
11506
|
+
const { prefixPricing: rawPrefixPricing } = parsed;
|
|
11507
|
+
let prefixPricing;
|
|
11508
|
+
if (rawPrefixPricing !== void 0) {
|
|
11509
|
+
if (!isObject22(rawPrefixPricing)) {
|
|
11510
|
+
throw new InvalidEventError2("prefixPricing must be an object");
|
|
11511
|
+
}
|
|
11512
|
+
const { basePrice } = rawPrefixPricing;
|
|
11513
|
+
if (typeof basePrice !== "string" || !/^\d+$/.test(basePrice)) {
|
|
11514
|
+
throw new InvalidEventError2(
|
|
11515
|
+
`Invalid prefixPricing.basePrice: "${String(basePrice)}" must be a non-negative integer string`
|
|
11516
|
+
);
|
|
11517
|
+
}
|
|
11518
|
+
prefixPricing = { basePrice };
|
|
11519
|
+
}
|
|
11520
|
+
const { swapPairs: rawSwapPairs } = parsed;
|
|
11521
|
+
let swapPairs;
|
|
11522
|
+
if (rawSwapPairs !== void 0) {
|
|
11523
|
+
if (!Array.isArray(rawSwapPairs)) {
|
|
11524
|
+
throw new InvalidEventError2("swapPairs must be an array");
|
|
11525
|
+
}
|
|
11526
|
+
rawSwapPairs.forEach((pair, index) => {
|
|
11527
|
+
assertSwapPairForParse2(pair, index);
|
|
11528
|
+
});
|
|
11529
|
+
swapPairs = rawSwapPairs;
|
|
11530
|
+
}
|
|
11531
|
+
let ilpAddresses;
|
|
11532
|
+
if (rawIlpAddresses !== void 0) {
|
|
11533
|
+
if (!Array.isArray(rawIlpAddresses)) {
|
|
11534
|
+
throw new InvalidEventError2("ilpAddresses must be an array");
|
|
11535
|
+
}
|
|
11536
|
+
for (const addr of rawIlpAddresses) {
|
|
11537
|
+
if (typeof addr !== "string" || addr.length === 0) {
|
|
11538
|
+
throw new InvalidEventError2(
|
|
11539
|
+
"ilpAddresses elements must be non-empty strings"
|
|
11540
|
+
);
|
|
11541
|
+
}
|
|
11542
|
+
if (!isValidIlpAddressStructure2(addr)) {
|
|
11543
|
+
throw new InvalidEventError2(
|
|
11544
|
+
`Invalid ILP address in ilpAddresses: "${addr}"`
|
|
11545
|
+
);
|
|
11546
|
+
}
|
|
11547
|
+
}
|
|
11548
|
+
ilpAddresses = rawIlpAddresses;
|
|
11549
|
+
} else {
|
|
11550
|
+
ilpAddresses = [ilpAddress];
|
|
11551
|
+
}
|
|
11552
|
+
return {
|
|
11553
|
+
ilpAddress,
|
|
11554
|
+
btpEndpoint: typeof btpEndpoint === "string" ? btpEndpoint : "",
|
|
11555
|
+
...blsHttpEndpoint !== void 0 && typeof blsHttpEndpoint === "string" && { blsHttpEndpoint },
|
|
11556
|
+
assetCode,
|
|
11557
|
+
assetScale,
|
|
11558
|
+
...settlementEngine !== void 0 && { settlementEngine },
|
|
11559
|
+
supportedChains: supportedChains !== void 0 ? supportedChains : [],
|
|
11560
|
+
settlementAddresses: settlementAddresses !== void 0 ? settlementAddresses : {},
|
|
11561
|
+
...preferredTokens !== void 0 && {
|
|
11562
|
+
preferredTokens
|
|
11563
|
+
},
|
|
11564
|
+
...tokenNetworks !== void 0 && {
|
|
11565
|
+
tokenNetworks
|
|
11566
|
+
},
|
|
11567
|
+
ilpAddresses,
|
|
11568
|
+
feePerByte,
|
|
11569
|
+
...prefixPricing !== void 0 && { prefixPricing },
|
|
11570
|
+
...swapPairs !== void 0 && { swapPairs }
|
|
11571
|
+
};
|
|
11572
|
+
}
|
|
11573
|
+
var EXPIRATION_TAG2 = "expiration";
|
|
11574
|
+
function getEventExpiration(event) {
|
|
11575
|
+
const tag = event.tags.find((t) => t[0] === EXPIRATION_TAG2);
|
|
11576
|
+
if (!tag || tag[1] === void 0) return void 0;
|
|
11577
|
+
const ts = Number(tag[1]);
|
|
11578
|
+
if (!Number.isFinite(ts) || ts < 0) return void 0;
|
|
11579
|
+
return ts;
|
|
11580
|
+
}
|
|
11581
|
+
function isEventExpired(event, nowSeconds = Math.floor(Date.now() / 1e3)) {
|
|
11582
|
+
const exp = getEventExpiration(event);
|
|
11583
|
+
return exp !== void 0 && exp <= nowSeconds;
|
|
11584
|
+
}
|
|
11585
|
+
var ILP_TO_SEMANTIC2 = Object.freeze({
|
|
11586
|
+
T00: "internal_error",
|
|
11587
|
+
T04: "insufficient_funds",
|
|
11588
|
+
F00: "invalid_request",
|
|
11589
|
+
// F01 ("Invalid Packet" in ILP terms — emitted by the swap handler for
|
|
11590
|
+
// "Invalid gift wrap" / "Invalid amount") has NO dedicated entry in the
|
|
11591
|
+
// connector's REJECT_CODE_MAP (accepted semantics are: insufficient_funds,
|
|
11592
|
+
// expired, unreachable, invalid_request, invalid_amount,
|
|
11593
|
+
// insufficient_destination_amount, unexpected_payment, application_error,
|
|
11594
|
+
// internal_error, timeout). The closest faithful reason is `invalid_request`,
|
|
11595
|
+
// which the connector re-encodes to wire code F00. We map F01 EXPLICITLY
|
|
11596
|
+
// (rather than relying on the fallback below) so the F01 -> F00 normalization
|
|
11597
|
+
// is intentional and test-pinned, not a silent collapse that misleads callers
|
|
11598
|
+
// into thinking they hit a different failure class. See issue #86.
|
|
11599
|
+
F01: "invalid_request",
|
|
11600
|
+
F02: "unreachable",
|
|
11601
|
+
F03: "invalid_amount",
|
|
11602
|
+
F04: "insufficient_destination_amount",
|
|
11603
|
+
F06: "unexpected_payment",
|
|
11604
|
+
R00: "expired"
|
|
11605
|
+
});
|
|
11606
|
+
function buildIlpPrepare(params) {
|
|
11607
|
+
return {
|
|
11608
|
+
destination: params.destination,
|
|
11609
|
+
amount: String(params.amount),
|
|
11610
|
+
data: Buffer.from(params.data).toString("base64")
|
|
11611
|
+
};
|
|
11612
|
+
}
|
|
11613
|
+
|
|
11614
|
+
// src/daemon/config.ts
|
|
11234
11615
|
var DEFAULT_KEYSTORE_PASSWORD = "toon-client-default";
|
|
11235
11616
|
function configDir() {
|
|
11236
11617
|
return process.env["TOON_CLIENT_HOME"] ?? join2(homedir(), ".toon-client");
|
|
@@ -11298,8 +11679,8 @@ function resolveConfig(file) {
|
|
|
11298
11679
|
assetCode: "USD",
|
|
11299
11680
|
assetScale: 6
|
|
11300
11681
|
},
|
|
11301
|
-
toonEncoder:
|
|
11302
|
-
toonDecoder:
|
|
11682
|
+
toonEncoder: encodeEventToToon2,
|
|
11683
|
+
toonDecoder: decodeEventFromToon2,
|
|
11303
11684
|
...btpUrl ? { btpUrl, btpAuthToken: "" } : {},
|
|
11304
11685
|
destinationAddress: destination,
|
|
11305
11686
|
relayUrl: "",
|
|
@@ -11597,17 +11978,17 @@ function delay(ms) {
|
|
|
11597
11978
|
}
|
|
11598
11979
|
|
|
11599
11980
|
export {
|
|
11600
|
-
ToonError,
|
|
11601
|
-
encodeEventToToon,
|
|
11602
|
-
decodeEventFromToon,
|
|
11603
|
-
ILP_PEER_INFO_KIND,
|
|
11604
|
-
parseIlpPeerInfo,
|
|
11605
|
-
isEventExpired,
|
|
11606
|
-
buildIlpPrepare,
|
|
11607
11981
|
deriveFullIdentity,
|
|
11608
11982
|
ToonClient,
|
|
11609
11983
|
fundWallet,
|
|
11610
11984
|
generateKeystore,
|
|
11985
|
+
ToonError2 as ToonError,
|
|
11986
|
+
encodeEventToToon2 as encodeEventToToon,
|
|
11987
|
+
decodeEventFromToon2 as decodeEventFromToon,
|
|
11988
|
+
ILP_PEER_INFO_KIND2 as ILP_PEER_INFO_KIND,
|
|
11989
|
+
parseIlpPeerInfo2 as parseIlpPeerInfo,
|
|
11990
|
+
isEventExpired,
|
|
11991
|
+
buildIlpPrepare,
|
|
11611
11992
|
DEFAULT_KEYSTORE_PASSWORD,
|
|
11612
11993
|
configDir,
|
|
11613
11994
|
defaultConfigPath,
|
|
@@ -11644,4 +12025,4 @@ export {
|
|
|
11644
12025
|
@scure/bip32/lib/esm/index.js:
|
|
11645
12026
|
(*! scure-bip32 - MIT License (c) 2022 Patricio Palladino, Paul Miller (paulmillr.com) *)
|
|
11646
12027
|
*/
|
|
11647
|
-
//# sourceMappingURL=chunk-
|
|
12028
|
+
//# sourceMappingURL=chunk-R75M6TK6.js.map
|