1 | (function (global, factory) {
|
2 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@polkadot/util')) :
|
3 | typeof define === 'function' && define.amd ? define(['exports', '@polkadot/util'], factory) :
|
4 | (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.polkadotUtilCrypto = {}, global.polkadotUtil));
|
5 | })(this, (function (exports, util) { 'use strict';
|
6 |
|
7 | const global = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : window;
|
8 |
|
9 | var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
10 | const packageInfo$2 = { name: '@polkadot/x-global', path: (({ url: (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.src || new URL('bundle-polkadot-util-crypto.js', document.baseURI).href)) }) && (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.src || new URL('bundle-polkadot-util-crypto.js', document.baseURI).href))) ? new URL((typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.src || new URL('bundle-polkadot-util-crypto.js', document.baseURI).href))).pathname.substring(0, new URL((typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.src || new URL('bundle-polkadot-util-crypto.js', document.baseURI).href))).pathname.lastIndexOf('/') + 1) : 'auto', type: 'esm', version: '13.2.3' };
|
11 |
|
12 | function evaluateThis(fn) {
|
13 | return fn('return this');
|
14 | }
|
15 | const xglobal = (typeof globalThis !== 'undefined'
|
16 | ? globalThis
|
17 | : typeof global !== 'undefined'
|
18 | ? global
|
19 | : typeof self !== 'undefined'
|
20 | ? self
|
21 | : typeof window !== 'undefined'
|
22 | ? window
|
23 | : evaluateThis(Function));
|
24 | function extractGlobal(name, fallback) {
|
25 | return typeof xglobal[name] === 'undefined'
|
26 | ? fallback
|
27 | : xglobal[name];
|
28 | }
|
29 | function exposeGlobal(name, fallback) {
|
30 | if (typeof xglobal[name] === 'undefined') {
|
31 | xglobal[name] = fallback;
|
32 | }
|
33 | }
|
34 |
|
35 | const build = Object.freeze({
|
36 | __proto__: null,
|
37 | exposeGlobal: exposeGlobal,
|
38 | extractGlobal: extractGlobal,
|
39 | packageInfo: packageInfo$2,
|
40 | xglobal: xglobal
|
41 | });
|
42 |
|
43 | function invalidFallback() {
|
44 | return Number.NaN;
|
45 | }
|
46 | const BigInt$1 = extractGlobal('BigInt', invalidFallback);
|
47 |
|
48 | exposeGlobal('BigInt', BigInt$1);
|
49 |
|
50 | function getDefaultExportFromCjs (x) {
|
51 | return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
52 | }
|
53 |
|
54 | function getAugmentedNamespace(n) {
|
55 | if (n.__esModule) return n;
|
56 | var f = n.default;
|
57 | if (typeof f == "function") {
|
58 | var a = function a () {
|
59 | if (this instanceof a) {
|
60 | return Reflect.construct(f, arguments, this.constructor);
|
61 | }
|
62 | return f.apply(this, arguments);
|
63 | };
|
64 | a.prototype = f.prototype;
|
65 | } else a = {};
|
66 | Object.defineProperty(a, '__esModule', {value: true});
|
67 | Object.keys(n).forEach(function (k) {
|
68 | var d = Object.getOwnPropertyDescriptor(n, k);
|
69 | Object.defineProperty(a, k, d.get ? d : {
|
70 | enumerable: true,
|
71 | get: function () {
|
72 | return n[k];
|
73 | }
|
74 | });
|
75 | });
|
76 | return a;
|
77 | }
|
78 |
|
79 | var browser = {};
|
80 |
|
81 | const require$$0 = getAugmentedNamespace(build);
|
82 |
|
83 | var packageInfo$1 = {};
|
84 |
|
85 | Object.defineProperty(packageInfo$1, "__esModule", { value: true });
|
86 | packageInfo$1.packageInfo = void 0;
|
87 | packageInfo$1.packageInfo = { name: '@polkadot/x-randomvalues', path: typeof __dirname === 'string' ? __dirname : 'auto', type: 'cjs', version: '13.2.3' };
|
88 |
|
89 | (function (exports) {
|
90 | Object.defineProperty(exports, "__esModule", { value: true });
|
91 | exports.crypto = exports.packageInfo = void 0;
|
92 | exports.getRandomValues = getRandomValues;
|
93 | const x_global_1 = require$$0;
|
94 | var packageInfo_js_1 = packageInfo$1;
|
95 | Object.defineProperty(exports, "packageInfo", { enumerable: true, get: function () { return packageInfo_js_1.packageInfo; } });
|
96 | exports.crypto = x_global_1.xglobal.crypto;
|
97 | function getRandomValues(arr) {
|
98 | return exports.crypto.getRandomValues(arr);
|
99 | }
|
100 | } (browser));
|
101 | getDefaultExportFromCjs(browser);
|
102 |
|
103 | const DEFAULT_CRYPTO = { getRandomValues: browser.getRandomValues };
|
104 | const DEFAULT_SELF = { crypto: DEFAULT_CRYPTO };
|
105 | class Wbg {
|
106 | __internal__bridge;
|
107 | constructor(bridge) {
|
108 | this.__internal__bridge = bridge;
|
109 | }
|
110 | abort = () => {
|
111 | throw new Error('abort');
|
112 | };
|
113 | __wbindgen_is_undefined = (idx) => {
|
114 | return this.__internal__bridge.getObject(idx) === undefined;
|
115 | };
|
116 | __wbindgen_throw = (ptr, len) => {
|
117 | throw new Error(this.__internal__bridge.getString(ptr, len));
|
118 | };
|
119 | __wbg_self_1b7a39e3a92c949c = () => {
|
120 | return this.__internal__bridge.addObject(DEFAULT_SELF);
|
121 | };
|
122 | __wbg_require_604837428532a733 = (ptr, len) => {
|
123 | throw new Error(`Unable to require ${this.__internal__bridge.getString(ptr, len)}`);
|
124 | };
|
125 | __wbg_crypto_968f1772287e2df0 = (_idx) => {
|
126 | return this.__internal__bridge.addObject(DEFAULT_CRYPTO);
|
127 | };
|
128 | __wbg_getRandomValues_a3d34b4fee3c2869 = (_idx) => {
|
129 | return this.__internal__bridge.addObject(DEFAULT_CRYPTO.getRandomValues);
|
130 | };
|
131 | __wbg_getRandomValues_f5e14ab7ac8e995d = (_arg0, ptr, len) => {
|
132 | DEFAULT_CRYPTO.getRandomValues(this.__internal__bridge.getU8a(ptr, len));
|
133 | };
|
134 | __wbg_randomFillSync_d5bd2d655fdf256a = (_idx, _ptr, _len) => {
|
135 | throw new Error('randomFillsync is not available');
|
136 | };
|
137 | __wbindgen_object_drop_ref = (idx) => {
|
138 | this.__internal__bridge.takeObject(idx);
|
139 | };
|
140 | }
|
141 |
|
142 | class Bridge {
|
143 | __internal__createWasm;
|
144 | __internal__heap;
|
145 | __internal__wbg;
|
146 | __internal__cachegetInt32;
|
147 | __internal__cachegetUint8;
|
148 | __internal__heapNext;
|
149 | __internal__wasm;
|
150 | __internal__wasmError;
|
151 | __internal__wasmPromise;
|
152 | __internal__type;
|
153 | constructor(createWasm) {
|
154 | this.__internal__createWasm = createWasm;
|
155 | this.__internal__cachegetInt32 = null;
|
156 | this.__internal__cachegetUint8 = null;
|
157 | this.__internal__heap = new Array(32)
|
158 | .fill(undefined)
|
159 | .concat(undefined, null, true, false);
|
160 | this.__internal__heapNext = this.__internal__heap.length;
|
161 | this.__internal__type = 'none';
|
162 | this.__internal__wasm = null;
|
163 | this.__internal__wasmError = null;
|
164 | this.__internal__wasmPromise = null;
|
165 | this.__internal__wbg = { ...new Wbg(this) };
|
166 | }
|
167 | get error() {
|
168 | return this.__internal__wasmError;
|
169 | }
|
170 | get type() {
|
171 | return this.__internal__type;
|
172 | }
|
173 | get wasm() {
|
174 | return this.__internal__wasm;
|
175 | }
|
176 | async init(createWasm) {
|
177 | if (!this.__internal__wasmPromise || createWasm) {
|
178 | this.__internal__wasmPromise = (createWasm || this.__internal__createWasm)(this.__internal__wbg);
|
179 | }
|
180 | const { error, type, wasm } = await this.__internal__wasmPromise;
|
181 | this.__internal__type = type;
|
182 | this.__internal__wasm = wasm;
|
183 | this.__internal__wasmError = error;
|
184 | return this.__internal__wasm;
|
185 | }
|
186 | getObject(idx) {
|
187 | return this.__internal__heap[idx];
|
188 | }
|
189 | dropObject(idx) {
|
190 | if (idx < 36) {
|
191 | return;
|
192 | }
|
193 | this.__internal__heap[idx] = this.__internal__heapNext;
|
194 | this.__internal__heapNext = idx;
|
195 | }
|
196 | takeObject(idx) {
|
197 | const ret = this.getObject(idx);
|
198 | this.dropObject(idx);
|
199 | return ret;
|
200 | }
|
201 | addObject(obj) {
|
202 | if (this.__internal__heapNext === this.__internal__heap.length) {
|
203 | this.__internal__heap.push(this.__internal__heap.length + 1);
|
204 | }
|
205 | const idx = this.__internal__heapNext;
|
206 | this.__internal__heapNext = this.__internal__heap[idx];
|
207 | this.__internal__heap[idx] = obj;
|
208 | return idx;
|
209 | }
|
210 | getInt32() {
|
211 | if (this.__internal__cachegetInt32 === null || this.__internal__cachegetInt32.buffer !== this.__internal__wasm.memory.buffer) {
|
212 | this.__internal__cachegetInt32 = new Int32Array(this.__internal__wasm.memory.buffer);
|
213 | }
|
214 | return this.__internal__cachegetInt32;
|
215 | }
|
216 | getUint8() {
|
217 | if (this.__internal__cachegetUint8 === null || this.__internal__cachegetUint8.buffer !== this.__internal__wasm.memory.buffer) {
|
218 | this.__internal__cachegetUint8 = new Uint8Array(this.__internal__wasm.memory.buffer);
|
219 | }
|
220 | return this.__internal__cachegetUint8;
|
221 | }
|
222 | getU8a(ptr, len) {
|
223 | return this.getUint8().subarray(ptr / 1, ptr / 1 + len);
|
224 | }
|
225 | getString(ptr, len) {
|
226 | return util.u8aToString(this.getU8a(ptr, len));
|
227 | }
|
228 | allocU8a(arg) {
|
229 | const ptr = this.__internal__wasm.__wbindgen_malloc(arg.length * 1);
|
230 | this.getUint8().set(arg, ptr / 1);
|
231 | return [ptr, arg.length];
|
232 | }
|
233 | allocString(arg) {
|
234 | return this.allocU8a(util.stringToU8a(arg));
|
235 | }
|
236 | resultU8a() {
|
237 | const r0 = this.getInt32()[8 / 4 + 0];
|
238 | const r1 = this.getInt32()[8 / 4 + 1];
|
239 | const ret = this.getU8a(r0, r1).slice();
|
240 | this.__internal__wasm.__wbindgen_free(r0, r1 * 1);
|
241 | return ret;
|
242 | }
|
243 | resultString() {
|
244 | return util.u8aToString(this.resultU8a());
|
245 | }
|
246 | }
|
247 |
|
248 | function createWasmFn(root, wasmBytes, asmFn) {
|
249 | return async (wbg) => {
|
250 | const result = {
|
251 | error: null,
|
252 | type: 'none',
|
253 | wasm: null
|
254 | };
|
255 | try {
|
256 | if (!wasmBytes?.length) {
|
257 | throw new Error('No WebAssembly provided for initialization');
|
258 | }
|
259 | else if (typeof WebAssembly !== 'object' || typeof WebAssembly.instantiate !== 'function') {
|
260 | throw new Error('WebAssembly is not available in your environment');
|
261 | }
|
262 | const source = await WebAssembly.instantiate(wasmBytes, { wbg });
|
263 | result.wasm = source.instance.exports;
|
264 | result.type = 'wasm';
|
265 | }
|
266 | catch (error) {
|
267 | if (typeof asmFn === 'function') {
|
268 | result.wasm = asmFn(wbg);
|
269 | result.type = 'asm';
|
270 | }
|
271 | else {
|
272 | result.error = `FATAL: Unable to initialize @polkadot/wasm-${root}:: ${error.message}`;
|
273 | console.error(result.error);
|
274 | }
|
275 | }
|
276 | return result;
|
277 | };
|
278 | }
|
279 |
|
280 | const CHR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
281 | const map = new Array(256);
|
282 | for (let i = 0, count = CHR.length; i < count; i++) {
|
283 | map[CHR.charCodeAt(i)] = i;
|
284 | }
|
285 | function base64Decode$1(data, out) {
|
286 | let byte = 0;
|
287 | let bits = 0;
|
288 | let pos = -1;
|
289 | for (let i = 0, last = out.length - 1; pos !== last; i++) {
|
290 | byte = (byte << 6) | map[data.charCodeAt(i)];
|
291 | if ((bits += 6) >= 8) {
|
292 | out[++pos] = (byte >>> (bits -= 8)) & 0xff;
|
293 | }
|
294 | }
|
295 | return out;
|
296 | }
|
297 |
|
298 | const u8 = Uint8Array, u16 = Uint16Array, u32$1 = Uint32Array;
|
299 | const clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
|
300 | const fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0]);
|
301 | const fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0]);
|
302 | const freb = (eb, start) => {
|
303 | const b = new u16(31);
|
304 | for (let i = 0; i < 31; ++i) {
|
305 | b[i] = start += 1 << eb[i - 1];
|
306 | }
|
307 | const r = new u32$1(b[30]);
|
308 | for (let i = 1; i < 30; ++i) {
|
309 | for (let j = b[i]; j < b[i + 1]; ++j) {
|
310 | r[j] = ((j - b[i]) << 5) | i;
|
311 | }
|
312 | }
|
313 | return [b, r];
|
314 | };
|
315 | const [fl, revfl] = freb(fleb, 2);
|
316 | fl[28] = 258, revfl[258] = 28;
|
317 | const [fd] = freb(fdeb, 0);
|
318 | const rev = new u16(32768);
|
319 | for (let i = 0; i < 32768; ++i) {
|
320 | let x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);
|
321 | x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);
|
322 | x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);
|
323 | rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;
|
324 | }
|
325 | const hMap = ((cd, mb, r) => {
|
326 | const s = cd.length;
|
327 | let i = 0;
|
328 | const l = new u16(mb);
|
329 | for (; i < s; ++i) {
|
330 | if (cd[i])
|
331 | ++l[cd[i] - 1];
|
332 | }
|
333 | const le = new u16(mb);
|
334 | for (i = 1; i < mb; ++i) {
|
335 | le[i] = (le[i - 1] + l[i - 1]) << 1;
|
336 | }
|
337 | let co;
|
338 | if (r) {
|
339 | co = new u16(1 << mb);
|
340 | const rvb = 15 - mb;
|
341 | for (i = 0; i < s; ++i) {
|
342 | if (cd[i]) {
|
343 | const sv = (i << 4) | cd[i];
|
344 | const r = mb - cd[i];
|
345 | let v = le[cd[i] - 1]++ << r;
|
346 | for (const m = v | ((1 << r) - 1); v <= m; ++v) {
|
347 | co[rev[v] >> rvb] = sv;
|
348 | }
|
349 | }
|
350 | }
|
351 | }
|
352 | else {
|
353 | co = new u16(s);
|
354 | for (i = 0; i < s; ++i) {
|
355 | if (cd[i]) {
|
356 | co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);
|
357 | }
|
358 | }
|
359 | }
|
360 | return co;
|
361 | });
|
362 | const flt = new u8(288);
|
363 | for (let i = 0; i < 144; ++i)
|
364 | flt[i] = 8;
|
365 | for (let i = 144; i < 256; ++i)
|
366 | flt[i] = 9;
|
367 | for (let i = 256; i < 280; ++i)
|
368 | flt[i] = 7;
|
369 | for (let i = 280; i < 288; ++i)
|
370 | flt[i] = 8;
|
371 | const fdt = new u8(32);
|
372 | for (let i = 0; i < 32; ++i)
|
373 | fdt[i] = 5;
|
374 | const flrm = hMap(flt, 9, 1);
|
375 | const fdrm = hMap(fdt, 5, 1);
|
376 | const bits = (d, p, m) => {
|
377 | const o = p >>> 3;
|
378 | return ((d[o] | (d[o + 1] << 8)) >>> (p & 7)) & m;
|
379 | };
|
380 | const bits16 = (d, p) => {
|
381 | const o = p >>> 3;
|
382 | return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >>> (p & 7));
|
383 | };
|
384 | const shft = (p) => (p >>> 3) + (p & 7 && 1);
|
385 | const slc = (v, s, e) => {
|
386 | if (s == null || s < 0)
|
387 | s = 0;
|
388 | if (e == null || e > v.length)
|
389 | e = v.length;
|
390 | const n = new (v instanceof u16 ? u16 : v instanceof u32$1 ? u32$1 : u8)(e - s);
|
391 | n.set(v.subarray(s, e));
|
392 | return n;
|
393 | };
|
394 | const max = (a) => {
|
395 | let m = a[0];
|
396 | for (let i = 1, count = a.length; i < count; ++i) {
|
397 | if (a[i] > m)
|
398 | m = a[i];
|
399 | }
|
400 | return m;
|
401 | };
|
402 | const inflt = (dat, buf, st) => {
|
403 | const noSt = !st || st.i;
|
404 | if (!st)
|
405 | st = {};
|
406 | const sl = dat.length;
|
407 | const noBuf = !buf || !noSt;
|
408 | if (!buf)
|
409 | buf = new u8(sl * 3);
|
410 | const cbuf = (l) => {
|
411 | let bl = buf.length;
|
412 | if (l > bl) {
|
413 | const nbuf = new u8(Math.max(bl << 1, l));
|
414 | nbuf.set(buf);
|
415 | buf = nbuf;
|
416 | }
|
417 | };
|
418 | let final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;
|
419 | if (final && !lm)
|
420 | return buf;
|
421 | const tbts = sl << 3;
|
422 | do {
|
423 | if (!lm) {
|
424 | st.f = final = bits(dat, pos, 1);
|
425 | const type = bits(dat, pos + 1, 3);
|
426 | pos += 3;
|
427 | if (!type) {
|
428 | const s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;
|
429 | if (t > sl) {
|
430 | if (noSt)
|
431 | throw 'unexpected EOF';
|
432 | break;
|
433 | }
|
434 | if (noBuf)
|
435 | cbuf(bt + l);
|
436 | buf.set(dat.subarray(s, t), bt);
|
437 | st.b = bt += l, st.p = pos = t << 3;
|
438 | continue;
|
439 | }
|
440 | else if (type == 1)
|
441 | lm = flrm, dm = fdrm, lbt = 9, dbt = 5;
|
442 | else if (type == 2) {
|
443 | const hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
|
444 | const tl = hLit + bits(dat, pos + 5, 31) + 1;
|
445 | pos += 14;
|
446 | const ldt = new u8(tl);
|
447 | const clt = new u8(19);
|
448 | for (let i = 0; i < hcLen; ++i) {
|
449 | clt[clim[i]] = bits(dat, pos + i * 3, 7);
|
450 | }
|
451 | pos += hcLen * 3;
|
452 | const clb = max(clt), clbmsk = (1 << clb) - 1;
|
453 | if (!noSt && pos + tl * (clb + 7) > tbts)
|
454 | break;
|
455 | const clm = hMap(clt, clb, 1);
|
456 | for (let i = 0; i < tl;) {
|
457 | const r = clm[bits(dat, pos, clbmsk)];
|
458 | pos += r & 15;
|
459 | const s = r >>> 4;
|
460 | if (s < 16) {
|
461 | ldt[i++] = s;
|
462 | }
|
463 | else {
|
464 | let c = 0, n = 0;
|
465 | if (s == 16)
|
466 | n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];
|
467 | else if (s == 17)
|
468 | n = 3 + bits(dat, pos, 7), pos += 3;
|
469 | else if (s == 18)
|
470 | n = 11 + bits(dat, pos, 127), pos += 7;
|
471 | while (n--)
|
472 | ldt[i++] = c;
|
473 | }
|
474 | }
|
475 | const lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
|
476 | lbt = max(lt);
|
477 | dbt = max(dt);
|
478 | lm = hMap(lt, lbt, 1);
|
479 | dm = hMap(dt, dbt, 1);
|
480 | }
|
481 | else
|
482 | throw 'invalid block type';
|
483 | if (pos > tbts)
|
484 | throw 'unexpected EOF';
|
485 | }
|
486 | if (noBuf)
|
487 | cbuf(bt + 131072);
|
488 | const lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
|
489 | const mxa = lbt + dbt + 18;
|
490 | while (noSt || pos + mxa < tbts) {
|
491 | const c = lm[bits16(dat, pos) & lms], sym = c >>> 4;
|
492 | pos += c & 15;
|
493 | if (pos > tbts)
|
494 | throw 'unexpected EOF';
|
495 | if (!c)
|
496 | throw 'invalid length/literal';
|
497 | if (sym < 256)
|
498 | buf[bt++] = sym;
|
499 | else if (sym == 256) {
|
500 | lm = undefined;
|
501 | break;
|
502 | }
|
503 | else {
|
504 | let add = sym - 254;
|
505 | if (sym > 264) {
|
506 | const i = sym - 257, b = fleb[i];
|
507 | add = bits(dat, pos, (1 << b) - 1) + fl[i];
|
508 | pos += b;
|
509 | }
|
510 | const d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;
|
511 | if (!d)
|
512 | throw 'invalid distance';
|
513 | pos += d & 15;
|
514 | let dt = fd[dsym];
|
515 | if (dsym > 3) {
|
516 | const b = fdeb[dsym];
|
517 | dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;
|
518 | }
|
519 | if (pos > tbts)
|
520 | throw 'unexpected EOF';
|
521 | if (noBuf)
|
522 | cbuf(bt + 131072);
|
523 | const end = bt + add;
|
524 | for (; bt < end; bt += 4) {
|
525 | buf[bt] = buf[bt - dt];
|
526 | buf[bt + 1] = buf[bt + 1 - dt];
|
527 | buf[bt + 2] = buf[bt + 2 - dt];
|
528 | buf[bt + 3] = buf[bt + 3 - dt];
|
529 | }
|
530 | bt = end;
|
531 | }
|
532 | }
|
533 | st.l = lm, st.p = pos, st.b = bt;
|
534 | if (lm)
|
535 | final = 1, st.m = lbt, st.d = dm, st.n = dbt;
|
536 | } while (!final);
|
537 | return bt == buf.length ? buf : slc(buf, 0, bt);
|
538 | };
|
539 | const zlv = (d) => {
|
540 | if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))
|
541 | throw 'invalid zlib data';
|
542 | if (d[1] & 32)
|
543 | throw 'invalid zlib data: preset dictionaries not supported';
|
544 | };
|
545 | function unzlibSync(data, out) {
|
546 | return inflt((zlv(data), data.subarray(2, -4)), out);
|
547 | }
|
548 |
|
549 | var lenIn = 171008;
|
550 | var lenOut = 339468;
|
551 | var bytes_1 = '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';
|
552 |
|
553 | const wasmBytes = unzlibSync(base64Decode$1(bytes_1, new Uint8Array(lenIn)), new Uint8Array(lenOut));
|
554 |
|
555 | const createWasm = createWasmFn('crypto', wasmBytes, null);
|
556 |
|
557 | const bridge = new Bridge(createWasm);
|
558 | async function initBridge(createWasm) {
|
559 | return bridge.init(createWasm);
|
560 | }
|
561 |
|
562 | function withWasm(fn) {
|
563 | return (...params) => {
|
564 | if (!bridge.wasm) {
|
565 | throw new Error('The WASM interface has not been initialized. Ensure that you wait for the initialization Promise with waitReady() from @polkadot/wasm-crypto (or cryptoWaitReady() from @polkadot/util-crypto) before attempting to use WASM-only interfaces.');
|
566 | }
|
567 | return fn(bridge.wasm, ...params);
|
568 | };
|
569 | }
|
570 | const bip39Generate = withWasm((wasm, words) => {
|
571 | wasm.ext_bip39_generate(8, words);
|
572 | return bridge.resultString();
|
573 | });
|
574 | const bip39ToEntropy = withWasm((wasm, phrase) => {
|
575 | wasm.ext_bip39_to_entropy(8, ...bridge.allocString(phrase));
|
576 | return bridge.resultU8a();
|
577 | });
|
578 | const bip39ToMiniSecret = withWasm((wasm, phrase, password) => {
|
579 | wasm.ext_bip39_to_mini_secret(8, ...bridge.allocString(phrase), ...bridge.allocString(password));
|
580 | return bridge.resultU8a();
|
581 | });
|
582 | const bip39ToSeed = withWasm((wasm, phrase, password) => {
|
583 | wasm.ext_bip39_to_seed(8, ...bridge.allocString(phrase), ...bridge.allocString(password));
|
584 | return bridge.resultU8a();
|
585 | });
|
586 | const bip39Validate = withWasm((wasm, phrase) => {
|
587 | const ret = wasm.ext_bip39_validate(...bridge.allocString(phrase));
|
588 | return ret !== 0;
|
589 | });
|
590 | const ed25519KeypairFromSeed = withWasm((wasm, seed) => {
|
591 | wasm.ext_ed_from_seed(8, ...bridge.allocU8a(seed));
|
592 | return bridge.resultU8a();
|
593 | });
|
594 | const ed25519Sign$1 = withWasm((wasm, pubkey, seckey, message) => {
|
595 | wasm.ext_ed_sign(8, ...bridge.allocU8a(pubkey), ...bridge.allocU8a(seckey), ...bridge.allocU8a(message));
|
596 | return bridge.resultU8a();
|
597 | });
|
598 | const ed25519Verify$1 = withWasm((wasm, signature, message, pubkey) => {
|
599 | const ret = wasm.ext_ed_verify(...bridge.allocU8a(signature), ...bridge.allocU8a(message), ...bridge.allocU8a(pubkey));
|
600 | return ret !== 0;
|
601 | });
|
602 | const secp256k1FromSeed = withWasm((wasm, seckey) => {
|
603 | wasm.ext_secp_from_seed(8, ...bridge.allocU8a(seckey));
|
604 | return bridge.resultU8a();
|
605 | });
|
606 | const secp256k1Compress$1 = withWasm((wasm, pubkey) => {
|
607 | wasm.ext_secp_pub_compress(8, ...bridge.allocU8a(pubkey));
|
608 | return bridge.resultU8a();
|
609 | });
|
610 | const secp256k1Expand$1 = withWasm((wasm, pubkey) => {
|
611 | wasm.ext_secp_pub_expand(8, ...bridge.allocU8a(pubkey));
|
612 | return bridge.resultU8a();
|
613 | });
|
614 | const secp256k1Recover$1 = withWasm((wasm, msgHash, sig, recovery) => {
|
615 | wasm.ext_secp_recover(8, ...bridge.allocU8a(msgHash), ...bridge.allocU8a(sig), recovery);
|
616 | return bridge.resultU8a();
|
617 | });
|
618 | const secp256k1Sign$1 = withWasm((wasm, msgHash, seckey) => {
|
619 | wasm.ext_secp_sign(8, ...bridge.allocU8a(msgHash), ...bridge.allocU8a(seckey));
|
620 | return bridge.resultU8a();
|
621 | });
|
622 | const sr25519DeriveKeypairHard = withWasm((wasm, pair, cc) => {
|
623 | wasm.ext_sr_derive_keypair_hard(8, ...bridge.allocU8a(pair), ...bridge.allocU8a(cc));
|
624 | return bridge.resultU8a();
|
625 | });
|
626 | const sr25519DeriveKeypairSoft = withWasm((wasm, pair, cc) => {
|
627 | wasm.ext_sr_derive_keypair_soft(8, ...bridge.allocU8a(pair), ...bridge.allocU8a(cc));
|
628 | return bridge.resultU8a();
|
629 | });
|
630 | const sr25519DerivePublicSoft = withWasm((wasm, pubkey, cc) => {
|
631 | wasm.ext_sr_derive_public_soft(8, ...bridge.allocU8a(pubkey), ...bridge.allocU8a(cc));
|
632 | return bridge.resultU8a();
|
633 | });
|
634 | const sr25519KeypairFromSeed = withWasm((wasm, seed) => {
|
635 | wasm.ext_sr_from_seed(8, ...bridge.allocU8a(seed));
|
636 | return bridge.resultU8a();
|
637 | });
|
638 | const sr25519Sign$1 = withWasm((wasm, pubkey, secret, message) => {
|
639 | wasm.ext_sr_sign(8, ...bridge.allocU8a(pubkey), ...bridge.allocU8a(secret), ...bridge.allocU8a(message));
|
640 | return bridge.resultU8a();
|
641 | });
|
642 | const sr25519Verify$1 = withWasm((wasm, signature, message, pubkey) => {
|
643 | const ret = wasm.ext_sr_verify(...bridge.allocU8a(signature), ...bridge.allocU8a(message), ...bridge.allocU8a(pubkey));
|
644 | return ret !== 0;
|
645 | });
|
646 | const sr25519Agree = withWasm((wasm, pubkey, secret) => {
|
647 | wasm.ext_sr_agree(8, ...bridge.allocU8a(pubkey), ...bridge.allocU8a(secret));
|
648 | return bridge.resultU8a();
|
649 | });
|
650 | const vrfSign = withWasm((wasm, secret, context, message, extra) => {
|
651 | wasm.ext_vrf_sign(8, ...bridge.allocU8a(secret), ...bridge.allocU8a(context), ...bridge.allocU8a(message), ...bridge.allocU8a(extra));
|
652 | return bridge.resultU8a();
|
653 | });
|
654 | const vrfVerify = withWasm((wasm, pubkey, context, message, extra, outAndProof) => {
|
655 | const ret = wasm.ext_vrf_verify(...bridge.allocU8a(pubkey), ...bridge.allocU8a(context), ...bridge.allocU8a(message), ...bridge.allocU8a(extra), ...bridge.allocU8a(outAndProof));
|
656 | return ret !== 0;
|
657 | });
|
658 | const blake2b$1 = withWasm((wasm, data, key, size) => {
|
659 | wasm.ext_blake2b(8, ...bridge.allocU8a(data), ...bridge.allocU8a(key), size);
|
660 | return bridge.resultU8a();
|
661 | });
|
662 | const hmacSha256 = withWasm((wasm, key, data) => {
|
663 | wasm.ext_hmac_sha256(8, ...bridge.allocU8a(key), ...bridge.allocU8a(data));
|
664 | return bridge.resultU8a();
|
665 | });
|
666 | const hmacSha512 = withWasm((wasm, key, data) => {
|
667 | wasm.ext_hmac_sha512(8, ...bridge.allocU8a(key), ...bridge.allocU8a(data));
|
668 | return bridge.resultU8a();
|
669 | });
|
670 | const keccak256 = withWasm((wasm, data) => {
|
671 | wasm.ext_keccak256(8, ...bridge.allocU8a(data));
|
672 | return bridge.resultU8a();
|
673 | });
|
674 | const keccak512 = withWasm((wasm, data) => {
|
675 | wasm.ext_keccak512(8, ...bridge.allocU8a(data));
|
676 | return bridge.resultU8a();
|
677 | });
|
678 | const pbkdf2$1 = withWasm((wasm, data, salt, rounds) => {
|
679 | wasm.ext_pbkdf2(8, ...bridge.allocU8a(data), ...bridge.allocU8a(salt), rounds);
|
680 | return bridge.resultU8a();
|
681 | });
|
682 | const scrypt$1 = withWasm((wasm, password, salt, log2n, r, p) => {
|
683 | wasm.ext_scrypt(8, ...bridge.allocU8a(password), ...bridge.allocU8a(salt), log2n, r, p);
|
684 | return bridge.resultU8a();
|
685 | });
|
686 | const sha256$1 = withWasm((wasm, data) => {
|
687 | wasm.ext_sha256(8, ...bridge.allocU8a(data));
|
688 | return bridge.resultU8a();
|
689 | });
|
690 | const sha512$1 = withWasm((wasm, data) => {
|
691 | wasm.ext_sha512(8, ...bridge.allocU8a(data));
|
692 | return bridge.resultU8a();
|
693 | });
|
694 | const twox = withWasm((wasm, data, rounds) => {
|
695 | wasm.ext_twox(8, ...bridge.allocU8a(data), rounds);
|
696 | return bridge.resultU8a();
|
697 | });
|
698 | function isReady() {
|
699 | return !!bridge.wasm;
|
700 | }
|
701 | async function waitReady() {
|
702 | try {
|
703 | const wasm = await initBridge();
|
704 | return !!wasm;
|
705 | }
|
706 | catch {
|
707 | return false;
|
708 | }
|
709 | }
|
710 |
|
711 | const cryptoIsReady = isReady;
|
712 | function cryptoWaitReady() {
|
713 | return waitReady()
|
714 | .then(() => {
|
715 | if (!isReady()) {
|
716 | throw new Error('Unable to initialize @polkadot/util-crypto');
|
717 | }
|
718 | return true;
|
719 | })
|
720 | .catch(() => false);
|
721 | }
|
722 |
|
723 | cryptoWaitReady().catch(() => {
|
724 | });
|
725 |
|
726 | const packageInfo = { name: '@polkadot/util-crypto', path: (({ url: (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.src || new URL('bundle-polkadot-util-crypto.js', document.baseURI).href)) }) && (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.src || new URL('bundle-polkadot-util-crypto.js', document.baseURI).href))) ? new URL((typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.src || new URL('bundle-polkadot-util-crypto.js', document.baseURI).href))).pathname.substring(0, new URL((typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.src || new URL('bundle-polkadot-util-crypto.js', document.baseURI).href))).pathname.lastIndexOf('/') + 1) : 'auto', type: 'esm', version: '13.2.3' };
|
727 |
|
728 | /*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
729 | function assertNumber(n) {
|
730 | if (!Number.isSafeInteger(n))
|
731 | throw new Error(`Wrong integer: ${n}`);
|
732 | }
|
733 | function isBytes$3(a) {
|
734 | return (a instanceof Uint8Array ||
|
735 | (a != null && typeof a === 'object' && a.constructor.name === 'Uint8Array'));
|
736 | }
|
737 | function chain(...args) {
|
738 | const id = (a) => a;
|
739 | const wrap = (a, b) => (c) => a(b(c));
|
740 | const encode = args.map((x) => x.encode).reduceRight(wrap, id);
|
741 | const decode = args.map((x) => x.decode).reduce(wrap, id);
|
742 | return { encode, decode };
|
743 | }
|
744 | function alphabet(alphabet) {
|
745 | return {
|
746 | encode: (digits) => {
|
747 | if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))
|
748 | throw new Error('alphabet.encode input should be an array of numbers');
|
749 | return digits.map((i) => {
|
750 | assertNumber(i);
|
751 | if (i < 0 || i >= alphabet.length)
|
752 | throw new Error(`Digit index outside alphabet: ${i} (alphabet: ${alphabet.length})`);
|
753 | return alphabet[i];
|
754 | });
|
755 | },
|
756 | decode: (input) => {
|
757 | if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string'))
|
758 | throw new Error('alphabet.decode input should be array of strings');
|
759 | return input.map((letter) => {
|
760 | if (typeof letter !== 'string')
|
761 | throw new Error(`alphabet.decode: not string element=${letter}`);
|
762 | const index = alphabet.indexOf(letter);
|
763 | if (index === -1)
|
764 | throw new Error(`Unknown letter: "${letter}". Allowed: ${alphabet}`);
|
765 | return index;
|
766 | });
|
767 | },
|
768 | };
|
769 | }
|
770 | function join(separator = '') {
|
771 | if (typeof separator !== 'string')
|
772 | throw new Error('join separator should be string');
|
773 | return {
|
774 | encode: (from) => {
|
775 | if (!Array.isArray(from) || (from.length && typeof from[0] !== 'string'))
|
776 | throw new Error('join.encode input should be array of strings');
|
777 | for (let i of from)
|
778 | if (typeof i !== 'string')
|
779 | throw new Error(`join.encode: non-string input=${i}`);
|
780 | return from.join(separator);
|
781 | },
|
782 | decode: (to) => {
|
783 | if (typeof to !== 'string')
|
784 | throw new Error('join.decode input should be string');
|
785 | return to.split(separator);
|
786 | },
|
787 | };
|
788 | }
|
789 | function padding(bits, chr = '=') {
|
790 | assertNumber(bits);
|
791 | if (typeof chr !== 'string')
|
792 | throw new Error('padding chr should be string');
|
793 | return {
|
794 | encode(data) {
|
795 | if (!Array.isArray(data) || (data.length && typeof data[0] !== 'string'))
|
796 | throw new Error('padding.encode input should be array of strings');
|
797 | for (let i of data)
|
798 | if (typeof i !== 'string')
|
799 | throw new Error(`padding.encode: non-string input=${i}`);
|
800 | while ((data.length * bits) % 8)
|
801 | data.push(chr);
|
802 | return data;
|
803 | },
|
804 | decode(input) {
|
805 | if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string'))
|
806 | throw new Error('padding.encode input should be array of strings');
|
807 | for (let i of input)
|
808 | if (typeof i !== 'string')
|
809 | throw new Error(`padding.decode: non-string input=${i}`);
|
810 | let end = input.length;
|
811 | if ((end * bits) % 8)
|
812 | throw new Error('Invalid padding: string should have whole number of bytes');
|
813 | for (; end > 0 && input[end - 1] === chr; end--) {
|
814 | if (!(((end - 1) * bits) % 8))
|
815 | throw new Error('Invalid padding: string has too much padding');
|
816 | }
|
817 | return input.slice(0, end);
|
818 | },
|
819 | };
|
820 | }
|
821 | function normalize$1(fn) {
|
822 | if (typeof fn !== 'function')
|
823 | throw new Error('normalize fn should be function');
|
824 | return { encode: (from) => from, decode: (to) => fn(to) };
|
825 | }
|
826 | function convertRadix(data, from, to) {
|
827 | if (from < 2)
|
828 | throw new Error(`convertRadix: wrong from=${from}, base cannot be less than 2`);
|
829 | if (to < 2)
|
830 | throw new Error(`convertRadix: wrong to=${to}, base cannot be less than 2`);
|
831 | if (!Array.isArray(data))
|
832 | throw new Error('convertRadix: data should be array');
|
833 | if (!data.length)
|
834 | return [];
|
835 | let pos = 0;
|
836 | const res = [];
|
837 | const digits = Array.from(data);
|
838 | digits.forEach((d) => {
|
839 | assertNumber(d);
|
840 | if (d < 0 || d >= from)
|
841 | throw new Error(`Wrong integer: ${d}`);
|
842 | });
|
843 | while (true) {
|
844 | let carry = 0;
|
845 | let done = true;
|
846 | for (let i = pos; i < digits.length; i++) {
|
847 | const digit = digits[i];
|
848 | const digitBase = from * carry + digit;
|
849 | if (!Number.isSafeInteger(digitBase) ||
|
850 | (from * carry) / from !== carry ||
|
851 | digitBase - digit !== from * carry) {
|
852 | throw new Error('convertRadix: carry overflow');
|
853 | }
|
854 | carry = digitBase % to;
|
855 | const rounded = Math.floor(digitBase / to);
|
856 | digits[i] = rounded;
|
857 | if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)
|
858 | throw new Error('convertRadix: carry overflow');
|
859 | if (!done)
|
860 | continue;
|
861 | else if (!rounded)
|
862 | pos = i;
|
863 | else
|
864 | done = false;
|
865 | }
|
866 | res.push(carry);
|
867 | if (done)
|
868 | break;
|
869 | }
|
870 | for (let i = 0; i < data.length - 1 && data[i] === 0; i++)
|
871 | res.push(0);
|
872 | return res.reverse();
|
873 | }
|
874 | const gcd = (a, b) => (!b ? a : gcd(b, a % b));
|
875 | const radix2carry = (from, to) => from + (to - gcd(from, to));
|
876 | function convertRadix2(data, from, to, padding) {
|
877 | if (!Array.isArray(data))
|
878 | throw new Error('convertRadix2: data should be array');
|
879 | if (from <= 0 || from > 32)
|
880 | throw new Error(`convertRadix2: wrong from=${from}`);
|
881 | if (to <= 0 || to > 32)
|
882 | throw new Error(`convertRadix2: wrong to=${to}`);
|
883 | if (radix2carry(from, to) > 32) {
|
884 | throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`);
|
885 | }
|
886 | let carry = 0;
|
887 | let pos = 0;
|
888 | const mask = 2 ** to - 1;
|
889 | const res = [];
|
890 | for (const n of data) {
|
891 | assertNumber(n);
|
892 | if (n >= 2 ** from)
|
893 | throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);
|
894 | carry = (carry << from) | n;
|
895 | if (pos + from > 32)
|
896 | throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);
|
897 | pos += from;
|
898 | for (; pos >= to; pos -= to)
|
899 | res.push(((carry >> (pos - to)) & mask) >>> 0);
|
900 | carry &= 2 ** pos - 1;
|
901 | }
|
902 | carry = (carry << (to - pos)) & mask;
|
903 | if (!padding && pos >= from)
|
904 | throw new Error('Excess padding');
|
905 | if (!padding && carry)
|
906 | throw new Error(`Non-zero padding: ${carry}`);
|
907 | if (padding && pos > 0)
|
908 | res.push(carry >>> 0);
|
909 | return res;
|
910 | }
|
911 | function radix(num) {
|
912 | assertNumber(num);
|
913 | return {
|
914 | encode: (bytes) => {
|
915 | if (!isBytes$3(bytes))
|
916 | throw new Error('radix.encode input should be Uint8Array');
|
917 | return convertRadix(Array.from(bytes), 2 ** 8, num);
|
918 | },
|
919 | decode: (digits) => {
|
920 | if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))
|
921 | throw new Error('radix.decode input should be array of numbers');
|
922 | return Uint8Array.from(convertRadix(digits, num, 2 ** 8));
|
923 | },
|
924 | };
|
925 | }
|
926 | function radix2(bits, revPadding = false) {
|
927 | assertNumber(bits);
|
928 | if (bits <= 0 || bits > 32)
|
929 | throw new Error('radix2: bits should be in (0..32]');
|
930 | if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)
|
931 | throw new Error('radix2: carry overflow');
|
932 | return {
|
933 | encode: (bytes) => {
|
934 | if (!isBytes$3(bytes))
|
935 | throw new Error('radix2.encode input should be Uint8Array');
|
936 | return convertRadix2(Array.from(bytes), 8, bits, !revPadding);
|
937 | },
|
938 | decode: (digits) => {
|
939 | if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))
|
940 | throw new Error('radix2.decode input should be array of numbers');
|
941 | return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));
|
942 | },
|
943 | };
|
944 | }
|
945 | function unsafeWrapper(fn) {
|
946 | if (typeof fn !== 'function')
|
947 | throw new Error('unsafeWrapper fn should be function');
|
948 | return function (...args) {
|
949 | try {
|
950 | return fn.apply(null, args);
|
951 | }
|
952 | catch (e) { }
|
953 | };
|
954 | }
|
955 | function checksum(len, fn) {
|
956 | assertNumber(len);
|
957 | if (typeof fn !== 'function')
|
958 | throw new Error('checksum fn should be function');
|
959 | return {
|
960 | encode(data) {
|
961 | if (!isBytes$3(data))
|
962 | throw new Error('checksum.encode: input should be Uint8Array');
|
963 | const checksum = fn(data).slice(0, len);
|
964 | const res = new Uint8Array(data.length + len);
|
965 | res.set(data);
|
966 | res.set(checksum, data.length);
|
967 | return res;
|
968 | },
|
969 | decode(data) {
|
970 | if (!isBytes$3(data))
|
971 | throw new Error('checksum.decode: input should be Uint8Array');
|
972 | const payload = data.slice(0, -len);
|
973 | const newChecksum = fn(payload).slice(0, len);
|
974 | const oldChecksum = data.slice(-len);
|
975 | for (let i = 0; i < len; i++)
|
976 | if (newChecksum[i] !== oldChecksum[i])
|
977 | throw new Error('Invalid checksum');
|
978 | return payload;
|
979 | },
|
980 | };
|
981 | }
|
982 | const utils = {
|
983 | alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,
|
984 | };
|
985 | chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));
|
986 | chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), padding(5), join(''));
|
987 | chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), join(''));
|
988 | chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), padding(5), join(''));
|
989 | chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), join(''));
|
990 | chain(radix2(5), alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'), join(''), normalize$1((s) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1')));
|
991 | const base64 = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), padding(6), join(''));
|
992 | chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), join(''));
|
993 | chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), padding(6), join(''));
|
994 | chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), join(''));
|
995 | const genBase58 = (abc) => chain(radix(58), alphabet(abc), join(''));
|
996 | const base58 = genBase58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
|
997 | genBase58('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ');
|
998 | genBase58('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz');
|
999 | const BECH_ALPHABET = chain(alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), join(''));
|
1000 | const POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];
|
1001 | function bech32Polymod(pre) {
|
1002 | const b = pre >> 25;
|
1003 | let chk = (pre & 0x1ffffff) << 5;
|
1004 | for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {
|
1005 | if (((b >> i) & 1) === 1)
|
1006 | chk ^= POLYMOD_GENERATORS[i];
|
1007 | }
|
1008 | return chk;
|
1009 | }
|
1010 | function bechChecksum(prefix, words, encodingConst = 1) {
|
1011 | const len = prefix.length;
|
1012 | let chk = 1;
|
1013 | for (let i = 0; i < len; i++) {
|
1014 | const c = prefix.charCodeAt(i);
|
1015 | if (c < 33 || c > 126)
|
1016 | throw new Error(`Invalid prefix (${prefix})`);
|
1017 | chk = bech32Polymod(chk) ^ (c >> 5);
|
1018 | }
|
1019 | chk = bech32Polymod(chk);
|
1020 | for (let i = 0; i < len; i++)
|
1021 | chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);
|
1022 | for (let v of words)
|
1023 | chk = bech32Polymod(chk) ^ v;
|
1024 | for (let i = 0; i < 6; i++)
|
1025 | chk = bech32Polymod(chk);
|
1026 | chk ^= encodingConst;
|
1027 | return BECH_ALPHABET.encode(convertRadix2([chk % 2 ** 30], 30, 5, false));
|
1028 | }
|
1029 | function genBech32(encoding) {
|
1030 | const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;
|
1031 | const _words = radix2(5);
|
1032 | const fromWords = _words.decode;
|
1033 | const toWords = _words.encode;
|
1034 | const fromWordsUnsafe = unsafeWrapper(fromWords);
|
1035 | function encode(prefix, words, limit = 90) {
|
1036 | if (typeof prefix !== 'string')
|
1037 | throw new Error(`bech32.encode prefix should be string, not ${typeof prefix}`);
|
1038 | if (!Array.isArray(words) || (words.length && typeof words[0] !== 'number'))
|
1039 | throw new Error(`bech32.encode words should be array of numbers, not ${typeof words}`);
|
1040 | if (prefix.length === 0)
|
1041 | throw new TypeError(`Invalid prefix length ${prefix.length}`);
|
1042 | const actualLength = prefix.length + 7 + words.length;
|
1043 | if (limit !== false && actualLength > limit)
|
1044 | throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);
|
1045 | const lowered = prefix.toLowerCase();
|
1046 | const sum = bechChecksum(lowered, words, ENCODING_CONST);
|
1047 | return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}`;
|
1048 | }
|
1049 | function decode(str, limit = 90) {
|
1050 | if (typeof str !== 'string')
|
1051 | throw new Error(`bech32.decode input should be string, not ${typeof str}`);
|
1052 | if (str.length < 8 || (limit !== false && str.length > limit))
|
1053 | throw new TypeError(`Wrong string length: ${str.length} (${str}). Expected (8..${limit})`);
|
1054 | const lowered = str.toLowerCase();
|
1055 | if (str !== lowered && str !== str.toUpperCase())
|
1056 | throw new Error(`String must be lowercase or uppercase`);
|
1057 | const sepIndex = lowered.lastIndexOf('1');
|
1058 | if (sepIndex === 0 || sepIndex === -1)
|
1059 | throw new Error(`Letter "1" must be present between prefix and data only`);
|
1060 | const prefix = lowered.slice(0, sepIndex);
|
1061 | const data = lowered.slice(sepIndex + 1);
|
1062 | if (data.length < 6)
|
1063 | throw new Error('Data must be at least 6 characters long');
|
1064 | const words = BECH_ALPHABET.decode(data).slice(0, -6);
|
1065 | const sum = bechChecksum(prefix, words, ENCODING_CONST);
|
1066 | if (!data.endsWith(sum))
|
1067 | throw new Error(`Invalid checksum in ${str}: expected "${sum}"`);
|
1068 | return { prefix, words };
|
1069 | }
|
1070 | const decodeUnsafe = unsafeWrapper(decode);
|
1071 | function decodeToBytes(str) {
|
1072 | const { prefix, words } = decode(str, false);
|
1073 | return { prefix, words, bytes: fromWords(words) };
|
1074 | }
|
1075 | return { encode, decode, decodeToBytes, decodeUnsafe, fromWords, fromWordsUnsafe, toWords };
|
1076 | }
|
1077 | genBech32('bech32');
|
1078 | genBech32('bech32m');
|
1079 | chain(radix2(4), alphabet('0123456789abcdef'), join(''), normalize$1((s) => {
|
1080 | if (typeof s !== 'string' || s.length % 2)
|
1081 | throw new TypeError(`hex.decode: expected string, got ${typeof s} with length ${s.length}`);
|
1082 | return s.toLowerCase();
|
1083 | }));
|
1084 |
|
1085 | function createDecode({ coder, ipfs }, validate) {
|
1086 | return (value, ipfsCompat) => {
|
1087 | validate(value, ipfsCompat);
|
1088 | return coder.decode(ipfs && ipfsCompat
|
1089 | ? value.substring(1)
|
1090 | : value);
|
1091 | };
|
1092 | }
|
1093 | function createEncode({ coder, ipfs }) {
|
1094 | return (value, ipfsCompat) => {
|
1095 | const out = coder.encode(util.u8aToU8a(value));
|
1096 | return ipfs && ipfsCompat
|
1097 | ? `${ipfs}${out}`
|
1098 | : out;
|
1099 | };
|
1100 | }
|
1101 | function createIs(validate) {
|
1102 | return (value, ipfsCompat) => {
|
1103 | try {
|
1104 | return validate(value, ipfsCompat);
|
1105 | }
|
1106 | catch {
|
1107 | return false;
|
1108 | }
|
1109 | };
|
1110 | }
|
1111 | function createValidate({ chars, ipfs, type, withPadding }) {
|
1112 | return (value, ipfsCompat) => {
|
1113 | if (typeof value !== 'string') {
|
1114 | throw new Error(`Expected ${type} string input`);
|
1115 | }
|
1116 | else if (ipfs && ipfsCompat && !value.startsWith(ipfs)) {
|
1117 | throw new Error(`Expected ipfs-compatible ${type} to start with '${ipfs}'`);
|
1118 | }
|
1119 | for (let i = (ipfsCompat ? 1 : 0), count = value.length; i < count; i++) {
|
1120 | if (chars.includes(value[i])) ;
|
1121 | else if (withPadding && value[i] === '=') {
|
1122 | if (i === count - 1) ;
|
1123 | else if (value[i + 1] === '=') ;
|
1124 | else {
|
1125 | throw new Error(`Invalid ${type} padding sequence "${value[i]}${value[i + 1]}" at index ${i}`);
|
1126 | }
|
1127 | }
|
1128 | else {
|
1129 | throw new Error(`Invalid ${type} character "${value[i]}" (0x${value.charCodeAt(i).toString(16)}) at index ${i}`);
|
1130 | }
|
1131 | }
|
1132 | return true;
|
1133 | };
|
1134 | }
|
1135 |
|
1136 | const config$2 = {
|
1137 | chars: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',
|
1138 | coder: base58,
|
1139 | ipfs: 'z',
|
1140 | type: 'base58'
|
1141 | };
|
1142 | const base58Validate = createValidate(config$2);
|
1143 | const base58Decode = createDecode(config$2, base58Validate);
|
1144 | const base58Encode = createEncode(config$2);
|
1145 | const isBase58 = createIs(base58Validate);
|
1146 |
|
1147 | function number(n) {
|
1148 | if (!Number.isSafeInteger(n) || n < 0)
|
1149 | throw new Error(`Wrong positive integer: ${n}`);
|
1150 | }
|
1151 | function isBytes$2(a) {
|
1152 | return (a instanceof Uint8Array ||
|
1153 | (a != null && typeof a === 'object' && a.constructor.name === 'Uint8Array'));
|
1154 | }
|
1155 | function bytes(b, ...lengths) {
|
1156 | if (!isBytes$2(b))
|
1157 | throw new Error('Expected Uint8Array');
|
1158 | if (lengths.length > 0 && !lengths.includes(b.length))
|
1159 | throw new Error(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`);
|
1160 | }
|
1161 | function hash(hash) {
|
1162 | if (typeof hash !== 'function' || typeof hash.create !== 'function')
|
1163 | throw new Error('Hash should be wrapped by utils.wrapConstructor');
|
1164 | number(hash.outputLen);
|
1165 | number(hash.blockLen);
|
1166 | }
|
1167 | function exists(instance, checkFinished = true) {
|
1168 | if (instance.destroyed)
|
1169 | throw new Error('Hash instance has been destroyed');
|
1170 | if (checkFinished && instance.finished)
|
1171 | throw new Error('Hash#digest() has already been called');
|
1172 | }
|
1173 | function output(out, instance) {
|
1174 | bytes(out);
|
1175 | const min = instance.outputLen;
|
1176 | if (out.length < min) {
|
1177 | throw new Error(`digestInto() expects output buffer of length at least ${min}`);
|
1178 | }
|
1179 | }
|
1180 |
|
1181 | const crypto = typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;
|
1182 |
|
1183 | /*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
1184 | const u32 = (arr) => new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
|
1185 | function isBytes$1(a) {
|
1186 | return (a instanceof Uint8Array ||
|
1187 | (a != null && typeof a === 'object' && a.constructor.name === 'Uint8Array'));
|
1188 | }
|
1189 | const createView = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength);
|
1190 | const rotr = (word, shift) => (word << (32 - shift)) | (word >>> shift);
|
1191 | const isLE = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44;
|
1192 | if (!isLE)
|
1193 | throw new Error('Non little-endian hardware is not supported');
|
1194 | Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));
|
1195 | function utf8ToBytes$1(str) {
|
1196 | if (typeof str !== 'string')
|
1197 | throw new Error(`utf8ToBytes expected string, got ${typeof str}`);
|
1198 | return new Uint8Array(new TextEncoder().encode(str));
|
1199 | }
|
1200 | function toBytes(data) {
|
1201 | if (typeof data === 'string')
|
1202 | data = utf8ToBytes$1(data);
|
1203 | if (!isBytes$1(data))
|
1204 | throw new Error(`expected Uint8Array, got ${typeof data}`);
|
1205 | return data;
|
1206 | }
|
1207 | function concatBytes$1(...arrays) {
|
1208 | let sum = 0;
|
1209 | for (let i = 0; i < arrays.length; i++) {
|
1210 | const a = arrays[i];
|
1211 | if (!isBytes$1(a))
|
1212 | throw new Error('Uint8Array expected');
|
1213 | sum += a.length;
|
1214 | }
|
1215 | const res = new Uint8Array(sum);
|
1216 | for (let i = 0, pad = 0; i < arrays.length; i++) {
|
1217 | const a = arrays[i];
|
1218 | res.set(a, pad);
|
1219 | pad += a.length;
|
1220 | }
|
1221 | return res;
|
1222 | }
|
1223 | class Hash {
|
1224 | clone() {
|
1225 | return this._cloneInto();
|
1226 | }
|
1227 | }
|
1228 | const toStr = {}.toString;
|
1229 | function checkOpts(defaults, opts) {
|
1230 | if (opts !== undefined && toStr.call(opts) !== '[object Object]')
|
1231 | throw new Error('Options should be object or undefined');
|
1232 | const merged = Object.assign(defaults, opts);
|
1233 | return merged;
|
1234 | }
|
1235 | function wrapConstructor(hashCons) {
|
1236 | const hashC = (msg) => hashCons().update(toBytes(msg)).digest();
|
1237 | const tmp = hashCons();
|
1238 | hashC.outputLen = tmp.outputLen;
|
1239 | hashC.blockLen = tmp.blockLen;
|
1240 | hashC.create = () => hashCons();
|
1241 | return hashC;
|
1242 | }
|
1243 | function wrapConstructorWithOpts(hashCons) {
|
1244 | const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();
|
1245 | const tmp = hashCons({});
|
1246 | hashC.outputLen = tmp.outputLen;
|
1247 | hashC.blockLen = tmp.blockLen;
|
1248 | hashC.create = (opts) => hashCons(opts);
|
1249 | return hashC;
|
1250 | }
|
1251 | function wrapXOFConstructorWithOpts(hashCons) {
|
1252 | const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();
|
1253 | const tmp = hashCons({});
|
1254 | hashC.outputLen = tmp.outputLen;
|
1255 | hashC.blockLen = tmp.blockLen;
|
1256 | hashC.create = (opts) => hashCons(opts);
|
1257 | return hashC;
|
1258 | }
|
1259 | function randomBytes(bytesLength = 32) {
|
1260 | if (crypto && typeof crypto.getRandomValues === 'function') {
|
1261 | return crypto.getRandomValues(new Uint8Array(bytesLength));
|
1262 | }
|
1263 | throw new Error('crypto.getRandomValues must be defined');
|
1264 | }
|
1265 |
|
1266 | const SIGMA = new Uint8Array([
|
1267 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
1268 | 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3,
|
1269 | 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4,
|
1270 | 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8,
|
1271 | 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13,
|
1272 | 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9,
|
1273 | 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11,
|
1274 | 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10,
|
1275 | 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5,
|
1276 | 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0,
|
1277 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
1278 | 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3,
|
1279 | ]);
|
1280 | class BLAKE2 extends Hash {
|
1281 | constructor(blockLen, outputLen, opts = {}, keyLen, saltLen, persLen) {
|
1282 | super();
|
1283 | this.blockLen = blockLen;
|
1284 | this.outputLen = outputLen;
|
1285 | this.length = 0;
|
1286 | this.pos = 0;
|
1287 | this.finished = false;
|
1288 | this.destroyed = false;
|
1289 | number(blockLen);
|
1290 | number(outputLen);
|
1291 | number(keyLen);
|
1292 | if (outputLen < 0 || outputLen > keyLen)
|
1293 | throw new Error('outputLen bigger than keyLen');
|
1294 | if (opts.key !== undefined && (opts.key.length < 1 || opts.key.length > keyLen))
|
1295 | throw new Error(`key must be up 1..${keyLen} byte long or undefined`);
|
1296 | if (opts.salt !== undefined && opts.salt.length !== saltLen)
|
1297 | throw new Error(`salt must be ${saltLen} byte long or undefined`);
|
1298 | if (opts.personalization !== undefined && opts.personalization.length !== persLen)
|
1299 | throw new Error(`personalization must be ${persLen} byte long or undefined`);
|
1300 | this.buffer32 = u32((this.buffer = new Uint8Array(blockLen)));
|
1301 | }
|
1302 | update(data) {
|
1303 | exists(this);
|
1304 | const { blockLen, buffer, buffer32 } = this;
|
1305 | data = toBytes(data);
|
1306 | const len = data.length;
|
1307 | const offset = data.byteOffset;
|
1308 | const buf = data.buffer;
|
1309 | for (let pos = 0; pos < len;) {
|
1310 | if (this.pos === blockLen) {
|
1311 | this.compress(buffer32, 0, false);
|
1312 | this.pos = 0;
|
1313 | }
|
1314 | const take = Math.min(blockLen - this.pos, len - pos);
|
1315 | const dataOffset = offset + pos;
|
1316 | if (take === blockLen && !(dataOffset % 4) && pos + take < len) {
|
1317 | const data32 = new Uint32Array(buf, dataOffset, Math.floor((len - pos) / 4));
|
1318 | for (let pos32 = 0; pos + blockLen < len; pos32 += buffer32.length, pos += blockLen) {
|
1319 | this.length += blockLen;
|
1320 | this.compress(data32, pos32, false);
|
1321 | }
|
1322 | continue;
|
1323 | }
|
1324 | buffer.set(data.subarray(pos, pos + take), this.pos);
|
1325 | this.pos += take;
|
1326 | this.length += take;
|
1327 | pos += take;
|
1328 | }
|
1329 | return this;
|
1330 | }
|
1331 | digestInto(out) {
|
1332 | exists(this);
|
1333 | output(out, this);
|
1334 | const { pos, buffer32 } = this;
|
1335 | this.finished = true;
|
1336 | this.buffer.subarray(pos).fill(0);
|
1337 | this.compress(buffer32, 0, true);
|
1338 | const out32 = u32(out);
|
1339 | this.get().forEach((v, i) => (out32[i] = v));
|
1340 | }
|
1341 | digest() {
|
1342 | const { buffer, outputLen } = this;
|
1343 | this.digestInto(buffer);
|
1344 | const res = buffer.slice(0, outputLen);
|
1345 | this.destroy();
|
1346 | return res;
|
1347 | }
|
1348 | _cloneInto(to) {
|
1349 | const { buffer, length, finished, destroyed, outputLen, pos } = this;
|
1350 | to || (to = new this.constructor({ dkLen: outputLen }));
|
1351 | to.set(...this.get());
|
1352 | to.length = length;
|
1353 | to.finished = finished;
|
1354 | to.destroyed = destroyed;
|
1355 | to.outputLen = outputLen;
|
1356 | to.buffer.set(buffer);
|
1357 | to.pos = pos;
|
1358 | return to;
|
1359 | }
|
1360 | }
|
1361 |
|
1362 | const U32_MASK64 = BigInt(2 ** 32 - 1);
|
1363 | const _32n$1 = BigInt(32);
|
1364 | function fromBig(n, le = false) {
|
1365 | if (le)
|
1366 | return { h: Number(n & U32_MASK64), l: Number((n >> _32n$1) & U32_MASK64) };
|
1367 | return { h: Number((n >> _32n$1) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };
|
1368 | }
|
1369 | function split(lst, le = false) {
|
1370 | let Ah = new Uint32Array(lst.length);
|
1371 | let Al = new Uint32Array(lst.length);
|
1372 | for (let i = 0; i < lst.length; i++) {
|
1373 | const { h, l } = fromBig(lst[i], le);
|
1374 | [Ah[i], Al[i]] = [h, l];
|
1375 | }
|
1376 | return [Ah, Al];
|
1377 | }
|
1378 | const toBig = (h, l) => (BigInt(h >>> 0) << _32n$1) | BigInt(l >>> 0);
|
1379 | const shrSH = (h, _l, s) => h >>> s;
|
1380 | const shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);
|
1381 | const rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));
|
1382 | const rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);
|
1383 | const rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));
|
1384 | const rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));
|
1385 | const rotr32H = (_h, l) => l;
|
1386 | const rotr32L = (h, _l) => h;
|
1387 | const rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));
|
1388 | const rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));
|
1389 | const rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));
|
1390 | const rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));
|
1391 | function add(Ah, Al, Bh, Bl) {
|
1392 | const l = (Al >>> 0) + (Bl >>> 0);
|
1393 | return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };
|
1394 | }
|
1395 | const add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);
|
1396 | const add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;
|
1397 | const add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);
|
1398 | const add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;
|
1399 | const add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);
|
1400 | const add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;
|
1401 | const u64 = {
|
1402 | fromBig, split, toBig,
|
1403 | shrSH, shrSL,
|
1404 | rotrSH, rotrSL, rotrBH, rotrBL,
|
1405 | rotr32H, rotr32L,
|
1406 | rotlSH, rotlSL, rotlBH, rotlBL,
|
1407 | add, add3L, add3H, add4L, add4H, add5H, add5L,
|
1408 | };
|
1409 |
|
1410 | const IV$1 = new Uint32Array([
|
1411 | 0xf3bcc908, 0x6a09e667, 0x84caa73b, 0xbb67ae85, 0xfe94f82b, 0x3c6ef372, 0x5f1d36f1, 0xa54ff53a,
|
1412 | 0xade682d1, 0x510e527f, 0x2b3e6c1f, 0x9b05688c, 0xfb41bd6b, 0x1f83d9ab, 0x137e2179, 0x5be0cd19
|
1413 | ]);
|
1414 | const BUF = new Uint32Array(32);
|
1415 | function G1(a, b, c, d, msg, x) {
|
1416 | const Xl = msg[x], Xh = msg[x + 1];
|
1417 | let Al = BUF[2 * a], Ah = BUF[2 * a + 1];
|
1418 | let Bl = BUF[2 * b], Bh = BUF[2 * b + 1];
|
1419 | let Cl = BUF[2 * c], Ch = BUF[2 * c + 1];
|
1420 | let Dl = BUF[2 * d], Dh = BUF[2 * d + 1];
|
1421 | let ll = u64.add3L(Al, Bl, Xl);
|
1422 | Ah = u64.add3H(ll, Ah, Bh, Xh);
|
1423 | Al = ll | 0;
|
1424 | ({ Dh, Dl } = { Dh: Dh ^ Ah, Dl: Dl ^ Al });
|
1425 | ({ Dh, Dl } = { Dh: u64.rotr32H(Dh, Dl), Dl: u64.rotr32L(Dh, Dl) });
|
1426 | ({ h: Ch, l: Cl } = u64.add(Ch, Cl, Dh, Dl));
|
1427 | ({ Bh, Bl } = { Bh: Bh ^ Ch, Bl: Bl ^ Cl });
|
1428 | ({ Bh, Bl } = { Bh: u64.rotrSH(Bh, Bl, 24), Bl: u64.rotrSL(Bh, Bl, 24) });
|
1429 | (BUF[2 * a] = Al), (BUF[2 * a + 1] = Ah);
|
1430 | (BUF[2 * b] = Bl), (BUF[2 * b + 1] = Bh);
|
1431 | (BUF[2 * c] = Cl), (BUF[2 * c + 1] = Ch);
|
1432 | (BUF[2 * d] = Dl), (BUF[2 * d + 1] = Dh);
|
1433 | }
|
1434 | function G2(a, b, c, d, msg, x) {
|
1435 | const Xl = msg[x], Xh = msg[x + 1];
|
1436 | let Al = BUF[2 * a], Ah = BUF[2 * a + 1];
|
1437 | let Bl = BUF[2 * b], Bh = BUF[2 * b + 1];
|
1438 | let Cl = BUF[2 * c], Ch = BUF[2 * c + 1];
|
1439 | let Dl = BUF[2 * d], Dh = BUF[2 * d + 1];
|
1440 | let ll = u64.add3L(Al, Bl, Xl);
|
1441 | Ah = u64.add3H(ll, Ah, Bh, Xh);
|
1442 | Al = ll | 0;
|
1443 | ({ Dh, Dl } = { Dh: Dh ^ Ah, Dl: Dl ^ Al });
|
1444 | ({ Dh, Dl } = { Dh: u64.rotrSH(Dh, Dl, 16), Dl: u64.rotrSL(Dh, Dl, 16) });
|
1445 | ({ h: Ch, l: Cl } = u64.add(Ch, Cl, Dh, Dl));
|
1446 | ({ Bh, Bl } = { Bh: Bh ^ Ch, Bl: Bl ^ Cl });
|
1447 | ({ Bh, Bl } = { Bh: u64.rotrBH(Bh, Bl, 63), Bl: u64.rotrBL(Bh, Bl, 63) });
|
1448 | (BUF[2 * a] = Al), (BUF[2 * a + 1] = Ah);
|
1449 | (BUF[2 * b] = Bl), (BUF[2 * b + 1] = Bh);
|
1450 | (BUF[2 * c] = Cl), (BUF[2 * c + 1] = Ch);
|
1451 | (BUF[2 * d] = Dl), (BUF[2 * d + 1] = Dh);
|
1452 | }
|
1453 | class BLAKE2b extends BLAKE2 {
|
1454 | constructor(opts = {}) {
|
1455 | super(128, opts.dkLen === undefined ? 64 : opts.dkLen, opts, 64, 16, 16);
|
1456 | this.v0l = IV$1[0] | 0;
|
1457 | this.v0h = IV$1[1] | 0;
|
1458 | this.v1l = IV$1[2] | 0;
|
1459 | this.v1h = IV$1[3] | 0;
|
1460 | this.v2l = IV$1[4] | 0;
|
1461 | this.v2h = IV$1[5] | 0;
|
1462 | this.v3l = IV$1[6] | 0;
|
1463 | this.v3h = IV$1[7] | 0;
|
1464 | this.v4l = IV$1[8] | 0;
|
1465 | this.v4h = IV$1[9] | 0;
|
1466 | this.v5l = IV$1[10] | 0;
|
1467 | this.v5h = IV$1[11] | 0;
|
1468 | this.v6l = IV$1[12] | 0;
|
1469 | this.v6h = IV$1[13] | 0;
|
1470 | this.v7l = IV$1[14] | 0;
|
1471 | this.v7h = IV$1[15] | 0;
|
1472 | const keyLength = opts.key ? opts.key.length : 0;
|
1473 | this.v0l ^= this.outputLen | (keyLength << 8) | (0x01 << 16) | (0x01 << 24);
|
1474 | if (opts.salt) {
|
1475 | const salt = u32(toBytes(opts.salt));
|
1476 | this.v4l ^= salt[0];
|
1477 | this.v4h ^= salt[1];
|
1478 | this.v5l ^= salt[2];
|
1479 | this.v5h ^= salt[3];
|
1480 | }
|
1481 | if (opts.personalization) {
|
1482 | const pers = u32(toBytes(opts.personalization));
|
1483 | this.v6l ^= pers[0];
|
1484 | this.v6h ^= pers[1];
|
1485 | this.v7l ^= pers[2];
|
1486 | this.v7h ^= pers[3];
|
1487 | }
|
1488 | if (opts.key) {
|
1489 | const tmp = new Uint8Array(this.blockLen);
|
1490 | tmp.set(toBytes(opts.key));
|
1491 | this.update(tmp);
|
1492 | }
|
1493 | }
|
1494 | get() {
|
1495 | let { v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h } = this;
|
1496 | return [v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h];
|
1497 | }
|
1498 | set(v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h) {
|
1499 | this.v0l = v0l | 0;
|
1500 | this.v0h = v0h | 0;
|
1501 | this.v1l = v1l | 0;
|
1502 | this.v1h = v1h | 0;
|
1503 | this.v2l = v2l | 0;
|
1504 | this.v2h = v2h | 0;
|
1505 | this.v3l = v3l | 0;
|
1506 | this.v3h = v3h | 0;
|
1507 | this.v4l = v4l | 0;
|
1508 | this.v4h = v4h | 0;
|
1509 | this.v5l = v5l | 0;
|
1510 | this.v5h = v5h | 0;
|
1511 | this.v6l = v6l | 0;
|
1512 | this.v6h = v6h | 0;
|
1513 | this.v7l = v7l | 0;
|
1514 | this.v7h = v7h | 0;
|
1515 | }
|
1516 | compress(msg, offset, isLast) {
|
1517 | this.get().forEach((v, i) => (BUF[i] = v));
|
1518 | BUF.set(IV$1, 16);
|
1519 | let { h, l } = u64.fromBig(BigInt(this.length));
|
1520 | BUF[24] = IV$1[8] ^ l;
|
1521 | BUF[25] = IV$1[9] ^ h;
|
1522 | if (isLast) {
|
1523 | BUF[28] = ~BUF[28];
|
1524 | BUF[29] = ~BUF[29];
|
1525 | }
|
1526 | let j = 0;
|
1527 | const s = SIGMA;
|
1528 | for (let i = 0; i < 12; i++) {
|
1529 | G1(0, 4, 8, 12, msg, offset + 2 * s[j++]);
|
1530 | G2(0, 4, 8, 12, msg, offset + 2 * s[j++]);
|
1531 | G1(1, 5, 9, 13, msg, offset + 2 * s[j++]);
|
1532 | G2(1, 5, 9, 13, msg, offset + 2 * s[j++]);
|
1533 | G1(2, 6, 10, 14, msg, offset + 2 * s[j++]);
|
1534 | G2(2, 6, 10, 14, msg, offset + 2 * s[j++]);
|
1535 | G1(3, 7, 11, 15, msg, offset + 2 * s[j++]);
|
1536 | G2(3, 7, 11, 15, msg, offset + 2 * s[j++]);
|
1537 | G1(0, 5, 10, 15, msg, offset + 2 * s[j++]);
|
1538 | G2(0, 5, 10, 15, msg, offset + 2 * s[j++]);
|
1539 | G1(1, 6, 11, 12, msg, offset + 2 * s[j++]);
|
1540 | G2(1, 6, 11, 12, msg, offset + 2 * s[j++]);
|
1541 | G1(2, 7, 8, 13, msg, offset + 2 * s[j++]);
|
1542 | G2(2, 7, 8, 13, msg, offset + 2 * s[j++]);
|
1543 | G1(3, 4, 9, 14, msg, offset + 2 * s[j++]);
|
1544 | G2(3, 4, 9, 14, msg, offset + 2 * s[j++]);
|
1545 | }
|
1546 | this.v0l ^= BUF[0] ^ BUF[16];
|
1547 | this.v0h ^= BUF[1] ^ BUF[17];
|
1548 | this.v1l ^= BUF[2] ^ BUF[18];
|
1549 | this.v1h ^= BUF[3] ^ BUF[19];
|
1550 | this.v2l ^= BUF[4] ^ BUF[20];
|
1551 | this.v2h ^= BUF[5] ^ BUF[21];
|
1552 | this.v3l ^= BUF[6] ^ BUF[22];
|
1553 | this.v3h ^= BUF[7] ^ BUF[23];
|
1554 | this.v4l ^= BUF[8] ^ BUF[24];
|
1555 | this.v4h ^= BUF[9] ^ BUF[25];
|
1556 | this.v5l ^= BUF[10] ^ BUF[26];
|
1557 | this.v5h ^= BUF[11] ^ BUF[27];
|
1558 | this.v6l ^= BUF[12] ^ BUF[28];
|
1559 | this.v6h ^= BUF[13] ^ BUF[29];
|
1560 | this.v7l ^= BUF[14] ^ BUF[30];
|
1561 | this.v7h ^= BUF[15] ^ BUF[31];
|
1562 | BUF.fill(0);
|
1563 | }
|
1564 | destroy() {
|
1565 | this.destroyed = true;
|
1566 | this.buffer32.fill(0);
|
1567 | this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
1568 | }
|
1569 | }
|
1570 | const blake2b = wrapConstructorWithOpts((opts) => new BLAKE2b(opts));
|
1571 |
|
1572 | function createAsHex(fn) {
|
1573 | return (...args) => util.u8aToHex(fn(...args));
|
1574 | }
|
1575 | function createBitHasher(bitLength, fn) {
|
1576 | return (data, onlyJs) => fn(data, bitLength, onlyJs);
|
1577 | }
|
1578 | function createDualHasher(wa, js) {
|
1579 | return (value, bitLength = 256, onlyJs) => {
|
1580 | const u8a = util.u8aToU8a(value);
|
1581 | return !util.hasBigInt || (!onlyJs && isReady())
|
1582 | ? wa[bitLength](u8a)
|
1583 | : js[bitLength](u8a);
|
1584 | };
|
1585 | }
|
1586 |
|
1587 | function blake2AsU8a(data, bitLength = 256, key, onlyJs) {
|
1588 | const byteLength = Math.ceil(bitLength / 8);
|
1589 | const u8a = util.u8aToU8a(data);
|
1590 | return !util.hasBigInt || (!onlyJs && isReady())
|
1591 | ? blake2b$1(u8a, util.u8aToU8a(key), byteLength)
|
1592 | : key
|
1593 | ? blake2b(u8a, { dkLen: byteLength, key })
|
1594 | : blake2b(u8a, { dkLen: byteLength });
|
1595 | }
|
1596 | const blake2AsHex = createAsHex(blake2AsU8a);
|
1597 |
|
1598 | const SS58_PREFIX = util.stringToU8a('SS58PRE');
|
1599 | function sshash(key) {
|
1600 | return blake2AsU8a(util.u8aConcat(SS58_PREFIX, key), 512);
|
1601 | }
|
1602 |
|
1603 | function checkAddressChecksum(decoded) {
|
1604 | const ss58Length = (decoded[0] & 0b0100_0000) ? 2 : 1;
|
1605 | const ss58Decoded = ss58Length === 1
|
1606 | ? decoded[0]
|
1607 | : ((decoded[0] & 0b0011_1111) << 2) | (decoded[1] >> 6) | ((decoded[1] & 0b0011_1111) << 8);
|
1608 | const isPublicKey = [34 + ss58Length, 35 + ss58Length].includes(decoded.length);
|
1609 | const length = decoded.length - (isPublicKey ? 2 : 1);
|
1610 | const hash = sshash(decoded.subarray(0, length));
|
1611 | const isValid = (decoded[0] & 0b1000_0000) === 0 && ![46, 47].includes(decoded[0]) && (isPublicKey
|
1612 | ? decoded[decoded.length - 2] === hash[0] && decoded[decoded.length - 1] === hash[1]
|
1613 | : decoded[decoded.length - 1] === hash[0]);
|
1614 | return [isValid, length, ss58Length, ss58Decoded];
|
1615 | }
|
1616 |
|
1617 | const knownSubstrate = [
|
1618 | {
|
1619 | "prefix": 0,
|
1620 | "network": "polkadot",
|
1621 | "displayName": "Polkadot Relay Chain",
|
1622 | "symbols": [
|
1623 | "DOT"
|
1624 | ],
|
1625 | "decimals": [
|
1626 | 10
|
1627 | ],
|
1628 | "standardAccount": "*25519",
|
1629 | "website": "https://polkadot.network"
|
1630 | },
|
1631 | {
|
1632 | "prefix": 1,
|
1633 | "network": "BareSr25519",
|
1634 | "displayName": "Bare 32-bit Schnorr/Ristretto (S/R 25519) public key.",
|
1635 | "symbols": [],
|
1636 | "decimals": [],
|
1637 | "standardAccount": "Sr25519",
|
1638 | "website": null
|
1639 | },
|
1640 | {
|
1641 | "prefix": 2,
|
1642 | "network": "kusama",
|
1643 | "displayName": "Kusama Relay Chain",
|
1644 | "symbols": [
|
1645 | "KSM"
|
1646 | ],
|
1647 | "decimals": [
|
1648 | 12
|
1649 | ],
|
1650 | "standardAccount": "*25519",
|
1651 | "website": "https://kusama.network"
|
1652 | },
|
1653 | {
|
1654 | "prefix": 3,
|
1655 | "network": "BareEd25519",
|
1656 | "displayName": "Bare 32-bit Ed25519 public key.",
|
1657 | "symbols": [],
|
1658 | "decimals": [],
|
1659 | "standardAccount": "Ed25519",
|
1660 | "website": null
|
1661 | },
|
1662 | {
|
1663 | "prefix": 4,
|
1664 | "network": "katalchain",
|
1665 | "displayName": "Katal Chain",
|
1666 | "symbols": [],
|
1667 | "decimals": [],
|
1668 | "standardAccount": "*25519",
|
1669 | "website": null
|
1670 | },
|
1671 | {
|
1672 | "prefix": 5,
|
1673 | "network": "astar",
|
1674 | "displayName": "Astar Network",
|
1675 | "symbols": [
|
1676 | "ASTR"
|
1677 | ],
|
1678 | "decimals": [
|
1679 | 18
|
1680 | ],
|
1681 | "standardAccount": "*25519",
|
1682 | "website": "https://astar.network"
|
1683 | },
|
1684 | {
|
1685 | "prefix": 6,
|
1686 | "network": "bifrost",
|
1687 | "displayName": "Bifrost",
|
1688 | "symbols": [
|
1689 | "BNC"
|
1690 | ],
|
1691 | "decimals": [
|
1692 | 12
|
1693 | ],
|
1694 | "standardAccount": "*25519",
|
1695 | "website": "https://bifrost.finance/"
|
1696 | },
|
1697 | {
|
1698 | "prefix": 7,
|
1699 | "network": "edgeware",
|
1700 | "displayName": "Edgeware",
|
1701 | "symbols": [
|
1702 | "EDG"
|
1703 | ],
|
1704 | "decimals": [
|
1705 | 18
|
1706 | ],
|
1707 | "standardAccount": "*25519",
|
1708 | "website": "https://edgewa.re"
|
1709 | },
|
1710 | {
|
1711 | "prefix": 8,
|
1712 | "network": "karura",
|
1713 | "displayName": "Karura",
|
1714 | "symbols": [
|
1715 | "KAR"
|
1716 | ],
|
1717 | "decimals": [
|
1718 | 12
|
1719 | ],
|
1720 | "standardAccount": "*25519",
|
1721 | "website": "https://karura.network/"
|
1722 | },
|
1723 | {
|
1724 | "prefix": 9,
|
1725 | "network": "reynolds",
|
1726 | "displayName": "Laminar Reynolds Canary",
|
1727 | "symbols": [
|
1728 | "REY"
|
1729 | ],
|
1730 | "decimals": [
|
1731 | 18
|
1732 | ],
|
1733 | "standardAccount": "*25519",
|
1734 | "website": "http://laminar.network/"
|
1735 | },
|
1736 | {
|
1737 | "prefix": 10,
|
1738 | "network": "acala",
|
1739 | "displayName": "Acala",
|
1740 | "symbols": [
|
1741 | "ACA"
|
1742 | ],
|
1743 | "decimals": [
|
1744 | 12
|
1745 | ],
|
1746 | "standardAccount": "*25519",
|
1747 | "website": "https://acala.network/"
|
1748 | },
|
1749 | {
|
1750 | "prefix": 11,
|
1751 | "network": "laminar",
|
1752 | "displayName": "Laminar",
|
1753 | "symbols": [
|
1754 | "LAMI"
|
1755 | ],
|
1756 | "decimals": [
|
1757 | 18
|
1758 | ],
|
1759 | "standardAccount": "*25519",
|
1760 | "website": "http://laminar.network/"
|
1761 | },
|
1762 | {
|
1763 | "prefix": 12,
|
1764 | "network": "polymesh",
|
1765 | "displayName": "Polymesh",
|
1766 | "symbols": [
|
1767 | "POLYX"
|
1768 | ],
|
1769 | "decimals": [
|
1770 | 6
|
1771 | ],
|
1772 | "standardAccount": "*25519",
|
1773 | "website": "https://polymath.network/"
|
1774 | },
|
1775 | {
|
1776 | "prefix": 13,
|
1777 | "network": "integritee",
|
1778 | "displayName": "Integritee",
|
1779 | "symbols": [
|
1780 | "TEER"
|
1781 | ],
|
1782 | "decimals": [
|
1783 | 12
|
1784 | ],
|
1785 | "standardAccount": "*25519",
|
1786 | "website": "https://integritee.network"
|
1787 | },
|
1788 | {
|
1789 | "prefix": 14,
|
1790 | "network": "totem",
|
1791 | "displayName": "Totem",
|
1792 | "symbols": [
|
1793 | "TOTEM"
|
1794 | ],
|
1795 | "decimals": [
|
1796 | 0
|
1797 | ],
|
1798 | "standardAccount": "*25519",
|
1799 | "website": "https://totemaccounting.com"
|
1800 | },
|
1801 | {
|
1802 | "prefix": 15,
|
1803 | "network": "synesthesia",
|
1804 | "displayName": "Synesthesia",
|
1805 | "symbols": [
|
1806 | "SYN"
|
1807 | ],
|
1808 | "decimals": [
|
1809 | 12
|
1810 | ],
|
1811 | "standardAccount": "*25519",
|
1812 | "website": "https://synesthesia.network/"
|
1813 | },
|
1814 | {
|
1815 | "prefix": 16,
|
1816 | "network": "kulupu",
|
1817 | "displayName": "Kulupu",
|
1818 | "symbols": [
|
1819 | "KLP"
|
1820 | ],
|
1821 | "decimals": [
|
1822 | 12
|
1823 | ],
|
1824 | "standardAccount": "*25519",
|
1825 | "website": "https://kulupu.network/"
|
1826 | },
|
1827 | {
|
1828 | "prefix": 17,
|
1829 | "network": "dark",
|
1830 | "displayName": "Dark Mainnet",
|
1831 | "symbols": [],
|
1832 | "decimals": [],
|
1833 | "standardAccount": "*25519",
|
1834 | "website": null
|
1835 | },
|
1836 | {
|
1837 | "prefix": 18,
|
1838 | "network": "darwinia",
|
1839 | "displayName": "Darwinia Network",
|
1840 | "symbols": [
|
1841 | "RING"
|
1842 | ],
|
1843 | "decimals": [
|
1844 | 18
|
1845 | ],
|
1846 | "standardAccount": "secp256k1",
|
1847 | "website": "https://darwinia.network"
|
1848 | },
|
1849 | {
|
1850 | "prefix": 19,
|
1851 | "network": "watr",
|
1852 | "displayName": "Watr Protocol",
|
1853 | "symbols": [
|
1854 | "WATR"
|
1855 | ],
|
1856 | "decimals": [
|
1857 | 18
|
1858 | ],
|
1859 | "standardAccount": "*25519",
|
1860 | "website": "https://www.watr.org"
|
1861 | },
|
1862 | {
|
1863 | "prefix": 20,
|
1864 | "network": "stafi",
|
1865 | "displayName": "Stafi",
|
1866 | "symbols": [
|
1867 | "FIS"
|
1868 | ],
|
1869 | "decimals": [
|
1870 | 12
|
1871 | ],
|
1872 | "standardAccount": "*25519",
|
1873 | "website": "https://stafi.io"
|
1874 | },
|
1875 | {
|
1876 | "prefix": 21,
|
1877 | "network": "karmachain",
|
1878 | "displayName": "Karmacoin",
|
1879 | "symbols": [
|
1880 | "KCOIN"
|
1881 | ],
|
1882 | "decimals": [
|
1883 | 6
|
1884 | ],
|
1885 | "standardAccount": "*25519",
|
1886 | "website": "https://karmaco.in"
|
1887 | },
|
1888 | {
|
1889 | "prefix": 22,
|
1890 | "network": "dock-pos-mainnet",
|
1891 | "displayName": "Dock Mainnet",
|
1892 | "symbols": [
|
1893 | "DCK"
|
1894 | ],
|
1895 | "decimals": [
|
1896 | 6
|
1897 | ],
|
1898 | "standardAccount": "*25519",
|
1899 | "website": "https://dock.io"
|
1900 | },
|
1901 | {
|
1902 | "prefix": 23,
|
1903 | "network": "shift",
|
1904 | "displayName": "ShiftNrg",
|
1905 | "symbols": [],
|
1906 | "decimals": [],
|
1907 | "standardAccount": "*25519",
|
1908 | "website": null
|
1909 | },
|
1910 | {
|
1911 | "prefix": 24,
|
1912 | "network": "zero",
|
1913 | "displayName": "ZERO",
|
1914 | "symbols": [
|
1915 | "ZERO"
|
1916 | ],
|
1917 | "decimals": [
|
1918 | 18
|
1919 | ],
|
1920 | "standardAccount": "*25519",
|
1921 | "website": "https://zero.io"
|
1922 | },
|
1923 | {
|
1924 | "prefix": 25,
|
1925 | "network": "zero-alphaville",
|
1926 | "displayName": "ZERO Alphaville",
|
1927 | "symbols": [
|
1928 | "ZERO"
|
1929 | ],
|
1930 | "decimals": [
|
1931 | 18
|
1932 | ],
|
1933 | "standardAccount": "*25519",
|
1934 | "website": "https://zero.io"
|
1935 | },
|
1936 | {
|
1937 | "prefix": 26,
|
1938 | "network": "jupiter",
|
1939 | "displayName": "Jupiter",
|
1940 | "symbols": [
|
1941 | "jDOT"
|
1942 | ],
|
1943 | "decimals": [
|
1944 | 10
|
1945 | ],
|
1946 | "standardAccount": "*25519",
|
1947 | "website": "https://jupiter.patract.io"
|
1948 | },
|
1949 | {
|
1950 | "prefix": 27,
|
1951 | "network": "kabocha",
|
1952 | "displayName": "Kabocha",
|
1953 | "symbols": [
|
1954 | "KAB"
|
1955 | ],
|
1956 | "decimals": [
|
1957 | 12
|
1958 | ],
|
1959 | "standardAccount": "*25519",
|
1960 | "website": "https://kabocha.network"
|
1961 | },
|
1962 | {
|
1963 | "prefix": 28,
|
1964 | "network": "subsocial",
|
1965 | "displayName": "Subsocial",
|
1966 | "symbols": [],
|
1967 | "decimals": [],
|
1968 | "standardAccount": "*25519",
|
1969 | "website": null
|
1970 | },
|
1971 | {
|
1972 | "prefix": 29,
|
1973 | "network": "cord",
|
1974 | "displayName": "CORD Network",
|
1975 | "symbols": [
|
1976 | "DHI",
|
1977 | "WAY"
|
1978 | ],
|
1979 | "decimals": [
|
1980 | 12,
|
1981 | 12
|
1982 | ],
|
1983 | "standardAccount": "*25519",
|
1984 | "website": "https://cord.network/"
|
1985 | },
|
1986 | {
|
1987 | "prefix": 30,
|
1988 | "network": "phala",
|
1989 | "displayName": "Phala Network",
|
1990 | "symbols": [
|
1991 | "PHA"
|
1992 | ],
|
1993 | "decimals": [
|
1994 | 12
|
1995 | ],
|
1996 | "standardAccount": "*25519",
|
1997 | "website": "https://phala.network"
|
1998 | },
|
1999 | {
|
2000 | "prefix": 31,
|
2001 | "network": "litentry",
|
2002 | "displayName": "Litentry Network",
|
2003 | "symbols": [
|
2004 | "LIT"
|
2005 | ],
|
2006 | "decimals": [
|
2007 | 12
|
2008 | ],
|
2009 | "standardAccount": "*25519",
|
2010 | "website": "https://litentry.com/"
|
2011 | },
|
2012 | {
|
2013 | "prefix": 32,
|
2014 | "network": "robonomics",
|
2015 | "displayName": "Robonomics",
|
2016 | "symbols": [
|
2017 | "XRT"
|
2018 | ],
|
2019 | "decimals": [
|
2020 | 9
|
2021 | ],
|
2022 | "standardAccount": "*25519",
|
2023 | "website": "https://robonomics.network"
|
2024 | },
|
2025 | {
|
2026 | "prefix": 33,
|
2027 | "network": "datahighway",
|
2028 | "displayName": "DataHighway",
|
2029 | "symbols": [],
|
2030 | "decimals": [],
|
2031 | "standardAccount": "*25519",
|
2032 | "website": null
|
2033 | },
|
2034 | {
|
2035 | "prefix": 34,
|
2036 | "network": "ares",
|
2037 | "displayName": "Ares Protocol",
|
2038 | "symbols": [
|
2039 | "ARES"
|
2040 | ],
|
2041 | "decimals": [
|
2042 | 12
|
2043 | ],
|
2044 | "standardAccount": "*25519",
|
2045 | "website": "https://www.aresprotocol.com/"
|
2046 | },
|
2047 | {
|
2048 | "prefix": 35,
|
2049 | "network": "vln",
|
2050 | "displayName": "Valiu Liquidity Network",
|
2051 | "symbols": [
|
2052 | "USDv"
|
2053 | ],
|
2054 | "decimals": [
|
2055 | 15
|
2056 | ],
|
2057 | "standardAccount": "*25519",
|
2058 | "website": "https://valiu.com/"
|
2059 | },
|
2060 | {
|
2061 | "prefix": 36,
|
2062 | "network": "centrifuge",
|
2063 | "displayName": "Centrifuge Chain",
|
2064 | "symbols": [
|
2065 | "CFG"
|
2066 | ],
|
2067 | "decimals": [
|
2068 | 18
|
2069 | ],
|
2070 | "standardAccount": "*25519",
|
2071 | "website": "https://centrifuge.io/"
|
2072 | },
|
2073 | {
|
2074 | "prefix": 37,
|
2075 | "network": "nodle",
|
2076 | "displayName": "Nodle Chain",
|
2077 | "symbols": [
|
2078 | "NODL"
|
2079 | ],
|
2080 | "decimals": [
|
2081 | 11
|
2082 | ],
|
2083 | "standardAccount": "*25519",
|
2084 | "website": "https://nodle.io/"
|
2085 | },
|
2086 | {
|
2087 | "prefix": 38,
|
2088 | "network": "kilt",
|
2089 | "displayName": "KILT Spiritnet",
|
2090 | "symbols": [
|
2091 | "KILT"
|
2092 | ],
|
2093 | "decimals": [
|
2094 | 15
|
2095 | ],
|
2096 | "standardAccount": "*25519",
|
2097 | "website": "https://kilt.io/"
|
2098 | },
|
2099 | {
|
2100 | "prefix": 39,
|
2101 | "network": "mathchain",
|
2102 | "displayName": "MathChain mainnet",
|
2103 | "symbols": [
|
2104 | "MATH"
|
2105 | ],
|
2106 | "decimals": [
|
2107 | 18
|
2108 | ],
|
2109 | "standardAccount": "*25519",
|
2110 | "website": "https://mathwallet.org"
|
2111 | },
|
2112 | {
|
2113 | "prefix": 40,
|
2114 | "network": "mathchain-testnet",
|
2115 | "displayName": "MathChain testnet",
|
2116 | "symbols": [
|
2117 | "MATH"
|
2118 | ],
|
2119 | "decimals": [
|
2120 | 18
|
2121 | ],
|
2122 | "standardAccount": "*25519",
|
2123 | "website": "https://mathwallet.org"
|
2124 | },
|
2125 | {
|
2126 | "prefix": 41,
|
2127 | "network": "polimec",
|
2128 | "displayName": "Polimec Protocol",
|
2129 | "symbols": [
|
2130 | "PLMC"
|
2131 | ],
|
2132 | "decimals": [
|
2133 | 10
|
2134 | ],
|
2135 | "standardAccount": "*25519",
|
2136 | "website": "https://www.polimec.org/"
|
2137 | },
|
2138 | {
|
2139 | "prefix": 42,
|
2140 | "network": "substrate",
|
2141 | "displayName": "Substrate",
|
2142 | "symbols": [],
|
2143 | "decimals": [],
|
2144 | "standardAccount": "*25519",
|
2145 | "website": "https://substrate.io/"
|
2146 | },
|
2147 | {
|
2148 | "prefix": 43,
|
2149 | "network": "BareSecp256k1",
|
2150 | "displayName": "Bare 32-bit ECDSA SECP-256k1 public key.",
|
2151 | "symbols": [],
|
2152 | "decimals": [],
|
2153 | "standardAccount": "secp256k1",
|
2154 | "website": null
|
2155 | },
|
2156 | {
|
2157 | "prefix": 44,
|
2158 | "network": "chainx",
|
2159 | "displayName": "ChainX",
|
2160 | "symbols": [
|
2161 | "PCX"
|
2162 | ],
|
2163 | "decimals": [
|
2164 | 8
|
2165 | ],
|
2166 | "standardAccount": "*25519",
|
2167 | "website": "https://chainx.org/"
|
2168 | },
|
2169 | {
|
2170 | "prefix": 45,
|
2171 | "network": "uniarts",
|
2172 | "displayName": "UniArts Network",
|
2173 | "symbols": [
|
2174 | "UART",
|
2175 | "UINK"
|
2176 | ],
|
2177 | "decimals": [
|
2178 | 12,
|
2179 | 12
|
2180 | ],
|
2181 | "standardAccount": "*25519",
|
2182 | "website": "https://uniarts.me"
|
2183 | },
|
2184 | {
|
2185 | "prefix": 46,
|
2186 | "network": "reserved46",
|
2187 | "displayName": "This prefix is reserved.",
|
2188 | "symbols": [],
|
2189 | "decimals": [],
|
2190 | "standardAccount": null,
|
2191 | "website": null
|
2192 | },
|
2193 | {
|
2194 | "prefix": 47,
|
2195 | "network": "reserved47",
|
2196 | "displayName": "This prefix is reserved.",
|
2197 | "symbols": [],
|
2198 | "decimals": [],
|
2199 | "standardAccount": null,
|
2200 | "website": null
|
2201 | },
|
2202 | {
|
2203 | "prefix": 48,
|
2204 | "network": "neatcoin",
|
2205 | "displayName": "Neatcoin Mainnet",
|
2206 | "symbols": [
|
2207 | "NEAT"
|
2208 | ],
|
2209 | "decimals": [
|
2210 | 12
|
2211 | ],
|
2212 | "standardAccount": "*25519",
|
2213 | "website": "https://neatcoin.org"
|
2214 | },
|
2215 | {
|
2216 | "prefix": 49,
|
2217 | "network": "picasso",
|
2218 | "displayName": "Picasso",
|
2219 | "symbols": [
|
2220 | "PICA"
|
2221 | ],
|
2222 | "decimals": [
|
2223 | 12
|
2224 | ],
|
2225 | "standardAccount": "*25519",
|
2226 | "website": "https://picasso.composable.finance"
|
2227 | },
|
2228 | {
|
2229 | "prefix": 50,
|
2230 | "network": "composable",
|
2231 | "displayName": "Composable Finance",
|
2232 | "symbols": [
|
2233 | "LAYR"
|
2234 | ],
|
2235 | "decimals": [
|
2236 | 12
|
2237 | ],
|
2238 | "standardAccount": "*25519",
|
2239 | "website": "https://composable.finance"
|
2240 | },
|
2241 | {
|
2242 | "prefix": 51,
|
2243 | "network": "oak",
|
2244 | "displayName": "OAK Network",
|
2245 | "symbols": [
|
2246 | "OAK",
|
2247 | "TUR"
|
2248 | ],
|
2249 | "decimals": [
|
2250 | 10,
|
2251 | 10
|
2252 | ],
|
2253 | "standardAccount": "*25519",
|
2254 | "website": "https://oak.tech"
|
2255 | },
|
2256 | {
|
2257 | "prefix": 52,
|
2258 | "network": "KICO",
|
2259 | "displayName": "KICO",
|
2260 | "symbols": [
|
2261 | "KICO"
|
2262 | ],
|
2263 | "decimals": [
|
2264 | 14
|
2265 | ],
|
2266 | "standardAccount": "*25519",
|
2267 | "website": "https://dico.io"
|
2268 | },
|
2269 | {
|
2270 | "prefix": 53,
|
2271 | "network": "DICO",
|
2272 | "displayName": "DICO",
|
2273 | "symbols": [
|
2274 | "DICO"
|
2275 | ],
|
2276 | "decimals": [
|
2277 | 14
|
2278 | ],
|
2279 | "standardAccount": "*25519",
|
2280 | "website": "https://dico.io"
|
2281 | },
|
2282 | {
|
2283 | "prefix": 54,
|
2284 | "network": "cere",
|
2285 | "displayName": "Cere Network",
|
2286 | "symbols": [
|
2287 | "CERE"
|
2288 | ],
|
2289 | "decimals": [
|
2290 | 10
|
2291 | ],
|
2292 | "standardAccount": "*25519",
|
2293 | "website": "https://cere.network"
|
2294 | },
|
2295 | {
|
2296 | "prefix": 55,
|
2297 | "network": "xxnetwork",
|
2298 | "displayName": "xx network",
|
2299 | "symbols": [
|
2300 | "XX"
|
2301 | ],
|
2302 | "decimals": [
|
2303 | 9
|
2304 | ],
|
2305 | "standardAccount": "*25519",
|
2306 | "website": "https://xx.network"
|
2307 | },
|
2308 | {
|
2309 | "prefix": 56,
|
2310 | "network": "pendulum",
|
2311 | "displayName": "Pendulum chain",
|
2312 | "symbols": [
|
2313 | "PEN"
|
2314 | ],
|
2315 | "decimals": [
|
2316 | 12
|
2317 | ],
|
2318 | "standardAccount": "*25519",
|
2319 | "website": "https://pendulumchain.org/"
|
2320 | },
|
2321 | {
|
2322 | "prefix": 57,
|
2323 | "network": "amplitude",
|
2324 | "displayName": "Amplitude chain",
|
2325 | "symbols": [
|
2326 | "AMPE"
|
2327 | ],
|
2328 | "decimals": [
|
2329 | 12
|
2330 | ],
|
2331 | "standardAccount": "*25519",
|
2332 | "website": "https://pendulumchain.org/"
|
2333 | },
|
2334 | {
|
2335 | "prefix": 58,
|
2336 | "network": "eternal-civilization",
|
2337 | "displayName": "Eternal Civilization",
|
2338 | "symbols": [
|
2339 | "ECC"
|
2340 | ],
|
2341 | "decimals": [
|
2342 | 12
|
2343 | ],
|
2344 | "standardAccount": "*25519",
|
2345 | "website": "http://www.ysknfr.cn/"
|
2346 | },
|
2347 | {
|
2348 | "prefix": 63,
|
2349 | "network": "hydradx",
|
2350 | "displayName": "Hydration",
|
2351 | "symbols": [
|
2352 | "HDX"
|
2353 | ],
|
2354 | "decimals": [
|
2355 | 12
|
2356 | ],
|
2357 | "standardAccount": "*25519",
|
2358 | "website": "https://hydration.net"
|
2359 | },
|
2360 | {
|
2361 | "prefix": 65,
|
2362 | "network": "aventus",
|
2363 | "displayName": "Aventus Mainnet",
|
2364 | "symbols": [
|
2365 | "AVT"
|
2366 | ],
|
2367 | "decimals": [
|
2368 | 18
|
2369 | ],
|
2370 | "standardAccount": "*25519",
|
2371 | "website": "https://aventus.io"
|
2372 | },
|
2373 | {
|
2374 | "prefix": 66,
|
2375 | "network": "crust",
|
2376 | "displayName": "Crust Network",
|
2377 | "symbols": [
|
2378 | "CRU"
|
2379 | ],
|
2380 | "decimals": [
|
2381 | 12
|
2382 | ],
|
2383 | "standardAccount": "*25519",
|
2384 | "website": "https://crust.network"
|
2385 | },
|
2386 | {
|
2387 | "prefix": 67,
|
2388 | "network": "genshiro",
|
2389 | "displayName": "Genshiro Network",
|
2390 | "symbols": [
|
2391 | "GENS",
|
2392 | "EQD",
|
2393 | "LPT0"
|
2394 | ],
|
2395 | "decimals": [
|
2396 | 9,
|
2397 | 9,
|
2398 | 9
|
2399 | ],
|
2400 | "standardAccount": "*25519",
|
2401 | "website": "https://genshiro.equilibrium.io"
|
2402 | },
|
2403 | {
|
2404 | "prefix": 68,
|
2405 | "network": "equilibrium",
|
2406 | "displayName": "Equilibrium Network",
|
2407 | "symbols": [
|
2408 | "EQ"
|
2409 | ],
|
2410 | "decimals": [
|
2411 | 9
|
2412 | ],
|
2413 | "standardAccount": "*25519",
|
2414 | "website": "https://equilibrium.io"
|
2415 | },
|
2416 | {
|
2417 | "prefix": 69,
|
2418 | "network": "sora",
|
2419 | "displayName": "SORA Network",
|
2420 | "symbols": [
|
2421 | "XOR"
|
2422 | ],
|
2423 | "decimals": [
|
2424 | 18
|
2425 | ],
|
2426 | "standardAccount": "*25519",
|
2427 | "website": "https://sora.org"
|
2428 | },
|
2429 | {
|
2430 | "prefix": 71,
|
2431 | "network": "p3d",
|
2432 | "displayName": "3DP network",
|
2433 | "symbols": [
|
2434 | "P3D"
|
2435 | ],
|
2436 | "decimals": [
|
2437 | 12
|
2438 | ],
|
2439 | "standardAccount": "*25519",
|
2440 | "website": "https://3dpass.org"
|
2441 | },
|
2442 | {
|
2443 | "prefix": 72,
|
2444 | "network": "p3dt",
|
2445 | "displayName": "3DP test network",
|
2446 | "symbols": [
|
2447 | "P3Dt"
|
2448 | ],
|
2449 | "decimals": [
|
2450 | 12
|
2451 | ],
|
2452 | "standardAccount": "*25519",
|
2453 | "website": "https://3dpass.org"
|
2454 | },
|
2455 | {
|
2456 | "prefix": 73,
|
2457 | "network": "zeitgeist",
|
2458 | "displayName": "Zeitgeist",
|
2459 | "symbols": [
|
2460 | "ZTG"
|
2461 | ],
|
2462 | "decimals": [
|
2463 | 10
|
2464 | ],
|
2465 | "standardAccount": "*25519",
|
2466 | "website": "https://zeitgeist.pm"
|
2467 | },
|
2468 | {
|
2469 | "prefix": 77,
|
2470 | "network": "manta",
|
2471 | "displayName": "Manta network",
|
2472 | "symbols": [
|
2473 | "MANTA"
|
2474 | ],
|
2475 | "decimals": [
|
2476 | 18
|
2477 | ],
|
2478 | "standardAccount": "*25519",
|
2479 | "website": "https://manta.network"
|
2480 | },
|
2481 | {
|
2482 | "prefix": 78,
|
2483 | "network": "calamari",
|
2484 | "displayName": "Calamari: Manta Canary Network",
|
2485 | "symbols": [
|
2486 | "KMA"
|
2487 | ],
|
2488 | "decimals": [
|
2489 | 12
|
2490 | ],
|
2491 | "standardAccount": "*25519",
|
2492 | "website": "https://manta.network"
|
2493 | },
|
2494 | {
|
2495 | "prefix": 81,
|
2496 | "network": "sora_dot_para",
|
2497 | "displayName": "SORA Polkadot Parachain",
|
2498 | "symbols": [
|
2499 | "XOR"
|
2500 | ],
|
2501 | "decimals": [
|
2502 | 18
|
2503 | ],
|
2504 | "standardAccount": "*25519",
|
2505 | "website": "https://sora.org"
|
2506 | },
|
2507 | {
|
2508 | "prefix": 88,
|
2509 | "network": "polkadex",
|
2510 | "displayName": "Polkadex Mainnet",
|
2511 | "symbols": [
|
2512 | "PDEX"
|
2513 | ],
|
2514 | "decimals": [
|
2515 | 12
|
2516 | ],
|
2517 | "standardAccount": "*25519",
|
2518 | "website": "https://polkadex.trade"
|
2519 | },
|
2520 | {
|
2521 | "prefix": 89,
|
2522 | "network": "polkadexparachain",
|
2523 | "displayName": "Polkadex Parachain",
|
2524 | "symbols": [
|
2525 | "PDEX"
|
2526 | ],
|
2527 | "decimals": [
|
2528 | 12
|
2529 | ],
|
2530 | "standardAccount": "*25519",
|
2531 | "website": "https://polkadex.trade"
|
2532 | },
|
2533 | {
|
2534 | "prefix": 90,
|
2535 | "network": "frequency",
|
2536 | "displayName": "Frequency",
|
2537 | "symbols": [
|
2538 | "FRQCY"
|
2539 | ],
|
2540 | "decimals": [
|
2541 | 8
|
2542 | ],
|
2543 | "standardAccount": "*25519",
|
2544 | "website": "https://www.frequency.xyz"
|
2545 | },
|
2546 | {
|
2547 | "prefix": 92,
|
2548 | "network": "anmol",
|
2549 | "displayName": "Anmol Network",
|
2550 | "symbols": [
|
2551 | "ANML"
|
2552 | ],
|
2553 | "decimals": [
|
2554 | 18
|
2555 | ],
|
2556 | "standardAccount": "*25519",
|
2557 | "website": "https://anmol.network/"
|
2558 | },
|
2559 | {
|
2560 | "prefix": 93,
|
2561 | "network": "fragnova",
|
2562 | "displayName": "Fragnova Network",
|
2563 | "symbols": [
|
2564 | "NOVA"
|
2565 | ],
|
2566 | "decimals": [
|
2567 | 12
|
2568 | ],
|
2569 | "standardAccount": "*25519",
|
2570 | "website": "https://fragnova.com"
|
2571 | },
|
2572 | {
|
2573 | "prefix": 98,
|
2574 | "network": "polkasmith",
|
2575 | "displayName": "PolkaSmith Canary Network",
|
2576 | "symbols": [
|
2577 | "PKS"
|
2578 | ],
|
2579 | "decimals": [
|
2580 | 18
|
2581 | ],
|
2582 | "standardAccount": "*25519",
|
2583 | "website": "https://polkafoundry.com"
|
2584 | },
|
2585 | {
|
2586 | "prefix": 99,
|
2587 | "network": "polkafoundry",
|
2588 | "displayName": "PolkaFoundry Network",
|
2589 | "symbols": [
|
2590 | "PKF"
|
2591 | ],
|
2592 | "decimals": [
|
2593 | 18
|
2594 | ],
|
2595 | "standardAccount": "*25519",
|
2596 | "website": "https://polkafoundry.com"
|
2597 | },
|
2598 | {
|
2599 | "prefix": 100,
|
2600 | "network": "ibtida",
|
2601 | "displayName": "Anmol Network Ibtida Canary network",
|
2602 | "symbols": [
|
2603 | "IANML"
|
2604 | ],
|
2605 | "decimals": [
|
2606 | 18
|
2607 | ],
|
2608 | "standardAccount": "*25519",
|
2609 | "website": "https://anmol.network/"
|
2610 | },
|
2611 | {
|
2612 | "prefix": 101,
|
2613 | "network": "origintrail-parachain",
|
2614 | "displayName": "OriginTrail Parachain",
|
2615 | "symbols": [
|
2616 | "OTP"
|
2617 | ],
|
2618 | "decimals": [
|
2619 | 12
|
2620 | ],
|
2621 | "standardAccount": "*25519",
|
2622 | "website": "https://parachain.origintrail.io/"
|
2623 | },
|
2624 | {
|
2625 | "prefix": 105,
|
2626 | "network": "pontem-network",
|
2627 | "displayName": "Pontem Network",
|
2628 | "symbols": [
|
2629 | "PONT"
|
2630 | ],
|
2631 | "decimals": [
|
2632 | 10
|
2633 | ],
|
2634 | "standardAccount": "*25519",
|
2635 | "website": "https://pontem.network"
|
2636 | },
|
2637 | {
|
2638 | "prefix": 110,
|
2639 | "network": "heiko",
|
2640 | "displayName": "Heiko",
|
2641 | "symbols": [
|
2642 | "HKO"
|
2643 | ],
|
2644 | "decimals": [
|
2645 | 12
|
2646 | ],
|
2647 | "standardAccount": "*25519",
|
2648 | "website": "https://parallel.fi/"
|
2649 | },
|
2650 | {
|
2651 | "prefix": 113,
|
2652 | "network": "integritee-incognito",
|
2653 | "displayName": "Integritee Incognito",
|
2654 | "symbols": [],
|
2655 | "decimals": [],
|
2656 | "standardAccount": "*25519",
|
2657 | "website": "https://integritee.network"
|
2658 | },
|
2659 | {
|
2660 | "prefix": 117,
|
2661 | "network": "tinker",
|
2662 | "displayName": "Tinker",
|
2663 | "symbols": [
|
2664 | "TNKR"
|
2665 | ],
|
2666 | "decimals": [
|
2667 | 12
|
2668 | ],
|
2669 | "standardAccount": "*25519",
|
2670 | "website": "https://invarch.network"
|
2671 | },
|
2672 | {
|
2673 | "prefix": 126,
|
2674 | "network": "joystream",
|
2675 | "displayName": "Joystream",
|
2676 | "symbols": [
|
2677 | "JOY"
|
2678 | ],
|
2679 | "decimals": [
|
2680 | 10
|
2681 | ],
|
2682 | "standardAccount": "*25519",
|
2683 | "website": "https://www.joystream.org"
|
2684 | },
|
2685 | {
|
2686 | "prefix": 128,
|
2687 | "network": "clover",
|
2688 | "displayName": "Clover Finance",
|
2689 | "symbols": [
|
2690 | "CLV"
|
2691 | ],
|
2692 | "decimals": [
|
2693 | 18
|
2694 | ],
|
2695 | "standardAccount": "*25519",
|
2696 | "website": "https://clover.finance"
|
2697 | },
|
2698 | {
|
2699 | "prefix": 129,
|
2700 | "network": "dorafactory-polkadot",
|
2701 | "displayName": "Dorafactory Polkadot Network",
|
2702 | "symbols": [
|
2703 | "DORA"
|
2704 | ],
|
2705 | "decimals": [
|
2706 | 12
|
2707 | ],
|
2708 | "standardAccount": "*25519",
|
2709 | "website": "https://dorafactory.org"
|
2710 | },
|
2711 | {
|
2712 | "prefix": 131,
|
2713 | "network": "litmus",
|
2714 | "displayName": "Litmus Network",
|
2715 | "symbols": [
|
2716 | "LIT"
|
2717 | ],
|
2718 | "decimals": [
|
2719 | 12
|
2720 | ],
|
2721 | "standardAccount": "*25519",
|
2722 | "website": "https://litentry.com/"
|
2723 | },
|
2724 | {
|
2725 | "prefix": 136,
|
2726 | "network": "altair",
|
2727 | "displayName": "Altair",
|
2728 | "symbols": [
|
2729 | "AIR"
|
2730 | ],
|
2731 | "decimals": [
|
2732 | 18
|
2733 | ],
|
2734 | "standardAccount": "*25519",
|
2735 | "website": "https://centrifuge.io/"
|
2736 | },
|
2737 | {
|
2738 | "prefix": 137,
|
2739 | "network": "vara",
|
2740 | "displayName": "Vara Network",
|
2741 | "symbols": [
|
2742 | "VARA"
|
2743 | ],
|
2744 | "decimals": [
|
2745 | 12
|
2746 | ],
|
2747 | "standardAccount": "*25519",
|
2748 | "website": "https://vara.network/"
|
2749 | },
|
2750 | {
|
2751 | "prefix": 172,
|
2752 | "network": "parallel",
|
2753 | "displayName": "Parallel",
|
2754 | "symbols": [
|
2755 | "PARA"
|
2756 | ],
|
2757 | "decimals": [
|
2758 | 12
|
2759 | ],
|
2760 | "standardAccount": "*25519",
|
2761 | "website": "https://parallel.fi/"
|
2762 | },
|
2763 | {
|
2764 | "prefix": 252,
|
2765 | "network": "social-network",
|
2766 | "displayName": "Social Network",
|
2767 | "symbols": [
|
2768 | "NET"
|
2769 | ],
|
2770 | "decimals": [
|
2771 | 18
|
2772 | ],
|
2773 | "standardAccount": "*25519",
|
2774 | "website": "https://social.network"
|
2775 | },
|
2776 | {
|
2777 | "prefix": 255,
|
2778 | "network": "quartz_mainnet",
|
2779 | "displayName": "QUARTZ by UNIQUE",
|
2780 | "symbols": [
|
2781 | "QTZ"
|
2782 | ],
|
2783 | "decimals": [
|
2784 | 18
|
2785 | ],
|
2786 | "standardAccount": "*25519",
|
2787 | "website": "https://unique.network"
|
2788 | },
|
2789 | {
|
2790 | "prefix": 268,
|
2791 | "network": "pioneer_network",
|
2792 | "displayName": "Pioneer Network by Bit.Country",
|
2793 | "symbols": [
|
2794 | "NEER"
|
2795 | ],
|
2796 | "decimals": [
|
2797 | 18
|
2798 | ],
|
2799 | "standardAccount": "*25519",
|
2800 | "website": "https://bit.country"
|
2801 | },
|
2802 | {
|
2803 | "prefix": 420,
|
2804 | "network": "sora_kusama_para",
|
2805 | "displayName": "SORA Kusama Parachain",
|
2806 | "symbols": [
|
2807 | "XOR"
|
2808 | ],
|
2809 | "decimals": [
|
2810 | 18
|
2811 | ],
|
2812 | "standardAccount": "*25519",
|
2813 | "website": "https://sora.org"
|
2814 | },
|
2815 | {
|
2816 | "prefix": 440,
|
2817 | "network": "allfeat_network",
|
2818 | "displayName": "Allfeat Network",
|
2819 | "symbols": [
|
2820 | "AFT"
|
2821 | ],
|
2822 | "decimals": [
|
2823 | 12
|
2824 | ],
|
2825 | "standardAccount": "*25519",
|
2826 | "website": "https://allfeat.network"
|
2827 | },
|
2828 | {
|
2829 | "prefix": 666,
|
2830 | "network": "metaquity_network",
|
2831 | "displayName": "Metaquity Network",
|
2832 | "symbols": [
|
2833 | "MQTY"
|
2834 | ],
|
2835 | "decimals": [
|
2836 | 18
|
2837 | ],
|
2838 | "standardAccount": "*25519",
|
2839 | "website": "https://metaquity.xyz/"
|
2840 | },
|
2841 | {
|
2842 | "prefix": 777,
|
2843 | "network": "curio",
|
2844 | "displayName": "Curio",
|
2845 | "symbols": [
|
2846 | "CGT"
|
2847 | ],
|
2848 | "decimals": [
|
2849 | 18
|
2850 | ],
|
2851 | "standardAccount": "*25519",
|
2852 | "website": "https://parachain.capitaldex.exchange/"
|
2853 | },
|
2854 | {
|
2855 | "prefix": 789,
|
2856 | "network": "geek",
|
2857 | "displayName": "GEEK Network",
|
2858 | "symbols": [
|
2859 | "GEEK"
|
2860 | ],
|
2861 | "decimals": [
|
2862 | 18
|
2863 | ],
|
2864 | "standardAccount": "*25519",
|
2865 | "website": "https://geek.gl"
|
2866 | },
|
2867 | {
|
2868 | "prefix": 995,
|
2869 | "network": "ternoa",
|
2870 | "displayName": "Ternoa",
|
2871 | "symbols": [
|
2872 | "CAPS"
|
2873 | ],
|
2874 | "decimals": [
|
2875 | 18
|
2876 | ],
|
2877 | "standardAccount": "*25519",
|
2878 | "website": "https://www.ternoa.network"
|
2879 | },
|
2880 | {
|
2881 | "prefix": 1110,
|
2882 | "network": "efinity",
|
2883 | "displayName": "Efinity",
|
2884 | "symbols": [
|
2885 | "EFI"
|
2886 | ],
|
2887 | "decimals": [
|
2888 | 18
|
2889 | ],
|
2890 | "standardAccount": "*25519",
|
2891 | "website": "https://efinity.io/"
|
2892 | },
|
2893 | {
|
2894 | "prefix": 1221,
|
2895 | "network": "peaq",
|
2896 | "displayName": "Peaq Network",
|
2897 | "symbols": [
|
2898 | "PEAQ"
|
2899 | ],
|
2900 | "decimals": [
|
2901 | 18
|
2902 | ],
|
2903 | "standardAccount": "Sr25519",
|
2904 | "website": "https://www.peaq.network/"
|
2905 | },
|
2906 | {
|
2907 | "prefix": 1222,
|
2908 | "network": "krest",
|
2909 | "displayName": "Krest Network",
|
2910 | "symbols": [
|
2911 | "KREST"
|
2912 | ],
|
2913 | "decimals": [
|
2914 | 18
|
2915 | ],
|
2916 | "standardAccount": "Sr25519",
|
2917 | "website": "https://www.peaq.network/"
|
2918 | },
|
2919 | {
|
2920 | "prefix": 1284,
|
2921 | "network": "moonbeam",
|
2922 | "displayName": "Moonbeam",
|
2923 | "symbols": [
|
2924 | "GLMR"
|
2925 | ],
|
2926 | "decimals": [
|
2927 | 18
|
2928 | ],
|
2929 | "standardAccount": "secp256k1",
|
2930 | "website": "https://moonbeam.network"
|
2931 | },
|
2932 | {
|
2933 | "prefix": 1285,
|
2934 | "network": "moonriver",
|
2935 | "displayName": "Moonriver",
|
2936 | "symbols": [
|
2937 | "MOVR"
|
2938 | ],
|
2939 | "decimals": [
|
2940 | 18
|
2941 | ],
|
2942 | "standardAccount": "secp256k1",
|
2943 | "website": "https://moonbeam.network"
|
2944 | },
|
2945 | {
|
2946 | "prefix": 1328,
|
2947 | "network": "ajuna",
|
2948 | "displayName": "Ajuna Network",
|
2949 | "symbols": [
|
2950 | "AJUN"
|
2951 | ],
|
2952 | "decimals": [
|
2953 | 12
|
2954 | ],
|
2955 | "standardAccount": "*25519",
|
2956 | "website": "https://ajuna.io"
|
2957 | },
|
2958 | {
|
2959 | "prefix": 1337,
|
2960 | "network": "bajun",
|
2961 | "displayName": "Bajun Network",
|
2962 | "symbols": [
|
2963 | "BAJU"
|
2964 | ],
|
2965 | "decimals": [
|
2966 | 12
|
2967 | ],
|
2968 | "standardAccount": "*25519",
|
2969 | "website": "https://ajuna.io"
|
2970 | },
|
2971 | {
|
2972 | "prefix": 1516,
|
2973 | "network": "societal",
|
2974 | "displayName": "Societal",
|
2975 | "symbols": [
|
2976 | "SCTL"
|
2977 | ],
|
2978 | "decimals": [
|
2979 | 12
|
2980 | ],
|
2981 | "standardAccount": "*25519",
|
2982 | "website": "https://www.sctl.xyz"
|
2983 | },
|
2984 | {
|
2985 | "prefix": 1985,
|
2986 | "network": "seals",
|
2987 | "displayName": "Seals Network",
|
2988 | "symbols": [
|
2989 | "SEAL"
|
2990 | ],
|
2991 | "decimals": [
|
2992 | 9
|
2993 | ],
|
2994 | "standardAccount": "*25519",
|
2995 | "website": "https://seals.app"
|
2996 | },
|
2997 | {
|
2998 | "prefix": 2007,
|
2999 | "network": "kapex",
|
3000 | "displayName": "Kapex",
|
3001 | "symbols": [
|
3002 | "KAPEX"
|
3003 | ],
|
3004 | "decimals": [
|
3005 | 12
|
3006 | ],
|
3007 | "standardAccount": "*25519",
|
3008 | "website": "https://totemaccounting.com"
|
3009 | },
|
3010 | {
|
3011 | "prefix": 2009,
|
3012 | "network": "cloudwalk_mainnet",
|
3013 | "displayName": "CloudWalk Network Mainnet",
|
3014 | "symbols": [
|
3015 | "CWN"
|
3016 | ],
|
3017 | "decimals": [
|
3018 | 18
|
3019 | ],
|
3020 | "standardAccount": "*25519",
|
3021 | "website": "https://explorer.mainnet.cloudwalk.io"
|
3022 | },
|
3023 | {
|
3024 | "prefix": 2021,
|
3025 | "network": "logion",
|
3026 | "displayName": "logion network",
|
3027 | "symbols": [
|
3028 | "LGNT"
|
3029 | ],
|
3030 | "decimals": [
|
3031 | 18
|
3032 | ],
|
3033 | "standardAccount": "*25519",
|
3034 | "website": "https://logion.network"
|
3035 | },
|
3036 | {
|
3037 | "prefix": 2024,
|
3038 | "network": "vow-chain",
|
3039 | "displayName": "Enigmatic Smile",
|
3040 | "symbols": [
|
3041 | "VOW"
|
3042 | ],
|
3043 | "decimals": [
|
3044 | 18
|
3045 | ],
|
3046 | "standardAccount": "*25519",
|
3047 | "website": "https://www.vow.foundation/"
|
3048 | },
|
3049 | {
|
3050 | "prefix": 2032,
|
3051 | "network": "interlay",
|
3052 | "displayName": "Interlay",
|
3053 | "symbols": [
|
3054 | "INTR"
|
3055 | ],
|
3056 | "decimals": [
|
3057 | 10
|
3058 | ],
|
3059 | "standardAccount": "*25519",
|
3060 | "website": "https://interlay.io/"
|
3061 | },
|
3062 | {
|
3063 | "prefix": 2092,
|
3064 | "network": "kintsugi",
|
3065 | "displayName": "Kintsugi",
|
3066 | "symbols": [
|
3067 | "KINT"
|
3068 | ],
|
3069 | "decimals": [
|
3070 | 12
|
3071 | ],
|
3072 | "standardAccount": "*25519",
|
3073 | "website": "https://interlay.io/"
|
3074 | },
|
3075 | {
|
3076 | "prefix": 2106,
|
3077 | "network": "bitgreen",
|
3078 | "displayName": "Bitgreen",
|
3079 | "symbols": [
|
3080 | "BBB"
|
3081 | ],
|
3082 | "decimals": [
|
3083 | 18
|
3084 | ],
|
3085 | "standardAccount": "*25519",
|
3086 | "website": "https://bitgreen.org/"
|
3087 | },
|
3088 | {
|
3089 | "prefix": 2112,
|
3090 | "network": "chainflip",
|
3091 | "displayName": "Chainflip",
|
3092 | "symbols": [
|
3093 | "FLIP"
|
3094 | ],
|
3095 | "decimals": [
|
3096 | 18
|
3097 | ],
|
3098 | "standardAccount": "*25519",
|
3099 | "website": "https://chainflip.io/"
|
3100 | },
|
3101 | {
|
3102 | "prefix": 2199,
|
3103 | "network": "moonsama",
|
3104 | "displayName": "Moonsama",
|
3105 | "symbols": [
|
3106 | "SAMA"
|
3107 | ],
|
3108 | "decimals": [
|
3109 | 18
|
3110 | ],
|
3111 | "standardAccount": "secp256k1",
|
3112 | "website": "https://moonsama.com"
|
3113 | },
|
3114 | {
|
3115 | "prefix": 2206,
|
3116 | "network": "ICE",
|
3117 | "displayName": "ICE Network",
|
3118 | "symbols": [
|
3119 | "ICY"
|
3120 | ],
|
3121 | "decimals": [
|
3122 | 18
|
3123 | ],
|
3124 | "standardAccount": "*25519",
|
3125 | "website": "https://icenetwork.io"
|
3126 | },
|
3127 | {
|
3128 | "prefix": 2207,
|
3129 | "network": "SNOW",
|
3130 | "displayName": "SNOW: ICE Canary Network",
|
3131 | "symbols": [
|
3132 | "ICZ"
|
3133 | ],
|
3134 | "decimals": [
|
3135 | 18
|
3136 | ],
|
3137 | "standardAccount": "*25519",
|
3138 | "website": "https://icenetwork.io"
|
3139 | },
|
3140 | {
|
3141 | "prefix": 2254,
|
3142 | "network": "subspace_testnet",
|
3143 | "displayName": "Subspace testnet",
|
3144 | "symbols": [
|
3145 | "tSSC"
|
3146 | ],
|
3147 | "decimals": [
|
3148 | 18
|
3149 | ],
|
3150 | "standardAccount": "*25519",
|
3151 | "website": "https://subspace.network"
|
3152 | },
|
3153 | {
|
3154 | "prefix": 3333,
|
3155 | "network": "peerplays",
|
3156 | "displayName": "Peerplays",
|
3157 | "symbols": [
|
3158 | "PPY"
|
3159 | ],
|
3160 | "decimals": [
|
3161 | 18
|
3162 | ],
|
3163 | "standardAccount": "secp256k1",
|
3164 | "website": "https://www.peerplays.com/"
|
3165 | },
|
3166 | {
|
3167 | "prefix": 4450,
|
3168 | "network": "g1",
|
3169 | "displayName": "Ğ1",
|
3170 | "symbols": [
|
3171 | "G1"
|
3172 | ],
|
3173 | "decimals": [
|
3174 | 2
|
3175 | ],
|
3176 | "standardAccount": "*25519",
|
3177 | "website": "https://duniter.org"
|
3178 | },
|
3179 | {
|
3180 | "prefix": 5234,
|
3181 | "network": "humanode",
|
3182 | "displayName": "Humanode Network",
|
3183 | "symbols": [
|
3184 | "HMND"
|
3185 | ],
|
3186 | "decimals": [
|
3187 | 18
|
3188 | ],
|
3189 | "standardAccount": "*25519",
|
3190 | "website": "https://humanode.io"
|
3191 | },
|
3192 | {
|
3193 | "prefix": 5845,
|
3194 | "network": "tangle",
|
3195 | "displayName": "Tangle Network",
|
3196 | "symbols": [
|
3197 | "TNT"
|
3198 | ],
|
3199 | "decimals": [
|
3200 | 18
|
3201 | ],
|
3202 | "standardAccount": "*25519",
|
3203 | "website": "https://www.tangle.tools/"
|
3204 | },
|
3205 | {
|
3206 | "prefix": 6094,
|
3207 | "network": "autonomys",
|
3208 | "displayName": "Autonomys",
|
3209 | "symbols": [
|
3210 | "AI3"
|
3211 | ],
|
3212 | "decimals": [
|
3213 | 18
|
3214 | ],
|
3215 | "standardAccount": "*25519",
|
3216 | "website": "https://autonomys.xyz"
|
3217 | },
|
3218 | {
|
3219 | "prefix": 7007,
|
3220 | "network": "tidefi",
|
3221 | "displayName": "Tidefi",
|
3222 | "symbols": [
|
3223 | "TDFY"
|
3224 | ],
|
3225 | "decimals": [
|
3226 | 12
|
3227 | ],
|
3228 | "standardAccount": "*25519",
|
3229 | "website": "https://tidefi.com"
|
3230 | },
|
3231 | {
|
3232 | "prefix": 7013,
|
3233 | "network": "gm",
|
3234 | "displayName": "GM",
|
3235 | "symbols": [
|
3236 | "FREN",
|
3237 | "GM",
|
3238 | "GN"
|
3239 | ],
|
3240 | "decimals": [
|
3241 | 12,
|
3242 | 0,
|
3243 | 0
|
3244 | ],
|
3245 | "standardAccount": "*25519",
|
3246 | "website": "https://gmordie.com"
|
3247 | },
|
3248 | {
|
3249 | "prefix": 7306,
|
3250 | "network": "krigan",
|
3251 | "displayName": "Krigan Network",
|
3252 | "symbols": [
|
3253 | "KRGN"
|
3254 | ],
|
3255 | "decimals": [
|
3256 | 9
|
3257 | ],
|
3258 | "standardAccount": "*25519",
|
3259 | "website": "https://krigan.network"
|
3260 | },
|
3261 | {
|
3262 | "prefix": 7391,
|
3263 | "network": "unique_mainnet",
|
3264 | "displayName": "Unique Network",
|
3265 | "symbols": [
|
3266 | "UNQ"
|
3267 | ],
|
3268 | "decimals": [
|
3269 | 18
|
3270 | ],
|
3271 | "standardAccount": "*25519",
|
3272 | "website": "https://unique.network"
|
3273 | },
|
3274 | {
|
3275 | "prefix": 8866,
|
3276 | "network": "golden_gate",
|
3277 | "displayName": "Golden Gate",
|
3278 | "symbols": [
|
3279 | "GGX"
|
3280 | ],
|
3281 | "decimals": [
|
3282 | 18
|
3283 | ],
|
3284 | "standardAccount": "*25519",
|
3285 | "website": "https://ggxchain.io/"
|
3286 | },
|
3287 | {
|
3288 | "prefix": 8883,
|
3289 | "network": "sapphire_mainnet",
|
3290 | "displayName": "Sapphire by Unique",
|
3291 | "symbols": [
|
3292 | "QTZ"
|
3293 | ],
|
3294 | "decimals": [
|
3295 | 18
|
3296 | ],
|
3297 | "standardAccount": "*25519",
|
3298 | "website": "https://unique.network"
|
3299 | },
|
3300 | {
|
3301 | "prefix": 8886,
|
3302 | "network": "golden_gate_sydney",
|
3303 | "displayName": "Golden Gate Sydney",
|
3304 | "symbols": [
|
3305 | "GGXT"
|
3306 | ],
|
3307 | "decimals": [
|
3308 | 18
|
3309 | ],
|
3310 | "standardAccount": "*25519",
|
3311 | "website": "https://ggxchain.io/"
|
3312 | },
|
3313 | {
|
3314 | "prefix": 9072,
|
3315 | "network": "hashed",
|
3316 | "displayName": "Hashed Network",
|
3317 | "symbols": [
|
3318 | "HASH"
|
3319 | ],
|
3320 | "decimals": [
|
3321 | 18
|
3322 | ],
|
3323 | "standardAccount": "*25519",
|
3324 | "website": "https://hashed.network"
|
3325 | },
|
3326 | {
|
3327 | "prefix": 9807,
|
3328 | "network": "dentnet",
|
3329 | "displayName": "DENTNet",
|
3330 | "symbols": [
|
3331 | "DENTX"
|
3332 | ],
|
3333 | "decimals": [
|
3334 | 18
|
3335 | ],
|
3336 | "standardAccount": "*25519",
|
3337 | "website": "https://www.dentnet.io"
|
3338 | },
|
3339 | {
|
3340 | "prefix": 9935,
|
3341 | "network": "t3rn",
|
3342 | "displayName": "t3rn",
|
3343 | "symbols": [
|
3344 | "TRN"
|
3345 | ],
|
3346 | "decimals": [
|
3347 | 12
|
3348 | ],
|
3349 | "standardAccount": "*25519",
|
3350 | "website": "https://t3rn.io/"
|
3351 | },
|
3352 | {
|
3353 | "prefix": 10041,
|
3354 | "network": "basilisk",
|
3355 | "displayName": "Basilisk",
|
3356 | "symbols": [
|
3357 | "BSX"
|
3358 | ],
|
3359 | "decimals": [
|
3360 | 12
|
3361 | ],
|
3362 | "standardAccount": "*25519",
|
3363 | "website": "https://bsx.fi"
|
3364 | },
|
3365 | {
|
3366 | "prefix": 11330,
|
3367 | "network": "cess-testnet",
|
3368 | "displayName": "CESS Testnet",
|
3369 | "symbols": [
|
3370 | "TCESS"
|
3371 | ],
|
3372 | "decimals": [
|
3373 | 18
|
3374 | ],
|
3375 | "standardAccount": "*25519",
|
3376 | "website": "https://cess.cloud"
|
3377 | },
|
3378 | {
|
3379 | "prefix": 11331,
|
3380 | "network": "cess",
|
3381 | "displayName": "CESS",
|
3382 | "symbols": [
|
3383 | "CESS"
|
3384 | ],
|
3385 | "decimals": [
|
3386 | 18
|
3387 | ],
|
3388 | "standardAccount": "*25519",
|
3389 | "website": "https://cess.cloud"
|
3390 | },
|
3391 | {
|
3392 | "prefix": 11486,
|
3393 | "network": "luhn",
|
3394 | "displayName": "Luhn Network",
|
3395 | "symbols": [
|
3396 | "LUHN"
|
3397 | ],
|
3398 | "decimals": [
|
3399 | 18
|
3400 | ],
|
3401 | "standardAccount": "*25519",
|
3402 | "website": "https://luhn.network"
|
3403 | },
|
3404 | {
|
3405 | "prefix": 11820,
|
3406 | "network": "contextfree",
|
3407 | "displayName": "Automata ContextFree",
|
3408 | "symbols": [
|
3409 | "CTX"
|
3410 | ],
|
3411 | "decimals": [
|
3412 | 18
|
3413 | ],
|
3414 | "standardAccount": "*25519",
|
3415 | "website": "https://ata.network"
|
3416 | },
|
3417 | {
|
3418 | "prefix": 12155,
|
3419 | "network": "impact",
|
3420 | "displayName": "Impact Protocol Network",
|
3421 | "symbols": [
|
3422 | "BSTY"
|
3423 | ],
|
3424 | "decimals": [
|
3425 | 18
|
3426 | ],
|
3427 | "standardAccount": "*25519",
|
3428 | "website": "https://impactprotocol.network/"
|
3429 | },
|
3430 | {
|
3431 | "prefix": 12191,
|
3432 | "network": "nftmart",
|
3433 | "displayName": "NFTMart",
|
3434 | "symbols": [
|
3435 | "NMT"
|
3436 | ],
|
3437 | "decimals": [
|
3438 | 12
|
3439 | ],
|
3440 | "standardAccount": "*25519",
|
3441 | "website": "https://nftmart.io"
|
3442 | },
|
3443 | {
|
3444 | "prefix": 12850,
|
3445 | "network": "analog-timechain",
|
3446 | "displayName": "Analog Timechain",
|
3447 | "symbols": [
|
3448 | "ANLOG"
|
3449 | ],
|
3450 | "decimals": [
|
3451 | 12
|
3452 | ],
|
3453 | "standardAccount": "*25519",
|
3454 | "website": "https://analog.one"
|
3455 | },
|
3456 | {
|
3457 | "prefix": 13116,
|
3458 | "network": "bittensor",
|
3459 | "displayName": "Bittensor",
|
3460 | "symbols": [
|
3461 | "TAO"
|
3462 | ],
|
3463 | "decimals": [
|
3464 | 9
|
3465 | ],
|
3466 | "standardAccount": "*25519",
|
3467 | "website": "https://bittensor.com"
|
3468 | },
|
3469 | {
|
3470 | "prefix": 14697,
|
3471 | "network": "goro",
|
3472 | "displayName": "GORO Network",
|
3473 | "symbols": [
|
3474 | "GORO"
|
3475 | ],
|
3476 | "decimals": [
|
3477 | 9
|
3478 | ],
|
3479 | "standardAccount": "*25519",
|
3480 | "website": "https://goro.network"
|
3481 | },
|
3482 | {
|
3483 | "prefix": 14998,
|
3484 | "network": "mosaic-chain",
|
3485 | "displayName": "Mosaic Chain",
|
3486 | "symbols": [
|
3487 | "MOS"
|
3488 | ],
|
3489 | "decimals": [
|
3490 | 18
|
3491 | ],
|
3492 | "standardAccount": "*25519",
|
3493 | "website": "https://mosaicchain.io"
|
3494 | },
|
3495 | {
|
3496 | "prefix": 29972,
|
3497 | "network": "mythos",
|
3498 | "displayName": "Mythos",
|
3499 | "symbols": [
|
3500 | "MYTH"
|
3501 | ],
|
3502 | "decimals": [
|
3503 | 18
|
3504 | ],
|
3505 | "standardAccount": "secp256k1",
|
3506 | "website": "https://mythos.foundation"
|
3507 | },
|
3508 | {
|
3509 | "prefix": 8888,
|
3510 | "network": "xcavate",
|
3511 | "displayName": "Xcavate Protocol",
|
3512 | "symbols": [
|
3513 | "XCAV"
|
3514 | ],
|
3515 | "decimals": [
|
3516 | 12
|
3517 | ],
|
3518 | "standardAccount": "*25519",
|
3519 | "website": "https://xcavate.io/"
|
3520 | }
|
3521 | ];
|
3522 |
|
3523 | const knownGenesis = {
|
3524 | acala: [
|
3525 | '0xfc41b9bd8ef8fe53d58c7ea67c794c7ec9a73daf05e6d54b14ff6342c99ba64c'
|
3526 | ],
|
3527 | ajuna: [
|
3528 | '0xe358eb1d11b31255a286c12e44fe6780b7edb171d657905a97e39f71d9c6c3ee'
|
3529 | ],
|
3530 | 'aleph-node': [
|
3531 | '0x70255b4d28de0fc4e1a193d7e175ad1ccef431598211c55538f1018651a0344e'
|
3532 | ],
|
3533 | astar: [
|
3534 | '0x9eb76c5184c4ab8679d2d5d819fdf90b9c001403e9e17da2e14b6d8aec4029c6'
|
3535 | ],
|
3536 | basilisk: [
|
3537 | '0xa85cfb9b9fd4d622a5b28289a02347af987d8f73fa3108450e2b4a11c1ce5755'
|
3538 | ],
|
3539 | bifrost: [
|
3540 | '0x262e1b2ad728475fd6fe88e62d34c200abe6fd693931ddad144059b1eb884e5b'
|
3541 | ],
|
3542 | 'bifrost-kusama': [
|
3543 | '0x9f28c6a68e0fc9646eff64935684f6eeeece527e37bbe1f213d22caa1d9d6bed'
|
3544 | ],
|
3545 | bittensor: [
|
3546 | '0x2f0555cc76fc2840a25a6ea3b9637146806f1f44b090c175ffde2a7e5ab36c03'
|
3547 | ],
|
3548 | centrifuge: [
|
3549 | '0xb3db41421702df9a7fcac62b53ffeac85f7853cc4e689e0b93aeb3db18c09d82',
|
3550 | '0x67dddf2673b69e5f875f6f25277495834398eafd67f492e09f3f3345e003d1b5'
|
3551 | ],
|
3552 | cere: [
|
3553 | '0x81443836a9a24caaa23f1241897d1235717535711d1d3fe24eae4fdc942c092c'
|
3554 | ],
|
3555 | composable: [
|
3556 | '0xdaab8df776eb52ec604a5df5d388bb62a050a0aaec4556a64265b9d42755552d'
|
3557 | ],
|
3558 | darwinia: [
|
3559 | '0xe71578b37a7c799b0ab4ee87ffa6f059a6b98f71f06fb8c84a8d88013a548ad6'
|
3560 | ],
|
3561 | 'dock-mainnet': [
|
3562 | '0x6bfe24dca2a3be10f22212678ac13a6446ec764103c0f3471c71609eac384aae',
|
3563 | '0xf73467c6544aa68df2ee546b135f955c46b90fa627e9b5d7935f41061bb8a5a9'
|
3564 | ],
|
3565 | edgeware: [
|
3566 | '0x742a2ca70c2fda6cee4f8df98d64c4c670a052d9568058982dad9d5a7a135c5b'
|
3567 | ],
|
3568 | encointer: [
|
3569 | '0x7dd99936c1e9e6d1ce7d90eb6f33bea8393b4bf87677d675aa63c9cb3e8c5b5b'
|
3570 | ],
|
3571 | enjin: [
|
3572 | '0xd8761d3c88f26dc12875c00d3165f7d67243d56fc85b4cf19937601a7916e5a9'
|
3573 | ],
|
3574 | equilibrium: [
|
3575 | '0x6f1a800de3daff7f5e037ddf66ab22ce03ab91874debeddb1086f5f7dbd48925'
|
3576 | ],
|
3577 | frequency: [
|
3578 | '0x4a587bf17a404e3572747add7aab7bbe56e805a5479c6c436f07f36fcc8d3ae1'
|
3579 | ],
|
3580 | genshiro: [
|
3581 | '0x9b8cefc0eb5c568b527998bdd76c184e2b76ae561be76e4667072230217ea243'
|
3582 | ],
|
3583 | hydradx: [
|
3584 | '0xafdc188f45c71dacbaa0b62e16a91f726c7b8699a9748cdf715459de6b7f366d',
|
3585 | '0xd2a620c27ec5cbc5621ff9a522689895074f7cca0d08e7134a7804e1a3ba86fc',
|
3586 | '0x10af6e84234477d84dc572bac0789813b254aa490767ed06fb9591191d1073f9',
|
3587 | '0x3d75507dd46301767e601265791da1d9cb47b6ebc94e87347b635e5bf58bd047',
|
3588 | '0x0ed32bfcab4a83517fac88f2aa7cbc2f88d3ab93be9a12b6188a036bf8a943c2'
|
3589 | ],
|
3590 | integritee: [
|
3591 | '0xcdedc8eadbfa209d3f207bba541e57c3c58a667b05a2e1d1e86353c9000758da',
|
3592 | '0xe13e7af377c64e83f95e0d70d5e5c3c01d697a84538776c5b9bbe0e7d7b6034c'
|
3593 | ],
|
3594 | 'interlay-parachain': [
|
3595 | '0xbf88efe70e9e0e916416e8bed61f2b45717f517d7f3523e33c7b001e5ffcbc72'
|
3596 | ],
|
3597 | karura: [
|
3598 | '0xbaf5aabe40646d11f0ee8abbdc64f4a4b7674925cba08e4a05ff9ebed6e2126b'
|
3599 | ],
|
3600 | khala: [
|
3601 | '0xd43540ba6d3eb4897c28a77d48cb5b729fea37603cbbfc7a86a73b72adb3be8d'
|
3602 | ],
|
3603 | kulupu: [
|
3604 | '0xf7a99d3cb92853d00d5275c971c132c074636256583fee53b3bbe60d7b8769ba'
|
3605 | ],
|
3606 | kusama: [
|
3607 | '0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe',
|
3608 | '0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636',
|
3609 | '0x3fd7b9eb6a00376e5be61f01abb429ffb0b104be05eaff4d458da48fcd425baf'
|
3610 | ],
|
3611 | matrixchain: [
|
3612 | '0x3af4ff48ec76d2efc8476730f423ac07e25ad48f5f4c9dc39c778b164d808615'
|
3613 | ],
|
3614 | nodle: [
|
3615 | '0x97da7ede98d7bad4e36b4d734b6055425a3be036da2a332ea5a7037656427a21'
|
3616 | ],
|
3617 | origintrail: [
|
3618 | '0xe7e0962324a3b86c83404dbea483f25fb5dab4c224791c81b756cfc948006174'
|
3619 | ],
|
3620 | p3d: [
|
3621 | '0x6c5894837ad89b6d92b114a2fb3eafa8fe3d26a54848e3447015442cd6ef4e66'
|
3622 | ],
|
3623 | parallel: [
|
3624 | '0xe61a41c53f5dcd0beb09df93b34402aada44cb05117b71059cce40a2723a4e97'
|
3625 | ],
|
3626 | peaq: [
|
3627 | '0xd2a5d385932d1f650dae03ef8e2748983779ee342c614f80854d32b8cd8fa48c'
|
3628 | ],
|
3629 | pendulum: [
|
3630 | '0x5d3c298622d5634ed019bf61ea4b71655030015bde9beb0d6a24743714462c86'
|
3631 | ],
|
3632 | phala: [
|
3633 | '0x1bb969d85965e4bb5a651abbedf21a54b6b31a21f66b5401cc3f1e286268d736'
|
3634 | ],
|
3635 | picasso: [
|
3636 | '0x6811a339673c9daa897944dcdac99c6e2939cc88245ed21951a0a3c9a2be75bc',
|
3637 | '0xe8e7f0f4c4f5a00720b4821dbfddefea7490bcf0b19009961cc46957984e2c1c'
|
3638 | ],
|
3639 | polimec: [
|
3640 | '0x7eb9354488318e7549c722669dcbdcdc526f1fef1420e7944667212f3601fdbd'
|
3641 | ],
|
3642 | polkadex: [
|
3643 | '0x3920bcb4960a1eef5580cd5367ff3f430eef052774f78468852f7b9cb39f8a3c'
|
3644 | ],
|
3645 | polkadot: [
|
3646 | '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'
|
3647 | ],
|
3648 | polymesh: [
|
3649 | '0x6fbd74e5e1d0a61d52ccfe9d4adaed16dd3a7caa37c6bc4d0c2fa12e8b2f4063'
|
3650 | ],
|
3651 | quartz: [
|
3652 | '0xcd4d732201ebe5d6b014edda071c4203e16867305332301dc8d092044b28e554'
|
3653 | ],
|
3654 | rococo: [
|
3655 | '0x6408de7737c59c238890533af25896a2c20608d8b380bb01029acb392781063e',
|
3656 | '0xaaf2cd1b74b5f726895921259421b534124726263982522174147046b8827897',
|
3657 | '0x037f5f3c8e67b314062025fc886fcd6238ea25a4a9b45dce8d246815c9ebe770',
|
3658 | '0xc196f81260cf1686172b47a79cf002120735d7cb0eb1474e8adce56618456fff',
|
3659 | '0xf6e9983c37baf68846fedafe21e56718790e39fb1c582abc408b81bc7b208f9a',
|
3660 | '0x5fce687da39305dfe682b117f0820b319348e8bb37eb16cf34acbf6a202de9d9',
|
3661 | '0xe7c3d5edde7db964317cd9b51a3a059d7cd99f81bdbce14990047354334c9779',
|
3662 | '0x1611e1dbf0405379b861e2e27daa90f480b2e6d3682414a80835a52e8cb8a215',
|
3663 | '0x343442f12fa715489a8714e79a7b264ea88c0d5b8c66b684a7788a516032f6b9',
|
3664 | '0x78bcd530c6b3a068bc17473cf5d2aff9c287102bed9af3ae3c41c33b9d6c6147',
|
3665 | '0x47381ee0697153d64404fc578392c8fd5cba9073391908f46c888498415647bd',
|
3666 | '0x19c0e4fa8ab75f5ac7865e0b8f74ff91eb9a100d336f423cd013a8befba40299'
|
3667 | ],
|
3668 | sora: [
|
3669 | '0x7e4e32d0feafd4f9c9414b0be86373f9a1efa904809b683453a9af6856d38ad5'
|
3670 | ],
|
3671 | stafi: [
|
3672 | '0x290a4149f09ea0e402c74c1c7e96ae4239588577fe78932f94f5404c68243d80'
|
3673 | ],
|
3674 | statemine: [
|
3675 | '0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a'
|
3676 | ],
|
3677 | statemint: [
|
3678 | '0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f'
|
3679 | ],
|
3680 | subsocial: [
|
3681 | '0x0bd72c1c305172e1275278aaeb3f161e02eccb7a819e63f62d47bd53a28189f8'
|
3682 | ],
|
3683 | ternoa: [
|
3684 | '0x6859c81ca95ef624c9dfe4dc6e3381c33e5d6509e35e147092bfbc780f777c4e'
|
3685 | ],
|
3686 | unique: [
|
3687 | '0x84322d9cddbf35088f1e54e9a85c967a41a56a4f43445768125e61af166c7d31'
|
3688 | ],
|
3689 | vara: [
|
3690 | '0xfe1b4c55fd4d668101126434206571a7838a8b6b93a6d1b95d607e78e6c53763'
|
3691 | ],
|
3692 | vtb: [
|
3693 | '0x286bc8414c7000ce1d6ee6a834e29a54c1784814b76243eb77ed0b2c5573c60f',
|
3694 | '0x7483b89572fb2bd687c7b9a93b242d0b237f9aba463aba07ec24503931038aaa'
|
3695 | ],
|
3696 | westend: [
|
3697 | '0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e'
|
3698 | ],
|
3699 | xxnetwork: [
|
3700 | '0x50dd5d206917bf10502c68fb4d18a59fc8aa31586f4e8856b493e43544aa82aa'
|
3701 | ],
|
3702 | zeitgeist: [
|
3703 | '0x1bf2a2ecb4a868de66ea8610f2ce7c8c43706561b6476031315f6640fe38e060'
|
3704 | ]
|
3705 | };
|
3706 |
|
3707 | const knownIcon = {
|
3708 | centrifuge: 'polkadot',
|
3709 | kusama: 'polkadot',
|
3710 | polkadot: 'polkadot',
|
3711 | sora: 'polkadot',
|
3712 | statemine: 'polkadot',
|
3713 | statemint: 'polkadot',
|
3714 | westmint: 'polkadot'
|
3715 | };
|
3716 |
|
3717 | const knownLedger = {
|
3718 | acala: 0x00000313,
|
3719 | ajuna: 0x00000162,
|
3720 | 'aleph-node': 0x00000283,
|
3721 | astar: 0x0000032a,
|
3722 | bifrost: 0x00000314,
|
3723 | 'bifrost-kusama': 0x00000314,
|
3724 | bittensor: 0x00000162,
|
3725 | centrifuge: 0x000002eb,
|
3726 | composable: 0x00000162,
|
3727 | darwinia: 0x00000162,
|
3728 | 'dock-mainnet': 0x00000252,
|
3729 | edgeware: 0x0000020b,
|
3730 | encointer: 0x000001b2,
|
3731 | enjin: 0x00000483,
|
3732 | equilibrium: 0x05f5e0fd,
|
3733 | frequency: 0x0000082b,
|
3734 | genshiro: 0x05f5e0fc,
|
3735 | hydradx: 0x00000162,
|
3736 | integritee: 0x000007df,
|
3737 | 'interlay-parachain': 0x00000162,
|
3738 | karura: 0x000002ae,
|
3739 | khala: 0x000001b2,
|
3740 | kusama: 0x000001b2,
|
3741 | matrixchain: 0x00000483,
|
3742 | nodle: 0x000003eb,
|
3743 | origintrail: 0x00000162,
|
3744 | parallel: 0x00000162,
|
3745 | peaq: 0x00000d0a,
|
3746 | pendulum: 0x00000162,
|
3747 | phala: 0x00000162,
|
3748 | picasso: 0x000001b2,
|
3749 | polimec: 0x00000d10,
|
3750 | polkadex: 0x0000031f,
|
3751 | polkadot: 0x00000162,
|
3752 | polymesh: 0x00000253,
|
3753 | quartz: 0x00000277,
|
3754 | sora: 0x00000269,
|
3755 | stafi: 0x0000038b,
|
3756 | statemine: 0x000001b2,
|
3757 | statemint: 0x00000162,
|
3758 | ternoa: 0x00003e3,
|
3759 | unique: 0x00000295,
|
3760 | vara: 0x00001370,
|
3761 | vtb: 0x000002b6,
|
3762 | xxnetwork: 0x000007a3,
|
3763 | zeitgeist: 0x00000162
|
3764 | };
|
3765 |
|
3766 | const knownTestnet = {
|
3767 | '': true,
|
3768 | 'cess-testnet': true,
|
3769 | 'dock-testnet': true,
|
3770 | jupiter: true,
|
3771 | 'mathchain-testnet': true,
|
3772 | p3dt: true,
|
3773 | subspace_testnet: true,
|
3774 | 'zero-alphaville': true
|
3775 | };
|
3776 |
|
3777 | const UNSORTED = [0, 2, 42];
|
3778 | const TESTNETS = ['testnet'];
|
3779 | function toExpanded(o) {
|
3780 | const network = o.network || '';
|
3781 | const nameParts = network.replace(/_/g, '-').split('-');
|
3782 | const n = o;
|
3783 | n.slip44 = knownLedger[network];
|
3784 | n.hasLedgerSupport = !!n.slip44;
|
3785 | n.genesisHash = knownGenesis[network] || [];
|
3786 | n.icon = knownIcon[network] || 'substrate';
|
3787 | n.isTestnet = !!knownTestnet[network] || TESTNETS.includes(nameParts[nameParts.length - 1]);
|
3788 | n.isIgnored = n.isTestnet || (!(o.standardAccount &&
|
3789 | o.decimals?.length &&
|
3790 | o.symbols?.length) &&
|
3791 | o.prefix !== 42);
|
3792 | return n;
|
3793 | }
|
3794 | function filterSelectable({ genesisHash, prefix }) {
|
3795 | return !!genesisHash.length || prefix === 42;
|
3796 | }
|
3797 | function filterAvailable(n) {
|
3798 | return !n.isIgnored && !!n.network;
|
3799 | }
|
3800 | function sortNetworks(a, b) {
|
3801 | const isUnSortedA = UNSORTED.includes(a.prefix);
|
3802 | const isUnSortedB = UNSORTED.includes(b.prefix);
|
3803 | return isUnSortedA === isUnSortedB
|
3804 | ? isUnSortedA
|
3805 | ? 0
|
3806 | : a.displayName.localeCompare(b.displayName)
|
3807 | : isUnSortedA
|
3808 | ? -1
|
3809 | : 1;
|
3810 | }
|
3811 | const allNetworks = knownSubstrate.map(toExpanded);
|
3812 | const availableNetworks = allNetworks.filter(filterAvailable).sort(sortNetworks);
|
3813 | const selectableNetworks = availableNetworks.filter(filterSelectable);
|
3814 |
|
3815 | const defaults = {
|
3816 | allowedDecodedLengths: [1, 2, 4, 8, 32, 33],
|
3817 | allowedEncodedLengths: [3, 4, 6, 10, 35, 36, 37, 38],
|
3818 | allowedPrefix: availableNetworks.map(({ prefix }) => prefix),
|
3819 | prefix: 42
|
3820 | };
|
3821 |
|
3822 | function decodeAddress(encoded, ignoreChecksum, ss58Format = -1) {
|
3823 | if (!encoded) {
|
3824 | throw new Error('Invalid empty address passed');
|
3825 | }
|
3826 | if (util.isU8a(encoded) || util.isHex(encoded)) {
|
3827 | return util.u8aToU8a(encoded);
|
3828 | }
|
3829 | try {
|
3830 | const decoded = base58Decode(encoded);
|
3831 | if (!defaults.allowedEncodedLengths.includes(decoded.length)) {
|
3832 | throw new Error('Invalid decoded address length');
|
3833 | }
|
3834 | const [isValid, endPos, ss58Length, ss58Decoded] = checkAddressChecksum(decoded);
|
3835 | if (!isValid && !ignoreChecksum) {
|
3836 | throw new Error('Invalid decoded address checksum');
|
3837 | }
|
3838 | else if (ss58Format !== -1 && ss58Format !== ss58Decoded) {
|
3839 | throw new Error(`Expected ss58Format ${ss58Format}, received ${ss58Decoded}`);
|
3840 | }
|
3841 | return decoded.slice(ss58Length, endPos);
|
3842 | }
|
3843 | catch (error) {
|
3844 | throw new Error(`Decoding ${encoded}: ${error.message}`);
|
3845 | }
|
3846 | }
|
3847 |
|
3848 | function addressToEvm(address, ignoreChecksum) {
|
3849 | return decodeAddress(address, ignoreChecksum).subarray(0, 20);
|
3850 | }
|
3851 |
|
3852 | function checkAddress(address, prefix) {
|
3853 | let decoded;
|
3854 | try {
|
3855 | decoded = base58Decode(address);
|
3856 | }
|
3857 | catch (error) {
|
3858 | return [false, error.message];
|
3859 | }
|
3860 | const [isValid, , , ss58Decoded] = checkAddressChecksum(decoded);
|
3861 | if (ss58Decoded !== prefix) {
|
3862 | return [false, `Prefix mismatch, expected ${prefix}, found ${ss58Decoded}`];
|
3863 | }
|
3864 | else if (!defaults.allowedEncodedLengths.includes(decoded.length)) {
|
3865 | return [false, 'Invalid decoded address length'];
|
3866 | }
|
3867 | return [isValid, isValid ? null : 'Invalid decoded address checksum'];
|
3868 | }
|
3869 |
|
3870 | const BN_BE_OPTS = { isLe: false };
|
3871 | const BN_LE_OPTS = { isLe: true };
|
3872 | const BN_LE_16_OPTS = { bitLength: 16, isLe: true };
|
3873 | const BN_BE_32_OPTS = { bitLength: 32, isLe: false };
|
3874 | const BN_LE_32_OPTS = { bitLength: 32, isLe: true };
|
3875 | const BN_BE_256_OPTS = { bitLength: 256, isLe: false };
|
3876 | const BN_LE_256_OPTS = { bitLength: 256, isLe: true };
|
3877 | const BN_LE_512_OPTS = { bitLength: 512, isLe: true };
|
3878 |
|
3879 | const RE_NUMBER = /^\d+$/;
|
3880 | const JUNCTION_ID_LEN = 32;
|
3881 | class DeriveJunction {
|
3882 | __internal__chainCode = new Uint8Array(32);
|
3883 | __internal__isHard = false;
|
3884 | static from(value) {
|
3885 | const result = new DeriveJunction();
|
3886 | const [code, isHard] = value.startsWith('/')
|
3887 | ? [value.substring(1), true]
|
3888 | : [value, false];
|
3889 | result.soft(RE_NUMBER.test(code)
|
3890 | ? new util.BN(code, 10)
|
3891 | : code);
|
3892 | return isHard
|
3893 | ? result.harden()
|
3894 | : result;
|
3895 | }
|
3896 | get chainCode() {
|
3897 | return this.__internal__chainCode;
|
3898 | }
|
3899 | get isHard() {
|
3900 | return this.__internal__isHard;
|
3901 | }
|
3902 | get isSoft() {
|
3903 | return !this.__internal__isHard;
|
3904 | }
|
3905 | hard(value) {
|
3906 | return this.soft(value).harden();
|
3907 | }
|
3908 | harden() {
|
3909 | this.__internal__isHard = true;
|
3910 | return this;
|
3911 | }
|
3912 | soft(value) {
|
3913 | if (util.isNumber(value) || util.isBn(value) || util.isBigInt(value)) {
|
3914 | return this.soft(util.bnToU8a(value, BN_LE_256_OPTS));
|
3915 | }
|
3916 | else if (util.isHex(value)) {
|
3917 | return this.soft(util.hexToU8a(value));
|
3918 | }
|
3919 | else if (util.isString(value)) {
|
3920 | return this.soft(util.compactAddLength(util.stringToU8a(value)));
|
3921 | }
|
3922 | else if (value.length > JUNCTION_ID_LEN) {
|
3923 | return this.soft(blake2AsU8a(value));
|
3924 | }
|
3925 | this.__internal__chainCode.fill(0);
|
3926 | this.__internal__chainCode.set(value, 0);
|
3927 | return this;
|
3928 | }
|
3929 | soften() {
|
3930 | this.__internal__isHard = false;
|
3931 | return this;
|
3932 | }
|
3933 | }
|
3934 |
|
3935 | const RE_JUNCTION = /\/(\/?)([^/]+)/g;
|
3936 | function keyExtractPath(derivePath) {
|
3937 | const parts = derivePath.match(RE_JUNCTION);
|
3938 | const path = [];
|
3939 | let constructed = '';
|
3940 | if (parts) {
|
3941 | constructed = parts.join('');
|
3942 | for (const p of parts) {
|
3943 | path.push(DeriveJunction.from(p.substring(1)));
|
3944 | }
|
3945 | }
|
3946 | if (constructed !== derivePath) {
|
3947 | throw new Error(`Re-constructed path "${constructed}" does not match input`);
|
3948 | }
|
3949 | return {
|
3950 | parts,
|
3951 | path
|
3952 | };
|
3953 | }
|
3954 |
|
3955 | const RE_CAPTURE = /^(\w+( \w+)*)((\/\/?[^/]+)*)(\/\/\/(.*))?$/;
|
3956 | function keyExtractSuri(suri) {
|
3957 | const matches = suri.match(RE_CAPTURE);
|
3958 | if (matches === null) {
|
3959 | throw new Error('Unable to match provided value to a secret URI');
|
3960 | }
|
3961 | const [, phrase, , derivePath, , , password] = matches;
|
3962 | const { path } = keyExtractPath(derivePath);
|
3963 | return {
|
3964 | derivePath,
|
3965 | password,
|
3966 | path,
|
3967 | phrase
|
3968 | };
|
3969 | }
|
3970 |
|
3971 | const HDKD$1 = util.compactAddLength(util.stringToU8a('Secp256k1HDKD'));
|
3972 | function secp256k1DeriveHard(seed, chainCode) {
|
3973 | if (!util.isU8a(chainCode) || chainCode.length !== 32) {
|
3974 | throw new Error('Invalid chainCode passed to derive');
|
3975 | }
|
3976 | return blake2AsU8a(util.u8aConcat(HDKD$1, seed, chainCode), 256);
|
3977 | }
|
3978 |
|
3979 | function setBigUint64(view, byteOffset, value, isLE) {
|
3980 | if (typeof view.setBigUint64 === 'function')
|
3981 | return view.setBigUint64(byteOffset, value, isLE);
|
3982 | const _32n = BigInt(32);
|
3983 | const _u32_max = BigInt(0xffffffff);
|
3984 | const wh = Number((value >> _32n) & _u32_max);
|
3985 | const wl = Number(value & _u32_max);
|
3986 | const h = isLE ? 4 : 0;
|
3987 | const l = isLE ? 0 : 4;
|
3988 | view.setUint32(byteOffset + h, wh, isLE);
|
3989 | view.setUint32(byteOffset + l, wl, isLE);
|
3990 | }
|
3991 | class SHA2 extends Hash {
|
3992 | constructor(blockLen, outputLen, padOffset, isLE) {
|
3993 | super();
|
3994 | this.blockLen = blockLen;
|
3995 | this.outputLen = outputLen;
|
3996 | this.padOffset = padOffset;
|
3997 | this.isLE = isLE;
|
3998 | this.finished = false;
|
3999 | this.length = 0;
|
4000 | this.pos = 0;
|
4001 | this.destroyed = false;
|
4002 | this.buffer = new Uint8Array(blockLen);
|
4003 | this.view = createView(this.buffer);
|
4004 | }
|
4005 | update(data) {
|
4006 | exists(this);
|
4007 | const { view, buffer, blockLen } = this;
|
4008 | data = toBytes(data);
|
4009 | const len = data.length;
|
4010 | for (let pos = 0; pos < len;) {
|
4011 | const take = Math.min(blockLen - this.pos, len - pos);
|
4012 | if (take === blockLen) {
|
4013 | const dataView = createView(data);
|
4014 | for (; blockLen <= len - pos; pos += blockLen)
|
4015 | this.process(dataView, pos);
|
4016 | continue;
|
4017 | }
|
4018 | buffer.set(data.subarray(pos, pos + take), this.pos);
|
4019 | this.pos += take;
|
4020 | pos += take;
|
4021 | if (this.pos === blockLen) {
|
4022 | this.process(view, 0);
|
4023 | this.pos = 0;
|
4024 | }
|
4025 | }
|
4026 | this.length += data.length;
|
4027 | this.roundClean();
|
4028 | return this;
|
4029 | }
|
4030 | digestInto(out) {
|
4031 | exists(this);
|
4032 | output(out, this);
|
4033 | this.finished = true;
|
4034 | const { buffer, view, blockLen, isLE } = this;
|
4035 | let { pos } = this;
|
4036 | buffer[pos++] = 0b10000000;
|
4037 | this.buffer.subarray(pos).fill(0);
|
4038 | if (this.padOffset > blockLen - pos) {
|
4039 | this.process(view, 0);
|
4040 | pos = 0;
|
4041 | }
|
4042 | for (let i = pos; i < blockLen; i++)
|
4043 | buffer[i] = 0;
|
4044 | setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);
|
4045 | this.process(view, 0);
|
4046 | const oview = createView(out);
|
4047 | const len = this.outputLen;
|
4048 | if (len % 4)
|
4049 | throw new Error('_sha2: outputLen should be aligned to 32bit');
|
4050 | const outLen = len / 4;
|
4051 | const state = this.get();
|
4052 | if (outLen > state.length)
|
4053 | throw new Error('_sha2: outputLen bigger than state');
|
4054 | for (let i = 0; i < outLen; i++)
|
4055 | oview.setUint32(4 * i, state[i], isLE);
|
4056 | }
|
4057 | digest() {
|
4058 | const { buffer, outputLen } = this;
|
4059 | this.digestInto(buffer);
|
4060 | const res = buffer.slice(0, outputLen);
|
4061 | this.destroy();
|
4062 | return res;
|
4063 | }
|
4064 | _cloneInto(to) {
|
4065 | to || (to = new this.constructor());
|
4066 | to.set(...this.get());
|
4067 | const { blockLen, buffer, length, finished, destroyed, pos } = this;
|
4068 | to.length = length;
|
4069 | to.pos = pos;
|
4070 | to.finished = finished;
|
4071 | to.destroyed = destroyed;
|
4072 | if (length % blockLen)
|
4073 | to.buffer.set(buffer);
|
4074 | return to;
|
4075 | }
|
4076 | }
|
4077 |
|
4078 | const Chi = (a, b, c) => (a & b) ^ (~a & c);
|
4079 | const Maj = (a, b, c) => (a & b) ^ (a & c) ^ (b & c);
|
4080 | const SHA256_K = new Uint32Array([
|
4081 | 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
4082 | 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
4083 | 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
4084 | 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
4085 | 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
4086 | 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
4087 | 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
4088 | 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
4089 | ]);
|
4090 | const IV = new Uint32Array([
|
4091 | 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
|
4092 | ]);
|
4093 | const SHA256_W = new Uint32Array(64);
|
4094 | class SHA256 extends SHA2 {
|
4095 | constructor() {
|
4096 | super(64, 32, 8, false);
|
4097 | this.A = IV[0] | 0;
|
4098 | this.B = IV[1] | 0;
|
4099 | this.C = IV[2] | 0;
|
4100 | this.D = IV[3] | 0;
|
4101 | this.E = IV[4] | 0;
|
4102 | this.F = IV[5] | 0;
|
4103 | this.G = IV[6] | 0;
|
4104 | this.H = IV[7] | 0;
|
4105 | }
|
4106 | get() {
|
4107 | const { A, B, C, D, E, F, G, H } = this;
|
4108 | return [A, B, C, D, E, F, G, H];
|
4109 | }
|
4110 | set(A, B, C, D, E, F, G, H) {
|
4111 | this.A = A | 0;
|
4112 | this.B = B | 0;
|
4113 | this.C = C | 0;
|
4114 | this.D = D | 0;
|
4115 | this.E = E | 0;
|
4116 | this.F = F | 0;
|
4117 | this.G = G | 0;
|
4118 | this.H = H | 0;
|
4119 | }
|
4120 | process(view, offset) {
|
4121 | for (let i = 0; i < 16; i++, offset += 4)
|
4122 | SHA256_W[i] = view.getUint32(offset, false);
|
4123 | for (let i = 16; i < 64; i++) {
|
4124 | const W15 = SHA256_W[i - 15];
|
4125 | const W2 = SHA256_W[i - 2];
|
4126 | const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);
|
4127 | const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);
|
4128 | SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;
|
4129 | }
|
4130 | let { A, B, C, D, E, F, G, H } = this;
|
4131 | for (let i = 0; i < 64; i++) {
|
4132 | const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);
|
4133 | const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;
|
4134 | const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);
|
4135 | const T2 = (sigma0 + Maj(A, B, C)) | 0;
|
4136 | H = G;
|
4137 | G = F;
|
4138 | F = E;
|
4139 | E = (D + T1) | 0;
|
4140 | D = C;
|
4141 | C = B;
|
4142 | B = A;
|
4143 | A = (T1 + T2) | 0;
|
4144 | }
|
4145 | A = (A + this.A) | 0;
|
4146 | B = (B + this.B) | 0;
|
4147 | C = (C + this.C) | 0;
|
4148 | D = (D + this.D) | 0;
|
4149 | E = (E + this.E) | 0;
|
4150 | F = (F + this.F) | 0;
|
4151 | G = (G + this.G) | 0;
|
4152 | H = (H + this.H) | 0;
|
4153 | this.set(A, B, C, D, E, F, G, H);
|
4154 | }
|
4155 | roundClean() {
|
4156 | SHA256_W.fill(0);
|
4157 | }
|
4158 | destroy() {
|
4159 | this.set(0, 0, 0, 0, 0, 0, 0, 0);
|
4160 | this.buffer.fill(0);
|
4161 | }
|
4162 | }
|
4163 | class SHA224 extends SHA256 {
|
4164 | constructor() {
|
4165 | super();
|
4166 | this.A = 0xc1059ed8 | 0;
|
4167 | this.B = 0x367cd507 | 0;
|
4168 | this.C = 0x3070dd17 | 0;
|
4169 | this.D = 0xf70e5939 | 0;
|
4170 | this.E = 0xffc00b31 | 0;
|
4171 | this.F = 0x68581511 | 0;
|
4172 | this.G = 0x64f98fa7 | 0;
|
4173 | this.H = 0xbefa4fa4 | 0;
|
4174 | this.outputLen = 28;
|
4175 | }
|
4176 | }
|
4177 | const sha256 = wrapConstructor(() => new SHA256());
|
4178 | wrapConstructor(() => new SHA224());
|
4179 |
|
4180 | /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
4181 | const _0n$8 = BigInt(0);
|
4182 | const _1n$8 = BigInt(1);
|
4183 | const _2n$6 = BigInt(2);
|
4184 | function isBytes(a) {
|
4185 | return (a instanceof Uint8Array ||
|
4186 | (a != null && typeof a === 'object' && a.constructor.name === 'Uint8Array'));
|
4187 | }
|
4188 | const hexes = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));
|
4189 | function bytesToHex(bytes) {
|
4190 | if (!isBytes(bytes))
|
4191 | throw new Error('Uint8Array expected');
|
4192 | let hex = '';
|
4193 | for (let i = 0; i < bytes.length; i++) {
|
4194 | hex += hexes[bytes[i]];
|
4195 | }
|
4196 | return hex;
|
4197 | }
|
4198 | function numberToHexUnpadded(num) {
|
4199 | const hex = num.toString(16);
|
4200 | return hex.length & 1 ? `0${hex}` : hex;
|
4201 | }
|
4202 | function hexToNumber(hex) {
|
4203 | if (typeof hex !== 'string')
|
4204 | throw new Error('hex string expected, got ' + typeof hex);
|
4205 | return BigInt(hex === '' ? '0' : `0x${hex}`);
|
4206 | }
|
4207 | const asciis = { _0: 48, _9: 57, _A: 65, _F: 70, _a: 97, _f: 102 };
|
4208 | function asciiToBase16(char) {
|
4209 | if (char >= asciis._0 && char <= asciis._9)
|
4210 | return char - asciis._0;
|
4211 | if (char >= asciis._A && char <= asciis._F)
|
4212 | return char - (asciis._A - 10);
|
4213 | if (char >= asciis._a && char <= asciis._f)
|
4214 | return char - (asciis._a - 10);
|
4215 | return;
|
4216 | }
|
4217 | function hexToBytes(hex) {
|
4218 | if (typeof hex !== 'string')
|
4219 | throw new Error('hex string expected, got ' + typeof hex);
|
4220 | const hl = hex.length;
|
4221 | const al = hl / 2;
|
4222 | if (hl % 2)
|
4223 | throw new Error('padded hex string expected, got unpadded hex of length ' + hl);
|
4224 | const array = new Uint8Array(al);
|
4225 | for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
|
4226 | const n1 = asciiToBase16(hex.charCodeAt(hi));
|
4227 | const n2 = asciiToBase16(hex.charCodeAt(hi + 1));
|
4228 | if (n1 === undefined || n2 === undefined) {
|
4229 | const char = hex[hi] + hex[hi + 1];
|
4230 | throw new Error('hex string expected, got non-hex character "' + char + '" at index ' + hi);
|
4231 | }
|
4232 | array[ai] = n1 * 16 + n2;
|
4233 | }
|
4234 | return array;
|
4235 | }
|
4236 | function bytesToNumberBE(bytes) {
|
4237 | return hexToNumber(bytesToHex(bytes));
|
4238 | }
|
4239 | function bytesToNumberLE(bytes) {
|
4240 | if (!isBytes(bytes))
|
4241 | throw new Error('Uint8Array expected');
|
4242 | return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse()));
|
4243 | }
|
4244 | function numberToBytesBE(n, len) {
|
4245 | return hexToBytes(n.toString(16).padStart(len * 2, '0'));
|
4246 | }
|
4247 | function numberToBytesLE(n, len) {
|
4248 | return numberToBytesBE(n, len).reverse();
|
4249 | }
|
4250 | function numberToVarBytesBE(n) {
|
4251 | return hexToBytes(numberToHexUnpadded(n));
|
4252 | }
|
4253 | function ensureBytes(title, hex, expectedLength) {
|
4254 | let res;
|
4255 | if (typeof hex === 'string') {
|
4256 | try {
|
4257 | res = hexToBytes(hex);
|
4258 | }
|
4259 | catch (e) {
|
4260 | throw new Error(`${title} must be valid hex string, got "${hex}". Cause: ${e}`);
|
4261 | }
|
4262 | }
|
4263 | else if (isBytes(hex)) {
|
4264 | res = Uint8Array.from(hex);
|
4265 | }
|
4266 | else {
|
4267 | throw new Error(`${title} must be hex string or Uint8Array`);
|
4268 | }
|
4269 | const len = res.length;
|
4270 | if (typeof expectedLength === 'number' && len !== expectedLength)
|
4271 | throw new Error(`${title} expected ${expectedLength} bytes, got ${len}`);
|
4272 | return res;
|
4273 | }
|
4274 | function concatBytes(...arrays) {
|
4275 | let sum = 0;
|
4276 | for (let i = 0; i < arrays.length; i++) {
|
4277 | const a = arrays[i];
|
4278 | if (!isBytes(a))
|
4279 | throw new Error('Uint8Array expected');
|
4280 | sum += a.length;
|
4281 | }
|
4282 | let res = new Uint8Array(sum);
|
4283 | let pad = 0;
|
4284 | for (let i = 0; i < arrays.length; i++) {
|
4285 | const a = arrays[i];
|
4286 | res.set(a, pad);
|
4287 | pad += a.length;
|
4288 | }
|
4289 | return res;
|
4290 | }
|
4291 | function equalBytes(a, b) {
|
4292 | if (a.length !== b.length)
|
4293 | return false;
|
4294 | let diff = 0;
|
4295 | for (let i = 0; i < a.length; i++)
|
4296 | diff |= a[i] ^ b[i];
|
4297 | return diff === 0;
|
4298 | }
|
4299 | function utf8ToBytes(str) {
|
4300 | if (typeof str !== 'string')
|
4301 | throw new Error(`utf8ToBytes expected string, got ${typeof str}`);
|
4302 | return new Uint8Array(new TextEncoder().encode(str));
|
4303 | }
|
4304 | function bitLen(n) {
|
4305 | let len;
|
4306 | for (len = 0; n > _0n$8; n >>= _1n$8, len += 1)
|
4307 | ;
|
4308 | return len;
|
4309 | }
|
4310 | function bitGet(n, pos) {
|
4311 | return (n >> BigInt(pos)) & _1n$8;
|
4312 | }
|
4313 | const bitSet = (n, pos, value) => {
|
4314 | return n | ((value ? _1n$8 : _0n$8) << BigInt(pos));
|
4315 | };
|
4316 | const bitMask = (n) => (_2n$6 << BigInt(n - 1)) - _1n$8;
|
4317 | const u8n = (data) => new Uint8Array(data);
|
4318 | const u8fr = (arr) => Uint8Array.from(arr);
|
4319 | function createHmacDrbg(hashLen, qByteLen, hmacFn) {
|
4320 | if (typeof hashLen !== 'number' || hashLen < 2)
|
4321 | throw new Error('hashLen must be a number');
|
4322 | if (typeof qByteLen !== 'number' || qByteLen < 2)
|
4323 | throw new Error('qByteLen must be a number');
|
4324 | if (typeof hmacFn !== 'function')
|
4325 | throw new Error('hmacFn must be a function');
|
4326 | let v = u8n(hashLen);
|
4327 | let k = u8n(hashLen);
|
4328 | let i = 0;
|
4329 | const reset = () => {
|
4330 | v.fill(1);
|
4331 | k.fill(0);
|
4332 | i = 0;
|
4333 | };
|
4334 | const h = (...b) => hmacFn(k, v, ...b);
|
4335 | const reseed = (seed = u8n()) => {
|
4336 | k = h(u8fr([0x00]), seed);
|
4337 | v = h();
|
4338 | if (seed.length === 0)
|
4339 | return;
|
4340 | k = h(u8fr([0x01]), seed);
|
4341 | v = h();
|
4342 | };
|
4343 | const gen = () => {
|
4344 | if (i++ >= 1000)
|
4345 | throw new Error('drbg: tried 1000 values');
|
4346 | let len = 0;
|
4347 | const out = [];
|
4348 | while (len < qByteLen) {
|
4349 | v = h();
|
4350 | const sl = v.slice();
|
4351 | out.push(sl);
|
4352 | len += v.length;
|
4353 | }
|
4354 | return concatBytes(...out);
|
4355 | };
|
4356 | const genUntil = (seed, pred) => {
|
4357 | reset();
|
4358 | reseed(seed);
|
4359 | let res = undefined;
|
4360 | while (!(res = pred(gen())))
|
4361 | reseed();
|
4362 | reset();
|
4363 | return res;
|
4364 | };
|
4365 | return genUntil;
|
4366 | }
|
4367 | const validatorFns = {
|
4368 | bigint: (val) => typeof val === 'bigint',
|
4369 | function: (val) => typeof val === 'function',
|
4370 | boolean: (val) => typeof val === 'boolean',
|
4371 | string: (val) => typeof val === 'string',
|
4372 | stringOrUint8Array: (val) => typeof val === 'string' || isBytes(val),
|
4373 | isSafeInteger: (val) => Number.isSafeInteger(val),
|
4374 | array: (val) => Array.isArray(val),
|
4375 | field: (val, object) => object.Fp.isValid(val),
|
4376 | hash: (val) => typeof val === 'function' && Number.isSafeInteger(val.outputLen),
|
4377 | };
|
4378 | function validateObject(object, validators, optValidators = {}) {
|
4379 | const checkField = (fieldName, type, isOptional) => {
|
4380 | const checkVal = validatorFns[type];
|
4381 | if (typeof checkVal !== 'function')
|
4382 | throw new Error(`Invalid validator "${type}", expected function`);
|
4383 | const val = object[fieldName];
|
4384 | if (isOptional && val === undefined)
|
4385 | return;
|
4386 | if (!checkVal(val, object)) {
|
4387 | throw new Error(`Invalid param ${String(fieldName)}=${val} (${typeof val}), expected ${type}`);
|
4388 | }
|
4389 | };
|
4390 | for (const [fieldName, type] of Object.entries(validators))
|
4391 | checkField(fieldName, type, false);
|
4392 | for (const [fieldName, type] of Object.entries(optValidators))
|
4393 | checkField(fieldName, type, true);
|
4394 | return object;
|
4395 | }
|
4396 |
|
4397 | const ut = /*#__PURE__*/Object.freeze({
|
4398 | __proto__: null,
|
4399 | bitGet: bitGet,
|
4400 | bitLen: bitLen,
|
4401 | bitMask: bitMask,
|
4402 | bitSet: bitSet,
|
4403 | bytesToHex: bytesToHex,
|
4404 | bytesToNumberBE: bytesToNumberBE,
|
4405 | bytesToNumberLE: bytesToNumberLE,
|
4406 | concatBytes: concatBytes,
|
4407 | createHmacDrbg: createHmacDrbg,
|
4408 | ensureBytes: ensureBytes,
|
4409 | equalBytes: equalBytes,
|
4410 | hexToBytes: hexToBytes,
|
4411 | hexToNumber: hexToNumber,
|
4412 | isBytes: isBytes,
|
4413 | numberToBytesBE: numberToBytesBE,
|
4414 | numberToBytesLE: numberToBytesLE,
|
4415 | numberToHexUnpadded: numberToHexUnpadded,
|
4416 | numberToVarBytesBE: numberToVarBytesBE,
|
4417 | utf8ToBytes: utf8ToBytes,
|
4418 | validateObject: validateObject
|
4419 | });
|
4420 |
|
4421 | /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
4422 | const _0n$7 = BigInt(0), _1n$7 = BigInt(1), _2n$5 = BigInt(2), _3n$1 = BigInt(3);
|
4423 | const _4n$1 = BigInt(4), _5n$1 = BigInt(5), _8n$1 = BigInt(8);
|
4424 | BigInt(9); BigInt(16);
|
4425 | function mod(a, b) {
|
4426 | const result = a % b;
|
4427 | return result >= _0n$7 ? result : b + result;
|
4428 | }
|
4429 | function pow(num, power, modulo) {
|
4430 | if (modulo <= _0n$7 || power < _0n$7)
|
4431 | throw new Error('Expected power/modulo > 0');
|
4432 | if (modulo === _1n$7)
|
4433 | return _0n$7;
|
4434 | let res = _1n$7;
|
4435 | while (power > _0n$7) {
|
4436 | if (power & _1n$7)
|
4437 | res = (res * num) % modulo;
|
4438 | num = (num * num) % modulo;
|
4439 | power >>= _1n$7;
|
4440 | }
|
4441 | return res;
|
4442 | }
|
4443 | function pow2(x, power, modulo) {
|
4444 | let res = x;
|
4445 | while (power-- > _0n$7) {
|
4446 | res *= res;
|
4447 | res %= modulo;
|
4448 | }
|
4449 | return res;
|
4450 | }
|
4451 | function invert(number, modulo) {
|
4452 | if (number === _0n$7 || modulo <= _0n$7) {
|
4453 | throw new Error(`invert: expected positive integers, got n=${number} mod=${modulo}`);
|
4454 | }
|
4455 | let a = mod(number, modulo);
|
4456 | let b = modulo;
|
4457 | let x = _0n$7, u = _1n$7;
|
4458 | while (a !== _0n$7) {
|
4459 | const q = b / a;
|
4460 | const r = b % a;
|
4461 | const m = x - u * q;
|
4462 | b = a, a = r, x = u, u = m;
|
4463 | }
|
4464 | const gcd = b;
|
4465 | if (gcd !== _1n$7)
|
4466 | throw new Error('invert: does not exist');
|
4467 | return mod(x, modulo);
|
4468 | }
|
4469 | function tonelliShanks(P) {
|
4470 | const legendreC = (P - _1n$7) / _2n$5;
|
4471 | let Q, S, Z;
|
4472 | for (Q = P - _1n$7, S = 0; Q % _2n$5 === _0n$7; Q /= _2n$5, S++)
|
4473 | ;
|
4474 | for (Z = _2n$5; Z < P && pow(Z, legendreC, P) !== P - _1n$7; Z++)
|
4475 | ;
|
4476 | if (S === 1) {
|
4477 | const p1div4 = (P + _1n$7) / _4n$1;
|
4478 | return function tonelliFast(Fp, n) {
|
4479 | const root = Fp.pow(n, p1div4);
|
4480 | if (!Fp.eql(Fp.sqr(root), n))
|
4481 | throw new Error('Cannot find square root');
|
4482 | return root;
|
4483 | };
|
4484 | }
|
4485 | const Q1div2 = (Q + _1n$7) / _2n$5;
|
4486 | return function tonelliSlow(Fp, n) {
|
4487 | if (Fp.pow(n, legendreC) === Fp.neg(Fp.ONE))
|
4488 | throw new Error('Cannot find square root');
|
4489 | let r = S;
|
4490 | let g = Fp.pow(Fp.mul(Fp.ONE, Z), Q);
|
4491 | let x = Fp.pow(n, Q1div2);
|
4492 | let b = Fp.pow(n, Q);
|
4493 | while (!Fp.eql(b, Fp.ONE)) {
|
4494 | if (Fp.eql(b, Fp.ZERO))
|
4495 | return Fp.ZERO;
|
4496 | let m = 1;
|
4497 | for (let t2 = Fp.sqr(b); m < r; m++) {
|
4498 | if (Fp.eql(t2, Fp.ONE))
|
4499 | break;
|
4500 | t2 = Fp.sqr(t2);
|
4501 | }
|
4502 | const ge = Fp.pow(g, _1n$7 << BigInt(r - m - 1));
|
4503 | g = Fp.sqr(ge);
|
4504 | x = Fp.mul(x, ge);
|
4505 | b = Fp.mul(b, g);
|
4506 | r = m;
|
4507 | }
|
4508 | return x;
|
4509 | };
|
4510 | }
|
4511 | function FpSqrt(P) {
|
4512 | if (P % _4n$1 === _3n$1) {
|
4513 | const p1div4 = (P + _1n$7) / _4n$1;
|
4514 | return function sqrt3mod4(Fp, n) {
|
4515 | const root = Fp.pow(n, p1div4);
|
4516 | if (!Fp.eql(Fp.sqr(root), n))
|
4517 | throw new Error('Cannot find square root');
|
4518 | return root;
|
4519 | };
|
4520 | }
|
4521 | if (P % _8n$1 === _5n$1) {
|
4522 | const c1 = (P - _5n$1) / _8n$1;
|
4523 | return function sqrt5mod8(Fp, n) {
|
4524 | const n2 = Fp.mul(n, _2n$5);
|
4525 | const v = Fp.pow(n2, c1);
|
4526 | const nv = Fp.mul(n, v);
|
4527 | const i = Fp.mul(Fp.mul(nv, _2n$5), v);
|
4528 | const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));
|
4529 | if (!Fp.eql(Fp.sqr(root), n))
|
4530 | throw new Error('Cannot find square root');
|
4531 | return root;
|
4532 | };
|
4533 | }
|
4534 | return tonelliShanks(P);
|
4535 | }
|
4536 | const isNegativeLE = (num, modulo) => (mod(num, modulo) & _1n$7) === _1n$7;
|
4537 | const FIELD_FIELDS = [
|
4538 | 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',
|
4539 | 'eql', 'add', 'sub', 'mul', 'pow', 'div',
|
4540 | 'addN', 'subN', 'mulN', 'sqrN'
|
4541 | ];
|
4542 | function validateField(field) {
|
4543 | const initial = {
|
4544 | ORDER: 'bigint',
|
4545 | MASK: 'bigint',
|
4546 | BYTES: 'isSafeInteger',
|
4547 | BITS: 'isSafeInteger',
|
4548 | };
|
4549 | const opts = FIELD_FIELDS.reduce((map, val) => {
|
4550 | map[val] = 'function';
|
4551 | return map;
|
4552 | }, initial);
|
4553 | return validateObject(field, opts);
|
4554 | }
|
4555 | function FpPow(f, num, power) {
|
4556 | if (power < _0n$7)
|
4557 | throw new Error('Expected power > 0');
|
4558 | if (power === _0n$7)
|
4559 | return f.ONE;
|
4560 | if (power === _1n$7)
|
4561 | return num;
|
4562 | let p = f.ONE;
|
4563 | let d = num;
|
4564 | while (power > _0n$7) {
|
4565 | if (power & _1n$7)
|
4566 | p = f.mul(p, d);
|
4567 | d = f.sqr(d);
|
4568 | power >>= _1n$7;
|
4569 | }
|
4570 | return p;
|
4571 | }
|
4572 | function FpInvertBatch(f, nums) {
|
4573 | const tmp = new Array(nums.length);
|
4574 | const lastMultiplied = nums.reduce((acc, num, i) => {
|
4575 | if (f.is0(num))
|
4576 | return acc;
|
4577 | tmp[i] = acc;
|
4578 | return f.mul(acc, num);
|
4579 | }, f.ONE);
|
4580 | const inverted = f.inv(lastMultiplied);
|
4581 | nums.reduceRight((acc, num, i) => {
|
4582 | if (f.is0(num))
|
4583 | return acc;
|
4584 | tmp[i] = f.mul(acc, tmp[i]);
|
4585 | return f.mul(acc, num);
|
4586 | }, inverted);
|
4587 | return tmp;
|
4588 | }
|
4589 | function nLength(n, nBitLength) {
|
4590 | const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;
|
4591 | const nByteLength = Math.ceil(_nBitLength / 8);
|
4592 | return { nBitLength: _nBitLength, nByteLength };
|
4593 | }
|
4594 | function Field(ORDER, bitLen, isLE = false, redef = {}) {
|
4595 | if (ORDER <= _0n$7)
|
4596 | throw new Error(`Expected Field ORDER > 0, got ${ORDER}`);
|
4597 | const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, bitLen);
|
4598 | if (BYTES > 2048)
|
4599 | throw new Error('Field lengths over 2048 bytes are not supported');
|
4600 | const sqrtP = FpSqrt(ORDER);
|
4601 | const f = Object.freeze({
|
4602 | ORDER,
|
4603 | BITS,
|
4604 | BYTES,
|
4605 | MASK: bitMask(BITS),
|
4606 | ZERO: _0n$7,
|
4607 | ONE: _1n$7,
|
4608 | create: (num) => mod(num, ORDER),
|
4609 | isValid: (num) => {
|
4610 | if (typeof num !== 'bigint')
|
4611 | throw new Error(`Invalid field element: expected bigint, got ${typeof num}`);
|
4612 | return _0n$7 <= num && num < ORDER;
|
4613 | },
|
4614 | is0: (num) => num === _0n$7,
|
4615 | isOdd: (num) => (num & _1n$7) === _1n$7,
|
4616 | neg: (num) => mod(-num, ORDER),
|
4617 | eql: (lhs, rhs) => lhs === rhs,
|
4618 | sqr: (num) => mod(num * num, ORDER),
|
4619 | add: (lhs, rhs) => mod(lhs + rhs, ORDER),
|
4620 | sub: (lhs, rhs) => mod(lhs - rhs, ORDER),
|
4621 | mul: (lhs, rhs) => mod(lhs * rhs, ORDER),
|
4622 | pow: (num, power) => FpPow(f, num, power),
|
4623 | div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),
|
4624 | sqrN: (num) => num * num,
|
4625 | addN: (lhs, rhs) => lhs + rhs,
|
4626 | subN: (lhs, rhs) => lhs - rhs,
|
4627 | mulN: (lhs, rhs) => lhs * rhs,
|
4628 | inv: (num) => invert(num, ORDER),
|
4629 | sqrt: redef.sqrt || ((n) => sqrtP(f, n)),
|
4630 | invertBatch: (lst) => FpInvertBatch(f, lst),
|
4631 | cmov: (a, b, c) => (c ? b : a),
|
4632 | toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)),
|
4633 | fromBytes: (bytes) => {
|
4634 | if (bytes.length !== BYTES)
|
4635 | throw new Error(`Fp.fromBytes: expected ${BYTES}, got ${bytes.length}`);
|
4636 | return isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);
|
4637 | },
|
4638 | });
|
4639 | return Object.freeze(f);
|
4640 | }
|
4641 | function FpSqrtEven(Fp, elm) {
|
4642 | if (!Fp.isOdd)
|
4643 | throw new Error(`Field doesn't have isOdd`);
|
4644 | const root = Fp.sqrt(elm);
|
4645 | return Fp.isOdd(root) ? Fp.neg(root) : root;
|
4646 | }
|
4647 | function getFieldBytesLength(fieldOrder) {
|
4648 | if (typeof fieldOrder !== 'bigint')
|
4649 | throw new Error('field order must be bigint');
|
4650 | const bitLength = fieldOrder.toString(2).length;
|
4651 | return Math.ceil(bitLength / 8);
|
4652 | }
|
4653 | function getMinHashLength(fieldOrder) {
|
4654 | const length = getFieldBytesLength(fieldOrder);
|
4655 | return length + Math.ceil(length / 2);
|
4656 | }
|
4657 | function mapHashToField(key, fieldOrder, isLE = false) {
|
4658 | const len = key.length;
|
4659 | const fieldLen = getFieldBytesLength(fieldOrder);
|
4660 | const minLen = getMinHashLength(fieldOrder);
|
4661 | if (len < 16 || len < minLen || len > 1024)
|
4662 | throw new Error(`expected ${minLen}-1024 bytes of input, got ${len}`);
|
4663 | const num = isLE ? bytesToNumberBE(key) : bytesToNumberLE(key);
|
4664 | const reduced = mod(num, fieldOrder - _1n$7) + _1n$7;
|
4665 | return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);
|
4666 | }
|
4667 |
|
4668 | /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
4669 | const _0n$6 = BigInt(0);
|
4670 | const _1n$6 = BigInt(1);
|
4671 | function wNAF(c, bits) {
|
4672 | const constTimeNegate = (condition, item) => {
|
4673 | const neg = item.negate();
|
4674 | return condition ? neg : item;
|
4675 | };
|
4676 | const opts = (W) => {
|
4677 | const windows = Math.ceil(bits / W) + 1;
|
4678 | const windowSize = 2 ** (W - 1);
|
4679 | return { windows, windowSize };
|
4680 | };
|
4681 | return {
|
4682 | constTimeNegate,
|
4683 | unsafeLadder(elm, n) {
|
4684 | let p = c.ZERO;
|
4685 | let d = elm;
|
4686 | while (n > _0n$6) {
|
4687 | if (n & _1n$6)
|
4688 | p = p.add(d);
|
4689 | d = d.double();
|
4690 | n >>= _1n$6;
|
4691 | }
|
4692 | return p;
|
4693 | },
|
4694 | precomputeWindow(elm, W) {
|
4695 | const { windows, windowSize } = opts(W);
|
4696 | const points = [];
|
4697 | let p = elm;
|
4698 | let base = p;
|
4699 | for (let window = 0; window < windows; window++) {
|
4700 | base = p;
|
4701 | points.push(base);
|
4702 | for (let i = 1; i < windowSize; i++) {
|
4703 | base = base.add(p);
|
4704 | points.push(base);
|
4705 | }
|
4706 | p = base.double();
|
4707 | }
|
4708 | return points;
|
4709 | },
|
4710 | wNAF(W, precomputes, n) {
|
4711 | const { windows, windowSize } = opts(W);
|
4712 | let p = c.ZERO;
|
4713 | let f = c.BASE;
|
4714 | const mask = BigInt(2 ** W - 1);
|
4715 | const maxNumber = 2 ** W;
|
4716 | const shiftBy = BigInt(W);
|
4717 | for (let window = 0; window < windows; window++) {
|
4718 | const offset = window * windowSize;
|
4719 | let wbits = Number(n & mask);
|
4720 | n >>= shiftBy;
|
4721 | if (wbits > windowSize) {
|
4722 | wbits -= maxNumber;
|
4723 | n += _1n$6;
|
4724 | }
|
4725 | const offset1 = offset;
|
4726 | const offset2 = offset + Math.abs(wbits) - 1;
|
4727 | const cond1 = window % 2 !== 0;
|
4728 | const cond2 = wbits < 0;
|
4729 | if (wbits === 0) {
|
4730 | f = f.add(constTimeNegate(cond1, precomputes[offset1]));
|
4731 | }
|
4732 | else {
|
4733 | p = p.add(constTimeNegate(cond2, precomputes[offset2]));
|
4734 | }
|
4735 | }
|
4736 | return { p, f };
|
4737 | },
|
4738 | wNAFCached(P, precomputesMap, n, transform) {
|
4739 | const W = P._WINDOW_SIZE || 1;
|
4740 | let comp = precomputesMap.get(P);
|
4741 | if (!comp) {
|
4742 | comp = this.precomputeWindow(P, W);
|
4743 | if (W !== 1) {
|
4744 | precomputesMap.set(P, transform(comp));
|
4745 | }
|
4746 | }
|
4747 | return this.wNAF(W, comp, n);
|
4748 | },
|
4749 | };
|
4750 | }
|
4751 | function validateBasic(curve) {
|
4752 | validateField(curve.Fp);
|
4753 | validateObject(curve, {
|
4754 | n: 'bigint',
|
4755 | h: 'bigint',
|
4756 | Gx: 'field',
|
4757 | Gy: 'field',
|
4758 | }, {
|
4759 | nBitLength: 'isSafeInteger',
|
4760 | nByteLength: 'isSafeInteger',
|
4761 | });
|
4762 | return Object.freeze({
|
4763 | ...nLength(curve.n, curve.nBitLength),
|
4764 | ...curve,
|
4765 | ...{ p: curve.Fp.ORDER },
|
4766 | });
|
4767 | }
|
4768 |
|
4769 | /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
4770 | function validatePointOpts(curve) {
|
4771 | const opts = validateBasic(curve);
|
4772 | validateObject(opts, {
|
4773 | a: 'field',
|
4774 | b: 'field',
|
4775 | }, {
|
4776 | allowedPrivateKeyLengths: 'array',
|
4777 | wrapPrivateKey: 'boolean',
|
4778 | isTorsionFree: 'function',
|
4779 | clearCofactor: 'function',
|
4780 | allowInfinityPoint: 'boolean',
|
4781 | fromBytes: 'function',
|
4782 | toBytes: 'function',
|
4783 | });
|
4784 | const { endo, Fp, a } = opts;
|
4785 | if (endo) {
|
4786 | if (!Fp.eql(a, Fp.ZERO)) {
|
4787 | throw new Error('Endomorphism can only be defined for Koblitz curves that have a=0');
|
4788 | }
|
4789 | if (typeof endo !== 'object' ||
|
4790 | typeof endo.beta !== 'bigint' ||
|
4791 | typeof endo.splitScalar !== 'function') {
|
4792 | throw new Error('Expected endomorphism with beta: bigint and splitScalar: function');
|
4793 | }
|
4794 | }
|
4795 | return Object.freeze({ ...opts });
|
4796 | }
|
4797 | const { bytesToNumberBE: b2n, hexToBytes: h2b } = ut;
|
4798 | const DER = {
|
4799 | Err: class DERErr extends Error {
|
4800 | constructor(m = '') {
|
4801 | super(m);
|
4802 | }
|
4803 | },
|
4804 | _parseInt(data) {
|
4805 | const { Err: E } = DER;
|
4806 | if (data.length < 2 || data[0] !== 0x02)
|
4807 | throw new E('Invalid signature integer tag');
|
4808 | const len = data[1];
|
4809 | const res = data.subarray(2, len + 2);
|
4810 | if (!len || res.length !== len)
|
4811 | throw new E('Invalid signature integer: wrong length');
|
4812 | if (res[0] & 0b10000000)
|
4813 | throw new E('Invalid signature integer: negative');
|
4814 | if (res[0] === 0x00 && !(res[1] & 0b10000000))
|
4815 | throw new E('Invalid signature integer: unnecessary leading zero');
|
4816 | return { d: b2n(res), l: data.subarray(len + 2) };
|
4817 | },
|
4818 | toSig(hex) {
|
4819 | const { Err: E } = DER;
|
4820 | const data = typeof hex === 'string' ? h2b(hex) : hex;
|
4821 | if (!isBytes(data))
|
4822 | throw new Error('ui8a expected');
|
4823 | let l = data.length;
|
4824 | if (l < 2 || data[0] != 0x30)
|
4825 | throw new E('Invalid signature tag');
|
4826 | if (data[1] !== l - 2)
|
4827 | throw new E('Invalid signature: incorrect length');
|
4828 | const { d: r, l: sBytes } = DER._parseInt(data.subarray(2));
|
4829 | const { d: s, l: rBytesLeft } = DER._parseInt(sBytes);
|
4830 | if (rBytesLeft.length)
|
4831 | throw new E('Invalid signature: left bytes after parsing');
|
4832 | return { r, s };
|
4833 | },
|
4834 | hexFromSig(sig) {
|
4835 | const slice = (s) => (Number.parseInt(s[0], 16) & 0b1000 ? '00' + s : s);
|
4836 | const h = (num) => {
|
4837 | const hex = num.toString(16);
|
4838 | return hex.length & 1 ? `0${hex}` : hex;
|
4839 | };
|
4840 | const s = slice(h(sig.s));
|
4841 | const r = slice(h(sig.r));
|
4842 | const shl = s.length / 2;
|
4843 | const rhl = r.length / 2;
|
4844 | const sl = h(shl);
|
4845 | const rl = h(rhl);
|
4846 | return `30${h(rhl + shl + 4)}02${rl}${r}02${sl}${s}`;
|
4847 | },
|
4848 | };
|
4849 | const _0n$5 = BigInt(0), _1n$5 = BigInt(1), _2n$4 = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);
|
4850 | function weierstrassPoints(opts) {
|
4851 | const CURVE = validatePointOpts(opts);
|
4852 | const { Fp } = CURVE;
|
4853 | const toBytes = CURVE.toBytes ||
|
4854 | ((_c, point, _isCompressed) => {
|
4855 | const a = point.toAffine();
|
4856 | return concatBytes(Uint8Array.from([0x04]), Fp.toBytes(a.x), Fp.toBytes(a.y));
|
4857 | });
|
4858 | const fromBytes = CURVE.fromBytes ||
|
4859 | ((bytes) => {
|
4860 | const tail = bytes.subarray(1);
|
4861 | const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));
|
4862 | const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));
|
4863 | return { x, y };
|
4864 | });
|
4865 | function weierstrassEquation(x) {
|
4866 | const { a, b } = CURVE;
|
4867 | const x2 = Fp.sqr(x);
|
4868 | const x3 = Fp.mul(x2, x);
|
4869 | return Fp.add(Fp.add(x3, Fp.mul(x, a)), b);
|
4870 | }
|
4871 | if (!Fp.eql(Fp.sqr(CURVE.Gy), weierstrassEquation(CURVE.Gx)))
|
4872 | throw new Error('bad generator point: equation left != right');
|
4873 | function isWithinCurveOrder(num) {
|
4874 | return typeof num === 'bigint' && _0n$5 < num && num < CURVE.n;
|
4875 | }
|
4876 | function assertGE(num) {
|
4877 | if (!isWithinCurveOrder(num))
|
4878 | throw new Error('Expected valid bigint: 0 < bigint < curve.n');
|
4879 | }
|
4880 | function normPrivateKeyToScalar(key) {
|
4881 | const { allowedPrivateKeyLengths: lengths, nByteLength, wrapPrivateKey, n } = CURVE;
|
4882 | if (lengths && typeof key !== 'bigint') {
|
4883 | if (isBytes(key))
|
4884 | key = bytesToHex(key);
|
4885 | if (typeof key !== 'string' || !lengths.includes(key.length))
|
4886 | throw new Error('Invalid key');
|
4887 | key = key.padStart(nByteLength * 2, '0');
|
4888 | }
|
4889 | let num;
|
4890 | try {
|
4891 | num =
|
4892 | typeof key === 'bigint'
|
4893 | ? key
|
4894 | : bytesToNumberBE(ensureBytes('private key', key, nByteLength));
|
4895 | }
|
4896 | catch (error) {
|
4897 | throw new Error(`private key must be ${nByteLength} bytes, hex or bigint, not ${typeof key}`);
|
4898 | }
|
4899 | if (wrapPrivateKey)
|
4900 | num = mod(num, n);
|
4901 | assertGE(num);
|
4902 | return num;
|
4903 | }
|
4904 | const pointPrecomputes = new Map();
|
4905 | function assertPrjPoint(other) {
|
4906 | if (!(other instanceof Point))
|
4907 | throw new Error('ProjectivePoint expected');
|
4908 | }
|
4909 | class Point {
|
4910 | constructor(px, py, pz) {
|
4911 | this.px = px;
|
4912 | this.py = py;
|
4913 | this.pz = pz;
|
4914 | if (px == null || !Fp.isValid(px))
|
4915 | throw new Error('x required');
|
4916 | if (py == null || !Fp.isValid(py))
|
4917 | throw new Error('y required');
|
4918 | if (pz == null || !Fp.isValid(pz))
|
4919 | throw new Error('z required');
|
4920 | }
|
4921 | static fromAffine(p) {
|
4922 | const { x, y } = p || {};
|
4923 | if (!p || !Fp.isValid(x) || !Fp.isValid(y))
|
4924 | throw new Error('invalid affine point');
|
4925 | if (p instanceof Point)
|
4926 | throw new Error('projective point not allowed');
|
4927 | const is0 = (i) => Fp.eql(i, Fp.ZERO);
|
4928 | if (is0(x) && is0(y))
|
4929 | return Point.ZERO;
|
4930 | return new Point(x, y, Fp.ONE);
|
4931 | }
|
4932 | get x() {
|
4933 | return this.toAffine().x;
|
4934 | }
|
4935 | get y() {
|
4936 | return this.toAffine().y;
|
4937 | }
|
4938 | static normalizeZ(points) {
|
4939 | const toInv = Fp.invertBatch(points.map((p) => p.pz));
|
4940 | return points.map((p, i) => p.toAffine(toInv[i])).map(Point.fromAffine);
|
4941 | }
|
4942 | static fromHex(hex) {
|
4943 | const P = Point.fromAffine(fromBytes(ensureBytes('pointHex', hex)));
|
4944 | P.assertValidity();
|
4945 | return P;
|
4946 | }
|
4947 | static fromPrivateKey(privateKey) {
|
4948 | return Point.BASE.multiply(normPrivateKeyToScalar(privateKey));
|
4949 | }
|
4950 | _setWindowSize(windowSize) {
|
4951 | this._WINDOW_SIZE = windowSize;
|
4952 | pointPrecomputes.delete(this);
|
4953 | }
|
4954 | assertValidity() {
|
4955 | if (this.is0()) {
|
4956 | if (CURVE.allowInfinityPoint && !Fp.is0(this.py))
|
4957 | return;
|
4958 | throw new Error('bad point: ZERO');
|
4959 | }
|
4960 | const { x, y } = this.toAffine();
|
4961 | if (!Fp.isValid(x) || !Fp.isValid(y))
|
4962 | throw new Error('bad point: x or y not FE');
|
4963 | const left = Fp.sqr(y);
|
4964 | const right = weierstrassEquation(x);
|
4965 | if (!Fp.eql(left, right))
|
4966 | throw new Error('bad point: equation left != right');
|
4967 | if (!this.isTorsionFree())
|
4968 | throw new Error('bad point: not in prime-order subgroup');
|
4969 | }
|
4970 | hasEvenY() {
|
4971 | const { y } = this.toAffine();
|
4972 | if (Fp.isOdd)
|
4973 | return !Fp.isOdd(y);
|
4974 | throw new Error("Field doesn't support isOdd");
|
4975 | }
|
4976 | equals(other) {
|
4977 | assertPrjPoint(other);
|
4978 | const { px: X1, py: Y1, pz: Z1 } = this;
|
4979 | const { px: X2, py: Y2, pz: Z2 } = other;
|
4980 | const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));
|
4981 | const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));
|
4982 | return U1 && U2;
|
4983 | }
|
4984 | negate() {
|
4985 | return new Point(this.px, Fp.neg(this.py), this.pz);
|
4986 | }
|
4987 | double() {
|
4988 | const { a, b } = CURVE;
|
4989 | const b3 = Fp.mul(b, _3n);
|
4990 | const { px: X1, py: Y1, pz: Z1 } = this;
|
4991 | let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO;
|
4992 | let t0 = Fp.mul(X1, X1);
|
4993 | let t1 = Fp.mul(Y1, Y1);
|
4994 | let t2 = Fp.mul(Z1, Z1);
|
4995 | let t3 = Fp.mul(X1, Y1);
|
4996 | t3 = Fp.add(t3, t3);
|
4997 | Z3 = Fp.mul(X1, Z1);
|
4998 | Z3 = Fp.add(Z3, Z3);
|
4999 | X3 = Fp.mul(a, Z3);
|
5000 | Y3 = Fp.mul(b3, t2);
|
5001 | Y3 = Fp.add(X3, Y3);
|
5002 | X3 = Fp.sub(t1, Y3);
|
5003 | Y3 = Fp.add(t1, Y3);
|
5004 | Y3 = Fp.mul(X3, Y3);
|
5005 | X3 = Fp.mul(t3, X3);
|
5006 | Z3 = Fp.mul(b3, Z3);
|
5007 | t2 = Fp.mul(a, t2);
|
5008 | t3 = Fp.sub(t0, t2);
|
5009 | t3 = Fp.mul(a, t3);
|
5010 | t3 = Fp.add(t3, Z3);
|
5011 | Z3 = Fp.add(t0, t0);
|
5012 | t0 = Fp.add(Z3, t0);
|
5013 | t0 = Fp.add(t0, t2);
|
5014 | t0 = Fp.mul(t0, t3);
|
5015 | Y3 = Fp.add(Y3, t0);
|
5016 | t2 = Fp.mul(Y1, Z1);
|
5017 | t2 = Fp.add(t2, t2);
|
5018 | t0 = Fp.mul(t2, t3);
|
5019 | X3 = Fp.sub(X3, t0);
|
5020 | Z3 = Fp.mul(t2, t1);
|
5021 | Z3 = Fp.add(Z3, Z3);
|
5022 | Z3 = Fp.add(Z3, Z3);
|
5023 | return new Point(X3, Y3, Z3);
|
5024 | }
|
5025 | add(other) {
|
5026 | assertPrjPoint(other);
|
5027 | const { px: X1, py: Y1, pz: Z1 } = this;
|
5028 | const { px: X2, py: Y2, pz: Z2 } = other;
|
5029 | let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO;
|
5030 | const a = CURVE.a;
|
5031 | const b3 = Fp.mul(CURVE.b, _3n);
|
5032 | let t0 = Fp.mul(X1, X2);
|
5033 | let t1 = Fp.mul(Y1, Y2);
|
5034 | let t2 = Fp.mul(Z1, Z2);
|
5035 | let t3 = Fp.add(X1, Y1);
|
5036 | let t4 = Fp.add(X2, Y2);
|
5037 | t3 = Fp.mul(t3, t4);
|
5038 | t4 = Fp.add(t0, t1);
|
5039 | t3 = Fp.sub(t3, t4);
|
5040 | t4 = Fp.add(X1, Z1);
|
5041 | let t5 = Fp.add(X2, Z2);
|
5042 | t4 = Fp.mul(t4, t5);
|
5043 | t5 = Fp.add(t0, t2);
|
5044 | t4 = Fp.sub(t4, t5);
|
5045 | t5 = Fp.add(Y1, Z1);
|
5046 | X3 = Fp.add(Y2, Z2);
|
5047 | t5 = Fp.mul(t5, X3);
|
5048 | X3 = Fp.add(t1, t2);
|
5049 | t5 = Fp.sub(t5, X3);
|
5050 | Z3 = Fp.mul(a, t4);
|
5051 | X3 = Fp.mul(b3, t2);
|
5052 | Z3 = Fp.add(X3, Z3);
|
5053 | X3 = Fp.sub(t1, Z3);
|
5054 | Z3 = Fp.add(t1, Z3);
|
5055 | Y3 = Fp.mul(X3, Z3);
|
5056 | t1 = Fp.add(t0, t0);
|
5057 | t1 = Fp.add(t1, t0);
|
5058 | t2 = Fp.mul(a, t2);
|
5059 | t4 = Fp.mul(b3, t4);
|
5060 | t1 = Fp.add(t1, t2);
|
5061 | t2 = Fp.sub(t0, t2);
|
5062 | t2 = Fp.mul(a, t2);
|
5063 | t4 = Fp.add(t4, t2);
|
5064 | t0 = Fp.mul(t1, t4);
|
5065 | Y3 = Fp.add(Y3, t0);
|
5066 | t0 = Fp.mul(t5, t4);
|
5067 | X3 = Fp.mul(t3, X3);
|
5068 | X3 = Fp.sub(X3, t0);
|
5069 | t0 = Fp.mul(t3, t1);
|
5070 | Z3 = Fp.mul(t5, Z3);
|
5071 | Z3 = Fp.add(Z3, t0);
|
5072 | return new Point(X3, Y3, Z3);
|
5073 | }
|
5074 | subtract(other) {
|
5075 | return this.add(other.negate());
|
5076 | }
|
5077 | is0() {
|
5078 | return this.equals(Point.ZERO);
|
5079 | }
|
5080 | wNAF(n) {
|
5081 | return wnaf.wNAFCached(this, pointPrecomputes, n, (comp) => {
|
5082 | const toInv = Fp.invertBatch(comp.map((p) => p.pz));
|
5083 | return comp.map((p, i) => p.toAffine(toInv[i])).map(Point.fromAffine);
|
5084 | });
|
5085 | }
|
5086 | multiplyUnsafe(n) {
|
5087 | const I = Point.ZERO;
|
5088 | if (n === _0n$5)
|
5089 | return I;
|
5090 | assertGE(n);
|
5091 | if (n === _1n$5)
|
5092 | return this;
|
5093 | const { endo } = CURVE;
|
5094 | if (!endo)
|
5095 | return wnaf.unsafeLadder(this, n);
|
5096 | let { k1neg, k1, k2neg, k2 } = endo.splitScalar(n);
|
5097 | let k1p = I;
|
5098 | let k2p = I;
|
5099 | let d = this;
|
5100 | while (k1 > _0n$5 || k2 > _0n$5) {
|
5101 | if (k1 & _1n$5)
|
5102 | k1p = k1p.add(d);
|
5103 | if (k2 & _1n$5)
|
5104 | k2p = k2p.add(d);
|
5105 | d = d.double();
|
5106 | k1 >>= _1n$5;
|
5107 | k2 >>= _1n$5;
|
5108 | }
|
5109 | if (k1neg)
|
5110 | k1p = k1p.negate();
|
5111 | if (k2neg)
|
5112 | k2p = k2p.negate();
|
5113 | k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz);
|
5114 | return k1p.add(k2p);
|
5115 | }
|
5116 | multiply(scalar) {
|
5117 | assertGE(scalar);
|
5118 | let n = scalar;
|
5119 | let point, fake;
|
5120 | const { endo } = CURVE;
|
5121 | if (endo) {
|
5122 | const { k1neg, k1, k2neg, k2 } = endo.splitScalar(n);
|
5123 | let { p: k1p, f: f1p } = this.wNAF(k1);
|
5124 | let { p: k2p, f: f2p } = this.wNAF(k2);
|
5125 | k1p = wnaf.constTimeNegate(k1neg, k1p);
|
5126 | k2p = wnaf.constTimeNegate(k2neg, k2p);
|
5127 | k2p = new Point(Fp.mul(k2p.px, endo.beta), k2p.py, k2p.pz);
|
5128 | point = k1p.add(k2p);
|
5129 | fake = f1p.add(f2p);
|
5130 | }
|
5131 | else {
|
5132 | const { p, f } = this.wNAF(n);
|
5133 | point = p;
|
5134 | fake = f;
|
5135 | }
|
5136 | return Point.normalizeZ([point, fake])[0];
|
5137 | }
|
5138 | multiplyAndAddUnsafe(Q, a, b) {
|
5139 | const G = Point.BASE;
|
5140 | const mul = (P, a
|
5141 | ) => (a === _0n$5 || a === _1n$5 || !P.equals(G) ? P.multiplyUnsafe(a) : P.multiply(a));
|
5142 | const sum = mul(this, a).add(mul(Q, b));
|
5143 | return sum.is0() ? undefined : sum;
|
5144 | }
|
5145 | toAffine(iz) {
|
5146 | const { px: x, py: y, pz: z } = this;
|
5147 | const is0 = this.is0();
|
5148 | if (iz == null)
|
5149 | iz = is0 ? Fp.ONE : Fp.inv(z);
|
5150 | const ax = Fp.mul(x, iz);
|
5151 | const ay = Fp.mul(y, iz);
|
5152 | const zz = Fp.mul(z, iz);
|
5153 | if (is0)
|
5154 | return { x: Fp.ZERO, y: Fp.ZERO };
|
5155 | if (!Fp.eql(zz, Fp.ONE))
|
5156 | throw new Error('invZ was invalid');
|
5157 | return { x: ax, y: ay };
|
5158 | }
|
5159 | isTorsionFree() {
|
5160 | const { h: cofactor, isTorsionFree } = CURVE;
|
5161 | if (cofactor === _1n$5)
|
5162 | return true;
|
5163 | if (isTorsionFree)
|
5164 | return isTorsionFree(Point, this);
|
5165 | throw new Error('isTorsionFree() has not been declared for the elliptic curve');
|
5166 | }
|
5167 | clearCofactor() {
|
5168 | const { h: cofactor, clearCofactor } = CURVE;
|
5169 | if (cofactor === _1n$5)
|
5170 | return this;
|
5171 | if (clearCofactor)
|
5172 | return clearCofactor(Point, this);
|
5173 | return this.multiplyUnsafe(CURVE.h);
|
5174 | }
|
5175 | toRawBytes(isCompressed = true) {
|
5176 | this.assertValidity();
|
5177 | return toBytes(Point, this, isCompressed);
|
5178 | }
|
5179 | toHex(isCompressed = true) {
|
5180 | return bytesToHex(this.toRawBytes(isCompressed));
|
5181 | }
|
5182 | }
|
5183 | Point.BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);
|
5184 | Point.ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO);
|
5185 | const _bits = CURVE.nBitLength;
|
5186 | const wnaf = wNAF(Point, CURVE.endo ? Math.ceil(_bits / 2) : _bits);
|
5187 | return {
|
5188 | CURVE,
|
5189 | ProjectivePoint: Point,
|
5190 | normPrivateKeyToScalar,
|
5191 | weierstrassEquation,
|
5192 | isWithinCurveOrder,
|
5193 | };
|
5194 | }
|
5195 | function validateOpts$2(curve) {
|
5196 | const opts = validateBasic(curve);
|
5197 | validateObject(opts, {
|
5198 | hash: 'hash',
|
5199 | hmac: 'function',
|
5200 | randomBytes: 'function',
|
5201 | }, {
|
5202 | bits2int: 'function',
|
5203 | bits2int_modN: 'function',
|
5204 | lowS: 'boolean',
|
5205 | });
|
5206 | return Object.freeze({ lowS: true, ...opts });
|
5207 | }
|
5208 | function weierstrass(curveDef) {
|
5209 | const CURVE = validateOpts$2(curveDef);
|
5210 | const { Fp, n: CURVE_ORDER } = CURVE;
|
5211 | const compressedLen = Fp.BYTES + 1;
|
5212 | const uncompressedLen = 2 * Fp.BYTES + 1;
|
5213 | function isValidFieldElement(num) {
|
5214 | return _0n$5 < num && num < Fp.ORDER;
|
5215 | }
|
5216 | function modN(a) {
|
5217 | return mod(a, CURVE_ORDER);
|
5218 | }
|
5219 | function invN(a) {
|
5220 | return invert(a, CURVE_ORDER);
|
5221 | }
|
5222 | const { ProjectivePoint: Point, normPrivateKeyToScalar, weierstrassEquation, isWithinCurveOrder, } = weierstrassPoints({
|
5223 | ...CURVE,
|
5224 | toBytes(_c, point, isCompressed) {
|
5225 | const a = point.toAffine();
|
5226 | const x = Fp.toBytes(a.x);
|
5227 | const cat = concatBytes;
|
5228 | if (isCompressed) {
|
5229 | return cat(Uint8Array.from([point.hasEvenY() ? 0x02 : 0x03]), x);
|
5230 | }
|
5231 | else {
|
5232 | return cat(Uint8Array.from([0x04]), x, Fp.toBytes(a.y));
|
5233 | }
|
5234 | },
|
5235 | fromBytes(bytes) {
|
5236 | const len = bytes.length;
|
5237 | const head = bytes[0];
|
5238 | const tail = bytes.subarray(1);
|
5239 | if (len === compressedLen && (head === 0x02 || head === 0x03)) {
|
5240 | const x = bytesToNumberBE(tail);
|
5241 | if (!isValidFieldElement(x))
|
5242 | throw new Error('Point is not on curve');
|
5243 | const y2 = weierstrassEquation(x);
|
5244 | let y = Fp.sqrt(y2);
|
5245 | const isYOdd = (y & _1n$5) === _1n$5;
|
5246 | const isHeadOdd = (head & 1) === 1;
|
5247 | if (isHeadOdd !== isYOdd)
|
5248 | y = Fp.neg(y);
|
5249 | return { x, y };
|
5250 | }
|
5251 | else if (len === uncompressedLen && head === 0x04) {
|
5252 | const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));
|
5253 | const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));
|
5254 | return { x, y };
|
5255 | }
|
5256 | else {
|
5257 | throw new Error(`Point of length ${len} was invalid. Expected ${compressedLen} compressed bytes or ${uncompressedLen} uncompressed bytes`);
|
5258 | }
|
5259 | },
|
5260 | });
|
5261 | const numToNByteStr = (num) => bytesToHex(numberToBytesBE(num, CURVE.nByteLength));
|
5262 | function isBiggerThanHalfOrder(number) {
|
5263 | const HALF = CURVE_ORDER >> _1n$5;
|
5264 | return number > HALF;
|
5265 | }
|
5266 | function normalizeS(s) {
|
5267 | return isBiggerThanHalfOrder(s) ? modN(-s) : s;
|
5268 | }
|
5269 | const slcNum = (b, from, to) => bytesToNumberBE(b.slice(from, to));
|
5270 | class Signature {
|
5271 | constructor(r, s, recovery) {
|
5272 | this.r = r;
|
5273 | this.s = s;
|
5274 | this.recovery = recovery;
|
5275 | this.assertValidity();
|
5276 | }
|
5277 | static fromCompact(hex) {
|
5278 | const l = CURVE.nByteLength;
|
5279 | hex = ensureBytes('compactSignature', hex, l * 2);
|
5280 | return new Signature(slcNum(hex, 0, l), slcNum(hex, l, 2 * l));
|
5281 | }
|
5282 | static fromDER(hex) {
|
5283 | const { r, s } = DER.toSig(ensureBytes('DER', hex));
|
5284 | return new Signature(r, s);
|
5285 | }
|
5286 | assertValidity() {
|
5287 | if (!isWithinCurveOrder(this.r))
|
5288 | throw new Error('r must be 0 < r < CURVE.n');
|
5289 | if (!isWithinCurveOrder(this.s))
|
5290 | throw new Error('s must be 0 < s < CURVE.n');
|
5291 | }
|
5292 | addRecoveryBit(recovery) {
|
5293 | return new Signature(this.r, this.s, recovery);
|
5294 | }
|
5295 | recoverPublicKey(msgHash) {
|
5296 | const { r, s, recovery: rec } = this;
|
5297 | const h = bits2int_modN(ensureBytes('msgHash', msgHash));
|
5298 | if (rec == null || ![0, 1, 2, 3].includes(rec))
|
5299 | throw new Error('recovery id invalid');
|
5300 | const radj = rec === 2 || rec === 3 ? r + CURVE.n : r;
|
5301 | if (radj >= Fp.ORDER)
|
5302 | throw new Error('recovery id 2 or 3 invalid');
|
5303 | const prefix = (rec & 1) === 0 ? '02' : '03';
|
5304 | const R = Point.fromHex(prefix + numToNByteStr(radj));
|
5305 | const ir = invN(radj);
|
5306 | const u1 = modN(-h * ir);
|
5307 | const u2 = modN(s * ir);
|
5308 | const Q = Point.BASE.multiplyAndAddUnsafe(R, u1, u2);
|
5309 | if (!Q)
|
5310 | throw new Error('point at infinify');
|
5311 | Q.assertValidity();
|
5312 | return Q;
|
5313 | }
|
5314 | hasHighS() {
|
5315 | return isBiggerThanHalfOrder(this.s);
|
5316 | }
|
5317 | normalizeS() {
|
5318 | return this.hasHighS() ? new Signature(this.r, modN(-this.s), this.recovery) : this;
|
5319 | }
|
5320 | toDERRawBytes() {
|
5321 | return hexToBytes(this.toDERHex());
|
5322 | }
|
5323 | toDERHex() {
|
5324 | return DER.hexFromSig({ r: this.r, s: this.s });
|
5325 | }
|
5326 | toCompactRawBytes() {
|
5327 | return hexToBytes(this.toCompactHex());
|
5328 | }
|
5329 | toCompactHex() {
|
5330 | return numToNByteStr(this.r) + numToNByteStr(this.s);
|
5331 | }
|
5332 | }
|
5333 | const utils = {
|
5334 | isValidPrivateKey(privateKey) {
|
5335 | try {
|
5336 | normPrivateKeyToScalar(privateKey);
|
5337 | return true;
|
5338 | }
|
5339 | catch (error) {
|
5340 | return false;
|
5341 | }
|
5342 | },
|
5343 | normPrivateKeyToScalar: normPrivateKeyToScalar,
|
5344 | randomPrivateKey: () => {
|
5345 | const length = getMinHashLength(CURVE.n);
|
5346 | return mapHashToField(CURVE.randomBytes(length), CURVE.n);
|
5347 | },
|
5348 | precompute(windowSize = 8, point = Point.BASE) {
|
5349 | point._setWindowSize(windowSize);
|
5350 | point.multiply(BigInt(3));
|
5351 | return point;
|
5352 | },
|
5353 | };
|
5354 | function getPublicKey(privateKey, isCompressed = true) {
|
5355 | return Point.fromPrivateKey(privateKey).toRawBytes(isCompressed);
|
5356 | }
|
5357 | function isProbPub(item) {
|
5358 | const arr = isBytes(item);
|
5359 | const str = typeof item === 'string';
|
5360 | const len = (arr || str) && item.length;
|
5361 | if (arr)
|
5362 | return len === compressedLen || len === uncompressedLen;
|
5363 | if (str)
|
5364 | return len === 2 * compressedLen || len === 2 * uncompressedLen;
|
5365 | if (item instanceof Point)
|
5366 | return true;
|
5367 | return false;
|
5368 | }
|
5369 | function getSharedSecret(privateA, publicB, isCompressed = true) {
|
5370 | if (isProbPub(privateA))
|
5371 | throw new Error('first arg must be private key');
|
5372 | if (!isProbPub(publicB))
|
5373 | throw new Error('second arg must be public key');
|
5374 | const b = Point.fromHex(publicB);
|
5375 | return b.multiply(normPrivateKeyToScalar(privateA)).toRawBytes(isCompressed);
|
5376 | }
|
5377 | const bits2int = CURVE.bits2int ||
|
5378 | function (bytes) {
|
5379 | const num = bytesToNumberBE(bytes);
|
5380 | const delta = bytes.length * 8 - CURVE.nBitLength;
|
5381 | return delta > 0 ? num >> BigInt(delta) : num;
|
5382 | };
|
5383 | const bits2int_modN = CURVE.bits2int_modN ||
|
5384 | function (bytes) {
|
5385 | return modN(bits2int(bytes));
|
5386 | };
|
5387 | const ORDER_MASK = bitMask(CURVE.nBitLength);
|
5388 | function int2octets(num) {
|
5389 | if (typeof num !== 'bigint')
|
5390 | throw new Error('bigint expected');
|
5391 | if (!(_0n$5 <= num && num < ORDER_MASK))
|
5392 | throw new Error(`bigint expected < 2^${CURVE.nBitLength}`);
|
5393 | return numberToBytesBE(num, CURVE.nByteLength);
|
5394 | }
|
5395 | function prepSig(msgHash, privateKey, opts = defaultSigOpts) {
|
5396 | if (['recovered', 'canonical'].some((k) => k in opts))
|
5397 | throw new Error('sign() legacy options not supported');
|
5398 | const { hash, randomBytes } = CURVE;
|
5399 | let { lowS, prehash, extraEntropy: ent } = opts;
|
5400 | if (lowS == null)
|
5401 | lowS = true;
|
5402 | msgHash = ensureBytes('msgHash', msgHash);
|
5403 | if (prehash)
|
5404 | msgHash = ensureBytes('prehashed msgHash', hash(msgHash));
|
5405 | const h1int = bits2int_modN(msgHash);
|
5406 | const d = normPrivateKeyToScalar(privateKey);
|
5407 | const seedArgs = [int2octets(d), int2octets(h1int)];
|
5408 | if (ent != null) {
|
5409 | const e = ent === true ? randomBytes(Fp.BYTES) : ent;
|
5410 | seedArgs.push(ensureBytes('extraEntropy', e));
|
5411 | }
|
5412 | const seed = concatBytes(...seedArgs);
|
5413 | const m = h1int;
|
5414 | function k2sig(kBytes) {
|
5415 | const k = bits2int(kBytes);
|
5416 | if (!isWithinCurveOrder(k))
|
5417 | return;
|
5418 | const ik = invN(k);
|
5419 | const q = Point.BASE.multiply(k).toAffine();
|
5420 | const r = modN(q.x);
|
5421 | if (r === _0n$5)
|
5422 | return;
|
5423 | const s = modN(ik * modN(m + r * d));
|
5424 | if (s === _0n$5)
|
5425 | return;
|
5426 | let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n$5);
|
5427 | let normS = s;
|
5428 | if (lowS && isBiggerThanHalfOrder(s)) {
|
5429 | normS = normalizeS(s);
|
5430 | recovery ^= 1;
|
5431 | }
|
5432 | return new Signature(r, normS, recovery);
|
5433 | }
|
5434 | return { seed, k2sig };
|
5435 | }
|
5436 | const defaultSigOpts = { lowS: CURVE.lowS, prehash: false };
|
5437 | const defaultVerOpts = { lowS: CURVE.lowS, prehash: false };
|
5438 | function sign(msgHash, privKey, opts = defaultSigOpts) {
|
5439 | const { seed, k2sig } = prepSig(msgHash, privKey, opts);
|
5440 | const C = CURVE;
|
5441 | const drbg = createHmacDrbg(C.hash.outputLen, C.nByteLength, C.hmac);
|
5442 | return drbg(seed, k2sig);
|
5443 | }
|
5444 | Point.BASE._setWindowSize(8);
|
5445 | function verify(signature, msgHash, publicKey, opts = defaultVerOpts) {
|
5446 | const sg = signature;
|
5447 | msgHash = ensureBytes('msgHash', msgHash);
|
5448 | publicKey = ensureBytes('publicKey', publicKey);
|
5449 | if ('strict' in opts)
|
5450 | throw new Error('options.strict was renamed to lowS');
|
5451 | const { lowS, prehash } = opts;
|
5452 | let _sig = undefined;
|
5453 | let P;
|
5454 | try {
|
5455 | if (typeof sg === 'string' || isBytes(sg)) {
|
5456 | try {
|
5457 | _sig = Signature.fromDER(sg);
|
5458 | }
|
5459 | catch (derError) {
|
5460 | if (!(derError instanceof DER.Err))
|
5461 | throw derError;
|
5462 | _sig = Signature.fromCompact(sg);
|
5463 | }
|
5464 | }
|
5465 | else if (typeof sg === 'object' && typeof sg.r === 'bigint' && typeof sg.s === 'bigint') {
|
5466 | const { r, s } = sg;
|
5467 | _sig = new Signature(r, s);
|
5468 | }
|
5469 | else {
|
5470 | throw new Error('PARSE');
|
5471 | }
|
5472 | P = Point.fromHex(publicKey);
|
5473 | }
|
5474 | catch (error) {
|
5475 | if (error.message === 'PARSE')
|
5476 | throw new Error(`signature must be Signature instance, Uint8Array or hex string`);
|
5477 | return false;
|
5478 | }
|
5479 | if (lowS && _sig.hasHighS())
|
5480 | return false;
|
5481 | if (prehash)
|
5482 | msgHash = CURVE.hash(msgHash);
|
5483 | const { r, s } = _sig;
|
5484 | const h = bits2int_modN(msgHash);
|
5485 | const is = invN(s);
|
5486 | const u1 = modN(h * is);
|
5487 | const u2 = modN(r * is);
|
5488 | const R = Point.BASE.multiplyAndAddUnsafe(P, u1, u2)?.toAffine();
|
5489 | if (!R)
|
5490 | return false;
|
5491 | const v = modN(R.x);
|
5492 | return v === r;
|
5493 | }
|
5494 | return {
|
5495 | CURVE,
|
5496 | getPublicKey,
|
5497 | getSharedSecret,
|
5498 | sign,
|
5499 | verify,
|
5500 | ProjectivePoint: Point,
|
5501 | Signature,
|
5502 | utils,
|
5503 | };
|
5504 | }
|
5505 | function SWUFpSqrtRatio(Fp, Z) {
|
5506 | const q = Fp.ORDER;
|
5507 | let l = _0n$5;
|
5508 | for (let o = q - _1n$5; o % _2n$4 === _0n$5; o /= _2n$4)
|
5509 | l += _1n$5;
|
5510 | const c1 = l;
|
5511 | const _2n_pow_c1_1 = _2n$4 << (c1 - _1n$5 - _1n$5);
|
5512 | const _2n_pow_c1 = _2n_pow_c1_1 * _2n$4;
|
5513 | const c2 = (q - _1n$5) / _2n_pow_c1;
|
5514 | const c3 = (c2 - _1n$5) / _2n$4;
|
5515 | const c4 = _2n_pow_c1 - _1n$5;
|
5516 | const c5 = _2n_pow_c1_1;
|
5517 | const c6 = Fp.pow(Z, c2);
|
5518 | const c7 = Fp.pow(Z, (c2 + _1n$5) / _2n$4);
|
5519 | let sqrtRatio = (u, v) => {
|
5520 | let tv1 = c6;
|
5521 | let tv2 = Fp.pow(v, c4);
|
5522 | let tv3 = Fp.sqr(tv2);
|
5523 | tv3 = Fp.mul(tv3, v);
|
5524 | let tv5 = Fp.mul(u, tv3);
|
5525 | tv5 = Fp.pow(tv5, c3);
|
5526 | tv5 = Fp.mul(tv5, tv2);
|
5527 | tv2 = Fp.mul(tv5, v);
|
5528 | tv3 = Fp.mul(tv5, u);
|
5529 | let tv4 = Fp.mul(tv3, tv2);
|
5530 | tv5 = Fp.pow(tv4, c5);
|
5531 | let isQR = Fp.eql(tv5, Fp.ONE);
|
5532 | tv2 = Fp.mul(tv3, c7);
|
5533 | tv5 = Fp.mul(tv4, tv1);
|
5534 | tv3 = Fp.cmov(tv2, tv3, isQR);
|
5535 | tv4 = Fp.cmov(tv5, tv4, isQR);
|
5536 | for (let i = c1; i > _1n$5; i--) {
|
5537 | let tv5 = i - _2n$4;
|
5538 | tv5 = _2n$4 << (tv5 - _1n$5);
|
5539 | let tvv5 = Fp.pow(tv4, tv5);
|
5540 | const e1 = Fp.eql(tvv5, Fp.ONE);
|
5541 | tv2 = Fp.mul(tv3, tv1);
|
5542 | tv1 = Fp.mul(tv1, tv1);
|
5543 | tvv5 = Fp.mul(tv4, tv1);
|
5544 | tv3 = Fp.cmov(tv2, tv3, e1);
|
5545 | tv4 = Fp.cmov(tvv5, tv4, e1);
|
5546 | }
|
5547 | return { isValid: isQR, value: tv3 };
|
5548 | };
|
5549 | if (Fp.ORDER % _4n === _3n) {
|
5550 | const c1 = (Fp.ORDER - _3n) / _4n;
|
5551 | const c2 = Fp.sqrt(Fp.neg(Z));
|
5552 | sqrtRatio = (u, v) => {
|
5553 | let tv1 = Fp.sqr(v);
|
5554 | const tv2 = Fp.mul(u, v);
|
5555 | tv1 = Fp.mul(tv1, tv2);
|
5556 | let y1 = Fp.pow(tv1, c1);
|
5557 | y1 = Fp.mul(y1, tv2);
|
5558 | const y2 = Fp.mul(y1, c2);
|
5559 | const tv3 = Fp.mul(Fp.sqr(y1), v);
|
5560 | const isQR = Fp.eql(tv3, u);
|
5561 | let y = Fp.cmov(y2, y1, isQR);
|
5562 | return { isValid: isQR, value: y };
|
5563 | };
|
5564 | }
|
5565 | return sqrtRatio;
|
5566 | }
|
5567 | function mapToCurveSimpleSWU(Fp, opts) {
|
5568 | validateField(Fp);
|
5569 | if (!Fp.isValid(opts.A) || !Fp.isValid(opts.B) || !Fp.isValid(opts.Z))
|
5570 | throw new Error('mapToCurveSimpleSWU: invalid opts');
|
5571 | const sqrtRatio = SWUFpSqrtRatio(Fp, opts.Z);
|
5572 | if (!Fp.isOdd)
|
5573 | throw new Error('Fp.isOdd is not implemented!');
|
5574 | return (u) => {
|
5575 | let tv1, tv2, tv3, tv4, tv5, tv6, x, y;
|
5576 | tv1 = Fp.sqr(u);
|
5577 | tv1 = Fp.mul(tv1, opts.Z);
|
5578 | tv2 = Fp.sqr(tv1);
|
5579 | tv2 = Fp.add(tv2, tv1);
|
5580 | tv3 = Fp.add(tv2, Fp.ONE);
|
5581 | tv3 = Fp.mul(tv3, opts.B);
|
5582 | tv4 = Fp.cmov(opts.Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO));
|
5583 | tv4 = Fp.mul(tv4, opts.A);
|
5584 | tv2 = Fp.sqr(tv3);
|
5585 | tv6 = Fp.sqr(tv4);
|
5586 | tv5 = Fp.mul(tv6, opts.A);
|
5587 | tv2 = Fp.add(tv2, tv5);
|
5588 | tv2 = Fp.mul(tv2, tv3);
|
5589 | tv6 = Fp.mul(tv6, tv4);
|
5590 | tv5 = Fp.mul(tv6, opts.B);
|
5591 | tv2 = Fp.add(tv2, tv5);
|
5592 | x = Fp.mul(tv1, tv3);
|
5593 | const { isValid, value } = sqrtRatio(tv2, tv6);
|
5594 | y = Fp.mul(tv1, u);
|
5595 | y = Fp.mul(y, value);
|
5596 | x = Fp.cmov(x, tv3, isValid);
|
5597 | y = Fp.cmov(y, value, isValid);
|
5598 | const e1 = Fp.isOdd(u) === Fp.isOdd(y);
|
5599 | y = Fp.cmov(Fp.neg(y), y, e1);
|
5600 | x = Fp.div(x, tv4);
|
5601 | return { x, y };
|
5602 | };
|
5603 | }
|
5604 |
|
5605 | function validateDST(dst) {
|
5606 | if (isBytes(dst))
|
5607 | return dst;
|
5608 | if (typeof dst === 'string')
|
5609 | return utf8ToBytes(dst);
|
5610 | throw new Error('DST must be Uint8Array or string');
|
5611 | }
|
5612 | const os2ip = bytesToNumberBE;
|
5613 | function i2osp(value, length) {
|
5614 | if (value < 0 || value >= 1 << (8 * length)) {
|
5615 | throw new Error(`bad I2OSP call: value=${value} length=${length}`);
|
5616 | }
|
5617 | const res = Array.from({ length }).fill(0);
|
5618 | for (let i = length - 1; i >= 0; i--) {
|
5619 | res[i] = value & 0xff;
|
5620 | value >>>= 8;
|
5621 | }
|
5622 | return new Uint8Array(res);
|
5623 | }
|
5624 | function strxor(a, b) {
|
5625 | const arr = new Uint8Array(a.length);
|
5626 | for (let i = 0; i < a.length; i++) {
|
5627 | arr[i] = a[i] ^ b[i];
|
5628 | }
|
5629 | return arr;
|
5630 | }
|
5631 | function abytes(item) {
|
5632 | if (!isBytes(item))
|
5633 | throw new Error('Uint8Array expected');
|
5634 | }
|
5635 | function isNum(item) {
|
5636 | if (!Number.isSafeInteger(item))
|
5637 | throw new Error('number expected');
|
5638 | }
|
5639 | function expand_message_xmd(msg, DST, lenInBytes, H) {
|
5640 | abytes(msg);
|
5641 | abytes(DST);
|
5642 | isNum(lenInBytes);
|
5643 | if (DST.length > 255)
|
5644 | DST = H(concatBytes(utf8ToBytes('H2C-OVERSIZE-DST-'), DST));
|
5645 | const { outputLen: b_in_bytes, blockLen: r_in_bytes } = H;
|
5646 | const ell = Math.ceil(lenInBytes / b_in_bytes);
|
5647 | if (ell > 255)
|
5648 | throw new Error('Invalid xmd length');
|
5649 | const DST_prime = concatBytes(DST, i2osp(DST.length, 1));
|
5650 | const Z_pad = i2osp(0, r_in_bytes);
|
5651 | const l_i_b_str = i2osp(lenInBytes, 2);
|
5652 | const b = new Array(ell);
|
5653 | const b_0 = H(concatBytes(Z_pad, msg, l_i_b_str, i2osp(0, 1), DST_prime));
|
5654 | b[0] = H(concatBytes(b_0, i2osp(1, 1), DST_prime));
|
5655 | for (let i = 1; i <= ell; i++) {
|
5656 | const args = [strxor(b_0, b[i - 1]), i2osp(i + 1, 1), DST_prime];
|
5657 | b[i] = H(concatBytes(...args));
|
5658 | }
|
5659 | const pseudo_random_bytes = concatBytes(...b);
|
5660 | return pseudo_random_bytes.slice(0, lenInBytes);
|
5661 | }
|
5662 | function expand_message_xof(msg, DST, lenInBytes, k, H) {
|
5663 | abytes(msg);
|
5664 | abytes(DST);
|
5665 | isNum(lenInBytes);
|
5666 | if (DST.length > 255) {
|
5667 | const dkLen = Math.ceil((2 * k) / 8);
|
5668 | DST = H.create({ dkLen }).update(utf8ToBytes('H2C-OVERSIZE-DST-')).update(DST).digest();
|
5669 | }
|
5670 | if (lenInBytes > 65535 || DST.length > 255)
|
5671 | throw new Error('expand_message_xof: invalid lenInBytes');
|
5672 | return (H.create({ dkLen: lenInBytes })
|
5673 | .update(msg)
|
5674 | .update(i2osp(lenInBytes, 2))
|
5675 | .update(DST)
|
5676 | .update(i2osp(DST.length, 1))
|
5677 | .digest());
|
5678 | }
|
5679 | function hash_to_field(msg, count, options) {
|
5680 | validateObject(options, {
|
5681 | DST: 'stringOrUint8Array',
|
5682 | p: 'bigint',
|
5683 | m: 'isSafeInteger',
|
5684 | k: 'isSafeInteger',
|
5685 | hash: 'hash',
|
5686 | });
|
5687 | const { p, k, m, hash, expand, DST: _DST } = options;
|
5688 | abytes(msg);
|
5689 | isNum(count);
|
5690 | const DST = validateDST(_DST);
|
5691 | const log2p = p.toString(2).length;
|
5692 | const L = Math.ceil((log2p + k) / 8);
|
5693 | const len_in_bytes = count * m * L;
|
5694 | let prb;
|
5695 | if (expand === 'xmd') {
|
5696 | prb = expand_message_xmd(msg, DST, len_in_bytes, hash);
|
5697 | }
|
5698 | else if (expand === 'xof') {
|
5699 | prb = expand_message_xof(msg, DST, len_in_bytes, k, hash);
|
5700 | }
|
5701 | else if (expand === '_internal_pass') {
|
5702 | prb = msg;
|
5703 | }
|
5704 | else {
|
5705 | throw new Error('expand must be "xmd" or "xof"');
|
5706 | }
|
5707 | const u = new Array(count);
|
5708 | for (let i = 0; i < count; i++) {
|
5709 | const e = new Array(m);
|
5710 | for (let j = 0; j < m; j++) {
|
5711 | const elm_offset = L * (j + i * m);
|
5712 | const tv = prb.subarray(elm_offset, elm_offset + L);
|
5713 | e[j] = mod(os2ip(tv), p);
|
5714 | }
|
5715 | u[i] = e;
|
5716 | }
|
5717 | return u;
|
5718 | }
|
5719 | function isogenyMap(field, map) {
|
5720 | const COEFF = map.map((i) => Array.from(i).reverse());
|
5721 | return (x, y) => {
|
5722 | const [xNum, xDen, yNum, yDen] = COEFF.map((val) => val.reduce((acc, i) => field.add(field.mul(acc, x), i)));
|
5723 | x = field.div(xNum, xDen);
|
5724 | y = field.mul(y, field.div(yNum, yDen));
|
5725 | return { x, y };
|
5726 | };
|
5727 | }
|
5728 | function createHasher(Point, mapToCurve, def) {
|
5729 | if (typeof mapToCurve !== 'function')
|
5730 | throw new Error('mapToCurve() must be defined');
|
5731 | return {
|
5732 | hashToCurve(msg, options) {
|
5733 | const u = hash_to_field(msg, 2, { ...def, DST: def.DST, ...options });
|
5734 | const u0 = Point.fromAffine(mapToCurve(u[0]));
|
5735 | const u1 = Point.fromAffine(mapToCurve(u[1]));
|
5736 | const P = u0.add(u1).clearCofactor();
|
5737 | P.assertValidity();
|
5738 | return P;
|
5739 | },
|
5740 | encodeToCurve(msg, options) {
|
5741 | const u = hash_to_field(msg, 1, { ...def, DST: def.encodeDST, ...options });
|
5742 | const P = Point.fromAffine(mapToCurve(u[0])).clearCofactor();
|
5743 | P.assertValidity();
|
5744 | return P;
|
5745 | },
|
5746 | };
|
5747 | }
|
5748 |
|
5749 | class HMAC extends Hash {
|
5750 | constructor(hash$1, _key) {
|
5751 | super();
|
5752 | this.finished = false;
|
5753 | this.destroyed = false;
|
5754 | hash(hash$1);
|
5755 | const key = toBytes(_key);
|
5756 | this.iHash = hash$1.create();
|
5757 | if (typeof this.iHash.update !== 'function')
|
5758 | throw new Error('Expected instance of class which extends utils.Hash');
|
5759 | this.blockLen = this.iHash.blockLen;
|
5760 | this.outputLen = this.iHash.outputLen;
|
5761 | const blockLen = this.blockLen;
|
5762 | const pad = new Uint8Array(blockLen);
|
5763 | pad.set(key.length > blockLen ? hash$1.create().update(key).digest() : key);
|
5764 | for (let i = 0; i < pad.length; i++)
|
5765 | pad[i] ^= 0x36;
|
5766 | this.iHash.update(pad);
|
5767 | this.oHash = hash$1.create();
|
5768 | for (let i = 0; i < pad.length; i++)
|
5769 | pad[i] ^= 0x36 ^ 0x5c;
|
5770 | this.oHash.update(pad);
|
5771 | pad.fill(0);
|
5772 | }
|
5773 | update(buf) {
|
5774 | exists(this);
|
5775 | this.iHash.update(buf);
|
5776 | return this;
|
5777 | }
|
5778 | digestInto(out) {
|
5779 | exists(this);
|
5780 | bytes(out, this.outputLen);
|
5781 | this.finished = true;
|
5782 | this.iHash.digestInto(out);
|
5783 | this.oHash.update(out);
|
5784 | this.oHash.digestInto(out);
|
5785 | this.destroy();
|
5786 | }
|
5787 | digest() {
|
5788 | const out = new Uint8Array(this.oHash.outputLen);
|
5789 | this.digestInto(out);
|
5790 | return out;
|
5791 | }
|
5792 | _cloneInto(to) {
|
5793 | to || (to = Object.create(Object.getPrototypeOf(this), {}));
|
5794 | const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;
|
5795 | to = to;
|
5796 | to.finished = finished;
|
5797 | to.destroyed = destroyed;
|
5798 | to.blockLen = blockLen;
|
5799 | to.outputLen = outputLen;
|
5800 | to.oHash = oHash._cloneInto(to.oHash);
|
5801 | to.iHash = iHash._cloneInto(to.iHash);
|
5802 | return to;
|
5803 | }
|
5804 | destroy() {
|
5805 | this.destroyed = true;
|
5806 | this.oHash.destroy();
|
5807 | this.iHash.destroy();
|
5808 | }
|
5809 | }
|
5810 | const hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest();
|
5811 | hmac.create = (hash, key) => new HMAC(hash, key);
|
5812 |
|
5813 | /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
5814 | function getHash(hash) {
|
5815 | return {
|
5816 | hash,
|
5817 | hmac: (key, ...msgs) => hmac(hash, key, concatBytes$1(...msgs)),
|
5818 | randomBytes,
|
5819 | };
|
5820 | }
|
5821 | function createCurve(curveDef, defHash) {
|
5822 | const create = (hash) => weierstrass({ ...curveDef, ...getHash(hash) });
|
5823 | return Object.freeze({ ...create(defHash), create });
|
5824 | }
|
5825 |
|
5826 | /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
5827 | const secp256k1P = BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f');
|
5828 | const secp256k1N = BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141');
|
5829 | const _1n$4 = BigInt(1);
|
5830 | const _2n$3 = BigInt(2);
|
5831 | const divNearest = (a, b) => (a + b / _2n$3) / b;
|
5832 | function sqrtMod(y) {
|
5833 | const P = secp256k1P;
|
5834 | const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);
|
5835 | const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);
|
5836 | const b2 = (y * y * y) % P;
|
5837 | const b3 = (b2 * b2 * y) % P;
|
5838 | const b6 = (pow2(b3, _3n, P) * b3) % P;
|
5839 | const b9 = (pow2(b6, _3n, P) * b3) % P;
|
5840 | const b11 = (pow2(b9, _2n$3, P) * b2) % P;
|
5841 | const b22 = (pow2(b11, _11n, P) * b11) % P;
|
5842 | const b44 = (pow2(b22, _22n, P) * b22) % P;
|
5843 | const b88 = (pow2(b44, _44n, P) * b44) % P;
|
5844 | const b176 = (pow2(b88, _88n, P) * b88) % P;
|
5845 | const b220 = (pow2(b176, _44n, P) * b44) % P;
|
5846 | const b223 = (pow2(b220, _3n, P) * b3) % P;
|
5847 | const t1 = (pow2(b223, _23n, P) * b22) % P;
|
5848 | const t2 = (pow2(t1, _6n, P) * b2) % P;
|
5849 | const root = pow2(t2, _2n$3, P);
|
5850 | if (!Fp$1.eql(Fp$1.sqr(root), y))
|
5851 | throw new Error('Cannot find square root');
|
5852 | return root;
|
5853 | }
|
5854 | const Fp$1 = Field(secp256k1P, undefined, undefined, { sqrt: sqrtMod });
|
5855 | const secp256k1 = createCurve({
|
5856 | a: BigInt(0),
|
5857 | b: BigInt(7),
|
5858 | Fp: Fp$1,
|
5859 | n: secp256k1N,
|
5860 | Gx: BigInt('55066263022277343669578718895168534326250603453777594175500187360389116729240'),
|
5861 | Gy: BigInt('32670510020758816978083085130507043184471273380659243275938904335757337482424'),
|
5862 | h: BigInt(1),
|
5863 | lowS: true,
|
5864 | endo: {
|
5865 | beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),
|
5866 | splitScalar: (k) => {
|
5867 | const n = secp256k1N;
|
5868 | const a1 = BigInt('0x3086d221a7d46bcde86c90e49284eb15');
|
5869 | const b1 = -_1n$4 * BigInt('0xe4437ed6010e88286f547fa90abfe4c3');
|
5870 | const a2 = BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8');
|
5871 | const b2 = a1;
|
5872 | const POW_2_128 = BigInt('0x100000000000000000000000000000000');
|
5873 | const c1 = divNearest(b2 * k, n);
|
5874 | const c2 = divNearest(-b1 * k, n);
|
5875 | let k1 = mod(k - c1 * a1 - c2 * a2, n);
|
5876 | let k2 = mod(-c1 * b1 - c2 * b2, n);
|
5877 | const k1neg = k1 > POW_2_128;
|
5878 | const k2neg = k2 > POW_2_128;
|
5879 | if (k1neg)
|
5880 | k1 = n - k1;
|
5881 | if (k2neg)
|
5882 | k2 = n - k2;
|
5883 | if (k1 > POW_2_128 || k2 > POW_2_128) {
|
5884 | throw new Error('splitScalar: Endomorphism failed, k=' + k);
|
5885 | }
|
5886 | return { k1neg, k1, k2neg, k2 };
|
5887 | },
|
5888 | },
|
5889 | }, sha256);
|
5890 | const _0n$4 = BigInt(0);
|
5891 | const fe = (x) => typeof x === 'bigint' && _0n$4 < x && x < secp256k1P;
|
5892 | const ge = (x) => typeof x === 'bigint' && _0n$4 < x && x < secp256k1N;
|
5893 | const TAGGED_HASH_PREFIXES = {};
|
5894 | function taggedHash(tag, ...messages) {
|
5895 | let tagP = TAGGED_HASH_PREFIXES[tag];
|
5896 | if (tagP === undefined) {
|
5897 | const tagH = sha256(Uint8Array.from(tag, (c) => c.charCodeAt(0)));
|
5898 | tagP = concatBytes(tagH, tagH);
|
5899 | TAGGED_HASH_PREFIXES[tag] = tagP;
|
5900 | }
|
5901 | return sha256(concatBytes(tagP, ...messages));
|
5902 | }
|
5903 | const pointToBytes = (point) => point.toRawBytes(true).slice(1);
|
5904 | const numTo32b = (n) => numberToBytesBE(n, 32);
|
5905 | const modP = (x) => mod(x, secp256k1P);
|
5906 | const modN = (x) => mod(x, secp256k1N);
|
5907 | const Point = secp256k1.ProjectivePoint;
|
5908 | const GmulAdd = (Q, a, b) => Point.BASE.multiplyAndAddUnsafe(Q, a, b);
|
5909 | function schnorrGetExtPubKey(priv) {
|
5910 | let d_ = secp256k1.utils.normPrivateKeyToScalar(priv);
|
5911 | let p = Point.fromPrivateKey(d_);
|
5912 | const scalar = p.hasEvenY() ? d_ : modN(-d_);
|
5913 | return { scalar: scalar, bytes: pointToBytes(p) };
|
5914 | }
|
5915 | function lift_x(x) {
|
5916 | if (!fe(x))
|
5917 | throw new Error('bad x: need 0 < x < p');
|
5918 | const xx = modP(x * x);
|
5919 | const c = modP(xx * x + BigInt(7));
|
5920 | let y = sqrtMod(c);
|
5921 | if (y % _2n$3 !== _0n$4)
|
5922 | y = modP(-y);
|
5923 | const p = new Point(x, y, _1n$4);
|
5924 | p.assertValidity();
|
5925 | return p;
|
5926 | }
|
5927 | function challenge(...args) {
|
5928 | return modN(bytesToNumberBE(taggedHash('BIP0340/challenge', ...args)));
|
5929 | }
|
5930 | function schnorrGetPublicKey(privateKey) {
|
5931 | return schnorrGetExtPubKey(privateKey).bytes;
|
5932 | }
|
5933 | function schnorrSign(message, privateKey, auxRand = randomBytes(32)) {
|
5934 | const m = ensureBytes('message', message);
|
5935 | const { bytes: px, scalar: d } = schnorrGetExtPubKey(privateKey);
|
5936 | const a = ensureBytes('auxRand', auxRand, 32);
|
5937 | const t = numTo32b(d ^ bytesToNumberBE(taggedHash('BIP0340/aux', a)));
|
5938 | const rand = taggedHash('BIP0340/nonce', t, px, m);
|
5939 | const k_ = modN(bytesToNumberBE(rand));
|
5940 | if (k_ === _0n$4)
|
5941 | throw new Error('sign failed: k is zero');
|
5942 | const { bytes: rx, scalar: k } = schnorrGetExtPubKey(k_);
|
5943 | const e = challenge(rx, px, m);
|
5944 | const sig = new Uint8Array(64);
|
5945 | sig.set(rx, 0);
|
5946 | sig.set(numTo32b(modN(k + e * d)), 32);
|
5947 | if (!schnorrVerify(sig, m, px))
|
5948 | throw new Error('sign: Invalid signature produced');
|
5949 | return sig;
|
5950 | }
|
5951 | function schnorrVerify(signature, message, publicKey) {
|
5952 | const sig = ensureBytes('signature', signature, 64);
|
5953 | const m = ensureBytes('message', message);
|
5954 | const pub = ensureBytes('publicKey', publicKey, 32);
|
5955 | try {
|
5956 | const P = lift_x(bytesToNumberBE(pub));
|
5957 | const r = bytesToNumberBE(sig.subarray(0, 32));
|
5958 | if (!fe(r))
|
5959 | return false;
|
5960 | const s = bytesToNumberBE(sig.subarray(32, 64));
|
5961 | if (!ge(s))
|
5962 | return false;
|
5963 | const e = challenge(numTo32b(r), pointToBytes(P), m);
|
5964 | const R = GmulAdd(P, s, modN(-e));
|
5965 | if (!R || !R.hasEvenY() || R.toAffine().x !== r)
|
5966 | return false;
|
5967 | return true;
|
5968 | }
|
5969 | catch (error) {
|
5970 | return false;
|
5971 | }
|
5972 | }
|
5973 | (() => ({
|
5974 | getPublicKey: schnorrGetPublicKey,
|
5975 | sign: schnorrSign,
|
5976 | verify: schnorrVerify,
|
5977 | utils: {
|
5978 | randomPrivateKey: secp256k1.utils.randomPrivateKey,
|
5979 | lift_x,
|
5980 | pointToBytes,
|
5981 | numberToBytesBE,
|
5982 | bytesToNumberBE,
|
5983 | taggedHash,
|
5984 | mod,
|
5985 | },
|
5986 | }))();
|
5987 | const isoMap = (() => isogenyMap(Fp$1, [
|
5988 | [
|
5989 | '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',
|
5990 | '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',
|
5991 | '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',
|
5992 | '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',
|
5993 | ],
|
5994 | [
|
5995 | '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',
|
5996 | '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',
|
5997 | '0x0000000000000000000000000000000000000000000000000000000000000001',
|
5998 | ],
|
5999 | [
|
6000 | '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',
|
6001 | '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',
|
6002 | '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',
|
6003 | '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',
|
6004 | ],
|
6005 | [
|
6006 | '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',
|
6007 | '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',
|
6008 | '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',
|
6009 | '0x0000000000000000000000000000000000000000000000000000000000000001',
|
6010 | ],
|
6011 | ].map((i) => i.map((j) => BigInt(j)))))();
|
6012 | const mapSWU = (() => mapToCurveSimpleSWU(Fp$1, {
|
6013 | A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),
|
6014 | B: BigInt('1771'),
|
6015 | Z: Fp$1.create(BigInt('-11')),
|
6016 | }))();
|
6017 | (() => createHasher(secp256k1.ProjectivePoint, (scalars) => {
|
6018 | const { x, y } = mapSWU(Fp$1.create(scalars[0]));
|
6019 | return isoMap(x, y);
|
6020 | }, {
|
6021 | DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',
|
6022 | encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',
|
6023 | p: Fp$1.ORDER,
|
6024 | m: 1,
|
6025 | k: 128,
|
6026 | expand: 'xmd',
|
6027 | hash: sha256,
|
6028 | }))();
|
6029 |
|
6030 | function secp256k1PairFromSeed(seed, onlyJs) {
|
6031 | if (seed.length !== 32) {
|
6032 | throw new Error('Expected valid 32-byte private key as a seed');
|
6033 | }
|
6034 | if (!util.hasBigInt || (!onlyJs && isReady())) {
|
6035 | const full = secp256k1FromSeed(seed);
|
6036 | const publicKey = full.slice(32);
|
6037 | if (util.u8aEmpty(publicKey)) {
|
6038 | throw new Error('Invalid publicKey generated from WASM interface');
|
6039 | }
|
6040 | return {
|
6041 | publicKey,
|
6042 | secretKey: full.slice(0, 32)
|
6043 | };
|
6044 | }
|
6045 | return {
|
6046 | publicKey: secp256k1.getPublicKey(seed, true),
|
6047 | secretKey: seed
|
6048 | };
|
6049 | }
|
6050 |
|
6051 | function createSeedDeriveFn(fromSeed, derive) {
|
6052 | return (keypair, { chainCode, isHard }) => {
|
6053 | if (!isHard) {
|
6054 | throw new Error('A soft key was found in the path and is not supported');
|
6055 | }
|
6056 | return fromSeed(derive(keypair.secretKey.subarray(0, 32), chainCode));
|
6057 | };
|
6058 | }
|
6059 |
|
6060 | const keyHdkdEcdsa = createSeedDeriveFn(secp256k1PairFromSeed, secp256k1DeriveHard);
|
6061 |
|
6062 | const HDKD = util.compactAddLength(util.stringToU8a('Ed25519HDKD'));
|
6063 | function ed25519DeriveHard(seed, chainCode) {
|
6064 | if (!util.isU8a(chainCode) || chainCode.length !== 32) {
|
6065 | throw new Error('Invalid chainCode passed to derive');
|
6066 | }
|
6067 | return blake2AsU8a(util.u8aConcat(HDKD, seed, chainCode));
|
6068 | }
|
6069 |
|
6070 | function randomAsU8a(length = 32) {
|
6071 | return browser.getRandomValues(new Uint8Array(length));
|
6072 | }
|
6073 | const randomAsHex = createAsHex(randomAsU8a);
|
6074 |
|
6075 | const BN_53 = new util.BN(0b11111111111111111111111111111111111111111111111111111);
|
6076 | function randomAsNumber() {
|
6077 | return util.hexToBn(randomAsHex(8)).and(BN_53).toNumber();
|
6078 | }
|
6079 |
|
6080 | const [SHA512_Kh, SHA512_Kl] = (() => u64.split([
|
6081 | '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',
|
6082 | '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',
|
6083 | '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',
|
6084 | '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',
|
6085 | '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',
|
6086 | '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',
|
6087 | '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',
|
6088 | '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',
|
6089 | '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',
|
6090 | '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',
|
6091 | '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',
|
6092 | '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',
|
6093 | '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',
|
6094 | '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',
|
6095 | '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',
|
6096 | '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',
|
6097 | '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',
|
6098 | '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',
|
6099 | '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',
|
6100 | '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'
|
6101 | ].map(n => BigInt(n))))();
|
6102 | const SHA512_W_H = new Uint32Array(80);
|
6103 | const SHA512_W_L = new Uint32Array(80);
|
6104 | class SHA512 extends SHA2 {
|
6105 | constructor() {
|
6106 | super(128, 64, 16, false);
|
6107 | this.Ah = 0x6a09e667 | 0;
|
6108 | this.Al = 0xf3bcc908 | 0;
|
6109 | this.Bh = 0xbb67ae85 | 0;
|
6110 | this.Bl = 0x84caa73b | 0;
|
6111 | this.Ch = 0x3c6ef372 | 0;
|
6112 | this.Cl = 0xfe94f82b | 0;
|
6113 | this.Dh = 0xa54ff53a | 0;
|
6114 | this.Dl = 0x5f1d36f1 | 0;
|
6115 | this.Eh = 0x510e527f | 0;
|
6116 | this.El = 0xade682d1 | 0;
|
6117 | this.Fh = 0x9b05688c | 0;
|
6118 | this.Fl = 0x2b3e6c1f | 0;
|
6119 | this.Gh = 0x1f83d9ab | 0;
|
6120 | this.Gl = 0xfb41bd6b | 0;
|
6121 | this.Hh = 0x5be0cd19 | 0;
|
6122 | this.Hl = 0x137e2179 | 0;
|
6123 | }
|
6124 | get() {
|
6125 | const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;
|
6126 | return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];
|
6127 | }
|
6128 | set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {
|
6129 | this.Ah = Ah | 0;
|
6130 | this.Al = Al | 0;
|
6131 | this.Bh = Bh | 0;
|
6132 | this.Bl = Bl | 0;
|
6133 | this.Ch = Ch | 0;
|
6134 | this.Cl = Cl | 0;
|
6135 | this.Dh = Dh | 0;
|
6136 | this.Dl = Dl | 0;
|
6137 | this.Eh = Eh | 0;
|
6138 | this.El = El | 0;
|
6139 | this.Fh = Fh | 0;
|
6140 | this.Fl = Fl | 0;
|
6141 | this.Gh = Gh | 0;
|
6142 | this.Gl = Gl | 0;
|
6143 | this.Hh = Hh | 0;
|
6144 | this.Hl = Hl | 0;
|
6145 | }
|
6146 | process(view, offset) {
|
6147 | for (let i = 0; i < 16; i++, offset += 4) {
|
6148 | SHA512_W_H[i] = view.getUint32(offset);
|
6149 | SHA512_W_L[i] = view.getUint32((offset += 4));
|
6150 | }
|
6151 | for (let i = 16; i < 80; i++) {
|
6152 | const W15h = SHA512_W_H[i - 15] | 0;
|
6153 | const W15l = SHA512_W_L[i - 15] | 0;
|
6154 | const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);
|
6155 | const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);
|
6156 | const W2h = SHA512_W_H[i - 2] | 0;
|
6157 | const W2l = SHA512_W_L[i - 2] | 0;
|
6158 | const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);
|
6159 | const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);
|
6160 | const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);
|
6161 | const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);
|
6162 | SHA512_W_H[i] = SUMh | 0;
|
6163 | SHA512_W_L[i] = SUMl | 0;
|
6164 | }
|
6165 | let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;
|
6166 | for (let i = 0; i < 80; i++) {
|
6167 | const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);
|
6168 | const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);
|
6169 | const CHIh = (Eh & Fh) ^ (~Eh & Gh);
|
6170 | const CHIl = (El & Fl) ^ (~El & Gl);
|
6171 | const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);
|
6172 | const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);
|
6173 | const T1l = T1ll | 0;
|
6174 | const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);
|
6175 | const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);
|
6176 | const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);
|
6177 | const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);
|
6178 | Hh = Gh | 0;
|
6179 | Hl = Gl | 0;
|
6180 | Gh = Fh | 0;
|
6181 | Gl = Fl | 0;
|
6182 | Fh = Eh | 0;
|
6183 | Fl = El | 0;
|
6184 | ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));
|
6185 | Dh = Ch | 0;
|
6186 | Dl = Cl | 0;
|
6187 | Ch = Bh | 0;
|
6188 | Cl = Bl | 0;
|
6189 | Bh = Ah | 0;
|
6190 | Bl = Al | 0;
|
6191 | const All = u64.add3L(T1l, sigma0l, MAJl);
|
6192 | Ah = u64.add3H(All, T1h, sigma0h, MAJh);
|
6193 | Al = All | 0;
|
6194 | }
|
6195 | ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));
|
6196 | ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));
|
6197 | ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));
|
6198 | ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));
|
6199 | ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));
|
6200 | ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));
|
6201 | ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));
|
6202 | ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));
|
6203 | this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);
|
6204 | }
|
6205 | roundClean() {
|
6206 | SHA512_W_H.fill(0);
|
6207 | SHA512_W_L.fill(0);
|
6208 | }
|
6209 | destroy() {
|
6210 | this.buffer.fill(0);
|
6211 | this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
6212 | }
|
6213 | }
|
6214 | class SHA512_224 extends SHA512 {
|
6215 | constructor() {
|
6216 | super();
|
6217 | this.Ah = 0x8c3d37c8 | 0;
|
6218 | this.Al = 0x19544da2 | 0;
|
6219 | this.Bh = 0x73e19966 | 0;
|
6220 | this.Bl = 0x89dcd4d6 | 0;
|
6221 | this.Ch = 0x1dfab7ae | 0;
|
6222 | this.Cl = 0x32ff9c82 | 0;
|
6223 | this.Dh = 0x679dd514 | 0;
|
6224 | this.Dl = 0x582f9fcf | 0;
|
6225 | this.Eh = 0x0f6d2b69 | 0;
|
6226 | this.El = 0x7bd44da8 | 0;
|
6227 | this.Fh = 0x77e36f73 | 0;
|
6228 | this.Fl = 0x04c48942 | 0;
|
6229 | this.Gh = 0x3f9d85a8 | 0;
|
6230 | this.Gl = 0x6a1d36c8 | 0;
|
6231 | this.Hh = 0x1112e6ad | 0;
|
6232 | this.Hl = 0x91d692a1 | 0;
|
6233 | this.outputLen = 28;
|
6234 | }
|
6235 | }
|
6236 | class SHA512_256 extends SHA512 {
|
6237 | constructor() {
|
6238 | super();
|
6239 | this.Ah = 0x22312194 | 0;
|
6240 | this.Al = 0xfc2bf72c | 0;
|
6241 | this.Bh = 0x9f555fa3 | 0;
|
6242 | this.Bl = 0xc84c64c2 | 0;
|
6243 | this.Ch = 0x2393b86b | 0;
|
6244 | this.Cl = 0x6f53b151 | 0;
|
6245 | this.Dh = 0x96387719 | 0;
|
6246 | this.Dl = 0x5940eabd | 0;
|
6247 | this.Eh = 0x96283ee2 | 0;
|
6248 | this.El = 0xa88effe3 | 0;
|
6249 | this.Fh = 0xbe5e1e25 | 0;
|
6250 | this.Fl = 0x53863992 | 0;
|
6251 | this.Gh = 0x2b0199fc | 0;
|
6252 | this.Gl = 0x2c85b8aa | 0;
|
6253 | this.Hh = 0x0eb72ddc | 0;
|
6254 | this.Hl = 0x81c52ca2 | 0;
|
6255 | this.outputLen = 32;
|
6256 | }
|
6257 | }
|
6258 | class SHA384 extends SHA512 {
|
6259 | constructor() {
|
6260 | super();
|
6261 | this.Ah = 0xcbbb9d5d | 0;
|
6262 | this.Al = 0xc1059ed8 | 0;
|
6263 | this.Bh = 0x629a292a | 0;
|
6264 | this.Bl = 0x367cd507 | 0;
|
6265 | this.Ch = 0x9159015a | 0;
|
6266 | this.Cl = 0x3070dd17 | 0;
|
6267 | this.Dh = 0x152fecd8 | 0;
|
6268 | this.Dl = 0xf70e5939 | 0;
|
6269 | this.Eh = 0x67332667 | 0;
|
6270 | this.El = 0xffc00b31 | 0;
|
6271 | this.Fh = 0x8eb44a87 | 0;
|
6272 | this.Fl = 0x68581511 | 0;
|
6273 | this.Gh = 0xdb0c2e0d | 0;
|
6274 | this.Gl = 0x64f98fa7 | 0;
|
6275 | this.Hh = 0x47b5481d | 0;
|
6276 | this.Hl = 0xbefa4fa4 | 0;
|
6277 | this.outputLen = 48;
|
6278 | }
|
6279 | }
|
6280 | const sha512 = wrapConstructor(() => new SHA512());
|
6281 | wrapConstructor(() => new SHA512_224());
|
6282 | wrapConstructor(() => new SHA512_256());
|
6283 | wrapConstructor(() => new SHA384());
|
6284 |
|
6285 | /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
6286 | const _0n$3 = BigInt(0), _1n$3 = BigInt(1), _2n$2 = BigInt(2), _8n = BigInt(8);
|
6287 | const VERIFY_DEFAULT = { zip215: true };
|
6288 | function validateOpts$1(curve) {
|
6289 | const opts = validateBasic(curve);
|
6290 | validateObject(curve, {
|
6291 | hash: 'function',
|
6292 | a: 'bigint',
|
6293 | d: 'bigint',
|
6294 | randomBytes: 'function',
|
6295 | }, {
|
6296 | adjustScalarBytes: 'function',
|
6297 | domain: 'function',
|
6298 | uvRatio: 'function',
|
6299 | mapToCurve: 'function',
|
6300 | });
|
6301 | return Object.freeze({ ...opts });
|
6302 | }
|
6303 | function twistedEdwards(curveDef) {
|
6304 | const CURVE = validateOpts$1(curveDef);
|
6305 | const { Fp, n: CURVE_ORDER, prehash: prehash, hash: cHash, randomBytes, nByteLength, h: cofactor, } = CURVE;
|
6306 | const MASK = _2n$2 << (BigInt(nByteLength * 8) - _1n$3);
|
6307 | const modP = Fp.create;
|
6308 | const uvRatio = CURVE.uvRatio ||
|
6309 | ((u, v) => {
|
6310 | try {
|
6311 | return { isValid: true, value: Fp.sqrt(u * Fp.inv(v)) };
|
6312 | }
|
6313 | catch (e) {
|
6314 | return { isValid: false, value: _0n$3 };
|
6315 | }
|
6316 | });
|
6317 | const adjustScalarBytes = CURVE.adjustScalarBytes || ((bytes) => bytes);
|
6318 | const domain = CURVE.domain ||
|
6319 | ((data, ctx, phflag) => {
|
6320 | if (ctx.length || phflag)
|
6321 | throw new Error('Contexts/pre-hash are not supported');
|
6322 | return data;
|
6323 | });
|
6324 | const inBig = (n) => typeof n === 'bigint' && _0n$3 < n;
|
6325 | const inRange = (n, max) => inBig(n) && inBig(max) && n < max;
|
6326 | const in0MaskRange = (n) => n === _0n$3 || inRange(n, MASK);
|
6327 | function assertInRange(n, max) {
|
6328 | if (inRange(n, max))
|
6329 | return n;
|
6330 | throw new Error(`Expected valid scalar < ${max}, got ${typeof n} ${n}`);
|
6331 | }
|
6332 | function assertGE0(n) {
|
6333 | return n === _0n$3 ? n : assertInRange(n, CURVE_ORDER);
|
6334 | }
|
6335 | const pointPrecomputes = new Map();
|
6336 | function isPoint(other) {
|
6337 | if (!(other instanceof Point))
|
6338 | throw new Error('ExtendedPoint expected');
|
6339 | }
|
6340 | class Point {
|
6341 | constructor(ex, ey, ez, et) {
|
6342 | this.ex = ex;
|
6343 | this.ey = ey;
|
6344 | this.ez = ez;
|
6345 | this.et = et;
|
6346 | if (!in0MaskRange(ex))
|
6347 | throw new Error('x required');
|
6348 | if (!in0MaskRange(ey))
|
6349 | throw new Error('y required');
|
6350 | if (!in0MaskRange(ez))
|
6351 | throw new Error('z required');
|
6352 | if (!in0MaskRange(et))
|
6353 | throw new Error('t required');
|
6354 | }
|
6355 | get x() {
|
6356 | return this.toAffine().x;
|
6357 | }
|
6358 | get y() {
|
6359 | return this.toAffine().y;
|
6360 | }
|
6361 | static fromAffine(p) {
|
6362 | if (p instanceof Point)
|
6363 | throw new Error('extended point not allowed');
|
6364 | const { x, y } = p || {};
|
6365 | if (!in0MaskRange(x) || !in0MaskRange(y))
|
6366 | throw new Error('invalid affine point');
|
6367 | return new Point(x, y, _1n$3, modP(x * y));
|
6368 | }
|
6369 | static normalizeZ(points) {
|
6370 | const toInv = Fp.invertBatch(points.map((p) => p.ez));
|
6371 | return points.map((p, i) => p.toAffine(toInv[i])).map(Point.fromAffine);
|
6372 | }
|
6373 | _setWindowSize(windowSize) {
|
6374 | this._WINDOW_SIZE = windowSize;
|
6375 | pointPrecomputes.delete(this);
|
6376 | }
|
6377 | assertValidity() {
|
6378 | const { a, d } = CURVE;
|
6379 | if (this.is0())
|
6380 | throw new Error('bad point: ZERO');
|
6381 | const { ex: X, ey: Y, ez: Z, et: T } = this;
|
6382 | const X2 = modP(X * X);
|
6383 | const Y2 = modP(Y * Y);
|
6384 | const Z2 = modP(Z * Z);
|
6385 | const Z4 = modP(Z2 * Z2);
|
6386 | const aX2 = modP(X2 * a);
|
6387 | const left = modP(Z2 * modP(aX2 + Y2));
|
6388 | const right = modP(Z4 + modP(d * modP(X2 * Y2)));
|
6389 | if (left !== right)
|
6390 | throw new Error('bad point: equation left != right (1)');
|
6391 | const XY = modP(X * Y);
|
6392 | const ZT = modP(Z * T);
|
6393 | if (XY !== ZT)
|
6394 | throw new Error('bad point: equation left != right (2)');
|
6395 | }
|
6396 | equals(other) {
|
6397 | isPoint(other);
|
6398 | const { ex: X1, ey: Y1, ez: Z1 } = this;
|
6399 | const { ex: X2, ey: Y2, ez: Z2 } = other;
|
6400 | const X1Z2 = modP(X1 * Z2);
|
6401 | const X2Z1 = modP(X2 * Z1);
|
6402 | const Y1Z2 = modP(Y1 * Z2);
|
6403 | const Y2Z1 = modP(Y2 * Z1);
|
6404 | return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
|
6405 | }
|
6406 | is0() {
|
6407 | return this.equals(Point.ZERO);
|
6408 | }
|
6409 | negate() {
|
6410 | return new Point(modP(-this.ex), this.ey, this.ez, modP(-this.et));
|
6411 | }
|
6412 | double() {
|
6413 | const { a } = CURVE;
|
6414 | const { ex: X1, ey: Y1, ez: Z1 } = this;
|
6415 | const A = modP(X1 * X1);
|
6416 | const B = modP(Y1 * Y1);
|
6417 | const C = modP(_2n$2 * modP(Z1 * Z1));
|
6418 | const D = modP(a * A);
|
6419 | const x1y1 = X1 + Y1;
|
6420 | const E = modP(modP(x1y1 * x1y1) - A - B);
|
6421 | const G = D + B;
|
6422 | const F = G - C;
|
6423 | const H = D - B;
|
6424 | const X3 = modP(E * F);
|
6425 | const Y3 = modP(G * H);
|
6426 | const T3 = modP(E * H);
|
6427 | const Z3 = modP(F * G);
|
6428 | return new Point(X3, Y3, Z3, T3);
|
6429 | }
|
6430 | add(other) {
|
6431 | isPoint(other);
|
6432 | const { a, d } = CURVE;
|
6433 | const { ex: X1, ey: Y1, ez: Z1, et: T1 } = this;
|
6434 | const { ex: X2, ey: Y2, ez: Z2, et: T2 } = other;
|
6435 | if (a === BigInt(-1)) {
|
6436 | const A = modP((Y1 - X1) * (Y2 + X2));
|
6437 | const B = modP((Y1 + X1) * (Y2 - X2));
|
6438 | const F = modP(B - A);
|
6439 | if (F === _0n$3)
|
6440 | return this.double();
|
6441 | const C = modP(Z1 * _2n$2 * T2);
|
6442 | const D = modP(T1 * _2n$2 * Z2);
|
6443 | const E = D + C;
|
6444 | const G = B + A;
|
6445 | const H = D - C;
|
6446 | const X3 = modP(E * F);
|
6447 | const Y3 = modP(G * H);
|
6448 | const T3 = modP(E * H);
|
6449 | const Z3 = modP(F * G);
|
6450 | return new Point(X3, Y3, Z3, T3);
|
6451 | }
|
6452 | const A = modP(X1 * X2);
|
6453 | const B = modP(Y1 * Y2);
|
6454 | const C = modP(T1 * d * T2);
|
6455 | const D = modP(Z1 * Z2);
|
6456 | const E = modP((X1 + Y1) * (X2 + Y2) - A - B);
|
6457 | const F = D - C;
|
6458 | const G = D + C;
|
6459 | const H = modP(B - a * A);
|
6460 | const X3 = modP(E * F);
|
6461 | const Y3 = modP(G * H);
|
6462 | const T3 = modP(E * H);
|
6463 | const Z3 = modP(F * G);
|
6464 | return new Point(X3, Y3, Z3, T3);
|
6465 | }
|
6466 | subtract(other) {
|
6467 | return this.add(other.negate());
|
6468 | }
|
6469 | wNAF(n) {
|
6470 | return wnaf.wNAFCached(this, pointPrecomputes, n, Point.normalizeZ);
|
6471 | }
|
6472 | multiply(scalar) {
|
6473 | const { p, f } = this.wNAF(assertInRange(scalar, CURVE_ORDER));
|
6474 | return Point.normalizeZ([p, f])[0];
|
6475 | }
|
6476 | multiplyUnsafe(scalar) {
|
6477 | let n = assertGE0(scalar);
|
6478 | if (n === _0n$3)
|
6479 | return I;
|
6480 | if (this.equals(I) || n === _1n$3)
|
6481 | return this;
|
6482 | if (this.equals(G))
|
6483 | return this.wNAF(n).p;
|
6484 | return wnaf.unsafeLadder(this, n);
|
6485 | }
|
6486 | isSmallOrder() {
|
6487 | return this.multiplyUnsafe(cofactor).is0();
|
6488 | }
|
6489 | isTorsionFree() {
|
6490 | return wnaf.unsafeLadder(this, CURVE_ORDER).is0();
|
6491 | }
|
6492 | toAffine(iz) {
|
6493 | const { ex: x, ey: y, ez: z } = this;
|
6494 | const is0 = this.is0();
|
6495 | if (iz == null)
|
6496 | iz = is0 ? _8n : Fp.inv(z);
|
6497 | const ax = modP(x * iz);
|
6498 | const ay = modP(y * iz);
|
6499 | const zz = modP(z * iz);
|
6500 | if (is0)
|
6501 | return { x: _0n$3, y: _1n$3 };
|
6502 | if (zz !== _1n$3)
|
6503 | throw new Error('invZ was invalid');
|
6504 | return { x: ax, y: ay };
|
6505 | }
|
6506 | clearCofactor() {
|
6507 | const { h: cofactor } = CURVE;
|
6508 | if (cofactor === _1n$3)
|
6509 | return this;
|
6510 | return this.multiplyUnsafe(cofactor);
|
6511 | }
|
6512 | static fromHex(hex, zip215 = false) {
|
6513 | const { d, a } = CURVE;
|
6514 | const len = Fp.BYTES;
|
6515 | hex = ensureBytes('pointHex', hex, len);
|
6516 | const normed = hex.slice();
|
6517 | const lastByte = hex[len - 1];
|
6518 | normed[len - 1] = lastByte & ~0x80;
|
6519 | const y = bytesToNumberLE(normed);
|
6520 | if (y === _0n$3) ;
|
6521 | else {
|
6522 | if (zip215)
|
6523 | assertInRange(y, MASK);
|
6524 | else
|
6525 | assertInRange(y, Fp.ORDER);
|
6526 | }
|
6527 | const y2 = modP(y * y);
|
6528 | const u = modP(y2 - _1n$3);
|
6529 | const v = modP(d * y2 - a);
|
6530 | let { isValid, value: x } = uvRatio(u, v);
|
6531 | if (!isValid)
|
6532 | throw new Error('Point.fromHex: invalid y coordinate');
|
6533 | const isXOdd = (x & _1n$3) === _1n$3;
|
6534 | const isLastByteOdd = (lastByte & 0x80) !== 0;
|
6535 | if (!zip215 && x === _0n$3 && isLastByteOdd)
|
6536 | throw new Error('Point.fromHex: x=0 and x_0=1');
|
6537 | if (isLastByteOdd !== isXOdd)
|
6538 | x = modP(-x);
|
6539 | return Point.fromAffine({ x, y });
|
6540 | }
|
6541 | static fromPrivateKey(privKey) {
|
6542 | return getExtendedPublicKey(privKey).point;
|
6543 | }
|
6544 | toRawBytes() {
|
6545 | const { x, y } = this.toAffine();
|
6546 | const bytes = numberToBytesLE(y, Fp.BYTES);
|
6547 | bytes[bytes.length - 1] |= x & _1n$3 ? 0x80 : 0;
|
6548 | return bytes;
|
6549 | }
|
6550 | toHex() {
|
6551 | return bytesToHex(this.toRawBytes());
|
6552 | }
|
6553 | }
|
6554 | Point.BASE = new Point(CURVE.Gx, CURVE.Gy, _1n$3, modP(CURVE.Gx * CURVE.Gy));
|
6555 | Point.ZERO = new Point(_0n$3, _1n$3, _1n$3, _0n$3);
|
6556 | const { BASE: G, ZERO: I } = Point;
|
6557 | const wnaf = wNAF(Point, nByteLength * 8);
|
6558 | function modN(a) {
|
6559 | return mod(a, CURVE_ORDER);
|
6560 | }
|
6561 | function modN_LE(hash) {
|
6562 | return modN(bytesToNumberLE(hash));
|
6563 | }
|
6564 | function getExtendedPublicKey(key) {
|
6565 | const len = nByteLength;
|
6566 | key = ensureBytes('private key', key, len);
|
6567 | const hashed = ensureBytes('hashed private key', cHash(key), 2 * len);
|
6568 | const head = adjustScalarBytes(hashed.slice(0, len));
|
6569 | const prefix = hashed.slice(len, 2 * len);
|
6570 | const scalar = modN_LE(head);
|
6571 | const point = G.multiply(scalar);
|
6572 | const pointBytes = point.toRawBytes();
|
6573 | return { head, prefix, scalar, point, pointBytes };
|
6574 | }
|
6575 | function getPublicKey(privKey) {
|
6576 | return getExtendedPublicKey(privKey).pointBytes;
|
6577 | }
|
6578 | function hashDomainToScalar(context = new Uint8Array(), ...msgs) {
|
6579 | const msg = concatBytes(...msgs);
|
6580 | return modN_LE(cHash(domain(msg, ensureBytes('context', context), !!prehash)));
|
6581 | }
|
6582 | function sign(msg, privKey, options = {}) {
|
6583 | msg = ensureBytes('message', msg);
|
6584 | if (prehash)
|
6585 | msg = prehash(msg);
|
6586 | const { prefix, scalar, pointBytes } = getExtendedPublicKey(privKey);
|
6587 | const r = hashDomainToScalar(options.context, prefix, msg);
|
6588 | const R = G.multiply(r).toRawBytes();
|
6589 | const k = hashDomainToScalar(options.context, R, pointBytes, msg);
|
6590 | const s = modN(r + k * scalar);
|
6591 | assertGE0(s);
|
6592 | const res = concatBytes(R, numberToBytesLE(s, Fp.BYTES));
|
6593 | return ensureBytes('result', res, nByteLength * 2);
|
6594 | }
|
6595 | const verifyOpts = VERIFY_DEFAULT;
|
6596 | function verify(sig, msg, publicKey, options = verifyOpts) {
|
6597 | const { context, zip215 } = options;
|
6598 | const len = Fp.BYTES;
|
6599 | sig = ensureBytes('signature', sig, 2 * len);
|
6600 | msg = ensureBytes('message', msg);
|
6601 | if (prehash)
|
6602 | msg = prehash(msg);
|
6603 | const s = bytesToNumberLE(sig.slice(len, 2 * len));
|
6604 | let A, R, SB;
|
6605 | try {
|
6606 | A = Point.fromHex(publicKey, zip215);
|
6607 | R = Point.fromHex(sig.slice(0, len), zip215);
|
6608 | SB = G.multiplyUnsafe(s);
|
6609 | }
|
6610 | catch (error) {
|
6611 | return false;
|
6612 | }
|
6613 | if (!zip215 && A.isSmallOrder())
|
6614 | return false;
|
6615 | const k = hashDomainToScalar(context, R.toRawBytes(), A.toRawBytes(), msg);
|
6616 | const RkA = R.add(A.multiplyUnsafe(k));
|
6617 | return RkA.subtract(SB).clearCofactor().equals(Point.ZERO);
|
6618 | }
|
6619 | G._setWindowSize(8);
|
6620 | const utils = {
|
6621 | getExtendedPublicKey,
|
6622 | randomPrivateKey: () => randomBytes(Fp.BYTES),
|
6623 | precompute(windowSize = 8, point = Point.BASE) {
|
6624 | point._setWindowSize(windowSize);
|
6625 | point.multiply(BigInt(3));
|
6626 | return point;
|
6627 | },
|
6628 | };
|
6629 | return {
|
6630 | CURVE,
|
6631 | getPublicKey,
|
6632 | sign,
|
6633 | verify,
|
6634 | ExtendedPoint: Point,
|
6635 | utils,
|
6636 | };
|
6637 | }
|
6638 |
|
6639 | /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
6640 | const _0n$2 = BigInt(0);
|
6641 | const _1n$2 = BigInt(1);
|
6642 | function validateOpts(curve) {
|
6643 | validateObject(curve, {
|
6644 | a: 'bigint',
|
6645 | }, {
|
6646 | montgomeryBits: 'isSafeInteger',
|
6647 | nByteLength: 'isSafeInteger',
|
6648 | adjustScalarBytes: 'function',
|
6649 | domain: 'function',
|
6650 | powPminus2: 'function',
|
6651 | Gu: 'bigint',
|
6652 | });
|
6653 | return Object.freeze({ ...curve });
|
6654 | }
|
6655 | function montgomery(curveDef) {
|
6656 | const CURVE = validateOpts(curveDef);
|
6657 | const { P } = CURVE;
|
6658 | const modP = (n) => mod(n, P);
|
6659 | const montgomeryBits = CURVE.montgomeryBits;
|
6660 | const montgomeryBytes = Math.ceil(montgomeryBits / 8);
|
6661 | const fieldLen = CURVE.nByteLength;
|
6662 | const adjustScalarBytes = CURVE.adjustScalarBytes || ((bytes) => bytes);
|
6663 | const powPminus2 = CURVE.powPminus2 || ((x) => pow(x, P - BigInt(2), P));
|
6664 | function cswap(swap, x_2, x_3) {
|
6665 | const dummy = modP(swap * (x_2 - x_3));
|
6666 | x_2 = modP(x_2 - dummy);
|
6667 | x_3 = modP(x_3 + dummy);
|
6668 | return [x_2, x_3];
|
6669 | }
|
6670 | function assertFieldElement(n) {
|
6671 | if (typeof n === 'bigint' && _0n$2 <= n && n < P)
|
6672 | return n;
|
6673 | throw new Error('Expected valid scalar 0 < scalar < CURVE.P');
|
6674 | }
|
6675 | const a24 = (CURVE.a - BigInt(2)) / BigInt(4);
|
6676 | function montgomeryLadder(pointU, scalar) {
|
6677 | const u = assertFieldElement(pointU);
|
6678 | const k = assertFieldElement(scalar);
|
6679 | const x_1 = u;
|
6680 | let x_2 = _1n$2;
|
6681 | let z_2 = _0n$2;
|
6682 | let x_3 = u;
|
6683 | let z_3 = _1n$2;
|
6684 | let swap = _0n$2;
|
6685 | let sw;
|
6686 | for (let t = BigInt(montgomeryBits - 1); t >= _0n$2; t--) {
|
6687 | const k_t = (k >> t) & _1n$2;
|
6688 | swap ^= k_t;
|
6689 | sw = cswap(swap, x_2, x_3);
|
6690 | x_2 = sw[0];
|
6691 | x_3 = sw[1];
|
6692 | sw = cswap(swap, z_2, z_3);
|
6693 | z_2 = sw[0];
|
6694 | z_3 = sw[1];
|
6695 | swap = k_t;
|
6696 | const A = x_2 + z_2;
|
6697 | const AA = modP(A * A);
|
6698 | const B = x_2 - z_2;
|
6699 | const BB = modP(B * B);
|
6700 | const E = AA - BB;
|
6701 | const C = x_3 + z_3;
|
6702 | const D = x_3 - z_3;
|
6703 | const DA = modP(D * A);
|
6704 | const CB = modP(C * B);
|
6705 | const dacb = DA + CB;
|
6706 | const da_cb = DA - CB;
|
6707 | x_3 = modP(dacb * dacb);
|
6708 | z_3 = modP(x_1 * modP(da_cb * da_cb));
|
6709 | x_2 = modP(AA * BB);
|
6710 | z_2 = modP(E * (AA + modP(a24 * E)));
|
6711 | }
|
6712 | sw = cswap(swap, x_2, x_3);
|
6713 | x_2 = sw[0];
|
6714 | x_3 = sw[1];
|
6715 | sw = cswap(swap, z_2, z_3);
|
6716 | z_2 = sw[0];
|
6717 | z_3 = sw[1];
|
6718 | const z2 = powPminus2(z_2);
|
6719 | return modP(x_2 * z2);
|
6720 | }
|
6721 | function encodeUCoordinate(u) {
|
6722 | return numberToBytesLE(modP(u), montgomeryBytes);
|
6723 | }
|
6724 | function decodeUCoordinate(uEnc) {
|
6725 | const u = ensureBytes('u coordinate', uEnc, montgomeryBytes);
|
6726 | if (fieldLen === 32)
|
6727 | u[31] &= 127;
|
6728 | return bytesToNumberLE(u);
|
6729 | }
|
6730 | function decodeScalar(n) {
|
6731 | const bytes = ensureBytes('scalar', n);
|
6732 | const len = bytes.length;
|
6733 | if (len !== montgomeryBytes && len !== fieldLen)
|
6734 | throw new Error(`Expected ${montgomeryBytes} or ${fieldLen} bytes, got ${len}`);
|
6735 | return bytesToNumberLE(adjustScalarBytes(bytes));
|
6736 | }
|
6737 | function scalarMult(scalar, u) {
|
6738 | const pointU = decodeUCoordinate(u);
|
6739 | const _scalar = decodeScalar(scalar);
|
6740 | const pu = montgomeryLadder(pointU, _scalar);
|
6741 | if (pu === _0n$2)
|
6742 | throw new Error('Invalid private or public key received');
|
6743 | return encodeUCoordinate(pu);
|
6744 | }
|
6745 | const GuBytes = encodeUCoordinate(CURVE.Gu);
|
6746 | function scalarMultBase(scalar) {
|
6747 | return scalarMult(scalar, GuBytes);
|
6748 | }
|
6749 | return {
|
6750 | scalarMult,
|
6751 | scalarMultBase,
|
6752 | getSharedSecret: (privateKey, publicKey) => scalarMult(privateKey, publicKey),
|
6753 | getPublicKey: (privateKey) => scalarMultBase(privateKey),
|
6754 | utils: { randomPrivateKey: () => CURVE.randomBytes(CURVE.nByteLength) },
|
6755 | GuBytes: GuBytes,
|
6756 | };
|
6757 | }
|
6758 |
|
6759 | /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
6760 | const ED25519_P = BigInt('57896044618658097711785492504343953926634992332820282019728792003956564819949');
|
6761 | const ED25519_SQRT_M1 = BigInt('19681161376707505956807079304988542015446066515923890162744021073123829784752');
|
6762 | const _0n$1 = BigInt(0), _1n$1 = BigInt(1), _2n$1 = BigInt(2), _5n = BigInt(5);
|
6763 | const _10n = BigInt(10), _20n = BigInt(20), _40n = BigInt(40), _80n = BigInt(80);
|
6764 | function ed25519_pow_2_252_3(x) {
|
6765 | const P = ED25519_P;
|
6766 | const x2 = (x * x) % P;
|
6767 | const b2 = (x2 * x) % P;
|
6768 | const b4 = (pow2(b2, _2n$1, P) * b2) % P;
|
6769 | const b5 = (pow2(b4, _1n$1, P) * x) % P;
|
6770 | const b10 = (pow2(b5, _5n, P) * b5) % P;
|
6771 | const b20 = (pow2(b10, _10n, P) * b10) % P;
|
6772 | const b40 = (pow2(b20, _20n, P) * b20) % P;
|
6773 | const b80 = (pow2(b40, _40n, P) * b40) % P;
|
6774 | const b160 = (pow2(b80, _80n, P) * b80) % P;
|
6775 | const b240 = (pow2(b160, _80n, P) * b80) % P;
|
6776 | const b250 = (pow2(b240, _10n, P) * b10) % P;
|
6777 | const pow_p_5_8 = (pow2(b250, _2n$1, P) * x) % P;
|
6778 | return { pow_p_5_8, b2 };
|
6779 | }
|
6780 | function adjustScalarBytes(bytes) {
|
6781 | bytes[0] &= 248;
|
6782 | bytes[31] &= 127;
|
6783 | bytes[31] |= 64;
|
6784 | return bytes;
|
6785 | }
|
6786 | function uvRatio(u, v) {
|
6787 | const P = ED25519_P;
|
6788 | const v3 = mod(v * v * v, P);
|
6789 | const v7 = mod(v3 * v3 * v, P);
|
6790 | const pow = ed25519_pow_2_252_3(u * v7).pow_p_5_8;
|
6791 | let x = mod(u * v3 * pow, P);
|
6792 | const vx2 = mod(v * x * x, P);
|
6793 | const root1 = x;
|
6794 | const root2 = mod(x * ED25519_SQRT_M1, P);
|
6795 | const useRoot1 = vx2 === u;
|
6796 | const useRoot2 = vx2 === mod(-u, P);
|
6797 | const noRoot = vx2 === mod(-u * ED25519_SQRT_M1, P);
|
6798 | if (useRoot1)
|
6799 | x = root1;
|
6800 | if (useRoot2 || noRoot)
|
6801 | x = root2;
|
6802 | if (isNegativeLE(x, P))
|
6803 | x = mod(-x, P);
|
6804 | return { isValid: useRoot1 || useRoot2, value: x };
|
6805 | }
|
6806 | const Fp = Field(ED25519_P, undefined, true);
|
6807 | const ed25519Defaults = {
|
6808 | a: BigInt(-1),
|
6809 | d: BigInt('37095705934669439343138083508754565189542113879843219016388785533085940283555'),
|
6810 | Fp,
|
6811 | n: BigInt('7237005577332262213973186563042994240857116359379907606001950938285454250989'),
|
6812 | h: BigInt(8),
|
6813 | Gx: BigInt('15112221349535400772501151409588531511454012693041857206046113283949847762202'),
|
6814 | Gy: BigInt('46316835694926478169428394003475163141307993866256225615783033603165251855960'),
|
6815 | hash: sha512,
|
6816 | randomBytes,
|
6817 | adjustScalarBytes,
|
6818 | uvRatio,
|
6819 | };
|
6820 | const ed25519 = twistedEdwards(ed25519Defaults);
|
6821 | function ed25519_domain(data, ctx, phflag) {
|
6822 | if (ctx.length > 255)
|
6823 | throw new Error('Context is too big');
|
6824 | return concatBytes$1(utf8ToBytes$1('SigEd25519 no Ed25519 collisions'), new Uint8Array([phflag ? 1 : 0, ctx.length]), ctx, data);
|
6825 | }
|
6826 | twistedEdwards({
|
6827 | ...ed25519Defaults,
|
6828 | domain: ed25519_domain,
|
6829 | });
|
6830 | twistedEdwards({
|
6831 | ...ed25519Defaults,
|
6832 | domain: ed25519_domain,
|
6833 | prehash: sha512,
|
6834 | });
|
6835 | (() => montgomery({
|
6836 | P: ED25519_P,
|
6837 | a: BigInt(486662),
|
6838 | montgomeryBits: 255,
|
6839 | nByteLength: 32,
|
6840 | Gu: BigInt(9),
|
6841 | powPminus2: (x) => {
|
6842 | const P = ED25519_P;
|
6843 | const { pow_p_5_8, b2 } = ed25519_pow_2_252_3(x);
|
6844 | return mod(pow2(pow_p_5_8, BigInt(3), P) * b2, P);
|
6845 | },
|
6846 | adjustScalarBytes,
|
6847 | randomBytes,
|
6848 | }))();
|
6849 | const ELL2_C1 = (Fp.ORDER + BigInt(3)) / BigInt(8);
|
6850 | const ELL2_C2 = Fp.pow(_2n$1, ELL2_C1);
|
6851 | const ELL2_C3 = Fp.sqrt(Fp.neg(Fp.ONE));
|
6852 | const ELL2_C4 = (Fp.ORDER - BigInt(5)) / BigInt(8);
|
6853 | const ELL2_J = BigInt(486662);
|
6854 | function map_to_curve_elligator2_curve25519(u) {
|
6855 | let tv1 = Fp.sqr(u);
|
6856 | tv1 = Fp.mul(tv1, _2n$1);
|
6857 | let xd = Fp.add(tv1, Fp.ONE);
|
6858 | let x1n = Fp.neg(ELL2_J);
|
6859 | let tv2 = Fp.sqr(xd);
|
6860 | let gxd = Fp.mul(tv2, xd);
|
6861 | let gx1 = Fp.mul(tv1, ELL2_J);
|
6862 | gx1 = Fp.mul(gx1, x1n);
|
6863 | gx1 = Fp.add(gx1, tv2);
|
6864 | gx1 = Fp.mul(gx1, x1n);
|
6865 | let tv3 = Fp.sqr(gxd);
|
6866 | tv2 = Fp.sqr(tv3);
|
6867 | tv3 = Fp.mul(tv3, gxd);
|
6868 | tv3 = Fp.mul(tv3, gx1);
|
6869 | tv2 = Fp.mul(tv2, tv3);
|
6870 | let y11 = Fp.pow(tv2, ELL2_C4);
|
6871 | y11 = Fp.mul(y11, tv3);
|
6872 | let y12 = Fp.mul(y11, ELL2_C3);
|
6873 | tv2 = Fp.sqr(y11);
|
6874 | tv2 = Fp.mul(tv2, gxd);
|
6875 | let e1 = Fp.eql(tv2, gx1);
|
6876 | let y1 = Fp.cmov(y12, y11, e1);
|
6877 | let x2n = Fp.mul(x1n, tv1);
|
6878 | let y21 = Fp.mul(y11, u);
|
6879 | y21 = Fp.mul(y21, ELL2_C2);
|
6880 | let y22 = Fp.mul(y21, ELL2_C3);
|
6881 | let gx2 = Fp.mul(gx1, tv1);
|
6882 | tv2 = Fp.sqr(y21);
|
6883 | tv2 = Fp.mul(tv2, gxd);
|
6884 | let e2 = Fp.eql(tv2, gx2);
|
6885 | let y2 = Fp.cmov(y22, y21, e2);
|
6886 | tv2 = Fp.sqr(y1);
|
6887 | tv2 = Fp.mul(tv2, gxd);
|
6888 | let e3 = Fp.eql(tv2, gx1);
|
6889 | let xn = Fp.cmov(x2n, x1n, e3);
|
6890 | let y = Fp.cmov(y2, y1, e3);
|
6891 | let e4 = Fp.isOdd(y);
|
6892 | y = Fp.cmov(y, Fp.neg(y), e3 !== e4);
|
6893 | return { xMn: xn, xMd: xd, yMn: y, yMd: _1n$1 };
|
6894 | }
|
6895 | const ELL2_C1_EDWARDS = FpSqrtEven(Fp, Fp.neg(BigInt(486664)));
|
6896 | function map_to_curve_elligator2_edwards25519(u) {
|
6897 | const { xMn, xMd, yMn, yMd } = map_to_curve_elligator2_curve25519(u);
|
6898 | let xn = Fp.mul(xMn, yMd);
|
6899 | xn = Fp.mul(xn, ELL2_C1_EDWARDS);
|
6900 | let xd = Fp.mul(xMd, yMn);
|
6901 | let yn = Fp.sub(xMn, xMd);
|
6902 | let yd = Fp.add(xMn, xMd);
|
6903 | let tv1 = Fp.mul(xd, yd);
|
6904 | let e = Fp.eql(tv1, Fp.ZERO);
|
6905 | xn = Fp.cmov(xn, Fp.ZERO, e);
|
6906 | xd = Fp.cmov(xd, Fp.ONE, e);
|
6907 | yn = Fp.cmov(yn, Fp.ONE, e);
|
6908 | yd = Fp.cmov(yd, Fp.ONE, e);
|
6909 | const inv = Fp.invertBatch([xd, yd]);
|
6910 | return { x: Fp.mul(xn, inv[0]), y: Fp.mul(yn, inv[1]) };
|
6911 | }
|
6912 | (() => createHasher(ed25519.ExtendedPoint, (scalars) => map_to_curve_elligator2_edwards25519(scalars[0]), {
|
6913 | DST: 'edwards25519_XMD:SHA-512_ELL2_RO_',
|
6914 | encodeDST: 'edwards25519_XMD:SHA-512_ELL2_NU_',
|
6915 | p: Fp.ORDER,
|
6916 | m: 1,
|
6917 | k: 128,
|
6918 | expand: 'xmd',
|
6919 | hash: sha512,
|
6920 | }))();
|
6921 | function assertRstPoint(other) {
|
6922 | if (!(other instanceof RistPoint))
|
6923 | throw new Error('RistrettoPoint expected');
|
6924 | }
|
6925 | const SQRT_M1 = ED25519_SQRT_M1;
|
6926 | const SQRT_AD_MINUS_ONE = BigInt('25063068953384623474111414158702152701244531502492656460079210482610430750235');
|
6927 | const INVSQRT_A_MINUS_D = BigInt('54469307008909316920995813868745141605393597292927456921205312896311721017578');
|
6928 | const ONE_MINUS_D_SQ = BigInt('1159843021668779879193775521855586647937357759715417654439879720876111806838');
|
6929 | const D_MINUS_ONE_SQ = BigInt('40440834346308536858101042469323190826248399146238708352240133220865137265952');
|
6930 | const invertSqrt = (number) => uvRatio(_1n$1, number);
|
6931 | const MAX_255B = BigInt('0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff');
|
6932 | const bytes255ToNumberLE = (bytes) => ed25519.CURVE.Fp.create(bytesToNumberLE(bytes) & MAX_255B);
|
6933 | function calcElligatorRistrettoMap(r0) {
|
6934 | const { d } = ed25519.CURVE;
|
6935 | const P = ed25519.CURVE.Fp.ORDER;
|
6936 | const mod = ed25519.CURVE.Fp.create;
|
6937 | const r = mod(SQRT_M1 * r0 * r0);
|
6938 | const Ns = mod((r + _1n$1) * ONE_MINUS_D_SQ);
|
6939 | let c = BigInt(-1);
|
6940 | const D = mod((c - d * r) * mod(r + d));
|
6941 | let { isValid: Ns_D_is_sq, value: s } = uvRatio(Ns, D);
|
6942 | let s_ = mod(s * r0);
|
6943 | if (!isNegativeLE(s_, P))
|
6944 | s_ = mod(-s_);
|
6945 | if (!Ns_D_is_sq)
|
6946 | s = s_;
|
6947 | if (!Ns_D_is_sq)
|
6948 | c = r;
|
6949 | const Nt = mod(c * (r - _1n$1) * D_MINUS_ONE_SQ - D);
|
6950 | const s2 = s * s;
|
6951 | const W0 = mod((s + s) * D);
|
6952 | const W1 = mod(Nt * SQRT_AD_MINUS_ONE);
|
6953 | const W2 = mod(_1n$1 - s2);
|
6954 | const W3 = mod(_1n$1 + s2);
|
6955 | return new ed25519.ExtendedPoint(mod(W0 * W3), mod(W2 * W1), mod(W1 * W3), mod(W0 * W2));
|
6956 | }
|
6957 | class RistPoint {
|
6958 | constructor(ep) {
|
6959 | this.ep = ep;
|
6960 | }
|
6961 | static fromAffine(ap) {
|
6962 | return new RistPoint(ed25519.ExtendedPoint.fromAffine(ap));
|
6963 | }
|
6964 | static hashToCurve(hex) {
|
6965 | hex = ensureBytes('ristrettoHash', hex, 64);
|
6966 | const r1 = bytes255ToNumberLE(hex.slice(0, 32));
|
6967 | const R1 = calcElligatorRistrettoMap(r1);
|
6968 | const r2 = bytes255ToNumberLE(hex.slice(32, 64));
|
6969 | const R2 = calcElligatorRistrettoMap(r2);
|
6970 | return new RistPoint(R1.add(R2));
|
6971 | }
|
6972 | static fromHex(hex) {
|
6973 | hex = ensureBytes('ristrettoHex', hex, 32);
|
6974 | const { a, d } = ed25519.CURVE;
|
6975 | const P = ed25519.CURVE.Fp.ORDER;
|
6976 | const mod = ed25519.CURVE.Fp.create;
|
6977 | const emsg = 'RistrettoPoint.fromHex: the hex is not valid encoding of RistrettoPoint';
|
6978 | const s = bytes255ToNumberLE(hex);
|
6979 | if (!equalBytes(numberToBytesLE(s, 32), hex) || isNegativeLE(s, P))
|
6980 | throw new Error(emsg);
|
6981 | const s2 = mod(s * s);
|
6982 | const u1 = mod(_1n$1 + a * s2);
|
6983 | const u2 = mod(_1n$1 - a * s2);
|
6984 | const u1_2 = mod(u1 * u1);
|
6985 | const u2_2 = mod(u2 * u2);
|
6986 | const v = mod(a * d * u1_2 - u2_2);
|
6987 | const { isValid, value: I } = invertSqrt(mod(v * u2_2));
|
6988 | const Dx = mod(I * u2);
|
6989 | const Dy = mod(I * Dx * v);
|
6990 | let x = mod((s + s) * Dx);
|
6991 | if (isNegativeLE(x, P))
|
6992 | x = mod(-x);
|
6993 | const y = mod(u1 * Dy);
|
6994 | const t = mod(x * y);
|
6995 | if (!isValid || isNegativeLE(t, P) || y === _0n$1)
|
6996 | throw new Error(emsg);
|
6997 | return new RistPoint(new ed25519.ExtendedPoint(x, y, _1n$1, t));
|
6998 | }
|
6999 | toRawBytes() {
|
7000 | let { ex: x, ey: y, ez: z, et: t } = this.ep;
|
7001 | const P = ed25519.CURVE.Fp.ORDER;
|
7002 | const mod = ed25519.CURVE.Fp.create;
|
7003 | const u1 = mod(mod(z + y) * mod(z - y));
|
7004 | const u2 = mod(x * y);
|
7005 | const u2sq = mod(u2 * u2);
|
7006 | const { value: invsqrt } = invertSqrt(mod(u1 * u2sq));
|
7007 | const D1 = mod(invsqrt * u1);
|
7008 | const D2 = mod(invsqrt * u2);
|
7009 | const zInv = mod(D1 * D2 * t);
|
7010 | let D;
|
7011 | if (isNegativeLE(t * zInv, P)) {
|
7012 | let _x = mod(y * SQRT_M1);
|
7013 | let _y = mod(x * SQRT_M1);
|
7014 | x = _x;
|
7015 | y = _y;
|
7016 | D = mod(D1 * INVSQRT_A_MINUS_D);
|
7017 | }
|
7018 | else {
|
7019 | D = D2;
|
7020 | }
|
7021 | if (isNegativeLE(x * zInv, P))
|
7022 | y = mod(-y);
|
7023 | let s = mod((z - y) * D);
|
7024 | if (isNegativeLE(s, P))
|
7025 | s = mod(-s);
|
7026 | return numberToBytesLE(s, 32);
|
7027 | }
|
7028 | toHex() {
|
7029 | return bytesToHex(this.toRawBytes());
|
7030 | }
|
7031 | toString() {
|
7032 | return this.toHex();
|
7033 | }
|
7034 | equals(other) {
|
7035 | assertRstPoint(other);
|
7036 | const { ex: X1, ey: Y1 } = this.ep;
|
7037 | const { ex: X2, ey: Y2 } = other.ep;
|
7038 | const mod = ed25519.CURVE.Fp.create;
|
7039 | const one = mod(X1 * Y2) === mod(Y1 * X2);
|
7040 | const two = mod(Y1 * Y2) === mod(X1 * X2);
|
7041 | return one || two;
|
7042 | }
|
7043 | add(other) {
|
7044 | assertRstPoint(other);
|
7045 | return new RistPoint(this.ep.add(other.ep));
|
7046 | }
|
7047 | subtract(other) {
|
7048 | assertRstPoint(other);
|
7049 | return new RistPoint(this.ep.subtract(other.ep));
|
7050 | }
|
7051 | multiply(scalar) {
|
7052 | return new RistPoint(this.ep.multiply(scalar));
|
7053 | }
|
7054 | multiplyUnsafe(scalar) {
|
7055 | return new RistPoint(this.ep.multiplyUnsafe(scalar));
|
7056 | }
|
7057 | double() {
|
7058 | return new RistPoint(this.ep.double());
|
7059 | }
|
7060 | negate() {
|
7061 | return new RistPoint(this.ep.negate());
|
7062 | }
|
7063 | }
|
7064 | (() => {
|
7065 | if (!RistPoint.BASE)
|
7066 | RistPoint.BASE = new RistPoint(ed25519.ExtendedPoint.BASE);
|
7067 | if (!RistPoint.ZERO)
|
7068 | RistPoint.ZERO = new RistPoint(ed25519.ExtendedPoint.ZERO);
|
7069 | return RistPoint;
|
7070 | })();
|
7071 |
|
7072 | function ed25519PairFromSeed(seed, onlyJs) {
|
7073 | if (!util.hasBigInt || (!onlyJs && isReady())) {
|
7074 | const full = ed25519KeypairFromSeed(seed);
|
7075 | return {
|
7076 | publicKey: full.slice(32),
|
7077 | secretKey: full.slice(0, 64)
|
7078 | };
|
7079 | }
|
7080 | const publicKey = ed25519.getPublicKey(seed);
|
7081 | return {
|
7082 | publicKey,
|
7083 | secretKey: util.u8aConcatStrict([seed, publicKey])
|
7084 | };
|
7085 | }
|
7086 |
|
7087 | function ed25519PairFromRandom() {
|
7088 | return ed25519PairFromSeed(randomAsU8a());
|
7089 | }
|
7090 |
|
7091 | function ed25519PairFromSecret(secretKey) {
|
7092 | if (secretKey.length !== 64) {
|
7093 | throw new Error('Invalid secretKey provided');
|
7094 | }
|
7095 | return {
|
7096 | publicKey: secretKey.slice(32),
|
7097 | secretKey
|
7098 | };
|
7099 | }
|
7100 |
|
7101 | function ed25519PairFromString(value) {
|
7102 | return ed25519PairFromSeed(blake2AsU8a(util.stringToU8a(value)));
|
7103 | }
|
7104 |
|
7105 | function ed25519Sign(message, { publicKey, secretKey }, onlyJs) {
|
7106 | if (!secretKey) {
|
7107 | throw new Error('Expected a valid secretKey');
|
7108 | }
|
7109 | else if (!publicKey) {
|
7110 | throw new Error('Expected a valid publicKey');
|
7111 | }
|
7112 | const messageU8a = util.u8aToU8a(message);
|
7113 | const privateU8a = secretKey.subarray(0, 32);
|
7114 | return !util.hasBigInt || (!onlyJs && isReady())
|
7115 | ? ed25519Sign$1(publicKey, privateU8a, messageU8a)
|
7116 | : ed25519.sign(messageU8a, privateU8a);
|
7117 | }
|
7118 |
|
7119 | function ed25519Verify(message, signature, publicKey, onlyJs) {
|
7120 | const messageU8a = util.u8aToU8a(message);
|
7121 | const publicKeyU8a = util.u8aToU8a(publicKey);
|
7122 | const signatureU8a = util.u8aToU8a(signature);
|
7123 | if (publicKeyU8a.length !== 32) {
|
7124 | throw new Error(`Invalid publicKey, received ${publicKeyU8a.length}, expected 32`);
|
7125 | }
|
7126 | else if (signatureU8a.length !== 64) {
|
7127 | throw new Error(`Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
|
7128 | }
|
7129 | try {
|
7130 | return !util.hasBigInt || (!onlyJs && isReady())
|
7131 | ? ed25519Verify$1(signatureU8a, messageU8a, publicKeyU8a)
|
7132 | : ed25519.verify(signatureU8a, messageU8a, publicKeyU8a);
|
7133 | }
|
7134 | catch {
|
7135 | return false;
|
7136 | }
|
7137 | }
|
7138 |
|
7139 | const keyHdkdEd25519 = createSeedDeriveFn(ed25519PairFromSeed, ed25519DeriveHard);
|
7140 |
|
7141 | const SEC_LEN = 64;
|
7142 | const PUB_LEN = 32;
|
7143 | const TOT_LEN = SEC_LEN + PUB_LEN;
|
7144 | function sr25519PairFromU8a(full) {
|
7145 | const fullU8a = util.u8aToU8a(full);
|
7146 | if (fullU8a.length !== TOT_LEN) {
|
7147 | throw new Error(`Expected keypair with ${TOT_LEN} bytes, found ${fullU8a.length}`);
|
7148 | }
|
7149 | return {
|
7150 | publicKey: fullU8a.slice(SEC_LEN, TOT_LEN),
|
7151 | secretKey: fullU8a.slice(0, SEC_LEN)
|
7152 | };
|
7153 | }
|
7154 |
|
7155 | function sr25519KeypairToU8a({ publicKey, secretKey }) {
|
7156 | return util.u8aConcat(secretKey, publicKey).slice();
|
7157 | }
|
7158 |
|
7159 | function createDeriveFn(derive) {
|
7160 | return (keypair, chainCode) => {
|
7161 | if (!util.isU8a(chainCode) || chainCode.length !== 32) {
|
7162 | throw new Error('Invalid chainCode passed to derive');
|
7163 | }
|
7164 | return sr25519PairFromU8a(derive(sr25519KeypairToU8a(keypair), chainCode));
|
7165 | };
|
7166 | }
|
7167 |
|
7168 | const sr25519DeriveHard = createDeriveFn(sr25519DeriveKeypairHard);
|
7169 |
|
7170 | const sr25519DeriveSoft = createDeriveFn(sr25519DeriveKeypairSoft);
|
7171 |
|
7172 | function keyHdkdSr25519(keypair, { chainCode, isSoft }) {
|
7173 | return isSoft
|
7174 | ? sr25519DeriveSoft(keypair, chainCode)
|
7175 | : sr25519DeriveHard(keypair, chainCode);
|
7176 | }
|
7177 |
|
7178 | const generators = {
|
7179 | ecdsa: keyHdkdEcdsa,
|
7180 | ed25519: keyHdkdEd25519,
|
7181 | ethereum: keyHdkdEcdsa,
|
7182 | sr25519: keyHdkdSr25519
|
7183 | };
|
7184 | function keyFromPath(pair, path, type) {
|
7185 | const keyHdkd = generators[type];
|
7186 | let result = pair;
|
7187 | for (const junction of path) {
|
7188 | result = keyHdkd(result, junction);
|
7189 | }
|
7190 | return result;
|
7191 | }
|
7192 |
|
7193 | function sr25519Agreement(secretKey, publicKey) {
|
7194 | const secretKeyU8a = util.u8aToU8a(secretKey);
|
7195 | const publicKeyU8a = util.u8aToU8a(publicKey);
|
7196 | if (publicKeyU8a.length !== 32) {
|
7197 | throw new Error(`Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
|
7198 | }
|
7199 | else if (secretKeyU8a.length !== 64) {
|
7200 | throw new Error(`Invalid secretKey, received ${secretKeyU8a.length} bytes, expected 64`);
|
7201 | }
|
7202 | return sr25519Agree(publicKeyU8a, secretKeyU8a);
|
7203 | }
|
7204 |
|
7205 | function sr25519DerivePublic(publicKey, chainCode) {
|
7206 | const publicKeyU8a = util.u8aToU8a(publicKey);
|
7207 | if (!util.isU8a(chainCode) || chainCode.length !== 32) {
|
7208 | throw new Error('Invalid chainCode passed to derive');
|
7209 | }
|
7210 | else if (publicKeyU8a.length !== 32) {
|
7211 | throw new Error(`Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
|
7212 | }
|
7213 | return sr25519DerivePublicSoft(publicKeyU8a, chainCode);
|
7214 | }
|
7215 |
|
7216 | function sr25519PairFromSeed(seed) {
|
7217 | const seedU8a = util.u8aToU8a(seed);
|
7218 | if (seedU8a.length !== 32) {
|
7219 | throw new Error(`Expected a seed matching 32 bytes, found ${seedU8a.length}`);
|
7220 | }
|
7221 | return sr25519PairFromU8a(sr25519KeypairFromSeed(seedU8a));
|
7222 | }
|
7223 |
|
7224 | function sr25519Sign(message, { publicKey, secretKey }) {
|
7225 | if (publicKey?.length !== 32) {
|
7226 | throw new Error('Expected a valid publicKey, 32-bytes');
|
7227 | }
|
7228 | else if (secretKey?.length !== 64) {
|
7229 | throw new Error('Expected a valid secretKey, 64-bytes');
|
7230 | }
|
7231 | return sr25519Sign$1(publicKey, secretKey, util.u8aToU8a(message));
|
7232 | }
|
7233 |
|
7234 | function sr25519Verify(message, signature, publicKey) {
|
7235 | const publicKeyU8a = util.u8aToU8a(publicKey);
|
7236 | const signatureU8a = util.u8aToU8a(signature);
|
7237 | if (publicKeyU8a.length !== 32) {
|
7238 | throw new Error(`Invalid publicKey, received ${publicKeyU8a.length} bytes, expected 32`);
|
7239 | }
|
7240 | else if (signatureU8a.length !== 64) {
|
7241 | throw new Error(`Invalid signature, received ${signatureU8a.length} bytes, expected 64`);
|
7242 | }
|
7243 | return sr25519Verify$1(signatureU8a, util.u8aToU8a(message), publicKeyU8a);
|
7244 | }
|
7245 |
|
7246 | const EMPTY_U8A$1 = new Uint8Array();
|
7247 | function sr25519VrfSign(message, { secretKey }, context = EMPTY_U8A$1, extra = EMPTY_U8A$1) {
|
7248 | if (secretKey?.length !== 64) {
|
7249 | throw new Error('Invalid secretKey, expected 64-bytes');
|
7250 | }
|
7251 | return vrfSign(secretKey, util.u8aToU8a(context), util.u8aToU8a(message), util.u8aToU8a(extra));
|
7252 | }
|
7253 |
|
7254 | const EMPTY_U8A = new Uint8Array();
|
7255 | function sr25519VrfVerify(message, signOutput, publicKey, context = EMPTY_U8A, extra = EMPTY_U8A) {
|
7256 | const publicKeyU8a = util.u8aToU8a(publicKey);
|
7257 | const proofU8a = util.u8aToU8a(signOutput);
|
7258 | if (publicKeyU8a.length !== 32) {
|
7259 | throw new Error('Invalid publicKey, expected 32-bytes');
|
7260 | }
|
7261 | else if (proofU8a.length !== 96) {
|
7262 | throw new Error('Invalid vrfSign output, expected 96 bytes');
|
7263 | }
|
7264 | return vrfVerify(publicKeyU8a, util.u8aToU8a(context), util.u8aToU8a(message), util.u8aToU8a(extra), proofU8a);
|
7265 | }
|
7266 |
|
7267 | function encodeAddress(key, ss58Format = defaults.prefix) {
|
7268 | const u8a = decodeAddress(key);
|
7269 | if ((ss58Format < 0) || (ss58Format > 16383) || [46, 47].includes(ss58Format)) {
|
7270 | throw new Error('Out of range ss58Format specified');
|
7271 | }
|
7272 | else if (!defaults.allowedDecodedLengths.includes(u8a.length)) {
|
7273 | throw new Error(`Expected a valid key to convert, with length ${defaults.allowedDecodedLengths.join(', ')}`);
|
7274 | }
|
7275 | const input = util.u8aConcat(ss58Format < 64
|
7276 | ? [ss58Format]
|
7277 | : [
|
7278 | ((ss58Format & 0b0000_0000_1111_1100) >> 2) | 0b0100_0000,
|
7279 | (ss58Format >> 8) | ((ss58Format & 0b0000_0000_0000_0011) << 6)
|
7280 | ], u8a);
|
7281 | return base58Encode(util.u8aConcat(input, sshash(input).subarray(0, [32, 33].includes(u8a.length) ? 2 : 1)));
|
7282 | }
|
7283 |
|
7284 | function filterHard({ isHard }) {
|
7285 | return isHard;
|
7286 | }
|
7287 | function deriveAddress(who, suri, ss58Format) {
|
7288 | const { path } = keyExtractPath(suri);
|
7289 | if (!path.length || path.every(filterHard)) {
|
7290 | throw new Error('Expected suri to contain a combination of non-hard paths');
|
7291 | }
|
7292 | let publicKey = decodeAddress(who);
|
7293 | for (const { chainCode } of path) {
|
7294 | publicKey = sr25519DerivePublic(publicKey, chainCode);
|
7295 | }
|
7296 | return encodeAddress(publicKey, ss58Format);
|
7297 | }
|
7298 |
|
7299 | const PREFIX$1 = util.stringToU8a('modlpy/utilisuba');
|
7300 | function createKeyDerived(who, index) {
|
7301 | return blake2AsU8a(util.u8aConcat(PREFIX$1, decodeAddress(who), util.bnToU8a(index, BN_LE_16_OPTS)));
|
7302 | }
|
7303 |
|
7304 | function encodeDerivedAddress(who, index, ss58Format) {
|
7305 | return encodeAddress(createKeyDerived(decodeAddress(who), index), ss58Format);
|
7306 | }
|
7307 |
|
7308 | function addressToU8a(who) {
|
7309 | return decodeAddress(who);
|
7310 | }
|
7311 |
|
7312 | const PREFIX = util.stringToU8a('modlpy/utilisuba');
|
7313 | function createKeyMulti(who, threshold) {
|
7314 | return blake2AsU8a(util.u8aConcat(PREFIX, util.compactToU8a(who.length), ...util.u8aSorted(who.map(addressToU8a)), util.bnToU8a(threshold, BN_LE_16_OPTS)));
|
7315 | }
|
7316 |
|
7317 | function encodeMultiAddress(who, threshold, ss58Format) {
|
7318 | return encodeAddress(createKeyMulti(who, threshold), ss58Format);
|
7319 | }
|
7320 |
|
7321 | function addressEq(a, b) {
|
7322 | return util.u8aEq(decodeAddress(a), decodeAddress(b));
|
7323 | }
|
7324 |
|
7325 | const [SHA3_PI, SHA3_ROTL, _SHA3_IOTA] = [[], [], []];
|
7326 | const _0n = BigInt(0);
|
7327 | const _1n = BigInt(1);
|
7328 | const _2n = BigInt(2);
|
7329 | const _7n$1 = BigInt(7);
|
7330 | const _256n$1 = BigInt(256);
|
7331 | const _0x71n = BigInt(0x71);
|
7332 | for (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {
|
7333 | [x, y] = [y, (2 * x + 3 * y) % 5];
|
7334 | SHA3_PI.push(2 * (5 * y + x));
|
7335 | SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);
|
7336 | let t = _0n;
|
7337 | for (let j = 0; j < 7; j++) {
|
7338 | R = ((R << _1n) ^ ((R >> _7n$1) * _0x71n)) % _256n$1;
|
7339 | if (R & _2n)
|
7340 | t ^= _1n << ((_1n << BigInt(j)) - _1n);
|
7341 | }
|
7342 | _SHA3_IOTA.push(t);
|
7343 | }
|
7344 | const [SHA3_IOTA_H, SHA3_IOTA_L] = split(_SHA3_IOTA, true);
|
7345 | const rotlH = (h, l, s) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));
|
7346 | const rotlL = (h, l, s) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));
|
7347 | function keccakP(s, rounds = 24) {
|
7348 | const B = new Uint32Array(5 * 2);
|
7349 | for (let round = 24 - rounds; round < 24; round++) {
|
7350 | for (let x = 0; x < 10; x++)
|
7351 | B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];
|
7352 | for (let x = 0; x < 10; x += 2) {
|
7353 | const idx1 = (x + 8) % 10;
|
7354 | const idx0 = (x + 2) % 10;
|
7355 | const B0 = B[idx0];
|
7356 | const B1 = B[idx0 + 1];
|
7357 | const Th = rotlH(B0, B1, 1) ^ B[idx1];
|
7358 | const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];
|
7359 | for (let y = 0; y < 50; y += 10) {
|
7360 | s[x + y] ^= Th;
|
7361 | s[x + y + 1] ^= Tl;
|
7362 | }
|
7363 | }
|
7364 | let curH = s[2];
|
7365 | let curL = s[3];
|
7366 | for (let t = 0; t < 24; t++) {
|
7367 | const shift = SHA3_ROTL[t];
|
7368 | const Th = rotlH(curH, curL, shift);
|
7369 | const Tl = rotlL(curH, curL, shift);
|
7370 | const PI = SHA3_PI[t];
|
7371 | curH = s[PI];
|
7372 | curL = s[PI + 1];
|
7373 | s[PI] = Th;
|
7374 | s[PI + 1] = Tl;
|
7375 | }
|
7376 | for (let y = 0; y < 50; y += 10) {
|
7377 | for (let x = 0; x < 10; x++)
|
7378 | B[x] = s[y + x];
|
7379 | for (let x = 0; x < 10; x++)
|
7380 | s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];
|
7381 | }
|
7382 | s[0] ^= SHA3_IOTA_H[round];
|
7383 | s[1] ^= SHA3_IOTA_L[round];
|
7384 | }
|
7385 | B.fill(0);
|
7386 | }
|
7387 | class Keccak extends Hash {
|
7388 | constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {
|
7389 | super();
|
7390 | this.blockLen = blockLen;
|
7391 | this.suffix = suffix;
|
7392 | this.outputLen = outputLen;
|
7393 | this.enableXOF = enableXOF;
|
7394 | this.rounds = rounds;
|
7395 | this.pos = 0;
|
7396 | this.posOut = 0;
|
7397 | this.finished = false;
|
7398 | this.destroyed = false;
|
7399 | number(outputLen);
|
7400 | if (0 >= this.blockLen || this.blockLen >= 200)
|
7401 | throw new Error('Sha3 supports only keccak-f1600 function');
|
7402 | this.state = new Uint8Array(200);
|
7403 | this.state32 = u32(this.state);
|
7404 | }
|
7405 | keccak() {
|
7406 | keccakP(this.state32, this.rounds);
|
7407 | this.posOut = 0;
|
7408 | this.pos = 0;
|
7409 | }
|
7410 | update(data) {
|
7411 | exists(this);
|
7412 | const { blockLen, state } = this;
|
7413 | data = toBytes(data);
|
7414 | const len = data.length;
|
7415 | for (let pos = 0; pos < len;) {
|
7416 | const take = Math.min(blockLen - this.pos, len - pos);
|
7417 | for (let i = 0; i < take; i++)
|
7418 | state[this.pos++] ^= data[pos++];
|
7419 | if (this.pos === blockLen)
|
7420 | this.keccak();
|
7421 | }
|
7422 | return this;
|
7423 | }
|
7424 | finish() {
|
7425 | if (this.finished)
|
7426 | return;
|
7427 | this.finished = true;
|
7428 | const { state, suffix, pos, blockLen } = this;
|
7429 | state[pos] ^= suffix;
|
7430 | if ((suffix & 0x80) !== 0 && pos === blockLen - 1)
|
7431 | this.keccak();
|
7432 | state[blockLen - 1] ^= 0x80;
|
7433 | this.keccak();
|
7434 | }
|
7435 | writeInto(out) {
|
7436 | exists(this, false);
|
7437 | bytes(out);
|
7438 | this.finish();
|
7439 | const bufferOut = this.state;
|
7440 | const { blockLen } = this;
|
7441 | for (let pos = 0, len = out.length; pos < len;) {
|
7442 | if (this.posOut >= blockLen)
|
7443 | this.keccak();
|
7444 | const take = Math.min(blockLen - this.posOut, len - pos);
|
7445 | out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);
|
7446 | this.posOut += take;
|
7447 | pos += take;
|
7448 | }
|
7449 | return out;
|
7450 | }
|
7451 | xofInto(out) {
|
7452 | if (!this.enableXOF)
|
7453 | throw new Error('XOF is not possible for this instance');
|
7454 | return this.writeInto(out);
|
7455 | }
|
7456 | xof(bytes) {
|
7457 | number(bytes);
|
7458 | return this.xofInto(new Uint8Array(bytes));
|
7459 | }
|
7460 | digestInto(out) {
|
7461 | output(out, this);
|
7462 | if (this.finished)
|
7463 | throw new Error('digest() was already called');
|
7464 | this.writeInto(out);
|
7465 | this.destroy();
|
7466 | return out;
|
7467 | }
|
7468 | digest() {
|
7469 | return this.digestInto(new Uint8Array(this.outputLen));
|
7470 | }
|
7471 | destroy() {
|
7472 | this.destroyed = true;
|
7473 | this.state.fill(0);
|
7474 | }
|
7475 | _cloneInto(to) {
|
7476 | const { blockLen, suffix, outputLen, rounds, enableXOF } = this;
|
7477 | to || (to = new Keccak(blockLen, suffix, outputLen, enableXOF, rounds));
|
7478 | to.state32.set(this.state32);
|
7479 | to.pos = this.pos;
|
7480 | to.posOut = this.posOut;
|
7481 | to.finished = this.finished;
|
7482 | to.rounds = rounds;
|
7483 | to.suffix = suffix;
|
7484 | to.outputLen = outputLen;
|
7485 | to.enableXOF = enableXOF;
|
7486 | to.destroyed = this.destroyed;
|
7487 | return to;
|
7488 | }
|
7489 | }
|
7490 | const gen = (suffix, blockLen, outputLen) => wrapConstructor(() => new Keccak(blockLen, suffix, outputLen));
|
7491 | gen(0x06, 144, 224 / 8);
|
7492 | gen(0x06, 136, 256 / 8);
|
7493 | gen(0x06, 104, 384 / 8);
|
7494 | gen(0x06, 72, 512 / 8);
|
7495 | gen(0x01, 144, 224 / 8);
|
7496 | const keccak_256 = gen(0x01, 136, 256 / 8);
|
7497 | gen(0x01, 104, 384 / 8);
|
7498 | const keccak_512 = gen(0x01, 72, 512 / 8);
|
7499 | const genShake = (suffix, blockLen, outputLen) => wrapXOFConstructorWithOpts((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true));
|
7500 | genShake(0x1f, 168, 128 / 8);
|
7501 | genShake(0x1f, 136, 256 / 8);
|
7502 |
|
7503 | const keccakAsU8a = createDualHasher({ 256: keccak256, 512: keccak512 }, { 256: keccak_256, 512: keccak_512 });
|
7504 | const keccak256AsU8a = createBitHasher(256, keccakAsU8a);
|
7505 | const keccak512AsU8a = createBitHasher(512, keccakAsU8a);
|
7506 | const keccakAsHex = createAsHex(keccakAsU8a);
|
7507 |
|
7508 | function hasher(hashType, data, onlyJs) {
|
7509 | return hashType === 'keccak'
|
7510 | ? keccakAsU8a(data, undefined, onlyJs)
|
7511 | : blake2AsU8a(data, undefined, undefined, onlyJs);
|
7512 | }
|
7513 |
|
7514 | function evmToAddress(evmAddress, ss58Format, hashType = 'blake2') {
|
7515 | const message = util.u8aConcat('evm:', evmAddress);
|
7516 | if (message.length !== 24) {
|
7517 | throw new Error(`Converting ${evmAddress}: Invalid evm address length`);
|
7518 | }
|
7519 | return encodeAddress(hasher(hashType, message), ss58Format);
|
7520 | }
|
7521 |
|
7522 | function validateAddress(encoded, ignoreChecksum, ss58Format) {
|
7523 | return !!decodeAddress(encoded, ignoreChecksum, ss58Format);
|
7524 | }
|
7525 |
|
7526 | function isAddress(address, ignoreChecksum, ss58Format) {
|
7527 | try {
|
7528 | return validateAddress(address, ignoreChecksum, ss58Format);
|
7529 | }
|
7530 | catch {
|
7531 | return false;
|
7532 | }
|
7533 | }
|
7534 |
|
7535 | function sortAddresses(addresses, ss58Format) {
|
7536 | const u8aToAddress = (u8a) => encodeAddress(u8a, ss58Format);
|
7537 | return util.u8aSorted(addresses.map(addressToU8a)).map(u8aToAddress);
|
7538 | }
|
7539 |
|
7540 | const l = util.logger('setSS58Format');
|
7541 | function setSS58Format(prefix) {
|
7542 | l.warn('Global setting of the ss58Format is deprecated and not recommended. Set format on the keyring (if used) or as part of the address encode function');
|
7543 | defaults.prefix = prefix;
|
7544 | }
|
7545 |
|
7546 | const chars = 'abcdefghijklmnopqrstuvwxyz234567';
|
7547 | const config$1 = {
|
7548 | chars,
|
7549 | coder: utils.chain(
|
7550 | utils.radix2(5), utils.alphabet(chars), {
|
7551 | decode: (input) => input.split(''),
|
7552 | encode: (input) => input.join('')
|
7553 | }),
|
7554 | ipfs: 'b',
|
7555 | type: 'base32'
|
7556 | };
|
7557 | const base32Validate = createValidate(config$1);
|
7558 | const isBase32 = createIs(base32Validate);
|
7559 | const base32Decode = createDecode(config$1, base32Validate);
|
7560 | const base32Encode = createEncode(config$1);
|
7561 |
|
7562 | const config = {
|
7563 | chars: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
|
7564 | coder: base64,
|
7565 | type: 'base64',
|
7566 | withPadding: true
|
7567 | };
|
7568 | const base64Validate = createValidate(config);
|
7569 | const isBase64 = createIs(base64Validate);
|
7570 | const base64Decode = createDecode(config, base64Validate);
|
7571 | const base64Encode = createEncode(config);
|
7572 |
|
7573 | function base64Pad(value) {
|
7574 | return value.padEnd(value.length + (value.length % 4), '=');
|
7575 | }
|
7576 |
|
7577 | function base64Trim(value) {
|
7578 | while (value.length && value.endsWith('=')) {
|
7579 | value = value.slice(0, -1);
|
7580 | }
|
7581 | return value;
|
7582 | }
|
7583 |
|
7584 | function secp256k1Compress(publicKey, onlyJs) {
|
7585 | if (![33, 65].includes(publicKey.length)) {
|
7586 | throw new Error(`Invalid publicKey provided, received ${publicKey.length} bytes input`);
|
7587 | }
|
7588 | if (publicKey.length === 33) {
|
7589 | return publicKey;
|
7590 | }
|
7591 | return !util.hasBigInt || (!onlyJs && isReady())
|
7592 | ? secp256k1Compress$1(publicKey)
|
7593 | : secp256k1.ProjectivePoint.fromHex(publicKey).toRawBytes(true);
|
7594 | }
|
7595 |
|
7596 | function secp256k1Expand(publicKey, onlyJs) {
|
7597 | if (![33, 65].includes(publicKey.length)) {
|
7598 | throw new Error(`Invalid publicKey provided, received ${publicKey.length} bytes input`);
|
7599 | }
|
7600 | if (publicKey.length === 65) {
|
7601 | return publicKey.subarray(1);
|
7602 | }
|
7603 | if (!util.hasBigInt || (!onlyJs && isReady())) {
|
7604 | return secp256k1Expand$1(publicKey).subarray(1);
|
7605 | }
|
7606 | const { px, py } = secp256k1.ProjectivePoint.fromHex(publicKey);
|
7607 | return util.u8aConcat(util.bnToU8a(px, BN_BE_256_OPTS), util.bnToU8a(py, BN_BE_256_OPTS));
|
7608 | }
|
7609 |
|
7610 | function secp256k1Recover(msgHash, signature, recovery, hashType = 'blake2', onlyJs) {
|
7611 | const sig = util.u8aToU8a(signature).subarray(0, 64);
|
7612 | const msg = util.u8aToU8a(msgHash);
|
7613 | const publicKey = !util.hasBigInt || (!onlyJs && isReady())
|
7614 | ? secp256k1Recover$1(msg, sig, recovery)
|
7615 | : secp256k1.Signature
|
7616 | .fromCompact(sig)
|
7617 | .addRecoveryBit(recovery)
|
7618 | .recoverPublicKey(msg)
|
7619 | .toRawBytes();
|
7620 | if (!publicKey) {
|
7621 | throw new Error('Unable to recover publicKey from signature');
|
7622 | }
|
7623 | return hashType === 'keccak'
|
7624 | ? secp256k1Expand(publicKey, onlyJs)
|
7625 | : secp256k1Compress(publicKey, onlyJs);
|
7626 | }
|
7627 |
|
7628 | function secp256k1Sign(message, { secretKey }, hashType = 'blake2', onlyJs) {
|
7629 | if (secretKey?.length !== 32) {
|
7630 | throw new Error('Expected valid secp256k1 secretKey, 32-bytes');
|
7631 | }
|
7632 | const data = hasher(hashType, message, onlyJs);
|
7633 | if (!util.hasBigInt || (!onlyJs && isReady())) {
|
7634 | return secp256k1Sign$1(data, secretKey);
|
7635 | }
|
7636 | const signature = secp256k1.sign(data, secretKey, { lowS: true });
|
7637 | return util.u8aConcat(util.bnToU8a(signature.r, BN_BE_256_OPTS), util.bnToU8a(signature.s, BN_BE_256_OPTS), new Uint8Array([signature.recovery || 0]));
|
7638 | }
|
7639 |
|
7640 | const N = 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141'.replace(/ /g, '');
|
7641 | const N_BI = BigInt$1(`0x${N}`);
|
7642 | const N_BN = new util.BN(N, 'hex');
|
7643 | function addBi(seckey, tweak) {
|
7644 | let res = util.u8aToBigInt(tweak, BN_BE_OPTS);
|
7645 | if (res >= N_BI) {
|
7646 | throw new Error('Tweak parameter is out of range');
|
7647 | }
|
7648 | res += util.u8aToBigInt(seckey, BN_BE_OPTS);
|
7649 | if (res >= N_BI) {
|
7650 | res -= N_BI;
|
7651 | }
|
7652 | if (res === util._0n) {
|
7653 | throw new Error('Invalid resulting private key');
|
7654 | }
|
7655 | return util.nToU8a(res, BN_BE_256_OPTS);
|
7656 | }
|
7657 | function addBn(seckey, tweak) {
|
7658 | const res = new util.BN(tweak);
|
7659 | if (res.cmp(N_BN) >= 0) {
|
7660 | throw new Error('Tweak parameter is out of range');
|
7661 | }
|
7662 | res.iadd(new util.BN(seckey));
|
7663 | if (res.cmp(N_BN) >= 0) {
|
7664 | res.isub(N_BN);
|
7665 | }
|
7666 | if (res.isZero()) {
|
7667 | throw new Error('Invalid resulting private key');
|
7668 | }
|
7669 | return util.bnToU8a(res, BN_BE_256_OPTS);
|
7670 | }
|
7671 | function secp256k1PrivateKeyTweakAdd(seckey, tweak, onlyBn) {
|
7672 | if (!util.isU8a(seckey) || seckey.length !== 32) {
|
7673 | throw new Error('Expected seckey to be an Uint8Array with length 32');
|
7674 | }
|
7675 | else if (!util.isU8a(tweak) || tweak.length !== 32) {
|
7676 | throw new Error('Expected tweak to be an Uint8Array with length 32');
|
7677 | }
|
7678 | return !util.hasBigInt || onlyBn
|
7679 | ? addBn(seckey, tweak)
|
7680 | : addBi(seckey, tweak);
|
7681 | }
|
7682 |
|
7683 | function secp256k1Verify(msgHash, signature, address, hashType = 'blake2', onlyJs) {
|
7684 | const sig = util.u8aToU8a(signature);
|
7685 | if (sig.length !== 65) {
|
7686 | throw new Error(`Expected signature with 65 bytes, ${sig.length} found instead`);
|
7687 | }
|
7688 | const publicKey = secp256k1Recover(hasher(hashType, msgHash), sig, sig[64], hashType, onlyJs);
|
7689 | const signerAddr = hasher(hashType, publicKey, onlyJs);
|
7690 | const inputAddr = util.u8aToU8a(address);
|
7691 | return util.u8aEq(publicKey, inputAddr) || (hashType === 'keccak'
|
7692 | ? util.u8aEq(signerAddr.slice(-20), inputAddr.slice(-20))
|
7693 | : util.u8aEq(signerAddr, inputAddr));
|
7694 | }
|
7695 |
|
7696 | function getH160(u8a) {
|
7697 | if ([33, 65].includes(u8a.length)) {
|
7698 | u8a = keccakAsU8a(secp256k1Expand(u8a));
|
7699 | }
|
7700 | return u8a.slice(-20);
|
7701 | }
|
7702 | function ethereumEncode(addressOrPublic) {
|
7703 | if (!addressOrPublic) {
|
7704 | return '0x';
|
7705 | }
|
7706 | const u8aAddress = util.u8aToU8a(addressOrPublic);
|
7707 | if (![20, 32, 33, 65].includes(u8aAddress.length)) {
|
7708 | throw new Error(`Invalid address or publicKey provided, received ${u8aAddress.length} bytes input`);
|
7709 | }
|
7710 | const address = util.u8aToHex(getH160(u8aAddress), -1, false);
|
7711 | const hash = util.u8aToHex(keccakAsU8a(address), -1, false);
|
7712 | let result = '';
|
7713 | for (let i = 0; i < 40; i++) {
|
7714 | result = `${result}${parseInt(hash[i], 16) > 7 ? address[i].toUpperCase() : address[i]}`;
|
7715 | }
|
7716 | return `0x${result}`;
|
7717 | }
|
7718 |
|
7719 | function isInvalidChar(char, byte) {
|
7720 | return char !== (byte > 7
|
7721 | ? char.toUpperCase()
|
7722 | : char.toLowerCase());
|
7723 | }
|
7724 | function isEthereumChecksum(_address) {
|
7725 | const address = _address.replace('0x', '');
|
7726 | const hash = util.u8aToHex(keccakAsU8a(address.toLowerCase()), -1, false);
|
7727 | for (let i = 0; i < 40; i++) {
|
7728 | if (isInvalidChar(address[i], parseInt(hash[i], 16))) {
|
7729 | return false;
|
7730 | }
|
7731 | }
|
7732 | return true;
|
7733 | }
|
7734 |
|
7735 | function isEthereumAddress(address) {
|
7736 | if (!address || address.length !== 42 || !util.isHex(address)) {
|
7737 | return false;
|
7738 | }
|
7739 | else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) {
|
7740 | return true;
|
7741 | }
|
7742 | return isEthereumChecksum(address);
|
7743 | }
|
7744 |
|
7745 | const JS_HASH = {
|
7746 | 256: sha256,
|
7747 | 512: sha512
|
7748 | };
|
7749 | const WA_MHAC = {
|
7750 | 256: hmacSha256,
|
7751 | 512: hmacSha512
|
7752 | };
|
7753 | function createSha(bitLength) {
|
7754 | return (key, data, onlyJs) => hmacShaAsU8a(key, data, bitLength, onlyJs);
|
7755 | }
|
7756 | function hmacShaAsU8a(key, data, bitLength = 256, onlyJs) {
|
7757 | const u8aKey = util.u8aToU8a(key);
|
7758 | return !util.hasBigInt || (!onlyJs && isReady())
|
7759 | ? WA_MHAC[bitLength](u8aKey, data)
|
7760 | : hmac(JS_HASH[bitLength], u8aKey, data);
|
7761 | }
|
7762 | const hmacSha256AsU8a = createSha(256);
|
7763 | const hmacSha512AsU8a = createSha(512);
|
7764 |
|
7765 | const HARDENED = 0x80000000;
|
7766 | function hdValidatePath(path) {
|
7767 | if (!path.startsWith('m/')) {
|
7768 | return false;
|
7769 | }
|
7770 | const parts = path.split('/').slice(1);
|
7771 | for (const p of parts) {
|
7772 | const n = /^\d+'?$/.test(p)
|
7773 | ? parseInt(p.replace(/'$/, ''), 10)
|
7774 | : Number.NaN;
|
7775 | if (isNaN(n) || (n >= HARDENED) || (n < 0)) {
|
7776 | return false;
|
7777 | }
|
7778 | }
|
7779 | return true;
|
7780 | }
|
7781 |
|
7782 | const MASTER_SECRET = util.stringToU8a('Bitcoin seed');
|
7783 | function createCoded(secretKey, chainCode) {
|
7784 | return {
|
7785 | chainCode,
|
7786 | publicKey: secp256k1PairFromSeed(secretKey).publicKey,
|
7787 | secretKey
|
7788 | };
|
7789 | }
|
7790 | function deriveChild(hd, index) {
|
7791 | const indexBuffer = util.bnToU8a(index, BN_BE_32_OPTS);
|
7792 | const data = index >= HARDENED
|
7793 | ? util.u8aConcat(new Uint8Array(1), hd.secretKey, indexBuffer)
|
7794 | : util.u8aConcat(hd.publicKey, indexBuffer);
|
7795 | try {
|
7796 | const I = hmacShaAsU8a(hd.chainCode, data, 512);
|
7797 | return createCoded(secp256k1PrivateKeyTweakAdd(hd.secretKey, I.slice(0, 32)), I.slice(32));
|
7798 | }
|
7799 | catch {
|
7800 | return deriveChild(hd, index + 1);
|
7801 | }
|
7802 | }
|
7803 | function hdEthereum(seed, path = '') {
|
7804 | const I = hmacShaAsU8a(MASTER_SECRET, seed, 512);
|
7805 | let hd = createCoded(I.slice(0, 32), I.slice(32));
|
7806 | if (!path || path === 'm' || path === 'M' || path === "m'" || path === "M'") {
|
7807 | return hd;
|
7808 | }
|
7809 | if (!hdValidatePath(path)) {
|
7810 | throw new Error('Invalid derivation path');
|
7811 | }
|
7812 | const parts = path.split('/').slice(1);
|
7813 | for (const p of parts) {
|
7814 | hd = deriveChild(hd, parseInt(p, 10) + ((p.length > 1) && p.endsWith("'")
|
7815 | ? HARDENED
|
7816 | : 0));
|
7817 | }
|
7818 | return hd;
|
7819 | }
|
7820 |
|
7821 | function pbkdf2Init(hash$1, _password, _salt, _opts) {
|
7822 | hash(hash$1);
|
7823 | const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts);
|
7824 | const { c, dkLen, asyncTick } = opts;
|
7825 | number(c);
|
7826 | number(dkLen);
|
7827 | number(asyncTick);
|
7828 | if (c < 1)
|
7829 | throw new Error('PBKDF2: iterations (c) should be >= 1');
|
7830 | const password = toBytes(_password);
|
7831 | const salt = toBytes(_salt);
|
7832 | const DK = new Uint8Array(dkLen);
|
7833 | const PRF = hmac.create(hash$1, password);
|
7834 | const PRFSalt = PRF._cloneInto().update(salt);
|
7835 | return { c, dkLen, asyncTick, DK, PRF, PRFSalt };
|
7836 | }
|
7837 | function pbkdf2Output(PRF, PRFSalt, DK, prfW, u) {
|
7838 | PRF.destroy();
|
7839 | PRFSalt.destroy();
|
7840 | if (prfW)
|
7841 | prfW.destroy();
|
7842 | u.fill(0);
|
7843 | return DK;
|
7844 | }
|
7845 | function pbkdf2(hash, password, salt, opts) {
|
7846 | const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);
|
7847 | let prfW;
|
7848 | const arr = new Uint8Array(4);
|
7849 | const view = createView(arr);
|
7850 | const u = new Uint8Array(PRF.outputLen);
|
7851 | for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {
|
7852 | const Ti = DK.subarray(pos, pos + PRF.outputLen);
|
7853 | view.setInt32(0, ti, false);
|
7854 | (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);
|
7855 | Ti.set(u.subarray(0, Ti.length));
|
7856 | for (let ui = 1; ui < c; ui++) {
|
7857 | PRF._cloneInto(prfW).update(u).digestInto(u);
|
7858 | for (let i = 0; i < Ti.length; i++)
|
7859 | Ti[i] ^= u[i];
|
7860 | }
|
7861 | }
|
7862 | return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);
|
7863 | }
|
7864 |
|
7865 | function pbkdf2Encode(passphrase, salt = randomAsU8a(), rounds = 2048, onlyJs) {
|
7866 | const u8aPass = util.u8aToU8a(passphrase);
|
7867 | const u8aSalt = util.u8aToU8a(salt);
|
7868 | return {
|
7869 | password: !util.hasBigInt || (!onlyJs && isReady())
|
7870 | ? pbkdf2$1(u8aPass, u8aSalt, rounds)
|
7871 | : pbkdf2(sha512, u8aPass, u8aSalt, { c: rounds, dkLen: 64 }),
|
7872 | rounds,
|
7873 | salt
|
7874 | };
|
7875 | }
|
7876 |
|
7877 | const shaAsU8a = createDualHasher({ 256: sha256$1, 512: sha512$1 }, { 256: sha256, 512: sha512 });
|
7878 | const sha256AsU8a = createBitHasher(256, shaAsU8a);
|
7879 | const sha512AsU8a = createBitHasher(512, shaAsU8a);
|
7880 |
|
7881 | const DEFAULT_WORDLIST = 'abandon|ability|able|about|above|absent|absorb|abstract|absurd|abuse|access|accident|account|accuse|achieve|acid|acoustic|acquire|across|act|action|actor|actress|actual|adapt|add|addict|address|adjust|admit|adult|advance|advice|aerobic|affair|afford|afraid|again|age|agent|agree|ahead|aim|air|airport|aisle|alarm|album|alcohol|alert|alien|all|alley|allow|almost|alone|alpha|already|also|alter|always|amateur|amazing|among|amount|amused|analyst|anchor|ancient|anger|angle|angry|animal|ankle|announce|annual|another|answer|antenna|antique|anxiety|any|apart|apology|appear|apple|approve|april|arch|arctic|area|arena|argue|arm|armed|armor|army|around|arrange|arrest|arrive|arrow|art|artefact|artist|artwork|ask|aspect|assault|asset|assist|assume|asthma|athlete|atom|attack|attend|attitude|attract|auction|audit|august|aunt|author|auto|autumn|average|avocado|avoid|awake|aware|away|awesome|awful|awkward|axis|baby|bachelor|bacon|badge|bag|balance|balcony|ball|bamboo|banana|banner|bar|barely|bargain|barrel|base|basic|basket|battle|beach|bean|beauty|because|become|beef|before|begin|behave|behind|believe|below|belt|bench|benefit|best|betray|better|between|beyond|bicycle|bid|bike|bind|biology|bird|birth|bitter|black|blade|blame|blanket|blast|bleak|bless|blind|blood|blossom|blouse|blue|blur|blush|board|boat|body|boil|bomb|bone|bonus|book|boost|border|boring|borrow|boss|bottom|bounce|box|boy|bracket|brain|brand|brass|brave|bread|breeze|brick|bridge|brief|bright|bring|brisk|broccoli|broken|bronze|broom|brother|brown|brush|bubble|buddy|budget|buffalo|build|bulb|bulk|bullet|bundle|bunker|burden|burger|burst|bus|business|busy|butter|buyer|buzz|cabbage|cabin|cable|cactus|cage|cake|call|calm|camera|camp|can|canal|cancel|candy|cannon|canoe|canvas|canyon|capable|capital|captain|car|carbon|card|cargo|carpet|carry|cart|case|cash|casino|castle|casual|cat|catalog|catch|category|cattle|caught|cause|caution|cave|ceiling|celery|cement|census|century|cereal|certain|chair|chalk|champion|change|chaos|chapter|charge|chase|chat|cheap|check|cheese|chef|cherry|chest|chicken|chief|child|chimney|choice|choose|chronic|chuckle|chunk|churn|cigar|cinnamon|circle|citizen|city|civil|claim|clap|clarify|claw|clay|clean|clerk|clever|click|client|cliff|climb|clinic|clip|clock|clog|close|cloth|cloud|clown|club|clump|cluster|clutch|coach|coast|coconut|code|coffee|coil|coin|collect|color|column|combine|come|comfort|comic|common|company|concert|conduct|confirm|congress|connect|consider|control|convince|cook|cool|copper|copy|coral|core|corn|correct|cost|cotton|couch|country|couple|course|cousin|cover|coyote|crack|cradle|craft|cram|crane|crash|crater|crawl|crazy|cream|credit|creek|crew|cricket|crime|crisp|critic|crop|cross|crouch|crowd|crucial|cruel|cruise|crumble|crunch|crush|cry|crystal|cube|culture|cup|cupboard|curious|current|curtain|curve|cushion|custom|cute|cycle|dad|damage|damp|dance|danger|daring|dash|daughter|dawn|day|deal|debate|debris|decade|december|decide|decline|decorate|decrease|deer|defense|define|defy|degree|delay|deliver|demand|demise|denial|dentist|deny|depart|depend|deposit|depth|deputy|derive|describe|desert|design|desk|despair|destroy|detail|detect|develop|device|devote|diagram|dial|diamond|diary|dice|diesel|diet|differ|digital|dignity|dilemma|dinner|dinosaur|direct|dirt|disagree|discover|disease|dish|dismiss|disorder|display|distance|divert|divide|divorce|dizzy|doctor|document|dog|doll|dolphin|domain|donate|donkey|donor|door|dose|double|dove|draft|dragon|drama|drastic|draw|dream|dress|drift|drill|drink|drip|drive|drop|drum|dry|duck|dumb|dune|during|dust|dutch|duty|dwarf|dynamic|eager|eagle|early|earn|earth|easily|east|easy|echo|ecology|economy|edge|edit|educate|effort|egg|eight|either|elbow|elder|electric|elegant|element|elephant|elevator|elite|else|embark|embody|embrace|emerge|emotion|employ|empower|empty|enable|enact|end|endless|endorse|enemy|energy|enforce|engage|engine|enhance|enjoy|enlist|enough|enrich|enroll|ensure|enter|entire|entry|envelope|episode|equal|equip|era|erase|erode|erosion|error|erupt|escape|essay|essence|estate|eternal|ethics|evidence|evil|evoke|evolve|exact|example|excess|exchange|excite|exclude|excuse|execute|exercise|exhaust|exhibit|exile|exist|exit|exotic|expand|expect|expire|explain|expose|express|extend|extra|eye|eyebrow|fabric|face|faculty|fade|faint|faith|fall|false|fame|family|famous|fan|fancy|fantasy|farm|fashion|fat|fatal|father|fatigue|fault|favorite|feature|february|federal|fee|feed|feel|female|fence|festival|fetch|fever|few|fiber|fiction|field|figure|file|film|filter|final|find|fine|finger|finish|fire|firm|first|fiscal|fish|fit|fitness|fix|flag|flame|flash|flat|flavor|flee|flight|flip|float|flock|floor|flower|fluid|flush|fly|foam|focus|fog|foil|fold|follow|food|foot|force|forest|forget|fork|fortune|forum|forward|fossil|foster|found|fox|fragile|frame|frequent|fresh|friend|fringe|frog|front|frost|frown|frozen|fruit|fuel|fun|funny|furnace|fury|future|gadget|gain|galaxy|gallery|game|gap|garage|garbage|garden|garlic|garment|gas|gasp|gate|gather|gauge|gaze|general|genius|genre|gentle|genuine|gesture|ghost|giant|gift|giggle|ginger|giraffe|girl|give|glad|glance|glare|glass|glide|glimpse|globe|gloom|glory|glove|glow|glue|goat|goddess|gold|good|goose|gorilla|gospel|gossip|govern|gown|grab|grace|grain|grant|grape|grass|gravity|great|green|grid|grief|grit|grocery|group|grow|grunt|guard|guess|guide|guilt|guitar|gun|gym|habit|hair|half|hammer|hamster|hand|happy|harbor|hard|harsh|harvest|hat|have|hawk|hazard|head|health|heart|heavy|hedgehog|height|hello|helmet|help|hen|hero|hidden|high|hill|hint|hip|hire|history|hobby|hockey|hold|hole|holiday|hollow|home|honey|hood|hope|horn|horror|horse|hospital|host|hotel|hour|hover|hub|huge|human|humble|humor|hundred|hungry|hunt|hurdle|hurry|hurt|husband|hybrid|ice|icon|idea|identify|idle|ignore|ill|illegal|illness|image|imitate|immense|immune|impact|impose|improve|impulse|inch|include|income|increase|index|indicate|indoor|industry|infant|inflict|inform|inhale|inherit|initial|inject|injury|inmate|inner|innocent|input|inquiry|insane|insect|inside|inspire|install|intact|interest|into|invest|invite|involve|iron|island|isolate|issue|item|ivory|jacket|jaguar|jar|jazz|jealous|jeans|jelly|jewel|job|join|joke|journey|joy|judge|juice|jump|jungle|junior|junk|just|kangaroo|keen|keep|ketchup|key|kick|kid|kidney|kind|kingdom|kiss|kit|kitchen|kite|kitten|kiwi|knee|knife|knock|know|lab|label|labor|ladder|lady|lake|lamp|language|laptop|large|later|latin|laugh|laundry|lava|law|lawn|lawsuit|layer|lazy|leader|leaf|learn|leave|lecture|left|leg|legal|legend|leisure|lemon|lend|length|lens|leopard|lesson|letter|level|liar|liberty|library|license|life|lift|light|like|limb|limit|link|lion|liquid|list|little|live|lizard|load|loan|lobster|local|lock|logic|lonely|long|loop|lottery|loud|lounge|love|loyal|lucky|luggage|lumber|lunar|lunch|luxury|lyrics|machine|mad|magic|magnet|maid|mail|main|major|make|mammal|man|manage|mandate|mango|mansion|manual|maple|marble|march|margin|marine|market|marriage|mask|mass|master|match|material|math|matrix|matter|maximum|maze|meadow|mean|measure|meat|mechanic|medal|media|melody|melt|member|memory|mention|menu|mercy|merge|merit|merry|mesh|message|metal|method|middle|midnight|milk|million|mimic|mind|minimum|minor|minute|miracle|mirror|misery|miss|mistake|mix|mixed|mixture|mobile|model|modify|mom|moment|monitor|monkey|monster|month|moon|moral|more|morning|mosquito|mother|motion|motor|mountain|mouse|move|movie|much|muffin|mule|multiply|muscle|museum|mushroom|music|must|mutual|myself|mystery|myth|naive|name|napkin|narrow|nasty|nation|nature|near|neck|need|negative|neglect|neither|nephew|nerve|nest|net|network|neutral|never|news|next|nice|night|noble|noise|nominee|noodle|normal|north|nose|notable|note|nothing|notice|novel|now|nuclear|number|nurse|nut|oak|obey|object|oblige|obscure|observe|obtain|obvious|occur|ocean|october|odor|off|offer|office|often|oil|okay|old|olive|olympic|omit|once|one|onion|online|only|open|opera|opinion|oppose|option|orange|orbit|orchard|order|ordinary|organ|orient|original|orphan|ostrich|other|outdoor|outer|output|outside|oval|oven|over|own|owner|oxygen|oyster|ozone|pact|paddle|page|pair|palace|palm|panda|panel|panic|panther|paper|parade|parent|park|parrot|party|pass|patch|path|patient|patrol|pattern|pause|pave|payment|peace|peanut|pear|peasant|pelican|pen|penalty|pencil|people|pepper|perfect|permit|person|pet|phone|photo|phrase|physical|piano|picnic|picture|piece|pig|pigeon|pill|pilot|pink|pioneer|pipe|pistol|pitch|pizza|place|planet|plastic|plate|play|please|pledge|pluck|plug|plunge|poem|poet|point|polar|pole|police|pond|pony|pool|popular|portion|position|possible|post|potato|pottery|poverty|powder|power|practice|praise|predict|prefer|prepare|present|pretty|prevent|price|pride|primary|print|priority|prison|private|prize|problem|process|produce|profit|program|project|promote|proof|property|prosper|protect|proud|provide|public|pudding|pull|pulp|pulse|pumpkin|punch|pupil|puppy|purchase|purity|purpose|purse|push|put|puzzle|pyramid|quality|quantum|quarter|question|quick|quit|quiz|quote|rabbit|raccoon|race|rack|radar|radio|rail|rain|raise|rally|ramp|ranch|random|range|rapid|rare|rate|rather|raven|raw|razor|ready|real|reason|rebel|rebuild|recall|receive|recipe|record|recycle|reduce|reflect|reform|refuse|region|regret|regular|reject|relax|release|relief|rely|remain|remember|remind|remove|render|renew|rent|reopen|repair|repeat|replace|report|require|rescue|resemble|resist|resource|response|result|retire|retreat|return|reunion|reveal|review|reward|rhythm|rib|ribbon|rice|rich|ride|ridge|rifle|right|rigid|ring|riot|ripple|risk|ritual|rival|river|road|roast|robot|robust|rocket|romance|roof|rookie|room|rose|rotate|rough|round|route|royal|rubber|rude|rug|rule|run|runway|rural|sad|saddle|sadness|safe|sail|salad|salmon|salon|salt|salute|same|sample|sand|satisfy|satoshi|sauce|sausage|save|say|scale|scan|scare|scatter|scene|scheme|school|science|scissors|scorpion|scout|scrap|screen|script|scrub|sea|search|season|seat|second|secret|section|security|seed|seek|segment|select|sell|seminar|senior|sense|sentence|series|service|session|settle|setup|seven|shadow|shaft|shallow|share|shed|shell|sheriff|shield|shift|shine|ship|shiver|shock|shoe|shoot|shop|short|shoulder|shove|shrimp|shrug|shuffle|shy|sibling|sick|side|siege|sight|sign|silent|silk|silly|silver|similar|simple|since|sing|siren|sister|situate|six|size|skate|sketch|ski|skill|skin|skirt|skull|slab|slam|sleep|slender|slice|slide|slight|slim|slogan|slot|slow|slush|small|smart|smile|smoke|smooth|snack|snake|snap|sniff|snow|soap|soccer|social|sock|soda|soft|solar|soldier|solid|solution|solve|someone|song|soon|sorry|sort|soul|sound|soup|source|south|space|spare|spatial|spawn|speak|special|speed|spell|spend|sphere|spice|spider|spike|spin|spirit|split|spoil|sponsor|spoon|sport|spot|spray|spread|spring|spy|square|squeeze|squirrel|stable|stadium|staff|stage|stairs|stamp|stand|start|state|stay|steak|steel|stem|step|stereo|stick|still|sting|stock|stomach|stone|stool|story|stove|strategy|street|strike|strong|struggle|student|stuff|stumble|style|subject|submit|subway|success|such|sudden|suffer|sugar|suggest|suit|summer|sun|sunny|sunset|super|supply|supreme|sure|surface|surge|surprise|surround|survey|suspect|sustain|swallow|swamp|swap|swarm|swear|sweet|swift|swim|swing|switch|sword|symbol|symptom|syrup|system|table|tackle|tag|tail|talent|talk|tank|tape|target|task|taste|tattoo|taxi|teach|team|tell|ten|tenant|tennis|tent|term|test|text|thank|that|theme|then|theory|there|they|thing|this|thought|three|thrive|throw|thumb|thunder|ticket|tide|tiger|tilt|timber|time|tiny|tip|tired|tissue|title|toast|tobacco|today|toddler|toe|together|toilet|token|tomato|tomorrow|tone|tongue|tonight|tool|tooth|top|topic|topple|torch|tornado|tortoise|toss|total|tourist|toward|tower|town|toy|track|trade|traffic|tragic|train|transfer|trap|trash|travel|tray|treat|tree|trend|trial|tribe|trick|trigger|trim|trip|trophy|trouble|truck|true|truly|trumpet|trust|truth|try|tube|tuition|tumble|tuna|tunnel|turkey|turn|turtle|twelve|twenty|twice|twin|twist|two|type|typical|ugly|umbrella|unable|unaware|uncle|uncover|under|undo|unfair|unfold|unhappy|uniform|unique|unit|universe|unknown|unlock|until|unusual|unveil|update|upgrade|uphold|upon|upper|upset|urban|urge|usage|use|used|useful|useless|usual|utility|vacant|vacuum|vague|valid|valley|valve|van|vanish|vapor|various|vast|vault|vehicle|velvet|vendor|venture|venue|verb|verify|version|very|vessel|veteran|viable|vibrant|vicious|victory|video|view|village|vintage|violin|virtual|virus|visa|visit|visual|vital|vivid|vocal|voice|void|volcano|volume|vote|voyage|wage|wagon|wait|walk|wall|walnut|want|warfare|warm|warrior|wash|wasp|waste|water|wave|way|wealth|weapon|wear|weasel|weather|web|wedding|weekend|weird|welcome|west|wet|whale|what|wheat|wheel|when|where|whip|whisper|wide|width|wife|wild|will|win|window|wine|wing|wink|winner|winter|wire|wisdom|wise|wish|witness|wolf|woman|wonder|wood|wool|word|work|world|worry|worth|wrap|wreck|wrestle|wrist|write|wrong|yard|year|yellow|you|young|youth|zebra|zero|zone|zoo'.split('|');
|
7882 |
|
7883 | const INVALID_MNEMONIC = 'Invalid mnemonic';
|
7884 | const INVALID_ENTROPY = 'Invalid entropy';
|
7885 | const INVALID_CHECKSUM = 'Invalid mnemonic checksum';
|
7886 | function normalize(str) {
|
7887 | return (str || '').normalize('NFKD');
|
7888 | }
|
7889 | function binaryToByte(bin) {
|
7890 | return parseInt(bin, 2);
|
7891 | }
|
7892 | function bytesToBinary(bytes) {
|
7893 | return bytes.map((x) => x.toString(2).padStart(8, '0')).join('');
|
7894 | }
|
7895 | function deriveChecksumBits(entropyBuffer) {
|
7896 | return bytesToBinary(Array.from(sha256AsU8a(entropyBuffer))).slice(0, (entropyBuffer.length * 8) / 32);
|
7897 | }
|
7898 | function mnemonicToSeedSync(mnemonic, password) {
|
7899 | return pbkdf2Encode(util.stringToU8a(normalize(mnemonic)), util.stringToU8a(`mnemonic${normalize(password)}`)).password;
|
7900 | }
|
7901 | function mnemonicToEntropy$1(mnemonic, wordlist = DEFAULT_WORDLIST) {
|
7902 | const words = normalize(mnemonic).split(' ');
|
7903 | if (words.length % 3 !== 0) {
|
7904 | throw new Error(INVALID_MNEMONIC);
|
7905 | }
|
7906 | const bits = words
|
7907 | .map((word) => {
|
7908 | const index = wordlist.indexOf(word);
|
7909 | if (index === -1) {
|
7910 | throw new Error(INVALID_MNEMONIC);
|
7911 | }
|
7912 | return index.toString(2).padStart(11, '0');
|
7913 | })
|
7914 | .join('');
|
7915 | const dividerIndex = Math.floor(bits.length / 33) * 32;
|
7916 | const entropyBits = bits.slice(0, dividerIndex);
|
7917 | const checksumBits = bits.slice(dividerIndex);
|
7918 | const matched = entropyBits.match(/(.{1,8})/g);
|
7919 | const entropyBytes = matched?.map(binaryToByte);
|
7920 | if (!entropyBytes || (entropyBytes.length % 4 !== 0) || (entropyBytes.length < 16) || (entropyBytes.length > 32)) {
|
7921 | throw new Error(INVALID_ENTROPY);
|
7922 | }
|
7923 | const entropy = util.u8aToU8a(entropyBytes);
|
7924 | if (deriveChecksumBits(entropy) !== checksumBits) {
|
7925 | throw new Error(INVALID_CHECKSUM);
|
7926 | }
|
7927 | return entropy;
|
7928 | }
|
7929 | function entropyToMnemonic(entropy, wordlist = DEFAULT_WORDLIST) {
|
7930 | if ((entropy.length % 4 !== 0) || (entropy.length < 16) || (entropy.length > 32)) {
|
7931 | throw new Error(INVALID_ENTROPY);
|
7932 | }
|
7933 | const matched = `${bytesToBinary(Array.from(entropy))}${deriveChecksumBits(entropy)}`.match(/(.{1,11})/g);
|
7934 | const mapped = matched?.map((b) => wordlist[binaryToByte(b)]);
|
7935 | if (!mapped || (mapped.length < 12)) {
|
7936 | throw new Error('Unable to map entropy to mnemonic');
|
7937 | }
|
7938 | return mapped.join(' ');
|
7939 | }
|
7940 | function generateMnemonic(numWords, wordlist) {
|
7941 | return entropyToMnemonic(randomAsU8a((numWords / 3) * 4), wordlist);
|
7942 | }
|
7943 | function validateMnemonic(mnemonic, wordlist) {
|
7944 | try {
|
7945 | mnemonicToEntropy$1(mnemonic, wordlist);
|
7946 | }
|
7947 | catch {
|
7948 | return false;
|
7949 | }
|
7950 | return true;
|
7951 | }
|
7952 |
|
7953 | function mnemonicGenerate(numWords = 12, wordlist, onlyJs) {
|
7954 | return !util.hasBigInt || (!wordlist && !onlyJs && isReady())
|
7955 | ? bip39Generate(numWords)
|
7956 | : generateMnemonic(numWords, wordlist);
|
7957 | }
|
7958 |
|
7959 | function mnemonicToEntropy(mnemonic, wordlist, onlyJs) {
|
7960 | return !util.hasBigInt || (!wordlist && !onlyJs && isReady())
|
7961 | ? bip39ToEntropy(mnemonic)
|
7962 | : mnemonicToEntropy$1(mnemonic, wordlist);
|
7963 | }
|
7964 |
|
7965 | function mnemonicValidate(mnemonic, wordlist, onlyJs) {
|
7966 | return !util.hasBigInt || (!wordlist && !onlyJs && isReady())
|
7967 | ? bip39Validate(mnemonic)
|
7968 | : validateMnemonic(mnemonic, wordlist);
|
7969 | }
|
7970 |
|
7971 | function mnemonicToLegacySeed(mnemonic, password = '', onlyJs, byteLength = 32) {
|
7972 | if (!mnemonicValidate(mnemonic)) {
|
7973 | throw new Error('Invalid bip39 mnemonic specified');
|
7974 | }
|
7975 | else if (![32, 64].includes(byteLength)) {
|
7976 | throw new Error(`Invalid seed length ${byteLength}, expected 32 or 64`);
|
7977 | }
|
7978 | return byteLength === 32
|
7979 | ? !util.hasBigInt || (!onlyJs && isReady())
|
7980 | ? bip39ToSeed(mnemonic, password)
|
7981 | : mnemonicToSeedSync(mnemonic, password).subarray(0, 32)
|
7982 | : mnemonicToSeedSync(mnemonic, password);
|
7983 | }
|
7984 |
|
7985 | function mnemonicToMiniSecret(mnemonic, password = '', wordlist, onlyJs) {
|
7986 | if (!mnemonicValidate(mnemonic, wordlist, onlyJs)) {
|
7987 | throw new Error('Invalid bip39 mnemonic specified');
|
7988 | }
|
7989 | else if (!wordlist && !onlyJs && isReady()) {
|
7990 | return bip39ToMiniSecret(mnemonic, password);
|
7991 | }
|
7992 | const entropy = mnemonicToEntropy(mnemonic, wordlist);
|
7993 | const salt = util.stringToU8a(`mnemonic${password}`);
|
7994 | return pbkdf2Encode(entropy, salt).password.slice(0, 32);
|
7995 | }
|
7996 |
|
7997 | function ledgerDerivePrivate(xprv, index) {
|
7998 | const kl = xprv.subarray(0, 32);
|
7999 | const kr = xprv.subarray(32, 64);
|
8000 | const cc = xprv.subarray(64, 96);
|
8001 | const data = util.u8aConcat([0], kl, kr, util.bnToU8a(index, BN_LE_32_OPTS));
|
8002 | const z = hmacShaAsU8a(cc, data, 512);
|
8003 | data[0] = 0x01;
|
8004 | return util.u8aConcat(util.bnToU8a(util.u8aToBn(kl, BN_LE_OPTS).iadd(util.u8aToBn(z.subarray(0, 28), BN_LE_OPTS).imul(util.BN_EIGHT)), BN_LE_512_OPTS).subarray(0, 32), util.bnToU8a(util.u8aToBn(kr, BN_LE_OPTS).iadd(util.u8aToBn(z.subarray(32, 64), BN_LE_OPTS)), BN_LE_512_OPTS).subarray(0, 32), hmacShaAsU8a(cc, data, 512).subarray(32, 64));
|
8005 | }
|
8006 |
|
8007 | const ED25519_CRYPTO = 'ed25519 seed';
|
8008 | function ledgerMaster(mnemonic, password) {
|
8009 | const seed = mnemonicToSeedSync(mnemonic, password);
|
8010 | const chainCode = hmacShaAsU8a(ED25519_CRYPTO, new Uint8Array([1, ...seed]), 256);
|
8011 | let priv;
|
8012 | while (!priv || (priv[31] & 0b0010_0000)) {
|
8013 | priv = hmacShaAsU8a(ED25519_CRYPTO, priv || seed, 512);
|
8014 | }
|
8015 | priv[0] &= 0b1111_1000;
|
8016 | priv[31] &= 0b0111_1111;
|
8017 | priv[31] |= 0b0100_0000;
|
8018 | return util.u8aConcat(priv, chainCode);
|
8019 | }
|
8020 |
|
8021 | function hdLedger(_mnemonic, path) {
|
8022 | const words = _mnemonic
|
8023 | .split(' ')
|
8024 | .map((s) => s.trim())
|
8025 | .filter((s) => s);
|
8026 | if (![12, 24, 25].includes(words.length)) {
|
8027 | throw new Error('Expected a mnemonic with 24 words (or 25 including a password)');
|
8028 | }
|
8029 | const [mnemonic, password] = words.length === 25
|
8030 | ? [words.slice(0, 24).join(' '), words[24]]
|
8031 | : [words.join(' '), ''];
|
8032 | if (!mnemonicValidate(mnemonic)) {
|
8033 | throw new Error('Invalid mnemonic passed to ledger derivation');
|
8034 | }
|
8035 | else if (!hdValidatePath(path)) {
|
8036 | throw new Error('Invalid derivation path');
|
8037 | }
|
8038 | const parts = path.split('/').slice(1);
|
8039 | let seed = ledgerMaster(mnemonic, password);
|
8040 | for (const p of parts) {
|
8041 | const n = parseInt(p.replace(/'$/, ''), 10);
|
8042 | seed = ledgerDerivePrivate(seed, (n < HARDENED) ? (n + HARDENED) : n);
|
8043 | }
|
8044 | return ed25519PairFromSeed(seed.slice(0, 32));
|
8045 | }
|
8046 |
|
8047 | function L32(x, c) { return (x << c) | (x >>> (32 - c)); }
|
8048 | function ld32(x, i) {
|
8049 | let u = x[i + 3] & 0xff;
|
8050 | u = (u << 8) | (x[i + 2] & 0xff);
|
8051 | u = (u << 8) | (x[i + 1] & 0xff);
|
8052 | return (u << 8) | (x[i + 0] & 0xff);
|
8053 | }
|
8054 | function st32(x, j, u) {
|
8055 | for (let i = 0; i < 4; i++) {
|
8056 | x[j + i] = u & 255;
|
8057 | u >>>= 8;
|
8058 | }
|
8059 | }
|
8060 | function vn(x, xi, y, yi, n) {
|
8061 | let d = 0;
|
8062 | for (let i = 0; i < n; i++)
|
8063 | d |= x[xi + i] ^ y[yi + i];
|
8064 | return (1 & ((d - 1) >>> 8)) - 1;
|
8065 | }
|
8066 | function core(out, inp, k, c, h) {
|
8067 | const w = new Uint32Array(16), x = new Uint32Array(16), y = new Uint32Array(16), t = new Uint32Array(4);
|
8068 | let i, j, m;
|
8069 | for (i = 0; i < 4; i++) {
|
8070 | x[5 * i] = ld32(c, 4 * i);
|
8071 | x[1 + i] = ld32(k, 4 * i);
|
8072 | x[6 + i] = ld32(inp, 4 * i);
|
8073 | x[11 + i] = ld32(k, 16 + 4 * i);
|
8074 | }
|
8075 | for (i = 0; i < 16; i++)
|
8076 | y[i] = x[i];
|
8077 | for (i = 0; i < 20; i++) {
|
8078 | for (j = 0; j < 4; j++) {
|
8079 | for (m = 0; m < 4; m++)
|
8080 | t[m] = x[(5 * j + 4 * m) % 16];
|
8081 | t[1] ^= L32((t[0] + t[3]) | 0, 7);
|
8082 | t[2] ^= L32((t[1] + t[0]) | 0, 9);
|
8083 | t[3] ^= L32((t[2] + t[1]) | 0, 13);
|
8084 | t[0] ^= L32((t[3] + t[2]) | 0, 18);
|
8085 | for (m = 0; m < 4; m++)
|
8086 | w[4 * j + (j + m) % 4] = t[m];
|
8087 | }
|
8088 | for (m = 0; m < 16; m++)
|
8089 | x[m] = w[m];
|
8090 | }
|
8091 | if (h) {
|
8092 | for (i = 0; i < 16; i++)
|
8093 | x[i] = (x[i] + y[i]) | 0;
|
8094 | for (i = 0; i < 4; i++) {
|
8095 | x[5 * i] = (x[5 * i] - ld32(c, 4 * i)) | 0;
|
8096 | x[6 + i] = (x[6 + i] - ld32(inp, 4 * i)) | 0;
|
8097 | }
|
8098 | for (i = 0; i < 4; i++) {
|
8099 | st32(out, 4 * i, x[5 * i]);
|
8100 | st32(out, 16 + 4 * i, x[6 + i]);
|
8101 | }
|
8102 | }
|
8103 | else {
|
8104 | for (i = 0; i < 16; i++)
|
8105 | st32(out, 4 * i, (x[i] + y[i]) | 0);
|
8106 | }
|
8107 | }
|
8108 | const sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);
|
8109 | function crypto_stream_salsa20_xor(c, cpos, m, mpos, b, n, k) {
|
8110 | const z = new Uint8Array(16), x = new Uint8Array(64);
|
8111 | let u, i;
|
8112 | if (!b)
|
8113 | return 0;
|
8114 | for (i = 0; i < 16; i++)
|
8115 | z[i] = 0;
|
8116 | for (i = 0; i < 8; i++)
|
8117 | z[i] = n[i];
|
8118 | while (b >= 64) {
|
8119 | core(x, z, k, sigma, false);
|
8120 | for (i = 0; i < 64; i++)
|
8121 | c[cpos + i] = (m ? m[mpos + i] : 0) ^ x[i];
|
8122 | u = 1;
|
8123 | for (i = 8; i < 16; i++) {
|
8124 | u = u + (z[i] & 0xff) | 0;
|
8125 | z[i] = u & 0xff;
|
8126 | u >>>= 8;
|
8127 | }
|
8128 | b -= 64;
|
8129 | cpos += 64;
|
8130 | if (m)
|
8131 | mpos += 64;
|
8132 | }
|
8133 | if (b > 0) {
|
8134 | core(x, z, k, sigma, false);
|
8135 | for (i = 0; i < b; i++)
|
8136 | c[cpos + i] = (m ? m[mpos + i] : 0) ^ x[i];
|
8137 | }
|
8138 | return 0;
|
8139 | }
|
8140 | function crypto_stream_xor(c, cpos, m, mpos, d, n, k) {
|
8141 | const s = new Uint8Array(32);
|
8142 | core(s, n, k, sigma, true);
|
8143 | return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, n.subarray(16), s);
|
8144 | }
|
8145 | function add1305(h, c) {
|
8146 | let u = 0;
|
8147 | for (let j = 0; j < 17; j++) {
|
8148 | u = (u + ((h[j] + c[j]) | 0)) | 0;
|
8149 | h[j] = u & 255;
|
8150 | u >>>= 8;
|
8151 | }
|
8152 | }
|
8153 | const minusp = new Uint32Array([5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252]);
|
8154 | function crypto_onetimeauth(out, outpos, m, mpos, n, k) {
|
8155 | let i, j, u;
|
8156 | const x = new Uint32Array(17), r = new Uint32Array(17), h = new Uint32Array(17), c = new Uint32Array(17), g = new Uint32Array(17);
|
8157 | for (j = 0; j < 17; j++)
|
8158 | r[j] = h[j] = 0;
|
8159 | for (j = 0; j < 16; j++)
|
8160 | r[j] = k[j];
|
8161 | r[3] &= 15;
|
8162 | r[4] &= 252;
|
8163 | r[7] &= 15;
|
8164 | r[8] &= 252;
|
8165 | r[11] &= 15;
|
8166 | r[12] &= 252;
|
8167 | r[15] &= 15;
|
8168 | while (n > 0) {
|
8169 | for (j = 0; j < 17; j++)
|
8170 | c[j] = 0;
|
8171 | for (j = 0; (j < 16) && (j < n); ++j)
|
8172 | c[j] = m[mpos + j];
|
8173 | c[j] = 1;
|
8174 | mpos += j;
|
8175 | n -= j;
|
8176 | add1305(h, c);
|
8177 | for (i = 0; i < 17; i++) {
|
8178 | x[i] = 0;
|
8179 | for (j = 0; j < 17; j++)
|
8180 | x[i] = (x[i] + (h[j] * ((j <= i) ? r[i - j] : ((320 * r[i + 17 - j]) | 0))) | 0) | 0;
|
8181 | }
|
8182 | for (i = 0; i < 17; i++)
|
8183 | h[i] = x[i];
|
8184 | u = 0;
|
8185 | for (j = 0; j < 16; j++) {
|
8186 | u = (u + h[j]) | 0;
|
8187 | h[j] = u & 255;
|
8188 | u >>>= 8;
|
8189 | }
|
8190 | u = (u + h[16]) | 0;
|
8191 | h[16] = u & 3;
|
8192 | u = (5 * (u >>> 2)) | 0;
|
8193 | for (j = 0; j < 16; j++) {
|
8194 | u = (u + h[j]) | 0;
|
8195 | h[j] = u & 255;
|
8196 | u >>>= 8;
|
8197 | }
|
8198 | u = (u + h[16]) | 0;
|
8199 | h[16] = u;
|
8200 | }
|
8201 | for (j = 0; j < 17; j++)
|
8202 | g[j] = h[j];
|
8203 | add1305(h, minusp);
|
8204 | const s = (-(h[16] >>> 7) | 0);
|
8205 | for (j = 0; j < 17; j++)
|
8206 | h[j] ^= s & (g[j] ^ h[j]);
|
8207 | for (j = 0; j < 16; j++)
|
8208 | c[j] = k[j + 16];
|
8209 | c[16] = 0;
|
8210 | add1305(h, c);
|
8211 | for (j = 0; j < 16; j++)
|
8212 | out[outpos + j] = h[j];
|
8213 | return 0;
|
8214 | }
|
8215 | function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {
|
8216 | const x = new Uint8Array(16);
|
8217 | crypto_onetimeauth(x, 0, m, mpos, n, k);
|
8218 | return vn(h, hpos, x, 0, 16);
|
8219 | }
|
8220 | function crypto_secretbox(c, m, d, n, k) {
|
8221 | if (d < 32)
|
8222 | return -1;
|
8223 | crypto_stream_xor(c, 0, m, 0, d, n, k);
|
8224 | crypto_onetimeauth(c, 16, c, 32, d - 32, c);
|
8225 | for (let i = 0; i < 16; i++)
|
8226 | c[i] = 0;
|
8227 | return 0;
|
8228 | }
|
8229 | function crypto_secretbox_open(m, c, d, n, k) {
|
8230 | const x = new Uint8Array(32);
|
8231 | if (d < 32)
|
8232 | return -1;
|
8233 | crypto_stream_xor(x, 0, null, 0, 32, n, k);
|
8234 | if (crypto_onetimeauth_verify(c, 16, c, 32, d - 32, x) !== 0)
|
8235 | return -1;
|
8236 | crypto_stream_xor(m, 0, c, 0, d, n, k);
|
8237 | for (let i = 0; i < 32; i++)
|
8238 | m[i] = 0;
|
8239 | return 0;
|
8240 | }
|
8241 | const crypto_secretbox_KEYBYTES = 32;
|
8242 | const crypto_secretbox_NONCEBYTES = 24;
|
8243 | const crypto_secretbox_ZEROBYTES = 32;
|
8244 | const crypto_secretbox_BOXZEROBYTES = 16;
|
8245 | function checkLengths(k, n) {
|
8246 | if (k.length !== crypto_secretbox_KEYBYTES)
|
8247 | throw new Error('bad key size');
|
8248 | if (n.length !== crypto_secretbox_NONCEBYTES)
|
8249 | throw new Error('bad nonce size');
|
8250 | }
|
8251 | function checkArrayTypes(...args) {
|
8252 | for (let i = 0, count = args.length; i < count; i++) {
|
8253 | if (!(args[i] instanceof Uint8Array))
|
8254 | throw new TypeError('unexpected type, use Uint8Array');
|
8255 | }
|
8256 | }
|
8257 | function naclSecretbox(msg, nonce, key) {
|
8258 | checkArrayTypes(msg, nonce, key);
|
8259 | checkLengths(key, nonce);
|
8260 | const m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);
|
8261 | const c = new Uint8Array(m.length);
|
8262 | for (let i = 0; i < msg.length; i++)
|
8263 | m[i + crypto_secretbox_ZEROBYTES] = msg[i];
|
8264 | crypto_secretbox(c, m, m.length, nonce, key);
|
8265 | return c.subarray(crypto_secretbox_BOXZEROBYTES);
|
8266 | }
|
8267 | function naclSecretboxOpen(box, nonce, key) {
|
8268 | checkArrayTypes(box, nonce, key);
|
8269 | checkLengths(key, nonce);
|
8270 | const c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);
|
8271 | const m = new Uint8Array(c.length);
|
8272 | for (let i = 0; i < box.length; i++)
|
8273 | c[i + crypto_secretbox_BOXZEROBYTES] = box[i];
|
8274 | if (c.length < 32)
|
8275 | return null;
|
8276 | if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0)
|
8277 | return null;
|
8278 | return m.subarray(crypto_secretbox_ZEROBYTES);
|
8279 | }
|
8280 |
|
8281 | function naclDecrypt(encrypted, nonce, secret) {
|
8282 | return naclSecretboxOpen(encrypted, nonce, secret);
|
8283 | }
|
8284 |
|
8285 | function naclEncrypt(message, secret, nonce = randomAsU8a(24)) {
|
8286 | return {
|
8287 | encrypted: naclSecretbox(message, nonce, secret),
|
8288 | nonce
|
8289 | };
|
8290 | }
|
8291 |
|
8292 | const rotl$1 = (a, b) => (a << b) | (a >>> (32 - b));
|
8293 | function XorAndSalsa(prev, pi, input, ii, out, oi) {
|
8294 | let y00 = prev[pi++] ^ input[ii++], y01 = prev[pi++] ^ input[ii++];
|
8295 | let y02 = prev[pi++] ^ input[ii++], y03 = prev[pi++] ^ input[ii++];
|
8296 | let y04 = prev[pi++] ^ input[ii++], y05 = prev[pi++] ^ input[ii++];
|
8297 | let y06 = prev[pi++] ^ input[ii++], y07 = prev[pi++] ^ input[ii++];
|
8298 | let y08 = prev[pi++] ^ input[ii++], y09 = prev[pi++] ^ input[ii++];
|
8299 | let y10 = prev[pi++] ^ input[ii++], y11 = prev[pi++] ^ input[ii++];
|
8300 | let y12 = prev[pi++] ^ input[ii++], y13 = prev[pi++] ^ input[ii++];
|
8301 | let y14 = prev[pi++] ^ input[ii++], y15 = prev[pi++] ^ input[ii++];
|
8302 | let x00 = y00, x01 = y01, x02 = y02, x03 = y03, x04 = y04, x05 = y05, x06 = y06, x07 = y07, x08 = y08, x09 = y09, x10 = y10, x11 = y11, x12 = y12, x13 = y13, x14 = y14, x15 = y15;
|
8303 | for (let i = 0; i < 8; i += 2) {
|
8304 | x04 ^= rotl$1(x00 + x12 | 0, 7);
|
8305 | x08 ^= rotl$1(x04 + x00 | 0, 9);
|
8306 | x12 ^= rotl$1(x08 + x04 | 0, 13);
|
8307 | x00 ^= rotl$1(x12 + x08 | 0, 18);
|
8308 | x09 ^= rotl$1(x05 + x01 | 0, 7);
|
8309 | x13 ^= rotl$1(x09 + x05 | 0, 9);
|
8310 | x01 ^= rotl$1(x13 + x09 | 0, 13);
|
8311 | x05 ^= rotl$1(x01 + x13 | 0, 18);
|
8312 | x14 ^= rotl$1(x10 + x06 | 0, 7);
|
8313 | x02 ^= rotl$1(x14 + x10 | 0, 9);
|
8314 | x06 ^= rotl$1(x02 + x14 | 0, 13);
|
8315 | x10 ^= rotl$1(x06 + x02 | 0, 18);
|
8316 | x03 ^= rotl$1(x15 + x11 | 0, 7);
|
8317 | x07 ^= rotl$1(x03 + x15 | 0, 9);
|
8318 | x11 ^= rotl$1(x07 + x03 | 0, 13);
|
8319 | x15 ^= rotl$1(x11 + x07 | 0, 18);
|
8320 | x01 ^= rotl$1(x00 + x03 | 0, 7);
|
8321 | x02 ^= rotl$1(x01 + x00 | 0, 9);
|
8322 | x03 ^= rotl$1(x02 + x01 | 0, 13);
|
8323 | x00 ^= rotl$1(x03 + x02 | 0, 18);
|
8324 | x06 ^= rotl$1(x05 + x04 | 0, 7);
|
8325 | x07 ^= rotl$1(x06 + x05 | 0, 9);
|
8326 | x04 ^= rotl$1(x07 + x06 | 0, 13);
|
8327 | x05 ^= rotl$1(x04 + x07 | 0, 18);
|
8328 | x11 ^= rotl$1(x10 + x09 | 0, 7);
|
8329 | x08 ^= rotl$1(x11 + x10 | 0, 9);
|
8330 | x09 ^= rotl$1(x08 + x11 | 0, 13);
|
8331 | x10 ^= rotl$1(x09 + x08 | 0, 18);
|
8332 | x12 ^= rotl$1(x15 + x14 | 0, 7);
|
8333 | x13 ^= rotl$1(x12 + x15 | 0, 9);
|
8334 | x14 ^= rotl$1(x13 + x12 | 0, 13);
|
8335 | x15 ^= rotl$1(x14 + x13 | 0, 18);
|
8336 | }
|
8337 | out[oi++] = (y00 + x00) | 0;
|
8338 | out[oi++] = (y01 + x01) | 0;
|
8339 | out[oi++] = (y02 + x02) | 0;
|
8340 | out[oi++] = (y03 + x03) | 0;
|
8341 | out[oi++] = (y04 + x04) | 0;
|
8342 | out[oi++] = (y05 + x05) | 0;
|
8343 | out[oi++] = (y06 + x06) | 0;
|
8344 | out[oi++] = (y07 + x07) | 0;
|
8345 | out[oi++] = (y08 + x08) | 0;
|
8346 | out[oi++] = (y09 + x09) | 0;
|
8347 | out[oi++] = (y10 + x10) | 0;
|
8348 | out[oi++] = (y11 + x11) | 0;
|
8349 | out[oi++] = (y12 + x12) | 0;
|
8350 | out[oi++] = (y13 + x13) | 0;
|
8351 | out[oi++] = (y14 + x14) | 0;
|
8352 | out[oi++] = (y15 + x15) | 0;
|
8353 | }
|
8354 | function BlockMix(input, ii, out, oi, r) {
|
8355 | let head = oi + 0;
|
8356 | let tail = oi + 16 * r;
|
8357 | for (let i = 0; i < 16; i++)
|
8358 | out[tail + i] = input[ii + (2 * r - 1) * 16 + i];
|
8359 | for (let i = 0; i < r; i++, head += 16, ii += 16) {
|
8360 | XorAndSalsa(out, tail, input, ii, out, head);
|
8361 | if (i > 0)
|
8362 | tail += 16;
|
8363 | XorAndSalsa(out, head, input, (ii += 16), out, tail);
|
8364 | }
|
8365 | }
|
8366 | function scryptInit(password, salt, _opts) {
|
8367 | const opts = checkOpts({
|
8368 | dkLen: 32,
|
8369 | asyncTick: 10,
|
8370 | maxmem: 1024 ** 3 + 1024,
|
8371 | }, _opts);
|
8372 | const { N, r, p, dkLen, asyncTick, maxmem, onProgress } = opts;
|
8373 | number(N);
|
8374 | number(r);
|
8375 | number(p);
|
8376 | number(dkLen);
|
8377 | number(asyncTick);
|
8378 | number(maxmem);
|
8379 | if (onProgress !== undefined && typeof onProgress !== 'function')
|
8380 | throw new Error('progressCb should be function');
|
8381 | const blockSize = 128 * r;
|
8382 | const blockSize32 = blockSize / 4;
|
8383 | if (N <= 1 || (N & (N - 1)) !== 0 || N >= 2 ** (blockSize / 8) || N > 2 ** 32) {
|
8384 | throw new Error('Scrypt: N must be larger than 1, a power of 2, less than 2^(128 * r / 8) and less than 2^32');
|
8385 | }
|
8386 | if (p < 0 || p > ((2 ** 32 - 1) * 32) / blockSize) {
|
8387 | throw new Error('Scrypt: p must be a positive integer less than or equal to ((2^32 - 1) * 32) / (128 * r)');
|
8388 | }
|
8389 | if (dkLen < 0 || dkLen > (2 ** 32 - 1) * 32) {
|
8390 | throw new Error('Scrypt: dkLen should be positive integer less than or equal to (2^32 - 1) * 32');
|
8391 | }
|
8392 | const memUsed = blockSize * (N + p);
|
8393 | if (memUsed > maxmem) {
|
8394 | throw new Error(`Scrypt: parameters too large, ${memUsed} (128 * r * (N + p)) > ${maxmem} (maxmem)`);
|
8395 | }
|
8396 | const B = pbkdf2(sha256, password, salt, { c: 1, dkLen: blockSize * p });
|
8397 | const B32 = u32(B);
|
8398 | const V = u32(new Uint8Array(blockSize * N));
|
8399 | const tmp = u32(new Uint8Array(blockSize));
|
8400 | let blockMixCb = () => { };
|
8401 | if (onProgress) {
|
8402 | const totalBlockMix = 2 * N * p;
|
8403 | const callbackPer = Math.max(Math.floor(totalBlockMix / 10000), 1);
|
8404 | let blockMixCnt = 0;
|
8405 | blockMixCb = () => {
|
8406 | blockMixCnt++;
|
8407 | if (onProgress && (!(blockMixCnt % callbackPer) || blockMixCnt === totalBlockMix))
|
8408 | onProgress(blockMixCnt / totalBlockMix);
|
8409 | };
|
8410 | }
|
8411 | return { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb, asyncTick };
|
8412 | }
|
8413 | function scryptOutput(password, dkLen, B, V, tmp) {
|
8414 | const res = pbkdf2(sha256, password, B, { c: 1, dkLen });
|
8415 | B.fill(0);
|
8416 | V.fill(0);
|
8417 | tmp.fill(0);
|
8418 | return res;
|
8419 | }
|
8420 | function scrypt(password, salt, opts) {
|
8421 | const { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb } = scryptInit(password, salt, opts);
|
8422 | for (let pi = 0; pi < p; pi++) {
|
8423 | const Pi = blockSize32 * pi;
|
8424 | for (let i = 0; i < blockSize32; i++)
|
8425 | V[i] = B32[Pi + i];
|
8426 | for (let i = 0, pos = 0; i < N - 1; i++) {
|
8427 | BlockMix(V, pos, V, (pos += blockSize32), r);
|
8428 | blockMixCb();
|
8429 | }
|
8430 | BlockMix(V, (N - 1) * blockSize32, B32, Pi, r);
|
8431 | blockMixCb();
|
8432 | for (let i = 0; i < N; i++) {
|
8433 | const j = B32[Pi + blockSize32 - 16] % N;
|
8434 | for (let k = 0; k < blockSize32; k++)
|
8435 | tmp[k] = B32[Pi + k] ^ V[j * blockSize32 + k];
|
8436 | BlockMix(tmp, 0, B32, Pi, r);
|
8437 | blockMixCb();
|
8438 | }
|
8439 | }
|
8440 | return scryptOutput(password, dkLen, B, V, tmp);
|
8441 | }
|
8442 |
|
8443 | const DEFAULT_PARAMS = {
|
8444 | N: 1 << 15,
|
8445 | p: 1,
|
8446 | r: 8
|
8447 | };
|
8448 |
|
8449 | function scryptEncode(passphrase, salt = randomAsU8a(), params = DEFAULT_PARAMS, onlyJs) {
|
8450 | const u8a = util.u8aToU8a(passphrase);
|
8451 | return {
|
8452 | params,
|
8453 | password: !util.hasBigInt || (!onlyJs && isReady())
|
8454 | ? scrypt$1(u8a, salt, Math.log2(params.N), params.r, params.p)
|
8455 | : scrypt(u8a, salt, util.objectSpread({ dkLen: 64 }, params)),
|
8456 | salt
|
8457 | };
|
8458 | }
|
8459 |
|
8460 | function scryptFromU8a(data) {
|
8461 | const salt = data.subarray(0, 32);
|
8462 | const N = util.u8aToBn(data.subarray(32 + 0, 32 + 4), BN_LE_OPTS).toNumber();
|
8463 | const p = util.u8aToBn(data.subarray(32 + 4, 32 + 8), BN_LE_OPTS).toNumber();
|
8464 | const r = util.u8aToBn(data.subarray(32 + 8, 32 + 12), BN_LE_OPTS).toNumber();
|
8465 | if (N !== DEFAULT_PARAMS.N || p !== DEFAULT_PARAMS.p || r !== DEFAULT_PARAMS.r) {
|
8466 | throw new Error('Invalid injected scrypt params found');
|
8467 | }
|
8468 | return { params: { N, p, r }, salt };
|
8469 | }
|
8470 |
|
8471 | function scryptToU8a(salt, { N, p, r }) {
|
8472 | return util.u8aConcat(salt, util.bnToU8a(N, BN_LE_32_OPTS), util.bnToU8a(p, BN_LE_32_OPTS), util.bnToU8a(r, BN_LE_32_OPTS));
|
8473 | }
|
8474 |
|
8475 | const ENCODING = ['scrypt', 'xsalsa20-poly1305'];
|
8476 | const ENCODING_NONE = ['none'];
|
8477 | const ENCODING_VERSION = '3';
|
8478 | const NONCE_LENGTH = 24;
|
8479 | const SCRYPT_LENGTH = 32 + (3 * 4);
|
8480 |
|
8481 | function jsonDecryptData(encrypted, passphrase, encType = ENCODING) {
|
8482 | if (!encrypted) {
|
8483 | throw new Error('No encrypted data available to decode');
|
8484 | }
|
8485 | else if (encType.includes('xsalsa20-poly1305') && !passphrase) {
|
8486 | throw new Error('Password required to decode encrypted data');
|
8487 | }
|
8488 | let encoded = encrypted;
|
8489 | if (passphrase) {
|
8490 | let password;
|
8491 | if (encType.includes('scrypt')) {
|
8492 | const { params, salt } = scryptFromU8a(encrypted);
|
8493 | password = scryptEncode(passphrase, salt, params).password;
|
8494 | encrypted = encrypted.subarray(SCRYPT_LENGTH);
|
8495 | }
|
8496 | else {
|
8497 | password = util.stringToU8a(passphrase);
|
8498 | }
|
8499 | encoded = naclDecrypt(encrypted.subarray(NONCE_LENGTH), encrypted.subarray(0, NONCE_LENGTH), util.u8aFixLength(password, 256, true));
|
8500 | }
|
8501 | if (!encoded) {
|
8502 | throw new Error('Unable to decode using the supplied passphrase');
|
8503 | }
|
8504 | return encoded;
|
8505 | }
|
8506 |
|
8507 | function jsonDecrypt({ encoded, encoding }, passphrase) {
|
8508 | if (!encoded) {
|
8509 | throw new Error('No encrypted data available to decode');
|
8510 | }
|
8511 | return jsonDecryptData(util.isHex(encoded)
|
8512 | ? util.hexToU8a(encoded)
|
8513 | : base64Decode(encoded), passphrase, Array.isArray(encoding.type)
|
8514 | ? encoding.type
|
8515 | : [encoding.type]);
|
8516 | }
|
8517 |
|
8518 | function jsonEncryptFormat(encoded, contentType, isEncrypted) {
|
8519 | return {
|
8520 | encoded: base64Encode(encoded),
|
8521 | encoding: {
|
8522 | content: contentType,
|
8523 | type: isEncrypted
|
8524 | ? ENCODING
|
8525 | : ENCODING_NONE,
|
8526 | version: ENCODING_VERSION
|
8527 | }
|
8528 | };
|
8529 | }
|
8530 |
|
8531 | function jsonEncrypt(data, contentType, passphrase) {
|
8532 | let isEncrypted = false;
|
8533 | let encoded = data;
|
8534 | if (passphrase) {
|
8535 | const { params, password, salt } = scryptEncode(passphrase);
|
8536 | const { encrypted, nonce } = naclEncrypt(encoded, password.subarray(0, 32));
|
8537 | isEncrypted = true;
|
8538 | encoded = util.u8aConcat(scryptToU8a(salt, params), nonce, encrypted);
|
8539 | }
|
8540 | return jsonEncryptFormat(encoded, contentType, isEncrypted);
|
8541 | }
|
8542 |
|
8543 | const secp256k1VerifyHasher = (hashType) => (message, signature, publicKey) => secp256k1Verify(message, signature, publicKey, hashType);
|
8544 | const VERIFIERS_ECDSA = [
|
8545 | ['ecdsa', secp256k1VerifyHasher('blake2')],
|
8546 | ['ethereum', secp256k1VerifyHasher('keccak')]
|
8547 | ];
|
8548 | const VERIFIERS = [
|
8549 | ['ed25519', ed25519Verify],
|
8550 | ['sr25519', sr25519Verify],
|
8551 | ...VERIFIERS_ECDSA
|
8552 | ];
|
8553 | const CRYPTO_TYPES = ['ed25519', 'sr25519', 'ecdsa'];
|
8554 | function verifyDetect(result, { message, publicKey, signature }, verifiers = VERIFIERS) {
|
8555 | result.isValid = verifiers.some(([crypto, verify]) => {
|
8556 | try {
|
8557 | if (verify(message, signature, publicKey)) {
|
8558 | result.crypto = crypto;
|
8559 | return true;
|
8560 | }
|
8561 | }
|
8562 | catch {
|
8563 | }
|
8564 | return false;
|
8565 | });
|
8566 | return result;
|
8567 | }
|
8568 | function verifyMultisig(result, { message, publicKey, signature }) {
|
8569 | if (![0, 1, 2].includes(signature[0])) {
|
8570 | throw new Error(`Unknown crypto type, expected signature prefix [0..2], found ${signature[0]}`);
|
8571 | }
|
8572 | const type = CRYPTO_TYPES[signature[0]] || 'none';
|
8573 | result.crypto = type;
|
8574 | try {
|
8575 | result.isValid = {
|
8576 | ecdsa: () => verifyDetect(result, { message, publicKey, signature: signature.subarray(1) }, VERIFIERS_ECDSA).isValid,
|
8577 | ed25519: () => ed25519Verify(message, signature.subarray(1), publicKey),
|
8578 | none: () => {
|
8579 | throw Error('no verify for `none` crypto type');
|
8580 | },
|
8581 | sr25519: () => sr25519Verify(message, signature.subarray(1), publicKey)
|
8582 | }[type]();
|
8583 | }
|
8584 | catch {
|
8585 | }
|
8586 | return result;
|
8587 | }
|
8588 | function getVerifyFn(signature) {
|
8589 | return [0, 1, 2].includes(signature[0]) && [65, 66].includes(signature.length)
|
8590 | ? verifyMultisig
|
8591 | : verifyDetect;
|
8592 | }
|
8593 | function signatureVerify(message, signature, addressOrPublicKey) {
|
8594 | const signatureU8a = util.u8aToU8a(signature);
|
8595 | if (![64, 65, 66].includes(signatureU8a.length)) {
|
8596 | throw new Error(`Invalid signature length, expected [64..66] bytes, found ${signatureU8a.length}`);
|
8597 | }
|
8598 | const publicKey = decodeAddress(addressOrPublicKey);
|
8599 | const input = { message: util.u8aToU8a(message), publicKey, signature: signatureU8a };
|
8600 | const result = { crypto: 'none', isValid: false, isWrapped: util.u8aIsWrapped(input.message, true), publicKey };
|
8601 | const isWrappedBytes = util.u8aIsWrapped(input.message, false);
|
8602 | const verifyFn = getVerifyFn(signatureU8a);
|
8603 | verifyFn(result, input);
|
8604 | if (result.crypto !== 'none' || (result.isWrapped && !isWrappedBytes)) {
|
8605 | return result;
|
8606 | }
|
8607 | input.message = isWrappedBytes
|
8608 | ? util.u8aUnwrapBytes(input.message)
|
8609 | : util.u8aWrapBytes(input.message);
|
8610 | return verifyFn(result, input);
|
8611 | }
|
8612 |
|
8613 | const P64_1 = BigInt$1('11400714785074694791');
|
8614 | const P64_2 = BigInt$1('14029467366897019727');
|
8615 | const P64_3 = BigInt$1('1609587929392839161');
|
8616 | const P64_4 = BigInt$1('9650029242287828579');
|
8617 | const P64_5 = BigInt$1('2870177450012600261');
|
8618 | const U64 = BigInt$1('0xffffffffffffffff');
|
8619 | const _7n = BigInt$1(7);
|
8620 | const _11n = BigInt$1(11);
|
8621 | const _12n = BigInt$1(12);
|
8622 | const _16n = BigInt$1(16);
|
8623 | const _18n = BigInt$1(18);
|
8624 | const _23n = BigInt$1(23);
|
8625 | const _27n = BigInt$1(27);
|
8626 | const _29n = BigInt$1(29);
|
8627 | const _31n = BigInt$1(31);
|
8628 | const _32n = BigInt$1(32);
|
8629 | const _33n = BigInt$1(33);
|
8630 | const _64n = BigInt$1(64);
|
8631 | const _256n = BigInt$1(256);
|
8632 | function rotl(a, b) {
|
8633 | const c = a & U64;
|
8634 | return ((c << b) | (c >> (_64n - b))) & U64;
|
8635 | }
|
8636 | function fromU8a(u8a, p, count) {
|
8637 | const bigints = new Array(count);
|
8638 | let offset = 0;
|
8639 | for (let i = 0; i < count; i++, offset += 2) {
|
8640 | bigints[i] = BigInt$1(u8a[p + offset] | (u8a[p + 1 + offset] << 8));
|
8641 | }
|
8642 | let result = util._0n;
|
8643 | for (let i = count - 1; i >= 0; i--) {
|
8644 | result = (result << _16n) + bigints[i];
|
8645 | }
|
8646 | return result;
|
8647 | }
|
8648 | function init(seed, input) {
|
8649 | const state = {
|
8650 | seed,
|
8651 | u8a: new Uint8Array(32),
|
8652 | u8asize: 0,
|
8653 | v1: seed + P64_1 + P64_2,
|
8654 | v2: seed + P64_2,
|
8655 | v3: seed,
|
8656 | v4: seed - P64_1
|
8657 | };
|
8658 | if (input.length < 32) {
|
8659 | state.u8a.set(input);
|
8660 | state.u8asize = input.length;
|
8661 | return state;
|
8662 | }
|
8663 | const limit = input.length - 32;
|
8664 | let p = 0;
|
8665 | if (limit >= 0) {
|
8666 | const adjustV = (v) => P64_1 * rotl(v + P64_2 * fromU8a(input, p, 4), _31n);
|
8667 | do {
|
8668 | state.v1 = adjustV(state.v1);
|
8669 | p += 8;
|
8670 | state.v2 = adjustV(state.v2);
|
8671 | p += 8;
|
8672 | state.v3 = adjustV(state.v3);
|
8673 | p += 8;
|
8674 | state.v4 = adjustV(state.v4);
|
8675 | p += 8;
|
8676 | } while (p <= limit);
|
8677 | }
|
8678 | if (p < input.length) {
|
8679 | state.u8a.set(input.subarray(p, input.length));
|
8680 | state.u8asize = input.length - p;
|
8681 | }
|
8682 | return state;
|
8683 | }
|
8684 | function xxhash64(input, initSeed) {
|
8685 | const { seed, u8a, u8asize, v1, v2, v3, v4 } = init(BigInt$1(initSeed), input);
|
8686 | let p = 0;
|
8687 | let h64 = U64 & (BigInt$1(input.length) + (input.length >= 32
|
8688 | ? (((((((((rotl(v1, util._1n) + rotl(v2, _7n) + rotl(v3, _12n) + rotl(v4, _18n)) ^ (P64_1 * rotl(v1 * P64_2, _31n))) * P64_1 + P64_4) ^ (P64_1 * rotl(v2 * P64_2, _31n))) * P64_1 + P64_4) ^ (P64_1 * rotl(v3 * P64_2, _31n))) * P64_1 + P64_4) ^ (P64_1 * rotl(v4 * P64_2, _31n))) * P64_1 + P64_4)
|
8689 | : (seed + P64_5)));
|
8690 | while (p <= (u8asize - 8)) {
|
8691 | h64 = U64 & (P64_4 + P64_1 * rotl(h64 ^ (P64_1 * rotl(P64_2 * fromU8a(u8a, p, 4), _31n)), _27n));
|
8692 | p += 8;
|
8693 | }
|
8694 | if ((p + 4) <= u8asize) {
|
8695 | h64 = U64 & (P64_3 + P64_2 * rotl(h64 ^ (P64_1 * fromU8a(u8a, p, 2)), _23n));
|
8696 | p += 4;
|
8697 | }
|
8698 | while (p < u8asize) {
|
8699 | h64 = U64 & (P64_1 * rotl(h64 ^ (P64_5 * BigInt$1(u8a[p++])), _11n));
|
8700 | }
|
8701 | h64 = U64 & (P64_2 * (h64 ^ (h64 >> _33n)));
|
8702 | h64 = U64 & (P64_3 * (h64 ^ (h64 >> _29n)));
|
8703 | h64 = U64 & (h64 ^ (h64 >> _32n));
|
8704 | const result = new Uint8Array(8);
|
8705 | for (let i = 7; i >= 0; i--) {
|
8706 | result[i] = Number(h64 % _256n);
|
8707 | h64 = h64 / _256n;
|
8708 | }
|
8709 | return result;
|
8710 | }
|
8711 |
|
8712 | function xxhashAsU8a(data, bitLength = 64, onlyJs) {
|
8713 | const rounds = Math.ceil(bitLength / 64);
|
8714 | const u8a = util.u8aToU8a(data);
|
8715 | if (!util.hasBigInt || (!onlyJs && isReady())) {
|
8716 | return twox(u8a, rounds);
|
8717 | }
|
8718 | const result = new Uint8Array(rounds * 8);
|
8719 | for (let seed = 0; seed < rounds; seed++) {
|
8720 | result.set(xxhash64(u8a, seed).reverse(), seed * 8);
|
8721 | }
|
8722 | return result;
|
8723 | }
|
8724 | const xxhashAsHex = createAsHex(xxhashAsU8a);
|
8725 |
|
8726 | exports.addressEq = addressEq;
|
8727 | exports.addressToEvm = addressToEvm;
|
8728 | exports.allNetworks = allNetworks;
|
8729 | exports.availableNetworks = availableNetworks;
|
8730 | exports.base32Decode = base32Decode;
|
8731 | exports.base32Encode = base32Encode;
|
8732 | exports.base32Validate = base32Validate;
|
8733 | exports.base58Decode = base58Decode;
|
8734 | exports.base58Encode = base58Encode;
|
8735 | exports.base58Validate = base58Validate;
|
8736 | exports.base64Decode = base64Decode;
|
8737 | exports.base64Encode = base64Encode;
|
8738 | exports.base64Pad = base64Pad;
|
8739 | exports.base64Trim = base64Trim;
|
8740 | exports.base64Validate = base64Validate;
|
8741 | exports.blake2AsHex = blake2AsHex;
|
8742 | exports.blake2AsU8a = blake2AsU8a;
|
8743 | exports.checkAddress = checkAddress;
|
8744 | exports.checkAddressChecksum = checkAddressChecksum;
|
8745 | exports.createKeyDerived = createKeyDerived;
|
8746 | exports.createKeyMulti = createKeyMulti;
|
8747 | exports.cryptoIsReady = cryptoIsReady;
|
8748 | exports.cryptoWaitReady = cryptoWaitReady;
|
8749 | exports.decodeAddress = decodeAddress;
|
8750 | exports.deriveAddress = deriveAddress;
|
8751 | exports.ed25519DeriveHard = ed25519DeriveHard;
|
8752 | exports.ed25519PairFromRandom = ed25519PairFromRandom;
|
8753 | exports.ed25519PairFromSecret = ed25519PairFromSecret;
|
8754 | exports.ed25519PairFromSeed = ed25519PairFromSeed;
|
8755 | exports.ed25519PairFromString = ed25519PairFromString;
|
8756 | exports.ed25519Sign = ed25519Sign;
|
8757 | exports.ed25519Verify = ed25519Verify;
|
8758 | exports.encodeAddress = encodeAddress;
|
8759 | exports.encodeDerivedAddress = encodeDerivedAddress;
|
8760 | exports.encodeMultiAddress = encodeMultiAddress;
|
8761 | exports.ethereumEncode = ethereumEncode;
|
8762 | exports.evmToAddress = evmToAddress;
|
8763 | exports.hdEthereum = hdEthereum;
|
8764 | exports.hdLedger = hdLedger;
|
8765 | exports.hdValidatePath = hdValidatePath;
|
8766 | exports.hmacSha256AsU8a = hmacSha256AsU8a;
|
8767 | exports.hmacSha512AsU8a = hmacSha512AsU8a;
|
8768 | exports.hmacShaAsU8a = hmacShaAsU8a;
|
8769 | exports.isAddress = isAddress;
|
8770 | exports.isBase32 = isBase32;
|
8771 | exports.isBase58 = isBase58;
|
8772 | exports.isBase64 = isBase64;
|
8773 | exports.isEthereumAddress = isEthereumAddress;
|
8774 | exports.isEthereumChecksum = isEthereumChecksum;
|
8775 | exports.jsonDecrypt = jsonDecrypt;
|
8776 | exports.jsonDecryptData = jsonDecryptData;
|
8777 | exports.jsonEncrypt = jsonEncrypt;
|
8778 | exports.jsonEncryptFormat = jsonEncryptFormat;
|
8779 | exports.keccak256AsU8a = keccak256AsU8a;
|
8780 | exports.keccak512AsU8a = keccak512AsU8a;
|
8781 | exports.keccakAsHex = keccakAsHex;
|
8782 | exports.keccakAsU8a = keccakAsU8a;
|
8783 | exports.keyExtractPath = keyExtractPath;
|
8784 | exports.keyExtractSuri = keyExtractSuri;
|
8785 | exports.keyFromPath = keyFromPath;
|
8786 | exports.keyHdkdEcdsa = keyHdkdEcdsa;
|
8787 | exports.keyHdkdEd25519 = keyHdkdEd25519;
|
8788 | exports.keyHdkdSr25519 = keyHdkdSr25519;
|
8789 | exports.mnemonicGenerate = mnemonicGenerate;
|
8790 | exports.mnemonicToEntropy = mnemonicToEntropy;
|
8791 | exports.mnemonicToLegacySeed = mnemonicToLegacySeed;
|
8792 | exports.mnemonicToMiniSecret = mnemonicToMiniSecret;
|
8793 | exports.mnemonicValidate = mnemonicValidate;
|
8794 | exports.naclDecrypt = naclDecrypt;
|
8795 | exports.naclEncrypt = naclEncrypt;
|
8796 | exports.packageInfo = packageInfo;
|
8797 | exports.pbkdf2Encode = pbkdf2Encode;
|
8798 | exports.randomAsHex = randomAsHex;
|
8799 | exports.randomAsNumber = randomAsNumber;
|
8800 | exports.randomAsU8a = randomAsU8a;
|
8801 | exports.scryptEncode = scryptEncode;
|
8802 | exports.scryptFromU8a = scryptFromU8a;
|
8803 | exports.scryptToU8a = scryptToU8a;
|
8804 | exports.secp256k1Compress = secp256k1Compress;
|
8805 | exports.secp256k1Expand = secp256k1Expand;
|
8806 | exports.secp256k1PairFromSeed = secp256k1PairFromSeed;
|
8807 | exports.secp256k1PrivateKeyTweakAdd = secp256k1PrivateKeyTweakAdd;
|
8808 | exports.secp256k1Recover = secp256k1Recover;
|
8809 | exports.secp256k1Sign = secp256k1Sign;
|
8810 | exports.secp256k1Verify = secp256k1Verify;
|
8811 | exports.selectableNetworks = selectableNetworks;
|
8812 | exports.setSS58Format = setSS58Format;
|
8813 | exports.sha256AsU8a = sha256AsU8a;
|
8814 | exports.sha512AsU8a = sha512AsU8a;
|
8815 | exports.shaAsU8a = shaAsU8a;
|
8816 | exports.signatureVerify = signatureVerify;
|
8817 | exports.sortAddresses = sortAddresses;
|
8818 | exports.sr25519Agreement = sr25519Agreement;
|
8819 | exports.sr25519DeriveHard = sr25519DeriveHard;
|
8820 | exports.sr25519DerivePublic = sr25519DerivePublic;
|
8821 | exports.sr25519DeriveSoft = sr25519DeriveSoft;
|
8822 | exports.sr25519PairFromSeed = sr25519PairFromSeed;
|
8823 | exports.sr25519Sign = sr25519Sign;
|
8824 | exports.sr25519Verify = sr25519Verify;
|
8825 | exports.sr25519VrfSign = sr25519VrfSign;
|
8826 | exports.sr25519VrfVerify = sr25519VrfVerify;
|
8827 | exports.validateAddress = validateAddress;
|
8828 | exports.xxhashAsHex = xxhashAsHex;
|
8829 | exports.xxhashAsU8a = xxhashAsU8a;
|
8830 |
|
8831 | }));
|
8832 |
|
\ | No newline at end of file |