starknet 6.9.0 → 6.10.1
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/CHANGELOG.md +12 -0
- package/LICENSE +1 -1
- package/README.md +5 -9
- package/dist/account/default.cjs +655 -0
- package/dist/account/default.d.ts +67 -0
- package/dist/account/default.mjs +652 -0
- package/dist/account/index.cjs +27 -0
- package/dist/account/index.d.ts +2 -0
- package/dist/account/index.mjs +2 -0
- package/dist/account/interface.cjs +9 -0
- package/dist/account/interface.d.ts +301 -0
- package/dist/account/interface.mjs +3 -0
- package/dist/channel/index.cjs +27 -0
- package/dist/channel/index.d.ts +3 -0
- package/dist/channel/index.mjs +3 -0
- package/dist/channel/rpc_0_6.cjs +607 -0
- package/dist/channel/rpc_0_6.d.ts +78 -0
- package/dist/channel/rpc_0_6.mjs +543 -0
- package/dist/channel/rpc_0_7.cjs +619 -0
- package/dist/channel/rpc_0_7.d.ts +81 -0
- package/dist/channel/rpc_0_7.mjs +561 -0
- package/dist/constants.cjs +76 -0
- package/dist/constants.d.ts +70 -0
- package/dist/constants.mjs +60 -0
- package/dist/contract/contractFactory.cjs +93 -0
- package/dist/contract/contractFactory.d.ts +46 -0
- package/dist/contract/contractFactory.mjs +83 -0
- package/dist/contract/default.cjs +269 -0
- package/dist/contract/default.d.ts +58 -0
- package/dist/contract/default.mjs +254 -0
- package/dist/contract/index.cjs +38 -0
- package/dist/contract/index.d.ts +3 -0
- package/dist/contract/index.mjs +3 -0
- package/dist/contract/interface.cjs +13 -0
- package/dist/contract/interface.d.ts +128 -0
- package/dist/contract/interface.mjs +6 -0
- package/dist/index.cjs +267 -0
- package/dist/index.d.ts +45 -5991
- package/dist/index.global.js +728 -609
- package/dist/index.global.js.map +1 -1
- package/dist/index.mjs +39 -7320
- package/dist/provider/errors.cjs +50 -0
- package/dist/provider/errors.d.ts +16 -0
- package/dist/provider/errors.mjs +35 -0
- package/dist/provider/extensions/default.cjs +11 -0
- package/dist/provider/extensions/default.d.ts +6 -0
- package/dist/provider/extensions/default.mjs +5 -0
- package/dist/provider/extensions/starknetId.cjs +174 -0
- package/dist/provider/extensions/starknetId.d.ts +10 -0
- package/dist/provider/extensions/starknetId.mjs +230 -0
- package/dist/provider/index.cjs +56 -0
- package/dist/provider/index.d.ts +6 -0
- package/dist/provider/index.mjs +6 -0
- package/dist/provider/interface.cjs +8 -0
- package/dist/provider/interface.d.ts +261 -0
- package/dist/provider/interface.mjs +2 -0
- package/dist/provider/rpc.cjs +301 -0
- package/dist/provider/rpc.d.ts +115 -0
- package/dist/provider/rpc.mjs +302 -0
- package/dist/service/types.cjs +1 -0
- package/dist/service/types.d.ts +5 -0
- package/dist/service/types.mjs +0 -0
- package/dist/signer/default.cjs +105 -0
- package/dist/signer/default.d.ts +12 -0
- package/dist/signer/default.mjs +102 -0
- package/dist/signer/ethSigner.cjs +123 -0
- package/dist/signer/ethSigner.d.ts +25 -0
- package/dist/signer/ethSigner.mjs +140 -0
- package/dist/signer/index.cjs +38 -0
- package/dist/signer/index.d.ts +3 -0
- package/dist/signer/index.mjs +3 -0
- package/dist/signer/interface.cjs +8 -0
- package/dist/signer/interface.d.ts +115 -0
- package/dist/signer/interface.mjs +2 -0
- package/dist/types/account.cjs +1 -0
- package/dist/types/account.d.ts +79 -0
- package/dist/types/account.mjs +0 -0
- package/dist/types/api/index.cjs +30 -0
- package/dist/types/api/index.d.ts +4 -0
- package/dist/types/api/index.mjs +4 -0
- package/dist/types/api/jsonrpc/index.cjs +1 -0
- package/dist/types/api/jsonrpc/index.d.ts +21 -0
- package/dist/types/api/jsonrpc/index.mjs +0 -0
- package/dist/types/api/rpcspec_0_6/components.cjs +1 -0
- package/dist/types/api/rpcspec_0_6/components.d.ts +541 -0
- package/dist/types/api/rpcspec_0_6/components.mjs +0 -0
- package/dist/types/api/rpcspec_0_6/contract.cjs +1 -0
- package/dist/types/api/rpcspec_0_6/contract.d.ts +85 -0
- package/dist/types/api/rpcspec_0_6/contract.mjs +0 -0
- package/dist/types/api/rpcspec_0_6/errors.cjs +1 -0
- package/dist/types/api/rpcspec_0_6/errors.d.ts +128 -0
- package/dist/types/api/rpcspec_0_6/errors.mjs +0 -0
- package/dist/types/api/rpcspec_0_6/index.cjs +45 -0
- package/dist/types/api/rpcspec_0_6/index.d.ts +8 -0
- package/dist/types/api/rpcspec_0_6/index.mjs +5 -0
- package/dist/types/api/rpcspec_0_6/methods.cjs +1 -0
- package/dist/types/api/rpcspec_0_6/methods.d.ts +207 -0
- package/dist/types/api/rpcspec_0_6/methods.mjs +0 -0
- package/dist/types/api/rpcspec_0_6/nonspec.cjs +65 -0
- package/dist/types/api/rpcspec_0_6/nonspec.d.ts +147 -0
- package/dist/types/api/rpcspec_0_6/nonspec.mjs +59 -0
- package/dist/types/cairoEnum.cjs +1 -0
- package/dist/types/cairoEnum.d.ts +2 -0
- package/dist/types/cairoEnum.mjs +0 -0
- package/dist/types/calldata.cjs +27 -0
- package/dist/types/calldata.d.ts +23 -0
- package/dist/types/calldata.mjs +21 -0
- package/dist/types/contract.cjs +1 -0
- package/dist/types/contract.d.ts +27 -0
- package/dist/types/contract.mjs +0 -0
- package/dist/types/helpers/valuesType.cjs +1 -0
- package/dist/types/helpers/valuesType.d.ts +1 -0
- package/dist/types/helpers/valuesType.mjs +0 -0
- package/dist/types/index.cjs +121 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.mjs +10 -0
- package/dist/types/lib/contract/abi.cjs +1 -0
- package/dist/types/lib/contract/abi.d.ts +71 -0
- package/dist/types/lib/contract/abi.mjs +0 -0
- package/dist/types/lib/contract/index.cjs +50 -0
- package/dist/types/lib/contract/index.d.ts +26 -0
- package/dist/types/lib/contract/index.mjs +8 -0
- package/dist/types/lib/contract/legacy.cjs +1 -0
- package/dist/types/lib/contract/legacy.d.ts +33 -0
- package/dist/types/lib/contract/legacy.mjs +0 -0
- package/dist/types/lib/contract/sierra.cjs +1 -0
- package/dist/types/lib/contract/sierra.d.ts +52 -0
- package/dist/types/lib/contract/sierra.mjs +0 -0
- package/dist/types/lib/index.cjs +61 -0
- package/dist/types/lib/index.d.ts +259 -0
- package/dist/types/lib/index.mjs +36 -0
- package/dist/types/provider/configuration.cjs +1 -0
- package/dist/types/provider/configuration.d.ts +20 -0
- package/dist/types/provider/configuration.mjs +0 -0
- package/dist/types/provider/index.cjs +27 -0
- package/dist/types/provider/index.d.ts +2 -0
- package/dist/types/provider/index.mjs +2 -0
- package/dist/types/provider/response.cjs +30 -0
- package/dist/types/provider/response.d.ts +98 -0
- package/dist/types/provider/response.mjs +1 -0
- package/dist/types/provider/spec.cjs +1 -0
- package/dist/types/provider/spec.d.ts +49 -0
- package/dist/types/provider/spec.mjs +0 -0
- package/dist/types/signer.cjs +1 -0
- package/dist/types/signer.d.ts +49 -0
- package/dist/types/signer.mjs +0 -0
- package/dist/types/transactionReceipt.cjs +1 -0
- package/dist/types/transactionReceipt.d.ts +23 -0
- package/dist/types/transactionReceipt.mjs +0 -0
- package/dist/types/typedData.cjs +12 -0
- package/dist/types/typedData.d.ts +1 -0
- package/dist/types/typedData.mjs +3 -0
- package/dist/utils/address.cjs +44 -0
- package/dist/utils/address.d.ts +55 -0
- package/dist/utils/address.mjs +35 -0
- package/dist/utils/assert.cjs +11 -0
- package/dist/utils/assert.d.ts +12 -0
- package/dist/utils/assert.mjs +5 -0
- package/dist/utils/cairoDataTypes/felt.cjs +31 -0
- package/dist/utils/cairoDataTypes/felt.d.ts +6 -0
- package/dist/utils/cairoDataTypes/felt.mjs +27 -0
- package/dist/utils/cairoDataTypes/uint256.cjs +113 -0
- package/dist/utils/cairoDataTypes/uint256.d.ts +72 -0
- package/dist/utils/cairoDataTypes/uint256.mjs +103 -0
- package/dist/utils/cairoDataTypes/uint512.cjs +125 -0
- package/dist/utils/cairoDataTypes/uint512.d.ts +76 -0
- package/dist/utils/cairoDataTypes/uint512.mjs +123 -0
- package/dist/utils/calldata/byteArray.cjs +27 -0
- package/dist/utils/calldata/byteArray.d.ts +32 -0
- package/dist/utils/calldata/byteArray.mjs +20 -0
- package/dist/utils/calldata/cairo.cjs +114 -0
- package/dist/utils/calldata/cairo.d.ts +196 -0
- package/dist/utils/calldata/cairo.mjs +68 -0
- package/dist/utils/calldata/enum/CairoCustomEnum.cjs +55 -0
- package/dist/utils/calldata/enum/CairoCustomEnum.d.ts +38 -0
- package/dist/utils/calldata/enum/CairoCustomEnum.mjs +50 -0
- package/dist/utils/calldata/enum/CairoOption.cjs +55 -0
- package/dist/utils/calldata/enum/CairoOption.d.ts +37 -0
- package/dist/utils/calldata/enum/CairoOption.mjs +50 -0
- package/dist/utils/calldata/enum/CairoResult.cjs +54 -0
- package/dist/utils/calldata/enum/CairoResult.d.ts +36 -0
- package/dist/utils/calldata/enum/CairoResult.mjs +47 -0
- package/dist/utils/calldata/enum/index.cjs +38 -0
- package/dist/utils/calldata/enum/index.d.ts +3 -0
- package/dist/utils/calldata/enum/index.mjs +3 -0
- package/dist/utils/calldata/formatter.cjs +55 -0
- package/dist/utils/calldata/formatter.d.ts +9 -0
- package/dist/utils/calldata/formatter.mjs +58 -0
- package/dist/utils/calldata/index.cjs +272 -0
- package/dist/utils/calldata/index.d.ts +90 -0
- package/dist/utils/calldata/index.mjs +276 -0
- package/dist/utils/calldata/parser/index.cjs +29 -0
- package/dist/utils/calldata/parser/index.d.ts +5 -0
- package/dist/utils/calldata/parser/index.mjs +21 -0
- package/dist/utils/calldata/parser/interface.cjs +8 -0
- package/dist/utils/calldata/parser/interface.d.ts +20 -0
- package/dist/utils/calldata/parser/interface.mjs +2 -0
- package/dist/utils/calldata/parser/parser-0-1.1.0.cjs +38 -0
- package/dist/utils/calldata/parser/parser-0-1.1.0.d.ts +24 -0
- package/dist/utils/calldata/parser/parser-0-1.1.0.mjs +31 -0
- package/dist/utils/calldata/parser/parser-2.0.0.cjs +42 -0
- package/dist/utils/calldata/parser/parser-2.0.0.d.ts +23 -0
- package/dist/utils/calldata/parser/parser-2.0.0.mjs +37 -0
- package/dist/utils/calldata/propertyOrder.cjs +159 -0
- package/dist/utils/calldata/propertyOrder.d.ts +2 -0
- package/dist/utils/calldata/propertyOrder.mjs +189 -0
- package/dist/utils/calldata/requestParser.cjs +204 -0
- package/dist/utils/calldata/requestParser.d.ts +11 -0
- package/dist/utils/calldata/requestParser.mjs +231 -0
- package/dist/utils/calldata/responseParser.cjs +200 -0
- package/dist/utils/calldata/responseParser.d.ts +11 -0
- package/dist/utils/calldata/responseParser.mjs +201 -0
- package/dist/utils/calldata/tuple.cjs +106 -0
- package/dist/utils/calldata/tuple.d.ts +6 -0
- package/dist/utils/calldata/tuple.mjs +88 -0
- package/dist/utils/calldata/validate.cjs +241 -0
- package/dist/utils/calldata/validate.d.ts +6 -0
- package/dist/utils/calldata/validate.mjs +315 -0
- package/dist/utils/contract.cjs +40 -0
- package/dist/utils/contract.d.ts +37 -0
- package/dist/utils/contract.mjs +31 -0
- package/dist/utils/ec.cjs +12 -0
- package/dist/utils/ec.d.ts +2 -0
- package/dist/utils/ec.mjs +2 -0
- package/dist/utils/encode.cjs +78 -0
- package/dist/utils/encode.d.ts +207 -0
- package/dist/utils/encode.mjs +56 -0
- package/dist/utils/eth.cjs +22 -0
- package/dist/utils/eth.d.ts +22 -0
- package/dist/utils/eth.mjs +14 -0
- package/dist/utils/events/index.cjs +144 -0
- package/dist/utils/events/index.d.ts +84 -0
- package/dist/utils/events/index.mjs +136 -0
- package/dist/utils/fetchPonyfill.cjs +14 -0
- package/dist/utils/fetchPonyfill.d.ts +2 -0
- package/dist/utils/fetchPonyfill.mjs +5 -0
- package/dist/utils/hash/classHash.cjs +151 -0
- package/dist/utils/hash/classHash.d.ts +120 -0
- package/dist/utils/hash/classHash.mjs +168 -0
- package/dist/utils/hash/index.cjs +49 -0
- package/dist/utils/hash/index.d.ts +7 -0
- package/dist/utils/hash/index.mjs +4 -0
- package/dist/utils/hash/selector.cjs +37 -0
- package/dist/utils/hash/selector.d.ts +57 -0
- package/dist/utils/hash/selector.mjs +28 -0
- package/dist/utils/hash/transactionHash/index.cjs +38 -0
- package/dist/utils/hash/transactionHash/index.d.ts +81 -0
- package/dist/utils/hash/transactionHash/index.mjs +102 -0
- package/dist/utils/hash/transactionHash/v2.cjs +31 -0
- package/dist/utils/hash/transactionHash/v2.d.ts +34 -0
- package/dist/utils/hash/transactionHash/v2.mjs +57 -0
- package/dist/utils/hash/transactionHash/v3.cjs +45 -0
- package/dist/utils/hash/transactionHash/v3.d.ts +24 -0
- package/dist/utils/hash/transactionHash/v3.mjs +80 -0
- package/dist/utils/json.cjs +21 -0
- package/dist/utils/json.d.ts +50 -0
- package/dist/utils/json.mjs +10 -0
- package/dist/utils/merkle.cjs +118 -0
- package/dist/utils/merkle.d.ts +87 -0
- package/dist/utils/merkle.mjs +114 -0
- package/dist/utils/num.cjs +109 -0
- package/dist/utils/num.d.ts +283 -0
- package/dist/utils/num.mjs +86 -0
- package/dist/utils/provider.cjs +182 -0
- package/dist/utils/provider.d.ts +217 -0
- package/dist/utils/provider.mjs +158 -0
- package/dist/utils/responseParser/index.cjs +27 -0
- package/dist/utils/responseParser/index.d.ts +2 -0
- package/dist/utils/responseParser/index.mjs +2 -0
- package/dist/utils/responseParser/interface.cjs +8 -0
- package/dist/utils/responseParser/interface.d.ts +13 -0
- package/dist/utils/responseParser/interface.mjs +2 -0
- package/dist/utils/responseParser/rpc.cjs +83 -0
- package/dist/utils/responseParser/rpc.d.ts +19 -0
- package/dist/utils/responseParser/rpc.mjs +77 -0
- package/dist/utils/shortString.cjs +56 -0
- package/dist/utils/shortString.d.ts +116 -0
- package/dist/utils/shortString.mjs +39 -0
- package/dist/utils/stark.cjs +137 -0
- package/dist/utils/stark.d.ts +224 -0
- package/dist/utils/stark.mjs +109 -0
- package/dist/utils/starknetId.cjs +196 -0
- package/dist/utils/starknetId.d.ts +182 -0
- package/dist/utils/starknetId.mjs +185 -0
- package/dist/utils/transaction.cjs +115 -0
- package/dist/utils/transaction.d.ts +185 -0
- package/dist/utils/transaction.mjs +98 -0
- package/dist/utils/transactionReceipt.cjs +54 -0
- package/dist/utils/transactionReceipt.d.ts +33 -0
- package/dist/utils/transactionReceipt.mjs +49 -0
- package/dist/utils/typedData.cjs +285 -0
- package/dist/utils/typedData.d.ts +54 -0
- package/dist/utils/typedData.mjs +286 -0
- package/dist/utils/uint256.cjs +30 -0
- package/dist/utils/uint256.d.ts +45 -0
- package/dist/utils/uint256.mjs +11 -0
- package/dist/utils/url.cjs +35 -0
- package/dist/utils/url.d.ts +29 -0
- package/dist/utils/url.mjs +27 -0
- package/dist/wallet/account.cjs +115 -0
- package/dist/wallet/account.d.ts +31 -0
- package/dist/wallet/account.mjs +112 -0
- package/dist/wallet/connect.cjs +90 -0
- package/dist/wallet/connect.d.ts +82 -0
- package/dist/wallet/connect.mjs +64 -0
- package/dist/wallet/index.cjs +16 -0
- package/dist/wallet/index.d.ts +1 -0
- package/dist/wallet/index.mjs +1 -0
- package/dist/wallet/types.cjs +1 -0
- package/dist/wallet/types.d.ts +4 -0
- package/dist/wallet/types.mjs +0 -0
- package/package.json +13 -13
- package/dist/index.js +0 -7426
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { CairoUint256 } from "../cairoDataTypes/uint256.mjs";
|
|
2
|
+
import { CairoUint512 } from "../cairoDataTypes/uint512.mjs";
|
|
3
|
+
import { addHexPrefix, removeHexPrefix } from "../encode.mjs";
|
|
4
|
+
import { toHex } from "../num.mjs";
|
|
5
|
+
import { decodeShortString } from "../shortString.mjs";
|
|
6
|
+
import { stringFromByteArray } from "./byteArray.mjs";
|
|
7
|
+
import {
|
|
8
|
+
getArrayType,
|
|
9
|
+
isCairo1Type,
|
|
10
|
+
isLen,
|
|
11
|
+
isTypeArray,
|
|
12
|
+
isTypeBool,
|
|
13
|
+
isTypeByteArray,
|
|
14
|
+
isTypeEnum,
|
|
15
|
+
isTypeNonZero,
|
|
16
|
+
isTypeSecp256k1Point,
|
|
17
|
+
isTypeTuple
|
|
18
|
+
} from "./cairo.mjs";
|
|
19
|
+
import {
|
|
20
|
+
CairoCustomEnum,
|
|
21
|
+
CairoOption,
|
|
22
|
+
CairoOptionVariant,
|
|
23
|
+
CairoResult,
|
|
24
|
+
CairoResultVariant
|
|
25
|
+
} from "./enum/index.mjs";
|
|
26
|
+
import extractTupleMemberTypes from "./tuple.mjs";
|
|
27
|
+
function parseBaseTypes(type, it) {
|
|
28
|
+
let temp;
|
|
29
|
+
switch (true) {
|
|
30
|
+
case isTypeBool(type):
|
|
31
|
+
temp = it.next().value;
|
|
32
|
+
return Boolean(BigInt(temp));
|
|
33
|
+
case CairoUint256.isAbiType(type):
|
|
34
|
+
const low = it.next().value;
|
|
35
|
+
const high = it.next().value;
|
|
36
|
+
return new CairoUint256(low, high).toBigInt();
|
|
37
|
+
case CairoUint512.isAbiType(type):
|
|
38
|
+
const limb0 = it.next().value;
|
|
39
|
+
const limb1 = it.next().value;
|
|
40
|
+
const limb2 = it.next().value;
|
|
41
|
+
const limb3 = it.next().value;
|
|
42
|
+
return new CairoUint512(limb0, limb1, limb2, limb3).toBigInt();
|
|
43
|
+
case type === "core::starknet::eth_address::EthAddress":
|
|
44
|
+
temp = it.next().value;
|
|
45
|
+
return BigInt(temp);
|
|
46
|
+
case type === "core::bytes_31::bytes31":
|
|
47
|
+
temp = it.next().value;
|
|
48
|
+
return decodeShortString(temp);
|
|
49
|
+
case isTypeSecp256k1Point(type):
|
|
50
|
+
const xLow = removeHexPrefix(it.next().value).padStart(32, "0");
|
|
51
|
+
const xHigh = removeHexPrefix(it.next().value).padStart(32, "0");
|
|
52
|
+
const yLow = removeHexPrefix(it.next().value).padStart(32, "0");
|
|
53
|
+
const yHigh = removeHexPrefix(it.next().value).padStart(32, "0");
|
|
54
|
+
const pubK = BigInt(addHexPrefix(xHigh + xLow + yHigh + yLow));
|
|
55
|
+
return pubK;
|
|
56
|
+
default:
|
|
57
|
+
temp = it.next().value;
|
|
58
|
+
return BigInt(temp);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function parseResponseValue(responseIterator, element, structs, enums) {
|
|
62
|
+
if (element.type === "()") {
|
|
63
|
+
return {};
|
|
64
|
+
}
|
|
65
|
+
if (CairoUint256.isAbiType(element.type)) {
|
|
66
|
+
const low = responseIterator.next().value;
|
|
67
|
+
const high = responseIterator.next().value;
|
|
68
|
+
return new CairoUint256(low, high).toBigInt();
|
|
69
|
+
}
|
|
70
|
+
if (CairoUint512.isAbiType(element.type)) {
|
|
71
|
+
const limb0 = responseIterator.next().value;
|
|
72
|
+
const limb1 = responseIterator.next().value;
|
|
73
|
+
const limb2 = responseIterator.next().value;
|
|
74
|
+
const limb3 = responseIterator.next().value;
|
|
75
|
+
return new CairoUint512(limb0, limb1, limb2, limb3).toBigInt();
|
|
76
|
+
}
|
|
77
|
+
if (isTypeByteArray(element.type)) {
|
|
78
|
+
const parsedBytes31Arr = [];
|
|
79
|
+
const bytes31ArrLen = BigInt(responseIterator.next().value);
|
|
80
|
+
while (parsedBytes31Arr.length < bytes31ArrLen) {
|
|
81
|
+
parsedBytes31Arr.push(toHex(responseIterator.next().value));
|
|
82
|
+
}
|
|
83
|
+
const pending_word = toHex(responseIterator.next().value);
|
|
84
|
+
const pending_word_len = BigInt(responseIterator.next().value);
|
|
85
|
+
const myByteArray = {
|
|
86
|
+
data: parsedBytes31Arr,
|
|
87
|
+
pending_word,
|
|
88
|
+
pending_word_len
|
|
89
|
+
};
|
|
90
|
+
return stringFromByteArray(myByteArray);
|
|
91
|
+
}
|
|
92
|
+
if (isTypeArray(element.type)) {
|
|
93
|
+
const parsedDataArr = [];
|
|
94
|
+
const el = { name: "", type: getArrayType(element.type) };
|
|
95
|
+
const len = BigInt(responseIterator.next().value);
|
|
96
|
+
while (parsedDataArr.length < len) {
|
|
97
|
+
parsedDataArr.push(parseResponseValue(responseIterator, el, structs, enums));
|
|
98
|
+
}
|
|
99
|
+
return parsedDataArr;
|
|
100
|
+
}
|
|
101
|
+
if (isTypeNonZero(element.type)) {
|
|
102
|
+
const el = { name: "", type: getArrayType(element.type) };
|
|
103
|
+
return parseResponseValue(responseIterator, el, structs, enums);
|
|
104
|
+
}
|
|
105
|
+
if (structs && element.type in structs && structs[element.type]) {
|
|
106
|
+
if (element.type === "core::starknet::eth_address::EthAddress") {
|
|
107
|
+
return parseBaseTypes(element.type, responseIterator);
|
|
108
|
+
}
|
|
109
|
+
return structs[element.type].members.reduce((acc, el) => {
|
|
110
|
+
acc[el.name] = parseResponseValue(responseIterator, el, structs, enums);
|
|
111
|
+
return acc;
|
|
112
|
+
}, {});
|
|
113
|
+
}
|
|
114
|
+
if (enums && element.type in enums && enums[element.type]) {
|
|
115
|
+
const variantNum = Number(responseIterator.next().value);
|
|
116
|
+
const rawEnum = enums[element.type].variants.reduce((acc, variant, num) => {
|
|
117
|
+
if (num === variantNum) {
|
|
118
|
+
acc[variant.name] = parseResponseValue(
|
|
119
|
+
responseIterator,
|
|
120
|
+
{ name: "", type: variant.type },
|
|
121
|
+
structs,
|
|
122
|
+
enums
|
|
123
|
+
);
|
|
124
|
+
return acc;
|
|
125
|
+
}
|
|
126
|
+
acc[variant.name] = void 0;
|
|
127
|
+
return acc;
|
|
128
|
+
}, {});
|
|
129
|
+
if (element.type.startsWith("core::option::Option")) {
|
|
130
|
+
const content = variantNum === CairoOptionVariant.Some ? rawEnum.Some : void 0;
|
|
131
|
+
return new CairoOption(variantNum, content);
|
|
132
|
+
}
|
|
133
|
+
if (element.type.startsWith("core::result::Result")) {
|
|
134
|
+
let content;
|
|
135
|
+
if (variantNum === CairoResultVariant.Ok) {
|
|
136
|
+
content = rawEnum.Ok;
|
|
137
|
+
} else {
|
|
138
|
+
content = rawEnum.Err;
|
|
139
|
+
}
|
|
140
|
+
return new CairoResult(variantNum, content);
|
|
141
|
+
}
|
|
142
|
+
const customEnum = new CairoCustomEnum(rawEnum);
|
|
143
|
+
return customEnum;
|
|
144
|
+
}
|
|
145
|
+
if (isTypeTuple(element.type)) {
|
|
146
|
+
const memberTypes = extractTupleMemberTypes(element.type);
|
|
147
|
+
return memberTypes.reduce((acc, it, idx) => {
|
|
148
|
+
const name = it?.name ? it.name : idx;
|
|
149
|
+
const type = it?.type ? it.type : it;
|
|
150
|
+
const el = { name, type };
|
|
151
|
+
acc[name] = parseResponseValue(responseIterator, el, structs, enums);
|
|
152
|
+
return acc;
|
|
153
|
+
}, {});
|
|
154
|
+
}
|
|
155
|
+
if (isTypeArray(element.type)) {
|
|
156
|
+
const parsedDataArr = [];
|
|
157
|
+
const el = { name: "", type: getArrayType(element.type) };
|
|
158
|
+
const len = BigInt(responseIterator.next().value);
|
|
159
|
+
while (parsedDataArr.length < len) {
|
|
160
|
+
parsedDataArr.push(parseResponseValue(responseIterator, el, structs, enums));
|
|
161
|
+
}
|
|
162
|
+
return parsedDataArr;
|
|
163
|
+
}
|
|
164
|
+
return parseBaseTypes(element.type, responseIterator);
|
|
165
|
+
}
|
|
166
|
+
export default function responseParser(responseIterator, output, structs, enums, parsedResult) {
|
|
167
|
+
const { name, type } = output;
|
|
168
|
+
let temp;
|
|
169
|
+
switch (true) {
|
|
170
|
+
case isLen(name):
|
|
171
|
+
temp = responseIterator.next().value;
|
|
172
|
+
return BigInt(temp);
|
|
173
|
+
case (structs && type in structs || isTypeTuple(type)):
|
|
174
|
+
return parseResponseValue(responseIterator, output, structs, enums);
|
|
175
|
+
case (enums && isTypeEnum(type, enums)):
|
|
176
|
+
return parseResponseValue(responseIterator, output, structs, enums);
|
|
177
|
+
case isTypeArray(type):
|
|
178
|
+
if (isCairo1Type(type)) {
|
|
179
|
+
return parseResponseValue(responseIterator, output, structs, enums);
|
|
180
|
+
}
|
|
181
|
+
const parsedDataArr = [];
|
|
182
|
+
if (parsedResult && parsedResult[`${name}_len`]) {
|
|
183
|
+
const arrLen = parsedResult[`${name}_len`];
|
|
184
|
+
while (parsedDataArr.length < arrLen) {
|
|
185
|
+
parsedDataArr.push(
|
|
186
|
+
parseResponseValue(
|
|
187
|
+
responseIterator,
|
|
188
|
+
{ name, type: output.type.replace("*", "") },
|
|
189
|
+
structs,
|
|
190
|
+
enums
|
|
191
|
+
)
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return parsedDataArr;
|
|
196
|
+
case isTypeNonZero(type):
|
|
197
|
+
return parseResponseValue(responseIterator, output, structs, enums);
|
|
198
|
+
default:
|
|
199
|
+
return parseBaseTypes(type, responseIterator);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
module.exports = extractTupleMemberTypes;
|
|
7
|
+
var _cairo = require("./cairo.cjs");
|
|
8
|
+
function parseNamedTuple(namedTuple) {
|
|
9
|
+
const name = namedTuple.substring(0, namedTuple.indexOf(":"));
|
|
10
|
+
const type = namedTuple.substring(name.length + ":".length);
|
|
11
|
+
return {
|
|
12
|
+
name,
|
|
13
|
+
type
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function parseSubTuple(s) {
|
|
17
|
+
if (!s.includes("(")) return {
|
|
18
|
+
subTuple: [],
|
|
19
|
+
result: s
|
|
20
|
+
};
|
|
21
|
+
const subTuple = [];
|
|
22
|
+
let result = "";
|
|
23
|
+
let i = 0;
|
|
24
|
+
while (i < s.length) {
|
|
25
|
+
if (s[i] === "(") {
|
|
26
|
+
let counter = 1;
|
|
27
|
+
const lBracket = i;
|
|
28
|
+
i++;
|
|
29
|
+
while (counter) {
|
|
30
|
+
if (s[i] === ")") counter--;
|
|
31
|
+
if (s[i] === "(") counter++;
|
|
32
|
+
i++;
|
|
33
|
+
}
|
|
34
|
+
subTuple.push(s.substring(lBracket, i));
|
|
35
|
+
result += " ";
|
|
36
|
+
i--;
|
|
37
|
+
} else {
|
|
38
|
+
result += s[i];
|
|
39
|
+
}
|
|
40
|
+
i++;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
subTuple,
|
|
44
|
+
result
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function extractCairo0Tuple(type) {
|
|
48
|
+
const cleanType = type.replace(/\s/g, "").slice(1, -1);
|
|
49
|
+
const {
|
|
50
|
+
subTuple,
|
|
51
|
+
result
|
|
52
|
+
} = parseSubTuple(cleanType);
|
|
53
|
+
let recomposed = result.split(",").map(it => {
|
|
54
|
+
return subTuple.length ? it.replace(" ", subTuple.shift()) : it;
|
|
55
|
+
});
|
|
56
|
+
if ((0, _cairo.isTypeNamedTuple)(type)) {
|
|
57
|
+
recomposed = recomposed.reduce((acc, it) => {
|
|
58
|
+
return acc.concat(parseNamedTuple(it));
|
|
59
|
+
}, []);
|
|
60
|
+
}
|
|
61
|
+
return recomposed;
|
|
62
|
+
}
|
|
63
|
+
function getClosureOffset(input, open, close) {
|
|
64
|
+
for (let i = 0, counter = 0; i < input.length; i++) {
|
|
65
|
+
if (input[i] === open) {
|
|
66
|
+
counter++;
|
|
67
|
+
} else if (input[i] === close && --counter === 0) {
|
|
68
|
+
return i;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return Number.POSITIVE_INFINITY;
|
|
72
|
+
}
|
|
73
|
+
function extractCairo1Tuple(type) {
|
|
74
|
+
const input = type.slice(1, -1);
|
|
75
|
+
const result = [];
|
|
76
|
+
let currentIndex = 0;
|
|
77
|
+
let limitIndex;
|
|
78
|
+
while (currentIndex < input.length) {
|
|
79
|
+
switch (true) {
|
|
80
|
+
case input[currentIndex] === "(":
|
|
81
|
+
{
|
|
82
|
+
limitIndex = currentIndex + getClosureOffset(input.slice(currentIndex), "(", ")") + 1;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case input.startsWith("core::result::Result::<", currentIndex) || input.startsWith("core::array::Array::<", currentIndex) || input.startsWith("core::option::Option::<", currentIndex):
|
|
86
|
+
{
|
|
87
|
+
limitIndex = currentIndex + getClosureOffset(input.slice(currentIndex), "<", ">") + 1;
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
default:
|
|
91
|
+
{
|
|
92
|
+
const commaIndex = input.indexOf(",", currentIndex);
|
|
93
|
+
limitIndex = commaIndex !== -1 ? commaIndex : Number.POSITIVE_INFINITY;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
result.push(input.slice(currentIndex, limitIndex));
|
|
97
|
+
currentIndex = limitIndex + 2;
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
function extractTupleMemberTypes(type) {
|
|
102
|
+
if ((0, _cairo.isCairo1Type)(type)) {
|
|
103
|
+
return extractCairo1Tuple(type);
|
|
104
|
+
}
|
|
105
|
+
return extractCairo0Tuple(type);
|
|
106
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { isCairo1Type, isTypeNamedTuple } from "./cairo.mjs";
|
|
2
|
+
function parseNamedTuple(namedTuple) {
|
|
3
|
+
const name = namedTuple.substring(0, namedTuple.indexOf(":"));
|
|
4
|
+
const type = namedTuple.substring(name.length + ":".length);
|
|
5
|
+
return { name, type };
|
|
6
|
+
}
|
|
7
|
+
function parseSubTuple(s) {
|
|
8
|
+
if (!s.includes("(")) return { subTuple: [], result: s };
|
|
9
|
+
const subTuple = [];
|
|
10
|
+
let result = "";
|
|
11
|
+
let i = 0;
|
|
12
|
+
while (i < s.length) {
|
|
13
|
+
if (s[i] === "(") {
|
|
14
|
+
let counter = 1;
|
|
15
|
+
const lBracket = i;
|
|
16
|
+
i++;
|
|
17
|
+
while (counter) {
|
|
18
|
+
if (s[i] === ")") counter--;
|
|
19
|
+
if (s[i] === "(") counter++;
|
|
20
|
+
i++;
|
|
21
|
+
}
|
|
22
|
+
subTuple.push(s.substring(lBracket, i));
|
|
23
|
+
result += " ";
|
|
24
|
+
i--;
|
|
25
|
+
} else {
|
|
26
|
+
result += s[i];
|
|
27
|
+
}
|
|
28
|
+
i++;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
subTuple,
|
|
32
|
+
result
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function extractCairo0Tuple(type) {
|
|
36
|
+
const cleanType = type.replace(/\s/g, "").slice(1, -1);
|
|
37
|
+
const { subTuple, result } = parseSubTuple(cleanType);
|
|
38
|
+
let recomposed = result.split(",").map((it) => {
|
|
39
|
+
return subTuple.length ? it.replace(" ", subTuple.shift()) : it;
|
|
40
|
+
});
|
|
41
|
+
if (isTypeNamedTuple(type)) {
|
|
42
|
+
recomposed = recomposed.reduce((acc, it) => {
|
|
43
|
+
return acc.concat(parseNamedTuple(it));
|
|
44
|
+
}, []);
|
|
45
|
+
}
|
|
46
|
+
return recomposed;
|
|
47
|
+
}
|
|
48
|
+
function getClosureOffset(input, open, close) {
|
|
49
|
+
for (let i = 0, counter = 0; i < input.length; i++) {
|
|
50
|
+
if (input[i] === open) {
|
|
51
|
+
counter++;
|
|
52
|
+
} else if (input[i] === close && --counter === 0) {
|
|
53
|
+
return i;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return Number.POSITIVE_INFINITY;
|
|
57
|
+
}
|
|
58
|
+
function extractCairo1Tuple(type) {
|
|
59
|
+
const input = type.slice(1, -1);
|
|
60
|
+
const result = [];
|
|
61
|
+
let currentIndex = 0;
|
|
62
|
+
let limitIndex;
|
|
63
|
+
while (currentIndex < input.length) {
|
|
64
|
+
switch (true) {
|
|
65
|
+
case input[currentIndex] === "(": {
|
|
66
|
+
limitIndex = currentIndex + getClosureOffset(input.slice(currentIndex), "(", ")") + 1;
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
case (input.startsWith("core::result::Result::<", currentIndex) || input.startsWith("core::array::Array::<", currentIndex) || input.startsWith("core::option::Option::<", currentIndex)): {
|
|
70
|
+
limitIndex = currentIndex + getClosureOffset(input.slice(currentIndex), "<", ">") + 1;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
default: {
|
|
74
|
+
const commaIndex = input.indexOf(",", currentIndex);
|
|
75
|
+
limitIndex = commaIndex !== -1 ? commaIndex : Number.POSITIVE_INFINITY;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
result.push(input.slice(currentIndex, limitIndex));
|
|
79
|
+
currentIndex = limitIndex + 2;
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
export default function extractTupleMemberTypes(type) {
|
|
84
|
+
if (isCairo1Type(type)) {
|
|
85
|
+
return extractCairo1Tuple(type);
|
|
86
|
+
}
|
|
87
|
+
return extractCairo0Tuple(type);
|
|
88
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
module.exports = validateFields;
|
|
7
|
+
var _types = require("../../types/index.cjs");
|
|
8
|
+
var _assert = _interopRequireDefault(require("../assert.cjs"));
|
|
9
|
+
var _uint = require("../cairoDataTypes/uint256.cjs");
|
|
10
|
+
var _uint2 = require("../cairoDataTypes/uint512.cjs");
|
|
11
|
+
var _num = require("../num.cjs");
|
|
12
|
+
var _shortString = require("../shortString.cjs");
|
|
13
|
+
var _cairo = require("./cairo.cjs");
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
+
const validateFelt = (parameter, input) => {
|
|
16
|
+
(0, _assert.default)((0, _shortString.isString)(parameter) || (0, _num.isNumber)(parameter) || (0, _num.isBigInt)(parameter), `Validate: arg ${input.name} should be a felt typed as (String, Number or BigInt)`);
|
|
17
|
+
if ((0, _shortString.isString)(parameter) && !(0, _num.isHex)(parameter)) return;
|
|
18
|
+
const param = BigInt(parameter.toString(10));
|
|
19
|
+
(0, _assert.default)(
|
|
20
|
+
// from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1266
|
|
21
|
+
param >= 0n && param <= 2n ** 252n - 1n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^252-1]`);
|
|
22
|
+
};
|
|
23
|
+
const validateBytes31 = (parameter, input) => {
|
|
24
|
+
(0, _assert.default)((0, _shortString.isString)(parameter), `Validate: arg ${input.name} should be a string.`);
|
|
25
|
+
(0, _assert.default)(parameter.length < 32, `Validate: arg ${input.name} cairo typed ${input.type} should be a string of less than 32 characters.`);
|
|
26
|
+
};
|
|
27
|
+
const validateByteArray = (parameter, input) => {
|
|
28
|
+
(0, _assert.default)((0, _shortString.isString)(parameter), `Validate: arg ${input.name} should be a string.`);
|
|
29
|
+
};
|
|
30
|
+
const validateUint = (parameter, input) => {
|
|
31
|
+
if ((0, _num.isNumber)(parameter)) {
|
|
32
|
+
(0, _assert.default)(parameter <= Number.MAX_SAFE_INTEGER, `Validation: Parameter is to large to be typed as Number use (BigInt or String)`);
|
|
33
|
+
}
|
|
34
|
+
(0, _assert.default)((0, _shortString.isString)(parameter) || (0, _num.isNumber)(parameter) || (0, _num.isBigInt)(parameter) || typeof parameter === "object" && "low" in parameter && "high" in parameter || typeof parameter === "object" && ["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}.`);
|
|
35
|
+
let param;
|
|
36
|
+
switch (input.type) {
|
|
37
|
+
case _types.Uint.u256:
|
|
38
|
+
param = new _uint.CairoUint256(parameter).toBigInt();
|
|
39
|
+
break;
|
|
40
|
+
case _types.Uint.u512:
|
|
41
|
+
param = new _uint2.CairoUint512(parameter).toBigInt();
|
|
42
|
+
break;
|
|
43
|
+
default:
|
|
44
|
+
param = (0, _num.toBigInt)(parameter);
|
|
45
|
+
}
|
|
46
|
+
switch (input.type) {
|
|
47
|
+
case _types.Uint.u8:
|
|
48
|
+
(0, _assert.default)(param >= 0n && param <= 255n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0 - 255]`);
|
|
49
|
+
break;
|
|
50
|
+
case _types.Uint.u16:
|
|
51
|
+
(0, _assert.default)(param >= 0n && param <= 65535n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 65535]`);
|
|
52
|
+
break;
|
|
53
|
+
case _types.Uint.u32:
|
|
54
|
+
(0, _assert.default)(param >= 0n && param <= 4294967295n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 4294967295]`);
|
|
55
|
+
break;
|
|
56
|
+
case _types.Uint.u64:
|
|
57
|
+
(0, _assert.default)(param >= 0n && param <= 2n ** 64n - 1n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^64-1]`);
|
|
58
|
+
break;
|
|
59
|
+
case _types.Uint.u128:
|
|
60
|
+
(0, _assert.default)(param >= 0n && param <= 2n ** 128n - 1n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^128-1]`);
|
|
61
|
+
break;
|
|
62
|
+
case _types.Uint.u256:
|
|
63
|
+
(0, _assert.default)(param >= 0n && param <= 2n ** 256n - 1n, `Validate: arg ${input.name} is ${input.type} 0 - 2^256-1`);
|
|
64
|
+
break;
|
|
65
|
+
case _types.Uint.u512:
|
|
66
|
+
(0, _assert.default)(_uint2.CairoUint512.is(param), `Validate: arg ${input.name} is ${input.type} 0 - 2^512-1`);
|
|
67
|
+
break;
|
|
68
|
+
case _types.Literal.ClassHash:
|
|
69
|
+
(0, _assert.default)(
|
|
70
|
+
// from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1670
|
|
71
|
+
param >= 0n && param <= 2n ** 252n - 1n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^252-1]`);
|
|
72
|
+
break;
|
|
73
|
+
case _types.Literal.ContractAddress:
|
|
74
|
+
(0, _assert.default)(
|
|
75
|
+
// from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1245
|
|
76
|
+
param >= 0n && param <= 2n ** 252n - 1n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^252-1]`);
|
|
77
|
+
break;
|
|
78
|
+
case _types.Literal.Secp256k1Point:
|
|
79
|
+
{
|
|
80
|
+
(0, _assert.default)(param >= 0n && param <= 2n ** 512n - 1n, `Validate: arg ${input.name} must be ${input.type} : a 512 bits number.`);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
default:
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const validateBool = (parameter, input) => {
|
|
88
|
+
(0, _assert.default)((0, _num.isBoolean)(parameter), `Validate: arg ${input.name} of cairo type ${input.type} should be type (Boolean)`);
|
|
89
|
+
};
|
|
90
|
+
const validateStruct = (parameter, input, structs) => {
|
|
91
|
+
if (input.type === _types.Uint.u256 || input.type === _types.Uint.u512) {
|
|
92
|
+
validateUint(parameter, input);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (input.type === "core::starknet::eth_address::EthAddress") {
|
|
96
|
+
(0, _assert.default)(typeof parameter !== "object", `EthAddress type is waiting a BigNumberish. Got ${parameter}`);
|
|
97
|
+
const param = BigInt(parameter.toString(10));
|
|
98
|
+
(0, _assert.default)(
|
|
99
|
+
// from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1259
|
|
100
|
+
param >= 0n && param <= 2n ** 160n - 1n, `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^160-1]`);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
(0, _assert.default)(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)`);
|
|
104
|
+
structs[input.type].members.forEach(({
|
|
105
|
+
name
|
|
106
|
+
}) => {
|
|
107
|
+
(0, _assert.default)(Object.keys(parameter).includes(name), `Validate: arg ${input.name} should have a property ${name}`);
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
const validateEnum = (parameter, input) => {
|
|
111
|
+
(0, _assert.default)(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)`);
|
|
112
|
+
const methodsKeys = Object.getOwnPropertyNames(Object.getPrototypeOf(parameter));
|
|
113
|
+
const keys = [...Object.getOwnPropertyNames(parameter), ...methodsKeys];
|
|
114
|
+
if ((0, _cairo.isTypeOption)(input.type) && keys.includes("isSome") && keys.includes("isNone")) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if ((0, _cairo.isTypeResult)(input.type) && keys.includes("isOk") && keys.includes("isErr")) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (keys.includes("variant") && keys.includes("activeVariant")) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
throw new Error(`Validate Enum: argument ${input.name}, type ${input.type}, value received ${parameter}, is not an Enum.`);
|
|
124
|
+
};
|
|
125
|
+
const validateTuple = (parameter, input) => {
|
|
126
|
+
(0, _assert.default)(typeof parameter === "object" && !Array.isArray(parameter), `Validate: arg ${input.name} should be a tuple (defined as object)`);
|
|
127
|
+
};
|
|
128
|
+
const validateArray = (parameter, input, structs, enums) => {
|
|
129
|
+
const baseType = (0, _cairo.getArrayType)(input.type);
|
|
130
|
+
if ((0, _cairo.isTypeFelt)(baseType) && (0, _shortString.isLongText)(parameter)) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
(0, _assert.default)(Array.isArray(parameter), `Validate: arg ${input.name} should be an Array`);
|
|
134
|
+
switch (true) {
|
|
135
|
+
case (0, _cairo.isTypeFelt)(baseType):
|
|
136
|
+
parameter.forEach(param => validateFelt(param, input));
|
|
137
|
+
break;
|
|
138
|
+
case (0, _cairo.isTypeTuple)(baseType):
|
|
139
|
+
parameter.forEach(it => validateTuple(it, {
|
|
140
|
+
name: input.name,
|
|
141
|
+
type: baseType
|
|
142
|
+
}));
|
|
143
|
+
break;
|
|
144
|
+
case (0, _cairo.isTypeArray)(baseType):
|
|
145
|
+
parameter.forEach(param => validateArray(param, {
|
|
146
|
+
name: "",
|
|
147
|
+
type: baseType
|
|
148
|
+
}, structs, enums));
|
|
149
|
+
break;
|
|
150
|
+
case (0, _cairo.isTypeStruct)(baseType, structs):
|
|
151
|
+
parameter.forEach(it => validateStruct(it, {
|
|
152
|
+
name: input.name,
|
|
153
|
+
type: baseType
|
|
154
|
+
}, structs));
|
|
155
|
+
break;
|
|
156
|
+
case (0, _cairo.isTypeEnum)(baseType, enums):
|
|
157
|
+
parameter.forEach(it => validateEnum(it, {
|
|
158
|
+
name: input.name,
|
|
159
|
+
type: baseType
|
|
160
|
+
}));
|
|
161
|
+
break;
|
|
162
|
+
case (0, _cairo.isTypeUint)(baseType) || (0, _cairo.isTypeLiteral)(baseType):
|
|
163
|
+
parameter.forEach(param => validateUint(param, {
|
|
164
|
+
name: "",
|
|
165
|
+
type: baseType
|
|
166
|
+
}));
|
|
167
|
+
break;
|
|
168
|
+
case (0, _cairo.isTypeBool)(baseType):
|
|
169
|
+
parameter.forEach(param => validateBool(param, input));
|
|
170
|
+
break;
|
|
171
|
+
default:
|
|
172
|
+
throw new Error(`Validate Unhandled: argument ${input.name}, type ${input.type}, value ${parameter}`);
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const validateNonZero = (parameter, input) => {
|
|
176
|
+
const baseType = (0, _cairo.getArrayType)(input.type);
|
|
177
|
+
(0, _assert.default)((0, _cairo.isTypeUint)(baseType) && baseType !== _uint2.CairoUint512.abiSelector || (0, _cairo.isTypeFelt)(baseType), `Validate: ${input.name} type is not authorized for NonZero type.`);
|
|
178
|
+
switch (true) {
|
|
179
|
+
case (0, _cairo.isTypeFelt)(baseType):
|
|
180
|
+
validateFelt(parameter, input);
|
|
181
|
+
(0, _assert.default)(BigInt(parameter.toString(10)) > 0, "Validate: value 0 is not authorized in NonZero felt252 type.");
|
|
182
|
+
break;
|
|
183
|
+
case (0, _cairo.isTypeUint)(baseType):
|
|
184
|
+
validateUint(parameter, {
|
|
185
|
+
name: "",
|
|
186
|
+
type: baseType
|
|
187
|
+
});
|
|
188
|
+
switch (input.type) {
|
|
189
|
+
case _types.Uint.u256:
|
|
190
|
+
(0, _assert.default)(new _uint.CairoUint256(parameter).toBigInt() > 0, "Validate: value 0 is not authorized in NonZero uint256 type.");
|
|
191
|
+
break;
|
|
192
|
+
default:
|
|
193
|
+
(0, _assert.default)((0, _num.toBigInt)(parameter) > 0, "Validate: value 0 is not authorized in NonZero uint type.");
|
|
194
|
+
}
|
|
195
|
+
break;
|
|
196
|
+
default:
|
|
197
|
+
throw new Error(`Validate Unhandled: argument ${input.name}, type ${input.type}, value ${parameter}`);
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
function validateFields(abiMethod, args, structs, enums) {
|
|
201
|
+
abiMethod.inputs.reduce((acc, input) => {
|
|
202
|
+
const parameter = args[acc];
|
|
203
|
+
switch (true) {
|
|
204
|
+
case (0, _cairo.isLen)(input.name):
|
|
205
|
+
return acc;
|
|
206
|
+
case (0, _cairo.isTypeFelt)(input.type):
|
|
207
|
+
validateFelt(parameter, input);
|
|
208
|
+
break;
|
|
209
|
+
case (0, _cairo.isTypeBytes31)(input.type):
|
|
210
|
+
validateBytes31(parameter, input);
|
|
211
|
+
break;
|
|
212
|
+
case (0, _cairo.isTypeUint)(input.type) || (0, _cairo.isTypeLiteral)(input.type):
|
|
213
|
+
validateUint(parameter, input);
|
|
214
|
+
break;
|
|
215
|
+
case (0, _cairo.isTypeBool)(input.type):
|
|
216
|
+
validateBool(parameter, input);
|
|
217
|
+
break;
|
|
218
|
+
case (0, _cairo.isTypeByteArray)(input.type):
|
|
219
|
+
validateByteArray(parameter, input);
|
|
220
|
+
break;
|
|
221
|
+
case (0, _cairo.isTypeArray)(input.type):
|
|
222
|
+
validateArray(parameter, input, structs, enums);
|
|
223
|
+
break;
|
|
224
|
+
case (0, _cairo.isTypeStruct)(input.type, structs):
|
|
225
|
+
validateStruct(parameter, input, structs);
|
|
226
|
+
break;
|
|
227
|
+
case (0, _cairo.isTypeEnum)(input.type, enums):
|
|
228
|
+
validateEnum(parameter, input);
|
|
229
|
+
break;
|
|
230
|
+
case (0, _cairo.isTypeTuple)(input.type):
|
|
231
|
+
validateTuple(parameter, input);
|
|
232
|
+
break;
|
|
233
|
+
case (0, _cairo.isTypeNonZero)(input.type):
|
|
234
|
+
validateNonZero(parameter, input);
|
|
235
|
+
break;
|
|
236
|
+
default:
|
|
237
|
+
throw new Error(`Validate Unhandled: argument ${input.name}, type ${input.type}, value ${parameter}`);
|
|
238
|
+
}
|
|
239
|
+
return acc + 1;
|
|
240
|
+
}, 0);
|
|
241
|
+
}
|
|
@@ -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';
|
|
6
|
+
export default function validateFields(abiMethod: FunctionAbi, args: Array<any>, structs: AbiStructs, enums: AbiEnums): void;
|