viem 0.3.6 → 0.4.0-jxom-multicall-chunk-size.20230420T212142

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,7 @@ 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 = 0, blockNumber, blockTag, contracts: contracts_, multicallAddress: multicallAddress_, } = args;
10
10
  const contracts = contracts_;
11
11
  let multicallAddress = multicallAddress_;
12
12
  if (!multicallAddress) {
@@ -18,18 +18,31 @@ async function multicall(client, args) {
18
18
  contract: 'multicall3',
19
19
  });
20
20
  }
21
- const calls = contracts.map(({ abi, address, args, functionName }) => {
21
+ const chunkedCalls = [[]];
22
+ let currentChunk = 0;
23
+ let currentChunkSize = 0;
24
+ for (let i = 0; i < contracts.length; i++) {
25
+ const { abi, address, args, functionName } = contracts[i];
22
26
  try {
23
27
  const callData = (0, index_js_3.encodeFunctionData)({
24
28
  abi,
25
29
  args,
26
30
  functionName,
27
31
  });
28
- return {
29
- allowFailure: true,
30
- callData,
31
- target: address,
32
- };
32
+ currentChunkSize += callData.length;
33
+ if (batchSize > 0 && currentChunkSize > batchSize) {
34
+ currentChunk++;
35
+ currentChunkSize = (callData.length - 2) / 2;
36
+ chunkedCalls[currentChunk] = [];
37
+ }
38
+ chunkedCalls[currentChunk] = [
39
+ ...(chunkedCalls[currentChunk] || []),
40
+ {
41
+ allowFailure: true,
42
+ callData,
43
+ target: address,
44
+ },
45
+ ];
33
46
  }
34
47
  catch (err) {
35
48
  const error = (0, index_js_3.getContractError)(err, {
@@ -41,22 +54,26 @@ async function multicall(client, args) {
41
54
  });
42
55
  if (!allowFailure)
43
56
  throw error;
44
- return {
45
- allowFailure: true,
46
- callData: '0x',
47
- target: address,
48
- };
57
+ chunkedCalls[currentChunk] = [
58
+ ...(chunkedCalls[currentChunk] || []),
59
+ {
60
+ allowFailure: true,
61
+ callData: '0x',
62
+ target: address,
63
+ },
64
+ ];
49
65
  }
50
- });
51
- const results = await (0, readContract_js_1.readContract)(client, {
66
+ }
67
+ const results = await Promise.all(chunkedCalls.map((calls) => (0, readContract_js_1.readContract)(client, {
52
68
  abi: index_js_1.multicall3Abi,
53
69
  address: multicallAddress,
54
70
  args: [calls],
55
71
  blockNumber,
56
72
  blockTag,
57
73
  functionName: 'aggregate3',
58
- });
59
- return results.map(({ returnData, success }, i) => {
74
+ })));
75
+ return results.flat().flatMap(({ returnData, success }, i) => {
76
+ const calls = chunkedCalls.flat();
60
77
  const { callData } = calls[i];
61
78
  const { abi, address, functionName, args } = contracts[i];
62
79
  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.6';
4
+ exports.version = '0.4.0-jxom-multicall-chunk-size.20230420T212142';
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/errors/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,OAAO,CAAA"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/errors/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,iDAAiD,CAAA"}
@@ -3,7 +3,7 @@ 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 = 0, blockNumber, blockTag, contracts: contracts_, multicallAddress: multicallAddress_, } = args;
7
7
  const contracts = contracts_;
8
8
  let multicallAddress = multicallAddress_;
9
9
  if (!multicallAddress) {
@@ -15,18 +15,31 @@ export async function multicall(client, args) {
15
15
  contract: 'multicall3',
16
16
  });
17
17
  }
18
- const calls = contracts.map(({ abi, address, args, functionName }) => {
18
+ const chunkedCalls = [[]];
19
+ let currentChunk = 0;
20
+ let currentChunkSize = 0;
21
+ for (let i = 0; i < contracts.length; i++) {
22
+ const { abi, address, args, functionName } = contracts[i];
19
23
  try {
20
24
  const callData = encodeFunctionData({
21
25
  abi,
22
26
  args,
23
27
  functionName,
24
28
  });
25
- return {
26
- allowFailure: true,
27
- callData,
28
- target: address,
29
- };
29
+ currentChunkSize += callData.length;
30
+ if (batchSize > 0 && currentChunkSize > batchSize) {
31
+ currentChunk++;
32
+ currentChunkSize = (callData.length - 2) / 2;
33
+ chunkedCalls[currentChunk] = [];
34
+ }
35
+ chunkedCalls[currentChunk] = [
36
+ ...(chunkedCalls[currentChunk] || []),
37
+ {
38
+ allowFailure: true,
39
+ callData,
40
+ target: address,
41
+ },
42
+ ];
30
43
  }
31
44
  catch (err) {
32
45
  const error = getContractError(err, {
@@ -38,22 +51,26 @@ export async function multicall(client, args) {
38
51
  });
39
52
  if (!allowFailure)
40
53
  throw error;
41
- return {
42
- allowFailure: true,
43
- callData: '0x',
44
- target: address,
45
- };
54
+ chunkedCalls[currentChunk] = [
55
+ ...(chunkedCalls[currentChunk] || []),
56
+ {
57
+ allowFailure: true,
58
+ callData: '0x',
59
+ target: address,
60
+ },
61
+ ];
46
62
  }
47
- });
48
- const results = await readContract(client, {
63
+ }
64
+ const results = await Promise.all(chunkedCalls.map((calls) => readContract(client, {
49
65
  abi: multicall3Abi,
50
66
  address: multicallAddress,
51
67
  args: [calls],
52
68
  blockNumber,
53
69
  blockTag,
54
70
  functionName: 'aggregate3',
55
- });
56
- return results.map(({ returnData, success }, i) => {
71
+ })));
72
+ return results.flat().flatMap(({ returnData, success }, i) => {
73
+ const calls = chunkedCalls.flat();
57
74
  const { callData } = calls[i];
58
75
  const { abi, address, functionName, args } = contracts[i];
59
76
  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.6';
1
+ export const version = '0.4.0-jxom-multicall-chunk-size.20230420T212142';
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/errors/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAA"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/errors/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,iDAAiD,CAAA"}
@@ -5,6 +5,7 @@ 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
+ batchSize?: number;
8
9
  contracts: Narrow<readonly [...MulticallContracts<TContracts>]>;
9
10
  multicallAddress?: Address;
10
11
  };
@@ -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,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,CAsHzD"}
@@ -1,2 +1,2 @@
1
- export declare const version = "0.3.6";
1
+ export declare const version = "0.4.0-jxom-multicall-chunk-size.20230420T212142";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/errors/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAA"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/errors/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,oDAAoD,CAAA"}
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.6",
15
+ "version": "0.4.0-jxom-multicall-chunk-size.20230420T212142",
16
16
  "files": [
17
17
  "dist",
18
18
  "!dist/**/*.tsbuildinfo",
@@ -140,4 +140,4 @@
140
140
  "wallet",
141
141
  "web3"
142
142
  ]
143
- }
143
+ }
@@ -29,6 +29,7 @@ export type MulticallParameters<
29
29
  TAllowFailure extends boolean = true,
30
30
  > = Pick<CallParameters, 'blockNumber' | 'blockTag'> & {
31
31
  allowFailure?: TAllowFailure
32
+ batchSize?: number
32
33
  contracts: Narrow<readonly [...MulticallContracts<TContracts>]>
33
34
  multicallAddress?: Address
34
35
  }
@@ -87,6 +88,7 @@ export async function multicall<
87
88
  ): Promise<MulticallReturnType<TContracts, TAllowFailure>> {
88
89
  const {
89
90
  allowFailure = true,
91
+ batchSize = 0,
90
92
  blockNumber,
91
93
  blockTag,
92
94
  contracts: contracts_,
@@ -110,18 +112,39 @@ export async function multicall<
110
112
  })
111
113
  }
112
114
 
113
- const calls = contracts.map(({ abi, address, args, functionName }) => {
115
+ type Aggregate3Calls = {
116
+ allowFailure: boolean
117
+ callData: Hex
118
+ target: Address
119
+ }[]
120
+
121
+ const chunkedCalls: Aggregate3Calls[] = [[]]
122
+ let currentChunk = 0
123
+ let currentChunkSize = 0
124
+ for (let i = 0; i < contracts.length; i++) {
125
+ const { abi, address, args, functionName } = contracts[i]
114
126
  try {
115
127
  const callData = encodeFunctionData({
116
128
  abi,
117
129
  args,
118
130
  functionName,
119
131
  } as unknown as EncodeFunctionDataParameters)
120
- return {
121
- allowFailure: true,
122
- callData,
123
- target: address,
132
+
133
+ currentChunkSize += callData.length
134
+ if (batchSize > 0 && currentChunkSize > batchSize) {
135
+ currentChunk++
136
+ currentChunkSize = (callData.length - 2) / 2
137
+ chunkedCalls[currentChunk] = []
124
138
  }
139
+
140
+ chunkedCalls[currentChunk] = [
141
+ ...(chunkedCalls[currentChunk] || []),
142
+ {
143
+ allowFailure: true,
144
+ callData,
145
+ target: address,
146
+ },
147
+ ]
125
148
  } catch (err) {
126
149
  const error = getContractError(err as BaseError, {
127
150
  abi,
@@ -131,22 +154,32 @@ export async function multicall<
131
154
  functionName,
132
155
  })
133
156
  if (!allowFailure) throw error
134
- return {
135
- allowFailure: true,
136
- callData: '0x' as Hex,
137
- target: address,
138
- }
157
+ chunkedCalls[currentChunk] = [
158
+ ...(chunkedCalls[currentChunk] || []),
159
+ {
160
+ allowFailure: true,
161
+ callData: '0x' as Hex,
162
+ target: address,
163
+ },
164
+ ]
139
165
  }
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) => {
166
+ }
167
+
168
+ const results = await Promise.all(
169
+ chunkedCalls.map((calls) =>
170
+ readContract(client, {
171
+ abi: multicall3Abi,
172
+ address: multicallAddress!,
173
+ args: [calls],
174
+ blockNumber,
175
+ blockTag,
176
+ functionName: 'aggregate3',
177
+ }),
178
+ ),
179
+ )
180
+
181
+ return results.flat().flatMap(({ returnData, success }, i) => {
182
+ const calls = chunkedCalls.flat()
150
183
  const { callData } = calls[i]
151
184
  const { abi, address, functionName, args } = contracts[i]
152
185
  try {
@@ -1 +1 @@
1
- export const version = '0.3.6'
1
+ export const version = '0.4.0-jxom-multicall-chunk-size.20230420T212142'