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.
Files changed (187) hide show
  1. package/README.md +7 -6
  2. package/dist/ccxt.browser.min.js +13 -10
  3. package/dist/cjs/ccxt.js +8 -1
  4. package/dist/cjs/src/abstract/paradex.js +9 -0
  5. package/dist/cjs/src/ascendex.js +1 -1
  6. package/dist/cjs/src/base/Exchange.js +55 -0
  7. package/dist/cjs/src/binance.js +1 -1
  8. package/dist/cjs/src/blofin.js +63 -6
  9. package/dist/cjs/src/bybit.js +1 -1
  10. package/dist/cjs/src/coinbaseinternational.js +168 -2
  11. package/dist/cjs/src/cryptocom.js +9 -1
  12. package/dist/cjs/src/hitbtc.js +1 -1
  13. package/dist/cjs/src/paradex.js +2075 -0
  14. package/dist/cjs/src/poloniex.js +1 -0
  15. package/dist/cjs/src/pro/bequant.js +4 -0
  16. package/dist/cjs/src/pro/blofin.js +665 -0
  17. package/dist/cjs/src/pro/coinbaseinternational.js +154 -9
  18. package/dist/cjs/src/pro/cryptocom.js +3 -1
  19. package/dist/cjs/src/pro/hitbtc.js +26 -8
  20. package/dist/cjs/src/pro/okx.js +7 -0
  21. package/dist/cjs/src/pro/paradex.js +365 -0
  22. package/dist/cjs/src/pro/poloniex.js +37 -12
  23. package/dist/cjs/src/pro/woo.js +5 -4
  24. package/dist/cjs/src/static_dependencies/noble-curves/abstract/poseidon.js +100 -0
  25. package/dist/cjs/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -0
  26. package/dist/cjs/src/static_dependencies/scure-starknet/index.js +284 -0
  27. package/dist/cjs/src/static_dependencies/starknet/constants.js +60 -0
  28. package/dist/cjs/src/static_dependencies/starknet/types/calldata.js +26 -0
  29. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/abi.js +8 -0
  30. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/index.js +13 -0
  31. package/dist/cjs/src/static_dependencies/starknet/types/lib/index.js +56 -0
  32. package/dist/cjs/src/static_dependencies/starknet/types/typedData.js +19 -0
  33. package/dist/cjs/src/static_dependencies/starknet/utils/assert.js +15 -0
  34. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +44 -0
  35. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +122 -0
  36. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +137 -0
  37. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/byteArray.js +61 -0
  38. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/cairo.js +218 -0
  39. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
  40. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
  41. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
  42. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/formatter.js +66 -0
  43. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/index.js +281 -0
  44. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/index.js +33 -0
  45. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +37 -0
  46. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
  47. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +156 -0
  48. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/requestParser.js +250 -0
  49. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/responseParser.js +215 -0
  50. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/tuple.js +112 -0
  51. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/validate.js +206 -0
  52. package/dist/cjs/src/static_dependencies/starknet/utils/encode.js +58 -0
  53. package/dist/cjs/src/static_dependencies/starknet/utils/hash/classHash.js +57 -0
  54. package/dist/cjs/src/static_dependencies/starknet/utils/merkle.js +76 -0
  55. package/dist/cjs/src/static_dependencies/starknet/utils/num.js +92 -0
  56. package/dist/cjs/src/static_dependencies/starknet/utils/selector.js +48 -0
  57. package/dist/cjs/src/static_dependencies/starknet/utils/shortString.js +101 -0
  58. package/dist/cjs/src/static_dependencies/starknet/utils/typedData.js +334 -0
  59. package/dist/cjs/src/woo.js +4 -2
  60. package/js/ccxt.d.ts +11 -2
  61. package/js/ccxt.js +8 -2
  62. package/js/src/abstract/coinbaseinternational.d.ts +1 -1
  63. package/js/src/abstract/paradex.d.ts +43 -0
  64. package/js/src/abstract/paradex.js +11 -0
  65. package/js/src/ascendex.js +1 -1
  66. package/js/src/base/Exchange.d.ts +8 -0
  67. package/js/src/base/Exchange.js +51 -0
  68. package/js/src/binance.js +1 -1
  69. package/js/src/blofin.d.ts +1 -1
  70. package/js/src/blofin.js +63 -6
  71. package/js/src/bybit.js +1 -1
  72. package/js/src/coinbaseinternational.d.ts +6 -1
  73. package/js/src/coinbaseinternational.js +168 -2
  74. package/js/src/cryptocom.js +10 -2
  75. package/js/src/hitbtc.js +1 -1
  76. package/js/src/paradex.d.ts +76 -0
  77. package/js/src/paradex.js +2075 -0
  78. package/js/src/poloniex.js +1 -0
  79. package/js/src/pro/bequant.js +4 -0
  80. package/js/src/pro/blofin.d.ts +39 -0
  81. package/js/src/pro/blofin.js +668 -0
  82. package/js/src/pro/coinbaseinternational.d.ts +5 -1
  83. package/js/src/pro/coinbaseinternational.js +155 -10
  84. package/js/src/pro/cryptocom.js +4 -2
  85. package/js/src/pro/hitbtc.d.ts +1 -1
  86. package/js/src/pro/hitbtc.js +26 -8
  87. package/js/src/pro/okx.js +7 -0
  88. package/js/src/pro/paradex.d.ts +15 -0
  89. package/js/src/pro/paradex.js +366 -0
  90. package/js/src/pro/poloniex.js +37 -12
  91. package/js/src/pro/woo.js +5 -4
  92. package/js/src/static_dependencies/noble-curves/abstract/weierstrass.d.ts +24 -0
  93. package/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -1
  94. package/js/src/static_dependencies/scure-starknet/index.d.ts +79 -0
  95. package/js/src/static_dependencies/scure-starknet/index.js +323 -0
  96. package/js/src/static_dependencies/starknet/constants.d.ts +61 -0
  97. package/js/src/static_dependencies/starknet/constants.js +67 -0
  98. package/js/src/static_dependencies/starknet/index.d.ts +7 -0
  99. package/js/src/static_dependencies/starknet/index.js +50 -0
  100. package/js/src/static_dependencies/starknet/types/cairoEnum.d.ts +2 -0
  101. package/js/src/static_dependencies/starknet/types/cairoEnum.js +7 -0
  102. package/js/src/static_dependencies/starknet/types/calldata.d.ts +19 -0
  103. package/js/src/static_dependencies/starknet/types/calldata.js +28 -0
  104. package/js/src/static_dependencies/starknet/types/index.d.ts +13 -0
  105. package/js/src/static_dependencies/starknet/types/index.js +16 -0
  106. package/js/src/static_dependencies/starknet/types/lib/contract/abi.d.ts +71 -0
  107. package/js/src/static_dependencies/starknet/types/lib/contract/abi.js +13 -0
  108. package/js/src/static_dependencies/starknet/types/lib/contract/index.d.ts +24 -0
  109. package/js/src/static_dependencies/starknet/types/lib/contract/index.js +16 -0
  110. package/js/src/static_dependencies/starknet/types/lib/contract/legacy.d.ts +33 -0
  111. package/js/src/static_dependencies/starknet/types/lib/contract/legacy.js +7 -0
  112. package/js/src/static_dependencies/starknet/types/lib/contract/sierra.d.ts +52 -0
  113. package/js/src/static_dependencies/starknet/types/lib/contract/sierra.js +7 -0
  114. package/js/src/static_dependencies/starknet/types/lib/index.d.ts +248 -0
  115. package/js/src/static_dependencies/starknet/types/lib/index.js +52 -0
  116. package/js/src/static_dependencies/starknet/types/typedData.d.ts +44 -0
  117. package/js/src/static_dependencies/starknet/types/typedData.js +19 -0
  118. package/js/src/static_dependencies/starknet/utils/address.d.ts +53 -0
  119. package/js/src/static_dependencies/starknet/utils/address.js +89 -0
  120. package/js/src/static_dependencies/starknet/utils/assert.d.ts +7 -0
  121. package/js/src/static_dependencies/starknet/utils/assert.js +17 -0
  122. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.d.ts +6 -0
  123. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +43 -0
  124. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.d.ts +72 -0
  125. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +117 -0
  126. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.d.ts +76 -0
  127. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +136 -0
  128. package/js/src/static_dependencies/starknet/utils/calldata/byteArray.d.ts +32 -0
  129. package/js/src/static_dependencies/starknet/utils/calldata/byteArray.js +59 -0
  130. package/js/src/static_dependencies/starknet/utils/calldata/cairo.d.ts +183 -0
  131. package/js/src/static_dependencies/starknet/utils/calldata/cairo.js +229 -0
  132. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.d.ts +38 -0
  133. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
  134. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.d.ts +35 -0
  135. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
  136. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.d.ts +34 -0
  137. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
  138. package/js/src/static_dependencies/starknet/utils/calldata/enum/index.d.ts +3 -0
  139. package/js/src/static_dependencies/starknet/utils/calldata/enum/index.js +9 -0
  140. package/js/src/static_dependencies/starknet/utils/calldata/formatter.d.ts +9 -0
  141. package/js/src/static_dependencies/starknet/utils/calldata/formatter.js +67 -0
  142. package/js/src/static_dependencies/starknet/utils/calldata/index.d.ts +89 -0
  143. package/js/src/static_dependencies/starknet/utils/calldata/index.js +280 -0
  144. package/js/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +5 -0
  145. package/js/src/static_dependencies/starknet/utils/calldata/parser/index.js +30 -0
  146. package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.d.ts +20 -0
  147. package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.js +8 -0
  148. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.d.ts +24 -0
  149. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +36 -0
  150. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.d.ts +23 -0
  151. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
  152. package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.d.ts +2 -0
  153. package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +155 -0
  154. package/js/src/static_dependencies/starknet/utils/calldata/requestParser.d.ts +11 -0
  155. package/js/src/static_dependencies/starknet/utils/calldata/requestParser.js +248 -0
  156. package/js/src/static_dependencies/starknet/utils/calldata/responseParser.d.ts +11 -0
  157. package/js/src/static_dependencies/starknet/utils/calldata/responseParser.js +214 -0
  158. package/js/src/static_dependencies/starknet/utils/calldata/tuple.d.ts +6 -0
  159. package/js/src/static_dependencies/starknet/utils/calldata/tuple.js +113 -0
  160. package/js/src/static_dependencies/starknet/utils/calldata/validate.d.ts +6 -0
  161. package/js/src/static_dependencies/starknet/utils/calldata/validate.js +208 -0
  162. package/js/src/static_dependencies/starknet/utils/encode.d.ts +207 -0
  163. package/js/src/static_dependencies/starknet/utils/encode.js +282 -0
  164. package/js/src/static_dependencies/starknet/utils/hash/classHash.d.ts +57 -0
  165. package/js/src/static_dependencies/starknet/utils/hash/classHash.js +224 -0
  166. package/js/src/static_dependencies/starknet/utils/hash/index.d.ts +6 -0
  167. package/js/src/static_dependencies/starknet/utils/hash/index.js +13 -0
  168. package/js/src/static_dependencies/starknet/utils/json.d.ts +24 -0
  169. package/js/src/static_dependencies/starknet/utils/json.js +43 -0
  170. package/js/src/static_dependencies/starknet/utils/merkle.d.ts +35 -0
  171. package/js/src/static_dependencies/starknet/utils/merkle.js +84 -0
  172. package/js/src/static_dependencies/starknet/utils/num.d.ts +182 -0
  173. package/js/src/static_dependencies/starknet/utils/num.js +244 -0
  174. package/js/src/static_dependencies/starknet/utils/selector.d.ts +48 -0
  175. package/js/src/static_dependencies/starknet/utils/selector.js +85 -0
  176. package/js/src/static_dependencies/starknet/utils/shortString.d.ts +57 -0
  177. package/js/src/static_dependencies/starknet/utils/shortString.js +96 -0
  178. package/js/src/static_dependencies/starknet/utils/starknetId.d.ts +113 -0
  179. package/js/src/static_dependencies/starknet/utils/starknetId.js +265 -0
  180. package/js/src/static_dependencies/starknet/utils/typedData.d.ts +54 -0
  181. package/js/src/static_dependencies/starknet/utils/typedData.js +321 -0
  182. package/js/src/static_dependencies/starknet/utils/uint256.d.ts +21 -0
  183. package/js/src/static_dependencies/starknet/utils/uint256.js +32 -0
  184. package/js/src/static_dependencies/starknet/utils/url.d.ts +29 -0
  185. package/js/src/static_dependencies/starknet/utils/url.js +70 -0
  186. package/js/src/woo.js +4 -2
  187. 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,6 @@
1
+ /**
2
+ * Convert tuple string definition into object like definition
3
+ * @param type tuple string definition
4
+ * @returns object like tuple
5
+ */
6
+ export default function extractTupleMemberTypes(type: string): (string | object)[];
@@ -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
+ }