diff --git a/artifacts/ts/Add.ts b/artifacts/ts/Add.ts index dc39b8f8d..5d0d1d787 100644 --- a/artifacts/ts/Add.ts +++ b/artifacts/ts/Add.ts @@ -403,14 +403,15 @@ export class AddInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( - Add, - this, - callss, - getContractByCodeHash - )) as AddTypes.MulticallReturnType; + callss: Callss + ): Promise>; + async multicall< + Callss extends AddTypes.MultiCallParams | AddTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods(Add, this, callss, getContractByCodeHash); } } diff --git a/artifacts/ts/DeprecatedNFTTest1.ts b/artifacts/ts/DeprecatedNFTTest1.ts index 6ccd6fe42..d3b179ea4 100644 --- a/artifacts/ts/DeprecatedNFTTest1.ts +++ b/artifacts/ts/DeprecatedNFTTest1.ts @@ -166,14 +166,22 @@ export class DeprecatedNFTTest1Instance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | DeprecatedNFTTest1Types.MultiCallParams + | DeprecatedNFTTest1Types.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( DeprecatedNFTTest1, this, callss, getContractByCodeHash - )) as DeprecatedNFTTest1Types.MulticallReturnType; + ); } } diff --git a/artifacts/ts/DeprecatedNFTTest2.ts b/artifacts/ts/DeprecatedNFTTest2.ts index 908ee13be..fb1331205 100644 --- a/artifacts/ts/DeprecatedNFTTest2.ts +++ b/artifacts/ts/DeprecatedNFTTest2.ts @@ -205,14 +205,22 @@ export class DeprecatedNFTTest2Instance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | DeprecatedNFTTest2Types.MultiCallParams + | DeprecatedNFTTest2Types.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( DeprecatedNFTTest2, this, callss, getContractByCodeHash - )) as DeprecatedNFTTest2Types.MulticallReturnType; + ); } } diff --git a/artifacts/ts/DeprecatedNFTTest3.ts b/artifacts/ts/DeprecatedNFTTest3.ts index 137791cdb..9c989e8f3 100644 --- a/artifacts/ts/DeprecatedNFTTest3.ts +++ b/artifacts/ts/DeprecatedNFTTest3.ts @@ -205,14 +205,22 @@ export class DeprecatedNFTTest3Instance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | DeprecatedNFTTest3Types.MultiCallParams + | DeprecatedNFTTest3Types.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( DeprecatedNFTTest3, this, callss, getContractByCodeHash - )) as DeprecatedNFTTest3Types.MulticallReturnType; + ); } } diff --git a/artifacts/ts/DeprecatedNFTTest4.ts b/artifacts/ts/DeprecatedNFTTest4.ts index 7dd2c367f..5ebec8d3d 100644 --- a/artifacts/ts/DeprecatedNFTTest4.ts +++ b/artifacts/ts/DeprecatedNFTTest4.ts @@ -198,14 +198,22 @@ export class DeprecatedNFTTest4Instance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | DeprecatedNFTTest4Types.MultiCallParams + | DeprecatedNFTTest4Types.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( DeprecatedNFTTest4, this, callss, getContractByCodeHash - )) as DeprecatedNFTTest4Types.MulticallReturnType; + ); } } diff --git a/artifacts/ts/DeprecatedNFTTest5.ts b/artifacts/ts/DeprecatedNFTTest5.ts index 349847fbd..ecd6e7f5e 100644 --- a/artifacts/ts/DeprecatedNFTTest5.ts +++ b/artifacts/ts/DeprecatedNFTTest5.ts @@ -212,14 +212,22 @@ export class DeprecatedNFTTest5Instance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | DeprecatedNFTTest5Types.MultiCallParams + | DeprecatedNFTTest5Types.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( DeprecatedNFTTest5, this, callss, getContractByCodeHash - )) as DeprecatedNFTTest5Types.MulticallReturnType; + ); } } diff --git a/artifacts/ts/DeprecatedNFTTest6.ts b/artifacts/ts/DeprecatedNFTTest6.ts index c1ef998bb..4b46bbe5a 100644 --- a/artifacts/ts/DeprecatedNFTTest6.ts +++ b/artifacts/ts/DeprecatedNFTTest6.ts @@ -198,14 +198,22 @@ export class DeprecatedNFTTest6Instance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | DeprecatedNFTTest6Types.MultiCallParams + | DeprecatedNFTTest6Types.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( DeprecatedNFTTest6, this, callss, getContractByCodeHash - )) as DeprecatedNFTTest6Types.MulticallReturnType; + ); } } diff --git a/artifacts/ts/DeprecatedNFTTest7.ts b/artifacts/ts/DeprecatedNFTTest7.ts index 23bce92bc..6e1796e1c 100644 --- a/artifacts/ts/DeprecatedNFTTest7.ts +++ b/artifacts/ts/DeprecatedNFTTest7.ts @@ -212,14 +212,22 @@ export class DeprecatedNFTTest7Instance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | DeprecatedNFTTest7Types.MultiCallParams + | DeprecatedNFTTest7Types.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( DeprecatedNFTTest7, this, callss, getContractByCodeHash - )) as DeprecatedNFTTest7Types.MulticallReturnType; + ); } } diff --git a/artifacts/ts/FakeTokenTest.ts b/artifacts/ts/FakeTokenTest.ts index feb3cfaae..360a4f6d5 100644 --- a/artifacts/ts/FakeTokenTest.ts +++ b/artifacts/ts/FakeTokenTest.ts @@ -293,14 +293,22 @@ export class FakeTokenTestInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | FakeTokenTestTypes.MultiCallParams + | FakeTokenTestTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( FakeTokenTest, this, callss, getContractByCodeHash - )) as FakeTokenTestTypes.MulticallReturnType; + ); } } diff --git a/artifacts/ts/Greeter.ts b/artifacts/ts/Greeter.ts index 52a29acd9..7b4e21a17 100644 --- a/artifacts/ts/Greeter.ts +++ b/artifacts/ts/Greeter.ts @@ -168,14 +168,15 @@ export class GreeterInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( - Greeter, - this, - callss, - getContractByCodeHash - )) as GreeterTypes.MulticallReturnType; + callss: Callss + ): Promise>; + async multicall< + Callss extends GreeterTypes.MultiCallParams | GreeterTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods(Greeter, this, callss, getContractByCodeHash); } } diff --git a/artifacts/ts/MapTest.ts b/artifacts/ts/MapTest.ts index 4620a2837..1cc29f303 100644 --- a/artifacts/ts/MapTest.ts +++ b/artifacts/ts/MapTest.ts @@ -263,14 +263,15 @@ export class MapTestInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( - MapTest, - this, - callss, - getContractByCodeHash - )) as MapTestTypes.MulticallReturnType; + callss: Callss + ): Promise>; + async multicall< + Callss extends MapTestTypes.MultiCallParams | MapTestTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods(MapTest, this, callss, getContractByCodeHash); } } diff --git a/artifacts/ts/NFTCollectionTest.ts b/artifacts/ts/NFTCollectionTest.ts index 0ef429f36..d9c55e8e9 100644 --- a/artifacts/ts/NFTCollectionTest.ts +++ b/artifacts/ts/NFTCollectionTest.ts @@ -314,14 +314,22 @@ export class NFTCollectionTestInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | NFTCollectionTestTypes.MultiCallParams + | NFTCollectionTestTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( NFTCollectionTest, this, callss, getContractByCodeHash - )) as NFTCollectionTestTypes.MulticallReturnType; + ); } } diff --git a/artifacts/ts/NFTCollectionWithRoyaltyTest.ts b/artifacts/ts/NFTCollectionWithRoyaltyTest.ts index bab20ca28..8c85c60fa 100644 --- a/artifacts/ts/NFTCollectionWithRoyaltyTest.ts +++ b/artifacts/ts/NFTCollectionWithRoyaltyTest.ts @@ -484,16 +484,26 @@ export class NFTCollectionWithRoyaltyTestInstance extends ContractInstance { }, }; + async multicall< + Calls extends NFTCollectionWithRoyaltyTestTypes.MultiCallParams + >( + calls: Calls + ): Promise>; async multicall< Callss extends NFTCollectionWithRoyaltyTestTypes.MultiCallParams[] >( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | NFTCollectionWithRoyaltyTestTypes.MultiCallParams + | NFTCollectionWithRoyaltyTestTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( NFTCollectionWithRoyaltyTest, this, callss, getContractByCodeHash - )) as NFTCollectionWithRoyaltyTestTypes.MulticallReturnType; + ); } } diff --git a/artifacts/ts/NFTTest.ts b/artifacts/ts/NFTTest.ts index 0f2ceae00..60b268bf0 100644 --- a/artifacts/ts/NFTTest.ts +++ b/artifacts/ts/NFTTest.ts @@ -199,14 +199,15 @@ export class NFTTestInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( - NFTTest, - this, - callss, - getContractByCodeHash - )) as NFTTestTypes.MulticallReturnType; + callss: Callss + ): Promise>; + async multicall< + Callss extends NFTTestTypes.MultiCallParams | NFTTestTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods(NFTTest, this, callss, getContractByCodeHash); } } diff --git a/artifacts/ts/NFTTestStd.ts b/artifacts/ts/NFTTestStd.ts index 5d17f9555..6cecbe24f 100644 --- a/artifacts/ts/NFTTestStd.ts +++ b/artifacts/ts/NFTTestStd.ts @@ -236,14 +236,22 @@ export class NFTTestStdInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | NFTTestStdTypes.MultiCallParams + | NFTTestStdTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( NFTTestStd, this, callss, getContractByCodeHash - )) as NFTTestStdTypes.MulticallReturnType; + ); } } diff --git a/artifacts/ts/Sub.ts b/artifacts/ts/Sub.ts index fc9a4c9eb..d6b781f00 100644 --- a/artifacts/ts/Sub.ts +++ b/artifacts/ts/Sub.ts @@ -171,14 +171,15 @@ export class SubInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( - Sub, - this, - callss, - getContractByCodeHash - )) as SubTypes.MulticallReturnType; + callss: Callss + ): Promise>; + async multicall< + Callss extends SubTypes.MultiCallParams | SubTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods(Sub, this, callss, getContractByCodeHash); } } diff --git a/artifacts/ts/TokenTest.ts b/artifacts/ts/TokenTest.ts index a4240bd10..e8b73e4f9 100644 --- a/artifacts/ts/TokenTest.ts +++ b/artifacts/ts/TokenTest.ts @@ -262,14 +262,22 @@ export class TokenTestInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | TokenTestTypes.MultiCallParams + | TokenTestTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( TokenTest, this, callss, getContractByCodeHash - )) as TokenTestTypes.MulticallReturnType; + ); } } diff --git a/artifacts/ts/TokenTestStd.ts b/artifacts/ts/TokenTestStd.ts index 74cb3e457..00c7d342d 100644 --- a/artifacts/ts/TokenTestStd.ts +++ b/artifacts/ts/TokenTestStd.ts @@ -294,14 +294,22 @@ export class TokenTestStdInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | TokenTestStdTypes.MultiCallParams + | TokenTestStdTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( TokenTestStd, this, callss, getContractByCodeHash - )) as TokenTestStdTypes.MulticallReturnType; + ); } } diff --git a/artifacts/ts/Transact.ts b/artifacts/ts/Transact.ts index b0ebadaca..c60d22257 100644 --- a/artifacts/ts/Transact.ts +++ b/artifacts/ts/Transact.ts @@ -322,14 +322,22 @@ export class TransactInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | TransactTypes.MultiCallParams + | TransactTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( Transact, this, callss, getContractByCodeHash - )) as TransactTypes.MulticallReturnType; + ); } } diff --git a/artifacts/ts/UserAccount.ts b/artifacts/ts/UserAccount.ts index e5853b1dc..94c4e1c34 100644 --- a/artifacts/ts/UserAccount.ts +++ b/artifacts/ts/UserAccount.ts @@ -232,14 +232,22 @@ export class UserAccountInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | UserAccountTypes.MultiCallParams + | UserAccountTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( UserAccount, this, callss, getContractByCodeHash - )) as UserAccountTypes.MulticallReturnType; + ); } } diff --git a/artifacts/ts/WrongNFTTest.ts b/artifacts/ts/WrongNFTTest.ts index 81626448f..66bc40462 100644 --- a/artifacts/ts/WrongNFTTest.ts +++ b/artifacts/ts/WrongNFTTest.ts @@ -209,14 +209,22 @@ export class WrongNFTTestInstance extends ContractInstance { }, }; + async multicall( + calls: Calls + ): Promise>; async multicall( - ...callss: Callss - ): Promise> { - return (await multicallMethods( + callss: Callss + ): Promise>; + async multicall< + Callss extends + | WrongNFTTestTypes.MultiCallParams + | WrongNFTTestTypes.MultiCallParams[] + >(callss: Callss): Promise { + return await multicallMethods( WrongNFTTest, this, callss, getContractByCodeHash - )) as WrongNFTTestTypes.MulticallReturnType; + ); } } diff --git a/packages/cli/src/codegen.ts b/packages/cli/src/codegen.ts index 59d0000dd..3cd12ec11 100644 --- a/packages/cli/src/codegen.ts +++ b/packages/cli/src/codegen.ts @@ -463,10 +463,16 @@ function genMulticall(contract: Contract): string { const supportMulticall = contract.functions.filter((functionSig) => functionSig.returnTypes.length > 0).length > 0 return supportMulticall ? ` + async multicall( + calls: Calls + ): Promise<${types}.MultiCallResults> async multicall( - ...callss: Callss - ): Promise<${types}.MulticallReturnType> { - return (await multicallMethods(${contract.name}, this, callss, getContractByCodeHash)) as ${types}.MulticallReturnType + callss: Callss + ): Promise<${types}.MulticallReturnType> + async multicall( + callss: Callss + ): Promise { + return (await multicallMethods(${contract.name}, this, callss, getContractByCodeHash)) } ` : '' diff --git a/packages/web3/src/contract/contract.ts b/packages/web3/src/contract/contract.ts index 43ba8e5fc..f429a2cd0 100644 --- a/packages/web3/src/contract/contract.ts +++ b/packages/web3/src/contract/contract.ts @@ -2046,12 +2046,14 @@ function toFieldsSig(contractName: string, functionSig: FunctionSig): FieldsSig } } +type Calls = Record, 'args'>> export async function multicallMethods( contract: ContractFactory, instance: ContractInstance, - callss: Record, 'args'>>[], + _callss: Calls | Calls[], getContractByCodeHash: (codeHash: string) => Contract ): Promise>[] | Record>> { + const callss = Array.isArray(_callss) ? _callss : [_callss] const callEntries = callss.map((calls) => Object.entries(calls)) const callsParams = callEntries.map((entries) => { return entries.map((entry) => { @@ -2068,7 +2070,7 @@ export async function multicallMethods { + const results = callsParams.map((calls, index0) => { const callsResult: Record> = {} const entries = callEntries[`${index0}`] calls.forEach((call, index1) => { @@ -2085,6 +2087,7 @@ export async function multicallMethods {