ccxt 4.3.69 → 4.3.71
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 +7 -6
- package/dist/ccxt.browser.min.js +13 -10
- package/dist/cjs/ccxt.js +8 -1
- package/dist/cjs/src/abstract/paradex.js +9 -0
- package/dist/cjs/src/ascendex.js +1 -1
- package/dist/cjs/src/base/Exchange.js +55 -0
- package/dist/cjs/src/binance.js +1 -1
- package/dist/cjs/src/blofin.js +63 -6
- package/dist/cjs/src/bybit.js +1 -1
- package/dist/cjs/src/coinbaseinternational.js +168 -2
- package/dist/cjs/src/cryptocom.js +9 -1
- package/dist/cjs/src/hitbtc.js +1 -1
- package/dist/cjs/src/paradex.js +2075 -0
- package/dist/cjs/src/poloniex.js +1 -0
- package/dist/cjs/src/pro/bequant.js +4 -0
- package/dist/cjs/src/pro/blofin.js +665 -0
- package/dist/cjs/src/pro/coinbaseinternational.js +154 -9
- package/dist/cjs/src/pro/cryptocom.js +3 -1
- package/dist/cjs/src/pro/hitbtc.js +26 -8
- package/dist/cjs/src/pro/okx.js +7 -0
- package/dist/cjs/src/pro/paradex.js +365 -0
- package/dist/cjs/src/pro/poloniex.js +37 -12
- package/dist/cjs/src/pro/woo.js +5 -4
- 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/js/ccxt.d.ts +11 -2
- package/js/ccxt.js +8 -2
- package/js/src/abstract/coinbaseinternational.d.ts +1 -1
- package/js/src/abstract/paradex.d.ts +43 -0
- package/js/src/abstract/paradex.js +11 -0
- package/js/src/ascendex.js +1 -1
- package/js/src/base/Exchange.d.ts +8 -0
- package/js/src/base/Exchange.js +51 -0
- package/js/src/binance.js +1 -1
- package/js/src/blofin.d.ts +1 -1
- package/js/src/blofin.js +63 -6
- package/js/src/bybit.js +1 -1
- package/js/src/coinbaseinternational.d.ts +6 -1
- package/js/src/coinbaseinternational.js +168 -2
- package/js/src/cryptocom.js +10 -2
- package/js/src/hitbtc.js +1 -1
- package/js/src/paradex.d.ts +76 -0
- package/js/src/paradex.js +2075 -0
- package/js/src/poloniex.js +1 -0
- package/js/src/pro/bequant.js +4 -0
- package/js/src/pro/blofin.d.ts +39 -0
- package/js/src/pro/blofin.js +668 -0
- package/js/src/pro/coinbaseinternational.d.ts +5 -1
- package/js/src/pro/coinbaseinternational.js +155 -10
- package/js/src/pro/cryptocom.js +4 -2
- package/js/src/pro/hitbtc.d.ts +1 -1
- package/js/src/pro/hitbtc.js +26 -8
- package/js/src/pro/okx.js +7 -0
- package/js/src/pro/paradex.d.ts +15 -0
- package/js/src/pro/paradex.js +366 -0
- package/js/src/pro/poloniex.js +37 -12
- package/js/src/pro/woo.js +5 -4
- 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,250 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var uint256 = require('../cairoDataTypes/uint256.js');
|
|
6
|
+
var uint512 = require('../cairoDataTypes/uint512.js');
|
|
7
|
+
var encode = require('../encode.js');
|
|
8
|
+
var num = require('../num.js');
|
|
9
|
+
var shortString = require('../shortString.js');
|
|
10
|
+
var byteArray = require('./byteArray.js');
|
|
11
|
+
var cairo = require('./cairo.js');
|
|
12
|
+
var CairoOption = require('./enum/CairoOption.js');
|
|
13
|
+
var CairoResult = require('./enum/CairoResult.js');
|
|
14
|
+
var tuple = require('./tuple.js');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* parse base types
|
|
18
|
+
* @param type type from abi
|
|
19
|
+
* @param val value provided
|
|
20
|
+
* @returns string | string[]
|
|
21
|
+
*/
|
|
22
|
+
function parseBaseTypes(type, val) {
|
|
23
|
+
switch (true) {
|
|
24
|
+
case uint256.CairoUint256.isAbiType(type):
|
|
25
|
+
return new uint256.CairoUint256(val).toApiRequest();
|
|
26
|
+
case uint512.CairoUint512.isAbiType(type):
|
|
27
|
+
return new uint512.CairoUint512(val).toApiRequest();
|
|
28
|
+
case cairo.isTypeBytes31(type):
|
|
29
|
+
return shortString.encodeShortString(val.toString());
|
|
30
|
+
case cairo.isTypeSecp256k1Point(type): {
|
|
31
|
+
const pubKeyETH = encode.removeHexPrefix(num.toHex(val)).padStart(128, '0');
|
|
32
|
+
const pubKeyETHy = cairo.uint256(encode.addHexPrefix(pubKeyETH.slice(-64)));
|
|
33
|
+
const pubKeyETHx = cairo.uint256(encode.addHexPrefix(pubKeyETH.slice(0, -64)));
|
|
34
|
+
return [
|
|
35
|
+
cairo.felt(pubKeyETHx.low),
|
|
36
|
+
cairo.felt(pubKeyETHx.high),
|
|
37
|
+
cairo.felt(pubKeyETHy.low),
|
|
38
|
+
cairo.felt(pubKeyETHy.high),
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
default:
|
|
42
|
+
return cairo.felt(val);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Parse tuple type string to array of known objects
|
|
47
|
+
* @param element request element
|
|
48
|
+
* @param typeStr tuple type string
|
|
49
|
+
* @returns Tupled[]
|
|
50
|
+
*/
|
|
51
|
+
function parseTuple(element, typeStr) {
|
|
52
|
+
const memberTypes = tuple(typeStr);
|
|
53
|
+
const elements = Object.values(element);
|
|
54
|
+
if (elements.length !== memberTypes.length) {
|
|
55
|
+
throw Error(`ParseTuple: provided and expected abi tuple size do not match.
|
|
56
|
+
provided: ${elements}
|
|
57
|
+
expected: ${memberTypes}`);
|
|
58
|
+
}
|
|
59
|
+
return memberTypes.map((it, dx) => {
|
|
60
|
+
return {
|
|
61
|
+
element: elements[dx],
|
|
62
|
+
type: it.type ?? it,
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function parseByteArray(element) {
|
|
67
|
+
const myByteArray = byteArray.byteArrayFromString(element);
|
|
68
|
+
return [
|
|
69
|
+
myByteArray.data.length.toString(),
|
|
70
|
+
...myByteArray.data.map((bn) => bn.toString()),
|
|
71
|
+
myByteArray.pending_word.toString(),
|
|
72
|
+
myByteArray.pending_word_len.toString(),
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Deep parse of the object that has been passed to the method
|
|
77
|
+
*
|
|
78
|
+
* @param element - element that needs to be parsed
|
|
79
|
+
* @param type - name of the method
|
|
80
|
+
* @param structs - structs from abi
|
|
81
|
+
* @param enums - enums from abi
|
|
82
|
+
* @return {string | string[]} - parsed arguments in format that contract is expecting
|
|
83
|
+
*/
|
|
84
|
+
function parseCalldataValue(element, type, structs, enums) {
|
|
85
|
+
if (element === undefined) {
|
|
86
|
+
throw Error(`Missing parameter for type ${type}`);
|
|
87
|
+
}
|
|
88
|
+
// value is Array
|
|
89
|
+
if (Array.isArray(element)) {
|
|
90
|
+
const result = [];
|
|
91
|
+
result.push(cairo.felt(element.length)); // Add length to array
|
|
92
|
+
const arrayType = cairo.getArrayType(type);
|
|
93
|
+
return element.reduce((acc, it) => {
|
|
94
|
+
return acc.concat(parseCalldataValue(it, arrayType, structs, enums));
|
|
95
|
+
}, result);
|
|
96
|
+
}
|
|
97
|
+
// checking if the passed element is struct
|
|
98
|
+
if (structs[type] && structs[type].members.length) {
|
|
99
|
+
if (uint256.CairoUint256.isAbiType(type)) {
|
|
100
|
+
return new uint256.CairoUint256(element).toApiRequest();
|
|
101
|
+
}
|
|
102
|
+
if (uint512.CairoUint512.isAbiType(type)) {
|
|
103
|
+
return new uint512.CairoUint512(element).toApiRequest();
|
|
104
|
+
}
|
|
105
|
+
if (type === 'core::starknet::eth_address::EthAddress')
|
|
106
|
+
return parseBaseTypes(type, element);
|
|
107
|
+
if (type === 'core::byte_array::ByteArray')
|
|
108
|
+
return parseByteArray(element);
|
|
109
|
+
const { members } = structs[type];
|
|
110
|
+
const subElement = element;
|
|
111
|
+
return members.reduce((acc, it) => {
|
|
112
|
+
return acc.concat(parseCalldataValue(subElement[it.name], it.type, structs, enums));
|
|
113
|
+
}, []);
|
|
114
|
+
}
|
|
115
|
+
// check if abi element is tuple
|
|
116
|
+
if (cairo.isTypeTuple(type)) {
|
|
117
|
+
const tupled = parseTuple(element, type);
|
|
118
|
+
return tupled.reduce((acc, it) => {
|
|
119
|
+
const parsedData = parseCalldataValue(it.element, it.type, structs, enums);
|
|
120
|
+
return acc.concat(parsedData);
|
|
121
|
+
}, []);
|
|
122
|
+
}
|
|
123
|
+
// check if u256 C1v0
|
|
124
|
+
if (uint256.CairoUint256.isAbiType(type)) {
|
|
125
|
+
return new uint256.CairoUint256(element).toApiRequest();
|
|
126
|
+
}
|
|
127
|
+
// check if u512
|
|
128
|
+
if (uint512.CairoUint512.isAbiType(type)) {
|
|
129
|
+
return new uint512.CairoUint512(element).toApiRequest();
|
|
130
|
+
}
|
|
131
|
+
// check if Enum
|
|
132
|
+
if (cairo.isTypeEnum(type, enums)) {
|
|
133
|
+
const { variants } = enums[type];
|
|
134
|
+
// Option Enum
|
|
135
|
+
if (cairo.isTypeOption(type)) {
|
|
136
|
+
const myOption = element;
|
|
137
|
+
if (myOption.isSome()) {
|
|
138
|
+
const listTypeVariant = variants.find((variant) => variant.name === 'Some');
|
|
139
|
+
if (typeof listTypeVariant === 'undefined') {
|
|
140
|
+
throw Error(`Error in abi : Option has no 'Some' variant.`);
|
|
141
|
+
}
|
|
142
|
+
const typeVariantSome = listTypeVariant.type;
|
|
143
|
+
if (typeVariantSome === '()') {
|
|
144
|
+
return CairoOption.CairoOptionVariant.Some.toString();
|
|
145
|
+
}
|
|
146
|
+
const parsedParameter = parseCalldataValue(myOption.unwrap(), typeVariantSome, structs, enums);
|
|
147
|
+
if (Array.isArray(parsedParameter)) {
|
|
148
|
+
return [CairoOption.CairoOptionVariant.Some.toString(), ...parsedParameter];
|
|
149
|
+
}
|
|
150
|
+
return [CairoOption.CairoOptionVariant.Some.toString(), parsedParameter];
|
|
151
|
+
}
|
|
152
|
+
return CairoOption.CairoOptionVariant.None.toString();
|
|
153
|
+
}
|
|
154
|
+
// Result Enum
|
|
155
|
+
if (cairo.isTypeResult(type)) {
|
|
156
|
+
const myResult = element;
|
|
157
|
+
if (myResult.isOk()) {
|
|
158
|
+
const listTypeVariant = variants.find((variant) => variant.name === 'Ok');
|
|
159
|
+
if (typeof listTypeVariant === 'undefined') {
|
|
160
|
+
throw Error(`Error in abi : Result has no 'Ok' variant.`);
|
|
161
|
+
}
|
|
162
|
+
const typeVariantOk = listTypeVariant.type;
|
|
163
|
+
if (typeVariantOk === '()') {
|
|
164
|
+
return CairoResult.CairoResultVariant.Ok.toString();
|
|
165
|
+
}
|
|
166
|
+
const parsedParameter = parseCalldataValue(myResult.unwrap(), typeVariantOk, structs, enums);
|
|
167
|
+
if (Array.isArray(parsedParameter)) {
|
|
168
|
+
return [CairoResult.CairoResultVariant.Ok.toString(), ...parsedParameter];
|
|
169
|
+
}
|
|
170
|
+
return [CairoResult.CairoResultVariant.Ok.toString(), parsedParameter];
|
|
171
|
+
}
|
|
172
|
+
// is Result::Err
|
|
173
|
+
const listTypeVariant = variants.find((variant) => variant.name === 'Err');
|
|
174
|
+
if (typeof listTypeVariant === 'undefined') {
|
|
175
|
+
throw Error(`Error in abi : Result has no 'Err' variant.`);
|
|
176
|
+
}
|
|
177
|
+
const typeVariantErr = listTypeVariant.type;
|
|
178
|
+
if (typeVariantErr === '()') {
|
|
179
|
+
return CairoResult.CairoResultVariant.Err.toString();
|
|
180
|
+
}
|
|
181
|
+
const parsedParameter = parseCalldataValue(myResult.unwrap(), typeVariantErr, structs, enums);
|
|
182
|
+
if (Array.isArray(parsedParameter)) {
|
|
183
|
+
return [CairoResult.CairoResultVariant.Err.toString(), ...parsedParameter];
|
|
184
|
+
}
|
|
185
|
+
return [CairoResult.CairoResultVariant.Err.toString(), parsedParameter];
|
|
186
|
+
}
|
|
187
|
+
// Custom Enum
|
|
188
|
+
const myEnum = element;
|
|
189
|
+
const activeVariant = myEnum.activeVariant();
|
|
190
|
+
const listTypeVariant = variants.find((variant) => variant.name === activeVariant);
|
|
191
|
+
if (typeof listTypeVariant === 'undefined') {
|
|
192
|
+
throw Error(`Not find in abi : Enum has no '${activeVariant}' variant.`);
|
|
193
|
+
}
|
|
194
|
+
const typeActiveVariant = listTypeVariant.type;
|
|
195
|
+
const numActiveVariant = variants.findIndex((variant) => variant.name === activeVariant); // can not fail due to check of listTypeVariant
|
|
196
|
+
if (typeActiveVariant === '()') {
|
|
197
|
+
return numActiveVariant.toString();
|
|
198
|
+
}
|
|
199
|
+
const parsedParameter = parseCalldataValue(myEnum.unwrap(), typeActiveVariant, structs, enums);
|
|
200
|
+
if (Array.isArray(parsedParameter)) {
|
|
201
|
+
return [numActiveVariant.toString(), ...parsedParameter];
|
|
202
|
+
}
|
|
203
|
+
return [numActiveVariant.toString(), parsedParameter];
|
|
204
|
+
}
|
|
205
|
+
if (typeof element === 'object') {
|
|
206
|
+
throw Error(`Parameter ${element} do not align with abi parameter ${type}`);
|
|
207
|
+
}
|
|
208
|
+
return parseBaseTypes(type, element);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Parse one field of the calldata by using input field from the abi for that method
|
|
212
|
+
*
|
|
213
|
+
* @param argsIterator - Iterator for value of the field
|
|
214
|
+
* @param input - input(field) information from the abi that will be used to parse the data
|
|
215
|
+
* @param structs - structs from abi
|
|
216
|
+
* @param enums - enums from abi
|
|
217
|
+
* @return {string | string[]} - parsed arguments in format that contract is expecting
|
|
218
|
+
*/
|
|
219
|
+
function parseCalldataField(argsIterator, input, structs, enums) {
|
|
220
|
+
const { name, type } = input;
|
|
221
|
+
let { value } = argsIterator.next();
|
|
222
|
+
switch (true) {
|
|
223
|
+
// Array
|
|
224
|
+
case cairo.isTypeArray(type):
|
|
225
|
+
if (!Array.isArray(value) && !shortString.isText(value)) {
|
|
226
|
+
throw Error(`ABI expected parameter ${name} to be array or long string, got ${value}`);
|
|
227
|
+
}
|
|
228
|
+
if (shortString.isString(value)) {
|
|
229
|
+
// long string match cairo felt*
|
|
230
|
+
value = shortString.splitLongString(value);
|
|
231
|
+
}
|
|
232
|
+
return parseCalldataValue(value, input.type, structs, enums);
|
|
233
|
+
case type === 'core::starknet::eth_address::EthAddress':
|
|
234
|
+
return parseBaseTypes(type, value);
|
|
235
|
+
// Struct or Tuple
|
|
236
|
+
case cairo.isTypeStruct(type, structs) ||
|
|
237
|
+
cairo.isTypeTuple(type) ||
|
|
238
|
+
uint256.CairoUint256.isAbiType(type) ||
|
|
239
|
+
uint256.CairoUint256.isAbiType(type):
|
|
240
|
+
return parseCalldataValue(value, type, structs, enums);
|
|
241
|
+
// Enums
|
|
242
|
+
case cairo.isTypeEnum(type, enums):
|
|
243
|
+
return parseCalldataValue(value, type, structs, enums);
|
|
244
|
+
// Felt or unhandled
|
|
245
|
+
default:
|
|
246
|
+
return parseBaseTypes(type, value);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
exports.parseCalldataField = parseCalldataField;
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var uint256 = require('../cairoDataTypes/uint256.js');
|
|
4
|
+
var uint512 = require('../cairoDataTypes/uint512.js');
|
|
5
|
+
var encode = require('../encode.js');
|
|
6
|
+
var num = require('../num.js');
|
|
7
|
+
var shortString = require('../shortString.js');
|
|
8
|
+
var byteArray = require('./byteArray.js');
|
|
9
|
+
var cairo = require('./cairo.js');
|
|
10
|
+
var CairoCustomEnum = require('./enum/CairoCustomEnum.js');
|
|
11
|
+
var CairoOption = require('./enum/CairoOption.js');
|
|
12
|
+
var CairoResult = require('./enum/CairoResult.js');
|
|
13
|
+
var tuple = require('./tuple.js');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Parse base types
|
|
17
|
+
* @param type type of element
|
|
18
|
+
* @param it iterator
|
|
19
|
+
* @returns bigint | boolean
|
|
20
|
+
*/
|
|
21
|
+
function parseBaseTypes(type, it) {
|
|
22
|
+
let temp;
|
|
23
|
+
switch (true) {
|
|
24
|
+
case cairo.isTypeBool(type):
|
|
25
|
+
temp = it.next().value;
|
|
26
|
+
return Boolean(BigInt(temp));
|
|
27
|
+
case uint256.CairoUint256.isAbiType(type):
|
|
28
|
+
const low = it.next().value;
|
|
29
|
+
const high = it.next().value;
|
|
30
|
+
return new uint256.CairoUint256(low, high).toBigInt();
|
|
31
|
+
case uint512.CairoUint512.isAbiType(type):
|
|
32
|
+
const limb0 = it.next().value;
|
|
33
|
+
const limb1 = it.next().value;
|
|
34
|
+
const limb2 = it.next().value;
|
|
35
|
+
const limb3 = it.next().value;
|
|
36
|
+
return new uint512.CairoUint512(limb0, limb1, limb2, limb3).toBigInt();
|
|
37
|
+
case type === 'core::starknet::eth_address::EthAddress':
|
|
38
|
+
temp = it.next().value;
|
|
39
|
+
return BigInt(temp);
|
|
40
|
+
case type === 'core::bytes_31::bytes31':
|
|
41
|
+
temp = it.next().value;
|
|
42
|
+
return shortString.decodeShortString(temp);
|
|
43
|
+
case cairo.isTypeSecp256k1Point(type):
|
|
44
|
+
const xLow = encode.removeHexPrefix(it.next().value).padStart(32, '0');
|
|
45
|
+
const xHigh = encode.removeHexPrefix(it.next().value).padStart(32, '0');
|
|
46
|
+
const yLow = encode.removeHexPrefix(it.next().value).padStart(32, '0');
|
|
47
|
+
const yHigh = encode.removeHexPrefix(it.next().value).padStart(32, '0');
|
|
48
|
+
const pubK = BigInt(encode.addHexPrefix(xHigh + xLow + yHigh + yLow));
|
|
49
|
+
return pubK;
|
|
50
|
+
default:
|
|
51
|
+
temp = it.next().value;
|
|
52
|
+
return BigInt(temp);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse of the response elements that are converted to Object (Struct) by using the abi
|
|
57
|
+
*
|
|
58
|
+
* @param responseIterator - iterator of the response
|
|
59
|
+
* @param element - element of the field {name: string, type: string}
|
|
60
|
+
* @param structs - structs from abi
|
|
61
|
+
* @param enums
|
|
62
|
+
* @return {any} - parsed arguments in format that contract is expecting
|
|
63
|
+
*/
|
|
64
|
+
function parseResponseValue(responseIterator, element, structs, enums) {
|
|
65
|
+
if (element.type === '()') {
|
|
66
|
+
return {};
|
|
67
|
+
}
|
|
68
|
+
// type uint256 struct (c1v2)
|
|
69
|
+
if (uint256.CairoUint256.isAbiType(element.type)) {
|
|
70
|
+
const low = responseIterator.next().value;
|
|
71
|
+
const high = responseIterator.next().value;
|
|
72
|
+
return new uint256.CairoUint256(low, high).toBigInt();
|
|
73
|
+
}
|
|
74
|
+
// type uint512 struct
|
|
75
|
+
if (uint512.CairoUint512.isAbiType(element.type)) {
|
|
76
|
+
const limb0 = responseIterator.next().value;
|
|
77
|
+
const limb1 = responseIterator.next().value;
|
|
78
|
+
const limb2 = responseIterator.next().value;
|
|
79
|
+
const limb3 = responseIterator.next().value;
|
|
80
|
+
return new uint512.CairoUint512(limb0, limb1, limb2, limb3).toBigInt();
|
|
81
|
+
}
|
|
82
|
+
// type C1 ByteArray struct, representing a LongString
|
|
83
|
+
if (cairo.isTypeByteArray(element.type)) {
|
|
84
|
+
const parsedBytes31Arr = [];
|
|
85
|
+
const bytes31ArrLen = BigInt(responseIterator.next().value);
|
|
86
|
+
while (parsedBytes31Arr.length < bytes31ArrLen) {
|
|
87
|
+
parsedBytes31Arr.push(num.toHex(responseIterator.next().value));
|
|
88
|
+
}
|
|
89
|
+
const pending_word = num.toHex(responseIterator.next().value);
|
|
90
|
+
const pending_word_len = BigInt(responseIterator.next().value);
|
|
91
|
+
const myByteArray = {
|
|
92
|
+
data: parsedBytes31Arr,
|
|
93
|
+
pending_word,
|
|
94
|
+
pending_word_len,
|
|
95
|
+
};
|
|
96
|
+
return byteArray.stringFromByteArray(myByteArray);
|
|
97
|
+
}
|
|
98
|
+
// type c1 array
|
|
99
|
+
if (cairo.isTypeArray(element.type)) {
|
|
100
|
+
// eslint-disable-next-line no-case-declarations
|
|
101
|
+
const parsedDataArr = [];
|
|
102
|
+
const el = { name: '', type: cairo.getArrayType(element.type) };
|
|
103
|
+
const len = BigInt(responseIterator.next().value); // get length
|
|
104
|
+
while (parsedDataArr.length < len) {
|
|
105
|
+
parsedDataArr.push(parseResponseValue(responseIterator, el, structs, enums));
|
|
106
|
+
}
|
|
107
|
+
return parsedDataArr;
|
|
108
|
+
}
|
|
109
|
+
// type struct
|
|
110
|
+
if (structs && element.type in structs && structs[element.type]) {
|
|
111
|
+
if (element.type === 'core::starknet::eth_address::EthAddress') {
|
|
112
|
+
return parseBaseTypes(element.type, responseIterator);
|
|
113
|
+
}
|
|
114
|
+
return structs[element.type].members.reduce((acc, el) => {
|
|
115
|
+
acc[el.name] = parseResponseValue(responseIterator, el, structs, enums);
|
|
116
|
+
return acc;
|
|
117
|
+
}, {});
|
|
118
|
+
}
|
|
119
|
+
// type Enum (only CustomEnum)
|
|
120
|
+
if (enums && element.type in enums && enums[element.type]) {
|
|
121
|
+
const variantNum = Number(responseIterator.next().value); // get variant number
|
|
122
|
+
const rawEnum = enums[element.type].variants.reduce((acc, variant, num) => {
|
|
123
|
+
if (num === variantNum) {
|
|
124
|
+
acc[variant.name] = parseResponseValue(responseIterator, { name: '', type: variant.type }, structs, enums);
|
|
125
|
+
return acc;
|
|
126
|
+
}
|
|
127
|
+
acc[variant.name] = undefined;
|
|
128
|
+
return acc;
|
|
129
|
+
}, {});
|
|
130
|
+
// Option
|
|
131
|
+
if (element.type.startsWith('core::option::Option')) {
|
|
132
|
+
const content = variantNum === CairoOption.CairoOptionVariant.Some ? rawEnum.Some : undefined;
|
|
133
|
+
return new CairoOption.CairoOption(variantNum, content);
|
|
134
|
+
}
|
|
135
|
+
// Result
|
|
136
|
+
if (element.type.startsWith('core::result::Result')) {
|
|
137
|
+
let content;
|
|
138
|
+
if (variantNum === CairoResult.CairoResultVariant.Ok) {
|
|
139
|
+
content = rawEnum.Ok;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
content = rawEnum.Err;
|
|
143
|
+
}
|
|
144
|
+
return new CairoResult.CairoResult(variantNum, content);
|
|
145
|
+
}
|
|
146
|
+
// Cairo custom Enum
|
|
147
|
+
const customEnum = new CairoCustomEnum.CairoCustomEnum(rawEnum);
|
|
148
|
+
return customEnum;
|
|
149
|
+
}
|
|
150
|
+
// type tuple
|
|
151
|
+
if (cairo.isTypeTuple(element.type)) {
|
|
152
|
+
const memberTypes = tuple(element.type);
|
|
153
|
+
return memberTypes.reduce((acc, it, idx) => {
|
|
154
|
+
const name = it?.name ? it.name : idx;
|
|
155
|
+
const type = it?.type ? it.type : it;
|
|
156
|
+
const el = { name, type };
|
|
157
|
+
acc[name] = parseResponseValue(responseIterator, el, structs, enums);
|
|
158
|
+
return acc;
|
|
159
|
+
}, {});
|
|
160
|
+
}
|
|
161
|
+
// type c1 array
|
|
162
|
+
if (cairo.isTypeArray(element.type)) {
|
|
163
|
+
// eslint-disable-next-line no-case-declarations
|
|
164
|
+
const parsedDataArr = [];
|
|
165
|
+
const el = { name: '', type: cairo.getArrayType(element.type) };
|
|
166
|
+
const len = BigInt(responseIterator.next().value); // get length
|
|
167
|
+
while (parsedDataArr.length < len) {
|
|
168
|
+
parsedDataArr.push(parseResponseValue(responseIterator, el, structs, enums));
|
|
169
|
+
}
|
|
170
|
+
return parsedDataArr;
|
|
171
|
+
}
|
|
172
|
+
// base type
|
|
173
|
+
return parseBaseTypes(element.type, responseIterator);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Parse elements of the response and structuring them into one field by using output property from the abi for that method
|
|
177
|
+
*
|
|
178
|
+
* @param responseIterator - iterator of the response
|
|
179
|
+
* @param output - output(field) information from the abi that will be used to parse the data
|
|
180
|
+
* @param structs - structs from abi
|
|
181
|
+
* @param parsedResult
|
|
182
|
+
* @return - parsed response corresponding to the abi structure of the field
|
|
183
|
+
*/
|
|
184
|
+
function responseParser(responseIterator, output, structs, enums, parsedResult) {
|
|
185
|
+
const { name, type } = output;
|
|
186
|
+
let temp;
|
|
187
|
+
switch (true) {
|
|
188
|
+
case cairo.isLen(name):
|
|
189
|
+
temp = responseIterator.next().value;
|
|
190
|
+
return BigInt(temp);
|
|
191
|
+
case (structs && type in structs) || cairo.isTypeTuple(type):
|
|
192
|
+
return parseResponseValue(responseIterator, output, structs, enums);
|
|
193
|
+
case enums && cairo.isTypeEnum(type, enums):
|
|
194
|
+
return parseResponseValue(responseIterator, output, structs, enums);
|
|
195
|
+
case cairo.isTypeArray(type):
|
|
196
|
+
// C1 Array
|
|
197
|
+
if (cairo.isCairo1Type(type)) {
|
|
198
|
+
return parseResponseValue(responseIterator, output, structs, enums);
|
|
199
|
+
}
|
|
200
|
+
// C0 Array
|
|
201
|
+
// eslint-disable-next-line no-case-declarations
|
|
202
|
+
const parsedDataArr = [];
|
|
203
|
+
if (parsedResult && parsedResult[`${name}_len`]) {
|
|
204
|
+
const arrLen = parsedResult[`${name}_len`];
|
|
205
|
+
while (parsedDataArr.length < arrLen) {
|
|
206
|
+
parsedDataArr.push(parseResponseValue(responseIterator, { name, type: output.type.replace('*', '') }, structs, enums));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return parsedDataArr;
|
|
210
|
+
default:
|
|
211
|
+
return parseBaseTypes(type, responseIterator);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
module.exports = responseParser;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var cairo = require('./cairo.js');
|
|
4
|
+
|
|
5
|
+
/* eslint-disable no-plusplus */
|
|
6
|
+
function parseNamedTuple(namedTuple) {
|
|
7
|
+
const name = namedTuple.substring(0, namedTuple.indexOf(':'));
|
|
8
|
+
const type = namedTuple.substring(name.length + ':'.length);
|
|
9
|
+
return { name, type };
|
|
10
|
+
}
|
|
11
|
+
function parseSubTuple(s) {
|
|
12
|
+
if (!s.includes('('))
|
|
13
|
+
return { subTuple: [], result: s };
|
|
14
|
+
const subTuple = [];
|
|
15
|
+
let result = '';
|
|
16
|
+
let i = 0;
|
|
17
|
+
while (i < s.length) {
|
|
18
|
+
if (s[i] === '(') {
|
|
19
|
+
let counter = 1;
|
|
20
|
+
const lBracket = i;
|
|
21
|
+
i++;
|
|
22
|
+
while (counter) {
|
|
23
|
+
if (s[i] === ')')
|
|
24
|
+
counter--;
|
|
25
|
+
if (s[i] === '(')
|
|
26
|
+
counter++;
|
|
27
|
+
i++;
|
|
28
|
+
}
|
|
29
|
+
subTuple.push(s.substring(lBracket, i));
|
|
30
|
+
result += ' ';
|
|
31
|
+
i--;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
result += s[i];
|
|
35
|
+
}
|
|
36
|
+
i++;
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
subTuple,
|
|
40
|
+
result,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function extractCairo0Tuple(type) {
|
|
44
|
+
const cleanType = type.replace(/\s/g, '').slice(1, -1); // remove first lvl () and spaces
|
|
45
|
+
// Decompose subTuple
|
|
46
|
+
const { subTuple, result } = parseSubTuple(cleanType);
|
|
47
|
+
// Recompose subTuple
|
|
48
|
+
let recomposed = result.split(',').map((it) => {
|
|
49
|
+
return subTuple.length ? it.replace(' ', subTuple.shift()) : it;
|
|
50
|
+
});
|
|
51
|
+
// Parse named tuple
|
|
52
|
+
if (cairo.isTypeNamedTuple(type)) {
|
|
53
|
+
recomposed = recomposed.reduce((acc, it) => {
|
|
54
|
+
return acc.concat(parseNamedTuple(it));
|
|
55
|
+
}, []);
|
|
56
|
+
}
|
|
57
|
+
return recomposed;
|
|
58
|
+
}
|
|
59
|
+
function getClosureOffset(input, open, close) {
|
|
60
|
+
for (let i = 0, counter = 0; i < input.length; i++) {
|
|
61
|
+
if (input[i] === open) {
|
|
62
|
+
counter++;
|
|
63
|
+
}
|
|
64
|
+
else if (input[i] === close && --counter === 0) {
|
|
65
|
+
return i;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return Number.POSITIVE_INFINITY;
|
|
69
|
+
}
|
|
70
|
+
function extractCairo1Tuple(type) {
|
|
71
|
+
// un-named tuples support
|
|
72
|
+
const input = type.slice(1, -1); // remove first lvl ()
|
|
73
|
+
const result = [];
|
|
74
|
+
let currentIndex = 0;
|
|
75
|
+
let limitIndex;
|
|
76
|
+
while (currentIndex < input.length) {
|
|
77
|
+
switch (true) {
|
|
78
|
+
// Tuple
|
|
79
|
+
case input[currentIndex] === '(': {
|
|
80
|
+
limitIndex = currentIndex + getClosureOffset(input.slice(currentIndex), '(', ')') + 1;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
case input.startsWith('core::result::Result::<', currentIndex) ||
|
|
84
|
+
input.startsWith('core::array::Array::<', currentIndex) ||
|
|
85
|
+
input.startsWith('core::option::Option::<', currentIndex):
|
|
86
|
+
{
|
|
87
|
+
limitIndex = currentIndex + getClosureOffset(input.slice(currentIndex), '<', '>') + 1;
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
default: {
|
|
91
|
+
const commaIndex = input.indexOf(',', currentIndex);
|
|
92
|
+
limitIndex = commaIndex !== -1 ? commaIndex : Number.POSITIVE_INFINITY;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
result.push(input.slice(currentIndex, limitIndex));
|
|
96
|
+
currentIndex = limitIndex + 2; // +2 to skip ', '
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Convert tuple string definition into object like definition
|
|
102
|
+
* @param type tuple string definition
|
|
103
|
+
* @returns object like tuple
|
|
104
|
+
*/
|
|
105
|
+
function extractTupleMemberTypes(type) {
|
|
106
|
+
if (cairo.isCairo1Type(type)) {
|
|
107
|
+
return extractCairo1Tuple(type);
|
|
108
|
+
}
|
|
109
|
+
return extractCairo0Tuple(type);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
module.exports = extractTupleMemberTypes;
|