viem 0.3.10 → 0.3.11
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/cjs/utils/address/getAddress.js +7 -5
- package/dist/cjs/utils/address/getAddress.js.map +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/esm/utils/address/getAddress.js +7 -5
- package/dist/esm/utils/address/getAddress.js.map +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/dist/types/utils/address/getAddress.d.ts +2 -2
- package/dist/types/utils/address/getAddress.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/actions/public/multicall.ts +60 -20
- package/src/errors/version.ts +1 -1
- package/src/utils/address/getAddress.ts +9 -5
@@ -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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"}
|
@@ -5,10 +5,12 @@ const index_js_1 = require("../../errors/index.js");
|
|
5
5
|
const index_js_2 = require("../encoding/index.js");
|
6
6
|
const index_js_3 = require("../hash/index.js");
|
7
7
|
const isAddress_js_1 = require("./isAddress.js");
|
8
|
-
function checksumAddress(address_) {
|
9
|
-
const hexAddress =
|
8
|
+
function checksumAddress(address_, chainId) {
|
9
|
+
const hexAddress = chainId
|
10
|
+
? `${chainId}${address_.toLowerCase()}`
|
11
|
+
: address_.substring(2).toLowerCase();
|
10
12
|
const hash = (0, index_js_3.keccak256)((0, index_js_2.stringToBytes)(hexAddress), 'bytes');
|
11
|
-
const address = hexAddress.split('');
|
13
|
+
const address = (chainId ? hexAddress.substring(`${chainId}0x`.length) : hexAddress).split('');
|
12
14
|
for (let i = 0; i < 40; i += 2) {
|
13
15
|
if (hash[i >> 1] >> 4 >= 8 && address[i]) {
|
14
16
|
address[i] = address[i].toUpperCase();
|
@@ -20,10 +22,10 @@ function checksumAddress(address_) {
|
|
20
22
|
return `0x${address.join('')}`;
|
21
23
|
}
|
22
24
|
exports.checksumAddress = checksumAddress;
|
23
|
-
function getAddress(address) {
|
25
|
+
function getAddress(address, chainId) {
|
24
26
|
if (!(0, isAddress_js_1.isAddress)(address))
|
25
27
|
throw new index_js_1.InvalidAddressError({ address });
|
26
|
-
return checksumAddress(address);
|
28
|
+
return checksumAddress(address, chainId);
|
27
29
|
}
|
28
30
|
exports.getAddress = getAddress;
|
29
31
|
//# sourceMappingURL=getAddress.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"getAddress.js","sourceRoot":"","sources":["../../../../src/utils/address/getAddress.ts"],"names":[],"mappings":";;;AAAA,oDAA2D;AAE3D,mDAAoD;AACpD,+CAA4C;AAC5C,iDAA0C;AAE1C,SAAgB,eAAe,CAAC,QAAiB;
|
1
|
+
{"version":3,"file":"getAddress.js","sourceRoot":"","sources":["../../../../src/utils/address/getAddress.ts"],"names":[],"mappings":";;;AAAA,oDAA2D;AAE3D,mDAAoD;AACpD,+CAA4C;AAC5C,iDAA0C;AAE1C,SAAgB,eAAe,CAAC,QAAiB,EAAE,OAAgB;IACjE,MAAM,UAAU,GAAG,OAAO;QACxB,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE;QACvC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACvC,MAAM,IAAI,GAAG,IAAA,oBAAS,EAAC,IAAA,wBAAa,EAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAA;IAE1D,MAAM,OAAO,GAAG,CACd,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CACnE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;QAC9B,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE;YACxC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;SACtC;QACD,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;YAChD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;SAC9C;KACF;IAED,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA;AAChC,CAAC;AAnBD,0CAmBC;AAED,SAAgB,UAAU,CAAC,OAAe,EAAE,OAAgB;IAC1D,IAAI,CAAC,IAAA,wBAAS,EAAC,OAAO,CAAC;QAAE,MAAM,IAAI,8BAAmB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACnE,OAAO,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAC1C,CAAC;AAHD,gCAGC"}
|
@@ -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.3.
|
1
|
+
export const version = '0.3.11';
|
2
2
|
//# sourceMappingURL=version.js.map
|
@@ -2,10 +2,12 @@ import { InvalidAddressError } from '../../errors/index.js';
|
|
2
2
|
import { stringToBytes } from '../encoding/index.js';
|
3
3
|
import { keccak256 } from '../hash/index.js';
|
4
4
|
import { isAddress } from './isAddress.js';
|
5
|
-
export function checksumAddress(address_) {
|
6
|
-
const hexAddress =
|
5
|
+
export function checksumAddress(address_, chainId) {
|
6
|
+
const hexAddress = chainId
|
7
|
+
? `${chainId}${address_.toLowerCase()}`
|
8
|
+
: address_.substring(2).toLowerCase();
|
7
9
|
const hash = keccak256(stringToBytes(hexAddress), 'bytes');
|
8
|
-
const address = hexAddress.split('');
|
10
|
+
const address = (chainId ? hexAddress.substring(`${chainId}0x`.length) : hexAddress).split('');
|
9
11
|
for (let i = 0; i < 40; i += 2) {
|
10
12
|
if (hash[i >> 1] >> 4 >= 8 && address[i]) {
|
11
13
|
address[i] = address[i].toUpperCase();
|
@@ -16,9 +18,9 @@ export function checksumAddress(address_) {
|
|
16
18
|
}
|
17
19
|
return `0x${address.join('')}`;
|
18
20
|
}
|
19
|
-
export function getAddress(address) {
|
21
|
+
export function getAddress(address, chainId) {
|
20
22
|
if (!isAddress(address))
|
21
23
|
throw new InvalidAddressError({ address });
|
22
|
-
return checksumAddress(address);
|
24
|
+
return checksumAddress(address, chainId);
|
23
25
|
}
|
24
26
|
//# sourceMappingURL=getAddress.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"getAddress.js","sourceRoot":"","sources":["../../../../src/utils/address/getAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,MAAM,UAAU,eAAe,CAAC,QAAiB;
|
1
|
+
{"version":3,"file":"getAddress.js","sourceRoot":"","sources":["../../../../src/utils/address/getAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,MAAM,UAAU,eAAe,CAAC,QAAiB,EAAE,OAAgB;IACjE,MAAM,UAAU,GAAG,OAAO;QACxB,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE;QACvC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACvC,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAA;IAE1D,MAAM,OAAO,GAAG,CACd,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CACnE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;QAC9B,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE;YACxC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;SACtC;QACD,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;YAChD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;SAC9C;KACF;IAED,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,OAAgB;IAC1D,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACnE,OAAO,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAC1C,CAAC"}
|
@@ -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.3.
|
1
|
+
export declare const version = "0.3.11";
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
@@ -1,4 +1,4 @@
|
|
1
1
|
import type { Address } from '../../types/index.js';
|
2
|
-
export declare function checksumAddress(address_: Address): Address;
|
3
|
-
export declare function getAddress(address: string): Address;
|
2
|
+
export declare function checksumAddress(address_: Address, chainId?: number): Address;
|
3
|
+
export declare function getAddress(address: string, chainId?: number): Address;
|
4
4
|
//# sourceMappingURL=getAddress.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"getAddress.d.ts","sourceRoot":"","sources":["../../../../src/utils/address/getAddress.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAKnD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,
|
1
|
+
{"version":3,"file":"getAddress.d.ts","sourceRoot":"","sources":["../../../../src/utils/address/getAddress.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAKnD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAmB5E;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAGrE"}
|
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.3.
|
1
|
+
export const version = '0.3.11'
|
@@ -4,11 +4,15 @@ import { stringToBytes } from '../encoding/index.js'
|
|
4
4
|
import { keccak256 } from '../hash/index.js'
|
5
5
|
import { isAddress } from './isAddress.js'
|
6
6
|
|
7
|
-
export function checksumAddress(address_: Address): Address {
|
8
|
-
const hexAddress =
|
7
|
+
export function checksumAddress(address_: Address, chainId?: number): Address {
|
8
|
+
const hexAddress = chainId
|
9
|
+
? `${chainId}${address_.toLowerCase()}`
|
10
|
+
: address_.substring(2).toLowerCase()
|
9
11
|
const hash = keccak256(stringToBytes(hexAddress), 'bytes')
|
10
12
|
|
11
|
-
const address =
|
13
|
+
const address = (
|
14
|
+
chainId ? hexAddress.substring(`${chainId}0x`.length) : hexAddress
|
15
|
+
).split('')
|
12
16
|
for (let i = 0; i < 40; i += 2) {
|
13
17
|
if (hash[i >> 1] >> 4 >= 8 && address[i]) {
|
14
18
|
address[i] = address[i].toUpperCase()
|
@@ -21,7 +25,7 @@ export function checksumAddress(address_: Address): Address {
|
|
21
25
|
return `0x${address.join('')}`
|
22
26
|
}
|
23
27
|
|
24
|
-
export function getAddress(address: string): Address {
|
28
|
+
export function getAddress(address: string, chainId?: number): Address {
|
25
29
|
if (!isAddress(address)) throw new InvalidAddressError({ address })
|
26
|
-
return checksumAddress(address)
|
30
|
+
return checksumAddress(address, chainId)
|
27
31
|
}
|