viem 0.4.0-main.20230424T021047 → 0.4.0-main.20230424T231630
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/dist/cjs/actions/public/multicall.js +37 -16
- package/dist/cjs/actions/public/multicall.js.map +1 -1
- package/dist/cjs/errors/version.js +1 -1
- package/dist/esm/actions/public/multicall.js +37 -16
- package/dist/esm/actions/public/multicall.js.map +1 -1
- package/dist/esm/errors/version.js +1 -1
- package/dist/types/actions/public/multicall.d.ts +2 -0
- package/dist/types/actions/public/multicall.d.ts.map +1 -1
- package/dist/types/errors/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/actions/public/multicall.ts +60 -20
- package/src/errors/version.ts +1 -1
@@ -6,7 +6,11 @@ const index_js_2 = require("../../errors/index.js");
|
|
6
6
|
const index_js_3 = require("../../utils/index.js");
|
7
7
|
const readContract_js_1 = require("./readContract.js");
|
8
8
|
async function multicall(client, args) {
|
9
|
-
const { allowFailure = true, blockNumber, blockTag, contracts: contracts_, multicallAddress: multicallAddress_, } = args;
|
9
|
+
const { allowFailure = true, batchSize: batchSize_, blockNumber, blockTag, contracts: contracts_, multicallAddress: multicallAddress_, } = args;
|
10
|
+
const batchSize = batchSize_ ??
|
11
|
+
((typeof client.batch?.multicall === 'object' &&
|
12
|
+
client.batch.multicall.batchSize) ||
|
13
|
+
1024);
|
10
14
|
const contracts = contracts_;
|
11
15
|
let multicallAddress = multicallAddress_;
|
12
16
|
if (!multicallAddress) {
|
@@ -18,18 +22,31 @@ async function multicall(client, args) {
|
|
18
22
|
contract: 'multicall3',
|
19
23
|
});
|
20
24
|
}
|
21
|
-
const
|
25
|
+
const chunkedCalls = [[]];
|
26
|
+
let currentChunk = 0;
|
27
|
+
let currentChunkSize = 0;
|
28
|
+
for (let i = 0; i < contracts.length; i++) {
|
29
|
+
const { abi, address, args, functionName } = contracts[i];
|
22
30
|
try {
|
23
31
|
const callData = (0, index_js_3.encodeFunctionData)({
|
24
32
|
abi,
|
25
33
|
args,
|
26
34
|
functionName,
|
27
35
|
});
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
36
|
+
currentChunkSize += callData.length;
|
37
|
+
if (batchSize > 0 && currentChunkSize > batchSize) {
|
38
|
+
currentChunk++;
|
39
|
+
currentChunkSize = (callData.length - 2) / 2;
|
40
|
+
chunkedCalls[currentChunk] = [];
|
41
|
+
}
|
42
|
+
chunkedCalls[currentChunk] = [
|
43
|
+
...chunkedCalls[currentChunk],
|
44
|
+
{
|
45
|
+
allowFailure: true,
|
46
|
+
callData,
|
47
|
+
target: address,
|
48
|
+
},
|
49
|
+
];
|
33
50
|
}
|
34
51
|
catch (err) {
|
35
52
|
const error = (0, index_js_3.getContractError)(err, {
|
@@ -41,22 +58,26 @@ async function multicall(client, args) {
|
|
41
58
|
});
|
42
59
|
if (!allowFailure)
|
43
60
|
throw error;
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
61
|
+
chunkedCalls[currentChunk] = [
|
62
|
+
...chunkedCalls[currentChunk],
|
63
|
+
{
|
64
|
+
allowFailure: true,
|
65
|
+
callData: '0x',
|
66
|
+
target: address,
|
67
|
+
},
|
68
|
+
];
|
49
69
|
}
|
50
|
-
}
|
51
|
-
const results = await (0, readContract_js_1.readContract)(client, {
|
70
|
+
}
|
71
|
+
const results = await Promise.all(chunkedCalls.map((calls) => (0, readContract_js_1.readContract)(client, {
|
52
72
|
abi: index_js_1.multicall3Abi,
|
53
73
|
address: multicallAddress,
|
54
74
|
args: [calls],
|
55
75
|
blockNumber,
|
56
76
|
blockTag,
|
57
77
|
functionName: 'aggregate3',
|
58
|
-
});
|
59
|
-
return results.
|
78
|
+
})));
|
79
|
+
return results.flat().flatMap(({ returnData, success }, i) => {
|
80
|
+
const calls = chunkedCalls.flat();
|
60
81
|
const { callData } = calls[i];
|
61
82
|
const { abi, address, functionName, args } = contracts[i];
|
62
83
|
try {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"multicall.js","sourceRoot":"","sources":["../../../../src/actions/public/multicall.ts"],"names":[],"mappings":";;;AAEA,uDAAwD;AAExD,oDAG8B;AAS9B,mDAK6B;AAG7B,uDAAgD;
|
1
|
+
{"version":3,"file":"multicall.js","sourceRoot":"","sources":["../../../../src/actions/public/multicall.ts"],"names":[],"mappings":"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"}
|
@@ -3,7 +3,11 @@ import { AbiDecodingZeroDataError, RawContractError, } from '../../errors/index.
|
|
3
3
|
import { decodeFunctionResult, encodeFunctionData, getChainContractAddress, getContractError, } from '../../utils/index.js';
|
4
4
|
import { readContract } from './readContract.js';
|
5
5
|
export async function multicall(client, args) {
|
6
|
-
const { allowFailure = true, blockNumber, blockTag, contracts: contracts_, multicallAddress: multicallAddress_, } = args;
|
6
|
+
const { allowFailure = true, batchSize: batchSize_, blockNumber, blockTag, contracts: contracts_, multicallAddress: multicallAddress_, } = args;
|
7
|
+
const batchSize = batchSize_ ??
|
8
|
+
((typeof client.batch?.multicall === 'object' &&
|
9
|
+
client.batch.multicall.batchSize) ||
|
10
|
+
1024);
|
7
11
|
const contracts = contracts_;
|
8
12
|
let multicallAddress = multicallAddress_;
|
9
13
|
if (!multicallAddress) {
|
@@ -15,18 +19,31 @@ export async function multicall(client, args) {
|
|
15
19
|
contract: 'multicall3',
|
16
20
|
});
|
17
21
|
}
|
18
|
-
const
|
22
|
+
const chunkedCalls = [[]];
|
23
|
+
let currentChunk = 0;
|
24
|
+
let currentChunkSize = 0;
|
25
|
+
for (let i = 0; i < contracts.length; i++) {
|
26
|
+
const { abi, address, args, functionName } = contracts[i];
|
19
27
|
try {
|
20
28
|
const callData = encodeFunctionData({
|
21
29
|
abi,
|
22
30
|
args,
|
23
31
|
functionName,
|
24
32
|
});
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
33
|
+
currentChunkSize += callData.length;
|
34
|
+
if (batchSize > 0 && currentChunkSize > batchSize) {
|
35
|
+
currentChunk++;
|
36
|
+
currentChunkSize = (callData.length - 2) / 2;
|
37
|
+
chunkedCalls[currentChunk] = [];
|
38
|
+
}
|
39
|
+
chunkedCalls[currentChunk] = [
|
40
|
+
...chunkedCalls[currentChunk],
|
41
|
+
{
|
42
|
+
allowFailure: true,
|
43
|
+
callData,
|
44
|
+
target: address,
|
45
|
+
},
|
46
|
+
];
|
30
47
|
}
|
31
48
|
catch (err) {
|
32
49
|
const error = getContractError(err, {
|
@@ -38,22 +55,26 @@ export async function multicall(client, args) {
|
|
38
55
|
});
|
39
56
|
if (!allowFailure)
|
40
57
|
throw error;
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
58
|
+
chunkedCalls[currentChunk] = [
|
59
|
+
...chunkedCalls[currentChunk],
|
60
|
+
{
|
61
|
+
allowFailure: true,
|
62
|
+
callData: '0x',
|
63
|
+
target: address,
|
64
|
+
},
|
65
|
+
];
|
46
66
|
}
|
47
|
-
}
|
48
|
-
const results = await readContract(client, {
|
67
|
+
}
|
68
|
+
const results = await Promise.all(chunkedCalls.map((calls) => readContract(client, {
|
49
69
|
abi: multicall3Abi,
|
50
70
|
address: multicallAddress,
|
51
71
|
args: [calls],
|
52
72
|
blockNumber,
|
53
73
|
blockTag,
|
54
74
|
functionName: 'aggregate3',
|
55
|
-
});
|
56
|
-
return results.
|
75
|
+
})));
|
76
|
+
return results.flat().flatMap(({ returnData, success }, i) => {
|
77
|
+
const calls = chunkedCalls.flat();
|
57
78
|
const { callData } = calls[i];
|
58
79
|
const { abi, address, functionName, args } = contracts[i];
|
59
80
|
try {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"multicall.js","sourceRoot":"","sources":["../../../../src/actions/public/multicall.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAExD,OAAO,EACL,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAS9B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;
|
1
|
+
{"version":3,"file":"multicall.js","sourceRoot":"","sources":["../../../../src/actions/public/multicall.ts"],"names":[],"mappings":"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"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
export const version = '0.4.0-main.
|
1
|
+
export const version = '0.4.0-main.20230424T231630';
|
2
2
|
//# sourceMappingURL=version.js.map
|
@@ -5,6 +5,8 @@ import type { MulticallResults } from '../../types/multicall.js';
|
|
5
5
|
import type { CallParameters } from './call.js';
|
6
6
|
export type MulticallParameters<TContracts extends ContractFunctionConfig[] = ContractFunctionConfig[], TAllowFailure extends boolean = true> = Pick<CallParameters, 'blockNumber' | 'blockTag'> & {
|
7
7
|
allowFailure?: TAllowFailure;
|
8
|
+
/** The maximum size (in bytes) for each calldata chunk. Set to `0` to disable the size limit. @default 1_024 */
|
9
|
+
batchSize?: number;
|
8
10
|
contracts: Narrow<readonly [...MulticallContracts<TContracts>]>;
|
9
11
|
multicallAddress?: Address;
|
10
12
|
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../../../../src/actions/public/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAOrE,OAAO,KAAK,EACV,OAAO,EACP,KAAK,EACL,sBAAsB,EAEtB,kBAAkB,EACnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAQhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAG/C,MAAM,MAAM,mBAAmB,CAC7B,UAAU,SAAS,sBAAsB,EAAE,GAAG,sBAAsB,EAAE,EACtE,aAAa,SAAS,OAAO,GAAG,IAAI,IAClC,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,UAAU,CAAC,GAAG;IACrD,YAAY,CAAC,EAAE,aAAa,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAC/D,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,mBAAmB,CAC7B,UAAU,SAAS,sBAAsB,EAAE,GAAG,sBAAsB,EAAE,EACtE,aAAa,SAAS,OAAO,GAAG,IAAI,IAClC,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,SAAS,CAC7B,MAAM,SAAS,KAAK,GAAG,SAAS,EAChC,UAAU,SAAS,sBAAsB,EAAE,EAC3C,aAAa,SAAS,OAAO,GAAG,IAAI,EAEpC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,EACvC,IAAI,EAAE,mBAAmB,CAAC,UAAU,EAAE,aAAa,CAAC,GACnD,OAAO,CAAC,mBAAmB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,
|
1
|
+
{"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../../../../src/actions/public/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAOrE,OAAO,KAAK,EACV,OAAO,EACP,KAAK,EACL,sBAAsB,EAEtB,kBAAkB,EACnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAQhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAG/C,MAAM,MAAM,mBAAmB,CAC7B,UAAU,SAAS,sBAAsB,EAAE,GAAG,sBAAsB,EAAE,EACtE,aAAa,SAAS,OAAO,GAAG,IAAI,IAClC,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,UAAU,CAAC,GAAG;IACrD,YAAY,CAAC,EAAE,aAAa,CAAA;IAC5B,gHAAgH;IAChH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAC/D,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,mBAAmB,CAC7B,UAAU,SAAS,sBAAsB,EAAE,GAAG,sBAAsB,EAAE,EACtE,aAAa,SAAS,OAAO,GAAG,IAAI,IAClC,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,SAAS,CAC7B,MAAM,SAAS,KAAK,GAAG,SAAS,EAChC,UAAU,SAAS,sBAAsB,EAAE,EAC3C,aAAa,SAAS,OAAO,GAAG,IAAI,EAEpC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,EACvC,IAAI,EAAE,mBAAmB,CAAC,UAAU,EAAE,aAAa,CAAC,GACnD,OAAO,CAAC,mBAAmB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CA4HzD"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
export declare const version = "0.4.0-main.
|
1
|
+
export declare const version = "0.4.0-main.20230424T231630";
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/package.json
CHANGED
@@ -29,6 +29,8 @@ export type MulticallParameters<
|
|
29
29
|
TAllowFailure extends boolean = true,
|
30
30
|
> = Pick<CallParameters, 'blockNumber' | 'blockTag'> & {
|
31
31
|
allowFailure?: TAllowFailure
|
32
|
+
/** The maximum size (in bytes) for each calldata chunk. Set to `0` to disable the size limit. @default 1_024 */
|
33
|
+
batchSize?: number
|
32
34
|
contracts: Narrow<readonly [...MulticallContracts<TContracts>]>
|
33
35
|
multicallAddress?: Address
|
34
36
|
}
|
@@ -87,12 +89,19 @@ export async function multicall<
|
|
87
89
|
): Promise<MulticallReturnType<TContracts, TAllowFailure>> {
|
88
90
|
const {
|
89
91
|
allowFailure = true,
|
92
|
+
batchSize: batchSize_,
|
90
93
|
blockNumber,
|
91
94
|
blockTag,
|
92
95
|
contracts: contracts_,
|
93
96
|
multicallAddress: multicallAddress_,
|
94
97
|
} = args
|
95
98
|
|
99
|
+
const batchSize =
|
100
|
+
batchSize_ ??
|
101
|
+
((typeof client.batch?.multicall === 'object' &&
|
102
|
+
client.batch.multicall.batchSize) ||
|
103
|
+
1_024)
|
104
|
+
|
96
105
|
// Fix type cast from `Narrow` in type definition.
|
97
106
|
const contracts = contracts_ as readonly [...MulticallContracts<TContracts>]
|
98
107
|
|
@@ -110,18 +119,39 @@ export async function multicall<
|
|
110
119
|
})
|
111
120
|
}
|
112
121
|
|
113
|
-
|
122
|
+
type Aggregate3Calls = {
|
123
|
+
allowFailure: boolean
|
124
|
+
callData: Hex
|
125
|
+
target: Address
|
126
|
+
}[]
|
127
|
+
|
128
|
+
const chunkedCalls: Aggregate3Calls[] = [[]]
|
129
|
+
let currentChunk = 0
|
130
|
+
let currentChunkSize = 0
|
131
|
+
for (let i = 0; i < contracts.length; i++) {
|
132
|
+
const { abi, address, args, functionName } = contracts[i]
|
114
133
|
try {
|
115
134
|
const callData = encodeFunctionData({
|
116
135
|
abi,
|
117
136
|
args,
|
118
137
|
functionName,
|
119
138
|
} as unknown as EncodeFunctionDataParameters)
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
139
|
+
|
140
|
+
currentChunkSize += callData.length
|
141
|
+
if (batchSize > 0 && currentChunkSize > batchSize) {
|
142
|
+
currentChunk++
|
143
|
+
currentChunkSize = (callData.length - 2) / 2
|
144
|
+
chunkedCalls[currentChunk] = []
|
124
145
|
}
|
146
|
+
|
147
|
+
chunkedCalls[currentChunk] = [
|
148
|
+
...chunkedCalls[currentChunk],
|
149
|
+
{
|
150
|
+
allowFailure: true,
|
151
|
+
callData,
|
152
|
+
target: address,
|
153
|
+
},
|
154
|
+
]
|
125
155
|
} catch (err) {
|
126
156
|
const error = getContractError(err as BaseError, {
|
127
157
|
abi,
|
@@ -131,22 +161,32 @@ export async function multicall<
|
|
131
161
|
functionName,
|
132
162
|
})
|
133
163
|
if (!allowFailure) throw error
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
164
|
+
chunkedCalls[currentChunk] = [
|
165
|
+
...chunkedCalls[currentChunk],
|
166
|
+
{
|
167
|
+
allowFailure: true,
|
168
|
+
callData: '0x' as Hex,
|
169
|
+
target: address,
|
170
|
+
},
|
171
|
+
]
|
139
172
|
}
|
140
|
-
}
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
173
|
+
}
|
174
|
+
|
175
|
+
const results = await Promise.all(
|
176
|
+
chunkedCalls.map((calls) =>
|
177
|
+
readContract(client, {
|
178
|
+
abi: multicall3Abi,
|
179
|
+
address: multicallAddress!,
|
180
|
+
args: [calls],
|
181
|
+
blockNumber,
|
182
|
+
blockTag,
|
183
|
+
functionName: 'aggregate3',
|
184
|
+
}),
|
185
|
+
),
|
186
|
+
)
|
187
|
+
|
188
|
+
return results.flat().flatMap(({ returnData, success }, i) => {
|
189
|
+
const calls = chunkedCalls.flat()
|
150
190
|
const { callData } = calls[i]
|
151
191
|
const { abi, address, functionName, args } = contracts[i]
|
152
192
|
try {
|
package/src/errors/version.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export const version = '0.4.0-main.
|
1
|
+
export const version = '0.4.0-main.20230424T231630'
|