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.
@@ -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 calls = contracts.map(({ abi, address, args, functionName }) => {
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
- return {
29
- allowFailure: true,
30
- callData,
31
- target: address,
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
- return {
45
- allowFailure: true,
46
- callData: '0x',
47
- target: address,
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.map(({ returnData, success }, i) => {
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":"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"}
1
+ {"version":3,"file":"multicall.js","sourceRoot":"","sources":["../../../../src/actions/public/multicall.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.version = void 0;
4
- exports.version = '0.3.10';
4
+ exports.version = '0.3.11';
5
5
  //# sourceMappingURL=version.js.map
@@ -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 = address_.substring(2).toLowerCase();
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;IAC/C,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACtD,MAAM,IAAI,GAAG,IAAA,oBAAS,EAAC,IAAA,wBAAa,EAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAA;IAE1D,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACpC,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;AAfD,0CAeC;AAED,SAAgB,UAAU,CAAC,OAAe;IACxC,IAAI,CAAC,IAAA,wBAAS,EAAC,OAAO,CAAC;QAAE,MAAM,IAAI,8BAAmB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACnE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC;AAHD,gCAGC"}
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 calls = contracts.map(({ abi, address, args, functionName }) => {
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
- return {
26
- allowFailure: true,
27
- callData,
28
- target: address,
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
- return {
42
- allowFailure: true,
43
- callData: '0x',
44
- target: address,
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.map(({ returnData, success }, i) => {
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":"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"}
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.10';
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 = address_.substring(2).toLowerCase();
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;IAC/C,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACtD,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAA;IAE1D,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACpC,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;IACxC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACnE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC"}
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,CAsFzD"}
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.10";
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,CAe1D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGnD"}
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
@@ -12,7 +12,7 @@
12
12
  "isomorphic-ws": "5.0.0",
13
13
  "ws": "8.12.0"
14
14
  },
15
- "version": "0.3.10",
15
+ "version": "0.3.11",
16
16
  "files": [
17
17
  "dist",
18
18
  "!dist/**/*.tsbuildinfo",
@@ -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
- const calls = contracts.map(({ abi, address, args, functionName }) => {
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
- return {
121
- allowFailure: true,
122
- callData,
123
- target: address,
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
- return {
135
- allowFailure: true,
136
- callData: '0x' as Hex,
137
- target: address,
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
- const results = await readContract(client, {
142
- abi: multicall3Abi,
143
- address: multicallAddress,
144
- args: [calls],
145
- blockNumber,
146
- blockTag,
147
- functionName: 'aggregate3',
148
- })
149
- return results.map(({ returnData, success }, i) => {
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 {
@@ -1 +1 @@
1
- export const version = '0.3.10'
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 = address_.substring(2).toLowerCase()
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 = hexAddress.split('')
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
  }