From 3389baeb6e6e5668f40f1938235115a0d84deffb Mon Sep 17 00:00:00 2001 From: 0xFirekeeper <0xFirekeeper@gmail.com> Date: Thu, 6 Jun 2024 00:41:14 +0300 Subject: [PATCH] Duplicate function names =/= param count support --- Assets/Thirdweb/Core/Scripts/Contract.cs | 14 +++++++------- Assets/Thirdweb/Core/Scripts/Transaction.cs | 3 ++- Assets/Thirdweb/Core/Scripts/Utils.cs | 16 ++++++++++++++++ 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Assets/Thirdweb/Core/Scripts/Contract.cs b/Assets/Thirdweb/Core/Scripts/Contract.cs index 51920c5b..1ceeb293 100644 --- a/Assets/Thirdweb/Core/Scripts/Contract.cs +++ b/Assets/Thirdweb/Core/Scripts/Contract.cs @@ -129,7 +129,7 @@ public async Task Prepare(string functionName, string from = null, var web3 = Utils.GetWeb3(_sdk.Session.ChainId, _sdk.Session.Options.clientId, _sdk.Session.Options.bundleId); var contract = web3.Eth.GetContract(this.ABI, this.Address); - var function = contract.GetFunction(functionName); + var function = Utils.GetFunctionMatchSignature(contract, functionName, args); var fromAddress = from ?? await _sdk.Wallet.GetAddress(); initialInput = function.CreateTransactionInput(fromAddress, args); } @@ -147,7 +147,7 @@ public string Encode(string functionName, params object[] args) { var web3 = Utils.GetWeb3(_sdk.Session.ChainId, _sdk.Session.Options.clientId, _sdk.Session.Options.bundleId); var contract = web3.Eth.GetContract(this.ABI, this.Address); - var function = contract.GetFunction(functionName); + var function = Utils.GetFunctionMatchSignature(contract, functionName, args); return function.GetData(args); } @@ -161,7 +161,7 @@ public List Decode(string functionName, string encodedArgs) { var web3 = Utils.GetWeb3(_sdk.Session.ChainId, _sdk.Session.Options.clientId, _sdk.Session.Options.bundleId); var contract = web3.Eth.GetContract(this.ABI, this.Address); - var function = contract.GetFunction(functionName); + var function = Utils.GetFunctionMatchSignature(contract, functionName); return function.DecodeInput(encodedArgs); } @@ -212,8 +212,8 @@ public async Task Write(string functionName, TransactionReque if (this.ABI == null) this.ABI = await FetchAbi(this.Address, await _sdk.Wallet.GetChainId()); - var service = new Nethereum.Contracts.Contract(null, this.ABI, this.Address); - var function = service.GetFunction(functionName); + var contract = new Nethereum.Contracts.Contract(null, this.ABI, this.Address); + var function = Utils.GetFunctionMatchSignature(contract, functionName, args); var data = function.GetData(args); var input = new TransactionInput { @@ -249,7 +249,7 @@ public async Task Read(string functionName, params object[] args) var web3 = Utils.GetWeb3(_sdk.Session.ChainId, _sdk.Session.Options.clientId, _sdk.Session.Options.bundleId); var contract = web3.Eth.GetContract(this.ABI, this.Address); - var function = contract.GetFunction(functionName); + var function = Utils.GetFunctionMatchSignature(contract, functionName, args); var result = await function.CallDecodingToDefaultAsync(args); var rawResults = new List(); @@ -386,7 +386,7 @@ public async Task ReadRaw(string functionName, params object[] args) var web3 = Utils.GetWeb3(_sdk.Session.ChainId, _sdk.Session.Options.clientId, _sdk.Session.Options.bundleId); var contract = web3.Eth.GetContract(this.ABI, this.Address); - var function = contract.GetFunction(functionName); + var function = Utils.GetFunctionMatchSignature(contract, functionName, args); return await function.CallDeserializingToObjectAsync(args); } diff --git a/Assets/Thirdweb/Core/Scripts/Transaction.cs b/Assets/Thirdweb/Core/Scripts/Transaction.cs index c9322774..7526d68a 100644 --- a/Assets/Thirdweb/Core/Scripts/Transaction.cs +++ b/Assets/Thirdweb/Core/Scripts/Transaction.cs @@ -213,7 +213,8 @@ public Transaction SetArgs(params object[] args) else { var web3 = Utils.GetWeb3(_sdk.Session.ChainId, _sdk.Session.Options.clientId, _sdk.Session.Options.bundleId); - var function = web3.Eth.GetContract(Contract.ABI, Contract.Address).GetFunction(Input.To); + var contract = web3.Eth.GetContract(Contract.ABI, Contract.Address); + var function = Utils.GetFunctionMatchSignature(contract, FunctionName, args); Input.Data = function.GetData(args); } return this; diff --git a/Assets/Thirdweb/Core/Scripts/Utils.cs b/Assets/Thirdweb/Core/Scripts/Utils.cs index 7f45a537..17ed0b84 100644 --- a/Assets/Thirdweb/Core/Scripts/Utils.cs +++ b/Assets/Thirdweb/Core/Scripts/Utils.cs @@ -764,5 +764,21 @@ public static Dictionary GetThirdwebHeaders(string clientId, str return headers; } + + public static Nethereum.Contracts.Function GetFunctionMatchSignature(Nethereum.Contracts.Contract contract, string functionName, params object[] args) + { + var abi = contract.ContractBuilder.ContractABI; + var functions = abi.Functions; + int paramsCount = args?.Length ?? 0; + foreach (var function in functions) + { + if (function.Name == functionName && function.InputParameters.Length == paramsCount) + { + string sha = function.Sha3Signature; + return contract.GetFunctionBySignature(sha); + } + } + throw new UnityException($"Can't find function {functionName} in contract {contract.Address}, that takes: {paramsCount} arguments"); + } } }