ccxt 4.3.70 → 4.3.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -5
- package/dist/ccxt.browser.min.js +13 -10
- package/dist/cjs/ccxt.js +6 -1
- package/dist/cjs/src/abstract/paradex.js +9 -0
- package/dist/cjs/src/base/Exchange.js +49 -0
- package/dist/cjs/src/paradex.js +2075 -0
- package/dist/cjs/src/pro/bequant.js +4 -0
- package/dist/cjs/src/pro/paradex.js +365 -0
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/poseidon.js +100 -0
- package/dist/cjs/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -0
- package/dist/cjs/src/static_dependencies/scure-starknet/index.js +284 -0
- package/dist/cjs/src/static_dependencies/starknet/constants.js +60 -0
- package/dist/cjs/src/static_dependencies/starknet/types/calldata.js +26 -0
- package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/abi.js +8 -0
- package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/index.js +13 -0
- package/dist/cjs/src/static_dependencies/starknet/types/lib/index.js +56 -0
- package/dist/cjs/src/static_dependencies/starknet/types/typedData.js +19 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/assert.js +15 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +44 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +122 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +137 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/byteArray.js +61 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/cairo.js +218 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/formatter.js +66 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/index.js +281 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/index.js +33 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +37 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +156 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/requestParser.js +250 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/responseParser.js +215 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/tuple.js +112 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/calldata/validate.js +206 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/encode.js +58 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/hash/classHash.js +57 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/merkle.js +76 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/num.js +92 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/selector.js +48 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/shortString.js +101 -0
- package/dist/cjs/src/static_dependencies/starknet/utils/typedData.js +334 -0
- package/dist/cjs/src/woo.js +4 -2
- package/examples/js/cli.js +8 -4
- package/js/ccxt.d.ts +8 -2
- package/js/ccxt.js +6 -2
- package/js/src/abstract/paradex.d.ts +43 -0
- package/js/src/abstract/paradex.js +11 -0
- package/js/src/base/Exchange.d.ts +7 -0
- package/js/src/base/Exchange.js +45 -0
- package/js/src/base/types.d.ts +10 -10
- package/js/src/paradex.d.ts +76 -0
- package/js/src/paradex.js +2075 -0
- package/js/src/pro/bequant.js +4 -0
- package/js/src/pro/paradex.d.ts +15 -0
- package/js/src/pro/paradex.js +366 -0
- package/js/src/static_dependencies/noble-curves/abstract/weierstrass.d.ts +24 -0
- package/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -1
- package/js/src/static_dependencies/scure-starknet/index.d.ts +79 -0
- package/js/src/static_dependencies/scure-starknet/index.js +323 -0
- package/js/src/static_dependencies/starknet/constants.d.ts +61 -0
- package/js/src/static_dependencies/starknet/constants.js +67 -0
- package/js/src/static_dependencies/starknet/index.d.ts +7 -0
- package/js/src/static_dependencies/starknet/index.js +50 -0
- package/js/src/static_dependencies/starknet/types/cairoEnum.d.ts +2 -0
- package/js/src/static_dependencies/starknet/types/cairoEnum.js +7 -0
- package/js/src/static_dependencies/starknet/types/calldata.d.ts +19 -0
- package/js/src/static_dependencies/starknet/types/calldata.js +28 -0
- package/js/src/static_dependencies/starknet/types/index.d.ts +13 -0
- package/js/src/static_dependencies/starknet/types/index.js +16 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/abi.d.ts +71 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/abi.js +13 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/index.d.ts +24 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/index.js +16 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/legacy.d.ts +33 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/legacy.js +7 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/sierra.d.ts +52 -0
- package/js/src/static_dependencies/starknet/types/lib/contract/sierra.js +7 -0
- package/js/src/static_dependencies/starknet/types/lib/index.d.ts +248 -0
- package/js/src/static_dependencies/starknet/types/lib/index.js +52 -0
- package/js/src/static_dependencies/starknet/types/typedData.d.ts +44 -0
- package/js/src/static_dependencies/starknet/types/typedData.js +19 -0
- package/js/src/static_dependencies/starknet/utils/address.d.ts +53 -0
- package/js/src/static_dependencies/starknet/utils/address.js +89 -0
- package/js/src/static_dependencies/starknet/utils/assert.d.ts +7 -0
- package/js/src/static_dependencies/starknet/utils/assert.js +17 -0
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.d.ts +6 -0
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +43 -0
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.d.ts +72 -0
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +117 -0
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.d.ts +76 -0
- package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +136 -0
- package/js/src/static_dependencies/starknet/utils/calldata/byteArray.d.ts +32 -0
- package/js/src/static_dependencies/starknet/utils/calldata/byteArray.js +59 -0
- package/js/src/static_dependencies/starknet/utils/calldata/cairo.d.ts +183 -0
- package/js/src/static_dependencies/starknet/utils/calldata/cairo.js +229 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.d.ts +38 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.d.ts +35 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.d.ts +34 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/index.d.ts +3 -0
- package/js/src/static_dependencies/starknet/utils/calldata/enum/index.js +9 -0
- package/js/src/static_dependencies/starknet/utils/calldata/formatter.d.ts +9 -0
- package/js/src/static_dependencies/starknet/utils/calldata/formatter.js +67 -0
- package/js/src/static_dependencies/starknet/utils/calldata/index.d.ts +89 -0
- package/js/src/static_dependencies/starknet/utils/calldata/index.js +280 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +5 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/index.js +30 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.d.ts +20 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.js +8 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.d.ts +24 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +36 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.d.ts +23 -0
- package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
- package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.d.ts +2 -0
- package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +155 -0
- package/js/src/static_dependencies/starknet/utils/calldata/requestParser.d.ts +11 -0
- package/js/src/static_dependencies/starknet/utils/calldata/requestParser.js +248 -0
- package/js/src/static_dependencies/starknet/utils/calldata/responseParser.d.ts +11 -0
- package/js/src/static_dependencies/starknet/utils/calldata/responseParser.js +214 -0
- package/js/src/static_dependencies/starknet/utils/calldata/tuple.d.ts +6 -0
- package/js/src/static_dependencies/starknet/utils/calldata/tuple.js +113 -0
- package/js/src/static_dependencies/starknet/utils/calldata/validate.d.ts +6 -0
- package/js/src/static_dependencies/starknet/utils/calldata/validate.js +208 -0
- package/js/src/static_dependencies/starknet/utils/encode.d.ts +207 -0
- package/js/src/static_dependencies/starknet/utils/encode.js +282 -0
- package/js/src/static_dependencies/starknet/utils/hash/classHash.d.ts +57 -0
- package/js/src/static_dependencies/starknet/utils/hash/classHash.js +224 -0
- package/js/src/static_dependencies/starknet/utils/hash/index.d.ts +6 -0
- package/js/src/static_dependencies/starknet/utils/hash/index.js +13 -0
- package/js/src/static_dependencies/starknet/utils/json.d.ts +24 -0
- package/js/src/static_dependencies/starknet/utils/json.js +43 -0
- package/js/src/static_dependencies/starknet/utils/merkle.d.ts +35 -0
- package/js/src/static_dependencies/starknet/utils/merkle.js +84 -0
- package/js/src/static_dependencies/starknet/utils/num.d.ts +182 -0
- package/js/src/static_dependencies/starknet/utils/num.js +244 -0
- package/js/src/static_dependencies/starknet/utils/selector.d.ts +48 -0
- package/js/src/static_dependencies/starknet/utils/selector.js +85 -0
- package/js/src/static_dependencies/starknet/utils/shortString.d.ts +57 -0
- package/js/src/static_dependencies/starknet/utils/shortString.js +96 -0
- package/js/src/static_dependencies/starknet/utils/starknetId.d.ts +113 -0
- package/js/src/static_dependencies/starknet/utils/starknetId.js +265 -0
- package/js/src/static_dependencies/starknet/utils/typedData.d.ts +54 -0
- package/js/src/static_dependencies/starknet/utils/typedData.js +321 -0
- package/js/src/static_dependencies/starknet/utils/uint256.d.ts +21 -0
- package/js/src/static_dependencies/starknet/utils/uint256.js +32 -0
- package/js/src/static_dependencies/starknet/utils/url.d.ts +29 -0
- package/js/src/static_dependencies/starknet/utils/url.js +70 -0
- package/js/src/woo.js +4 -2
- package/package.json +1 -1
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var sha3 = require('../noble-hashes/sha3.js');
|
|
6
|
+
var sha256 = require('../noble-hashes/sha256.js');
|
|
7
|
+
var utils$2 = require('../noble-hashes/utils.js');
|
|
8
|
+
var modular = require('../noble-curves/abstract/modular.js');
|
|
9
|
+
var poseidon = require('../noble-curves/abstract/poseidon.js');
|
|
10
|
+
var weierstrass = require('../noble-curves/abstract/weierstrass.js');
|
|
11
|
+
var utils$1 = require('../noble-curves/abstract/utils.js');
|
|
12
|
+
var _shortw_utils = require('../noble-curves/_shortw_utils.js');
|
|
13
|
+
|
|
14
|
+
/*! scure-starknet - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
15
|
+
const CURVE_ORDER = BigInt('3618502788666131213697322783095070105526743751716087489154079457884512865583');
|
|
16
|
+
// 2**251, limit for msgHash and Signature.r
|
|
17
|
+
const MAX_VALUE = BigInt('0x800000000000000000000000000000000000000000000000000000000000000');
|
|
18
|
+
const nBitLength = 252;
|
|
19
|
+
function bits2int(bytes) {
|
|
20
|
+
while (bytes[0] === 0)
|
|
21
|
+
bytes = bytes.subarray(1); // strip leading 0s
|
|
22
|
+
// Copy-pasted from weierstrass.ts
|
|
23
|
+
const delta = bytes.length * 8 - nBitLength;
|
|
24
|
+
const num = utils$1.bytesToNumberBE(bytes);
|
|
25
|
+
return delta > 0 ? num >> BigInt(delta) : num;
|
|
26
|
+
}
|
|
27
|
+
function hex0xToBytes(hex) {
|
|
28
|
+
if (typeof hex === 'string') {
|
|
29
|
+
hex = strip0x(hex); // allow 0x prefix
|
|
30
|
+
if (hex.length & 1)
|
|
31
|
+
hex = '0' + hex; // allow unpadded hex
|
|
32
|
+
}
|
|
33
|
+
return utils$1.hexToBytes(hex);
|
|
34
|
+
}
|
|
35
|
+
const curve = weierstrass.weierstrass({
|
|
36
|
+
a: BigInt(1),
|
|
37
|
+
b: BigInt('3141592653589793238462643383279502884197169399375105820974944592307816406665'),
|
|
38
|
+
// Field over which we'll do calculations; 2n**251n + 17n * 2n**192n + 1n
|
|
39
|
+
// There is no efficient sqrt for field (P%4==1)
|
|
40
|
+
Fp: modular.Fp(BigInt('0x800000000000011000000000000000000000000000000000000000000000001')),
|
|
41
|
+
n: CURVE_ORDER,
|
|
42
|
+
nBitLength,
|
|
43
|
+
// Base point (x, y) aka generator point
|
|
44
|
+
Gx: BigInt('874739451078007766457464989774322083649278607533249481151382481072868806602'),
|
|
45
|
+
Gy: BigInt('152666792071518830868575557812948353041420400780739481342941381225525861407'),
|
|
46
|
+
h: BigInt(1),
|
|
47
|
+
lowS: false,
|
|
48
|
+
..._shortw_utils.getHash(sha256.sha256),
|
|
49
|
+
// Custom truncation routines for stark curve
|
|
50
|
+
bits2int,
|
|
51
|
+
bits2int_modN: (bytes) => {
|
|
52
|
+
// 2102820b232636d200cb21f1d330f20d096cae09d1bf3edb1cc333ddee11318 =>
|
|
53
|
+
// 2102820b232636d200cb21f1d330f20d096cae09d1bf3edb1cc333ddee113180
|
|
54
|
+
const hex = utils$1.bytesToNumberBE(bytes).toString(16); // toHex unpadded
|
|
55
|
+
if (hex.length === 63)
|
|
56
|
+
bytes = hex0xToBytes(hex + '0'); // append trailing 0
|
|
57
|
+
return modular.mod(bits2int(bytes), CURVE_ORDER);
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
function ensureBytes(hex) {
|
|
61
|
+
return utils$1.ensureBytes('', typeof hex === 'string' ? hex0xToBytes(hex) : hex);
|
|
62
|
+
}
|
|
63
|
+
function normPrivKey(privKey) {
|
|
64
|
+
return utils$1.bytesToHex(ensureBytes(privKey)).padStart(64, '0');
|
|
65
|
+
}
|
|
66
|
+
function getPublicKey(privKey, isCompressed = false) {
|
|
67
|
+
return curve.getPublicKey(normPrivKey(privKey), isCompressed);
|
|
68
|
+
}
|
|
69
|
+
function checkSignature(signature) {
|
|
70
|
+
// Signature.s checked inside weierstrass
|
|
71
|
+
const { r, s } = signature;
|
|
72
|
+
if (r < 0n || r >= MAX_VALUE)
|
|
73
|
+
throw new Error(`Signature.r should be [1, ${MAX_VALUE})`);
|
|
74
|
+
const w = modular.invert(s, CURVE_ORDER);
|
|
75
|
+
if (w < 0n || w >= MAX_VALUE)
|
|
76
|
+
throw new Error(`inv(Signature.s) should be [1, ${MAX_VALUE})`);
|
|
77
|
+
}
|
|
78
|
+
function checkMessage(msgHash) {
|
|
79
|
+
const bytes = ensureBytes(msgHash);
|
|
80
|
+
const num = utils$1.bytesToNumberBE(bytes);
|
|
81
|
+
// num < 0 impossible here
|
|
82
|
+
if (num >= MAX_VALUE)
|
|
83
|
+
throw new Error(`msgHash should be [0, ${MAX_VALUE})`);
|
|
84
|
+
return bytes;
|
|
85
|
+
}
|
|
86
|
+
function sign(msgHash, privKey, opts) {
|
|
87
|
+
const sig = curve.sign(checkMessage(msgHash), normPrivKey(privKey), opts);
|
|
88
|
+
checkSignature(sig);
|
|
89
|
+
return sig;
|
|
90
|
+
}
|
|
91
|
+
const { CURVE, ProjectivePoint, Signature, utils } = curve;
|
|
92
|
+
function extractX(bytes) {
|
|
93
|
+
const hex = utils$1.bytesToHex(bytes.subarray(1));
|
|
94
|
+
const stripped = hex.replace(/^0+/gm, ''); // strip leading 0s
|
|
95
|
+
return `0x${stripped}`;
|
|
96
|
+
}
|
|
97
|
+
function strip0x(hex) {
|
|
98
|
+
return hex.replace(/^0x/i, '');
|
|
99
|
+
}
|
|
100
|
+
// seed generation
|
|
101
|
+
function grindKey(seed) {
|
|
102
|
+
const _seed = ensureBytes(seed);
|
|
103
|
+
const sha256mask = 2n ** 256n;
|
|
104
|
+
const limit = sha256mask - modular.mod(sha256mask, CURVE_ORDER);
|
|
105
|
+
for (let i = 0;; i++) {
|
|
106
|
+
const key = sha256Num(utils$1.concatBytes(_seed, utils$1.numberToVarBytesBE(BigInt(i))));
|
|
107
|
+
if (key < limit)
|
|
108
|
+
return modular.mod(key, CURVE_ORDER).toString(16); // key should be in [0, limit)
|
|
109
|
+
if (i === 100000)
|
|
110
|
+
throw new Error('grindKey is broken: tried 100k vals'); // prevent dos
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function getStarkKey(privateKey) {
|
|
114
|
+
return extractX(getPublicKey(privateKey, true));
|
|
115
|
+
}
|
|
116
|
+
function ethSigToPrivate(signature) {
|
|
117
|
+
signature = strip0x(signature);
|
|
118
|
+
if (signature.length !== 130)
|
|
119
|
+
throw new Error('Wrong ethereum signature');
|
|
120
|
+
return grindKey(signature.substring(0, 64));
|
|
121
|
+
}
|
|
122
|
+
// The Pedersen hash uses five different points on the curve.
|
|
123
|
+
// This is critical to ensure that they have been generated in a way
|
|
124
|
+
// that nobody knows the discrete logarithm of one point regarding another.
|
|
125
|
+
//
|
|
126
|
+
// Starknet utilizes nothing-up-my-sleeve technique:
|
|
127
|
+
// The parameters of the Pedersen hash are generated from the constant 𝜋.
|
|
128
|
+
// The x-coordinate of each point is a chunk of 76 decimal digit of 𝜋 modulo 𝑝.
|
|
129
|
+
// If it is a quadratic residue then the point is valid
|
|
130
|
+
// else the x-coordinate coordinate is incremented by one.
|
|
131
|
+
// https://docs.starkware.co/starkex/pedersen-hash-function.html
|
|
132
|
+
// https://github.com/starkware-libs/starkex-for-spot-trading/blob/607f0b4ce507e1d95cd018d206a2797f6ba4aab4/src/starkware/crypto/starkware/crypto/signature/nothing_up_my_sleeve_gen.py
|
|
133
|
+
const PEDERSEN_POINTS = [
|
|
134
|
+
new ProjectivePoint(2089986280348253421170679821480865132823066470938446095505822317253594081284n, 1713931329540660377023406109199410414810705867260802078187082345529207694986n, 1n),
|
|
135
|
+
new ProjectivePoint(996781205833008774514500082376783249102396023663454813447423147977397232763n, 1668503676786377725805489344771023921079126552019160156920634619255970485781n, 1n),
|
|
136
|
+
new ProjectivePoint(2251563274489750535117886426533222435294046428347329203627021249169616184184n, 1798716007562728905295480679789526322175868328062420237419143593021674992973n, 1n),
|
|
137
|
+
new ProjectivePoint(2138414695194151160943305727036575959195309218611738193261179310511854807447n, 113410276730064486255102093846540133784865286929052426931474106396135072156n, 1n),
|
|
138
|
+
new ProjectivePoint(2379962749567351885752724891227938183011949129833673362440656643086021394946n, 776496453633298175483985398648758586525933812536653089401905292063708816422n, 1n),
|
|
139
|
+
];
|
|
140
|
+
function pedersenPrecompute(p1, p2) {
|
|
141
|
+
const out = [];
|
|
142
|
+
let p = p1;
|
|
143
|
+
for (let i = 0; i < 248; i++) {
|
|
144
|
+
out.push(p);
|
|
145
|
+
p = p.double();
|
|
146
|
+
}
|
|
147
|
+
// NOTE: we cannot use wNAF here, because last 4 bits will require full 248 bits multiplication
|
|
148
|
+
// We can add support for this to wNAF, but it will complicate wNAF.
|
|
149
|
+
p = p2;
|
|
150
|
+
for (let i = 0; i < 4; i++) {
|
|
151
|
+
out.push(p);
|
|
152
|
+
p = p.double();
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
const PEDERSEN_POINTS1 = pedersenPrecompute(PEDERSEN_POINTS[1], PEDERSEN_POINTS[2]);
|
|
157
|
+
const PEDERSEN_POINTS2 = pedersenPrecompute(PEDERSEN_POINTS[3], PEDERSEN_POINTS[4]);
|
|
158
|
+
function pedersenArg(arg) {
|
|
159
|
+
let value;
|
|
160
|
+
if (typeof arg === 'bigint') {
|
|
161
|
+
value = arg;
|
|
162
|
+
}
|
|
163
|
+
else if (typeof arg === 'number') {
|
|
164
|
+
if (!Number.isSafeInteger(arg))
|
|
165
|
+
throw new Error(`Invalid pedersenArg: ${arg}`);
|
|
166
|
+
value = BigInt(arg);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
value = utils$1.bytesToNumberBE(ensureBytes(arg));
|
|
170
|
+
}
|
|
171
|
+
if (!(0n <= value && value < curve.CURVE.Fp.ORDER))
|
|
172
|
+
throw new Error(`PedersenArg should be 0 <= value < CURVE.P: ${value}`); // [0..Fp)
|
|
173
|
+
return value;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Warning: Not algorithmic constant-time.
|
|
177
|
+
*/
|
|
178
|
+
function pedersenSingle(point, value, constants) {
|
|
179
|
+
let x = pedersenArg(value);
|
|
180
|
+
for (let j = 0; j < 252; j++) {
|
|
181
|
+
const pt = constants[j];
|
|
182
|
+
if (!pt)
|
|
183
|
+
throw new Error('invalid constant index');
|
|
184
|
+
if (pt.equals(point))
|
|
185
|
+
throw new Error('Same point');
|
|
186
|
+
if ((x & 1n) !== 0n)
|
|
187
|
+
point = point.add(pt);
|
|
188
|
+
x >>= 1n;
|
|
189
|
+
}
|
|
190
|
+
return point;
|
|
191
|
+
}
|
|
192
|
+
// shift_point + x_low * P_0 + x_high * P1 + y_low * P2 + y_high * P3
|
|
193
|
+
function pedersen(x, y) {
|
|
194
|
+
let point = PEDERSEN_POINTS[0];
|
|
195
|
+
point = pedersenSingle(point, x, PEDERSEN_POINTS1);
|
|
196
|
+
point = pedersenSingle(point, y, PEDERSEN_POINTS2);
|
|
197
|
+
return extractX(point.toRawBytes(true));
|
|
198
|
+
}
|
|
199
|
+
const MASK_250 = utils$1.bitMask(250);
|
|
200
|
+
const keccak = (data) => utils$1.bytesToNumberBE(sha3.keccak_256(data)) & MASK_250;
|
|
201
|
+
const sha256Num = (data) => utils$1.bytesToNumberBE(sha256.sha256(data));
|
|
202
|
+
// Poseidon hash
|
|
203
|
+
// Unused for now
|
|
204
|
+
// export const Fp253 = Fp(
|
|
205
|
+
// BigInt('14474011154664525231415395255581126252639794253786371766033694892385558855681')
|
|
206
|
+
// ); // 2^253 + 2^199 + 1
|
|
207
|
+
const Fp251 = modular.Fp(BigInt('3618502788666131213697322783095070105623107215331596699973092056135872020481')); // 2^251 + 17 * 2^192 + 1
|
|
208
|
+
function poseidonRoundConstant(Fp, name, idx) {
|
|
209
|
+
const val = Fp.fromBytes(sha256.sha256(utils$2.utf8ToBytes(`${name}${idx}`)));
|
|
210
|
+
return Fp.create(val);
|
|
211
|
+
}
|
|
212
|
+
const MDS_SMALL = [
|
|
213
|
+
[3, 1, 1],
|
|
214
|
+
[1, -1, 1],
|
|
215
|
+
[1, 1, -2],
|
|
216
|
+
].map((i) => i.map(BigInt));
|
|
217
|
+
function poseidonBasic(opts, mds) {
|
|
218
|
+
modular.validateField(opts.Fp);
|
|
219
|
+
if (!Number.isSafeInteger(opts.rate) || !Number.isSafeInteger(opts.capacity))
|
|
220
|
+
throw new Error(`Wrong poseidon opts: ${opts}`);
|
|
221
|
+
const m = opts.rate + opts.capacity;
|
|
222
|
+
const rounds = opts.roundsFull + opts.roundsPartial;
|
|
223
|
+
const roundConstants = [];
|
|
224
|
+
for (let i = 0; i < rounds; i++) {
|
|
225
|
+
const row = [];
|
|
226
|
+
for (let j = 0; j < m; j++)
|
|
227
|
+
row.push(poseidonRoundConstant(opts.Fp, 'Hades', m * i + j));
|
|
228
|
+
roundConstants.push(row);
|
|
229
|
+
}
|
|
230
|
+
const res = poseidon.poseidon({
|
|
231
|
+
...opts,
|
|
232
|
+
t: m,
|
|
233
|
+
sboxPower: 3,
|
|
234
|
+
reversePartialPowIdx: true,
|
|
235
|
+
mds,
|
|
236
|
+
roundConstants,
|
|
237
|
+
});
|
|
238
|
+
res.m = m;
|
|
239
|
+
res.rate = opts.rate;
|
|
240
|
+
res.capacity = opts.capacity;
|
|
241
|
+
return res;
|
|
242
|
+
}
|
|
243
|
+
const poseidonSmall = poseidonBasic({ Fp: Fp251, rate: 2, capacity: 1, roundsFull: 8, roundsPartial: 83 }, MDS_SMALL);
|
|
244
|
+
function poseidonHash(x, y, fn = poseidonSmall) {
|
|
245
|
+
return fn([x, y, 2n])[0];
|
|
246
|
+
}
|
|
247
|
+
function poseidonHashMany(values, fn = poseidonSmall) {
|
|
248
|
+
const { m, rate } = fn;
|
|
249
|
+
if (!Array.isArray(values))
|
|
250
|
+
throw new Error('bigint array expected in values');
|
|
251
|
+
const padded = Array.from(values); // copy
|
|
252
|
+
padded.push(1n);
|
|
253
|
+
while (padded.length % rate !== 0)
|
|
254
|
+
padded.push(0n);
|
|
255
|
+
let state = new Array(m).fill(0n);
|
|
256
|
+
for (let i = 0; i < padded.length; i += rate) {
|
|
257
|
+
for (let j = 0; j < rate; j++) {
|
|
258
|
+
const item = padded[i + j];
|
|
259
|
+
if (typeof item === 'undefined')
|
|
260
|
+
throw new Error('invalid index');
|
|
261
|
+
state[j] += item;
|
|
262
|
+
}
|
|
263
|
+
state = fn(state);
|
|
264
|
+
}
|
|
265
|
+
return state[0];
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
exports.CURVE = CURVE;
|
|
269
|
+
exports.Fp251 = Fp251;
|
|
270
|
+
exports.MAX_VALUE = MAX_VALUE;
|
|
271
|
+
exports.ProjectivePoint = ProjectivePoint;
|
|
272
|
+
exports.Signature = Signature;
|
|
273
|
+
exports.ethSigToPrivate = ethSigToPrivate;
|
|
274
|
+
exports.getPublicKey = getPublicKey;
|
|
275
|
+
exports.getStarkKey = getStarkKey;
|
|
276
|
+
exports.grindKey = grindKey;
|
|
277
|
+
exports.keccak = keccak;
|
|
278
|
+
exports.pedersen = pedersen;
|
|
279
|
+
exports.poseidonBasic = poseidonBasic;
|
|
280
|
+
exports.poseidonHash = poseidonHash;
|
|
281
|
+
exports.poseidonHashMany = poseidonHashMany;
|
|
282
|
+
exports.poseidonSmall = poseidonSmall;
|
|
283
|
+
exports.sign = sign;
|
|
284
|
+
exports.utils = utils;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
require('../scure-base/index.js');
|
|
6
|
+
|
|
7
|
+
// import { ETransactionVersion } from './types/api';
|
|
8
|
+
/**
|
|
9
|
+
* Cairo Felt support storing max 31 character
|
|
10
|
+
*/
|
|
11
|
+
const TEXT_TO_FELT_MAX_LEN = 31;
|
|
12
|
+
/**
|
|
13
|
+
* Alternatively use directly from api specification
|
|
14
|
+
* types.RPC.ETransactionVersion
|
|
15
|
+
* For BN do BigInt(TRANSACTION_VERSION.*)
|
|
16
|
+
*/
|
|
17
|
+
// export { ETransactionVersion as TRANSACTION_VERSION };
|
|
18
|
+
const ZERO = 0n;
|
|
19
|
+
const MASK_250 = 2n ** 250n - 1n; // 2 ** 250 - 1
|
|
20
|
+
const PRIME = 2n ** 251n + 17n * 2n ** 192n + 1n;
|
|
21
|
+
// based on: https://github.com/starkware-libs/cairo-lang/blob/v0.12.3/src/starkware/starknet/common/storage.cairo#L3
|
|
22
|
+
const MAX_STORAGE_ITEM_SIZE = 256n;
|
|
23
|
+
const ADDR_BOUND = 2n ** 251n - MAX_STORAGE_ITEM_SIZE;
|
|
24
|
+
const range = (min, max) => ({ min, max });
|
|
25
|
+
const RANGE_FELT = range(ZERO, PRIME - 1n);
|
|
26
|
+
const RANGE_I128 = range(-(2n ** 127n), 2n ** 127n - 1n);
|
|
27
|
+
const RANGE_U128 = range(ZERO, 2n ** 128n - 1n);
|
|
28
|
+
exports.BaseUrl = void 0;
|
|
29
|
+
(function (BaseUrl) {
|
|
30
|
+
BaseUrl["SN_MAIN"] = "https://alpha-mainnet.starknet.io";
|
|
31
|
+
BaseUrl["SN_SEPOLIA"] = "https://alpha-sepolia.starknet.io";
|
|
32
|
+
})(exports.BaseUrl || (exports.BaseUrl = {}));
|
|
33
|
+
exports.NetworkName = void 0;
|
|
34
|
+
(function (NetworkName) {
|
|
35
|
+
NetworkName["SN_MAIN"] = "SN_MAIN";
|
|
36
|
+
NetworkName["SN_SEPOLIA"] = "SN_SEPOLIA";
|
|
37
|
+
})(exports.NetworkName || (exports.NetworkName = {}));
|
|
38
|
+
exports.StarknetChainId = void 0;
|
|
39
|
+
(function (StarknetChainId) {
|
|
40
|
+
StarknetChainId["SN_MAIN"] = "0x534e5f4d41494e";
|
|
41
|
+
StarknetChainId["SN_SEPOLIA"] = "0x534e5f5345504f4c4941";
|
|
42
|
+
})(exports.StarknetChainId || (exports.StarknetChainId = {}));
|
|
43
|
+
exports.TransactionHashPrefix = void 0;
|
|
44
|
+
(function (TransactionHashPrefix) {
|
|
45
|
+
TransactionHashPrefix["DECLARE"] = "0x6465636c617265";
|
|
46
|
+
TransactionHashPrefix["DEPLOY"] = "0x6465706c6f79";
|
|
47
|
+
TransactionHashPrefix["DEPLOY_ACCOUNT"] = "0x6465706c6f795f6163636f756e74";
|
|
48
|
+
TransactionHashPrefix["INVOKE"] = "0x696e766f6b65";
|
|
49
|
+
TransactionHashPrefix["L1_HANDLER"] = "0x6c315f68616e646c6572";
|
|
50
|
+
})(exports.TransactionHashPrefix || (exports.TransactionHashPrefix = {}));
|
|
51
|
+
|
|
52
|
+
exports.ADDR_BOUND = ADDR_BOUND;
|
|
53
|
+
exports.MASK_250 = MASK_250;
|
|
54
|
+
exports.MAX_STORAGE_ITEM_SIZE = MAX_STORAGE_ITEM_SIZE;
|
|
55
|
+
exports.PRIME = PRIME;
|
|
56
|
+
exports.RANGE_FELT = RANGE_FELT;
|
|
57
|
+
exports.RANGE_I128 = RANGE_I128;
|
|
58
|
+
exports.RANGE_U128 = RANGE_U128;
|
|
59
|
+
exports.TEXT_TO_FELT_MAX_LEN = TEXT_TO_FELT_MAX_LEN;
|
|
60
|
+
exports.ZERO = ZERO;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
exports.ValidateType = void 0;
|
|
6
|
+
(function (ValidateType) {
|
|
7
|
+
ValidateType["DEPLOY"] = "DEPLOY";
|
|
8
|
+
ValidateType["CALL"] = "CALL";
|
|
9
|
+
ValidateType["INVOKE"] = "INVOKE";
|
|
10
|
+
})(exports.ValidateType || (exports.ValidateType = {}));
|
|
11
|
+
exports.Uint = void 0;
|
|
12
|
+
(function (Uint) {
|
|
13
|
+
Uint["u8"] = "core::integer::u8";
|
|
14
|
+
Uint["u16"] = "core::integer::u16";
|
|
15
|
+
Uint["u32"] = "core::integer::u32";
|
|
16
|
+
Uint["u64"] = "core::integer::u64";
|
|
17
|
+
Uint["u128"] = "core::integer::u128";
|
|
18
|
+
Uint["u256"] = "core::integer::u256";
|
|
19
|
+
Uint["u512"] = "core::integer::u512";
|
|
20
|
+
})(exports.Uint || (exports.Uint = {}));
|
|
21
|
+
exports.Literal = void 0;
|
|
22
|
+
(function (Literal) {
|
|
23
|
+
Literal["ClassHash"] = "core::starknet::class_hash::ClassHash";
|
|
24
|
+
Literal["ContractAddress"] = "core::starknet::contract_address::ContractAddress";
|
|
25
|
+
Literal["Secp256k1Point"] = "core::starknet::secp256k1::Secp256k1Point";
|
|
26
|
+
})(exports.Literal || (exports.Literal = {}));
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var FunctionAbiType;
|
|
4
|
+
(function (FunctionAbiType) {
|
|
5
|
+
FunctionAbiType[FunctionAbiType["function"] = 0] = "function";
|
|
6
|
+
FunctionAbiType[FunctionAbiType["l1_handler"] = 1] = "l1_handler";
|
|
7
|
+
FunctionAbiType[FunctionAbiType["constructor"] = 2] = "constructor";
|
|
8
|
+
})(FunctionAbiType || (FunctionAbiType = {}));
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
require('./abi.js');
|
|
6
|
+
|
|
7
|
+
// Basic elements
|
|
8
|
+
exports.EntryPointType = void 0;
|
|
9
|
+
(function (EntryPointType) {
|
|
10
|
+
EntryPointType["EXTERNAL"] = "EXTERNAL";
|
|
11
|
+
EntryPointType["L1_HANDLER"] = "L1_HANDLER";
|
|
12
|
+
EntryPointType["CONSTRUCTOR"] = "CONSTRUCTOR";
|
|
13
|
+
})(exports.EntryPointType || (exports.EntryPointType = {}));
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var index = require('./contract/index.js');
|
|
6
|
+
|
|
7
|
+
exports.TransactionType = void 0;
|
|
8
|
+
(function (TransactionType) {
|
|
9
|
+
TransactionType["DECLARE"] = "DECLARE";
|
|
10
|
+
TransactionType["DEPLOY"] = "DEPLOY";
|
|
11
|
+
TransactionType["DEPLOY_ACCOUNT"] = "DEPLOY_ACCOUNT";
|
|
12
|
+
TransactionType["INVOKE"] = "INVOKE_FUNCTION";
|
|
13
|
+
})(exports.TransactionType || (exports.TransactionType = {}));
|
|
14
|
+
/**
|
|
15
|
+
* new statuses are defined by props: finality_status and execution_status
|
|
16
|
+
* to be #deprecated
|
|
17
|
+
*/
|
|
18
|
+
exports.TransactionStatus = void 0;
|
|
19
|
+
(function (TransactionStatus) {
|
|
20
|
+
TransactionStatus["NOT_RECEIVED"] = "NOT_RECEIVED";
|
|
21
|
+
TransactionStatus["RECEIVED"] = "RECEIVED";
|
|
22
|
+
TransactionStatus["ACCEPTED_ON_L2"] = "ACCEPTED_ON_L2";
|
|
23
|
+
TransactionStatus["ACCEPTED_ON_L1"] = "ACCEPTED_ON_L1";
|
|
24
|
+
TransactionStatus["REJECTED"] = "REJECTED";
|
|
25
|
+
TransactionStatus["REVERTED"] = "REVERTED";
|
|
26
|
+
})(exports.TransactionStatus || (exports.TransactionStatus = {}));
|
|
27
|
+
exports.TransactionFinalityStatus = void 0;
|
|
28
|
+
(function (TransactionFinalityStatus) {
|
|
29
|
+
TransactionFinalityStatus["NOT_RECEIVED"] = "NOT_RECEIVED";
|
|
30
|
+
TransactionFinalityStatus["RECEIVED"] = "RECEIVED";
|
|
31
|
+
TransactionFinalityStatus["ACCEPTED_ON_L2"] = "ACCEPTED_ON_L2";
|
|
32
|
+
TransactionFinalityStatus["ACCEPTED_ON_L1"] = "ACCEPTED_ON_L1";
|
|
33
|
+
})(exports.TransactionFinalityStatus || (exports.TransactionFinalityStatus = {}));
|
|
34
|
+
exports.TransactionExecutionStatus = void 0;
|
|
35
|
+
(function (TransactionExecutionStatus) {
|
|
36
|
+
TransactionExecutionStatus["REJECTED"] = "REJECTED";
|
|
37
|
+
TransactionExecutionStatus["REVERTED"] = "REVERTED";
|
|
38
|
+
TransactionExecutionStatus["SUCCEEDED"] = "SUCCEEDED";
|
|
39
|
+
})(exports.TransactionExecutionStatus || (exports.TransactionExecutionStatus = {}));
|
|
40
|
+
exports.BlockStatus = void 0;
|
|
41
|
+
(function (BlockStatus) {
|
|
42
|
+
BlockStatus["PENDING"] = "PENDING";
|
|
43
|
+
BlockStatus["ACCEPTED_ON_L1"] = "ACCEPTED_ON_L1";
|
|
44
|
+
BlockStatus["ACCEPTED_ON_L2"] = "ACCEPTED_ON_L2";
|
|
45
|
+
BlockStatus["REJECTED"] = "REJECTED";
|
|
46
|
+
})(exports.BlockStatus || (exports.BlockStatus = {}));
|
|
47
|
+
exports.BlockTag = void 0;
|
|
48
|
+
(function (BlockTag) {
|
|
49
|
+
BlockTag["pending"] = "pending";
|
|
50
|
+
BlockTag["latest"] = "latest";
|
|
51
|
+
})(exports.BlockTag || (exports.BlockTag = {}));
|
|
52
|
+
|
|
53
|
+
Object.defineProperty(exports, 'EntryPointType', {
|
|
54
|
+
enumerable: true,
|
|
55
|
+
get: function () { return index.EntryPointType; }
|
|
56
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
// Reexport types from package
|
|
6
|
+
// export {
|
|
7
|
+
// TypedDataRevision,
|
|
8
|
+
// type StarknetEnumType,
|
|
9
|
+
// type StarknetMerkleType,
|
|
10
|
+
// type StarknetType,
|
|
11
|
+
// type StarknetDomain,
|
|
12
|
+
// type TypedData,
|
|
13
|
+
// } from 'starknet-types-07';
|
|
14
|
+
const TypedDataRevision = {
|
|
15
|
+
Active: '1',
|
|
16
|
+
Legacy: '0',
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
exports.TypedDataRevision = TypedDataRevision;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Asserts that the given condition is true, otherwise throws an error with an optional message.
|
|
5
|
+
* @param {any} condition - The condition to check.
|
|
6
|
+
* @param {string} [message] - The optional message to include in the error.
|
|
7
|
+
* @throws {Error} Throws an error if the condition is false.
|
|
8
|
+
*/
|
|
9
|
+
function assert(condition, message) {
|
|
10
|
+
if (!condition) {
|
|
11
|
+
throw new Error(message || 'Assertion failure');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
module.exports = assert;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var num = require('../num.js');
|
|
6
|
+
var shortString = require('../shortString.js');
|
|
7
|
+
|
|
8
|
+
// TODO Convert to CairoFelt base on CairoUint256 and implement it in the codebase in the backward compatible manner
|
|
9
|
+
/**
|
|
10
|
+
* Create felt Cairo type (cairo type helper)
|
|
11
|
+
* @returns format: felt-string
|
|
12
|
+
*/
|
|
13
|
+
function CairoFelt(it) {
|
|
14
|
+
// BN or number
|
|
15
|
+
if (num.isBigInt(it) || Number.isInteger(it)) {
|
|
16
|
+
return it.toString();
|
|
17
|
+
}
|
|
18
|
+
// Handling strings
|
|
19
|
+
if (shortString.isString(it)) {
|
|
20
|
+
// Hex strings
|
|
21
|
+
if (num.isHex(it)) {
|
|
22
|
+
return BigInt(it).toString();
|
|
23
|
+
}
|
|
24
|
+
// Text strings that must be short
|
|
25
|
+
if (shortString.isText(it)) {
|
|
26
|
+
if (!shortString.isShortString(it)) {
|
|
27
|
+
throw new Error(`${it} is a long string > 31 chars. Please split it into an array of short strings.`);
|
|
28
|
+
}
|
|
29
|
+
// Assuming encodeShortString returns a hex representation of the string
|
|
30
|
+
return BigInt(shortString.encodeShortString(it)).toString();
|
|
31
|
+
}
|
|
32
|
+
// Whole numeric strings
|
|
33
|
+
if (num.isStringWholeNumber(it)) {
|
|
34
|
+
return it;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// bool to felt
|
|
38
|
+
if (num.isBoolean(it)) {
|
|
39
|
+
return `${+it}`;
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`${it} can't be computed by felt()`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
exports.CairoFelt = CairoFelt;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var encode = require('../encode.js');
|
|
6
|
+
var felt = require('./felt.js');
|
|
7
|
+
|
|
8
|
+
/* eslint-disable no-bitwise */
|
|
9
|
+
const UINT_128_MAX = (1n << 128n) - 1n;
|
|
10
|
+
const UINT_256_MAX = (1n << 256n) - 1n;
|
|
11
|
+
const UINT_256_MIN = 0n;
|
|
12
|
+
const UINT_256_LOW_MAX = 340282366920938463463374607431768211455n;
|
|
13
|
+
const UINT_256_HIGH_MAX = 340282366920938463463374607431768211455n;
|
|
14
|
+
const UINT_256_LOW_MIN = 0n;
|
|
15
|
+
const UINT_256_HIGH_MIN = 0n;
|
|
16
|
+
class CairoUint256 {
|
|
17
|
+
constructor(...arr) {
|
|
18
|
+
if (typeof arr[0] === 'object' && arr.length === 1 && 'low' in arr[0] && 'high' in arr[0]) {
|
|
19
|
+
const props = CairoUint256.validateProps(arr[0].low, arr[0].high);
|
|
20
|
+
this.low = props.low;
|
|
21
|
+
this.high = props.high;
|
|
22
|
+
}
|
|
23
|
+
else if (arr.length === 1) {
|
|
24
|
+
const bigInt = CairoUint256.validate(arr[0]);
|
|
25
|
+
this.low = bigInt & UINT_128_MAX;
|
|
26
|
+
this.high = bigInt >> 128n;
|
|
27
|
+
}
|
|
28
|
+
else if (arr.length === 2) {
|
|
29
|
+
const props = CairoUint256.validateProps(arr[0], arr[1]);
|
|
30
|
+
this.low = props.low;
|
|
31
|
+
this.high = props.high;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
throw Error('Incorrect constructor parameters');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validate if BigNumberish can be represented as Unit256
|
|
39
|
+
*/
|
|
40
|
+
static validate(bigNumberish) {
|
|
41
|
+
const bigInt = BigInt(bigNumberish);
|
|
42
|
+
if (bigInt < UINT_256_MIN)
|
|
43
|
+
throw Error('bigNumberish is smaller than UINT_256_MIN');
|
|
44
|
+
if (bigInt > UINT_256_MAX)
|
|
45
|
+
throw new Error('bigNumberish is bigger than UINT_256_MAX');
|
|
46
|
+
return bigInt;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Validate if low and high can be represented as Unit256
|
|
50
|
+
*/
|
|
51
|
+
static validateProps(low, high) {
|
|
52
|
+
const bigIntLow = BigInt(low);
|
|
53
|
+
const bigIntHigh = BigInt(high);
|
|
54
|
+
if (bigIntLow < UINT_256_LOW_MIN || bigIntLow > UINT_256_LOW_MAX) {
|
|
55
|
+
throw new Error('low is out of range UINT_256_LOW_MIN - UINT_256_LOW_MAX');
|
|
56
|
+
}
|
|
57
|
+
if (bigIntHigh < UINT_256_HIGH_MIN || bigIntHigh > UINT_256_HIGH_MAX) {
|
|
58
|
+
throw new Error('high is out of range UINT_256_HIGH_MIN - UINT_256_HIGH_MAX');
|
|
59
|
+
}
|
|
60
|
+
return { low: bigIntLow, high: bigIntHigh };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if BigNumberish can be represented as Unit256
|
|
64
|
+
*/
|
|
65
|
+
static is(bigNumberish) {
|
|
66
|
+
try {
|
|
67
|
+
CairoUint256.validate(bigNumberish);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if provided abi type is this data type
|
|
76
|
+
*/
|
|
77
|
+
static isAbiType(abiType) {
|
|
78
|
+
return abiType === CairoUint256.abiSelector;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Return bigint representation
|
|
82
|
+
*/
|
|
83
|
+
toBigInt() {
|
|
84
|
+
return (this.high << 128n) + this.low;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Return Uint256 structure with HexString props
|
|
88
|
+
* {low: HexString, high: HexString}
|
|
89
|
+
*/
|
|
90
|
+
toUint256HexString() {
|
|
91
|
+
return {
|
|
92
|
+
low: encode.addHexPrefix(this.low.toString(16)),
|
|
93
|
+
high: encode.addHexPrefix(this.high.toString(16)),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Return Uint256 structure with DecimalString props
|
|
98
|
+
* {low: DecString, high: DecString}
|
|
99
|
+
*/
|
|
100
|
+
toUint256DecimalString() {
|
|
101
|
+
return {
|
|
102
|
+
low: this.low.toString(10),
|
|
103
|
+
high: this.high.toString(10),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Return api requests representation witch is felt array
|
|
108
|
+
*/
|
|
109
|
+
toApiRequest() {
|
|
110
|
+
return [felt.CairoFelt(this.low), felt.CairoFelt(this.high)];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
CairoUint256.abiSelector = 'core::integer::u256';
|
|
114
|
+
|
|
115
|
+
exports.CairoUint256 = CairoUint256;
|
|
116
|
+
exports.UINT_128_MAX = UINT_128_MAX;
|
|
117
|
+
exports.UINT_256_HIGH_MAX = UINT_256_HIGH_MAX;
|
|
118
|
+
exports.UINT_256_HIGH_MIN = UINT_256_HIGH_MIN;
|
|
119
|
+
exports.UINT_256_LOW_MAX = UINT_256_LOW_MAX;
|
|
120
|
+
exports.UINT_256_LOW_MIN = UINT_256_LOW_MIN;
|
|
121
|
+
exports.UINT_256_MAX = UINT_256_MAX;
|
|
122
|
+
exports.UINT_256_MIN = UINT_256_MIN;
|