@tomo-inc/chains-service 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +4726 -0
- package/dist/index.d.cts +524 -0
- package/dist/index.d.ts +524 -0
- package/dist/index.js +4713 -0
- package/package.json +3 -3
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,4726 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var walletUtils = require('@tomo-inc/wallet-utils');
|
|
4
|
+
var Bignumber = require('bignumber.js');
|
|
5
|
+
var viem = require('viem');
|
|
6
|
+
var axios = require('axios');
|
|
7
|
+
var CryptoJS = require('crypto-js');
|
|
8
|
+
var splToken = require('@solana/spl-token');
|
|
9
|
+
var web3_js = require('@solana/web3.js');
|
|
10
|
+
|
|
11
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
|
|
13
|
+
var Bignumber__default = /*#__PURE__*/_interopDefault(Bignumber);
|
|
14
|
+
var axios__default = /*#__PURE__*/_interopDefault(axios);
|
|
15
|
+
var CryptoJS__default = /*#__PURE__*/_interopDefault(CryptoJS);
|
|
16
|
+
|
|
17
|
+
var __create = Object.create;
|
|
18
|
+
var __defProp = Object.defineProperty;
|
|
19
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
20
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
21
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
22
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
23
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
24
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
25
|
+
};
|
|
26
|
+
var __copyProps = (to, from, except, desc) => {
|
|
27
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
28
|
+
for (let key of __getOwnPropNames(from))
|
|
29
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
30
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
31
|
+
}
|
|
32
|
+
return to;
|
|
33
|
+
};
|
|
34
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
35
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
36
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
37
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
38
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
39
|
+
__defProp(target, "default", { value: mod, enumerable: true }) ,
|
|
40
|
+
mod
|
|
41
|
+
));
|
|
42
|
+
|
|
43
|
+
// (disabled):../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
|
|
44
|
+
var require_buffer = __commonJS({
|
|
45
|
+
"(disabled):../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js"() {
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// ../../node_modules/.pnpm/bn.js@5.2.2/node_modules/bn.js/lib/bn.js
|
|
50
|
+
var require_bn = __commonJS({
|
|
51
|
+
"../../node_modules/.pnpm/bn.js@5.2.2/node_modules/bn.js/lib/bn.js"(exports$1, module) {
|
|
52
|
+
(function(module2, exports2) {
|
|
53
|
+
function assert(val, msg) {
|
|
54
|
+
if (!val) throw new Error(msg || "Assertion failed");
|
|
55
|
+
}
|
|
56
|
+
function inherits(ctor, superCtor) {
|
|
57
|
+
ctor.super_ = superCtor;
|
|
58
|
+
var TempCtor = function() {
|
|
59
|
+
};
|
|
60
|
+
TempCtor.prototype = superCtor.prototype;
|
|
61
|
+
ctor.prototype = new TempCtor();
|
|
62
|
+
ctor.prototype.constructor = ctor;
|
|
63
|
+
}
|
|
64
|
+
function BN2(number, base, endian) {
|
|
65
|
+
if (BN2.isBN(number)) {
|
|
66
|
+
return number;
|
|
67
|
+
}
|
|
68
|
+
this.negative = 0;
|
|
69
|
+
this.words = null;
|
|
70
|
+
this.length = 0;
|
|
71
|
+
this.red = null;
|
|
72
|
+
if (number !== null) {
|
|
73
|
+
if (base === "le" || base === "be") {
|
|
74
|
+
endian = base;
|
|
75
|
+
base = 10;
|
|
76
|
+
}
|
|
77
|
+
this._init(number || 0, base || 10, endian || "be");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (typeof module2 === "object") {
|
|
81
|
+
module2.exports = BN2;
|
|
82
|
+
} else {
|
|
83
|
+
exports2.BN = BN2;
|
|
84
|
+
}
|
|
85
|
+
BN2.BN = BN2;
|
|
86
|
+
BN2.wordSize = 26;
|
|
87
|
+
var Buffer2;
|
|
88
|
+
try {
|
|
89
|
+
if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") {
|
|
90
|
+
Buffer2 = window.Buffer;
|
|
91
|
+
} else {
|
|
92
|
+
Buffer2 = require_buffer().Buffer;
|
|
93
|
+
}
|
|
94
|
+
} catch (e) {
|
|
95
|
+
}
|
|
96
|
+
BN2.isBN = function isBN(num) {
|
|
97
|
+
if (num instanceof BN2) {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
return num !== null && typeof num === "object" && num.constructor.wordSize === BN2.wordSize && Array.isArray(num.words);
|
|
101
|
+
};
|
|
102
|
+
BN2.max = function max(left, right) {
|
|
103
|
+
if (left.cmp(right) > 0) return left;
|
|
104
|
+
return right;
|
|
105
|
+
};
|
|
106
|
+
BN2.min = function min(left, right) {
|
|
107
|
+
if (left.cmp(right) < 0) return left;
|
|
108
|
+
return right;
|
|
109
|
+
};
|
|
110
|
+
BN2.prototype._init = function init(number, base, endian) {
|
|
111
|
+
if (typeof number === "number") {
|
|
112
|
+
return this._initNumber(number, base, endian);
|
|
113
|
+
}
|
|
114
|
+
if (typeof number === "object") {
|
|
115
|
+
return this._initArray(number, base, endian);
|
|
116
|
+
}
|
|
117
|
+
if (base === "hex") {
|
|
118
|
+
base = 16;
|
|
119
|
+
}
|
|
120
|
+
assert(base === (base | 0) && base >= 2 && base <= 36);
|
|
121
|
+
number = number.toString().replace(/\s+/g, "");
|
|
122
|
+
var start = 0;
|
|
123
|
+
if (number[0] === "-") {
|
|
124
|
+
start++;
|
|
125
|
+
this.negative = 1;
|
|
126
|
+
}
|
|
127
|
+
if (start < number.length) {
|
|
128
|
+
if (base === 16) {
|
|
129
|
+
this._parseHex(number, start, endian);
|
|
130
|
+
} else {
|
|
131
|
+
this._parseBase(number, base, start);
|
|
132
|
+
if (endian === "le") {
|
|
133
|
+
this._initArray(this.toArray(), base, endian);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
BN2.prototype._initNumber = function _initNumber(number, base, endian) {
|
|
139
|
+
if (number < 0) {
|
|
140
|
+
this.negative = 1;
|
|
141
|
+
number = -number;
|
|
142
|
+
}
|
|
143
|
+
if (number < 67108864) {
|
|
144
|
+
this.words = [number & 67108863];
|
|
145
|
+
this.length = 1;
|
|
146
|
+
} else if (number < 4503599627370496) {
|
|
147
|
+
this.words = [
|
|
148
|
+
number & 67108863,
|
|
149
|
+
number / 67108864 & 67108863
|
|
150
|
+
];
|
|
151
|
+
this.length = 2;
|
|
152
|
+
} else {
|
|
153
|
+
assert(number < 9007199254740992);
|
|
154
|
+
this.words = [
|
|
155
|
+
number & 67108863,
|
|
156
|
+
number / 67108864 & 67108863,
|
|
157
|
+
1
|
|
158
|
+
];
|
|
159
|
+
this.length = 3;
|
|
160
|
+
}
|
|
161
|
+
if (endian !== "le") return;
|
|
162
|
+
this._initArray(this.toArray(), base, endian);
|
|
163
|
+
};
|
|
164
|
+
BN2.prototype._initArray = function _initArray(number, base, endian) {
|
|
165
|
+
assert(typeof number.length === "number");
|
|
166
|
+
if (number.length <= 0) {
|
|
167
|
+
this.words = [0];
|
|
168
|
+
this.length = 1;
|
|
169
|
+
return this;
|
|
170
|
+
}
|
|
171
|
+
this.length = Math.ceil(number.length / 3);
|
|
172
|
+
this.words = new Array(this.length);
|
|
173
|
+
for (var i = 0; i < this.length; i++) {
|
|
174
|
+
this.words[i] = 0;
|
|
175
|
+
}
|
|
176
|
+
var j, w;
|
|
177
|
+
var off = 0;
|
|
178
|
+
if (endian === "be") {
|
|
179
|
+
for (i = number.length - 1, j = 0; i >= 0; i -= 3) {
|
|
180
|
+
w = number[i] | number[i - 1] << 8 | number[i - 2] << 16;
|
|
181
|
+
this.words[j] |= w << off & 67108863;
|
|
182
|
+
this.words[j + 1] = w >>> 26 - off & 67108863;
|
|
183
|
+
off += 24;
|
|
184
|
+
if (off >= 26) {
|
|
185
|
+
off -= 26;
|
|
186
|
+
j++;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
} else if (endian === "le") {
|
|
190
|
+
for (i = 0, j = 0; i < number.length; i += 3) {
|
|
191
|
+
w = number[i] | number[i + 1] << 8 | number[i + 2] << 16;
|
|
192
|
+
this.words[j] |= w << off & 67108863;
|
|
193
|
+
this.words[j + 1] = w >>> 26 - off & 67108863;
|
|
194
|
+
off += 24;
|
|
195
|
+
if (off >= 26) {
|
|
196
|
+
off -= 26;
|
|
197
|
+
j++;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return this._strip();
|
|
202
|
+
};
|
|
203
|
+
function parseHex4Bits(string, index) {
|
|
204
|
+
var c = string.charCodeAt(index);
|
|
205
|
+
if (c >= 48 && c <= 57) {
|
|
206
|
+
return c - 48;
|
|
207
|
+
} else if (c >= 65 && c <= 70) {
|
|
208
|
+
return c - 55;
|
|
209
|
+
} else if (c >= 97 && c <= 102) {
|
|
210
|
+
return c - 87;
|
|
211
|
+
} else {
|
|
212
|
+
assert(false, "Invalid character in " + string);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function parseHexByte(string, lowerBound, index) {
|
|
216
|
+
var r = parseHex4Bits(string, index);
|
|
217
|
+
if (index - 1 >= lowerBound) {
|
|
218
|
+
r |= parseHex4Bits(string, index - 1) << 4;
|
|
219
|
+
}
|
|
220
|
+
return r;
|
|
221
|
+
}
|
|
222
|
+
BN2.prototype._parseHex = function _parseHex(number, start, endian) {
|
|
223
|
+
this.length = Math.ceil((number.length - start) / 6);
|
|
224
|
+
this.words = new Array(this.length);
|
|
225
|
+
for (var i = 0; i < this.length; i++) {
|
|
226
|
+
this.words[i] = 0;
|
|
227
|
+
}
|
|
228
|
+
var off = 0;
|
|
229
|
+
var j = 0;
|
|
230
|
+
var w;
|
|
231
|
+
if (endian === "be") {
|
|
232
|
+
for (i = number.length - 1; i >= start; i -= 2) {
|
|
233
|
+
w = parseHexByte(number, start, i) << off;
|
|
234
|
+
this.words[j] |= w & 67108863;
|
|
235
|
+
if (off >= 18) {
|
|
236
|
+
off -= 18;
|
|
237
|
+
j += 1;
|
|
238
|
+
this.words[j] |= w >>> 26;
|
|
239
|
+
} else {
|
|
240
|
+
off += 8;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
} else {
|
|
244
|
+
var parseLength = number.length - start;
|
|
245
|
+
for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {
|
|
246
|
+
w = parseHexByte(number, start, i) << off;
|
|
247
|
+
this.words[j] |= w & 67108863;
|
|
248
|
+
if (off >= 18) {
|
|
249
|
+
off -= 18;
|
|
250
|
+
j += 1;
|
|
251
|
+
this.words[j] |= w >>> 26;
|
|
252
|
+
} else {
|
|
253
|
+
off += 8;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
this._strip();
|
|
258
|
+
};
|
|
259
|
+
function parseBase(str, start, end, mul) {
|
|
260
|
+
var r = 0;
|
|
261
|
+
var b = 0;
|
|
262
|
+
var len = Math.min(str.length, end);
|
|
263
|
+
for (var i = start; i < len; i++) {
|
|
264
|
+
var c = str.charCodeAt(i) - 48;
|
|
265
|
+
r *= mul;
|
|
266
|
+
if (c >= 49) {
|
|
267
|
+
b = c - 49 + 10;
|
|
268
|
+
} else if (c >= 17) {
|
|
269
|
+
b = c - 17 + 10;
|
|
270
|
+
} else {
|
|
271
|
+
b = c;
|
|
272
|
+
}
|
|
273
|
+
assert(c >= 0 && b < mul, "Invalid character");
|
|
274
|
+
r += b;
|
|
275
|
+
}
|
|
276
|
+
return r;
|
|
277
|
+
}
|
|
278
|
+
BN2.prototype._parseBase = function _parseBase(number, base, start) {
|
|
279
|
+
this.words = [0];
|
|
280
|
+
this.length = 1;
|
|
281
|
+
for (var limbLen = 0, limbPow = 1; limbPow <= 67108863; limbPow *= base) {
|
|
282
|
+
limbLen++;
|
|
283
|
+
}
|
|
284
|
+
limbLen--;
|
|
285
|
+
limbPow = limbPow / base | 0;
|
|
286
|
+
var total = number.length - start;
|
|
287
|
+
var mod = total % limbLen;
|
|
288
|
+
var end = Math.min(total, total - mod) + start;
|
|
289
|
+
var word = 0;
|
|
290
|
+
for (var i = start; i < end; i += limbLen) {
|
|
291
|
+
word = parseBase(number, i, i + limbLen, base);
|
|
292
|
+
this.imuln(limbPow);
|
|
293
|
+
if (this.words[0] + word < 67108864) {
|
|
294
|
+
this.words[0] += word;
|
|
295
|
+
} else {
|
|
296
|
+
this._iaddn(word);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (mod !== 0) {
|
|
300
|
+
var pow = 1;
|
|
301
|
+
word = parseBase(number, i, number.length, base);
|
|
302
|
+
for (i = 0; i < mod; i++) {
|
|
303
|
+
pow *= base;
|
|
304
|
+
}
|
|
305
|
+
this.imuln(pow);
|
|
306
|
+
if (this.words[0] + word < 67108864) {
|
|
307
|
+
this.words[0] += word;
|
|
308
|
+
} else {
|
|
309
|
+
this._iaddn(word);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
this._strip();
|
|
313
|
+
};
|
|
314
|
+
BN2.prototype.copy = function copy(dest) {
|
|
315
|
+
dest.words = new Array(this.length);
|
|
316
|
+
for (var i = 0; i < this.length; i++) {
|
|
317
|
+
dest.words[i] = this.words[i];
|
|
318
|
+
}
|
|
319
|
+
dest.length = this.length;
|
|
320
|
+
dest.negative = this.negative;
|
|
321
|
+
dest.red = this.red;
|
|
322
|
+
};
|
|
323
|
+
function move(dest, src) {
|
|
324
|
+
dest.words = src.words;
|
|
325
|
+
dest.length = src.length;
|
|
326
|
+
dest.negative = src.negative;
|
|
327
|
+
dest.red = src.red;
|
|
328
|
+
}
|
|
329
|
+
BN2.prototype._move = function _move(dest) {
|
|
330
|
+
move(dest, this);
|
|
331
|
+
};
|
|
332
|
+
BN2.prototype.clone = function clone() {
|
|
333
|
+
var r = new BN2(null);
|
|
334
|
+
this.copy(r);
|
|
335
|
+
return r;
|
|
336
|
+
};
|
|
337
|
+
BN2.prototype._expand = function _expand(size) {
|
|
338
|
+
while (this.length < size) {
|
|
339
|
+
this.words[this.length++] = 0;
|
|
340
|
+
}
|
|
341
|
+
return this;
|
|
342
|
+
};
|
|
343
|
+
BN2.prototype._strip = function strip() {
|
|
344
|
+
while (this.length > 1 && this.words[this.length - 1] === 0) {
|
|
345
|
+
this.length--;
|
|
346
|
+
}
|
|
347
|
+
return this._normSign();
|
|
348
|
+
};
|
|
349
|
+
BN2.prototype._normSign = function _normSign() {
|
|
350
|
+
if (this.length === 1 && this.words[0] === 0) {
|
|
351
|
+
this.negative = 0;
|
|
352
|
+
}
|
|
353
|
+
return this;
|
|
354
|
+
};
|
|
355
|
+
if (typeof Symbol !== "undefined" && typeof Symbol.for === "function") {
|
|
356
|
+
try {
|
|
357
|
+
BN2.prototype[Symbol.for("nodejs.util.inspect.custom")] = inspect;
|
|
358
|
+
} catch (e) {
|
|
359
|
+
BN2.prototype.inspect = inspect;
|
|
360
|
+
}
|
|
361
|
+
} else {
|
|
362
|
+
BN2.prototype.inspect = inspect;
|
|
363
|
+
}
|
|
364
|
+
function inspect() {
|
|
365
|
+
return (this.red ? "<BN-R: " : "<BN: ") + this.toString(16) + ">";
|
|
366
|
+
}
|
|
367
|
+
var zeros = [
|
|
368
|
+
"",
|
|
369
|
+
"0",
|
|
370
|
+
"00",
|
|
371
|
+
"000",
|
|
372
|
+
"0000",
|
|
373
|
+
"00000",
|
|
374
|
+
"000000",
|
|
375
|
+
"0000000",
|
|
376
|
+
"00000000",
|
|
377
|
+
"000000000",
|
|
378
|
+
"0000000000",
|
|
379
|
+
"00000000000",
|
|
380
|
+
"000000000000",
|
|
381
|
+
"0000000000000",
|
|
382
|
+
"00000000000000",
|
|
383
|
+
"000000000000000",
|
|
384
|
+
"0000000000000000",
|
|
385
|
+
"00000000000000000",
|
|
386
|
+
"000000000000000000",
|
|
387
|
+
"0000000000000000000",
|
|
388
|
+
"00000000000000000000",
|
|
389
|
+
"000000000000000000000",
|
|
390
|
+
"0000000000000000000000",
|
|
391
|
+
"00000000000000000000000",
|
|
392
|
+
"000000000000000000000000",
|
|
393
|
+
"0000000000000000000000000"
|
|
394
|
+
];
|
|
395
|
+
var groupSizes = [
|
|
396
|
+
0,
|
|
397
|
+
0,
|
|
398
|
+
25,
|
|
399
|
+
16,
|
|
400
|
+
12,
|
|
401
|
+
11,
|
|
402
|
+
10,
|
|
403
|
+
9,
|
|
404
|
+
8,
|
|
405
|
+
8,
|
|
406
|
+
7,
|
|
407
|
+
7,
|
|
408
|
+
7,
|
|
409
|
+
7,
|
|
410
|
+
6,
|
|
411
|
+
6,
|
|
412
|
+
6,
|
|
413
|
+
6,
|
|
414
|
+
6,
|
|
415
|
+
6,
|
|
416
|
+
6,
|
|
417
|
+
5,
|
|
418
|
+
5,
|
|
419
|
+
5,
|
|
420
|
+
5,
|
|
421
|
+
5,
|
|
422
|
+
5,
|
|
423
|
+
5,
|
|
424
|
+
5,
|
|
425
|
+
5,
|
|
426
|
+
5,
|
|
427
|
+
5,
|
|
428
|
+
5,
|
|
429
|
+
5,
|
|
430
|
+
5,
|
|
431
|
+
5,
|
|
432
|
+
5
|
|
433
|
+
];
|
|
434
|
+
var groupBases = [
|
|
435
|
+
0,
|
|
436
|
+
0,
|
|
437
|
+
33554432,
|
|
438
|
+
43046721,
|
|
439
|
+
16777216,
|
|
440
|
+
48828125,
|
|
441
|
+
60466176,
|
|
442
|
+
40353607,
|
|
443
|
+
16777216,
|
|
444
|
+
43046721,
|
|
445
|
+
1e7,
|
|
446
|
+
19487171,
|
|
447
|
+
35831808,
|
|
448
|
+
62748517,
|
|
449
|
+
7529536,
|
|
450
|
+
11390625,
|
|
451
|
+
16777216,
|
|
452
|
+
24137569,
|
|
453
|
+
34012224,
|
|
454
|
+
47045881,
|
|
455
|
+
64e6,
|
|
456
|
+
4084101,
|
|
457
|
+
5153632,
|
|
458
|
+
6436343,
|
|
459
|
+
7962624,
|
|
460
|
+
9765625,
|
|
461
|
+
11881376,
|
|
462
|
+
14348907,
|
|
463
|
+
17210368,
|
|
464
|
+
20511149,
|
|
465
|
+
243e5,
|
|
466
|
+
28629151,
|
|
467
|
+
33554432,
|
|
468
|
+
39135393,
|
|
469
|
+
45435424,
|
|
470
|
+
52521875,
|
|
471
|
+
60466176
|
|
472
|
+
];
|
|
473
|
+
BN2.prototype.toString = function toString(base, padding) {
|
|
474
|
+
base = base || 10;
|
|
475
|
+
padding = padding | 0 || 1;
|
|
476
|
+
var out;
|
|
477
|
+
if (base === 16 || base === "hex") {
|
|
478
|
+
out = "";
|
|
479
|
+
var off = 0;
|
|
480
|
+
var carry = 0;
|
|
481
|
+
for (var i = 0; i < this.length; i++) {
|
|
482
|
+
var w = this.words[i];
|
|
483
|
+
var word = ((w << off | carry) & 16777215).toString(16);
|
|
484
|
+
carry = w >>> 24 - off & 16777215;
|
|
485
|
+
off += 2;
|
|
486
|
+
if (off >= 26) {
|
|
487
|
+
off -= 26;
|
|
488
|
+
i--;
|
|
489
|
+
}
|
|
490
|
+
if (carry !== 0 || i !== this.length - 1) {
|
|
491
|
+
out = zeros[6 - word.length] + word + out;
|
|
492
|
+
} else {
|
|
493
|
+
out = word + out;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
if (carry !== 0) {
|
|
497
|
+
out = carry.toString(16) + out;
|
|
498
|
+
}
|
|
499
|
+
while (out.length % padding !== 0) {
|
|
500
|
+
out = "0" + out;
|
|
501
|
+
}
|
|
502
|
+
if (this.negative !== 0) {
|
|
503
|
+
out = "-" + out;
|
|
504
|
+
}
|
|
505
|
+
return out;
|
|
506
|
+
}
|
|
507
|
+
if (base === (base | 0) && base >= 2 && base <= 36) {
|
|
508
|
+
var groupSize = groupSizes[base];
|
|
509
|
+
var groupBase = groupBases[base];
|
|
510
|
+
out = "";
|
|
511
|
+
var c = this.clone();
|
|
512
|
+
c.negative = 0;
|
|
513
|
+
while (!c.isZero()) {
|
|
514
|
+
var r = c.modrn(groupBase).toString(base);
|
|
515
|
+
c = c.idivn(groupBase);
|
|
516
|
+
if (!c.isZero()) {
|
|
517
|
+
out = zeros[groupSize - r.length] + r + out;
|
|
518
|
+
} else {
|
|
519
|
+
out = r + out;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
if (this.isZero()) {
|
|
523
|
+
out = "0" + out;
|
|
524
|
+
}
|
|
525
|
+
while (out.length % padding !== 0) {
|
|
526
|
+
out = "0" + out;
|
|
527
|
+
}
|
|
528
|
+
if (this.negative !== 0) {
|
|
529
|
+
out = "-" + out;
|
|
530
|
+
}
|
|
531
|
+
return out;
|
|
532
|
+
}
|
|
533
|
+
assert(false, "Base should be between 2 and 36");
|
|
534
|
+
};
|
|
535
|
+
BN2.prototype.toNumber = function toNumber() {
|
|
536
|
+
var ret = this.words[0];
|
|
537
|
+
if (this.length === 2) {
|
|
538
|
+
ret += this.words[1] * 67108864;
|
|
539
|
+
} else if (this.length === 3 && this.words[2] === 1) {
|
|
540
|
+
ret += 4503599627370496 + this.words[1] * 67108864;
|
|
541
|
+
} else if (this.length > 2) {
|
|
542
|
+
assert(false, "Number can only safely store up to 53 bits");
|
|
543
|
+
}
|
|
544
|
+
return this.negative !== 0 ? -ret : ret;
|
|
545
|
+
};
|
|
546
|
+
BN2.prototype.toJSON = function toJSON() {
|
|
547
|
+
return this.toString(16, 2);
|
|
548
|
+
};
|
|
549
|
+
if (Buffer2) {
|
|
550
|
+
BN2.prototype.toBuffer = function toBuffer(endian, length) {
|
|
551
|
+
return this.toArrayLike(Buffer2, endian, length);
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
BN2.prototype.toArray = function toArray(endian, length) {
|
|
555
|
+
return this.toArrayLike(Array, endian, length);
|
|
556
|
+
};
|
|
557
|
+
var allocate = function allocate2(ArrayType, size) {
|
|
558
|
+
if (ArrayType.allocUnsafe) {
|
|
559
|
+
return ArrayType.allocUnsafe(size);
|
|
560
|
+
}
|
|
561
|
+
return new ArrayType(size);
|
|
562
|
+
};
|
|
563
|
+
BN2.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) {
|
|
564
|
+
this._strip();
|
|
565
|
+
var byteLength = this.byteLength();
|
|
566
|
+
var reqLength = length || Math.max(1, byteLength);
|
|
567
|
+
assert(byteLength <= reqLength, "byte array longer than desired length");
|
|
568
|
+
assert(reqLength > 0, "Requested array length <= 0");
|
|
569
|
+
var res = allocate(ArrayType, reqLength);
|
|
570
|
+
var postfix = endian === "le" ? "LE" : "BE";
|
|
571
|
+
this["_toArrayLike" + postfix](res, byteLength);
|
|
572
|
+
return res;
|
|
573
|
+
};
|
|
574
|
+
BN2.prototype._toArrayLikeLE = function _toArrayLikeLE(res, byteLength) {
|
|
575
|
+
var position = 0;
|
|
576
|
+
var carry = 0;
|
|
577
|
+
for (var i = 0, shift = 0; i < this.length; i++) {
|
|
578
|
+
var word = this.words[i] << shift | carry;
|
|
579
|
+
res[position++] = word & 255;
|
|
580
|
+
if (position < res.length) {
|
|
581
|
+
res[position++] = word >> 8 & 255;
|
|
582
|
+
}
|
|
583
|
+
if (position < res.length) {
|
|
584
|
+
res[position++] = word >> 16 & 255;
|
|
585
|
+
}
|
|
586
|
+
if (shift === 6) {
|
|
587
|
+
if (position < res.length) {
|
|
588
|
+
res[position++] = word >> 24 & 255;
|
|
589
|
+
}
|
|
590
|
+
carry = 0;
|
|
591
|
+
shift = 0;
|
|
592
|
+
} else {
|
|
593
|
+
carry = word >>> 24;
|
|
594
|
+
shift += 2;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
if (position < res.length) {
|
|
598
|
+
res[position++] = carry;
|
|
599
|
+
while (position < res.length) {
|
|
600
|
+
res[position++] = 0;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
};
|
|
604
|
+
BN2.prototype._toArrayLikeBE = function _toArrayLikeBE(res, byteLength) {
|
|
605
|
+
var position = res.length - 1;
|
|
606
|
+
var carry = 0;
|
|
607
|
+
for (var i = 0, shift = 0; i < this.length; i++) {
|
|
608
|
+
var word = this.words[i] << shift | carry;
|
|
609
|
+
res[position--] = word & 255;
|
|
610
|
+
if (position >= 0) {
|
|
611
|
+
res[position--] = word >> 8 & 255;
|
|
612
|
+
}
|
|
613
|
+
if (position >= 0) {
|
|
614
|
+
res[position--] = word >> 16 & 255;
|
|
615
|
+
}
|
|
616
|
+
if (shift === 6) {
|
|
617
|
+
if (position >= 0) {
|
|
618
|
+
res[position--] = word >> 24 & 255;
|
|
619
|
+
}
|
|
620
|
+
carry = 0;
|
|
621
|
+
shift = 0;
|
|
622
|
+
} else {
|
|
623
|
+
carry = word >>> 24;
|
|
624
|
+
shift += 2;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
if (position >= 0) {
|
|
628
|
+
res[position--] = carry;
|
|
629
|
+
while (position >= 0) {
|
|
630
|
+
res[position--] = 0;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
};
|
|
634
|
+
if (Math.clz32) {
|
|
635
|
+
BN2.prototype._countBits = function _countBits(w) {
|
|
636
|
+
return 32 - Math.clz32(w);
|
|
637
|
+
};
|
|
638
|
+
} else {
|
|
639
|
+
BN2.prototype._countBits = function _countBits(w) {
|
|
640
|
+
var t = w;
|
|
641
|
+
var r = 0;
|
|
642
|
+
if (t >= 4096) {
|
|
643
|
+
r += 13;
|
|
644
|
+
t >>>= 13;
|
|
645
|
+
}
|
|
646
|
+
if (t >= 64) {
|
|
647
|
+
r += 7;
|
|
648
|
+
t >>>= 7;
|
|
649
|
+
}
|
|
650
|
+
if (t >= 8) {
|
|
651
|
+
r += 4;
|
|
652
|
+
t >>>= 4;
|
|
653
|
+
}
|
|
654
|
+
if (t >= 2) {
|
|
655
|
+
r += 2;
|
|
656
|
+
t >>>= 2;
|
|
657
|
+
}
|
|
658
|
+
return r + t;
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
BN2.prototype._zeroBits = function _zeroBits(w) {
|
|
662
|
+
if (w === 0) return 26;
|
|
663
|
+
var t = w;
|
|
664
|
+
var r = 0;
|
|
665
|
+
if ((t & 8191) === 0) {
|
|
666
|
+
r += 13;
|
|
667
|
+
t >>>= 13;
|
|
668
|
+
}
|
|
669
|
+
if ((t & 127) === 0) {
|
|
670
|
+
r += 7;
|
|
671
|
+
t >>>= 7;
|
|
672
|
+
}
|
|
673
|
+
if ((t & 15) === 0) {
|
|
674
|
+
r += 4;
|
|
675
|
+
t >>>= 4;
|
|
676
|
+
}
|
|
677
|
+
if ((t & 3) === 0) {
|
|
678
|
+
r += 2;
|
|
679
|
+
t >>>= 2;
|
|
680
|
+
}
|
|
681
|
+
if ((t & 1) === 0) {
|
|
682
|
+
r++;
|
|
683
|
+
}
|
|
684
|
+
return r;
|
|
685
|
+
};
|
|
686
|
+
BN2.prototype.bitLength = function bitLength() {
|
|
687
|
+
var w = this.words[this.length - 1];
|
|
688
|
+
var hi = this._countBits(w);
|
|
689
|
+
return (this.length - 1) * 26 + hi;
|
|
690
|
+
};
|
|
691
|
+
function toBitArray(num) {
|
|
692
|
+
var w = new Array(num.bitLength());
|
|
693
|
+
for (var bit = 0; bit < w.length; bit++) {
|
|
694
|
+
var off = bit / 26 | 0;
|
|
695
|
+
var wbit = bit % 26;
|
|
696
|
+
w[bit] = num.words[off] >>> wbit & 1;
|
|
697
|
+
}
|
|
698
|
+
return w;
|
|
699
|
+
}
|
|
700
|
+
BN2.prototype.zeroBits = function zeroBits() {
|
|
701
|
+
if (this.isZero()) return 0;
|
|
702
|
+
var r = 0;
|
|
703
|
+
for (var i = 0; i < this.length; i++) {
|
|
704
|
+
var b = this._zeroBits(this.words[i]);
|
|
705
|
+
r += b;
|
|
706
|
+
if (b !== 26) break;
|
|
707
|
+
}
|
|
708
|
+
return r;
|
|
709
|
+
};
|
|
710
|
+
BN2.prototype.byteLength = function byteLength() {
|
|
711
|
+
return Math.ceil(this.bitLength() / 8);
|
|
712
|
+
};
|
|
713
|
+
BN2.prototype.toTwos = function toTwos(width) {
|
|
714
|
+
if (this.negative !== 0) {
|
|
715
|
+
return this.abs().inotn(width).iaddn(1);
|
|
716
|
+
}
|
|
717
|
+
return this.clone();
|
|
718
|
+
};
|
|
719
|
+
BN2.prototype.fromTwos = function fromTwos(width) {
|
|
720
|
+
if (this.testn(width - 1)) {
|
|
721
|
+
return this.notn(width).iaddn(1).ineg();
|
|
722
|
+
}
|
|
723
|
+
return this.clone();
|
|
724
|
+
};
|
|
725
|
+
BN2.prototype.isNeg = function isNeg() {
|
|
726
|
+
return this.negative !== 0;
|
|
727
|
+
};
|
|
728
|
+
BN2.prototype.neg = function neg() {
|
|
729
|
+
return this.clone().ineg();
|
|
730
|
+
};
|
|
731
|
+
BN2.prototype.ineg = function ineg() {
|
|
732
|
+
if (!this.isZero()) {
|
|
733
|
+
this.negative ^= 1;
|
|
734
|
+
}
|
|
735
|
+
return this;
|
|
736
|
+
};
|
|
737
|
+
BN2.prototype.iuor = function iuor(num) {
|
|
738
|
+
while (this.length < num.length) {
|
|
739
|
+
this.words[this.length++] = 0;
|
|
740
|
+
}
|
|
741
|
+
for (var i = 0; i < num.length; i++) {
|
|
742
|
+
this.words[i] = this.words[i] | num.words[i];
|
|
743
|
+
}
|
|
744
|
+
return this._strip();
|
|
745
|
+
};
|
|
746
|
+
BN2.prototype.ior = function ior(num) {
|
|
747
|
+
assert((this.negative | num.negative) === 0);
|
|
748
|
+
return this.iuor(num);
|
|
749
|
+
};
|
|
750
|
+
BN2.prototype.or = function or(num) {
|
|
751
|
+
if (this.length > num.length) return this.clone().ior(num);
|
|
752
|
+
return num.clone().ior(this);
|
|
753
|
+
};
|
|
754
|
+
BN2.prototype.uor = function uor(num) {
|
|
755
|
+
if (this.length > num.length) return this.clone().iuor(num);
|
|
756
|
+
return num.clone().iuor(this);
|
|
757
|
+
};
|
|
758
|
+
BN2.prototype.iuand = function iuand(num) {
|
|
759
|
+
var b;
|
|
760
|
+
if (this.length > num.length) {
|
|
761
|
+
b = num;
|
|
762
|
+
} else {
|
|
763
|
+
b = this;
|
|
764
|
+
}
|
|
765
|
+
for (var i = 0; i < b.length; i++) {
|
|
766
|
+
this.words[i] = this.words[i] & num.words[i];
|
|
767
|
+
}
|
|
768
|
+
this.length = b.length;
|
|
769
|
+
return this._strip();
|
|
770
|
+
};
|
|
771
|
+
BN2.prototype.iand = function iand(num) {
|
|
772
|
+
assert((this.negative | num.negative) === 0);
|
|
773
|
+
return this.iuand(num);
|
|
774
|
+
};
|
|
775
|
+
BN2.prototype.and = function and(num) {
|
|
776
|
+
if (this.length > num.length) return this.clone().iand(num);
|
|
777
|
+
return num.clone().iand(this);
|
|
778
|
+
};
|
|
779
|
+
BN2.prototype.uand = function uand(num) {
|
|
780
|
+
if (this.length > num.length) return this.clone().iuand(num);
|
|
781
|
+
return num.clone().iuand(this);
|
|
782
|
+
};
|
|
783
|
+
BN2.prototype.iuxor = function iuxor(num) {
|
|
784
|
+
var a;
|
|
785
|
+
var b;
|
|
786
|
+
if (this.length > num.length) {
|
|
787
|
+
a = this;
|
|
788
|
+
b = num;
|
|
789
|
+
} else {
|
|
790
|
+
a = num;
|
|
791
|
+
b = this;
|
|
792
|
+
}
|
|
793
|
+
for (var i = 0; i < b.length; i++) {
|
|
794
|
+
this.words[i] = a.words[i] ^ b.words[i];
|
|
795
|
+
}
|
|
796
|
+
if (this !== a) {
|
|
797
|
+
for (; i < a.length; i++) {
|
|
798
|
+
this.words[i] = a.words[i];
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
this.length = a.length;
|
|
802
|
+
return this._strip();
|
|
803
|
+
};
|
|
804
|
+
BN2.prototype.ixor = function ixor(num) {
|
|
805
|
+
assert((this.negative | num.negative) === 0);
|
|
806
|
+
return this.iuxor(num);
|
|
807
|
+
};
|
|
808
|
+
BN2.prototype.xor = function xor(num) {
|
|
809
|
+
if (this.length > num.length) return this.clone().ixor(num);
|
|
810
|
+
return num.clone().ixor(this);
|
|
811
|
+
};
|
|
812
|
+
BN2.prototype.uxor = function uxor(num) {
|
|
813
|
+
if (this.length > num.length) return this.clone().iuxor(num);
|
|
814
|
+
return num.clone().iuxor(this);
|
|
815
|
+
};
|
|
816
|
+
BN2.prototype.inotn = function inotn(width) {
|
|
817
|
+
assert(typeof width === "number" && width >= 0);
|
|
818
|
+
var bytesNeeded = Math.ceil(width / 26) | 0;
|
|
819
|
+
var bitsLeft = width % 26;
|
|
820
|
+
this._expand(bytesNeeded);
|
|
821
|
+
if (bitsLeft > 0) {
|
|
822
|
+
bytesNeeded--;
|
|
823
|
+
}
|
|
824
|
+
for (var i = 0; i < bytesNeeded; i++) {
|
|
825
|
+
this.words[i] = ~this.words[i] & 67108863;
|
|
826
|
+
}
|
|
827
|
+
if (bitsLeft > 0) {
|
|
828
|
+
this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft;
|
|
829
|
+
}
|
|
830
|
+
return this._strip();
|
|
831
|
+
};
|
|
832
|
+
BN2.prototype.notn = function notn(width) {
|
|
833
|
+
return this.clone().inotn(width);
|
|
834
|
+
};
|
|
835
|
+
BN2.prototype.setn = function setn(bit, val) {
|
|
836
|
+
assert(typeof bit === "number" && bit >= 0);
|
|
837
|
+
var off = bit / 26 | 0;
|
|
838
|
+
var wbit = bit % 26;
|
|
839
|
+
this._expand(off + 1);
|
|
840
|
+
if (val) {
|
|
841
|
+
this.words[off] = this.words[off] | 1 << wbit;
|
|
842
|
+
} else {
|
|
843
|
+
this.words[off] = this.words[off] & ~(1 << wbit);
|
|
844
|
+
}
|
|
845
|
+
return this._strip();
|
|
846
|
+
};
|
|
847
|
+
BN2.prototype.iadd = function iadd(num) {
|
|
848
|
+
var r;
|
|
849
|
+
if (this.negative !== 0 && num.negative === 0) {
|
|
850
|
+
this.negative = 0;
|
|
851
|
+
r = this.isub(num);
|
|
852
|
+
this.negative ^= 1;
|
|
853
|
+
return this._normSign();
|
|
854
|
+
} else if (this.negative === 0 && num.negative !== 0) {
|
|
855
|
+
num.negative = 0;
|
|
856
|
+
r = this.isub(num);
|
|
857
|
+
num.negative = 1;
|
|
858
|
+
return r._normSign();
|
|
859
|
+
}
|
|
860
|
+
var a, b;
|
|
861
|
+
if (this.length > num.length) {
|
|
862
|
+
a = this;
|
|
863
|
+
b = num;
|
|
864
|
+
} else {
|
|
865
|
+
a = num;
|
|
866
|
+
b = this;
|
|
867
|
+
}
|
|
868
|
+
var carry = 0;
|
|
869
|
+
for (var i = 0; i < b.length; i++) {
|
|
870
|
+
r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
|
|
871
|
+
this.words[i] = r & 67108863;
|
|
872
|
+
carry = r >>> 26;
|
|
873
|
+
}
|
|
874
|
+
for (; carry !== 0 && i < a.length; i++) {
|
|
875
|
+
r = (a.words[i] | 0) + carry;
|
|
876
|
+
this.words[i] = r & 67108863;
|
|
877
|
+
carry = r >>> 26;
|
|
878
|
+
}
|
|
879
|
+
this.length = a.length;
|
|
880
|
+
if (carry !== 0) {
|
|
881
|
+
this.words[this.length] = carry;
|
|
882
|
+
this.length++;
|
|
883
|
+
} else if (a !== this) {
|
|
884
|
+
for (; i < a.length; i++) {
|
|
885
|
+
this.words[i] = a.words[i];
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
return this;
|
|
889
|
+
};
|
|
890
|
+
BN2.prototype.add = function add(num) {
|
|
891
|
+
var res;
|
|
892
|
+
if (num.negative !== 0 && this.negative === 0) {
|
|
893
|
+
num.negative = 0;
|
|
894
|
+
res = this.sub(num);
|
|
895
|
+
num.negative ^= 1;
|
|
896
|
+
return res;
|
|
897
|
+
} else if (num.negative === 0 && this.negative !== 0) {
|
|
898
|
+
this.negative = 0;
|
|
899
|
+
res = num.sub(this);
|
|
900
|
+
this.negative = 1;
|
|
901
|
+
return res;
|
|
902
|
+
}
|
|
903
|
+
if (this.length > num.length) return this.clone().iadd(num);
|
|
904
|
+
return num.clone().iadd(this);
|
|
905
|
+
};
|
|
906
|
+
BN2.prototype.isub = function isub(num) {
|
|
907
|
+
if (num.negative !== 0) {
|
|
908
|
+
num.negative = 0;
|
|
909
|
+
var r = this.iadd(num);
|
|
910
|
+
num.negative = 1;
|
|
911
|
+
return r._normSign();
|
|
912
|
+
} else if (this.negative !== 0) {
|
|
913
|
+
this.negative = 0;
|
|
914
|
+
this.iadd(num);
|
|
915
|
+
this.negative = 1;
|
|
916
|
+
return this._normSign();
|
|
917
|
+
}
|
|
918
|
+
var cmp = this.cmp(num);
|
|
919
|
+
if (cmp === 0) {
|
|
920
|
+
this.negative = 0;
|
|
921
|
+
this.length = 1;
|
|
922
|
+
this.words[0] = 0;
|
|
923
|
+
return this;
|
|
924
|
+
}
|
|
925
|
+
var a, b;
|
|
926
|
+
if (cmp > 0) {
|
|
927
|
+
a = this;
|
|
928
|
+
b = num;
|
|
929
|
+
} else {
|
|
930
|
+
a = num;
|
|
931
|
+
b = this;
|
|
932
|
+
}
|
|
933
|
+
var carry = 0;
|
|
934
|
+
for (var i = 0; i < b.length; i++) {
|
|
935
|
+
r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
|
|
936
|
+
carry = r >> 26;
|
|
937
|
+
this.words[i] = r & 67108863;
|
|
938
|
+
}
|
|
939
|
+
for (; carry !== 0 && i < a.length; i++) {
|
|
940
|
+
r = (a.words[i] | 0) + carry;
|
|
941
|
+
carry = r >> 26;
|
|
942
|
+
this.words[i] = r & 67108863;
|
|
943
|
+
}
|
|
944
|
+
if (carry === 0 && i < a.length && a !== this) {
|
|
945
|
+
for (; i < a.length; i++) {
|
|
946
|
+
this.words[i] = a.words[i];
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
this.length = Math.max(this.length, i);
|
|
950
|
+
if (a !== this) {
|
|
951
|
+
this.negative = 1;
|
|
952
|
+
}
|
|
953
|
+
return this._strip();
|
|
954
|
+
};
|
|
955
|
+
BN2.prototype.sub = function sub(num) {
|
|
956
|
+
return this.clone().isub(num);
|
|
957
|
+
};
|
|
958
|
+
function smallMulTo(self, num, out) {
|
|
959
|
+
out.negative = num.negative ^ self.negative;
|
|
960
|
+
var len = self.length + num.length | 0;
|
|
961
|
+
out.length = len;
|
|
962
|
+
len = len - 1 | 0;
|
|
963
|
+
var a = self.words[0] | 0;
|
|
964
|
+
var b = num.words[0] | 0;
|
|
965
|
+
var r = a * b;
|
|
966
|
+
var lo = r & 67108863;
|
|
967
|
+
var carry = r / 67108864 | 0;
|
|
968
|
+
out.words[0] = lo;
|
|
969
|
+
for (var k = 1; k < len; k++) {
|
|
970
|
+
var ncarry = carry >>> 26;
|
|
971
|
+
var rword = carry & 67108863;
|
|
972
|
+
var maxJ = Math.min(k, num.length - 1);
|
|
973
|
+
for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
|
|
974
|
+
var i = k - j | 0;
|
|
975
|
+
a = self.words[i] | 0;
|
|
976
|
+
b = num.words[j] | 0;
|
|
977
|
+
r = a * b + rword;
|
|
978
|
+
ncarry += r / 67108864 | 0;
|
|
979
|
+
rword = r & 67108863;
|
|
980
|
+
}
|
|
981
|
+
out.words[k] = rword | 0;
|
|
982
|
+
carry = ncarry | 0;
|
|
983
|
+
}
|
|
984
|
+
if (carry !== 0) {
|
|
985
|
+
out.words[k] = carry | 0;
|
|
986
|
+
} else {
|
|
987
|
+
out.length--;
|
|
988
|
+
}
|
|
989
|
+
return out._strip();
|
|
990
|
+
}
|
|
991
|
+
var comb10MulTo = function comb10MulTo2(self, num, out) {
|
|
992
|
+
var a = self.words;
|
|
993
|
+
var b = num.words;
|
|
994
|
+
var o = out.words;
|
|
995
|
+
var c = 0;
|
|
996
|
+
var lo;
|
|
997
|
+
var mid;
|
|
998
|
+
var hi;
|
|
999
|
+
var a0 = a[0] | 0;
|
|
1000
|
+
var al0 = a0 & 8191;
|
|
1001
|
+
var ah0 = a0 >>> 13;
|
|
1002
|
+
var a1 = a[1] | 0;
|
|
1003
|
+
var al1 = a1 & 8191;
|
|
1004
|
+
var ah1 = a1 >>> 13;
|
|
1005
|
+
var a2 = a[2] | 0;
|
|
1006
|
+
var al2 = a2 & 8191;
|
|
1007
|
+
var ah2 = a2 >>> 13;
|
|
1008
|
+
var a3 = a[3] | 0;
|
|
1009
|
+
var al3 = a3 & 8191;
|
|
1010
|
+
var ah3 = a3 >>> 13;
|
|
1011
|
+
var a4 = a[4] | 0;
|
|
1012
|
+
var al4 = a4 & 8191;
|
|
1013
|
+
var ah4 = a4 >>> 13;
|
|
1014
|
+
var a5 = a[5] | 0;
|
|
1015
|
+
var al5 = a5 & 8191;
|
|
1016
|
+
var ah5 = a5 >>> 13;
|
|
1017
|
+
var a6 = a[6] | 0;
|
|
1018
|
+
var al6 = a6 & 8191;
|
|
1019
|
+
var ah6 = a6 >>> 13;
|
|
1020
|
+
var a7 = a[7] | 0;
|
|
1021
|
+
var al7 = a7 & 8191;
|
|
1022
|
+
var ah7 = a7 >>> 13;
|
|
1023
|
+
var a8 = a[8] | 0;
|
|
1024
|
+
var al8 = a8 & 8191;
|
|
1025
|
+
var ah8 = a8 >>> 13;
|
|
1026
|
+
var a9 = a[9] | 0;
|
|
1027
|
+
var al9 = a9 & 8191;
|
|
1028
|
+
var ah9 = a9 >>> 13;
|
|
1029
|
+
var b0 = b[0] | 0;
|
|
1030
|
+
var bl0 = b0 & 8191;
|
|
1031
|
+
var bh0 = b0 >>> 13;
|
|
1032
|
+
var b1 = b[1] | 0;
|
|
1033
|
+
var bl1 = b1 & 8191;
|
|
1034
|
+
var bh1 = b1 >>> 13;
|
|
1035
|
+
var b2 = b[2] | 0;
|
|
1036
|
+
var bl2 = b2 & 8191;
|
|
1037
|
+
var bh2 = b2 >>> 13;
|
|
1038
|
+
var b3 = b[3] | 0;
|
|
1039
|
+
var bl3 = b3 & 8191;
|
|
1040
|
+
var bh3 = b3 >>> 13;
|
|
1041
|
+
var b4 = b[4] | 0;
|
|
1042
|
+
var bl4 = b4 & 8191;
|
|
1043
|
+
var bh4 = b4 >>> 13;
|
|
1044
|
+
var b5 = b[5] | 0;
|
|
1045
|
+
var bl5 = b5 & 8191;
|
|
1046
|
+
var bh5 = b5 >>> 13;
|
|
1047
|
+
var b6 = b[6] | 0;
|
|
1048
|
+
var bl6 = b6 & 8191;
|
|
1049
|
+
var bh6 = b6 >>> 13;
|
|
1050
|
+
var b7 = b[7] | 0;
|
|
1051
|
+
var bl7 = b7 & 8191;
|
|
1052
|
+
var bh7 = b7 >>> 13;
|
|
1053
|
+
var b8 = b[8] | 0;
|
|
1054
|
+
var bl8 = b8 & 8191;
|
|
1055
|
+
var bh8 = b8 >>> 13;
|
|
1056
|
+
var b9 = b[9] | 0;
|
|
1057
|
+
var bl9 = b9 & 8191;
|
|
1058
|
+
var bh9 = b9 >>> 13;
|
|
1059
|
+
out.negative = self.negative ^ num.negative;
|
|
1060
|
+
out.length = 19;
|
|
1061
|
+
lo = Math.imul(al0, bl0);
|
|
1062
|
+
mid = Math.imul(al0, bh0);
|
|
1063
|
+
mid = mid + Math.imul(ah0, bl0) | 0;
|
|
1064
|
+
hi = Math.imul(ah0, bh0);
|
|
1065
|
+
var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1066
|
+
c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0;
|
|
1067
|
+
w0 &= 67108863;
|
|
1068
|
+
lo = Math.imul(al1, bl0);
|
|
1069
|
+
mid = Math.imul(al1, bh0);
|
|
1070
|
+
mid = mid + Math.imul(ah1, bl0) | 0;
|
|
1071
|
+
hi = Math.imul(ah1, bh0);
|
|
1072
|
+
lo = lo + Math.imul(al0, bl1) | 0;
|
|
1073
|
+
mid = mid + Math.imul(al0, bh1) | 0;
|
|
1074
|
+
mid = mid + Math.imul(ah0, bl1) | 0;
|
|
1075
|
+
hi = hi + Math.imul(ah0, bh1) | 0;
|
|
1076
|
+
var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1077
|
+
c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0;
|
|
1078
|
+
w1 &= 67108863;
|
|
1079
|
+
lo = Math.imul(al2, bl0);
|
|
1080
|
+
mid = Math.imul(al2, bh0);
|
|
1081
|
+
mid = mid + Math.imul(ah2, bl0) | 0;
|
|
1082
|
+
hi = Math.imul(ah2, bh0);
|
|
1083
|
+
lo = lo + Math.imul(al1, bl1) | 0;
|
|
1084
|
+
mid = mid + Math.imul(al1, bh1) | 0;
|
|
1085
|
+
mid = mid + Math.imul(ah1, bl1) | 0;
|
|
1086
|
+
hi = hi + Math.imul(ah1, bh1) | 0;
|
|
1087
|
+
lo = lo + Math.imul(al0, bl2) | 0;
|
|
1088
|
+
mid = mid + Math.imul(al0, bh2) | 0;
|
|
1089
|
+
mid = mid + Math.imul(ah0, bl2) | 0;
|
|
1090
|
+
hi = hi + Math.imul(ah0, bh2) | 0;
|
|
1091
|
+
var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1092
|
+
c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0;
|
|
1093
|
+
w2 &= 67108863;
|
|
1094
|
+
lo = Math.imul(al3, bl0);
|
|
1095
|
+
mid = Math.imul(al3, bh0);
|
|
1096
|
+
mid = mid + Math.imul(ah3, bl0) | 0;
|
|
1097
|
+
hi = Math.imul(ah3, bh0);
|
|
1098
|
+
lo = lo + Math.imul(al2, bl1) | 0;
|
|
1099
|
+
mid = mid + Math.imul(al2, bh1) | 0;
|
|
1100
|
+
mid = mid + Math.imul(ah2, bl1) | 0;
|
|
1101
|
+
hi = hi + Math.imul(ah2, bh1) | 0;
|
|
1102
|
+
lo = lo + Math.imul(al1, bl2) | 0;
|
|
1103
|
+
mid = mid + Math.imul(al1, bh2) | 0;
|
|
1104
|
+
mid = mid + Math.imul(ah1, bl2) | 0;
|
|
1105
|
+
hi = hi + Math.imul(ah1, bh2) | 0;
|
|
1106
|
+
lo = lo + Math.imul(al0, bl3) | 0;
|
|
1107
|
+
mid = mid + Math.imul(al0, bh3) | 0;
|
|
1108
|
+
mid = mid + Math.imul(ah0, bl3) | 0;
|
|
1109
|
+
hi = hi + Math.imul(ah0, bh3) | 0;
|
|
1110
|
+
var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1111
|
+
c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0;
|
|
1112
|
+
w3 &= 67108863;
|
|
1113
|
+
lo = Math.imul(al4, bl0);
|
|
1114
|
+
mid = Math.imul(al4, bh0);
|
|
1115
|
+
mid = mid + Math.imul(ah4, bl0) | 0;
|
|
1116
|
+
hi = Math.imul(ah4, bh0);
|
|
1117
|
+
lo = lo + Math.imul(al3, bl1) | 0;
|
|
1118
|
+
mid = mid + Math.imul(al3, bh1) | 0;
|
|
1119
|
+
mid = mid + Math.imul(ah3, bl1) | 0;
|
|
1120
|
+
hi = hi + Math.imul(ah3, bh1) | 0;
|
|
1121
|
+
lo = lo + Math.imul(al2, bl2) | 0;
|
|
1122
|
+
mid = mid + Math.imul(al2, bh2) | 0;
|
|
1123
|
+
mid = mid + Math.imul(ah2, bl2) | 0;
|
|
1124
|
+
hi = hi + Math.imul(ah2, bh2) | 0;
|
|
1125
|
+
lo = lo + Math.imul(al1, bl3) | 0;
|
|
1126
|
+
mid = mid + Math.imul(al1, bh3) | 0;
|
|
1127
|
+
mid = mid + Math.imul(ah1, bl3) | 0;
|
|
1128
|
+
hi = hi + Math.imul(ah1, bh3) | 0;
|
|
1129
|
+
lo = lo + Math.imul(al0, bl4) | 0;
|
|
1130
|
+
mid = mid + Math.imul(al0, bh4) | 0;
|
|
1131
|
+
mid = mid + Math.imul(ah0, bl4) | 0;
|
|
1132
|
+
hi = hi + Math.imul(ah0, bh4) | 0;
|
|
1133
|
+
var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1134
|
+
c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0;
|
|
1135
|
+
w4 &= 67108863;
|
|
1136
|
+
lo = Math.imul(al5, bl0);
|
|
1137
|
+
mid = Math.imul(al5, bh0);
|
|
1138
|
+
mid = mid + Math.imul(ah5, bl0) | 0;
|
|
1139
|
+
hi = Math.imul(ah5, bh0);
|
|
1140
|
+
lo = lo + Math.imul(al4, bl1) | 0;
|
|
1141
|
+
mid = mid + Math.imul(al4, bh1) | 0;
|
|
1142
|
+
mid = mid + Math.imul(ah4, bl1) | 0;
|
|
1143
|
+
hi = hi + Math.imul(ah4, bh1) | 0;
|
|
1144
|
+
lo = lo + Math.imul(al3, bl2) | 0;
|
|
1145
|
+
mid = mid + Math.imul(al3, bh2) | 0;
|
|
1146
|
+
mid = mid + Math.imul(ah3, bl2) | 0;
|
|
1147
|
+
hi = hi + Math.imul(ah3, bh2) | 0;
|
|
1148
|
+
lo = lo + Math.imul(al2, bl3) | 0;
|
|
1149
|
+
mid = mid + Math.imul(al2, bh3) | 0;
|
|
1150
|
+
mid = mid + Math.imul(ah2, bl3) | 0;
|
|
1151
|
+
hi = hi + Math.imul(ah2, bh3) | 0;
|
|
1152
|
+
lo = lo + Math.imul(al1, bl4) | 0;
|
|
1153
|
+
mid = mid + Math.imul(al1, bh4) | 0;
|
|
1154
|
+
mid = mid + Math.imul(ah1, bl4) | 0;
|
|
1155
|
+
hi = hi + Math.imul(ah1, bh4) | 0;
|
|
1156
|
+
lo = lo + Math.imul(al0, bl5) | 0;
|
|
1157
|
+
mid = mid + Math.imul(al0, bh5) | 0;
|
|
1158
|
+
mid = mid + Math.imul(ah0, bl5) | 0;
|
|
1159
|
+
hi = hi + Math.imul(ah0, bh5) | 0;
|
|
1160
|
+
var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1161
|
+
c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0;
|
|
1162
|
+
w5 &= 67108863;
|
|
1163
|
+
lo = Math.imul(al6, bl0);
|
|
1164
|
+
mid = Math.imul(al6, bh0);
|
|
1165
|
+
mid = mid + Math.imul(ah6, bl0) | 0;
|
|
1166
|
+
hi = Math.imul(ah6, bh0);
|
|
1167
|
+
lo = lo + Math.imul(al5, bl1) | 0;
|
|
1168
|
+
mid = mid + Math.imul(al5, bh1) | 0;
|
|
1169
|
+
mid = mid + Math.imul(ah5, bl1) | 0;
|
|
1170
|
+
hi = hi + Math.imul(ah5, bh1) | 0;
|
|
1171
|
+
lo = lo + Math.imul(al4, bl2) | 0;
|
|
1172
|
+
mid = mid + Math.imul(al4, bh2) | 0;
|
|
1173
|
+
mid = mid + Math.imul(ah4, bl2) | 0;
|
|
1174
|
+
hi = hi + Math.imul(ah4, bh2) | 0;
|
|
1175
|
+
lo = lo + Math.imul(al3, bl3) | 0;
|
|
1176
|
+
mid = mid + Math.imul(al3, bh3) | 0;
|
|
1177
|
+
mid = mid + Math.imul(ah3, bl3) | 0;
|
|
1178
|
+
hi = hi + Math.imul(ah3, bh3) | 0;
|
|
1179
|
+
lo = lo + Math.imul(al2, bl4) | 0;
|
|
1180
|
+
mid = mid + Math.imul(al2, bh4) | 0;
|
|
1181
|
+
mid = mid + Math.imul(ah2, bl4) | 0;
|
|
1182
|
+
hi = hi + Math.imul(ah2, bh4) | 0;
|
|
1183
|
+
lo = lo + Math.imul(al1, bl5) | 0;
|
|
1184
|
+
mid = mid + Math.imul(al1, bh5) | 0;
|
|
1185
|
+
mid = mid + Math.imul(ah1, bl5) | 0;
|
|
1186
|
+
hi = hi + Math.imul(ah1, bh5) | 0;
|
|
1187
|
+
lo = lo + Math.imul(al0, bl6) | 0;
|
|
1188
|
+
mid = mid + Math.imul(al0, bh6) | 0;
|
|
1189
|
+
mid = mid + Math.imul(ah0, bl6) | 0;
|
|
1190
|
+
hi = hi + Math.imul(ah0, bh6) | 0;
|
|
1191
|
+
var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1192
|
+
c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0;
|
|
1193
|
+
w6 &= 67108863;
|
|
1194
|
+
lo = Math.imul(al7, bl0);
|
|
1195
|
+
mid = Math.imul(al7, bh0);
|
|
1196
|
+
mid = mid + Math.imul(ah7, bl0) | 0;
|
|
1197
|
+
hi = Math.imul(ah7, bh0);
|
|
1198
|
+
lo = lo + Math.imul(al6, bl1) | 0;
|
|
1199
|
+
mid = mid + Math.imul(al6, bh1) | 0;
|
|
1200
|
+
mid = mid + Math.imul(ah6, bl1) | 0;
|
|
1201
|
+
hi = hi + Math.imul(ah6, bh1) | 0;
|
|
1202
|
+
lo = lo + Math.imul(al5, bl2) | 0;
|
|
1203
|
+
mid = mid + Math.imul(al5, bh2) | 0;
|
|
1204
|
+
mid = mid + Math.imul(ah5, bl2) | 0;
|
|
1205
|
+
hi = hi + Math.imul(ah5, bh2) | 0;
|
|
1206
|
+
lo = lo + Math.imul(al4, bl3) | 0;
|
|
1207
|
+
mid = mid + Math.imul(al4, bh3) | 0;
|
|
1208
|
+
mid = mid + Math.imul(ah4, bl3) | 0;
|
|
1209
|
+
hi = hi + Math.imul(ah4, bh3) | 0;
|
|
1210
|
+
lo = lo + Math.imul(al3, bl4) | 0;
|
|
1211
|
+
mid = mid + Math.imul(al3, bh4) | 0;
|
|
1212
|
+
mid = mid + Math.imul(ah3, bl4) | 0;
|
|
1213
|
+
hi = hi + Math.imul(ah3, bh4) | 0;
|
|
1214
|
+
lo = lo + Math.imul(al2, bl5) | 0;
|
|
1215
|
+
mid = mid + Math.imul(al2, bh5) | 0;
|
|
1216
|
+
mid = mid + Math.imul(ah2, bl5) | 0;
|
|
1217
|
+
hi = hi + Math.imul(ah2, bh5) | 0;
|
|
1218
|
+
lo = lo + Math.imul(al1, bl6) | 0;
|
|
1219
|
+
mid = mid + Math.imul(al1, bh6) | 0;
|
|
1220
|
+
mid = mid + Math.imul(ah1, bl6) | 0;
|
|
1221
|
+
hi = hi + Math.imul(ah1, bh6) | 0;
|
|
1222
|
+
lo = lo + Math.imul(al0, bl7) | 0;
|
|
1223
|
+
mid = mid + Math.imul(al0, bh7) | 0;
|
|
1224
|
+
mid = mid + Math.imul(ah0, bl7) | 0;
|
|
1225
|
+
hi = hi + Math.imul(ah0, bh7) | 0;
|
|
1226
|
+
var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1227
|
+
c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0;
|
|
1228
|
+
w7 &= 67108863;
|
|
1229
|
+
lo = Math.imul(al8, bl0);
|
|
1230
|
+
mid = Math.imul(al8, bh0);
|
|
1231
|
+
mid = mid + Math.imul(ah8, bl0) | 0;
|
|
1232
|
+
hi = Math.imul(ah8, bh0);
|
|
1233
|
+
lo = lo + Math.imul(al7, bl1) | 0;
|
|
1234
|
+
mid = mid + Math.imul(al7, bh1) | 0;
|
|
1235
|
+
mid = mid + Math.imul(ah7, bl1) | 0;
|
|
1236
|
+
hi = hi + Math.imul(ah7, bh1) | 0;
|
|
1237
|
+
lo = lo + Math.imul(al6, bl2) | 0;
|
|
1238
|
+
mid = mid + Math.imul(al6, bh2) | 0;
|
|
1239
|
+
mid = mid + Math.imul(ah6, bl2) | 0;
|
|
1240
|
+
hi = hi + Math.imul(ah6, bh2) | 0;
|
|
1241
|
+
lo = lo + Math.imul(al5, bl3) | 0;
|
|
1242
|
+
mid = mid + Math.imul(al5, bh3) | 0;
|
|
1243
|
+
mid = mid + Math.imul(ah5, bl3) | 0;
|
|
1244
|
+
hi = hi + Math.imul(ah5, bh3) | 0;
|
|
1245
|
+
lo = lo + Math.imul(al4, bl4) | 0;
|
|
1246
|
+
mid = mid + Math.imul(al4, bh4) | 0;
|
|
1247
|
+
mid = mid + Math.imul(ah4, bl4) | 0;
|
|
1248
|
+
hi = hi + Math.imul(ah4, bh4) | 0;
|
|
1249
|
+
lo = lo + Math.imul(al3, bl5) | 0;
|
|
1250
|
+
mid = mid + Math.imul(al3, bh5) | 0;
|
|
1251
|
+
mid = mid + Math.imul(ah3, bl5) | 0;
|
|
1252
|
+
hi = hi + Math.imul(ah3, bh5) | 0;
|
|
1253
|
+
lo = lo + Math.imul(al2, bl6) | 0;
|
|
1254
|
+
mid = mid + Math.imul(al2, bh6) | 0;
|
|
1255
|
+
mid = mid + Math.imul(ah2, bl6) | 0;
|
|
1256
|
+
hi = hi + Math.imul(ah2, bh6) | 0;
|
|
1257
|
+
lo = lo + Math.imul(al1, bl7) | 0;
|
|
1258
|
+
mid = mid + Math.imul(al1, bh7) | 0;
|
|
1259
|
+
mid = mid + Math.imul(ah1, bl7) | 0;
|
|
1260
|
+
hi = hi + Math.imul(ah1, bh7) | 0;
|
|
1261
|
+
lo = lo + Math.imul(al0, bl8) | 0;
|
|
1262
|
+
mid = mid + Math.imul(al0, bh8) | 0;
|
|
1263
|
+
mid = mid + Math.imul(ah0, bl8) | 0;
|
|
1264
|
+
hi = hi + Math.imul(ah0, bh8) | 0;
|
|
1265
|
+
var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1266
|
+
c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0;
|
|
1267
|
+
w8 &= 67108863;
|
|
1268
|
+
lo = Math.imul(al9, bl0);
|
|
1269
|
+
mid = Math.imul(al9, bh0);
|
|
1270
|
+
mid = mid + Math.imul(ah9, bl0) | 0;
|
|
1271
|
+
hi = Math.imul(ah9, bh0);
|
|
1272
|
+
lo = lo + Math.imul(al8, bl1) | 0;
|
|
1273
|
+
mid = mid + Math.imul(al8, bh1) | 0;
|
|
1274
|
+
mid = mid + Math.imul(ah8, bl1) | 0;
|
|
1275
|
+
hi = hi + Math.imul(ah8, bh1) | 0;
|
|
1276
|
+
lo = lo + Math.imul(al7, bl2) | 0;
|
|
1277
|
+
mid = mid + Math.imul(al7, bh2) | 0;
|
|
1278
|
+
mid = mid + Math.imul(ah7, bl2) | 0;
|
|
1279
|
+
hi = hi + Math.imul(ah7, bh2) | 0;
|
|
1280
|
+
lo = lo + Math.imul(al6, bl3) | 0;
|
|
1281
|
+
mid = mid + Math.imul(al6, bh3) | 0;
|
|
1282
|
+
mid = mid + Math.imul(ah6, bl3) | 0;
|
|
1283
|
+
hi = hi + Math.imul(ah6, bh3) | 0;
|
|
1284
|
+
lo = lo + Math.imul(al5, bl4) | 0;
|
|
1285
|
+
mid = mid + Math.imul(al5, bh4) | 0;
|
|
1286
|
+
mid = mid + Math.imul(ah5, bl4) | 0;
|
|
1287
|
+
hi = hi + Math.imul(ah5, bh4) | 0;
|
|
1288
|
+
lo = lo + Math.imul(al4, bl5) | 0;
|
|
1289
|
+
mid = mid + Math.imul(al4, bh5) | 0;
|
|
1290
|
+
mid = mid + Math.imul(ah4, bl5) | 0;
|
|
1291
|
+
hi = hi + Math.imul(ah4, bh5) | 0;
|
|
1292
|
+
lo = lo + Math.imul(al3, bl6) | 0;
|
|
1293
|
+
mid = mid + Math.imul(al3, bh6) | 0;
|
|
1294
|
+
mid = mid + Math.imul(ah3, bl6) | 0;
|
|
1295
|
+
hi = hi + Math.imul(ah3, bh6) | 0;
|
|
1296
|
+
lo = lo + Math.imul(al2, bl7) | 0;
|
|
1297
|
+
mid = mid + Math.imul(al2, bh7) | 0;
|
|
1298
|
+
mid = mid + Math.imul(ah2, bl7) | 0;
|
|
1299
|
+
hi = hi + Math.imul(ah2, bh7) | 0;
|
|
1300
|
+
lo = lo + Math.imul(al1, bl8) | 0;
|
|
1301
|
+
mid = mid + Math.imul(al1, bh8) | 0;
|
|
1302
|
+
mid = mid + Math.imul(ah1, bl8) | 0;
|
|
1303
|
+
hi = hi + Math.imul(ah1, bh8) | 0;
|
|
1304
|
+
lo = lo + Math.imul(al0, bl9) | 0;
|
|
1305
|
+
mid = mid + Math.imul(al0, bh9) | 0;
|
|
1306
|
+
mid = mid + Math.imul(ah0, bl9) | 0;
|
|
1307
|
+
hi = hi + Math.imul(ah0, bh9) | 0;
|
|
1308
|
+
var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1309
|
+
c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0;
|
|
1310
|
+
w9 &= 67108863;
|
|
1311
|
+
lo = Math.imul(al9, bl1);
|
|
1312
|
+
mid = Math.imul(al9, bh1);
|
|
1313
|
+
mid = mid + Math.imul(ah9, bl1) | 0;
|
|
1314
|
+
hi = Math.imul(ah9, bh1);
|
|
1315
|
+
lo = lo + Math.imul(al8, bl2) | 0;
|
|
1316
|
+
mid = mid + Math.imul(al8, bh2) | 0;
|
|
1317
|
+
mid = mid + Math.imul(ah8, bl2) | 0;
|
|
1318
|
+
hi = hi + Math.imul(ah8, bh2) | 0;
|
|
1319
|
+
lo = lo + Math.imul(al7, bl3) | 0;
|
|
1320
|
+
mid = mid + Math.imul(al7, bh3) | 0;
|
|
1321
|
+
mid = mid + Math.imul(ah7, bl3) | 0;
|
|
1322
|
+
hi = hi + Math.imul(ah7, bh3) | 0;
|
|
1323
|
+
lo = lo + Math.imul(al6, bl4) | 0;
|
|
1324
|
+
mid = mid + Math.imul(al6, bh4) | 0;
|
|
1325
|
+
mid = mid + Math.imul(ah6, bl4) | 0;
|
|
1326
|
+
hi = hi + Math.imul(ah6, bh4) | 0;
|
|
1327
|
+
lo = lo + Math.imul(al5, bl5) | 0;
|
|
1328
|
+
mid = mid + Math.imul(al5, bh5) | 0;
|
|
1329
|
+
mid = mid + Math.imul(ah5, bl5) | 0;
|
|
1330
|
+
hi = hi + Math.imul(ah5, bh5) | 0;
|
|
1331
|
+
lo = lo + Math.imul(al4, bl6) | 0;
|
|
1332
|
+
mid = mid + Math.imul(al4, bh6) | 0;
|
|
1333
|
+
mid = mid + Math.imul(ah4, bl6) | 0;
|
|
1334
|
+
hi = hi + Math.imul(ah4, bh6) | 0;
|
|
1335
|
+
lo = lo + Math.imul(al3, bl7) | 0;
|
|
1336
|
+
mid = mid + Math.imul(al3, bh7) | 0;
|
|
1337
|
+
mid = mid + Math.imul(ah3, bl7) | 0;
|
|
1338
|
+
hi = hi + Math.imul(ah3, bh7) | 0;
|
|
1339
|
+
lo = lo + Math.imul(al2, bl8) | 0;
|
|
1340
|
+
mid = mid + Math.imul(al2, bh8) | 0;
|
|
1341
|
+
mid = mid + Math.imul(ah2, bl8) | 0;
|
|
1342
|
+
hi = hi + Math.imul(ah2, bh8) | 0;
|
|
1343
|
+
lo = lo + Math.imul(al1, bl9) | 0;
|
|
1344
|
+
mid = mid + Math.imul(al1, bh9) | 0;
|
|
1345
|
+
mid = mid + Math.imul(ah1, bl9) | 0;
|
|
1346
|
+
hi = hi + Math.imul(ah1, bh9) | 0;
|
|
1347
|
+
var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1348
|
+
c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0;
|
|
1349
|
+
w10 &= 67108863;
|
|
1350
|
+
lo = Math.imul(al9, bl2);
|
|
1351
|
+
mid = Math.imul(al9, bh2);
|
|
1352
|
+
mid = mid + Math.imul(ah9, bl2) | 0;
|
|
1353
|
+
hi = Math.imul(ah9, bh2);
|
|
1354
|
+
lo = lo + Math.imul(al8, bl3) | 0;
|
|
1355
|
+
mid = mid + Math.imul(al8, bh3) | 0;
|
|
1356
|
+
mid = mid + Math.imul(ah8, bl3) | 0;
|
|
1357
|
+
hi = hi + Math.imul(ah8, bh3) | 0;
|
|
1358
|
+
lo = lo + Math.imul(al7, bl4) | 0;
|
|
1359
|
+
mid = mid + Math.imul(al7, bh4) | 0;
|
|
1360
|
+
mid = mid + Math.imul(ah7, bl4) | 0;
|
|
1361
|
+
hi = hi + Math.imul(ah7, bh4) | 0;
|
|
1362
|
+
lo = lo + Math.imul(al6, bl5) | 0;
|
|
1363
|
+
mid = mid + Math.imul(al6, bh5) | 0;
|
|
1364
|
+
mid = mid + Math.imul(ah6, bl5) | 0;
|
|
1365
|
+
hi = hi + Math.imul(ah6, bh5) | 0;
|
|
1366
|
+
lo = lo + Math.imul(al5, bl6) | 0;
|
|
1367
|
+
mid = mid + Math.imul(al5, bh6) | 0;
|
|
1368
|
+
mid = mid + Math.imul(ah5, bl6) | 0;
|
|
1369
|
+
hi = hi + Math.imul(ah5, bh6) | 0;
|
|
1370
|
+
lo = lo + Math.imul(al4, bl7) | 0;
|
|
1371
|
+
mid = mid + Math.imul(al4, bh7) | 0;
|
|
1372
|
+
mid = mid + Math.imul(ah4, bl7) | 0;
|
|
1373
|
+
hi = hi + Math.imul(ah4, bh7) | 0;
|
|
1374
|
+
lo = lo + Math.imul(al3, bl8) | 0;
|
|
1375
|
+
mid = mid + Math.imul(al3, bh8) | 0;
|
|
1376
|
+
mid = mid + Math.imul(ah3, bl8) | 0;
|
|
1377
|
+
hi = hi + Math.imul(ah3, bh8) | 0;
|
|
1378
|
+
lo = lo + Math.imul(al2, bl9) | 0;
|
|
1379
|
+
mid = mid + Math.imul(al2, bh9) | 0;
|
|
1380
|
+
mid = mid + Math.imul(ah2, bl9) | 0;
|
|
1381
|
+
hi = hi + Math.imul(ah2, bh9) | 0;
|
|
1382
|
+
var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1383
|
+
c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0;
|
|
1384
|
+
w11 &= 67108863;
|
|
1385
|
+
lo = Math.imul(al9, bl3);
|
|
1386
|
+
mid = Math.imul(al9, bh3);
|
|
1387
|
+
mid = mid + Math.imul(ah9, bl3) | 0;
|
|
1388
|
+
hi = Math.imul(ah9, bh3);
|
|
1389
|
+
lo = lo + Math.imul(al8, bl4) | 0;
|
|
1390
|
+
mid = mid + Math.imul(al8, bh4) | 0;
|
|
1391
|
+
mid = mid + Math.imul(ah8, bl4) | 0;
|
|
1392
|
+
hi = hi + Math.imul(ah8, bh4) | 0;
|
|
1393
|
+
lo = lo + Math.imul(al7, bl5) | 0;
|
|
1394
|
+
mid = mid + Math.imul(al7, bh5) | 0;
|
|
1395
|
+
mid = mid + Math.imul(ah7, bl5) | 0;
|
|
1396
|
+
hi = hi + Math.imul(ah7, bh5) | 0;
|
|
1397
|
+
lo = lo + Math.imul(al6, bl6) | 0;
|
|
1398
|
+
mid = mid + Math.imul(al6, bh6) | 0;
|
|
1399
|
+
mid = mid + Math.imul(ah6, bl6) | 0;
|
|
1400
|
+
hi = hi + Math.imul(ah6, bh6) | 0;
|
|
1401
|
+
lo = lo + Math.imul(al5, bl7) | 0;
|
|
1402
|
+
mid = mid + Math.imul(al5, bh7) | 0;
|
|
1403
|
+
mid = mid + Math.imul(ah5, bl7) | 0;
|
|
1404
|
+
hi = hi + Math.imul(ah5, bh7) | 0;
|
|
1405
|
+
lo = lo + Math.imul(al4, bl8) | 0;
|
|
1406
|
+
mid = mid + Math.imul(al4, bh8) | 0;
|
|
1407
|
+
mid = mid + Math.imul(ah4, bl8) | 0;
|
|
1408
|
+
hi = hi + Math.imul(ah4, bh8) | 0;
|
|
1409
|
+
lo = lo + Math.imul(al3, bl9) | 0;
|
|
1410
|
+
mid = mid + Math.imul(al3, bh9) | 0;
|
|
1411
|
+
mid = mid + Math.imul(ah3, bl9) | 0;
|
|
1412
|
+
hi = hi + Math.imul(ah3, bh9) | 0;
|
|
1413
|
+
var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1414
|
+
c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0;
|
|
1415
|
+
w12 &= 67108863;
|
|
1416
|
+
lo = Math.imul(al9, bl4);
|
|
1417
|
+
mid = Math.imul(al9, bh4);
|
|
1418
|
+
mid = mid + Math.imul(ah9, bl4) | 0;
|
|
1419
|
+
hi = Math.imul(ah9, bh4);
|
|
1420
|
+
lo = lo + Math.imul(al8, bl5) | 0;
|
|
1421
|
+
mid = mid + Math.imul(al8, bh5) | 0;
|
|
1422
|
+
mid = mid + Math.imul(ah8, bl5) | 0;
|
|
1423
|
+
hi = hi + Math.imul(ah8, bh5) | 0;
|
|
1424
|
+
lo = lo + Math.imul(al7, bl6) | 0;
|
|
1425
|
+
mid = mid + Math.imul(al7, bh6) | 0;
|
|
1426
|
+
mid = mid + Math.imul(ah7, bl6) | 0;
|
|
1427
|
+
hi = hi + Math.imul(ah7, bh6) | 0;
|
|
1428
|
+
lo = lo + Math.imul(al6, bl7) | 0;
|
|
1429
|
+
mid = mid + Math.imul(al6, bh7) | 0;
|
|
1430
|
+
mid = mid + Math.imul(ah6, bl7) | 0;
|
|
1431
|
+
hi = hi + Math.imul(ah6, bh7) | 0;
|
|
1432
|
+
lo = lo + Math.imul(al5, bl8) | 0;
|
|
1433
|
+
mid = mid + Math.imul(al5, bh8) | 0;
|
|
1434
|
+
mid = mid + Math.imul(ah5, bl8) | 0;
|
|
1435
|
+
hi = hi + Math.imul(ah5, bh8) | 0;
|
|
1436
|
+
lo = lo + Math.imul(al4, bl9) | 0;
|
|
1437
|
+
mid = mid + Math.imul(al4, bh9) | 0;
|
|
1438
|
+
mid = mid + Math.imul(ah4, bl9) | 0;
|
|
1439
|
+
hi = hi + Math.imul(ah4, bh9) | 0;
|
|
1440
|
+
var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1441
|
+
c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0;
|
|
1442
|
+
w13 &= 67108863;
|
|
1443
|
+
lo = Math.imul(al9, bl5);
|
|
1444
|
+
mid = Math.imul(al9, bh5);
|
|
1445
|
+
mid = mid + Math.imul(ah9, bl5) | 0;
|
|
1446
|
+
hi = Math.imul(ah9, bh5);
|
|
1447
|
+
lo = lo + Math.imul(al8, bl6) | 0;
|
|
1448
|
+
mid = mid + Math.imul(al8, bh6) | 0;
|
|
1449
|
+
mid = mid + Math.imul(ah8, bl6) | 0;
|
|
1450
|
+
hi = hi + Math.imul(ah8, bh6) | 0;
|
|
1451
|
+
lo = lo + Math.imul(al7, bl7) | 0;
|
|
1452
|
+
mid = mid + Math.imul(al7, bh7) | 0;
|
|
1453
|
+
mid = mid + Math.imul(ah7, bl7) | 0;
|
|
1454
|
+
hi = hi + Math.imul(ah7, bh7) | 0;
|
|
1455
|
+
lo = lo + Math.imul(al6, bl8) | 0;
|
|
1456
|
+
mid = mid + Math.imul(al6, bh8) | 0;
|
|
1457
|
+
mid = mid + Math.imul(ah6, bl8) | 0;
|
|
1458
|
+
hi = hi + Math.imul(ah6, bh8) | 0;
|
|
1459
|
+
lo = lo + Math.imul(al5, bl9) | 0;
|
|
1460
|
+
mid = mid + Math.imul(al5, bh9) | 0;
|
|
1461
|
+
mid = mid + Math.imul(ah5, bl9) | 0;
|
|
1462
|
+
hi = hi + Math.imul(ah5, bh9) | 0;
|
|
1463
|
+
var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1464
|
+
c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0;
|
|
1465
|
+
w14 &= 67108863;
|
|
1466
|
+
lo = Math.imul(al9, bl6);
|
|
1467
|
+
mid = Math.imul(al9, bh6);
|
|
1468
|
+
mid = mid + Math.imul(ah9, bl6) | 0;
|
|
1469
|
+
hi = Math.imul(ah9, bh6);
|
|
1470
|
+
lo = lo + Math.imul(al8, bl7) | 0;
|
|
1471
|
+
mid = mid + Math.imul(al8, bh7) | 0;
|
|
1472
|
+
mid = mid + Math.imul(ah8, bl7) | 0;
|
|
1473
|
+
hi = hi + Math.imul(ah8, bh7) | 0;
|
|
1474
|
+
lo = lo + Math.imul(al7, bl8) | 0;
|
|
1475
|
+
mid = mid + Math.imul(al7, bh8) | 0;
|
|
1476
|
+
mid = mid + Math.imul(ah7, bl8) | 0;
|
|
1477
|
+
hi = hi + Math.imul(ah7, bh8) | 0;
|
|
1478
|
+
lo = lo + Math.imul(al6, bl9) | 0;
|
|
1479
|
+
mid = mid + Math.imul(al6, bh9) | 0;
|
|
1480
|
+
mid = mid + Math.imul(ah6, bl9) | 0;
|
|
1481
|
+
hi = hi + Math.imul(ah6, bh9) | 0;
|
|
1482
|
+
var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1483
|
+
c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0;
|
|
1484
|
+
w15 &= 67108863;
|
|
1485
|
+
lo = Math.imul(al9, bl7);
|
|
1486
|
+
mid = Math.imul(al9, bh7);
|
|
1487
|
+
mid = mid + Math.imul(ah9, bl7) | 0;
|
|
1488
|
+
hi = Math.imul(ah9, bh7);
|
|
1489
|
+
lo = lo + Math.imul(al8, bl8) | 0;
|
|
1490
|
+
mid = mid + Math.imul(al8, bh8) | 0;
|
|
1491
|
+
mid = mid + Math.imul(ah8, bl8) | 0;
|
|
1492
|
+
hi = hi + Math.imul(ah8, bh8) | 0;
|
|
1493
|
+
lo = lo + Math.imul(al7, bl9) | 0;
|
|
1494
|
+
mid = mid + Math.imul(al7, bh9) | 0;
|
|
1495
|
+
mid = mid + Math.imul(ah7, bl9) | 0;
|
|
1496
|
+
hi = hi + Math.imul(ah7, bh9) | 0;
|
|
1497
|
+
var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1498
|
+
c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0;
|
|
1499
|
+
w16 &= 67108863;
|
|
1500
|
+
lo = Math.imul(al9, bl8);
|
|
1501
|
+
mid = Math.imul(al9, bh8);
|
|
1502
|
+
mid = mid + Math.imul(ah9, bl8) | 0;
|
|
1503
|
+
hi = Math.imul(ah9, bh8);
|
|
1504
|
+
lo = lo + Math.imul(al8, bl9) | 0;
|
|
1505
|
+
mid = mid + Math.imul(al8, bh9) | 0;
|
|
1506
|
+
mid = mid + Math.imul(ah8, bl9) | 0;
|
|
1507
|
+
hi = hi + Math.imul(ah8, bh9) | 0;
|
|
1508
|
+
var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1509
|
+
c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0;
|
|
1510
|
+
w17 &= 67108863;
|
|
1511
|
+
lo = Math.imul(al9, bl9);
|
|
1512
|
+
mid = Math.imul(al9, bh9);
|
|
1513
|
+
mid = mid + Math.imul(ah9, bl9) | 0;
|
|
1514
|
+
hi = Math.imul(ah9, bh9);
|
|
1515
|
+
var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
|
|
1516
|
+
c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0;
|
|
1517
|
+
w18 &= 67108863;
|
|
1518
|
+
o[0] = w0;
|
|
1519
|
+
o[1] = w1;
|
|
1520
|
+
o[2] = w2;
|
|
1521
|
+
o[3] = w3;
|
|
1522
|
+
o[4] = w4;
|
|
1523
|
+
o[5] = w5;
|
|
1524
|
+
o[6] = w6;
|
|
1525
|
+
o[7] = w7;
|
|
1526
|
+
o[8] = w8;
|
|
1527
|
+
o[9] = w9;
|
|
1528
|
+
o[10] = w10;
|
|
1529
|
+
o[11] = w11;
|
|
1530
|
+
o[12] = w12;
|
|
1531
|
+
o[13] = w13;
|
|
1532
|
+
o[14] = w14;
|
|
1533
|
+
o[15] = w15;
|
|
1534
|
+
o[16] = w16;
|
|
1535
|
+
o[17] = w17;
|
|
1536
|
+
o[18] = w18;
|
|
1537
|
+
if (c !== 0) {
|
|
1538
|
+
o[19] = c;
|
|
1539
|
+
out.length++;
|
|
1540
|
+
}
|
|
1541
|
+
return out;
|
|
1542
|
+
};
|
|
1543
|
+
if (!Math.imul) {
|
|
1544
|
+
comb10MulTo = smallMulTo;
|
|
1545
|
+
}
|
|
1546
|
+
function bigMulTo(self, num, out) {
|
|
1547
|
+
out.negative = num.negative ^ self.negative;
|
|
1548
|
+
out.length = self.length + num.length;
|
|
1549
|
+
var carry = 0;
|
|
1550
|
+
var hncarry = 0;
|
|
1551
|
+
for (var k = 0; k < out.length - 1; k++) {
|
|
1552
|
+
var ncarry = hncarry;
|
|
1553
|
+
hncarry = 0;
|
|
1554
|
+
var rword = carry & 67108863;
|
|
1555
|
+
var maxJ = Math.min(k, num.length - 1);
|
|
1556
|
+
for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
|
|
1557
|
+
var i = k - j;
|
|
1558
|
+
var a = self.words[i] | 0;
|
|
1559
|
+
var b = num.words[j] | 0;
|
|
1560
|
+
var r = a * b;
|
|
1561
|
+
var lo = r & 67108863;
|
|
1562
|
+
ncarry = ncarry + (r / 67108864 | 0) | 0;
|
|
1563
|
+
lo = lo + rword | 0;
|
|
1564
|
+
rword = lo & 67108863;
|
|
1565
|
+
ncarry = ncarry + (lo >>> 26) | 0;
|
|
1566
|
+
hncarry += ncarry >>> 26;
|
|
1567
|
+
ncarry &= 67108863;
|
|
1568
|
+
}
|
|
1569
|
+
out.words[k] = rword;
|
|
1570
|
+
carry = ncarry;
|
|
1571
|
+
ncarry = hncarry;
|
|
1572
|
+
}
|
|
1573
|
+
if (carry !== 0) {
|
|
1574
|
+
out.words[k] = carry;
|
|
1575
|
+
} else {
|
|
1576
|
+
out.length--;
|
|
1577
|
+
}
|
|
1578
|
+
return out._strip();
|
|
1579
|
+
}
|
|
1580
|
+
function jumboMulTo(self, num, out) {
|
|
1581
|
+
return bigMulTo(self, num, out);
|
|
1582
|
+
}
|
|
1583
|
+
BN2.prototype.mulTo = function mulTo(num, out) {
|
|
1584
|
+
var res;
|
|
1585
|
+
var len = this.length + num.length;
|
|
1586
|
+
if (this.length === 10 && num.length === 10) {
|
|
1587
|
+
res = comb10MulTo(this, num, out);
|
|
1588
|
+
} else if (len < 63) {
|
|
1589
|
+
res = smallMulTo(this, num, out);
|
|
1590
|
+
} else if (len < 1024) {
|
|
1591
|
+
res = bigMulTo(this, num, out);
|
|
1592
|
+
} else {
|
|
1593
|
+
res = jumboMulTo(this, num, out);
|
|
1594
|
+
}
|
|
1595
|
+
return res;
|
|
1596
|
+
};
|
|
1597
|
+
BN2.prototype.mul = function mul(num) {
|
|
1598
|
+
var out = new BN2(null);
|
|
1599
|
+
out.words = new Array(this.length + num.length);
|
|
1600
|
+
return this.mulTo(num, out);
|
|
1601
|
+
};
|
|
1602
|
+
BN2.prototype.mulf = function mulf(num) {
|
|
1603
|
+
var out = new BN2(null);
|
|
1604
|
+
out.words = new Array(this.length + num.length);
|
|
1605
|
+
return jumboMulTo(this, num, out);
|
|
1606
|
+
};
|
|
1607
|
+
BN2.prototype.imul = function imul(num) {
|
|
1608
|
+
return this.clone().mulTo(num, this);
|
|
1609
|
+
};
|
|
1610
|
+
BN2.prototype.imuln = function imuln(num) {
|
|
1611
|
+
var isNegNum = num < 0;
|
|
1612
|
+
if (isNegNum) num = -num;
|
|
1613
|
+
assert(typeof num === "number");
|
|
1614
|
+
assert(num < 67108864);
|
|
1615
|
+
var carry = 0;
|
|
1616
|
+
for (var i = 0; i < this.length; i++) {
|
|
1617
|
+
var w = (this.words[i] | 0) * num;
|
|
1618
|
+
var lo = (w & 67108863) + (carry & 67108863);
|
|
1619
|
+
carry >>= 26;
|
|
1620
|
+
carry += w / 67108864 | 0;
|
|
1621
|
+
carry += lo >>> 26;
|
|
1622
|
+
this.words[i] = lo & 67108863;
|
|
1623
|
+
}
|
|
1624
|
+
if (carry !== 0) {
|
|
1625
|
+
this.words[i] = carry;
|
|
1626
|
+
this.length++;
|
|
1627
|
+
}
|
|
1628
|
+
this.length = num === 0 ? 1 : this.length;
|
|
1629
|
+
return isNegNum ? this.ineg() : this;
|
|
1630
|
+
};
|
|
1631
|
+
BN2.prototype.muln = function muln(num) {
|
|
1632
|
+
return this.clone().imuln(num);
|
|
1633
|
+
};
|
|
1634
|
+
BN2.prototype.sqr = function sqr() {
|
|
1635
|
+
return this.mul(this);
|
|
1636
|
+
};
|
|
1637
|
+
BN2.prototype.isqr = function isqr() {
|
|
1638
|
+
return this.imul(this.clone());
|
|
1639
|
+
};
|
|
1640
|
+
BN2.prototype.pow = function pow(num) {
|
|
1641
|
+
var w = toBitArray(num);
|
|
1642
|
+
if (w.length === 0) return new BN2(1);
|
|
1643
|
+
var res = this;
|
|
1644
|
+
for (var i = 0; i < w.length; i++, res = res.sqr()) {
|
|
1645
|
+
if (w[i] !== 0) break;
|
|
1646
|
+
}
|
|
1647
|
+
if (++i < w.length) {
|
|
1648
|
+
for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {
|
|
1649
|
+
if (w[i] === 0) continue;
|
|
1650
|
+
res = res.mul(q);
|
|
1651
|
+
}
|
|
1652
|
+
}
|
|
1653
|
+
return res;
|
|
1654
|
+
};
|
|
1655
|
+
BN2.prototype.iushln = function iushln(bits) {
|
|
1656
|
+
assert(typeof bits === "number" && bits >= 0);
|
|
1657
|
+
var r = bits % 26;
|
|
1658
|
+
var s = (bits - r) / 26;
|
|
1659
|
+
var carryMask = 67108863 >>> 26 - r << 26 - r;
|
|
1660
|
+
var i;
|
|
1661
|
+
if (r !== 0) {
|
|
1662
|
+
var carry = 0;
|
|
1663
|
+
for (i = 0; i < this.length; i++) {
|
|
1664
|
+
var newCarry = this.words[i] & carryMask;
|
|
1665
|
+
var c = (this.words[i] | 0) - newCarry << r;
|
|
1666
|
+
this.words[i] = c | carry;
|
|
1667
|
+
carry = newCarry >>> 26 - r;
|
|
1668
|
+
}
|
|
1669
|
+
if (carry) {
|
|
1670
|
+
this.words[i] = carry;
|
|
1671
|
+
this.length++;
|
|
1672
|
+
}
|
|
1673
|
+
}
|
|
1674
|
+
if (s !== 0) {
|
|
1675
|
+
for (i = this.length - 1; i >= 0; i--) {
|
|
1676
|
+
this.words[i + s] = this.words[i];
|
|
1677
|
+
}
|
|
1678
|
+
for (i = 0; i < s; i++) {
|
|
1679
|
+
this.words[i] = 0;
|
|
1680
|
+
}
|
|
1681
|
+
this.length += s;
|
|
1682
|
+
}
|
|
1683
|
+
return this._strip();
|
|
1684
|
+
};
|
|
1685
|
+
BN2.prototype.ishln = function ishln(bits) {
|
|
1686
|
+
assert(this.negative === 0);
|
|
1687
|
+
return this.iushln(bits);
|
|
1688
|
+
};
|
|
1689
|
+
BN2.prototype.iushrn = function iushrn(bits, hint, extended) {
|
|
1690
|
+
assert(typeof bits === "number" && bits >= 0);
|
|
1691
|
+
var h;
|
|
1692
|
+
if (hint) {
|
|
1693
|
+
h = (hint - hint % 26) / 26;
|
|
1694
|
+
} else {
|
|
1695
|
+
h = 0;
|
|
1696
|
+
}
|
|
1697
|
+
var r = bits % 26;
|
|
1698
|
+
var s = Math.min((bits - r) / 26, this.length);
|
|
1699
|
+
var mask = 67108863 ^ 67108863 >>> r << r;
|
|
1700
|
+
var maskedWords = extended;
|
|
1701
|
+
h -= s;
|
|
1702
|
+
h = Math.max(0, h);
|
|
1703
|
+
if (maskedWords) {
|
|
1704
|
+
for (var i = 0; i < s; i++) {
|
|
1705
|
+
maskedWords.words[i] = this.words[i];
|
|
1706
|
+
}
|
|
1707
|
+
maskedWords.length = s;
|
|
1708
|
+
}
|
|
1709
|
+
if (s === 0) ; else if (this.length > s) {
|
|
1710
|
+
this.length -= s;
|
|
1711
|
+
for (i = 0; i < this.length; i++) {
|
|
1712
|
+
this.words[i] = this.words[i + s];
|
|
1713
|
+
}
|
|
1714
|
+
} else {
|
|
1715
|
+
this.words[0] = 0;
|
|
1716
|
+
this.length = 1;
|
|
1717
|
+
}
|
|
1718
|
+
var carry = 0;
|
|
1719
|
+
for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {
|
|
1720
|
+
var word = this.words[i] | 0;
|
|
1721
|
+
this.words[i] = carry << 26 - r | word >>> r;
|
|
1722
|
+
carry = word & mask;
|
|
1723
|
+
}
|
|
1724
|
+
if (maskedWords && carry !== 0) {
|
|
1725
|
+
maskedWords.words[maskedWords.length++] = carry;
|
|
1726
|
+
}
|
|
1727
|
+
if (this.length === 0) {
|
|
1728
|
+
this.words[0] = 0;
|
|
1729
|
+
this.length = 1;
|
|
1730
|
+
}
|
|
1731
|
+
return this._strip();
|
|
1732
|
+
};
|
|
1733
|
+
BN2.prototype.ishrn = function ishrn(bits, hint, extended) {
|
|
1734
|
+
assert(this.negative === 0);
|
|
1735
|
+
return this.iushrn(bits, hint, extended);
|
|
1736
|
+
};
|
|
1737
|
+
BN2.prototype.shln = function shln(bits) {
|
|
1738
|
+
return this.clone().ishln(bits);
|
|
1739
|
+
};
|
|
1740
|
+
BN2.prototype.ushln = function ushln(bits) {
|
|
1741
|
+
return this.clone().iushln(bits);
|
|
1742
|
+
};
|
|
1743
|
+
BN2.prototype.shrn = function shrn(bits) {
|
|
1744
|
+
return this.clone().ishrn(bits);
|
|
1745
|
+
};
|
|
1746
|
+
BN2.prototype.ushrn = function ushrn(bits) {
|
|
1747
|
+
return this.clone().iushrn(bits);
|
|
1748
|
+
};
|
|
1749
|
+
BN2.prototype.testn = function testn(bit) {
|
|
1750
|
+
assert(typeof bit === "number" && bit >= 0);
|
|
1751
|
+
var r = bit % 26;
|
|
1752
|
+
var s = (bit - r) / 26;
|
|
1753
|
+
var q = 1 << r;
|
|
1754
|
+
if (this.length <= s) return false;
|
|
1755
|
+
var w = this.words[s];
|
|
1756
|
+
return !!(w & q);
|
|
1757
|
+
};
|
|
1758
|
+
BN2.prototype.imaskn = function imaskn(bits) {
|
|
1759
|
+
assert(typeof bits === "number" && bits >= 0);
|
|
1760
|
+
var r = bits % 26;
|
|
1761
|
+
var s = (bits - r) / 26;
|
|
1762
|
+
assert(this.negative === 0, "imaskn works only with positive numbers");
|
|
1763
|
+
if (this.length <= s) {
|
|
1764
|
+
return this;
|
|
1765
|
+
}
|
|
1766
|
+
if (r !== 0) {
|
|
1767
|
+
s++;
|
|
1768
|
+
}
|
|
1769
|
+
this.length = Math.min(s, this.length);
|
|
1770
|
+
if (r !== 0) {
|
|
1771
|
+
var mask = 67108863 ^ 67108863 >>> r << r;
|
|
1772
|
+
this.words[this.length - 1] &= mask;
|
|
1773
|
+
}
|
|
1774
|
+
return this._strip();
|
|
1775
|
+
};
|
|
1776
|
+
BN2.prototype.maskn = function maskn(bits) {
|
|
1777
|
+
return this.clone().imaskn(bits);
|
|
1778
|
+
};
|
|
1779
|
+
BN2.prototype.iaddn = function iaddn(num) {
|
|
1780
|
+
assert(typeof num === "number");
|
|
1781
|
+
assert(num < 67108864);
|
|
1782
|
+
if (num < 0) return this.isubn(-num);
|
|
1783
|
+
if (this.negative !== 0) {
|
|
1784
|
+
if (this.length === 1 && (this.words[0] | 0) <= num) {
|
|
1785
|
+
this.words[0] = num - (this.words[0] | 0);
|
|
1786
|
+
this.negative = 0;
|
|
1787
|
+
return this;
|
|
1788
|
+
}
|
|
1789
|
+
this.negative = 0;
|
|
1790
|
+
this.isubn(num);
|
|
1791
|
+
this.negative = 1;
|
|
1792
|
+
return this;
|
|
1793
|
+
}
|
|
1794
|
+
return this._iaddn(num);
|
|
1795
|
+
};
|
|
1796
|
+
BN2.prototype._iaddn = function _iaddn(num) {
|
|
1797
|
+
this.words[0] += num;
|
|
1798
|
+
for (var i = 0; i < this.length && this.words[i] >= 67108864; i++) {
|
|
1799
|
+
this.words[i] -= 67108864;
|
|
1800
|
+
if (i === this.length - 1) {
|
|
1801
|
+
this.words[i + 1] = 1;
|
|
1802
|
+
} else {
|
|
1803
|
+
this.words[i + 1]++;
|
|
1804
|
+
}
|
|
1805
|
+
}
|
|
1806
|
+
this.length = Math.max(this.length, i + 1);
|
|
1807
|
+
return this;
|
|
1808
|
+
};
|
|
1809
|
+
BN2.prototype.isubn = function isubn(num) {
|
|
1810
|
+
assert(typeof num === "number");
|
|
1811
|
+
assert(num < 67108864);
|
|
1812
|
+
if (num < 0) return this.iaddn(-num);
|
|
1813
|
+
if (this.negative !== 0) {
|
|
1814
|
+
this.negative = 0;
|
|
1815
|
+
this.iaddn(num);
|
|
1816
|
+
this.negative = 1;
|
|
1817
|
+
return this;
|
|
1818
|
+
}
|
|
1819
|
+
this.words[0] -= num;
|
|
1820
|
+
if (this.length === 1 && this.words[0] < 0) {
|
|
1821
|
+
this.words[0] = -this.words[0];
|
|
1822
|
+
this.negative = 1;
|
|
1823
|
+
} else {
|
|
1824
|
+
for (var i = 0; i < this.length && this.words[i] < 0; i++) {
|
|
1825
|
+
this.words[i] += 67108864;
|
|
1826
|
+
this.words[i + 1] -= 1;
|
|
1827
|
+
}
|
|
1828
|
+
}
|
|
1829
|
+
return this._strip();
|
|
1830
|
+
};
|
|
1831
|
+
BN2.prototype.addn = function addn(num) {
|
|
1832
|
+
return this.clone().iaddn(num);
|
|
1833
|
+
};
|
|
1834
|
+
BN2.prototype.subn = function subn(num) {
|
|
1835
|
+
return this.clone().isubn(num);
|
|
1836
|
+
};
|
|
1837
|
+
BN2.prototype.iabs = function iabs() {
|
|
1838
|
+
this.negative = 0;
|
|
1839
|
+
return this;
|
|
1840
|
+
};
|
|
1841
|
+
BN2.prototype.abs = function abs() {
|
|
1842
|
+
return this.clone().iabs();
|
|
1843
|
+
};
|
|
1844
|
+
BN2.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) {
|
|
1845
|
+
var len = num.length + shift;
|
|
1846
|
+
var i;
|
|
1847
|
+
this._expand(len);
|
|
1848
|
+
var w;
|
|
1849
|
+
var carry = 0;
|
|
1850
|
+
for (i = 0; i < num.length; i++) {
|
|
1851
|
+
w = (this.words[i + shift] | 0) + carry;
|
|
1852
|
+
var right = (num.words[i] | 0) * mul;
|
|
1853
|
+
w -= right & 67108863;
|
|
1854
|
+
carry = (w >> 26) - (right / 67108864 | 0);
|
|
1855
|
+
this.words[i + shift] = w & 67108863;
|
|
1856
|
+
}
|
|
1857
|
+
for (; i < this.length - shift; i++) {
|
|
1858
|
+
w = (this.words[i + shift] | 0) + carry;
|
|
1859
|
+
carry = w >> 26;
|
|
1860
|
+
this.words[i + shift] = w & 67108863;
|
|
1861
|
+
}
|
|
1862
|
+
if (carry === 0) return this._strip();
|
|
1863
|
+
assert(carry === -1);
|
|
1864
|
+
carry = 0;
|
|
1865
|
+
for (i = 0; i < this.length; i++) {
|
|
1866
|
+
w = -(this.words[i] | 0) + carry;
|
|
1867
|
+
carry = w >> 26;
|
|
1868
|
+
this.words[i] = w & 67108863;
|
|
1869
|
+
}
|
|
1870
|
+
this.negative = 1;
|
|
1871
|
+
return this._strip();
|
|
1872
|
+
};
|
|
1873
|
+
BN2.prototype._wordDiv = function _wordDiv(num, mode) {
|
|
1874
|
+
var shift = this.length - num.length;
|
|
1875
|
+
var a = this.clone();
|
|
1876
|
+
var b = num;
|
|
1877
|
+
var bhi = b.words[b.length - 1] | 0;
|
|
1878
|
+
var bhiBits = this._countBits(bhi);
|
|
1879
|
+
shift = 26 - bhiBits;
|
|
1880
|
+
if (shift !== 0) {
|
|
1881
|
+
b = b.ushln(shift);
|
|
1882
|
+
a.iushln(shift);
|
|
1883
|
+
bhi = b.words[b.length - 1] | 0;
|
|
1884
|
+
}
|
|
1885
|
+
var m = a.length - b.length;
|
|
1886
|
+
var q;
|
|
1887
|
+
if (mode !== "mod") {
|
|
1888
|
+
q = new BN2(null);
|
|
1889
|
+
q.length = m + 1;
|
|
1890
|
+
q.words = new Array(q.length);
|
|
1891
|
+
for (var i = 0; i < q.length; i++) {
|
|
1892
|
+
q.words[i] = 0;
|
|
1893
|
+
}
|
|
1894
|
+
}
|
|
1895
|
+
var diff = a.clone()._ishlnsubmul(b, 1, m);
|
|
1896
|
+
if (diff.negative === 0) {
|
|
1897
|
+
a = diff;
|
|
1898
|
+
if (q) {
|
|
1899
|
+
q.words[m] = 1;
|
|
1900
|
+
}
|
|
1901
|
+
}
|
|
1902
|
+
for (var j = m - 1; j >= 0; j--) {
|
|
1903
|
+
var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0);
|
|
1904
|
+
qj = Math.min(qj / bhi | 0, 67108863);
|
|
1905
|
+
a._ishlnsubmul(b, qj, j);
|
|
1906
|
+
while (a.negative !== 0) {
|
|
1907
|
+
qj--;
|
|
1908
|
+
a.negative = 0;
|
|
1909
|
+
a._ishlnsubmul(b, 1, j);
|
|
1910
|
+
if (!a.isZero()) {
|
|
1911
|
+
a.negative ^= 1;
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
if (q) {
|
|
1915
|
+
q.words[j] = qj;
|
|
1916
|
+
}
|
|
1917
|
+
}
|
|
1918
|
+
if (q) {
|
|
1919
|
+
q._strip();
|
|
1920
|
+
}
|
|
1921
|
+
a._strip();
|
|
1922
|
+
if (mode !== "div" && shift !== 0) {
|
|
1923
|
+
a.iushrn(shift);
|
|
1924
|
+
}
|
|
1925
|
+
return {
|
|
1926
|
+
div: q || null,
|
|
1927
|
+
mod: a
|
|
1928
|
+
};
|
|
1929
|
+
};
|
|
1930
|
+
BN2.prototype.divmod = function divmod(num, mode, positive) {
|
|
1931
|
+
assert(!num.isZero());
|
|
1932
|
+
if (this.isZero()) {
|
|
1933
|
+
return {
|
|
1934
|
+
div: new BN2(0),
|
|
1935
|
+
mod: new BN2(0)
|
|
1936
|
+
};
|
|
1937
|
+
}
|
|
1938
|
+
var div, mod, res;
|
|
1939
|
+
if (this.negative !== 0 && num.negative === 0) {
|
|
1940
|
+
res = this.neg().divmod(num, mode);
|
|
1941
|
+
if (mode !== "mod") {
|
|
1942
|
+
div = res.div.neg();
|
|
1943
|
+
}
|
|
1944
|
+
if (mode !== "div") {
|
|
1945
|
+
mod = res.mod.neg();
|
|
1946
|
+
if (positive && mod.negative !== 0) {
|
|
1947
|
+
mod.iadd(num);
|
|
1948
|
+
}
|
|
1949
|
+
}
|
|
1950
|
+
return {
|
|
1951
|
+
div,
|
|
1952
|
+
mod
|
|
1953
|
+
};
|
|
1954
|
+
}
|
|
1955
|
+
if (this.negative === 0 && num.negative !== 0) {
|
|
1956
|
+
res = this.divmod(num.neg(), mode);
|
|
1957
|
+
if (mode !== "mod") {
|
|
1958
|
+
div = res.div.neg();
|
|
1959
|
+
}
|
|
1960
|
+
return {
|
|
1961
|
+
div,
|
|
1962
|
+
mod: res.mod
|
|
1963
|
+
};
|
|
1964
|
+
}
|
|
1965
|
+
if ((this.negative & num.negative) !== 0) {
|
|
1966
|
+
res = this.neg().divmod(num.neg(), mode);
|
|
1967
|
+
if (mode !== "div") {
|
|
1968
|
+
mod = res.mod.neg();
|
|
1969
|
+
if (positive && mod.negative !== 0) {
|
|
1970
|
+
mod.isub(num);
|
|
1971
|
+
}
|
|
1972
|
+
}
|
|
1973
|
+
return {
|
|
1974
|
+
div: res.div,
|
|
1975
|
+
mod
|
|
1976
|
+
};
|
|
1977
|
+
}
|
|
1978
|
+
if (num.length > this.length || this.cmp(num) < 0) {
|
|
1979
|
+
return {
|
|
1980
|
+
div: new BN2(0),
|
|
1981
|
+
mod: this
|
|
1982
|
+
};
|
|
1983
|
+
}
|
|
1984
|
+
if (num.length === 1) {
|
|
1985
|
+
if (mode === "div") {
|
|
1986
|
+
return {
|
|
1987
|
+
div: this.divn(num.words[0]),
|
|
1988
|
+
mod: null
|
|
1989
|
+
};
|
|
1990
|
+
}
|
|
1991
|
+
if (mode === "mod") {
|
|
1992
|
+
return {
|
|
1993
|
+
div: null,
|
|
1994
|
+
mod: new BN2(this.modrn(num.words[0]))
|
|
1995
|
+
};
|
|
1996
|
+
}
|
|
1997
|
+
return {
|
|
1998
|
+
div: this.divn(num.words[0]),
|
|
1999
|
+
mod: new BN2(this.modrn(num.words[0]))
|
|
2000
|
+
};
|
|
2001
|
+
}
|
|
2002
|
+
return this._wordDiv(num, mode);
|
|
2003
|
+
};
|
|
2004
|
+
BN2.prototype.div = function div(num) {
|
|
2005
|
+
return this.divmod(num, "div", false).div;
|
|
2006
|
+
};
|
|
2007
|
+
BN2.prototype.mod = function mod(num) {
|
|
2008
|
+
return this.divmod(num, "mod", false).mod;
|
|
2009
|
+
};
|
|
2010
|
+
BN2.prototype.umod = function umod(num) {
|
|
2011
|
+
return this.divmod(num, "mod", true).mod;
|
|
2012
|
+
};
|
|
2013
|
+
BN2.prototype.divRound = function divRound(num) {
|
|
2014
|
+
var dm = this.divmod(num);
|
|
2015
|
+
if (dm.mod.isZero()) return dm.div;
|
|
2016
|
+
var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
|
|
2017
|
+
var half = num.ushrn(1);
|
|
2018
|
+
var r2 = num.andln(1);
|
|
2019
|
+
var cmp = mod.cmp(half);
|
|
2020
|
+
if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;
|
|
2021
|
+
return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
|
|
2022
|
+
};
|
|
2023
|
+
BN2.prototype.modrn = function modrn(num) {
|
|
2024
|
+
var isNegNum = num < 0;
|
|
2025
|
+
if (isNegNum) num = -num;
|
|
2026
|
+
assert(num <= 67108863);
|
|
2027
|
+
var p = (1 << 26) % num;
|
|
2028
|
+
var acc = 0;
|
|
2029
|
+
for (var i = this.length - 1; i >= 0; i--) {
|
|
2030
|
+
acc = (p * acc + (this.words[i] | 0)) % num;
|
|
2031
|
+
}
|
|
2032
|
+
return isNegNum ? -acc : acc;
|
|
2033
|
+
};
|
|
2034
|
+
BN2.prototype.modn = function modn(num) {
|
|
2035
|
+
return this.modrn(num);
|
|
2036
|
+
};
|
|
2037
|
+
BN2.prototype.idivn = function idivn(num) {
|
|
2038
|
+
var isNegNum = num < 0;
|
|
2039
|
+
if (isNegNum) num = -num;
|
|
2040
|
+
assert(num <= 67108863);
|
|
2041
|
+
var carry = 0;
|
|
2042
|
+
for (var i = this.length - 1; i >= 0; i--) {
|
|
2043
|
+
var w = (this.words[i] | 0) + carry * 67108864;
|
|
2044
|
+
this.words[i] = w / num | 0;
|
|
2045
|
+
carry = w % num;
|
|
2046
|
+
}
|
|
2047
|
+
this._strip();
|
|
2048
|
+
return isNegNum ? this.ineg() : this;
|
|
2049
|
+
};
|
|
2050
|
+
BN2.prototype.divn = function divn(num) {
|
|
2051
|
+
return this.clone().idivn(num);
|
|
2052
|
+
};
|
|
2053
|
+
BN2.prototype.egcd = function egcd(p) {
|
|
2054
|
+
assert(p.negative === 0);
|
|
2055
|
+
assert(!p.isZero());
|
|
2056
|
+
var x = this;
|
|
2057
|
+
var y = p.clone();
|
|
2058
|
+
if (x.negative !== 0) {
|
|
2059
|
+
x = x.umod(p);
|
|
2060
|
+
} else {
|
|
2061
|
+
x = x.clone();
|
|
2062
|
+
}
|
|
2063
|
+
var A = new BN2(1);
|
|
2064
|
+
var B = new BN2(0);
|
|
2065
|
+
var C = new BN2(0);
|
|
2066
|
+
var D = new BN2(1);
|
|
2067
|
+
var g = 0;
|
|
2068
|
+
while (x.isEven() && y.isEven()) {
|
|
2069
|
+
x.iushrn(1);
|
|
2070
|
+
y.iushrn(1);
|
|
2071
|
+
++g;
|
|
2072
|
+
}
|
|
2073
|
+
var yp = y.clone();
|
|
2074
|
+
var xp = x.clone();
|
|
2075
|
+
while (!x.isZero()) {
|
|
2076
|
+
for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ;
|
|
2077
|
+
if (i > 0) {
|
|
2078
|
+
x.iushrn(i);
|
|
2079
|
+
while (i-- > 0) {
|
|
2080
|
+
if (A.isOdd() || B.isOdd()) {
|
|
2081
|
+
A.iadd(yp);
|
|
2082
|
+
B.isub(xp);
|
|
2083
|
+
}
|
|
2084
|
+
A.iushrn(1);
|
|
2085
|
+
B.iushrn(1);
|
|
2086
|
+
}
|
|
2087
|
+
}
|
|
2088
|
+
for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ;
|
|
2089
|
+
if (j > 0) {
|
|
2090
|
+
y.iushrn(j);
|
|
2091
|
+
while (j-- > 0) {
|
|
2092
|
+
if (C.isOdd() || D.isOdd()) {
|
|
2093
|
+
C.iadd(yp);
|
|
2094
|
+
D.isub(xp);
|
|
2095
|
+
}
|
|
2096
|
+
C.iushrn(1);
|
|
2097
|
+
D.iushrn(1);
|
|
2098
|
+
}
|
|
2099
|
+
}
|
|
2100
|
+
if (x.cmp(y) >= 0) {
|
|
2101
|
+
x.isub(y);
|
|
2102
|
+
A.isub(C);
|
|
2103
|
+
B.isub(D);
|
|
2104
|
+
} else {
|
|
2105
|
+
y.isub(x);
|
|
2106
|
+
C.isub(A);
|
|
2107
|
+
D.isub(B);
|
|
2108
|
+
}
|
|
2109
|
+
}
|
|
2110
|
+
return {
|
|
2111
|
+
a: C,
|
|
2112
|
+
b: D,
|
|
2113
|
+
gcd: y.iushln(g)
|
|
2114
|
+
};
|
|
2115
|
+
};
|
|
2116
|
+
BN2.prototype._invmp = function _invmp(p) {
|
|
2117
|
+
assert(p.negative === 0);
|
|
2118
|
+
assert(!p.isZero());
|
|
2119
|
+
var a = this;
|
|
2120
|
+
var b = p.clone();
|
|
2121
|
+
if (a.negative !== 0) {
|
|
2122
|
+
a = a.umod(p);
|
|
2123
|
+
} else {
|
|
2124
|
+
a = a.clone();
|
|
2125
|
+
}
|
|
2126
|
+
var x1 = new BN2(1);
|
|
2127
|
+
var x2 = new BN2(0);
|
|
2128
|
+
var delta = b.clone();
|
|
2129
|
+
while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
|
|
2130
|
+
for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ;
|
|
2131
|
+
if (i > 0) {
|
|
2132
|
+
a.iushrn(i);
|
|
2133
|
+
while (i-- > 0) {
|
|
2134
|
+
if (x1.isOdd()) {
|
|
2135
|
+
x1.iadd(delta);
|
|
2136
|
+
}
|
|
2137
|
+
x1.iushrn(1);
|
|
2138
|
+
}
|
|
2139
|
+
}
|
|
2140
|
+
for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ;
|
|
2141
|
+
if (j > 0) {
|
|
2142
|
+
b.iushrn(j);
|
|
2143
|
+
while (j-- > 0) {
|
|
2144
|
+
if (x2.isOdd()) {
|
|
2145
|
+
x2.iadd(delta);
|
|
2146
|
+
}
|
|
2147
|
+
x2.iushrn(1);
|
|
2148
|
+
}
|
|
2149
|
+
}
|
|
2150
|
+
if (a.cmp(b) >= 0) {
|
|
2151
|
+
a.isub(b);
|
|
2152
|
+
x1.isub(x2);
|
|
2153
|
+
} else {
|
|
2154
|
+
b.isub(a);
|
|
2155
|
+
x2.isub(x1);
|
|
2156
|
+
}
|
|
2157
|
+
}
|
|
2158
|
+
var res;
|
|
2159
|
+
if (a.cmpn(1) === 0) {
|
|
2160
|
+
res = x1;
|
|
2161
|
+
} else {
|
|
2162
|
+
res = x2;
|
|
2163
|
+
}
|
|
2164
|
+
if (res.cmpn(0) < 0) {
|
|
2165
|
+
res.iadd(p);
|
|
2166
|
+
}
|
|
2167
|
+
return res;
|
|
2168
|
+
};
|
|
2169
|
+
BN2.prototype.gcd = function gcd(num) {
|
|
2170
|
+
if (this.isZero()) return num.abs();
|
|
2171
|
+
if (num.isZero()) return this.abs();
|
|
2172
|
+
var a = this.clone();
|
|
2173
|
+
var b = num.clone();
|
|
2174
|
+
a.negative = 0;
|
|
2175
|
+
b.negative = 0;
|
|
2176
|
+
for (var shift = 0; a.isEven() && b.isEven(); shift++) {
|
|
2177
|
+
a.iushrn(1);
|
|
2178
|
+
b.iushrn(1);
|
|
2179
|
+
}
|
|
2180
|
+
do {
|
|
2181
|
+
while (a.isEven()) {
|
|
2182
|
+
a.iushrn(1);
|
|
2183
|
+
}
|
|
2184
|
+
while (b.isEven()) {
|
|
2185
|
+
b.iushrn(1);
|
|
2186
|
+
}
|
|
2187
|
+
var r = a.cmp(b);
|
|
2188
|
+
if (r < 0) {
|
|
2189
|
+
var t = a;
|
|
2190
|
+
a = b;
|
|
2191
|
+
b = t;
|
|
2192
|
+
} else if (r === 0 || b.cmpn(1) === 0) {
|
|
2193
|
+
break;
|
|
2194
|
+
}
|
|
2195
|
+
a.isub(b);
|
|
2196
|
+
} while (true);
|
|
2197
|
+
return b.iushln(shift);
|
|
2198
|
+
};
|
|
2199
|
+
BN2.prototype.invm = function invm(num) {
|
|
2200
|
+
return this.egcd(num).a.umod(num);
|
|
2201
|
+
};
|
|
2202
|
+
BN2.prototype.isEven = function isEven() {
|
|
2203
|
+
return (this.words[0] & 1) === 0;
|
|
2204
|
+
};
|
|
2205
|
+
BN2.prototype.isOdd = function isOdd() {
|
|
2206
|
+
return (this.words[0] & 1) === 1;
|
|
2207
|
+
};
|
|
2208
|
+
BN2.prototype.andln = function andln(num) {
|
|
2209
|
+
return this.words[0] & num;
|
|
2210
|
+
};
|
|
2211
|
+
BN2.prototype.bincn = function bincn(bit) {
|
|
2212
|
+
assert(typeof bit === "number");
|
|
2213
|
+
var r = bit % 26;
|
|
2214
|
+
var s = (bit - r) / 26;
|
|
2215
|
+
var q = 1 << r;
|
|
2216
|
+
if (this.length <= s) {
|
|
2217
|
+
this._expand(s + 1);
|
|
2218
|
+
this.words[s] |= q;
|
|
2219
|
+
return this;
|
|
2220
|
+
}
|
|
2221
|
+
var carry = q;
|
|
2222
|
+
for (var i = s; carry !== 0 && i < this.length; i++) {
|
|
2223
|
+
var w = this.words[i] | 0;
|
|
2224
|
+
w += carry;
|
|
2225
|
+
carry = w >>> 26;
|
|
2226
|
+
w &= 67108863;
|
|
2227
|
+
this.words[i] = w;
|
|
2228
|
+
}
|
|
2229
|
+
if (carry !== 0) {
|
|
2230
|
+
this.words[i] = carry;
|
|
2231
|
+
this.length++;
|
|
2232
|
+
}
|
|
2233
|
+
return this;
|
|
2234
|
+
};
|
|
2235
|
+
BN2.prototype.isZero = function isZero() {
|
|
2236
|
+
return this.length === 1 && this.words[0] === 0;
|
|
2237
|
+
};
|
|
2238
|
+
BN2.prototype.cmpn = function cmpn(num) {
|
|
2239
|
+
var negative = num < 0;
|
|
2240
|
+
if (this.negative !== 0 && !negative) return -1;
|
|
2241
|
+
if (this.negative === 0 && negative) return 1;
|
|
2242
|
+
this._strip();
|
|
2243
|
+
var res;
|
|
2244
|
+
if (this.length > 1) {
|
|
2245
|
+
res = 1;
|
|
2246
|
+
} else {
|
|
2247
|
+
if (negative) {
|
|
2248
|
+
num = -num;
|
|
2249
|
+
}
|
|
2250
|
+
assert(num <= 67108863, "Number is too big");
|
|
2251
|
+
var w = this.words[0] | 0;
|
|
2252
|
+
res = w === num ? 0 : w < num ? -1 : 1;
|
|
2253
|
+
}
|
|
2254
|
+
if (this.negative !== 0) return -res | 0;
|
|
2255
|
+
return res;
|
|
2256
|
+
};
|
|
2257
|
+
BN2.prototype.cmp = function cmp(num) {
|
|
2258
|
+
if (this.negative !== 0 && num.negative === 0) return -1;
|
|
2259
|
+
if (this.negative === 0 && num.negative !== 0) return 1;
|
|
2260
|
+
var res = this.ucmp(num);
|
|
2261
|
+
if (this.negative !== 0) return -res | 0;
|
|
2262
|
+
return res;
|
|
2263
|
+
};
|
|
2264
|
+
BN2.prototype.ucmp = function ucmp(num) {
|
|
2265
|
+
if (this.length > num.length) return 1;
|
|
2266
|
+
if (this.length < num.length) return -1;
|
|
2267
|
+
var res = 0;
|
|
2268
|
+
for (var i = this.length - 1; i >= 0; i--) {
|
|
2269
|
+
var a = this.words[i] | 0;
|
|
2270
|
+
var b = num.words[i] | 0;
|
|
2271
|
+
if (a === b) continue;
|
|
2272
|
+
if (a < b) {
|
|
2273
|
+
res = -1;
|
|
2274
|
+
} else if (a > b) {
|
|
2275
|
+
res = 1;
|
|
2276
|
+
}
|
|
2277
|
+
break;
|
|
2278
|
+
}
|
|
2279
|
+
return res;
|
|
2280
|
+
};
|
|
2281
|
+
BN2.prototype.gtn = function gtn(num) {
|
|
2282
|
+
return this.cmpn(num) === 1;
|
|
2283
|
+
};
|
|
2284
|
+
BN2.prototype.gt = function gt(num) {
|
|
2285
|
+
return this.cmp(num) === 1;
|
|
2286
|
+
};
|
|
2287
|
+
BN2.prototype.gten = function gten(num) {
|
|
2288
|
+
return this.cmpn(num) >= 0;
|
|
2289
|
+
};
|
|
2290
|
+
BN2.prototype.gte = function gte(num) {
|
|
2291
|
+
return this.cmp(num) >= 0;
|
|
2292
|
+
};
|
|
2293
|
+
BN2.prototype.ltn = function ltn(num) {
|
|
2294
|
+
return this.cmpn(num) === -1;
|
|
2295
|
+
};
|
|
2296
|
+
BN2.prototype.lt = function lt(num) {
|
|
2297
|
+
return this.cmp(num) === -1;
|
|
2298
|
+
};
|
|
2299
|
+
BN2.prototype.lten = function lten(num) {
|
|
2300
|
+
return this.cmpn(num) <= 0;
|
|
2301
|
+
};
|
|
2302
|
+
BN2.prototype.lte = function lte(num) {
|
|
2303
|
+
return this.cmp(num) <= 0;
|
|
2304
|
+
};
|
|
2305
|
+
BN2.prototype.eqn = function eqn(num) {
|
|
2306
|
+
return this.cmpn(num) === 0;
|
|
2307
|
+
};
|
|
2308
|
+
BN2.prototype.eq = function eq(num) {
|
|
2309
|
+
return this.cmp(num) === 0;
|
|
2310
|
+
};
|
|
2311
|
+
BN2.red = function red(num) {
|
|
2312
|
+
return new Red(num);
|
|
2313
|
+
};
|
|
2314
|
+
BN2.prototype.toRed = function toRed(ctx) {
|
|
2315
|
+
assert(!this.red, "Already a number in reduction context");
|
|
2316
|
+
assert(this.negative === 0, "red works only with positives");
|
|
2317
|
+
return ctx.convertTo(this)._forceRed(ctx);
|
|
2318
|
+
};
|
|
2319
|
+
BN2.prototype.fromRed = function fromRed() {
|
|
2320
|
+
assert(this.red, "fromRed works only with numbers in reduction context");
|
|
2321
|
+
return this.red.convertFrom(this);
|
|
2322
|
+
};
|
|
2323
|
+
BN2.prototype._forceRed = function _forceRed(ctx) {
|
|
2324
|
+
this.red = ctx;
|
|
2325
|
+
return this;
|
|
2326
|
+
};
|
|
2327
|
+
BN2.prototype.forceRed = function forceRed(ctx) {
|
|
2328
|
+
assert(!this.red, "Already a number in reduction context");
|
|
2329
|
+
return this._forceRed(ctx);
|
|
2330
|
+
};
|
|
2331
|
+
BN2.prototype.redAdd = function redAdd(num) {
|
|
2332
|
+
assert(this.red, "redAdd works only with red numbers");
|
|
2333
|
+
return this.red.add(this, num);
|
|
2334
|
+
};
|
|
2335
|
+
BN2.prototype.redIAdd = function redIAdd(num) {
|
|
2336
|
+
assert(this.red, "redIAdd works only with red numbers");
|
|
2337
|
+
return this.red.iadd(this, num);
|
|
2338
|
+
};
|
|
2339
|
+
BN2.prototype.redSub = function redSub(num) {
|
|
2340
|
+
assert(this.red, "redSub works only with red numbers");
|
|
2341
|
+
return this.red.sub(this, num);
|
|
2342
|
+
};
|
|
2343
|
+
BN2.prototype.redISub = function redISub(num) {
|
|
2344
|
+
assert(this.red, "redISub works only with red numbers");
|
|
2345
|
+
return this.red.isub(this, num);
|
|
2346
|
+
};
|
|
2347
|
+
BN2.prototype.redShl = function redShl(num) {
|
|
2348
|
+
assert(this.red, "redShl works only with red numbers");
|
|
2349
|
+
return this.red.shl(this, num);
|
|
2350
|
+
};
|
|
2351
|
+
BN2.prototype.redMul = function redMul(num) {
|
|
2352
|
+
assert(this.red, "redMul works only with red numbers");
|
|
2353
|
+
this.red._verify2(this, num);
|
|
2354
|
+
return this.red.mul(this, num);
|
|
2355
|
+
};
|
|
2356
|
+
BN2.prototype.redIMul = function redIMul(num) {
|
|
2357
|
+
assert(this.red, "redMul works only with red numbers");
|
|
2358
|
+
this.red._verify2(this, num);
|
|
2359
|
+
return this.red.imul(this, num);
|
|
2360
|
+
};
|
|
2361
|
+
BN2.prototype.redSqr = function redSqr() {
|
|
2362
|
+
assert(this.red, "redSqr works only with red numbers");
|
|
2363
|
+
this.red._verify1(this);
|
|
2364
|
+
return this.red.sqr(this);
|
|
2365
|
+
};
|
|
2366
|
+
BN2.prototype.redISqr = function redISqr() {
|
|
2367
|
+
assert(this.red, "redISqr works only with red numbers");
|
|
2368
|
+
this.red._verify1(this);
|
|
2369
|
+
return this.red.isqr(this);
|
|
2370
|
+
};
|
|
2371
|
+
BN2.prototype.redSqrt = function redSqrt() {
|
|
2372
|
+
assert(this.red, "redSqrt works only with red numbers");
|
|
2373
|
+
this.red._verify1(this);
|
|
2374
|
+
return this.red.sqrt(this);
|
|
2375
|
+
};
|
|
2376
|
+
BN2.prototype.redInvm = function redInvm() {
|
|
2377
|
+
assert(this.red, "redInvm works only with red numbers");
|
|
2378
|
+
this.red._verify1(this);
|
|
2379
|
+
return this.red.invm(this);
|
|
2380
|
+
};
|
|
2381
|
+
BN2.prototype.redNeg = function redNeg() {
|
|
2382
|
+
assert(this.red, "redNeg works only with red numbers");
|
|
2383
|
+
this.red._verify1(this);
|
|
2384
|
+
return this.red.neg(this);
|
|
2385
|
+
};
|
|
2386
|
+
BN2.prototype.redPow = function redPow(num) {
|
|
2387
|
+
assert(this.red && !num.red, "redPow(normalNum)");
|
|
2388
|
+
this.red._verify1(this);
|
|
2389
|
+
return this.red.pow(this, num);
|
|
2390
|
+
};
|
|
2391
|
+
var primes = {
|
|
2392
|
+
k256: null,
|
|
2393
|
+
p224: null,
|
|
2394
|
+
p192: null,
|
|
2395
|
+
p25519: null
|
|
2396
|
+
};
|
|
2397
|
+
function MPrime(name, p) {
|
|
2398
|
+
this.name = name;
|
|
2399
|
+
this.p = new BN2(p, 16);
|
|
2400
|
+
this.n = this.p.bitLength();
|
|
2401
|
+
this.k = new BN2(1).iushln(this.n).isub(this.p);
|
|
2402
|
+
this.tmp = this._tmp();
|
|
2403
|
+
}
|
|
2404
|
+
MPrime.prototype._tmp = function _tmp() {
|
|
2405
|
+
var tmp = new BN2(null);
|
|
2406
|
+
tmp.words = new Array(Math.ceil(this.n / 13));
|
|
2407
|
+
return tmp;
|
|
2408
|
+
};
|
|
2409
|
+
MPrime.prototype.ireduce = function ireduce(num) {
|
|
2410
|
+
var r = num;
|
|
2411
|
+
var rlen;
|
|
2412
|
+
do {
|
|
2413
|
+
this.split(r, this.tmp);
|
|
2414
|
+
r = this.imulK(r);
|
|
2415
|
+
r = r.iadd(this.tmp);
|
|
2416
|
+
rlen = r.bitLength();
|
|
2417
|
+
} while (rlen > this.n);
|
|
2418
|
+
var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
|
|
2419
|
+
if (cmp === 0) {
|
|
2420
|
+
r.words[0] = 0;
|
|
2421
|
+
r.length = 1;
|
|
2422
|
+
} else if (cmp > 0) {
|
|
2423
|
+
r.isub(this.p);
|
|
2424
|
+
} else {
|
|
2425
|
+
if (r.strip !== void 0) {
|
|
2426
|
+
r.strip();
|
|
2427
|
+
} else {
|
|
2428
|
+
r._strip();
|
|
2429
|
+
}
|
|
2430
|
+
}
|
|
2431
|
+
return r;
|
|
2432
|
+
};
|
|
2433
|
+
MPrime.prototype.split = function split(input, out) {
|
|
2434
|
+
input.iushrn(this.n, 0, out);
|
|
2435
|
+
};
|
|
2436
|
+
MPrime.prototype.imulK = function imulK(num) {
|
|
2437
|
+
return num.imul(this.k);
|
|
2438
|
+
};
|
|
2439
|
+
function K256() {
|
|
2440
|
+
MPrime.call(
|
|
2441
|
+
this,
|
|
2442
|
+
"k256",
|
|
2443
|
+
"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f"
|
|
2444
|
+
);
|
|
2445
|
+
}
|
|
2446
|
+
inherits(K256, MPrime);
|
|
2447
|
+
K256.prototype.split = function split(input, output) {
|
|
2448
|
+
var mask = 4194303;
|
|
2449
|
+
var outLen = Math.min(input.length, 9);
|
|
2450
|
+
for (var i = 0; i < outLen; i++) {
|
|
2451
|
+
output.words[i] = input.words[i];
|
|
2452
|
+
}
|
|
2453
|
+
output.length = outLen;
|
|
2454
|
+
if (input.length <= 9) {
|
|
2455
|
+
input.words[0] = 0;
|
|
2456
|
+
input.length = 1;
|
|
2457
|
+
return;
|
|
2458
|
+
}
|
|
2459
|
+
var prev = input.words[9];
|
|
2460
|
+
output.words[output.length++] = prev & mask;
|
|
2461
|
+
for (i = 10; i < input.length; i++) {
|
|
2462
|
+
var next = input.words[i] | 0;
|
|
2463
|
+
input.words[i - 10] = (next & mask) << 4 | prev >>> 22;
|
|
2464
|
+
prev = next;
|
|
2465
|
+
}
|
|
2466
|
+
prev >>>= 22;
|
|
2467
|
+
input.words[i - 10] = prev;
|
|
2468
|
+
if (prev === 0 && input.length > 10) {
|
|
2469
|
+
input.length -= 10;
|
|
2470
|
+
} else {
|
|
2471
|
+
input.length -= 9;
|
|
2472
|
+
}
|
|
2473
|
+
};
|
|
2474
|
+
K256.prototype.imulK = function imulK(num) {
|
|
2475
|
+
num.words[num.length] = 0;
|
|
2476
|
+
num.words[num.length + 1] = 0;
|
|
2477
|
+
num.length += 2;
|
|
2478
|
+
var lo = 0;
|
|
2479
|
+
for (var i = 0; i < num.length; i++) {
|
|
2480
|
+
var w = num.words[i] | 0;
|
|
2481
|
+
lo += w * 977;
|
|
2482
|
+
num.words[i] = lo & 67108863;
|
|
2483
|
+
lo = w * 64 + (lo / 67108864 | 0);
|
|
2484
|
+
}
|
|
2485
|
+
if (num.words[num.length - 1] === 0) {
|
|
2486
|
+
num.length--;
|
|
2487
|
+
if (num.words[num.length - 1] === 0) {
|
|
2488
|
+
num.length--;
|
|
2489
|
+
}
|
|
2490
|
+
}
|
|
2491
|
+
return num;
|
|
2492
|
+
};
|
|
2493
|
+
function P224() {
|
|
2494
|
+
MPrime.call(
|
|
2495
|
+
this,
|
|
2496
|
+
"p224",
|
|
2497
|
+
"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001"
|
|
2498
|
+
);
|
|
2499
|
+
}
|
|
2500
|
+
inherits(P224, MPrime);
|
|
2501
|
+
function P192() {
|
|
2502
|
+
MPrime.call(
|
|
2503
|
+
this,
|
|
2504
|
+
"p192",
|
|
2505
|
+
"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff"
|
|
2506
|
+
);
|
|
2507
|
+
}
|
|
2508
|
+
inherits(P192, MPrime);
|
|
2509
|
+
function P25519() {
|
|
2510
|
+
MPrime.call(
|
|
2511
|
+
this,
|
|
2512
|
+
"25519",
|
|
2513
|
+
"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed"
|
|
2514
|
+
);
|
|
2515
|
+
}
|
|
2516
|
+
inherits(P25519, MPrime);
|
|
2517
|
+
P25519.prototype.imulK = function imulK(num) {
|
|
2518
|
+
var carry = 0;
|
|
2519
|
+
for (var i = 0; i < num.length; i++) {
|
|
2520
|
+
var hi = (num.words[i] | 0) * 19 + carry;
|
|
2521
|
+
var lo = hi & 67108863;
|
|
2522
|
+
hi >>>= 26;
|
|
2523
|
+
num.words[i] = lo;
|
|
2524
|
+
carry = hi;
|
|
2525
|
+
}
|
|
2526
|
+
if (carry !== 0) {
|
|
2527
|
+
num.words[num.length++] = carry;
|
|
2528
|
+
}
|
|
2529
|
+
return num;
|
|
2530
|
+
};
|
|
2531
|
+
BN2._prime = function prime(name) {
|
|
2532
|
+
if (primes[name]) return primes[name];
|
|
2533
|
+
var prime2;
|
|
2534
|
+
if (name === "k256") {
|
|
2535
|
+
prime2 = new K256();
|
|
2536
|
+
} else if (name === "p224") {
|
|
2537
|
+
prime2 = new P224();
|
|
2538
|
+
} else if (name === "p192") {
|
|
2539
|
+
prime2 = new P192();
|
|
2540
|
+
} else if (name === "p25519") {
|
|
2541
|
+
prime2 = new P25519();
|
|
2542
|
+
} else {
|
|
2543
|
+
throw new Error("Unknown prime " + name);
|
|
2544
|
+
}
|
|
2545
|
+
primes[name] = prime2;
|
|
2546
|
+
return prime2;
|
|
2547
|
+
};
|
|
2548
|
+
function Red(m) {
|
|
2549
|
+
if (typeof m === "string") {
|
|
2550
|
+
var prime = BN2._prime(m);
|
|
2551
|
+
this.m = prime.p;
|
|
2552
|
+
this.prime = prime;
|
|
2553
|
+
} else {
|
|
2554
|
+
assert(m.gtn(1), "modulus must be greater than 1");
|
|
2555
|
+
this.m = m;
|
|
2556
|
+
this.prime = null;
|
|
2557
|
+
}
|
|
2558
|
+
}
|
|
2559
|
+
Red.prototype._verify1 = function _verify1(a) {
|
|
2560
|
+
assert(a.negative === 0, "red works only with positives");
|
|
2561
|
+
assert(a.red, "red works only with red numbers");
|
|
2562
|
+
};
|
|
2563
|
+
Red.prototype._verify2 = function _verify2(a, b) {
|
|
2564
|
+
assert((a.negative | b.negative) === 0, "red works only with positives");
|
|
2565
|
+
assert(
|
|
2566
|
+
a.red && a.red === b.red,
|
|
2567
|
+
"red works only with red numbers"
|
|
2568
|
+
);
|
|
2569
|
+
};
|
|
2570
|
+
Red.prototype.imod = function imod(a) {
|
|
2571
|
+
if (this.prime) return this.prime.ireduce(a)._forceRed(this);
|
|
2572
|
+
move(a, a.umod(this.m)._forceRed(this));
|
|
2573
|
+
return a;
|
|
2574
|
+
};
|
|
2575
|
+
Red.prototype.neg = function neg(a) {
|
|
2576
|
+
if (a.isZero()) {
|
|
2577
|
+
return a.clone();
|
|
2578
|
+
}
|
|
2579
|
+
return this.m.sub(a)._forceRed(this);
|
|
2580
|
+
};
|
|
2581
|
+
Red.prototype.add = function add(a, b) {
|
|
2582
|
+
this._verify2(a, b);
|
|
2583
|
+
var res = a.add(b);
|
|
2584
|
+
if (res.cmp(this.m) >= 0) {
|
|
2585
|
+
res.isub(this.m);
|
|
2586
|
+
}
|
|
2587
|
+
return res._forceRed(this);
|
|
2588
|
+
};
|
|
2589
|
+
Red.prototype.iadd = function iadd(a, b) {
|
|
2590
|
+
this._verify2(a, b);
|
|
2591
|
+
var res = a.iadd(b);
|
|
2592
|
+
if (res.cmp(this.m) >= 0) {
|
|
2593
|
+
res.isub(this.m);
|
|
2594
|
+
}
|
|
2595
|
+
return res;
|
|
2596
|
+
};
|
|
2597
|
+
Red.prototype.sub = function sub(a, b) {
|
|
2598
|
+
this._verify2(a, b);
|
|
2599
|
+
var res = a.sub(b);
|
|
2600
|
+
if (res.cmpn(0) < 0) {
|
|
2601
|
+
res.iadd(this.m);
|
|
2602
|
+
}
|
|
2603
|
+
return res._forceRed(this);
|
|
2604
|
+
};
|
|
2605
|
+
Red.prototype.isub = function isub(a, b) {
|
|
2606
|
+
this._verify2(a, b);
|
|
2607
|
+
var res = a.isub(b);
|
|
2608
|
+
if (res.cmpn(0) < 0) {
|
|
2609
|
+
res.iadd(this.m);
|
|
2610
|
+
}
|
|
2611
|
+
return res;
|
|
2612
|
+
};
|
|
2613
|
+
Red.prototype.shl = function shl(a, num) {
|
|
2614
|
+
this._verify1(a);
|
|
2615
|
+
return this.imod(a.ushln(num));
|
|
2616
|
+
};
|
|
2617
|
+
Red.prototype.imul = function imul(a, b) {
|
|
2618
|
+
this._verify2(a, b);
|
|
2619
|
+
return this.imod(a.imul(b));
|
|
2620
|
+
};
|
|
2621
|
+
Red.prototype.mul = function mul(a, b) {
|
|
2622
|
+
this._verify2(a, b);
|
|
2623
|
+
return this.imod(a.mul(b));
|
|
2624
|
+
};
|
|
2625
|
+
Red.prototype.isqr = function isqr(a) {
|
|
2626
|
+
return this.imul(a, a.clone());
|
|
2627
|
+
};
|
|
2628
|
+
Red.prototype.sqr = function sqr(a) {
|
|
2629
|
+
return this.mul(a, a);
|
|
2630
|
+
};
|
|
2631
|
+
Red.prototype.sqrt = function sqrt(a) {
|
|
2632
|
+
if (a.isZero()) return a.clone();
|
|
2633
|
+
var mod3 = this.m.andln(3);
|
|
2634
|
+
assert(mod3 % 2 === 1);
|
|
2635
|
+
if (mod3 === 3) {
|
|
2636
|
+
var pow = this.m.add(new BN2(1)).iushrn(2);
|
|
2637
|
+
return this.pow(a, pow);
|
|
2638
|
+
}
|
|
2639
|
+
var q = this.m.subn(1);
|
|
2640
|
+
var s = 0;
|
|
2641
|
+
while (!q.isZero() && q.andln(1) === 0) {
|
|
2642
|
+
s++;
|
|
2643
|
+
q.iushrn(1);
|
|
2644
|
+
}
|
|
2645
|
+
assert(!q.isZero());
|
|
2646
|
+
var one = new BN2(1).toRed(this);
|
|
2647
|
+
var nOne = one.redNeg();
|
|
2648
|
+
var lpow = this.m.subn(1).iushrn(1);
|
|
2649
|
+
var z = this.m.bitLength();
|
|
2650
|
+
z = new BN2(2 * z * z).toRed(this);
|
|
2651
|
+
while (this.pow(z, lpow).cmp(nOne) !== 0) {
|
|
2652
|
+
z.redIAdd(nOne);
|
|
2653
|
+
}
|
|
2654
|
+
var c = this.pow(z, q);
|
|
2655
|
+
var r = this.pow(a, q.addn(1).iushrn(1));
|
|
2656
|
+
var t = this.pow(a, q);
|
|
2657
|
+
var m = s;
|
|
2658
|
+
while (t.cmp(one) !== 0) {
|
|
2659
|
+
var tmp = t;
|
|
2660
|
+
for (var i = 0; tmp.cmp(one) !== 0; i++) {
|
|
2661
|
+
tmp = tmp.redSqr();
|
|
2662
|
+
}
|
|
2663
|
+
assert(i < m);
|
|
2664
|
+
var b = this.pow(c, new BN2(1).iushln(m - i - 1));
|
|
2665
|
+
r = r.redMul(b);
|
|
2666
|
+
c = b.redSqr();
|
|
2667
|
+
t = t.redMul(c);
|
|
2668
|
+
m = i;
|
|
2669
|
+
}
|
|
2670
|
+
return r;
|
|
2671
|
+
};
|
|
2672
|
+
Red.prototype.invm = function invm(a) {
|
|
2673
|
+
var inv = a._invmp(this.m);
|
|
2674
|
+
if (inv.negative !== 0) {
|
|
2675
|
+
inv.negative = 0;
|
|
2676
|
+
return this.imod(inv).redNeg();
|
|
2677
|
+
} else {
|
|
2678
|
+
return this.imod(inv);
|
|
2679
|
+
}
|
|
2680
|
+
};
|
|
2681
|
+
Red.prototype.pow = function pow(a, num) {
|
|
2682
|
+
if (num.isZero()) return new BN2(1).toRed(this);
|
|
2683
|
+
if (num.cmpn(1) === 0) return a.clone();
|
|
2684
|
+
var windowSize = 4;
|
|
2685
|
+
var wnd = new Array(1 << windowSize);
|
|
2686
|
+
wnd[0] = new BN2(1).toRed(this);
|
|
2687
|
+
wnd[1] = a;
|
|
2688
|
+
for (var i = 2; i < wnd.length; i++) {
|
|
2689
|
+
wnd[i] = this.mul(wnd[i - 1], a);
|
|
2690
|
+
}
|
|
2691
|
+
var res = wnd[0];
|
|
2692
|
+
var current = 0;
|
|
2693
|
+
var currentLen = 0;
|
|
2694
|
+
var start = num.bitLength() % 26;
|
|
2695
|
+
if (start === 0) {
|
|
2696
|
+
start = 26;
|
|
2697
|
+
}
|
|
2698
|
+
for (i = num.length - 1; i >= 0; i--) {
|
|
2699
|
+
var word = num.words[i];
|
|
2700
|
+
for (var j = start - 1; j >= 0; j--) {
|
|
2701
|
+
var bit = word >> j & 1;
|
|
2702
|
+
if (res !== wnd[0]) {
|
|
2703
|
+
res = this.sqr(res);
|
|
2704
|
+
}
|
|
2705
|
+
if (bit === 0 && current === 0) {
|
|
2706
|
+
currentLen = 0;
|
|
2707
|
+
continue;
|
|
2708
|
+
}
|
|
2709
|
+
current <<= 1;
|
|
2710
|
+
current |= bit;
|
|
2711
|
+
currentLen++;
|
|
2712
|
+
if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;
|
|
2713
|
+
res = this.mul(res, wnd[current]);
|
|
2714
|
+
currentLen = 0;
|
|
2715
|
+
current = 0;
|
|
2716
|
+
}
|
|
2717
|
+
start = 26;
|
|
2718
|
+
}
|
|
2719
|
+
return res;
|
|
2720
|
+
};
|
|
2721
|
+
Red.prototype.convertTo = function convertTo(num) {
|
|
2722
|
+
var r = num.umod(this.m);
|
|
2723
|
+
return r === num ? r.clone() : r;
|
|
2724
|
+
};
|
|
2725
|
+
Red.prototype.convertFrom = function convertFrom(num) {
|
|
2726
|
+
var res = num.clone();
|
|
2727
|
+
res.red = null;
|
|
2728
|
+
return res;
|
|
2729
|
+
};
|
|
2730
|
+
BN2.mont = function mont(num) {
|
|
2731
|
+
return new Mont(num);
|
|
2732
|
+
};
|
|
2733
|
+
function Mont(m) {
|
|
2734
|
+
Red.call(this, m);
|
|
2735
|
+
this.shift = this.m.bitLength();
|
|
2736
|
+
if (this.shift % 26 !== 0) {
|
|
2737
|
+
this.shift += 26 - this.shift % 26;
|
|
2738
|
+
}
|
|
2739
|
+
this.r = new BN2(1).iushln(this.shift);
|
|
2740
|
+
this.r2 = this.imod(this.r.sqr());
|
|
2741
|
+
this.rinv = this.r._invmp(this.m);
|
|
2742
|
+
this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
|
|
2743
|
+
this.minv = this.minv.umod(this.r);
|
|
2744
|
+
this.minv = this.r.sub(this.minv);
|
|
2745
|
+
}
|
|
2746
|
+
inherits(Mont, Red);
|
|
2747
|
+
Mont.prototype.convertTo = function convertTo(num) {
|
|
2748
|
+
return this.imod(num.ushln(this.shift));
|
|
2749
|
+
};
|
|
2750
|
+
Mont.prototype.convertFrom = function convertFrom(num) {
|
|
2751
|
+
var r = this.imod(num.mul(this.rinv));
|
|
2752
|
+
r.red = null;
|
|
2753
|
+
return r;
|
|
2754
|
+
};
|
|
2755
|
+
Mont.prototype.imul = function imul(a, b) {
|
|
2756
|
+
if (a.isZero() || b.isZero()) {
|
|
2757
|
+
a.words[0] = 0;
|
|
2758
|
+
a.length = 1;
|
|
2759
|
+
return a;
|
|
2760
|
+
}
|
|
2761
|
+
var t = a.imul(b);
|
|
2762
|
+
var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
|
|
2763
|
+
var u = t.isub(c).iushrn(this.shift);
|
|
2764
|
+
var res = u;
|
|
2765
|
+
if (u.cmp(this.m) >= 0) {
|
|
2766
|
+
res = u.isub(this.m);
|
|
2767
|
+
} else if (u.cmpn(0) < 0) {
|
|
2768
|
+
res = u.iadd(this.m);
|
|
2769
|
+
}
|
|
2770
|
+
return res._forceRed(this);
|
|
2771
|
+
};
|
|
2772
|
+
Mont.prototype.mul = function mul(a, b) {
|
|
2773
|
+
if (a.isZero() || b.isZero()) return new BN2(0)._forceRed(this);
|
|
2774
|
+
var t = a.mul(b);
|
|
2775
|
+
var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
|
|
2776
|
+
var u = t.isub(c).iushrn(this.shift);
|
|
2777
|
+
var res = u;
|
|
2778
|
+
if (u.cmp(this.m) >= 0) {
|
|
2779
|
+
res = u.isub(this.m);
|
|
2780
|
+
} else if (u.cmpn(0) < 0) {
|
|
2781
|
+
res = u.iadd(this.m);
|
|
2782
|
+
}
|
|
2783
|
+
return res._forceRed(this);
|
|
2784
|
+
};
|
|
2785
|
+
Mont.prototype.invm = function invm(a) {
|
|
2786
|
+
var res = this.imod(a._invmp(this.m).mul(this.r2));
|
|
2787
|
+
return res._forceRed(this);
|
|
2788
|
+
};
|
|
2789
|
+
})(typeof module === "undefined" || module, exports$1);
|
|
2790
|
+
}
|
|
2791
|
+
});
|
|
2792
|
+
var Networks = class {
|
|
2793
|
+
chainType;
|
|
2794
|
+
networkAPIs;
|
|
2795
|
+
constructor(networkAPIs, chainType) {
|
|
2796
|
+
this.chainType = chainType || "";
|
|
2797
|
+
this.networkAPIs = networkAPIs;
|
|
2798
|
+
}
|
|
2799
|
+
setChainType(chainType) {
|
|
2800
|
+
this.chainType = chainType;
|
|
2801
|
+
}
|
|
2802
|
+
async getNetworks(chainType) {
|
|
2803
|
+
const networks = this.networkAPIs.getAllNetworks(chainType || "");
|
|
2804
|
+
return networks;
|
|
2805
|
+
}
|
|
2806
|
+
async getNetworkByChainId(chainId) {
|
|
2807
|
+
const network = await this.networkAPIs.getNetworkByChainId(chainId);
|
|
2808
|
+
if (!network) {
|
|
2809
|
+
throw new Error("Network not found");
|
|
2810
|
+
}
|
|
2811
|
+
return network;
|
|
2812
|
+
}
|
|
2813
|
+
async getNetworkByChainIndex(chainIndex) {
|
|
2814
|
+
const network = await this.networkAPIs.getNetworkByChainIndex(chainIndex);
|
|
2815
|
+
if (!network) {
|
|
2816
|
+
throw new Error("Network not found");
|
|
2817
|
+
}
|
|
2818
|
+
return network;
|
|
2819
|
+
}
|
|
2820
|
+
async getCurrentNetwork() {
|
|
2821
|
+
const chainType = this.chainType;
|
|
2822
|
+
let chainId = await this.networkAPIs.getCurrentNetwork(chainType);
|
|
2823
|
+
if (chainId === "") {
|
|
2824
|
+
chainId = walletUtils.SupportedChainTypes?.[chainType]?.chainId || "";
|
|
2825
|
+
}
|
|
2826
|
+
return this.getNetworkByChainId(chainId);
|
|
2827
|
+
}
|
|
2828
|
+
async setCurrentNetwork(chainId) {
|
|
2829
|
+
const chainType = this.chainType || "";
|
|
2830
|
+
await this.networkAPIs.setCurrentNetwork(chainType, chainId);
|
|
2831
|
+
return true;
|
|
2832
|
+
}
|
|
2833
|
+
};
|
|
2834
|
+
|
|
2835
|
+
// src/base/token.ts
|
|
2836
|
+
var Tokens = class {
|
|
2837
|
+
tokenAPIs;
|
|
2838
|
+
constructor(tokenService) {
|
|
2839
|
+
this.tokenAPIs = tokenService;
|
|
2840
|
+
}
|
|
2841
|
+
async searchTokens({ chainIndex, query }) {
|
|
2842
|
+
const { data: tokens = [] } = await this.tokenAPIs.queryRemoteTokens({ keyword: query || "", chainIndex });
|
|
2843
|
+
return tokens;
|
|
2844
|
+
}
|
|
2845
|
+
// public async addToken(tokenInfo: Omit<TokenInfo, "id">): Promise<TokenInfo> {
|
|
2846
|
+
// const { data: tokenInfoData }: any = await this.tokenService.addCustomToken(tokenInfo as any);
|
|
2847
|
+
// return tokenInfoData;
|
|
2848
|
+
// }
|
|
2849
|
+
async getTokenInfo({ address, chainIndex }) {
|
|
2850
|
+
const {
|
|
2851
|
+
data: { data: tokenInfo }
|
|
2852
|
+
} = await this.tokenAPIs.getTokenInfo({ address, chainIndex });
|
|
2853
|
+
return tokenInfo;
|
|
2854
|
+
}
|
|
2855
|
+
async getTokenRiskInfo(_params) {
|
|
2856
|
+
const { data: tokenRiskInfo } = await this.tokenAPIs.getTokenRisk(_params);
|
|
2857
|
+
return tokenRiskInfo;
|
|
2858
|
+
}
|
|
2859
|
+
async getTokenDetail(_params) {
|
|
2860
|
+
const { data } = await this.tokenAPIs.getTokenDetail(_params);
|
|
2861
|
+
return data;
|
|
2862
|
+
}
|
|
2863
|
+
// public async addMyToken(tokenId: string): Promise<boolean> {
|
|
2864
|
+
// const { success = false } = (await this.tokenService.addAccountToken({ tokenId })) as { success: boolean };
|
|
2865
|
+
// return success;
|
|
2866
|
+
// }
|
|
2867
|
+
};
|
|
2868
|
+
({
|
|
2869
|
+
[walletUtils.ChainTypes.BTC]: true,
|
|
2870
|
+
[walletUtils.ChainTypes.COSMOS]: true,
|
|
2871
|
+
[walletUtils.ChainTypes.DOGE]: true
|
|
2872
|
+
});
|
|
2873
|
+
var Transactions = class {
|
|
2874
|
+
transactionAPIs;
|
|
2875
|
+
constructor(transactionAPIs) {
|
|
2876
|
+
this.transactionAPIs = transactionAPIs;
|
|
2877
|
+
}
|
|
2878
|
+
/*
|
|
2879
|
+
baseFee: 1
|
|
2880
|
+
gasLimit: 0
|
|
2881
|
+
priorityFeeHigh: 0
|
|
2882
|
+
priorityFeeLow: 0
|
|
2883
|
+
priorityFeeMedium: 0
|
|
2884
|
+
*/
|
|
2885
|
+
async queryGasInfo({ chainType, params }) {
|
|
2886
|
+
try {
|
|
2887
|
+
const res = await this.transactionAPIs.queryGasInfo(chainType, params);
|
|
2888
|
+
return {
|
|
2889
|
+
success: res?.code === 0,
|
|
2890
|
+
data: res?.result || {}
|
|
2891
|
+
};
|
|
2892
|
+
} catch (err) {
|
|
2893
|
+
return {
|
|
2894
|
+
success: false,
|
|
2895
|
+
message: err?.message || "Failed to query gas info"
|
|
2896
|
+
};
|
|
2897
|
+
}
|
|
2898
|
+
}
|
|
2899
|
+
async getTransactions(params) {
|
|
2900
|
+
const res = await this.transactionAPIs.getTransactions(params);
|
|
2901
|
+
const { cursor = "", transactionList = [] } = res || {};
|
|
2902
|
+
return { cursor, transactionList };
|
|
2903
|
+
}
|
|
2904
|
+
async getTransaction(params) {
|
|
2905
|
+
const res = await this.transactionAPIs.getTransaction(params);
|
|
2906
|
+
return res?.data || {};
|
|
2907
|
+
}
|
|
2908
|
+
};
|
|
2909
|
+
function getConfig(tomoStage) {
|
|
2910
|
+
const domain = walletUtils.TomoApiDomains[tomoStage];
|
|
2911
|
+
if (!domain) {
|
|
2912
|
+
throw new Error("Invalid tomo stage");
|
|
2913
|
+
}
|
|
2914
|
+
return {
|
|
2915
|
+
rpcBaseUrl: `${domain}`,
|
|
2916
|
+
walletBaseUrl: `${domain}/wallet`,
|
|
2917
|
+
txBaseUrl: `${domain}/quote`,
|
|
2918
|
+
tokenBaseUrl: `${domain}/token`,
|
|
2919
|
+
userBaseUrl: `${domain}/user/api`
|
|
2920
|
+
};
|
|
2921
|
+
}
|
|
2922
|
+
var CONFIG = {
|
|
2923
|
+
prod: getConfig("prod"),
|
|
2924
|
+
pre: getConfig("pre"),
|
|
2925
|
+
dev: getConfig("dev")
|
|
2926
|
+
};
|
|
2927
|
+
function generateSignature(config) {
|
|
2928
|
+
const timestamp = Math.floor(Date.now() / 1e3).toString();
|
|
2929
|
+
const method = config.method.toUpperCase();
|
|
2930
|
+
let data = config.data ? config.data : {};
|
|
2931
|
+
if (method === "GET") {
|
|
2932
|
+
data = JSON.stringify({ key: "value" });
|
|
2933
|
+
} else {
|
|
2934
|
+
if (typeof data !== "string") {
|
|
2935
|
+
data = JSON.stringify(data);
|
|
2936
|
+
}
|
|
2937
|
+
}
|
|
2938
|
+
const message = [method, config.url, timestamp, data, config.apiKey, config.apiSecret, config.salt].join("");
|
|
2939
|
+
const signature = CryptoJS__default.default.SHA256(message).toString();
|
|
2940
|
+
return { signature, timestamp };
|
|
2941
|
+
}
|
|
2942
|
+
|
|
2943
|
+
// src/api/utils/index.ts
|
|
2944
|
+
var formatJwtToken = (jwtToken) => `Bearer ${jwtToken}`;
|
|
2945
|
+
function signRequest(params, clientId, signParams) {
|
|
2946
|
+
if (typeof signParams === "string") {
|
|
2947
|
+
const jwtToken = signParams;
|
|
2948
|
+
Object.assign(params.headers ?? {}, {
|
|
2949
|
+
"client-id": clientId,
|
|
2950
|
+
Authorization: formatJwtToken(jwtToken)
|
|
2951
|
+
});
|
|
2952
|
+
return params;
|
|
2953
|
+
}
|
|
2954
|
+
const { apiKey, apiSecret, salt } = signParams;
|
|
2955
|
+
const { signature, timestamp } = generateSignature({
|
|
2956
|
+
method: params.method,
|
|
2957
|
+
url: params.url,
|
|
2958
|
+
data: params.data,
|
|
2959
|
+
apiKey,
|
|
2960
|
+
apiSecret,
|
|
2961
|
+
salt
|
|
2962
|
+
});
|
|
2963
|
+
Object.assign(params.headers ?? {}, {
|
|
2964
|
+
"X-APP-Key": apiKey,
|
|
2965
|
+
"X-Signature": signature,
|
|
2966
|
+
"X-Timestamp": timestamp,
|
|
2967
|
+
"client-id": clientId
|
|
2968
|
+
});
|
|
2969
|
+
return params;
|
|
2970
|
+
}
|
|
2971
|
+
|
|
2972
|
+
// src/api/base.ts
|
|
2973
|
+
var BasePublicService = class {
|
|
2974
|
+
tokenApi = axios__default.default.create();
|
|
2975
|
+
txApi = axios__default.default.create();
|
|
2976
|
+
walletApi = axios__default.default.create();
|
|
2977
|
+
apiBase;
|
|
2978
|
+
tomoAppInfo;
|
|
2979
|
+
constructor(publicApiBase, tomoAppInfo) {
|
|
2980
|
+
this.apiBase = publicApiBase;
|
|
2981
|
+
this.tomoAppInfo = tomoAppInfo;
|
|
2982
|
+
[this.tokenApi, this.txApi, this.walletApi].map(
|
|
2983
|
+
(api, i) => api.interceptors.request.use((params) => {
|
|
2984
|
+
const { tokenBaseUrl, txBaseUrl, walletBaseUrl } = publicApiBase;
|
|
2985
|
+
params.baseURL = [tokenBaseUrl, txBaseUrl, walletBaseUrl][i];
|
|
2986
|
+
return signRequest(params, tomoAppInfo.tomoClientId, tomoAppInfo);
|
|
2987
|
+
})
|
|
2988
|
+
);
|
|
2989
|
+
}
|
|
2990
|
+
getSignConfig() {
|
|
2991
|
+
return this.tomoAppInfo;
|
|
2992
|
+
}
|
|
2993
|
+
};
|
|
2994
|
+
|
|
2995
|
+
// src/api/token.ts
|
|
2996
|
+
var TokenAPIs = class _TokenAPIs extends BasePublicService {
|
|
2997
|
+
static instance;
|
|
2998
|
+
constructor(apiBase, tomoAppInfo) {
|
|
2999
|
+
super(apiBase, tomoAppInfo);
|
|
3000
|
+
}
|
|
3001
|
+
static getInstance(apiBase, tomoAppInfo) {
|
|
3002
|
+
if (!this.instance) {
|
|
3003
|
+
this.instance = new _TokenAPIs(apiBase, tomoAppInfo);
|
|
3004
|
+
}
|
|
3005
|
+
return this.instance;
|
|
3006
|
+
}
|
|
3007
|
+
// --------------- token api ---------------
|
|
3008
|
+
async getTokenInfo(params) {
|
|
3009
|
+
try {
|
|
3010
|
+
const res = await this.walletApi.get("/v1/balance/getTokenInfo", {
|
|
3011
|
+
params
|
|
3012
|
+
});
|
|
3013
|
+
return {
|
|
3014
|
+
success: res?.data?.code === "00000",
|
|
3015
|
+
message: res?.data?.msg,
|
|
3016
|
+
data: res?.data?.data
|
|
3017
|
+
};
|
|
3018
|
+
} catch (error) {
|
|
3019
|
+
console.error("Failed to get token info:", error);
|
|
3020
|
+
throw error;
|
|
3021
|
+
}
|
|
3022
|
+
}
|
|
3023
|
+
async getTokenRisk(params) {
|
|
3024
|
+
if (typeof params.chainIndex !== "number" || !params.tokenAddress) {
|
|
3025
|
+
throw new Error("chainName or tokenAddress is required");
|
|
3026
|
+
}
|
|
3027
|
+
const res = await this.tokenApi.post("/v1/market/risk/details", [params]);
|
|
3028
|
+
return {
|
|
3029
|
+
success: res?.data?.code === "0",
|
|
3030
|
+
message: res?.data?.msg,
|
|
3031
|
+
data: res?.data?.data?.[0] || null
|
|
3032
|
+
};
|
|
3033
|
+
}
|
|
3034
|
+
async addCustomToken(params) {
|
|
3035
|
+
try {
|
|
3036
|
+
const res = await this.walletApi.post("/v1/customTokens/addCustomToken", params, {});
|
|
3037
|
+
return {
|
|
3038
|
+
success: res?.data?.code === "00000",
|
|
3039
|
+
message: res?.data?.msg,
|
|
3040
|
+
data: res?.data?.data
|
|
3041
|
+
};
|
|
3042
|
+
} catch (error) {
|
|
3043
|
+
console.error("Failed to add custom token:", error);
|
|
3044
|
+
throw error;
|
|
3045
|
+
}
|
|
3046
|
+
}
|
|
3047
|
+
async deleteCustomToken(params) {
|
|
3048
|
+
try {
|
|
3049
|
+
const res = await this.walletApi.get("/v1/customTokens/delete", {
|
|
3050
|
+
params
|
|
3051
|
+
});
|
|
3052
|
+
return {
|
|
3053
|
+
success: res?.data?.code === "00000",
|
|
3054
|
+
message: res?.data?.msg,
|
|
3055
|
+
data: res?.data?.data
|
|
3056
|
+
};
|
|
3057
|
+
} catch (error) {
|
|
3058
|
+
console.error("Failed to delete custom token:", error);
|
|
3059
|
+
throw error;
|
|
3060
|
+
}
|
|
3061
|
+
}
|
|
3062
|
+
async addMultiToken(params) {
|
|
3063
|
+
try {
|
|
3064
|
+
const res = await this.walletApi.post("/v1/customTokens/addTokenWithMulti", params, {});
|
|
3065
|
+
return {
|
|
3066
|
+
success: res?.data?.code === "00000",
|
|
3067
|
+
message: res?.data?.msg,
|
|
3068
|
+
data: res?.data?.data
|
|
3069
|
+
};
|
|
3070
|
+
} catch (error) {
|
|
3071
|
+
console.error("Failed to add multi token:", error);
|
|
3072
|
+
throw error;
|
|
3073
|
+
}
|
|
3074
|
+
}
|
|
3075
|
+
async removeMultiToken(params) {
|
|
3076
|
+
try {
|
|
3077
|
+
const res = await this.walletApi.get("/v1/customTokens/hideTokenWithMulti", {
|
|
3078
|
+
params
|
|
3079
|
+
});
|
|
3080
|
+
return {
|
|
3081
|
+
success: res?.data?.code === "00000",
|
|
3082
|
+
message: res?.data?.msg,
|
|
3083
|
+
data: res?.data?.data
|
|
3084
|
+
};
|
|
3085
|
+
} catch (error) {
|
|
3086
|
+
console.error("Failed to delete multi token:", error);
|
|
3087
|
+
throw error;
|
|
3088
|
+
}
|
|
3089
|
+
}
|
|
3090
|
+
async syncCustomToken(params) {
|
|
3091
|
+
try {
|
|
3092
|
+
const res = await this.walletApi.post("/v1/customTokens/sync", params, {});
|
|
3093
|
+
return res?.data || {};
|
|
3094
|
+
} catch (error) {
|
|
3095
|
+
console.error("Failed to sync custom token:", error);
|
|
3096
|
+
throw error;
|
|
3097
|
+
}
|
|
3098
|
+
}
|
|
3099
|
+
async getTokenBalance(params) {
|
|
3100
|
+
try {
|
|
3101
|
+
const res = await this.walletApi.get("/v1/balance/getTokenBalanceWithDetail", {
|
|
3102
|
+
params
|
|
3103
|
+
});
|
|
3104
|
+
return {
|
|
3105
|
+
success: res?.data?.code === "00000",
|
|
3106
|
+
message: res?.data?.msg,
|
|
3107
|
+
data: res?.data?.data || null
|
|
3108
|
+
};
|
|
3109
|
+
} catch (error) {
|
|
3110
|
+
console.error("Failed to get token balance:", error);
|
|
3111
|
+
throw error;
|
|
3112
|
+
}
|
|
3113
|
+
}
|
|
3114
|
+
async getTokenDetail(params) {
|
|
3115
|
+
const { chainIndex, tokenAddress } = params;
|
|
3116
|
+
const res = await this.tokenApi.get(`/v1/market/token/detail`, {
|
|
3117
|
+
params: {
|
|
3118
|
+
tokenAddress,
|
|
3119
|
+
chainIndex
|
|
3120
|
+
}
|
|
3121
|
+
});
|
|
3122
|
+
return {
|
|
3123
|
+
success: res?.data?.code === "0",
|
|
3124
|
+
message: res?.data?.msg,
|
|
3125
|
+
data: res?.data?.data || null
|
|
3126
|
+
};
|
|
3127
|
+
}
|
|
3128
|
+
async queryRemoteTokens(params) {
|
|
3129
|
+
const { keyword = "", chainIndex } = params || {};
|
|
3130
|
+
if (!keyword) {
|
|
3131
|
+
throw new Error("Params is required");
|
|
3132
|
+
}
|
|
3133
|
+
const res = await this.tokenApi.get(`/v1/market/token/search`, {
|
|
3134
|
+
params: {
|
|
3135
|
+
content: keyword,
|
|
3136
|
+
chainIndex
|
|
3137
|
+
}
|
|
3138
|
+
});
|
|
3139
|
+
return {
|
|
3140
|
+
success: res?.data?.code === "0",
|
|
3141
|
+
message: res?.data?.msg,
|
|
3142
|
+
data: res?.data?.data || []
|
|
3143
|
+
};
|
|
3144
|
+
}
|
|
3145
|
+
};
|
|
3146
|
+
|
|
3147
|
+
// src/api/transaction.ts
|
|
3148
|
+
var TransactionAPIs = class _TransactionAPIs extends BasePublicService {
|
|
3149
|
+
static instance;
|
|
3150
|
+
constructor(apiBase, tomoAppInfo) {
|
|
3151
|
+
super(apiBase, tomoAppInfo);
|
|
3152
|
+
}
|
|
3153
|
+
static getInstance(apiBase, tomoAppInfo) {
|
|
3154
|
+
if (!this.instance) {
|
|
3155
|
+
this.instance = new _TransactionAPIs(apiBase, tomoAppInfo);
|
|
3156
|
+
}
|
|
3157
|
+
return this.instance;
|
|
3158
|
+
}
|
|
3159
|
+
async queryGasInfo(chainType, params) {
|
|
3160
|
+
try {
|
|
3161
|
+
const res = await this.txApi.post("/api/v1/quote/queryGasInfo", params);
|
|
3162
|
+
return res?.data || {};
|
|
3163
|
+
} catch (error) {
|
|
3164
|
+
console.error("Failed to get gas info:", error);
|
|
3165
|
+
throw error;
|
|
3166
|
+
}
|
|
3167
|
+
}
|
|
3168
|
+
async getTransactions(params) {
|
|
3169
|
+
try {
|
|
3170
|
+
const res = await this.walletApi.get("/v1/transaction/list", {
|
|
3171
|
+
params
|
|
3172
|
+
});
|
|
3173
|
+
return res?.data?.data || {};
|
|
3174
|
+
} catch (error) {
|
|
3175
|
+
console.error("Failed to get transactions:", error);
|
|
3176
|
+
throw error;
|
|
3177
|
+
}
|
|
3178
|
+
}
|
|
3179
|
+
async getTransaction(params) {
|
|
3180
|
+
try {
|
|
3181
|
+
const res = await this.walletApi.get("/v1/transaction/detail", {
|
|
3182
|
+
params
|
|
3183
|
+
});
|
|
3184
|
+
return res?.data?.data || {};
|
|
3185
|
+
} catch (error) {
|
|
3186
|
+
console.error("Failed to get transaction:", error);
|
|
3187
|
+
throw error;
|
|
3188
|
+
}
|
|
3189
|
+
}
|
|
3190
|
+
};
|
|
3191
|
+
|
|
3192
|
+
// src/api/wallet.ts
|
|
3193
|
+
var WalletAPIs = class _WalletAPIs extends BasePublicService {
|
|
3194
|
+
static instance;
|
|
3195
|
+
constructor(apiBase, tomoAppInfo) {
|
|
3196
|
+
super(apiBase, tomoAppInfo);
|
|
3197
|
+
}
|
|
3198
|
+
static getInstance(apiBase, tomoAppInfo) {
|
|
3199
|
+
if (!this.instance) {
|
|
3200
|
+
this.instance = new _WalletAPIs(apiBase, tomoAppInfo);
|
|
3201
|
+
}
|
|
3202
|
+
return this.instance;
|
|
3203
|
+
}
|
|
3204
|
+
async createWallet(params) {
|
|
3205
|
+
try {
|
|
3206
|
+
if (!params) throw new Error("Params is required");
|
|
3207
|
+
const res = await this.walletApi.post("/v1/wallet/create", params, {});
|
|
3208
|
+
return res?.data || {};
|
|
3209
|
+
} catch (error) {
|
|
3210
|
+
if (error?.response?.data?.code === "60003") {
|
|
3211
|
+
return { success: false, message: "Wallet already exists", data: null };
|
|
3212
|
+
}
|
|
3213
|
+
console.error("Failed to create wallet:", error);
|
|
3214
|
+
throw error;
|
|
3215
|
+
}
|
|
3216
|
+
}
|
|
3217
|
+
async syncWallet(params) {
|
|
3218
|
+
try {
|
|
3219
|
+
const res = await this.walletApi.post("/v1/wallet/sync", params, {});
|
|
3220
|
+
return res?.data || {};
|
|
3221
|
+
} catch (error) {
|
|
3222
|
+
console.error("Failed to sync wallet:", error);
|
|
3223
|
+
throw error;
|
|
3224
|
+
}
|
|
3225
|
+
}
|
|
3226
|
+
async deleteWallet(params) {
|
|
3227
|
+
try {
|
|
3228
|
+
const res = await this.walletApi.post("/v1/wallet/delete", params, {});
|
|
3229
|
+
return res?.data || {};
|
|
3230
|
+
} catch (error) {
|
|
3231
|
+
console.error("Failed to sync wallet:", error);
|
|
3232
|
+
throw error;
|
|
3233
|
+
}
|
|
3234
|
+
}
|
|
3235
|
+
};
|
|
3236
|
+
|
|
3237
|
+
// src/api/network-data.ts
|
|
3238
|
+
var loadNetworks = (WALLET_DOMAIN) => {
|
|
3239
|
+
return [
|
|
3240
|
+
{
|
|
3241
|
+
chainId: 0,
|
|
3242
|
+
chainIndex: 0,
|
|
3243
|
+
name: "BITCOIN",
|
|
3244
|
+
chainName: "Bitcoin",
|
|
3245
|
+
nativeCurrencyName: "BTC",
|
|
3246
|
+
nativeCurrencySymbol: "BTC",
|
|
3247
|
+
nativeCurrencyDecimals: 8,
|
|
3248
|
+
platformType: "BTC",
|
|
3249
|
+
icon: "https://static.tomo.inc/token/btc.svg",
|
|
3250
|
+
supportSwap: true,
|
|
3251
|
+
supportGift: false,
|
|
3252
|
+
supportHistory: true
|
|
3253
|
+
},
|
|
3254
|
+
{
|
|
3255
|
+
chainId: 3,
|
|
3256
|
+
chainIndex: 300,
|
|
3257
|
+
name: "DOGECOIN",
|
|
3258
|
+
chainName: "Dogecoin",
|
|
3259
|
+
nativeCurrencyName: "DOGE",
|
|
3260
|
+
nativeCurrencySymbol: "DOGE",
|
|
3261
|
+
nativeCurrencyDecimals: 8,
|
|
3262
|
+
blockExplorerUrl: "https://dogechain.info",
|
|
3263
|
+
platformType: "DOGE",
|
|
3264
|
+
icon: "https://static.tomo.inc/token/doge.svg",
|
|
3265
|
+
supportSwap: false,
|
|
3266
|
+
supportGift: true,
|
|
3267
|
+
supportHistory: false
|
|
3268
|
+
},
|
|
3269
|
+
{
|
|
3270
|
+
chainId: 221122420,
|
|
3271
|
+
chainIndex: 22112242e3,
|
|
3272
|
+
name: "DOGEOS_DEVNET",
|
|
3273
|
+
chainName: "DogeOS Devnet",
|
|
3274
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/doge_test`],
|
|
3275
|
+
blockExplorerUrl: "https://blockscout.devnet.doge.xyz",
|
|
3276
|
+
platformType: "EVM",
|
|
3277
|
+
isTestnet: true,
|
|
3278
|
+
icon: "/assets/dogeos.svg",
|
|
3279
|
+
supportSwap: true,
|
|
3280
|
+
supportGift: false,
|
|
3281
|
+
supportHistory: false
|
|
3282
|
+
},
|
|
3283
|
+
{
|
|
3284
|
+
chainId: 1,
|
|
3285
|
+
chainIndex: 100,
|
|
3286
|
+
name: "ETH",
|
|
3287
|
+
chainName: "Ethereum",
|
|
3288
|
+
nativeCurrencyName: "ETH",
|
|
3289
|
+
nativeCurrencySymbol: "ETH",
|
|
3290
|
+
nativeCurrencyDecimals: 18,
|
|
3291
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/eth`],
|
|
3292
|
+
blockExplorerUrl: "https://etherscan.io",
|
|
3293
|
+
platformType: "EVM",
|
|
3294
|
+
icon: "https://static.tomo.inc/token/eth_new.svg",
|
|
3295
|
+
supportSwap: true,
|
|
3296
|
+
supportGift: true,
|
|
3297
|
+
supportHistory: true
|
|
3298
|
+
},
|
|
3299
|
+
{
|
|
3300
|
+
chainId: 501,
|
|
3301
|
+
chainIndex: 50100,
|
|
3302
|
+
name: "SOLANA",
|
|
3303
|
+
chainName: "Solana",
|
|
3304
|
+
nativeCurrencyName: "SOL",
|
|
3305
|
+
nativeCurrencySymbol: "SOL",
|
|
3306
|
+
nativeCurrencyDecimals: 9,
|
|
3307
|
+
rpcUrls: [
|
|
3308
|
+
"https://FLORAL-YOLO-DAYLIGHT.solana-mainnet.quiknode.pro/78b0cda5969b12967ac69cde74e0937ed285d6e5",
|
|
3309
|
+
"https://mainnet.helius-rpc.com/?api-key=ac6f0298-d53b-4a04-8389-7966584a67d1",
|
|
3310
|
+
"https://empty-smart-wildflower.solana-mainnet.quiknode.pro/ebfb8013883fffdaf5a64952fd6c8b2b2bf3cea8"
|
|
3311
|
+
],
|
|
3312
|
+
blockExplorerUrl: "https://solscan.io",
|
|
3313
|
+
platformType: "SOLANA",
|
|
3314
|
+
icon: "https://static.tomo.inc/token/sol.svg",
|
|
3315
|
+
supportSwap: true,
|
|
3316
|
+
supportGift: true,
|
|
3317
|
+
supportHistory: true
|
|
3318
|
+
},
|
|
3319
|
+
{
|
|
3320
|
+
chainId: 56,
|
|
3321
|
+
chainIndex: 5600,
|
|
3322
|
+
name: "BSC",
|
|
3323
|
+
chainName: "BNB Chain",
|
|
3324
|
+
nativeCurrencyName: "BNB",
|
|
3325
|
+
nativeCurrencySymbol: "BNB",
|
|
3326
|
+
nativeCurrencyDecimals: 18,
|
|
3327
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/bsc`],
|
|
3328
|
+
blockExplorerUrl: "https://bscscan.com",
|
|
3329
|
+
platformType: "EVM",
|
|
3330
|
+
icon: "https://static.tomo.inc/token/bsc_new.svg",
|
|
3331
|
+
supportSwap: true,
|
|
3332
|
+
supportGift: true,
|
|
3333
|
+
supportHistory: true
|
|
3334
|
+
},
|
|
3335
|
+
{
|
|
3336
|
+
chainId: 8453,
|
|
3337
|
+
chainIndex: 845300,
|
|
3338
|
+
name: "BASE",
|
|
3339
|
+
chainName: "Base",
|
|
3340
|
+
nativeCurrencyName: "BASE_ETH",
|
|
3341
|
+
nativeCurrencySymbol: "ETH",
|
|
3342
|
+
nativeCurrencyDecimals: 18,
|
|
3343
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/base`],
|
|
3344
|
+
blockExplorerUrl: "https://base.blockscout.com",
|
|
3345
|
+
platformType: "EVM",
|
|
3346
|
+
icon: "https://static.tomo.inc/token/base.svg",
|
|
3347
|
+
supportSwap: true,
|
|
3348
|
+
supportGift: true,
|
|
3349
|
+
supportHistory: true
|
|
3350
|
+
},
|
|
3351
|
+
{
|
|
3352
|
+
chainId: 1100,
|
|
3353
|
+
chainIndex: 11e4,
|
|
3354
|
+
name: "TON",
|
|
3355
|
+
chainName: "TON",
|
|
3356
|
+
nativeCurrencyName: "TON",
|
|
3357
|
+
nativeCurrencySymbol: "TON",
|
|
3358
|
+
nativeCurrencyDecimals: 9,
|
|
3359
|
+
platformType: "TON",
|
|
3360
|
+
icon: "https://static.tomo.inc/token/ton.svg",
|
|
3361
|
+
supportSwap: true,
|
|
3362
|
+
supportGift: true,
|
|
3363
|
+
supportHistory: false
|
|
3364
|
+
},
|
|
3365
|
+
{
|
|
3366
|
+
chainId: 784,
|
|
3367
|
+
chainIndex: 78400,
|
|
3368
|
+
name: "SUI",
|
|
3369
|
+
chainName: "SUI",
|
|
3370
|
+
nativeCurrencyName: "SUI",
|
|
3371
|
+
nativeCurrencySymbol: "SUI",
|
|
3372
|
+
nativeCurrencyDecimals: 9,
|
|
3373
|
+
platformType: "SUI",
|
|
3374
|
+
icon: "https://static.tomo.inc/token/sui.svg",
|
|
3375
|
+
supportSwap: true,
|
|
3376
|
+
supportGift: true,
|
|
3377
|
+
supportHistory: true
|
|
3378
|
+
},
|
|
3379
|
+
{
|
|
3380
|
+
chainId: 42161,
|
|
3381
|
+
chainIndex: 4216100,
|
|
3382
|
+
name: "ARBITRUM",
|
|
3383
|
+
chainName: "Arbitrum One",
|
|
3384
|
+
nativeCurrencyName: "ARB_ETH",
|
|
3385
|
+
nativeCurrencySymbol: "ETH",
|
|
3386
|
+
nativeCurrencyDecimals: 18,
|
|
3387
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/arbitrum_one`],
|
|
3388
|
+
blockExplorerUrl: "https://arbiscan.io",
|
|
3389
|
+
platformType: "EVM",
|
|
3390
|
+
icon: "https://static.tomo.inc/token/arb.jpeg",
|
|
3391
|
+
supportSwap: true,
|
|
3392
|
+
supportGift: true,
|
|
3393
|
+
supportHistory: true
|
|
3394
|
+
},
|
|
3395
|
+
{
|
|
3396
|
+
chainId: 59144,
|
|
3397
|
+
chainIndex: 5914400,
|
|
3398
|
+
name: "LINEA",
|
|
3399
|
+
chainName: "Linea",
|
|
3400
|
+
nativeCurrencyName: "LINEA_ETH",
|
|
3401
|
+
nativeCurrencySymbol: "ETH",
|
|
3402
|
+
nativeCurrencyDecimals: 18,
|
|
3403
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/linea`],
|
|
3404
|
+
blockExplorerUrl: "https://lineascan.build",
|
|
3405
|
+
platformType: "EVM",
|
|
3406
|
+
icon: "https://static.tomo.inc/token/linea.svg",
|
|
3407
|
+
supportSwap: true,
|
|
3408
|
+
supportGift: true,
|
|
3409
|
+
supportHistory: true
|
|
3410
|
+
},
|
|
3411
|
+
{
|
|
3412
|
+
chainId: 10,
|
|
3413
|
+
chainIndex: 1e3,
|
|
3414
|
+
name: "OPTIMISM",
|
|
3415
|
+
chainName: "Optimism",
|
|
3416
|
+
nativeCurrencyName: "OP_ETH",
|
|
3417
|
+
nativeCurrencySymbol: "ETH",
|
|
3418
|
+
nativeCurrencyDecimals: 18,
|
|
3419
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/optimism`],
|
|
3420
|
+
blockExplorerUrl: "https://optimistic.etherscan.io",
|
|
3421
|
+
platformType: "EVM",
|
|
3422
|
+
icon: "https://static.tomo.inc/token/op.svg",
|
|
3423
|
+
supportSwap: true,
|
|
3424
|
+
supportGift: true,
|
|
3425
|
+
supportHistory: true
|
|
3426
|
+
},
|
|
3427
|
+
{
|
|
3428
|
+
chainId: 137,
|
|
3429
|
+
chainIndex: 13700,
|
|
3430
|
+
name: "POLYGON_POS",
|
|
3431
|
+
chainName: "Polygon",
|
|
3432
|
+
nativeCurrencyName: "POL",
|
|
3433
|
+
nativeCurrencySymbol: "POL",
|
|
3434
|
+
nativeCurrencyDecimals: 18,
|
|
3435
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/polygon`],
|
|
3436
|
+
blockExplorerUrl: "https://polygonscan.com",
|
|
3437
|
+
platformType: "EVM",
|
|
3438
|
+
icon: "https://static.tomo.inc/token/polygon.svg",
|
|
3439
|
+
supportSwap: true,
|
|
3440
|
+
supportGift: true,
|
|
3441
|
+
supportHistory: true
|
|
3442
|
+
},
|
|
3443
|
+
{
|
|
3444
|
+
chainId: 81457,
|
|
3445
|
+
chainIndex: 8145700,
|
|
3446
|
+
name: "BLAST",
|
|
3447
|
+
chainName: "Blast",
|
|
3448
|
+
nativeCurrencyName: "BLAST_ETH",
|
|
3449
|
+
nativeCurrencySymbol: "ETH",
|
|
3450
|
+
nativeCurrencyDecimals: 18,
|
|
3451
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/blast`],
|
|
3452
|
+
blockExplorerUrl: "https://blastscan.io",
|
|
3453
|
+
platformType: "EVM",
|
|
3454
|
+
icon: "https://static.tomo.inc/token/blast.svg",
|
|
3455
|
+
supportSwap: true,
|
|
3456
|
+
supportGift: true,
|
|
3457
|
+
supportHistory: true
|
|
3458
|
+
},
|
|
3459
|
+
{
|
|
3460
|
+
chainId: 534352,
|
|
3461
|
+
chainIndex: 53435200,
|
|
3462
|
+
name: "SCROLL",
|
|
3463
|
+
chainName: "Scroll",
|
|
3464
|
+
nativeCurrencyName: "SCROLL_ETH",
|
|
3465
|
+
nativeCurrencySymbol: "ETH",
|
|
3466
|
+
nativeCurrencyDecimals: 18,
|
|
3467
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/scroll`],
|
|
3468
|
+
blockExplorerUrl: "https://scrollscan.com",
|
|
3469
|
+
platformType: "EVM",
|
|
3470
|
+
icon: "https://static.tomo.inc/token/scroll.svg",
|
|
3471
|
+
supportSwap: true,
|
|
3472
|
+
supportGift: true,
|
|
3473
|
+
supportHistory: true
|
|
3474
|
+
},
|
|
3475
|
+
{
|
|
3476
|
+
chainId: 43114,
|
|
3477
|
+
chainIndex: 4311400,
|
|
3478
|
+
name: "AVAX",
|
|
3479
|
+
chainName: "Avalanche C",
|
|
3480
|
+
nativeCurrencyName: "AVAX",
|
|
3481
|
+
nativeCurrencySymbol: "AVAX",
|
|
3482
|
+
nativeCurrencyDecimals: 18,
|
|
3483
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/avalanche`],
|
|
3484
|
+
blockExplorerUrl: "https://snowtrace.io",
|
|
3485
|
+
platformType: "EVM",
|
|
3486
|
+
icon: "https://static.tomo.inc/token/avalanche.svg",
|
|
3487
|
+
supportSwap: true,
|
|
3488
|
+
supportGift: false,
|
|
3489
|
+
supportHistory: true
|
|
3490
|
+
},
|
|
3491
|
+
{
|
|
3492
|
+
chainId: 324,
|
|
3493
|
+
chainIndex: 32400,
|
|
3494
|
+
name: "ZKSYNC",
|
|
3495
|
+
chainName: "zkSync Era",
|
|
3496
|
+
nativeCurrencyName: "ZKSYNC_ETH",
|
|
3497
|
+
nativeCurrencySymbol: "ETH",
|
|
3498
|
+
nativeCurrencyDecimals: 18,
|
|
3499
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/zk_sync`],
|
|
3500
|
+
blockExplorerUrl: "https://mainnet.era.zksync.io",
|
|
3501
|
+
platformType: "EVM",
|
|
3502
|
+
icon: "https://static.tomo.inc/token/zksync.png",
|
|
3503
|
+
supportSwap: false,
|
|
3504
|
+
supportGift: false,
|
|
3505
|
+
supportHistory: true
|
|
3506
|
+
},
|
|
3507
|
+
{
|
|
3508
|
+
chainId: 60808,
|
|
3509
|
+
chainIndex: 6080800,
|
|
3510
|
+
name: "BOB",
|
|
3511
|
+
chainName: "BOB",
|
|
3512
|
+
nativeCurrencyName: "BOB_ETH",
|
|
3513
|
+
nativeCurrencySymbol: "ETH",
|
|
3514
|
+
nativeCurrencyDecimals: 18,
|
|
3515
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/bob`],
|
|
3516
|
+
blockExplorerUrl: "https://rpc.gobob.xyz",
|
|
3517
|
+
platformType: "EVM",
|
|
3518
|
+
icon: "https://static.tomo.inc/token/bob.png",
|
|
3519
|
+
supportSwap: false,
|
|
3520
|
+
supportGift: false,
|
|
3521
|
+
supportHistory: true
|
|
3522
|
+
},
|
|
3523
|
+
{
|
|
3524
|
+
chainId: 8333,
|
|
3525
|
+
chainIndex: 833300,
|
|
3526
|
+
name: "B3",
|
|
3527
|
+
chainName: "B3 Mainnet",
|
|
3528
|
+
nativeCurrencyName: "B3_ETH",
|
|
3529
|
+
nativeCurrencySymbol: "ETH",
|
|
3530
|
+
nativeCurrencyDecimals: 18,
|
|
3531
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/b3`],
|
|
3532
|
+
blockExplorerUrl: "https://mainnet-rpc.b3.fun/http",
|
|
3533
|
+
platformType: "EVM",
|
|
3534
|
+
icon: "https://static.tomo.inc/token/b3.svg",
|
|
3535
|
+
supportSwap: false,
|
|
3536
|
+
supportGift: true,
|
|
3537
|
+
supportHistory: false
|
|
3538
|
+
},
|
|
3539
|
+
{
|
|
3540
|
+
chainId: 223,
|
|
3541
|
+
chainIndex: 22300,
|
|
3542
|
+
name: "B2",
|
|
3543
|
+
chainName: "B\xB2 Network",
|
|
3544
|
+
nativeCurrencyName: "B2_BTC",
|
|
3545
|
+
nativeCurrencySymbol: "BTC",
|
|
3546
|
+
nativeCurrencyDecimals: 18,
|
|
3547
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/b2`],
|
|
3548
|
+
blockExplorerUrl: "https://explorer.bsquared.network",
|
|
3549
|
+
platformType: "EVM",
|
|
3550
|
+
icon: "https://static.tomo.inc/token/b2.svg",
|
|
3551
|
+
supportSwap: false,
|
|
3552
|
+
supportGift: true,
|
|
3553
|
+
supportHistory: false
|
|
3554
|
+
},
|
|
3555
|
+
{
|
|
3556
|
+
chainId: 200901,
|
|
3557
|
+
chainIndex: 20090100,
|
|
3558
|
+
name: "BITLAYER",
|
|
3559
|
+
chainName: "Bitlayer",
|
|
3560
|
+
nativeCurrencyName: "BITLAYER_BTC",
|
|
3561
|
+
nativeCurrencySymbol: "BTC",
|
|
3562
|
+
nativeCurrencyDecimals: 18,
|
|
3563
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/bit_layer`],
|
|
3564
|
+
blockExplorerUrl: "https://rpc.bitlayer.org",
|
|
3565
|
+
platformType: "EVM",
|
|
3566
|
+
icon: "https://static.tomo.inc/token/bitlayer.svg",
|
|
3567
|
+
supportSwap: false,
|
|
3568
|
+
supportGift: true,
|
|
3569
|
+
supportHistory: true
|
|
3570
|
+
},
|
|
3571
|
+
{
|
|
3572
|
+
chainId: 19484,
|
|
3573
|
+
chainIndex: 1948400,
|
|
3574
|
+
name: "TRON",
|
|
3575
|
+
chainName: "Tron",
|
|
3576
|
+
nativeCurrencyName: "TRX",
|
|
3577
|
+
nativeCurrencySymbol: "TRX",
|
|
3578
|
+
nativeCurrencyDecimals: 6,
|
|
3579
|
+
platformType: "TRON",
|
|
3580
|
+
blockExplorerUrl: "https://tronscan.org",
|
|
3581
|
+
icon: "https://static.tomo.inc/token/tron.svg",
|
|
3582
|
+
supportSwap: true,
|
|
3583
|
+
supportGift: false,
|
|
3584
|
+
supportHistory: true
|
|
3585
|
+
},
|
|
3586
|
+
{
|
|
3587
|
+
chainId: 4,
|
|
3588
|
+
chainIndex: 400,
|
|
3589
|
+
name: "COSMOS_HUB",
|
|
3590
|
+
chainName: "Cosmos Hub",
|
|
3591
|
+
nativeCurrencyName: "ATOM",
|
|
3592
|
+
nativeCurrencySymbol: "ATOM",
|
|
3593
|
+
nativeCurrencyDecimals: 6,
|
|
3594
|
+
platformType: "COSMOS",
|
|
3595
|
+
icon: "https://static.tomo.inc/token/cosmos.png",
|
|
3596
|
+
supportSwap: false,
|
|
3597
|
+
supportGift: false,
|
|
3598
|
+
supportHistory: false
|
|
3599
|
+
},
|
|
3600
|
+
{
|
|
3601
|
+
chainId: 5545,
|
|
3602
|
+
chainIndex: 554500,
|
|
3603
|
+
name: "DUCKCHAIN",
|
|
3604
|
+
chainName: "DuckChain Mainnet",
|
|
3605
|
+
nativeCurrencyName: "DUCKCHAIN_TON",
|
|
3606
|
+
nativeCurrencySymbol: "TON",
|
|
3607
|
+
nativeCurrencyDecimals: 18,
|
|
3608
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/duck`],
|
|
3609
|
+
blockExplorerUrl: "https://scan.duckchain.io",
|
|
3610
|
+
platformType: "EVM",
|
|
3611
|
+
icon: "https://static.tomo.inc/token/duckchain.svg",
|
|
3612
|
+
supportSwap: false,
|
|
3613
|
+
supportGift: true,
|
|
3614
|
+
supportHistory: false
|
|
3615
|
+
},
|
|
3616
|
+
{
|
|
3617
|
+
chainId: 47763,
|
|
3618
|
+
chainIndex: 4776300,
|
|
3619
|
+
name: "NEOX",
|
|
3620
|
+
chainName: "Neo X Mainnet",
|
|
3621
|
+
nativeCurrencyName: "GAS",
|
|
3622
|
+
nativeCurrencySymbol: "GAS",
|
|
3623
|
+
nativeCurrencyDecimals: 18,
|
|
3624
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/neox`],
|
|
3625
|
+
blockExplorerUrl: "https://neotube.io",
|
|
3626
|
+
platformType: "EVM",
|
|
3627
|
+
icon: "https://static.tomo.inc/token/neo.jpg",
|
|
3628
|
+
supportSwap: false,
|
|
3629
|
+
supportGift: false,
|
|
3630
|
+
supportHistory: false
|
|
3631
|
+
},
|
|
3632
|
+
{
|
|
3633
|
+
chainId: 4200,
|
|
3634
|
+
chainIndex: 42e4,
|
|
3635
|
+
name: "MERLIN",
|
|
3636
|
+
chainName: "Merlin Chain",
|
|
3637
|
+
nativeCurrencyName: "MERLIN_BTC",
|
|
3638
|
+
nativeCurrencySymbol: "BTC",
|
|
3639
|
+
nativeCurrencyDecimals: 18,
|
|
3640
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/merlin`],
|
|
3641
|
+
blockExplorerUrl: "https://scan.merlinchain.io",
|
|
3642
|
+
platformType: "EVM",
|
|
3643
|
+
icon: "https://static.tomo.inc/token/merlin.png",
|
|
3644
|
+
supportSwap: false,
|
|
3645
|
+
supportGift: true,
|
|
3646
|
+
supportHistory: true
|
|
3647
|
+
},
|
|
3648
|
+
{
|
|
3649
|
+
chainId: 1329,
|
|
3650
|
+
chainIndex: 132900,
|
|
3651
|
+
name: "SEI",
|
|
3652
|
+
chainName: "Sei EVM",
|
|
3653
|
+
nativeCurrencyName: "SEI",
|
|
3654
|
+
nativeCurrencySymbol: "SEI",
|
|
3655
|
+
nativeCurrencyDecimals: 18,
|
|
3656
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/sei`],
|
|
3657
|
+
blockExplorerUrl: "https://seitrace.com",
|
|
3658
|
+
platformType: "EVM",
|
|
3659
|
+
icon: "https://static.tomo.inc/token/sei.svg",
|
|
3660
|
+
supportSwap: false,
|
|
3661
|
+
supportGift: false,
|
|
3662
|
+
supportHistory: false
|
|
3663
|
+
},
|
|
3664
|
+
{
|
|
3665
|
+
chainId: 480,
|
|
3666
|
+
chainIndex: 48e3,
|
|
3667
|
+
name: "WORLD_CHAIN",
|
|
3668
|
+
chainName: "World Chain",
|
|
3669
|
+
nativeCurrencyName: "WORLDCHAIN_ETH",
|
|
3670
|
+
nativeCurrencySymbol: "ETH",
|
|
3671
|
+
nativeCurrencyDecimals: 18,
|
|
3672
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/world`],
|
|
3673
|
+
blockExplorerUrl: "https://worldchain-mainnet.explorer.alchemy.com",
|
|
3674
|
+
platformType: "EVM",
|
|
3675
|
+
icon: "https://static.tomo.inc/token/world-chain.jpg",
|
|
3676
|
+
supportSwap: false,
|
|
3677
|
+
supportGift: false,
|
|
3678
|
+
supportHistory: false
|
|
3679
|
+
},
|
|
3680
|
+
{
|
|
3681
|
+
chainId: 2649,
|
|
3682
|
+
chainIndex: 264900,
|
|
3683
|
+
name: "AILAYER",
|
|
3684
|
+
chainName: "AILayer",
|
|
3685
|
+
nativeCurrencyName: "AILAYER_BTC",
|
|
3686
|
+
nativeCurrencySymbol: "BTC",
|
|
3687
|
+
nativeCurrencyDecimals: 18,
|
|
3688
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/ai_layer`],
|
|
3689
|
+
blockExplorerUrl: "https://mainnet-explorer.ailayer.xyz",
|
|
3690
|
+
platformType: "EVM",
|
|
3691
|
+
icon: "https://static.tomo.inc/token/ailayer.svg",
|
|
3692
|
+
supportSwap: false,
|
|
3693
|
+
supportGift: true,
|
|
3694
|
+
supportHistory: false
|
|
3695
|
+
},
|
|
3696
|
+
{
|
|
3697
|
+
chainId: 227,
|
|
3698
|
+
chainIndex: 22700,
|
|
3699
|
+
name: "PROM",
|
|
3700
|
+
chainName: "Prom",
|
|
3701
|
+
nativeCurrencyName: "PROM",
|
|
3702
|
+
nativeCurrencySymbol: "PROM",
|
|
3703
|
+
nativeCurrencyDecimals: 18,
|
|
3704
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/prom_test`],
|
|
3705
|
+
blockExplorerUrl: "https://promscan.io",
|
|
3706
|
+
platformType: "EVM",
|
|
3707
|
+
icon: "https://static.tomo.inc/token/prom-testnet.svg",
|
|
3708
|
+
supportSwap: false,
|
|
3709
|
+
supportGift: false,
|
|
3710
|
+
supportHistory: false
|
|
3711
|
+
},
|
|
3712
|
+
{
|
|
3713
|
+
chainId: 1625,
|
|
3714
|
+
chainIndex: 162500,
|
|
3715
|
+
name: "GRAVITY",
|
|
3716
|
+
chainName: "Gravity Alpha",
|
|
3717
|
+
nativeCurrencyName: "G",
|
|
3718
|
+
nativeCurrencySymbol: "G",
|
|
3719
|
+
nativeCurrencyDecimals: 18,
|
|
3720
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/gravity`],
|
|
3721
|
+
blockExplorerUrl: "https://explorer.gravity.xyz",
|
|
3722
|
+
platformType: "EVM",
|
|
3723
|
+
icon: "https://static.tomo.inc/token/gravity.jpg",
|
|
3724
|
+
supportSwap: false,
|
|
3725
|
+
supportGift: true,
|
|
3726
|
+
supportHistory: false
|
|
3727
|
+
},
|
|
3728
|
+
{
|
|
3729
|
+
chainId: 204,
|
|
3730
|
+
chainIndex: 20400,
|
|
3731
|
+
name: "OPBNB",
|
|
3732
|
+
chainName: "opBNB",
|
|
3733
|
+
nativeCurrencyName: "OP_BNB",
|
|
3734
|
+
nativeCurrencySymbol: "BNB",
|
|
3735
|
+
nativeCurrencyDecimals: 18,
|
|
3736
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/op_bnb`],
|
|
3737
|
+
blockExplorerUrl: "https://opbnb.bscscan.com",
|
|
3738
|
+
platformType: "EVM",
|
|
3739
|
+
icon: "https://static.tomo.inc/token/opbnb.svg",
|
|
3740
|
+
supportSwap: false,
|
|
3741
|
+
supportGift: false,
|
|
3742
|
+
supportHistory: false
|
|
3743
|
+
},
|
|
3744
|
+
{
|
|
3745
|
+
chainId: 21e6,
|
|
3746
|
+
chainIndex: 21e8,
|
|
3747
|
+
name: "CORN",
|
|
3748
|
+
chainName: "Corn",
|
|
3749
|
+
nativeCurrencyName: "BTCN",
|
|
3750
|
+
nativeCurrencySymbol: "BTCN",
|
|
3751
|
+
nativeCurrencyDecimals: 18,
|
|
3752
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/corn`],
|
|
3753
|
+
blockExplorerUrl: "https://maizenet-explorer.usecorn.com",
|
|
3754
|
+
platformType: "EVM",
|
|
3755
|
+
icon: "https://static.tomo.inc/token/corn-logo.svg",
|
|
3756
|
+
supportSwap: false,
|
|
3757
|
+
supportGift: true,
|
|
3758
|
+
supportHistory: false
|
|
3759
|
+
},
|
|
3760
|
+
{
|
|
3761
|
+
chainId: 126,
|
|
3762
|
+
chainIndex: 12600,
|
|
3763
|
+
name: "MOVEMENT_MAINNET",
|
|
3764
|
+
chainName: "Movement Mainnet",
|
|
3765
|
+
nativeCurrencyName: "MOVE",
|
|
3766
|
+
nativeCurrencySymbol: "MOVE",
|
|
3767
|
+
nativeCurrencyDecimals: 8,
|
|
3768
|
+
rpcUrls: ["https://mainnet.movementnetwork.xyz/v1"],
|
|
3769
|
+
blockExplorerUrl: "https://explorer.movementnetwork.xyz",
|
|
3770
|
+
platformType: "APTOS",
|
|
3771
|
+
icon: "https://static.tomo.inc/token/movement.svg",
|
|
3772
|
+
supportSwap: false,
|
|
3773
|
+
supportGift: false,
|
|
3774
|
+
supportHistory: false
|
|
3775
|
+
},
|
|
3776
|
+
{
|
|
3777
|
+
chainId: 80094,
|
|
3778
|
+
chainIndex: 8009400,
|
|
3779
|
+
name: "BERACHAIN_MAINNET",
|
|
3780
|
+
chainName: "Berachain Mainnet",
|
|
3781
|
+
nativeCurrencyName: "BERA Token",
|
|
3782
|
+
nativeCurrencySymbol: "BERA",
|
|
3783
|
+
nativeCurrencyDecimals: 18,
|
|
3784
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/bera`],
|
|
3785
|
+
blockExplorerUrl: "https://berascan.com",
|
|
3786
|
+
platformType: "EVM",
|
|
3787
|
+
icon: "https://static.tomo.inc/token/berachain.svg",
|
|
3788
|
+
supportSwap: false,
|
|
3789
|
+
supportGift: false,
|
|
3790
|
+
supportHistory: false
|
|
3791
|
+
},
|
|
3792
|
+
{
|
|
3793
|
+
chainId: 1514,
|
|
3794
|
+
chainIndex: 151400,
|
|
3795
|
+
name: "STORY_MAINNET",
|
|
3796
|
+
chainName: "Story Mainnet",
|
|
3797
|
+
nativeCurrencyName: "IP",
|
|
3798
|
+
nativeCurrencySymbol: "IP",
|
|
3799
|
+
nativeCurrencyDecimals: 18,
|
|
3800
|
+
rpcUrls: [`${WALLET_DOMAIN}/rpc/v1/story`],
|
|
3801
|
+
blockExplorerUrl: "https://mainnet.storyscan.xyz",
|
|
3802
|
+
platformType: "EVM",
|
|
3803
|
+
icon: "https://static.tomo.inc/token/story.jpg",
|
|
3804
|
+
supportSwap: false,
|
|
3805
|
+
supportGift: false,
|
|
3806
|
+
supportHistory: false
|
|
3807
|
+
}
|
|
3808
|
+
];
|
|
3809
|
+
};
|
|
3810
|
+
var NetworkAPIs = class _NetworkAPIs extends BasePublicService {
|
|
3811
|
+
static instance;
|
|
3812
|
+
chains = [];
|
|
3813
|
+
currentChainId = "1";
|
|
3814
|
+
constructor(apiBase, tomoAppInfo) {
|
|
3815
|
+
super(apiBase, tomoAppInfo);
|
|
3816
|
+
const chains = loadNetworks(apiBase.rpcBaseUrl);
|
|
3817
|
+
this.chains = chains.map((chain) => {
|
|
3818
|
+
const nativeCurrency = {
|
|
3819
|
+
symbol: chain.nativeCurrencySymbol || "",
|
|
3820
|
+
decimals: chain.nativeCurrencyDecimals || 18,
|
|
3821
|
+
name: chain.nativeCurrencyName || ""
|
|
3822
|
+
};
|
|
3823
|
+
delete chain.nativeCurrencySymbol;
|
|
3824
|
+
delete chain.nativeCurrencyDecimals;
|
|
3825
|
+
delete chain.nativeCurrencyName;
|
|
3826
|
+
return {
|
|
3827
|
+
...chain,
|
|
3828
|
+
nativeCurrency
|
|
3829
|
+
};
|
|
3830
|
+
});
|
|
3831
|
+
this.currentChainId = "1";
|
|
3832
|
+
}
|
|
3833
|
+
static getInstance(apiBase, tomoAppInfo) {
|
|
3834
|
+
if (!this.instance) {
|
|
3835
|
+
this.instance = new _NetworkAPIs(apiBase, tomoAppInfo);
|
|
3836
|
+
}
|
|
3837
|
+
return this.instance;
|
|
3838
|
+
}
|
|
3839
|
+
getCacheId(chainType) {
|
|
3840
|
+
return `tomo-${chainType}-currentChainId`;
|
|
3841
|
+
}
|
|
3842
|
+
getAllNetworks(chainType) {
|
|
3843
|
+
if (chainType === "") {
|
|
3844
|
+
return this.chains;
|
|
3845
|
+
}
|
|
3846
|
+
return this.chains.filter((chain) => chain.platformType === chainType.toUpperCase());
|
|
3847
|
+
}
|
|
3848
|
+
async getCurrentNetwork(chainType) {
|
|
3849
|
+
if (!walletUtils.SupportedChainTypes?.[chainType]) {
|
|
3850
|
+
throw new Error(`Chain ${chainType} is not supported`);
|
|
3851
|
+
}
|
|
3852
|
+
const cacheId = this.getCacheId(chainType);
|
|
3853
|
+
const currentChainId = walletUtils.cache.get(cacheId);
|
|
3854
|
+
return currentChainId || walletUtils.SupportedChainTypes?.[chainType]?.chainId || this.currentChainId || "";
|
|
3855
|
+
}
|
|
3856
|
+
async setCurrentNetwork(chainType, chainId) {
|
|
3857
|
+
if (chainType && !walletUtils.SupportedChainTypes?.[chainType]) {
|
|
3858
|
+
throw new Error(`Chain ${chainType} is not supported`);
|
|
3859
|
+
}
|
|
3860
|
+
this.currentChainId = chainId;
|
|
3861
|
+
const cacheId = this.getCacheId(chainType);
|
|
3862
|
+
const isTemp = false;
|
|
3863
|
+
walletUtils.cache.set(cacheId, chainId, isTemp);
|
|
3864
|
+
}
|
|
3865
|
+
getNetworkByChainId(chainId) {
|
|
3866
|
+
return this.chains.find((chain) => chain.chainId === Number(chainId));
|
|
3867
|
+
}
|
|
3868
|
+
getNetworkByChainIndex(chainIndex) {
|
|
3869
|
+
return this.chains.find((chain) => chain.chainIndex === chainIndex);
|
|
3870
|
+
}
|
|
3871
|
+
};
|
|
3872
|
+
|
|
3873
|
+
// src/api/index.ts
|
|
3874
|
+
function tomoPublicApiService(publicApiBase, tomoAppInfo) {
|
|
3875
|
+
return {
|
|
3876
|
+
tokenAPIs: TokenAPIs.getInstance(publicApiBase, tomoAppInfo),
|
|
3877
|
+
transactionAPIs: TransactionAPIs.getInstance(publicApiBase, tomoAppInfo),
|
|
3878
|
+
networkAPIs: NetworkAPIs.getInstance(publicApiBase, tomoAppInfo),
|
|
3879
|
+
walletAPIs: WalletAPIs.getInstance(publicApiBase, tomoAppInfo)
|
|
3880
|
+
};
|
|
3881
|
+
}
|
|
3882
|
+
|
|
3883
|
+
// src/base/service.ts
|
|
3884
|
+
var BaseService = class {
|
|
3885
|
+
isDappConnected;
|
|
3886
|
+
approveParams;
|
|
3887
|
+
accountInfo;
|
|
3888
|
+
networks;
|
|
3889
|
+
tokens;
|
|
3890
|
+
transactions;
|
|
3891
|
+
constructor(tomoAppInfo, accountInfo) {
|
|
3892
|
+
if (!tomoAppInfo.tomoStage || !CONFIG[tomoAppInfo.tomoStage]) {
|
|
3893
|
+
throw new Error("Tomo stage is required");
|
|
3894
|
+
}
|
|
3895
|
+
const baseUrlConfig = CONFIG[tomoAppInfo.tomoStage];
|
|
3896
|
+
const { tokenAPIs, transactionAPIs, networkAPIs } = tomoPublicApiService(baseUrlConfig, tomoAppInfo);
|
|
3897
|
+
this.accountInfo = accountInfo;
|
|
3898
|
+
this.networks = new Networks(networkAPIs);
|
|
3899
|
+
this.tokens = new Tokens(tokenAPIs);
|
|
3900
|
+
this.transactions = new Transactions(transactionAPIs);
|
|
3901
|
+
this.isDappConnected = false;
|
|
3902
|
+
}
|
|
3903
|
+
async setApproveParams(params) {
|
|
3904
|
+
this.approveParams = params;
|
|
3905
|
+
}
|
|
3906
|
+
};
|
|
3907
|
+
function getRPCClient(network) {
|
|
3908
|
+
const { chainId, name, rpcUrls, nativeCurrencyDecimals, nativeCurrencyName, nativeCurrencySymbol } = network;
|
|
3909
|
+
const myCustomChain = {
|
|
3910
|
+
id: Number(chainId) || chainId,
|
|
3911
|
+
name,
|
|
3912
|
+
nativeCurrency: {
|
|
3913
|
+
name: nativeCurrencyName,
|
|
3914
|
+
symbol: nativeCurrencySymbol,
|
|
3915
|
+
decimals: nativeCurrencyDecimals
|
|
3916
|
+
},
|
|
3917
|
+
rpcUrls: {
|
|
3918
|
+
default: {
|
|
3919
|
+
http: rpcUrls,
|
|
3920
|
+
webSocket: []
|
|
3921
|
+
},
|
|
3922
|
+
public: {
|
|
3923
|
+
http: rpcUrls,
|
|
3924
|
+
webSocket: []
|
|
3925
|
+
}
|
|
3926
|
+
},
|
|
3927
|
+
blockExplorers: {
|
|
3928
|
+
default: {
|
|
3929
|
+
name: "Explorer",
|
|
3930
|
+
url: rpcUrls[0]
|
|
3931
|
+
}
|
|
3932
|
+
}
|
|
3933
|
+
};
|
|
3934
|
+
const rpcClient = viem.createPublicClient({
|
|
3935
|
+
chain: myCustomChain,
|
|
3936
|
+
pollingInterval: 1e4,
|
|
3937
|
+
cacheTime: 1e4,
|
|
3938
|
+
transport: viem.http()
|
|
3939
|
+
});
|
|
3940
|
+
return { rpcClient };
|
|
3941
|
+
}
|
|
3942
|
+
|
|
3943
|
+
// src/types/account.ts
|
|
3944
|
+
var AccountType = /* @__PURE__ */ ((AccountType2) => {
|
|
3945
|
+
AccountType2["EOA"] = "EOA";
|
|
3946
|
+
AccountType2["SOCIAL"] = "SOCIAL";
|
|
3947
|
+
return AccountType2;
|
|
3948
|
+
})(AccountType || {});
|
|
3949
|
+
|
|
3950
|
+
// src/types/wallet.ts
|
|
3951
|
+
var TxTypes = /* @__PURE__ */ ((TxTypes2) => {
|
|
3952
|
+
TxTypes2[TxTypes2["swap"] = 1] = "swap";
|
|
3953
|
+
TxTypes2[TxTypes2["bridge"] = 2] = "bridge";
|
|
3954
|
+
TxTypes2[TxTypes2["receive"] = 31] = "receive";
|
|
3955
|
+
TxTypes2[TxTypes2["send"] = 32] = "send";
|
|
3956
|
+
TxTypes2[TxTypes2["approve"] = 4] = "approve";
|
|
3957
|
+
TxTypes2[TxTypes2["contractInteraction"] = 5] = "contractInteraction";
|
|
3958
|
+
TxTypes2[TxTypes2["redPocket"] = 6] = "redPocket";
|
|
3959
|
+
return TxTypes2;
|
|
3960
|
+
})(TxTypes || {});
|
|
3961
|
+
|
|
3962
|
+
// src/evm/utils.ts
|
|
3963
|
+
var isEvmChain = (network) => {
|
|
3964
|
+
return network && network?.platformType === "EVM";
|
|
3965
|
+
};
|
|
3966
|
+
var getAllTypeChainIds = ({ chainId, chainType }) => {
|
|
3967
|
+
if (viem.isHex(chainId)) {
|
|
3968
|
+
const chainIdHex2 = chainId;
|
|
3969
|
+
chainId = viem.fromHex(chainId, "number").toString();
|
|
3970
|
+
return {
|
|
3971
|
+
chainId,
|
|
3972
|
+
chainIdHex: chainIdHex2,
|
|
3973
|
+
chainUid: `${chainType}:${chainId}`
|
|
3974
|
+
};
|
|
3975
|
+
}
|
|
3976
|
+
const chainIdHex = viem.toHex(Number(chainId));
|
|
3977
|
+
return {
|
|
3978
|
+
chainId,
|
|
3979
|
+
chainIdHex,
|
|
3980
|
+
chainUid: `${chainType}:${chainId}`
|
|
3981
|
+
};
|
|
3982
|
+
};
|
|
3983
|
+
function createErc20TxData(params, token) {
|
|
3984
|
+
const { decimals, address: tokenAddress } = token;
|
|
3985
|
+
const value = viem.parseUnits(params?.amount.toString(), decimals);
|
|
3986
|
+
const callData = viem.encodeFunctionData({
|
|
3987
|
+
abi: viem.erc20Abi,
|
|
3988
|
+
functionName: "transfer",
|
|
3989
|
+
args: [params.to, value]
|
|
3990
|
+
});
|
|
3991
|
+
return {
|
|
3992
|
+
...params,
|
|
3993
|
+
...{ amount: 0, data: callData, to: tokenAddress }
|
|
3994
|
+
};
|
|
3995
|
+
}
|
|
3996
|
+
|
|
3997
|
+
// src/evm/service.ts
|
|
3998
|
+
var EvmService = class _EvmService extends BaseService {
|
|
3999
|
+
static instance;
|
|
4000
|
+
chainType;
|
|
4001
|
+
constructor(chainType, accountInfo, tomoAppInfo) {
|
|
4002
|
+
super(tomoAppInfo, accountInfo);
|
|
4003
|
+
this.chainType = chainType;
|
|
4004
|
+
}
|
|
4005
|
+
static getInstance(chainType, accountInfo, tomoAppInfo) {
|
|
4006
|
+
if (!_EvmService.instance) {
|
|
4007
|
+
_EvmService.instance = new _EvmService(chainType, accountInfo, tomoAppInfo);
|
|
4008
|
+
}
|
|
4009
|
+
return _EvmService.instance;
|
|
4010
|
+
}
|
|
4011
|
+
async eth_requestAccounts() {
|
|
4012
|
+
const res = await this.eth_accounts();
|
|
4013
|
+
return res;
|
|
4014
|
+
}
|
|
4015
|
+
async eth_accounts() {
|
|
4016
|
+
const accounts = await this.accountInfo.getCurrent();
|
|
4017
|
+
return accounts.map((account) => account.address);
|
|
4018
|
+
}
|
|
4019
|
+
async eth_chainId() {
|
|
4020
|
+
const chainType = this.chainType;
|
|
4021
|
+
const currentNetwork = await this.getCurrentChain();
|
|
4022
|
+
const { chainIdHex } = getAllTypeChainIds({
|
|
4023
|
+
chainId: currentNetwork?.chainId,
|
|
4024
|
+
chainType
|
|
4025
|
+
});
|
|
4026
|
+
return chainIdHex;
|
|
4027
|
+
}
|
|
4028
|
+
async getCurrentChain() {
|
|
4029
|
+
this.networks.setChainType(this.chainType);
|
|
4030
|
+
const currentNetwork = await this.networks.getCurrentNetwork();
|
|
4031
|
+
return currentNetwork;
|
|
4032
|
+
}
|
|
4033
|
+
async wallet_switchEthereumChain(networks) {
|
|
4034
|
+
const { chainId } = networks[0];
|
|
4035
|
+
const isSupported = await this.isChainSupported(chainId);
|
|
4036
|
+
if (!isSupported) {
|
|
4037
|
+
throw new Error(`Chain ${chainId} is not supported`);
|
|
4038
|
+
}
|
|
4039
|
+
return await this.networks.setCurrentNetwork(chainId);
|
|
4040
|
+
}
|
|
4041
|
+
//evm chains
|
|
4042
|
+
async isChainSupported(chainId) {
|
|
4043
|
+
const chainType = this.chainType;
|
|
4044
|
+
const res = getAllTypeChainIds({ chainId, chainType });
|
|
4045
|
+
if (!res.chainId) {
|
|
4046
|
+
return false;
|
|
4047
|
+
}
|
|
4048
|
+
const chainInfo = await this.networks.getNetworkByChainId(res.chainId);
|
|
4049
|
+
if (!chainInfo) {
|
|
4050
|
+
return false;
|
|
4051
|
+
}
|
|
4052
|
+
return isEvmChain(chainInfo);
|
|
4053
|
+
}
|
|
4054
|
+
async personal_sign([message, address]) {
|
|
4055
|
+
const accounts = await this.accountInfo.getCurrent();
|
|
4056
|
+
if (accounts[0].address !== address) {
|
|
4057
|
+
throw new Error("address is not the current account");
|
|
4058
|
+
}
|
|
4059
|
+
const signature = await this.accountInfo.signMessage(message);
|
|
4060
|
+
return signature;
|
|
4061
|
+
}
|
|
4062
|
+
async eth_signTypedData_v4([address, typedData]) {
|
|
4063
|
+
const accounts = await this.accountInfo.getCurrent();
|
|
4064
|
+
if (accounts[0].address !== address) {
|
|
4065
|
+
throw new Error("address is not the current account");
|
|
4066
|
+
}
|
|
4067
|
+
const signature = await this.accountInfo.signTypedData(typedData);
|
|
4068
|
+
return signature;
|
|
4069
|
+
}
|
|
4070
|
+
async eth_getBalance([address, type]) {
|
|
4071
|
+
const accounts = await this.accountInfo.getCurrent();
|
|
4072
|
+
if (accounts[0].address !== address) {
|
|
4073
|
+
throw new Error("address is not the current account");
|
|
4074
|
+
}
|
|
4075
|
+
if (type !== "latest") {
|
|
4076
|
+
throw new Error("type is not supported");
|
|
4077
|
+
}
|
|
4078
|
+
const chainInfo = await this.getCurrentChain();
|
|
4079
|
+
const { rpcClient } = getRPCClient(chainInfo);
|
|
4080
|
+
try {
|
|
4081
|
+
const balance = await rpcClient.getBalance({ address });
|
|
4082
|
+
return balance?.toString() || "0";
|
|
4083
|
+
} catch (error) {
|
|
4084
|
+
console.error(error);
|
|
4085
|
+
return "0";
|
|
4086
|
+
}
|
|
4087
|
+
}
|
|
4088
|
+
async _queryGasInfo(txData) {
|
|
4089
|
+
const { tokenAddress, chainId, amount = 0, decimals = 9 } = txData;
|
|
4090
|
+
const value = tokenAddress ? "0x1" : viem.toHex(viem.parseUnits(amount.toString(), decimals));
|
|
4091
|
+
let callData = "0x";
|
|
4092
|
+
if (tokenAddress) {
|
|
4093
|
+
callData = createErc20TxData(txData, { decimals, address: tokenAddress })?.data;
|
|
4094
|
+
}
|
|
4095
|
+
const gasLimitParam = {
|
|
4096
|
+
from: txData.from,
|
|
4097
|
+
to: txData.to,
|
|
4098
|
+
value
|
|
4099
|
+
};
|
|
4100
|
+
const queryGasParams = {
|
|
4101
|
+
chainIndex: Number(chainId),
|
|
4102
|
+
callData,
|
|
4103
|
+
gasLimitParam,
|
|
4104
|
+
addressList: [txData.from]
|
|
4105
|
+
};
|
|
4106
|
+
const {
|
|
4107
|
+
data: gasInfo,
|
|
4108
|
+
success,
|
|
4109
|
+
message
|
|
4110
|
+
} = await this.transactions.queryGasInfo({
|
|
4111
|
+
chainType: this.chainType,
|
|
4112
|
+
params: queryGasParams
|
|
4113
|
+
});
|
|
4114
|
+
if (!success) {
|
|
4115
|
+
console.error("queryGasInfo evm", txData, queryGasParams, message, gasInfo);
|
|
4116
|
+
const BaseConfig2 = walletUtils.SupportedChainTypes[walletUtils.ChainTypes.EVM];
|
|
4117
|
+
const { gasFee } = BaseConfig2;
|
|
4118
|
+
return {
|
|
4119
|
+
success: true,
|
|
4120
|
+
gasFee: gasFee.toString()
|
|
4121
|
+
};
|
|
4122
|
+
}
|
|
4123
|
+
const nativeChainId = walletUtils.SupportedChainTypes[this.chainType].chainId;
|
|
4124
|
+
const { nativeCurrency } = await this.networks.getNetworkByChainId(nativeChainId);
|
|
4125
|
+
const { baseFee = 1, gasLimit = 0 } = gasInfo;
|
|
4126
|
+
const baseFeeBN = new Bignumber.BigNumber(baseFee);
|
|
4127
|
+
const calcFee = (feeLevel) => {
|
|
4128
|
+
const fee = baseFeeBN.plus(gasInfo[feeLevel] || 0);
|
|
4129
|
+
const gasFee = fee.times(gasLimit);
|
|
4130
|
+
return viem.formatUnits(BigInt(gasFee.toNumber()), nativeCurrency?.decimals || 9);
|
|
4131
|
+
};
|
|
4132
|
+
return {
|
|
4133
|
+
success,
|
|
4134
|
+
fees: {
|
|
4135
|
+
low: calcFee("priorityFeeLow"),
|
|
4136
|
+
medium: calcFee("priorityFeeMedium"),
|
|
4137
|
+
high: calcFee("priorityFeeHigh")
|
|
4138
|
+
},
|
|
4139
|
+
gasFee: calcFee("priorityFeeMedium"),
|
|
4140
|
+
baseFee,
|
|
4141
|
+
gasLimit,
|
|
4142
|
+
priorityFee: {
|
|
4143
|
+
low: gasInfo.priorityFeeLow,
|
|
4144
|
+
medium: gasInfo.priorityFeeMedium,
|
|
4145
|
+
high: gasInfo.priorityFeeHigh
|
|
4146
|
+
}
|
|
4147
|
+
};
|
|
4148
|
+
}
|
|
4149
|
+
async eth_estimateGas(txs) {
|
|
4150
|
+
const { from, to, value = "0x1" } = txs[0] || {};
|
|
4151
|
+
const accounts = await this.accountInfo.getCurrent();
|
|
4152
|
+
if (accounts[0].address !== from) {
|
|
4153
|
+
throw new Error("address is not the current account");
|
|
4154
|
+
}
|
|
4155
|
+
if (!to) {
|
|
4156
|
+
throw new Error("to is not set");
|
|
4157
|
+
}
|
|
4158
|
+
const chainId = txs[0]?.chainId || await this.eth_chainId();
|
|
4159
|
+
const queryGasParams = {
|
|
4160
|
+
chainIndex: Number(chainId),
|
|
4161
|
+
callData: "0x",
|
|
4162
|
+
gasLimitParam: {
|
|
4163
|
+
from,
|
|
4164
|
+
to,
|
|
4165
|
+
value
|
|
4166
|
+
},
|
|
4167
|
+
addressList: [from]
|
|
4168
|
+
};
|
|
4169
|
+
const chainType = this.chainType;
|
|
4170
|
+
const {
|
|
4171
|
+
data: gasInfo,
|
|
4172
|
+
success,
|
|
4173
|
+
message
|
|
4174
|
+
} = await this.transactions.queryGasInfo({
|
|
4175
|
+
chainType,
|
|
4176
|
+
params: queryGasParams
|
|
4177
|
+
});
|
|
4178
|
+
if (!success) {
|
|
4179
|
+
console.error("queryGasInfo evm", txs, message, gasInfo);
|
|
4180
|
+
const { gasFee } = walletUtils.SupportedChainTypes[chainType];
|
|
4181
|
+
return gasFee.toString();
|
|
4182
|
+
}
|
|
4183
|
+
const res = getAllTypeChainIds({ chainId, chainType });
|
|
4184
|
+
const { nativeCurrencyDecimals } = await this.networks.getNetworkByChainId(res.chainId);
|
|
4185
|
+
const { baseFee = 1, gasLimit = 0 } = gasInfo;
|
|
4186
|
+
const baseFeeBN = new Bignumber.BigNumber(baseFee);
|
|
4187
|
+
const calcFee = (feeLevel) => {
|
|
4188
|
+
const fee = baseFeeBN.plus(gasInfo[feeLevel] || 0);
|
|
4189
|
+
const gasFee = fee.times(gasLimit);
|
|
4190
|
+
return viem.toHex(BigInt(gasFee.toNumber()), nativeCurrencyDecimals);
|
|
4191
|
+
};
|
|
4192
|
+
return calcFee("priorityFeeMedium");
|
|
4193
|
+
}
|
|
4194
|
+
async createPublicClient({ chainId, rpcUrl }) {
|
|
4195
|
+
if (rpcUrl) {
|
|
4196
|
+
return viem.createPublicClient({
|
|
4197
|
+
transport: viem.http(rpcUrl)
|
|
4198
|
+
});
|
|
4199
|
+
}
|
|
4200
|
+
if (chainId) {
|
|
4201
|
+
this.networks.setChainType(this.chainType);
|
|
4202
|
+
const chainInfo = await this.networks.getNetworkByChainId(chainId);
|
|
4203
|
+
rpcUrl = chainInfo.rpcUrls[0];
|
|
4204
|
+
} else {
|
|
4205
|
+
const chainInfo = await this.getCurrentChain();
|
|
4206
|
+
rpcUrl = chainInfo.rpcUrls[0];
|
|
4207
|
+
}
|
|
4208
|
+
if (!rpcUrl) {
|
|
4209
|
+
throw new Error("rpcUrl is not set");
|
|
4210
|
+
}
|
|
4211
|
+
return viem.createPublicClient({
|
|
4212
|
+
transport: viem.http(rpcUrl)
|
|
4213
|
+
});
|
|
4214
|
+
}
|
|
4215
|
+
// Get nonce for current account
|
|
4216
|
+
async eth_getTransactionCount([address, type]) {
|
|
4217
|
+
const accounts = await this.accountInfo.getCurrent();
|
|
4218
|
+
if (accounts[0].address !== address) {
|
|
4219
|
+
throw new Error("address is not the current account");
|
|
4220
|
+
}
|
|
4221
|
+
if (type !== "latest" && type !== "pending") {
|
|
4222
|
+
throw new Error("type is not supported");
|
|
4223
|
+
}
|
|
4224
|
+
try {
|
|
4225
|
+
const rpcClient = await this.createPublicClient({});
|
|
4226
|
+
const nonce = await rpcClient.getTransactionCount({ address });
|
|
4227
|
+
return nonce;
|
|
4228
|
+
} catch (error) {
|
|
4229
|
+
console.error("Failed to get nonce:", error);
|
|
4230
|
+
throw new Error(`Failed to get nonce: ${error}`);
|
|
4231
|
+
}
|
|
4232
|
+
}
|
|
4233
|
+
//https://docs.metamask.io/snaps/reference/keyring-api/chain-methods/#eth_signtransaction
|
|
4234
|
+
async eth_signTransaction(txParams) {
|
|
4235
|
+
const preparedTxPropsType = {
|
|
4236
|
+
chainId: "number",
|
|
4237
|
+
to: "string",
|
|
4238
|
+
value: "bigint",
|
|
4239
|
+
data: "string",
|
|
4240
|
+
nonce: "number",
|
|
4241
|
+
maxPriorityFeePerGas: "bigint",
|
|
4242
|
+
maxFeePerGas: "bigint",
|
|
4243
|
+
gasLimit: "bigint",
|
|
4244
|
+
gas: "bigint"
|
|
4245
|
+
};
|
|
4246
|
+
let txData = txParams?.[0];
|
|
4247
|
+
const gas = txData?.gas || txData?.gasLimit;
|
|
4248
|
+
txData = { ...txData, gas, gasLimit: gas };
|
|
4249
|
+
txData.data = txData.data || "0x";
|
|
4250
|
+
const accounts = await this.accountInfo.getCurrent();
|
|
4251
|
+
const address = accounts[0].address;
|
|
4252
|
+
if (txData?.from && txData?.from !== address) {
|
|
4253
|
+
console.error("eth_signTransaction error data: from is not the current account", txData);
|
|
4254
|
+
throw new Error(`eth_signTransaction error data: from is not the current account`);
|
|
4255
|
+
}
|
|
4256
|
+
delete txData?.from;
|
|
4257
|
+
const preparedTx = {
|
|
4258
|
+
type: "eip1559",
|
|
4259
|
+
gas: txData?.gasLimit,
|
|
4260
|
+
account: address
|
|
4261
|
+
};
|
|
4262
|
+
for (const key in preparedTxPropsType) {
|
|
4263
|
+
if (!txData?.[key] || !viem.isHex(txData?.[key])) {
|
|
4264
|
+
throw new Error(`${key}: no data or wrong type`);
|
|
4265
|
+
}
|
|
4266
|
+
preparedTx[key] = preparedTxPropsType[key] === "number" ? viem.fromHex(txData[key], "number") : txData[key];
|
|
4267
|
+
}
|
|
4268
|
+
try {
|
|
4269
|
+
const serializedTransaction = await this.accountInfo.signTransaction(
|
|
4270
|
+
JSON.stringify({
|
|
4271
|
+
data: preparedTx,
|
|
4272
|
+
types: preparedTxPropsType
|
|
4273
|
+
})
|
|
4274
|
+
);
|
|
4275
|
+
if (serializedTransaction === "") {
|
|
4276
|
+
throw new Error(`eth_signTransaction error data: ${JSON.stringify(txParams)}`);
|
|
4277
|
+
}
|
|
4278
|
+
const data = viem.parseTransaction(serializedTransaction);
|
|
4279
|
+
return data;
|
|
4280
|
+
} catch (err) {
|
|
4281
|
+
throw new Error("eth_signTransaction error" + err);
|
|
4282
|
+
}
|
|
4283
|
+
}
|
|
4284
|
+
async eth_sendRawTransaction([serializedTransaction], rpcUrl) {
|
|
4285
|
+
try {
|
|
4286
|
+
const rpcClient = await this.createPublicClient({ rpcUrl });
|
|
4287
|
+
const hash = await rpcClient.sendRawTransaction({
|
|
4288
|
+
serializedTransaction
|
|
4289
|
+
});
|
|
4290
|
+
return hash;
|
|
4291
|
+
} catch (error) {
|
|
4292
|
+
console.error("Failed to send transaction via RPC:", error, rpcUrl);
|
|
4293
|
+
throw error;
|
|
4294
|
+
}
|
|
4295
|
+
}
|
|
4296
|
+
async getTransaction(hash) {
|
|
4297
|
+
if (!hash || !viem.isHex(hash)) {
|
|
4298
|
+
throw new Error("txId is not valid");
|
|
4299
|
+
}
|
|
4300
|
+
try {
|
|
4301
|
+
const rpcClient = await this.createPublicClient({});
|
|
4302
|
+
const tx = await rpcClient.getTransaction({
|
|
4303
|
+
hash
|
|
4304
|
+
});
|
|
4305
|
+
return tx;
|
|
4306
|
+
} catch (error) {
|
|
4307
|
+
console.error("Failed to send transaction via RPC:", error, hash);
|
|
4308
|
+
throw error;
|
|
4309
|
+
}
|
|
4310
|
+
}
|
|
4311
|
+
};
|
|
4312
|
+
var BaseConfig = walletUtils.SupportedChainTypes[walletUtils.ChainTypes.SOL];
|
|
4313
|
+
var TOKEN_METADATA_PROGRAM_ID = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s";
|
|
4314
|
+
var MSG_PREFIX = "\xFFsolana offchain";
|
|
4315
|
+
|
|
4316
|
+
// src/solana/utils.ts
|
|
4317
|
+
__toESM(require_bn());
|
|
4318
|
+
new web3_js.PublicKey(TOKEN_METADATA_PROGRAM_ID);
|
|
4319
|
+
var txToHex = (tx) => {
|
|
4320
|
+
if (tx instanceof web3_js.VersionedTransaction) {
|
|
4321
|
+
return Buffer.from(tx.serialize()).toString("hex");
|
|
4322
|
+
}
|
|
4323
|
+
if (tx instanceof web3_js.Transaction) {
|
|
4324
|
+
return Buffer.from(
|
|
4325
|
+
tx.serialize({
|
|
4326
|
+
requireAllSignatures: false,
|
|
4327
|
+
verifySignatures: false
|
|
4328
|
+
})
|
|
4329
|
+
).toString("hex");
|
|
4330
|
+
}
|
|
4331
|
+
return tx;
|
|
4332
|
+
};
|
|
4333
|
+
async function createLegacyTx({ from = "", to = "", amount = 0 }, connection) {
|
|
4334
|
+
const fromPubkey = new web3_js.PublicKey(from);
|
|
4335
|
+
const toPubkey = new web3_js.PublicKey(to);
|
|
4336
|
+
const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash();
|
|
4337
|
+
const transaction = new web3_js.Transaction().add(
|
|
4338
|
+
web3_js.SystemProgram.transfer({
|
|
4339
|
+
fromPubkey,
|
|
4340
|
+
//payer
|
|
4341
|
+
toPubkey,
|
|
4342
|
+
//toAccount
|
|
4343
|
+
lamports: amount * web3_js.LAMPORTS_PER_SOL
|
|
4344
|
+
})
|
|
4345
|
+
);
|
|
4346
|
+
transaction.feePayer = fromPubkey;
|
|
4347
|
+
transaction.recentBlockhash = blockhash;
|
|
4348
|
+
transaction.lastValidBlockHeight = lastValidBlockHeight;
|
|
4349
|
+
return transaction;
|
|
4350
|
+
}
|
|
4351
|
+
async function createTokenLegacyTransaction2({
|
|
4352
|
+
from = "",
|
|
4353
|
+
to = "",
|
|
4354
|
+
amount = 0,
|
|
4355
|
+
tokenAddress = "",
|
|
4356
|
+
priorityFee = 0,
|
|
4357
|
+
// microLamports (1 SOL = 1e6 microLamports)
|
|
4358
|
+
decimals = 6
|
|
4359
|
+
}, connection) {
|
|
4360
|
+
try {
|
|
4361
|
+
const fromPubkey = new web3_js.PublicKey(from);
|
|
4362
|
+
const toPubkey = new web3_js.PublicKey(to);
|
|
4363
|
+
const tokenPublicKey = new web3_js.PublicKey(tokenAddress);
|
|
4364
|
+
const fromTokenPubKey = await splToken.getAssociatedTokenAddress(tokenPublicKey, fromPubkey);
|
|
4365
|
+
const toTokenPubKey = await splToken.getAssociatedTokenAddress(tokenPublicKey, toPubkey);
|
|
4366
|
+
const { blockhash } = await connection.getLatestBlockhash("confirmed");
|
|
4367
|
+
const transaction = new web3_js.Transaction();
|
|
4368
|
+
transaction.feePayer = fromPubkey;
|
|
4369
|
+
transaction.recentBlockhash = blockhash;
|
|
4370
|
+
try {
|
|
4371
|
+
const instruction = splToken.createAssociatedTokenAccountInstruction(fromPubkey, toTokenPubKey, toPubkey, tokenPublicKey);
|
|
4372
|
+
transaction.add(instruction);
|
|
4373
|
+
} catch (error) {
|
|
4374
|
+
console.error(error);
|
|
4375
|
+
throw error;
|
|
4376
|
+
}
|
|
4377
|
+
const tokenAmount = new Bignumber__default.default(amount).multipliedBy(new Bignumber__default.default(10).pow(decimals)).toNumber();
|
|
4378
|
+
transaction.add(
|
|
4379
|
+
splToken.createTransferInstruction(fromTokenPubKey, toTokenPubKey, fromPubkey, tokenAmount, [], splToken.TOKEN_PROGRAM_ID)
|
|
4380
|
+
);
|
|
4381
|
+
return transaction;
|
|
4382
|
+
} catch (error) {
|
|
4383
|
+
console.error("Error creating transaction:", error);
|
|
4384
|
+
throw error;
|
|
4385
|
+
}
|
|
4386
|
+
}
|
|
4387
|
+
|
|
4388
|
+
// src/dogecoin/base.ts
|
|
4389
|
+
function toBase58(data) {
|
|
4390
|
+
throw new Error("toBase58 requires bs58 package. Install it: pnpm add bs58");
|
|
4391
|
+
}
|
|
4392
|
+
|
|
4393
|
+
// src/solana/service.ts
|
|
4394
|
+
var SolanaService = class _SolanaService extends BaseService {
|
|
4395
|
+
static instance;
|
|
4396
|
+
chainType;
|
|
4397
|
+
rpcUrl;
|
|
4398
|
+
connection;
|
|
4399
|
+
constructor(chainType, accountInfo, tomoAppInfo) {
|
|
4400
|
+
super(tomoAppInfo, accountInfo);
|
|
4401
|
+
this.chainType = chainType;
|
|
4402
|
+
const config = {
|
|
4403
|
+
commitment: "confirmed",
|
|
4404
|
+
disableRetryOnRateLimit: false,
|
|
4405
|
+
confirmTransactionInitialTimeout: 12e4,
|
|
4406
|
+
fetch: (url, options) => {
|
|
4407
|
+
return fetch(url, { ...options });
|
|
4408
|
+
}
|
|
4409
|
+
};
|
|
4410
|
+
const domain = walletUtils.TomoApiDomains[tomoAppInfo.tomoStage];
|
|
4411
|
+
const rpcUrl = `${domain}/rpc/v1/solana`;
|
|
4412
|
+
this.rpcUrl = rpcUrl;
|
|
4413
|
+
this.connection = new web3_js.Connection(rpcUrl, config);
|
|
4414
|
+
}
|
|
4415
|
+
static getInstance(chainType, accountInfo, tomoAppInfo) {
|
|
4416
|
+
if (!_SolanaService.instance) {
|
|
4417
|
+
_SolanaService.instance = new _SolanaService(chainType, accountInfo, tomoAppInfo);
|
|
4418
|
+
}
|
|
4419
|
+
return _SolanaService.instance;
|
|
4420
|
+
}
|
|
4421
|
+
async getCurrentWalletAccount() {
|
|
4422
|
+
return await this.accountInfo.getCurrent();
|
|
4423
|
+
}
|
|
4424
|
+
async getAccount() {
|
|
4425
|
+
const { currentAddress, publicKey } = await this.accountInfo.getIds();
|
|
4426
|
+
return { publicKey: publicKey || currentAddress, address: currentAddress };
|
|
4427
|
+
}
|
|
4428
|
+
async signMessage(params) {
|
|
4429
|
+
const { currentAddress, publicKey } = await this.accountInfo.getIds();
|
|
4430
|
+
const { message } = params;
|
|
4431
|
+
const signature = await this.accountInfo.signMessage(message);
|
|
4432
|
+
return {
|
|
4433
|
+
message: MSG_PREFIX + message,
|
|
4434
|
+
signature,
|
|
4435
|
+
publicKey: publicKey || currentAddress
|
|
4436
|
+
};
|
|
4437
|
+
}
|
|
4438
|
+
async signIn(params) {
|
|
4439
|
+
const { currentAddress, publicKey } = await this.accountInfo.getIds();
|
|
4440
|
+
const { signature = "" } = await this.signMessage(params);
|
|
4441
|
+
return {
|
|
4442
|
+
address: currentAddress,
|
|
4443
|
+
publicKey: publicKey || currentAddress,
|
|
4444
|
+
signature,
|
|
4445
|
+
signedMessage: MSG_PREFIX + params.message
|
|
4446
|
+
};
|
|
4447
|
+
}
|
|
4448
|
+
async request({ method, params }) {
|
|
4449
|
+
if (!this[method]) {
|
|
4450
|
+
throw new Error(`${method} in request is not supported`);
|
|
4451
|
+
}
|
|
4452
|
+
return this[method](params);
|
|
4453
|
+
}
|
|
4454
|
+
async _queryGasInfo(txData) {
|
|
4455
|
+
const { tokenAddress, chainId, amount = 0, decimals = 9 } = txData;
|
|
4456
|
+
const value = tokenAddress ? "0x1" : viem.toHex(viem.parseUnits(amount.toString(), decimals));
|
|
4457
|
+
let callData = "0x";
|
|
4458
|
+
if (tokenAddress) {
|
|
4459
|
+
const transaction = await createTokenLegacyTransaction2(txData, this.connection);
|
|
4460
|
+
callData = "0x" + txToHex(transaction);
|
|
4461
|
+
} else {
|
|
4462
|
+
const transaction = await createLegacyTx(txData, this.connection);
|
|
4463
|
+
callData = "0x" + txToHex(transaction);
|
|
4464
|
+
}
|
|
4465
|
+
const gasLimitParam = {
|
|
4466
|
+
from: txData.from,
|
|
4467
|
+
to: txData.to,
|
|
4468
|
+
value
|
|
4469
|
+
};
|
|
4470
|
+
const queryGasParams = {
|
|
4471
|
+
chainIndex: Number(chainId),
|
|
4472
|
+
callData,
|
|
4473
|
+
gasLimitParam,
|
|
4474
|
+
addressList: [txData.from]
|
|
4475
|
+
};
|
|
4476
|
+
const {
|
|
4477
|
+
data: gasInfo,
|
|
4478
|
+
success,
|
|
4479
|
+
message
|
|
4480
|
+
} = await this.transactions.queryGasInfo({
|
|
4481
|
+
chainType: this.chainType,
|
|
4482
|
+
params: queryGasParams
|
|
4483
|
+
});
|
|
4484
|
+
if (!success) {
|
|
4485
|
+
console.error("queryGasInfo solana", txData, message, gasInfo);
|
|
4486
|
+
const { gasFee } = BaseConfig;
|
|
4487
|
+
return {
|
|
4488
|
+
success: true,
|
|
4489
|
+
gasFee: gasFee.toString()
|
|
4490
|
+
};
|
|
4491
|
+
}
|
|
4492
|
+
const nativeChainId = walletUtils.SupportedChainTypes[this.chainType].chainId;
|
|
4493
|
+
const { nativeCurrency } = await this.networks.getNetworkByChainId(nativeChainId);
|
|
4494
|
+
const { baseFee = 1, gasLimit = 0 } = gasInfo;
|
|
4495
|
+
const baseFeeBN = new Bignumber.BigNumber(baseFee).times(2);
|
|
4496
|
+
const gasLimitBN = new Bignumber.BigNumber(gasLimit);
|
|
4497
|
+
const calcFee = (feeLevel) => {
|
|
4498
|
+
const priorityFee = gasLimitBN.times(gasInfo[feeLevel] || 0).dividedBy(1e6).integerValue(Bignumber.BigNumber.ROUND_DOWN);
|
|
4499
|
+
const gasFee = baseFeeBN.plus(priorityFee);
|
|
4500
|
+
return viem.formatUnits(BigInt(gasFee.toNumber()), nativeCurrency?.decimals || 9);
|
|
4501
|
+
};
|
|
4502
|
+
return {
|
|
4503
|
+
success: true,
|
|
4504
|
+
fees: {
|
|
4505
|
+
low: calcFee("priorityFeeLow"),
|
|
4506
|
+
medium: calcFee("priorityFeeMedium"),
|
|
4507
|
+
high: calcFee("priorityFeeHigh")
|
|
4508
|
+
},
|
|
4509
|
+
gasFee: calcFee("priorityFeeHigh")
|
|
4510
|
+
};
|
|
4511
|
+
}
|
|
4512
|
+
async sendSignedTx(signedTx) {
|
|
4513
|
+
let rawTx;
|
|
4514
|
+
try {
|
|
4515
|
+
const hexBuffer = Buffer.from(signedTx, "hex");
|
|
4516
|
+
web3_js.VersionedTransaction.deserialize(hexBuffer);
|
|
4517
|
+
rawTx = hexBuffer;
|
|
4518
|
+
} catch (error) {
|
|
4519
|
+
const base58Buffer = Buffer.from(toBase58());
|
|
4520
|
+
web3_js.VersionedTransaction.deserialize(base58Buffer);
|
|
4521
|
+
rawTx = base58Buffer;
|
|
4522
|
+
}
|
|
4523
|
+
const transaction = web3_js.VersionedTransaction.deserialize(rawTx);
|
|
4524
|
+
if (!transaction.signatures || transaction.signatures.length === 0) {
|
|
4525
|
+
throw new Error("lack of sign");
|
|
4526
|
+
}
|
|
4527
|
+
const confirmationStrategy = {
|
|
4528
|
+
commitment: "confirmed",
|
|
4529
|
+
preflightCommitment: "processed",
|
|
4530
|
+
skipPreflight: false,
|
|
4531
|
+
maxRetries: 5
|
|
4532
|
+
};
|
|
4533
|
+
try {
|
|
4534
|
+
const simulation = await this.connection.simulateTransaction(transaction);
|
|
4535
|
+
if (simulation.value.err) {
|
|
4536
|
+
const logs = simulation.value.logs || [];
|
|
4537
|
+
const message = logs[logs.length - 1] || simulation.value.err || "Unknown error occurred";
|
|
4538
|
+
console.error("send err logs:", logs, message);
|
|
4539
|
+
throw new Error(`Transaction failed: ${message}`);
|
|
4540
|
+
}
|
|
4541
|
+
const signature = await web3_js.sendAndConfirmRawTransaction(this.connection, rawTx, confirmationStrategy);
|
|
4542
|
+
return signature;
|
|
4543
|
+
} catch (error) {
|
|
4544
|
+
if (error.message.includes("TransactionExpiredTimeoutError")) {
|
|
4545
|
+
const status = await this.connection.getSignatureStatus(transaction.signatures[0].toString());
|
|
4546
|
+
if (status.value?.confirmationStatus === "confirmed") {
|
|
4547
|
+
return transaction.signatures[0].toString();
|
|
4548
|
+
}
|
|
4549
|
+
}
|
|
4550
|
+
throw error;
|
|
4551
|
+
}
|
|
4552
|
+
}
|
|
4553
|
+
async signTransaction({ rawTransaction }) {
|
|
4554
|
+
const params = {
|
|
4555
|
+
rawTransaction,
|
|
4556
|
+
walletId: -1,
|
|
4557
|
+
rpcUrl: this.rpcUrl
|
|
4558
|
+
};
|
|
4559
|
+
const signature = await this.accountInfo.signTransaction(JSON.stringify(params));
|
|
4560
|
+
return signature;
|
|
4561
|
+
}
|
|
4562
|
+
async signAndSendTransaction({ rawTransaction }) {
|
|
4563
|
+
const signedTx = await this.signTransaction({ rawTransaction });
|
|
4564
|
+
if (!signedTx) {
|
|
4565
|
+
return "";
|
|
4566
|
+
}
|
|
4567
|
+
const signature = await this.sendSignedTx(signedTx);
|
|
4568
|
+
return signature;
|
|
4569
|
+
}
|
|
4570
|
+
async signAllTransactions({ rawTransactions }) {
|
|
4571
|
+
throw new Error("no support");
|
|
4572
|
+
}
|
|
4573
|
+
async signAndSendAllTransactions({ rawTransactions }) {
|
|
4574
|
+
throw new Error("no support");
|
|
4575
|
+
}
|
|
4576
|
+
async queryRent(params) {
|
|
4577
|
+
const MIN_ACCOUNT_ACTIVATION_SOL = "0.0009";
|
|
4578
|
+
const SPL_TOKEN_ACCOUNT_CREATION_FEE = "0.001";
|
|
4579
|
+
try {
|
|
4580
|
+
const { toAddress, tokenAddress } = params;
|
|
4581
|
+
let minTransferAmount = "0";
|
|
4582
|
+
let createSplTokenFee = null;
|
|
4583
|
+
if (tokenAddress) {
|
|
4584
|
+
const tokenAccountExists = await this.checkTokenAccount(toAddress, tokenAddress);
|
|
4585
|
+
if (!tokenAccountExists) {
|
|
4586
|
+
createSplTokenFee = SPL_TOKEN_ACCOUNT_CREATION_FEE;
|
|
4587
|
+
}
|
|
4588
|
+
} else {
|
|
4589
|
+
const accountExists = await this.checkAccountExists(toAddress);
|
|
4590
|
+
if (!accountExists) {
|
|
4591
|
+
minTransferAmount = MIN_ACCOUNT_ACTIVATION_SOL;
|
|
4592
|
+
}
|
|
4593
|
+
}
|
|
4594
|
+
const rentInfo = {
|
|
4595
|
+
minTransferAmount,
|
|
4596
|
+
createSplTokenFee
|
|
4597
|
+
};
|
|
4598
|
+
return rentInfo;
|
|
4599
|
+
} catch (error) {
|
|
4600
|
+
console.error("queryRent error:", error);
|
|
4601
|
+
const defaultRentInfo = {
|
|
4602
|
+
minTransferAmount: "0",
|
|
4603
|
+
createSplTokenFee: null
|
|
4604
|
+
};
|
|
4605
|
+
return defaultRentInfo;
|
|
4606
|
+
}
|
|
4607
|
+
}
|
|
4608
|
+
async checkAccountExists(address) {
|
|
4609
|
+
try {
|
|
4610
|
+
const accountInfo = await this.connection.getAccountInfo(new web3_js.PublicKey(address));
|
|
4611
|
+
return accountInfo !== null;
|
|
4612
|
+
} catch (error) {
|
|
4613
|
+
console.warn("Failed to check account exists:", error);
|
|
4614
|
+
return false;
|
|
4615
|
+
}
|
|
4616
|
+
}
|
|
4617
|
+
async checkTokenAccount(ownerAddress, tokenMint) {
|
|
4618
|
+
try {
|
|
4619
|
+
const owner = new web3_js.PublicKey(ownerAddress);
|
|
4620
|
+
const mint = new web3_js.PublicKey(tokenMint);
|
|
4621
|
+
const associatedTokenAddress = await splToken.getAssociatedTokenAddress(mint, owner);
|
|
4622
|
+
const accountInfo = await this.connection.getAccountInfo(associatedTokenAddress);
|
|
4623
|
+
return accountInfo !== null;
|
|
4624
|
+
} catch (error) {
|
|
4625
|
+
console.warn("Failed to check token account:", error);
|
|
4626
|
+
return false;
|
|
4627
|
+
}
|
|
4628
|
+
}
|
|
4629
|
+
};
|
|
4630
|
+
var TomoWallet = class _TomoWallet extends BaseService {
|
|
4631
|
+
static instance;
|
|
4632
|
+
walletId;
|
|
4633
|
+
constructor(walletId, tomoAppInfo) {
|
|
4634
|
+
super(tomoAppInfo);
|
|
4635
|
+
this.walletId = walletId;
|
|
4636
|
+
}
|
|
4637
|
+
getInstance(walletId, tomoAppInfo) {
|
|
4638
|
+
if (!_TomoWallet.instance) {
|
|
4639
|
+
_TomoWallet.instance = new _TomoWallet(walletId, tomoAppInfo);
|
|
4640
|
+
}
|
|
4641
|
+
return new _TomoWallet(walletId, tomoAppInfo);
|
|
4642
|
+
}
|
|
4643
|
+
async supportedChains(chainType) {
|
|
4644
|
+
const networks = await this.networks.getNetworks(chainType || "");
|
|
4645
|
+
return networks;
|
|
4646
|
+
}
|
|
4647
|
+
async getChainInfo(chainType, chainId) {
|
|
4648
|
+
this.networks.setChainType(chainType);
|
|
4649
|
+
const network = await this.networks.getNetworkByChainId(chainId);
|
|
4650
|
+
return network;
|
|
4651
|
+
}
|
|
4652
|
+
//evm chains
|
|
4653
|
+
async isChainSupported(chainType, chainId) {
|
|
4654
|
+
this.networks.setChainType(chainType);
|
|
4655
|
+
const chainInfo = await this.networks.getNetworkByChainId(chainId);
|
|
4656
|
+
if (!chainInfo) {
|
|
4657
|
+
return false;
|
|
4658
|
+
}
|
|
4659
|
+
return !!chainInfo.chainId;
|
|
4660
|
+
}
|
|
4661
|
+
async getTransactions({
|
|
4662
|
+
tokenAddress = "",
|
|
4663
|
+
chainId = "",
|
|
4664
|
+
typeList = [],
|
|
4665
|
+
pageLimit = 20,
|
|
4666
|
+
cursor
|
|
4667
|
+
}) {
|
|
4668
|
+
if (!this.walletId) {
|
|
4669
|
+
throw new Error("walletId is required");
|
|
4670
|
+
}
|
|
4671
|
+
try {
|
|
4672
|
+
const params = {
|
|
4673
|
+
tokenAddress,
|
|
4674
|
+
pageLimit: pageLimit + 1,
|
|
4675
|
+
walletId: this.walletId,
|
|
4676
|
+
cursor
|
|
4677
|
+
};
|
|
4678
|
+
if (typeList.length > 0) {
|
|
4679
|
+
params.typeList = typeList.join(",");
|
|
4680
|
+
}
|
|
4681
|
+
if (chainId) {
|
|
4682
|
+
const chainInfo = await this.networks.getNetworkByChainId(chainId);
|
|
4683
|
+
const chainIndex = chainInfo.chainIndex;
|
|
4684
|
+
params.chainIndex = chainIndex;
|
|
4685
|
+
}
|
|
4686
|
+
const { cursor: newCursor = "", transactionList } = await this.transactions.getTransactions(params);
|
|
4687
|
+
const txList = transactionList.map(async (item) => {
|
|
4688
|
+
const chainIndex = item.chainIndex;
|
|
4689
|
+
const chainInfo = await this.networks.getNetworkByChainIndex(chainIndex);
|
|
4690
|
+
return {
|
|
4691
|
+
chainType: chainInfo.platformType.toLowerCase(),
|
|
4692
|
+
chainInfo: {
|
|
4693
|
+
chainId: chainInfo.chainId.toString(),
|
|
4694
|
+
name: chainInfo.name,
|
|
4695
|
+
icon: chainInfo.icon
|
|
4696
|
+
},
|
|
4697
|
+
nativeCurrency: chainInfo?.nativeCurrency,
|
|
4698
|
+
tokenInfo: item.tokenInfo,
|
|
4699
|
+
txHash: item.txHash,
|
|
4700
|
+
txDetail: item,
|
|
4701
|
+
txDetailLink: walletUtils.getExplorerUrl(chainIndex, { txId: item.txHash }),
|
|
4702
|
+
txTime: item.txTime
|
|
4703
|
+
};
|
|
4704
|
+
});
|
|
4705
|
+
const resolvedTxList = await Promise.all(txList);
|
|
4706
|
+
return { cursor: newCursor, transactionList: resolvedTxList };
|
|
4707
|
+
} catch (error) {
|
|
4708
|
+
console.error("Failed to send transaction via RPC:", error);
|
|
4709
|
+
throw error;
|
|
4710
|
+
}
|
|
4711
|
+
}
|
|
4712
|
+
};
|
|
4713
|
+
|
|
4714
|
+
// src/index.ts
|
|
4715
|
+
var ChainTypeServices = {
|
|
4716
|
+
[walletUtils.ChainTypes.EVM]: EvmService,
|
|
4717
|
+
[walletUtils.ChainTypes.SOL]: SolanaService
|
|
4718
|
+
// [ChainTypes.DOGE]: DogecoinService,
|
|
4719
|
+
};
|
|
4720
|
+
|
|
4721
|
+
exports.AccountType = AccountType;
|
|
4722
|
+
exports.ChainTypeServices = ChainTypeServices;
|
|
4723
|
+
exports.EvmService = EvmService;
|
|
4724
|
+
exports.SolanaService = SolanaService;
|
|
4725
|
+
exports.TomoWallet = TomoWallet;
|
|
4726
|
+
exports.TxTypes = TxTypes;
|