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,214 @@
|
|
|
1
|
+
// ----------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
// PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
|
4
|
+
// https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
|
5
|
+
// EDIT THE CORRESPONDENT .ts FILE INSTEAD
|
|
6
|
+
|
|
7
|
+
import { CairoUint256 } from '../cairoDataTypes/uint256.js';
|
|
8
|
+
import { CairoUint512 } from '../cairoDataTypes/uint512.js';
|
|
9
|
+
import { addHexPrefix, removeHexPrefix } from '../encode.js';
|
|
10
|
+
import { toHex } from '../num.js';
|
|
11
|
+
import { decodeShortString } from '../shortString.js';
|
|
12
|
+
import { stringFromByteArray } from './byteArray.js';
|
|
13
|
+
import { getArrayType, isCairo1Type, isLen, isTypeArray, isTypeBool, isTypeByteArray, isTypeEnum, isTypeSecp256k1Point, isTypeTuple, } from './cairo.js';
|
|
14
|
+
import { CairoCustomEnum, CairoOption, CairoOptionVariant, CairoResult, CairoResultVariant, } from './enum/index.js';
|
|
15
|
+
import extractTupleMemberTypes from './tuple.js';
|
|
16
|
+
/**
|
|
17
|
+
* Parse base types
|
|
18
|
+
* @param type type of element
|
|
19
|
+
* @param it iterator
|
|
20
|
+
* @returns bigint | boolean
|
|
21
|
+
*/
|
|
22
|
+
function parseBaseTypes(type, it) {
|
|
23
|
+
let temp;
|
|
24
|
+
switch (true) {
|
|
25
|
+
case isTypeBool(type):
|
|
26
|
+
temp = it.next().value;
|
|
27
|
+
return Boolean(BigInt(temp));
|
|
28
|
+
case CairoUint256.isAbiType(type):
|
|
29
|
+
const low = it.next().value;
|
|
30
|
+
const high = it.next().value;
|
|
31
|
+
return new CairoUint256(low, high).toBigInt();
|
|
32
|
+
case CairoUint512.isAbiType(type):
|
|
33
|
+
const limb0 = it.next().value;
|
|
34
|
+
const limb1 = it.next().value;
|
|
35
|
+
const limb2 = it.next().value;
|
|
36
|
+
const limb3 = it.next().value;
|
|
37
|
+
return new CairoUint512(limb0, limb1, limb2, limb3).toBigInt();
|
|
38
|
+
case type === 'core::starknet::eth_address::EthAddress':
|
|
39
|
+
temp = it.next().value;
|
|
40
|
+
return BigInt(temp);
|
|
41
|
+
case type === 'core::bytes_31::bytes31':
|
|
42
|
+
temp = it.next().value;
|
|
43
|
+
return decodeShortString(temp);
|
|
44
|
+
case isTypeSecp256k1Point(type):
|
|
45
|
+
const xLow = removeHexPrefix(it.next().value).padStart(32, '0');
|
|
46
|
+
const xHigh = removeHexPrefix(it.next().value).padStart(32, '0');
|
|
47
|
+
const yLow = removeHexPrefix(it.next().value).padStart(32, '0');
|
|
48
|
+
const yHigh = removeHexPrefix(it.next().value).padStart(32, '0');
|
|
49
|
+
const pubK = BigInt(addHexPrefix(xHigh + xLow + yHigh + yLow));
|
|
50
|
+
return pubK;
|
|
51
|
+
default:
|
|
52
|
+
temp = it.next().value;
|
|
53
|
+
return BigInt(temp);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parse of the response elements that are converted to Object (Struct) by using the abi
|
|
58
|
+
*
|
|
59
|
+
* @param responseIterator - iterator of the response
|
|
60
|
+
* @param element - element of the field {name: string, type: string}
|
|
61
|
+
* @param structs - structs from abi
|
|
62
|
+
* @param enums
|
|
63
|
+
* @return {any} - parsed arguments in format that contract is expecting
|
|
64
|
+
*/
|
|
65
|
+
function parseResponseValue(responseIterator, element, structs, enums) {
|
|
66
|
+
if (element.type === '()') {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
// type uint256 struct (c1v2)
|
|
70
|
+
if (CairoUint256.isAbiType(element.type)) {
|
|
71
|
+
const low = responseIterator.next().value;
|
|
72
|
+
const high = responseIterator.next().value;
|
|
73
|
+
return new CairoUint256(low, high).toBigInt();
|
|
74
|
+
}
|
|
75
|
+
// type uint512 struct
|
|
76
|
+
if (CairoUint512.isAbiType(element.type)) {
|
|
77
|
+
const limb0 = responseIterator.next().value;
|
|
78
|
+
const limb1 = responseIterator.next().value;
|
|
79
|
+
const limb2 = responseIterator.next().value;
|
|
80
|
+
const limb3 = responseIterator.next().value;
|
|
81
|
+
return new CairoUint512(limb0, limb1, limb2, limb3).toBigInt();
|
|
82
|
+
}
|
|
83
|
+
// type C1 ByteArray struct, representing a LongString
|
|
84
|
+
if (isTypeByteArray(element.type)) {
|
|
85
|
+
const parsedBytes31Arr = [];
|
|
86
|
+
const bytes31ArrLen = BigInt(responseIterator.next().value);
|
|
87
|
+
while (parsedBytes31Arr.length < bytes31ArrLen) {
|
|
88
|
+
parsedBytes31Arr.push(toHex(responseIterator.next().value));
|
|
89
|
+
}
|
|
90
|
+
const pending_word = toHex(responseIterator.next().value);
|
|
91
|
+
const pending_word_len = BigInt(responseIterator.next().value);
|
|
92
|
+
const myByteArray = {
|
|
93
|
+
data: parsedBytes31Arr,
|
|
94
|
+
pending_word,
|
|
95
|
+
pending_word_len,
|
|
96
|
+
};
|
|
97
|
+
return stringFromByteArray(myByteArray);
|
|
98
|
+
}
|
|
99
|
+
// type c1 array
|
|
100
|
+
if (isTypeArray(element.type)) {
|
|
101
|
+
// eslint-disable-next-line no-case-declarations
|
|
102
|
+
const parsedDataArr = [];
|
|
103
|
+
const el = { name: '', type: getArrayType(element.type) };
|
|
104
|
+
const len = BigInt(responseIterator.next().value); // get length
|
|
105
|
+
while (parsedDataArr.length < len) {
|
|
106
|
+
parsedDataArr.push(parseResponseValue(responseIterator, el, structs, enums));
|
|
107
|
+
}
|
|
108
|
+
return parsedDataArr;
|
|
109
|
+
}
|
|
110
|
+
// type struct
|
|
111
|
+
if (structs && element.type in structs && structs[element.type]) {
|
|
112
|
+
if (element.type === 'core::starknet::eth_address::EthAddress') {
|
|
113
|
+
return parseBaseTypes(element.type, responseIterator);
|
|
114
|
+
}
|
|
115
|
+
return structs[element.type].members.reduce((acc, el) => {
|
|
116
|
+
acc[el.name] = parseResponseValue(responseIterator, el, structs, enums);
|
|
117
|
+
return acc;
|
|
118
|
+
}, {});
|
|
119
|
+
}
|
|
120
|
+
// type Enum (only CustomEnum)
|
|
121
|
+
if (enums && element.type in enums && enums[element.type]) {
|
|
122
|
+
const variantNum = Number(responseIterator.next().value); // get variant number
|
|
123
|
+
const rawEnum = enums[element.type].variants.reduce((acc, variant, num) => {
|
|
124
|
+
if (num === variantNum) {
|
|
125
|
+
acc[variant.name] = parseResponseValue(responseIterator, { name: '', type: variant.type }, structs, enums);
|
|
126
|
+
return acc;
|
|
127
|
+
}
|
|
128
|
+
acc[variant.name] = undefined;
|
|
129
|
+
return acc;
|
|
130
|
+
}, {});
|
|
131
|
+
// Option
|
|
132
|
+
if (element.type.startsWith('core::option::Option')) {
|
|
133
|
+
const content = variantNum === CairoOptionVariant.Some ? rawEnum.Some : undefined;
|
|
134
|
+
return new CairoOption(variantNum, content);
|
|
135
|
+
}
|
|
136
|
+
// Result
|
|
137
|
+
if (element.type.startsWith('core::result::Result')) {
|
|
138
|
+
let content;
|
|
139
|
+
if (variantNum === CairoResultVariant.Ok) {
|
|
140
|
+
content = rawEnum.Ok;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
content = rawEnum.Err;
|
|
144
|
+
}
|
|
145
|
+
return new CairoResult(variantNum, content);
|
|
146
|
+
}
|
|
147
|
+
// Cairo custom Enum
|
|
148
|
+
const customEnum = new CairoCustomEnum(rawEnum);
|
|
149
|
+
return customEnum;
|
|
150
|
+
}
|
|
151
|
+
// type tuple
|
|
152
|
+
if (isTypeTuple(element.type)) {
|
|
153
|
+
const memberTypes = extractTupleMemberTypes(element.type);
|
|
154
|
+
return memberTypes.reduce((acc, it, idx) => {
|
|
155
|
+
const name = it?.name ? it.name : idx;
|
|
156
|
+
const type = it?.type ? it.type : it;
|
|
157
|
+
const el = { name, type };
|
|
158
|
+
acc[name] = parseResponseValue(responseIterator, el, structs, enums);
|
|
159
|
+
return acc;
|
|
160
|
+
}, {});
|
|
161
|
+
}
|
|
162
|
+
// type c1 array
|
|
163
|
+
if (isTypeArray(element.type)) {
|
|
164
|
+
// eslint-disable-next-line no-case-declarations
|
|
165
|
+
const parsedDataArr = [];
|
|
166
|
+
const el = { name: '', type: getArrayType(element.type) };
|
|
167
|
+
const len = BigInt(responseIterator.next().value); // get length
|
|
168
|
+
while (parsedDataArr.length < len) {
|
|
169
|
+
parsedDataArr.push(parseResponseValue(responseIterator, el, structs, enums));
|
|
170
|
+
}
|
|
171
|
+
return parsedDataArr;
|
|
172
|
+
}
|
|
173
|
+
// base type
|
|
174
|
+
return parseBaseTypes(element.type, responseIterator);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Parse elements of the response and structuring them into one field by using output property from the abi for that method
|
|
178
|
+
*
|
|
179
|
+
* @param responseIterator - iterator of the response
|
|
180
|
+
* @param output - output(field) information from the abi that will be used to parse the data
|
|
181
|
+
* @param structs - structs from abi
|
|
182
|
+
* @param parsedResult
|
|
183
|
+
* @return - parsed response corresponding to the abi structure of the field
|
|
184
|
+
*/
|
|
185
|
+
export default function responseParser(responseIterator, output, structs, enums, parsedResult) {
|
|
186
|
+
const { name, type } = output;
|
|
187
|
+
let temp;
|
|
188
|
+
switch (true) {
|
|
189
|
+
case isLen(name):
|
|
190
|
+
temp = responseIterator.next().value;
|
|
191
|
+
return BigInt(temp);
|
|
192
|
+
case (structs && type in structs) || isTypeTuple(type):
|
|
193
|
+
return parseResponseValue(responseIterator, output, structs, enums);
|
|
194
|
+
case enums && isTypeEnum(type, enums):
|
|
195
|
+
return parseResponseValue(responseIterator, output, structs, enums);
|
|
196
|
+
case isTypeArray(type):
|
|
197
|
+
// C1 Array
|
|
198
|
+
if (isCairo1Type(type)) {
|
|
199
|
+
return parseResponseValue(responseIterator, output, structs, enums);
|
|
200
|
+
}
|
|
201
|
+
// C0 Array
|
|
202
|
+
// eslint-disable-next-line no-case-declarations
|
|
203
|
+
const parsedDataArr = [];
|
|
204
|
+
if (parsedResult && parsedResult[`${name}_len`]) {
|
|
205
|
+
const arrLen = parsedResult[`${name}_len`];
|
|
206
|
+
while (parsedDataArr.length < arrLen) {
|
|
207
|
+
parsedDataArr.push(parseResponseValue(responseIterator, { name, type: output.type.replace('*', '') }, structs, enums));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return parsedDataArr;
|
|
211
|
+
default:
|
|
212
|
+
return parseBaseTypes(type, responseIterator);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// ----------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
// PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
|
4
|
+
// https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
|
5
|
+
// EDIT THE CORRESPONDENT .ts FILE INSTEAD
|
|
6
|
+
|
|
7
|
+
/* eslint-disable no-plusplus */
|
|
8
|
+
import { isCairo1Type, isTypeNamedTuple } from './cairo.js';
|
|
9
|
+
function parseNamedTuple(namedTuple) {
|
|
10
|
+
const name = namedTuple.substring(0, namedTuple.indexOf(':'));
|
|
11
|
+
const type = namedTuple.substring(name.length + ':'.length);
|
|
12
|
+
return { name, type };
|
|
13
|
+
}
|
|
14
|
+
function parseSubTuple(s) {
|
|
15
|
+
if (!s.includes('('))
|
|
16
|
+
return { subTuple: [], result: s };
|
|
17
|
+
const subTuple = [];
|
|
18
|
+
let result = '';
|
|
19
|
+
let i = 0;
|
|
20
|
+
while (i < s.length) {
|
|
21
|
+
if (s[i] === '(') {
|
|
22
|
+
let counter = 1;
|
|
23
|
+
const lBracket = i;
|
|
24
|
+
i++;
|
|
25
|
+
while (counter) {
|
|
26
|
+
if (s[i] === ')')
|
|
27
|
+
counter--;
|
|
28
|
+
if (s[i] === '(')
|
|
29
|
+
counter++;
|
|
30
|
+
i++;
|
|
31
|
+
}
|
|
32
|
+
subTuple.push(s.substring(lBracket, i));
|
|
33
|
+
result += ' ';
|
|
34
|
+
i--;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
result += s[i];
|
|
38
|
+
}
|
|
39
|
+
i++;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
subTuple,
|
|
43
|
+
result,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function extractCairo0Tuple(type) {
|
|
47
|
+
const cleanType = type.replace(/\s/g, '').slice(1, -1); // remove first lvl () and spaces
|
|
48
|
+
// Decompose subTuple
|
|
49
|
+
const { subTuple, result } = parseSubTuple(cleanType);
|
|
50
|
+
// Recompose subTuple
|
|
51
|
+
let recomposed = result.split(',').map((it) => {
|
|
52
|
+
return subTuple.length ? it.replace(' ', subTuple.shift()) : it;
|
|
53
|
+
});
|
|
54
|
+
// Parse named tuple
|
|
55
|
+
if (isTypeNamedTuple(type)) {
|
|
56
|
+
recomposed = recomposed.reduce((acc, it) => {
|
|
57
|
+
return acc.concat(parseNamedTuple(it));
|
|
58
|
+
}, []);
|
|
59
|
+
}
|
|
60
|
+
return recomposed;
|
|
61
|
+
}
|
|
62
|
+
function getClosureOffset(input, open, close) {
|
|
63
|
+
for (let i = 0, counter = 0; i < input.length; i++) {
|
|
64
|
+
if (input[i] === open) {
|
|
65
|
+
counter++;
|
|
66
|
+
}
|
|
67
|
+
else if (input[i] === close && --counter === 0) {
|
|
68
|
+
return i;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return Number.POSITIVE_INFINITY;
|
|
72
|
+
}
|
|
73
|
+
function extractCairo1Tuple(type) {
|
|
74
|
+
// un-named tuples support
|
|
75
|
+
const input = type.slice(1, -1); // remove first lvl ()
|
|
76
|
+
const result = [];
|
|
77
|
+
let currentIndex = 0;
|
|
78
|
+
let limitIndex;
|
|
79
|
+
while (currentIndex < input.length) {
|
|
80
|
+
switch (true) {
|
|
81
|
+
// Tuple
|
|
82
|
+
case input[currentIndex] === '(': {
|
|
83
|
+
limitIndex = currentIndex + getClosureOffset(input.slice(currentIndex), '(', ')') + 1;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case input.startsWith('core::result::Result::<', currentIndex) ||
|
|
87
|
+
input.startsWith('core::array::Array::<', currentIndex) ||
|
|
88
|
+
input.startsWith('core::option::Option::<', currentIndex):
|
|
89
|
+
{
|
|
90
|
+
limitIndex = currentIndex + getClosureOffset(input.slice(currentIndex), '<', '>') + 1;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
default: {
|
|
94
|
+
const commaIndex = input.indexOf(',', currentIndex);
|
|
95
|
+
limitIndex = commaIndex !== -1 ? commaIndex : Number.POSITIVE_INFINITY;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
result.push(input.slice(currentIndex, limitIndex));
|
|
99
|
+
currentIndex = limitIndex + 2; // +2 to skip ', '
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Convert tuple string definition into object like definition
|
|
105
|
+
* @param type tuple string definition
|
|
106
|
+
* @returns object like tuple
|
|
107
|
+
*/
|
|
108
|
+
export default function extractTupleMemberTypes(type) {
|
|
109
|
+
if (isCairo1Type(type)) {
|
|
110
|
+
return extractCairo1Tuple(type);
|
|
111
|
+
}
|
|
112
|
+
return extractCairo0Tuple(type);
|
|
113
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate cairo contract method arguments
|
|
3
|
+
* Flow: Determine type from abi and than validate against parameter
|
|
4
|
+
*/
|
|
5
|
+
import { AbiEnums, AbiStructs, FunctionAbi } from '../../types/index.js';
|
|
6
|
+
export default function validateFields(abiMethod: FunctionAbi, args: Array<any>, structs: AbiStructs, enums: AbiEnums): void;
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
// ----------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
// PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
|
4
|
+
// https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
|
5
|
+
// EDIT THE CORRESPONDENT .ts FILE INSTEAD
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Validate cairo contract method arguments
|
|
9
|
+
* Flow: Determine type from abi and than validate against parameter
|
|
10
|
+
*/
|
|
11
|
+
import { Literal, Uint, } from '../../types/index.js';
|
|
12
|
+
import assert from '../assert.js';
|
|
13
|
+
import { CairoUint256 } from '../cairoDataTypes/uint256.js';
|
|
14
|
+
import { CairoUint512 } from '../cairoDataTypes/uint512.js';
|
|
15
|
+
import { isBigInt, isBoolean, isHex, isNumber, toBigInt } from '../num.js';
|
|
16
|
+
import { isLongText, isString } from '../shortString.js';
|
|
17
|
+
import { getArrayType, isLen, isTypeArray, isTypeBool, isTypeByteArray, isTypeBytes31, isTypeEnum, isTypeFelt, isTypeLiteral, isTypeOption, isTypeResult, isTypeStruct, isTypeTuple, isTypeUint, } from './cairo.js';
|
|
18
|
+
const validateFelt = (parameter, input) => {
|
|
19
|
+
assert(isString(parameter) || isNumber(parameter) || isBigInt(parameter), `Validate: arg ${input.name} should be a felt typed as (String, Number or BigInt)`);
|
|
20
|
+
if (isString(parameter) && !isHex(parameter))
|
|
21
|
+
return; // shortstring
|
|
22
|
+
const param = BigInt(parameter.toString(10));
|
|
23
|
+
assert(
|
|
24
|
+
// from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1266
|
|
25
|
+
param >= 0n && param <= 2n ** 252n - 1n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^252-1]`);
|
|
26
|
+
};
|
|
27
|
+
const validateBytes31 = (parameter, input) => {
|
|
28
|
+
assert(isString(parameter), `Validate: arg ${input.name} should be a string.`);
|
|
29
|
+
assert(parameter.length < 32, `Validate: arg ${input.name} cairo typed ${input.type} should be a string of less than 32 characters.`);
|
|
30
|
+
};
|
|
31
|
+
const validateByteArray = (parameter, input) => {
|
|
32
|
+
assert(isString(parameter), `Validate: arg ${input.name} should be a string.`);
|
|
33
|
+
};
|
|
34
|
+
const validateUint = (parameter, input) => {
|
|
35
|
+
if (isNumber(parameter)) {
|
|
36
|
+
assert(parameter <= Number.MAX_SAFE_INTEGER, `Validation: Parameter is to large to be typed as Number use (BigInt or String)`);
|
|
37
|
+
}
|
|
38
|
+
assert(isString(parameter) ||
|
|
39
|
+
isNumber(parameter) ||
|
|
40
|
+
isBigInt(parameter) ||
|
|
41
|
+
(typeof parameter === 'object' && 'low' in parameter && 'high' in parameter) ||
|
|
42
|
+
(typeof parameter === 'object' &&
|
|
43
|
+
['limb0', 'limb1', 'limb2', 'limb3'].every((key) => key in parameter)), `Validate: arg ${input.name} of cairo type ${input.type} should be type (String, Number or BigInt), but is ${typeof parameter} ${parameter}.`);
|
|
44
|
+
let param;
|
|
45
|
+
switch (input.type) {
|
|
46
|
+
case Uint.u256:
|
|
47
|
+
param = new CairoUint256(parameter).toBigInt();
|
|
48
|
+
break;
|
|
49
|
+
case Uint.u512:
|
|
50
|
+
param = new CairoUint512(parameter).toBigInt();
|
|
51
|
+
break;
|
|
52
|
+
default:
|
|
53
|
+
param = toBigInt(parameter);
|
|
54
|
+
}
|
|
55
|
+
switch (input.type) {
|
|
56
|
+
case Uint.u8:
|
|
57
|
+
assert(param >= 0n && param <= 255n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0 - 255]`);
|
|
58
|
+
break;
|
|
59
|
+
case Uint.u16:
|
|
60
|
+
assert(param >= 0n && param <= 65535n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 65535]`);
|
|
61
|
+
break;
|
|
62
|
+
case Uint.u32:
|
|
63
|
+
assert(param >= 0n && param <= 4294967295n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 4294967295]`);
|
|
64
|
+
break;
|
|
65
|
+
case Uint.u64:
|
|
66
|
+
assert(param >= 0n && param <= 2n ** 64n - 1n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^64-1]`);
|
|
67
|
+
break;
|
|
68
|
+
case Uint.u128:
|
|
69
|
+
assert(param >= 0n && param <= 2n ** 128n - 1n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^128-1]`);
|
|
70
|
+
break;
|
|
71
|
+
case Uint.u256:
|
|
72
|
+
assert(param >= 0n && param <= 2n ** 256n - 1n, `Validate: arg ${input.name} is ${input.type} 0 - 2^256-1`);
|
|
73
|
+
break;
|
|
74
|
+
case Uint.u512:
|
|
75
|
+
assert(CairoUint512.is(param), `Validate: arg ${input.name} is ${input.type} 0 - 2^512-1`);
|
|
76
|
+
break;
|
|
77
|
+
case Literal.ClassHash:
|
|
78
|
+
assert(
|
|
79
|
+
// from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1670
|
|
80
|
+
param >= 0n && param <= 2n ** 252n - 1n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^252-1]`);
|
|
81
|
+
break;
|
|
82
|
+
case Literal.ContractAddress:
|
|
83
|
+
assert(
|
|
84
|
+
// from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1245
|
|
85
|
+
param >= 0n && param <= 2n ** 252n - 1n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^252-1]`);
|
|
86
|
+
break;
|
|
87
|
+
case Literal.Secp256k1Point: {
|
|
88
|
+
assert(param >= 0n && param <= 2n ** 512n - 1n, `Validate: arg ${input.name} must be ${input.type} : a 512 bits number.`);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
default:
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const validateBool = (parameter, input) => {
|
|
96
|
+
assert(isBoolean(parameter), `Validate: arg ${input.name} of cairo type ${input.type} should be type (Boolean)`);
|
|
97
|
+
};
|
|
98
|
+
const validateStruct = (parameter, input, structs) => {
|
|
99
|
+
// c1v2 uint256 or u512 in struct
|
|
100
|
+
if (input.type === Uint.u256 || input.type === Uint.u512) {
|
|
101
|
+
validateUint(parameter, input);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (input.type === 'core::starknet::eth_address::EthAddress') {
|
|
105
|
+
assert(typeof parameter !== 'object', `EthAddress type is waiting a BigNumberish. Got ${parameter}`);
|
|
106
|
+
const param = BigInt(parameter.toString(10));
|
|
107
|
+
assert(
|
|
108
|
+
// from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1259
|
|
109
|
+
param >= 0n && param <= 2n ** 160n - 1n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^160-1]`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
assert(typeof parameter === 'object' && !Array.isArray(parameter), `Validate: arg ${input.name} is cairo type struct (${input.type}), and should be defined as js object (not array)`);
|
|
113
|
+
// shallow struct validation, only first depth level
|
|
114
|
+
structs[input.type].members.forEach(({ name }) => {
|
|
115
|
+
assert(Object.keys(parameter).includes(name), `Validate: arg ${input.name} should have a property ${name}`);
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
const validateEnum = (parameter, input) => {
|
|
119
|
+
assert(typeof parameter === 'object' && !Array.isArray(parameter), `Validate: arg ${input.name} is cairo type Enum (${input.type}), and should be defined as js object (not array)`);
|
|
120
|
+
const methodsKeys = Object.getOwnPropertyNames(Object.getPrototypeOf(parameter));
|
|
121
|
+
const keys = [...Object.getOwnPropertyNames(parameter), ...methodsKeys];
|
|
122
|
+
if (isTypeOption(input.type) && keys.includes('isSome') && keys.includes('isNone')) {
|
|
123
|
+
return; // Option Enum
|
|
124
|
+
}
|
|
125
|
+
if (isTypeResult(input.type) && keys.includes('isOk') && keys.includes('isErr')) {
|
|
126
|
+
return; // Result Enum
|
|
127
|
+
}
|
|
128
|
+
if (keys.includes('variant') && keys.includes('activeVariant')) {
|
|
129
|
+
return; // Custom Enum
|
|
130
|
+
}
|
|
131
|
+
throw new Error(`Validate Enum: argument ${input.name}, type ${input.type}, value received ${parameter}, is not an Enum.`);
|
|
132
|
+
};
|
|
133
|
+
const validateTuple = (parameter, input) => {
|
|
134
|
+
assert(typeof parameter === 'object' && !Array.isArray(parameter), `Validate: arg ${input.name} should be a tuple (defined as object)`);
|
|
135
|
+
// todo: skip tuple structural validation for now
|
|
136
|
+
};
|
|
137
|
+
const validateArray = (parameter, input, structs, enums) => {
|
|
138
|
+
const baseType = getArrayType(input.type);
|
|
139
|
+
// Long text (special case when parameter is not an array but long text)
|
|
140
|
+
if (isTypeFelt(baseType) && isLongText(parameter)) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
assert(Array.isArray(parameter), `Validate: arg ${input.name} should be an Array`);
|
|
144
|
+
switch (true) {
|
|
145
|
+
case isTypeFelt(baseType):
|
|
146
|
+
parameter.forEach((param) => validateFelt(param, input));
|
|
147
|
+
break;
|
|
148
|
+
case isTypeTuple(baseType):
|
|
149
|
+
parameter.forEach((it) => validateTuple(it, { name: input.name, type: baseType }));
|
|
150
|
+
break;
|
|
151
|
+
case isTypeArray(baseType):
|
|
152
|
+
parameter.forEach((param) => validateArray(param, { name: '', type: baseType }, structs, enums));
|
|
153
|
+
break;
|
|
154
|
+
case isTypeStruct(baseType, structs):
|
|
155
|
+
parameter.forEach((it) => validateStruct(it, { name: input.name, type: baseType }, structs));
|
|
156
|
+
break;
|
|
157
|
+
case isTypeEnum(baseType, enums):
|
|
158
|
+
parameter.forEach((it) => validateEnum(it, { name: input.name, type: baseType }));
|
|
159
|
+
break;
|
|
160
|
+
case isTypeUint(baseType) || isTypeLiteral(baseType):
|
|
161
|
+
parameter.forEach((param) => validateUint(param, { name: '', type: baseType }));
|
|
162
|
+
break;
|
|
163
|
+
case isTypeBool(baseType):
|
|
164
|
+
parameter.forEach((param) => validateBool(param, input));
|
|
165
|
+
break;
|
|
166
|
+
default:
|
|
167
|
+
throw new Error(`Validate Unhandled: argument ${input.name}, type ${input.type}, value ${parameter}`);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
export default function validateFields(abiMethod, args, structs, enums) {
|
|
171
|
+
abiMethod.inputs.reduce((acc, input) => {
|
|
172
|
+
const parameter = args[acc];
|
|
173
|
+
switch (true) {
|
|
174
|
+
case isLen(input.name):
|
|
175
|
+
return acc;
|
|
176
|
+
case isTypeFelt(input.type):
|
|
177
|
+
validateFelt(parameter, input);
|
|
178
|
+
break;
|
|
179
|
+
case isTypeBytes31(input.type):
|
|
180
|
+
validateBytes31(parameter, input);
|
|
181
|
+
break;
|
|
182
|
+
case isTypeUint(input.type) || isTypeLiteral(input.type):
|
|
183
|
+
validateUint(parameter, input);
|
|
184
|
+
break;
|
|
185
|
+
case isTypeBool(input.type):
|
|
186
|
+
validateBool(parameter, input);
|
|
187
|
+
break;
|
|
188
|
+
case isTypeByteArray(input.type):
|
|
189
|
+
validateByteArray(parameter, input);
|
|
190
|
+
break;
|
|
191
|
+
case isTypeArray(input.type):
|
|
192
|
+
validateArray(parameter, input, structs, enums);
|
|
193
|
+
break;
|
|
194
|
+
case isTypeStruct(input.type, structs):
|
|
195
|
+
validateStruct(parameter, input, structs);
|
|
196
|
+
break;
|
|
197
|
+
case isTypeEnum(input.type, enums):
|
|
198
|
+
validateEnum(parameter, input);
|
|
199
|
+
break;
|
|
200
|
+
case isTypeTuple(input.type):
|
|
201
|
+
validateTuple(parameter, input);
|
|
202
|
+
break;
|
|
203
|
+
default:
|
|
204
|
+
throw new Error(`Validate Unhandled: argument ${input.name}, type ${input.type}, value ${parameter}`);
|
|
205
|
+
}
|
|
206
|
+
return acc + 1;
|
|
207
|
+
}, 0);
|
|
208
|
+
}
|