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,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;