Skip to content

Commit 5456ad3

Browse files
authored
Duplicate function names =/= param count support (#195)
1 parent 86c4d43 commit 5456ad3

File tree

3 files changed

+25
-8
lines changed

3 files changed

+25
-8
lines changed

Assets/Thirdweb/Core/Scripts/Contract.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public async Task<Transaction> Prepare(string functionName, string from = null,
129129

130130
var web3 = Utils.GetWeb3(_sdk.Session.ChainId, _sdk.Session.Options.clientId, _sdk.Session.Options.bundleId);
131131
var contract = web3.Eth.GetContract(this.ABI, this.Address);
132-
var function = contract.GetFunction(functionName);
132+
var function = Utils.GetFunctionMatchSignature(contract, functionName, args);
133133
var fromAddress = from ?? await _sdk.Wallet.GetAddress();
134134
initialInput = function.CreateTransactionInput(fromAddress, args);
135135
}
@@ -147,7 +147,7 @@ public string Encode(string functionName, params object[] args)
147147
{
148148
var web3 = Utils.GetWeb3(_sdk.Session.ChainId, _sdk.Session.Options.clientId, _sdk.Session.Options.bundleId);
149149
var contract = web3.Eth.GetContract(this.ABI, this.Address);
150-
var function = contract.GetFunction(functionName);
150+
var function = Utils.GetFunctionMatchSignature(contract, functionName, args);
151151
return function.GetData(args);
152152
}
153153

@@ -161,7 +161,7 @@ public List<ParameterOutput> Decode(string functionName, string encodedArgs)
161161
{
162162
var web3 = Utils.GetWeb3(_sdk.Session.ChainId, _sdk.Session.Options.clientId, _sdk.Session.Options.bundleId);
163163
var contract = web3.Eth.GetContract(this.ABI, this.Address);
164-
var function = contract.GetFunction(functionName);
164+
var function = Utils.GetFunctionMatchSignature(contract, functionName);
165165
return function.DecodeInput(encodedArgs);
166166
}
167167

@@ -212,8 +212,8 @@ public async Task<TransactionResult> Write(string functionName, TransactionReque
212212
if (this.ABI == null)
213213
this.ABI = await FetchAbi(this.Address, await _sdk.Wallet.GetChainId());
214214

215-
var service = new Nethereum.Contracts.Contract(null, this.ABI, this.Address);
216-
var function = service.GetFunction(functionName);
215+
var contract = new Nethereum.Contracts.Contract(null, this.ABI, this.Address);
216+
var function = Utils.GetFunctionMatchSignature(contract, functionName, args);
217217
var data = function.GetData(args);
218218
var input = new TransactionInput
219219
{
@@ -249,7 +249,7 @@ public async Task<T> Read<T>(string functionName, params object[] args)
249249

250250
var web3 = Utils.GetWeb3(_sdk.Session.ChainId, _sdk.Session.Options.clientId, _sdk.Session.Options.bundleId);
251251
var contract = web3.Eth.GetContract(this.ABI, this.Address);
252-
var function = contract.GetFunction(functionName);
252+
var function = Utils.GetFunctionMatchSignature(contract, functionName, args);
253253
var result = await function.CallDecodingToDefaultAsync(args);
254254

255255
var rawResults = new List<object>();
@@ -386,7 +386,7 @@ public async Task<T> ReadRaw<T>(string functionName, params object[] args)
386386

387387
var web3 = Utils.GetWeb3(_sdk.Session.ChainId, _sdk.Session.Options.clientId, _sdk.Session.Options.bundleId);
388388
var contract = web3.Eth.GetContract(this.ABI, this.Address);
389-
var function = contract.GetFunction(functionName);
389+
var function = Utils.GetFunctionMatchSignature(contract, functionName, args);
390390
return await function.CallDeserializingToObjectAsync<T>(args);
391391
}
392392

Assets/Thirdweb/Core/Scripts/Transaction.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ public Transaction SetArgs(params object[] args)
213213
else
214214
{
215215
var web3 = Utils.GetWeb3(_sdk.Session.ChainId, _sdk.Session.Options.clientId, _sdk.Session.Options.bundleId);
216-
var function = web3.Eth.GetContract(Contract.ABI, Contract.Address).GetFunction(Input.To);
216+
var contract = web3.Eth.GetContract(Contract.ABI, Contract.Address);
217+
var function = Utils.GetFunctionMatchSignature(contract, FunctionName, args);
217218
Input.Data = function.GetData(args);
218219
}
219220
return this;

Assets/Thirdweb/Core/Scripts/Utils.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,5 +764,21 @@ public static Dictionary<string, string> GetThirdwebHeaders(string clientId, str
764764

765765
return headers;
766766
}
767+
768+
public static Nethereum.Contracts.Function GetFunctionMatchSignature(Nethereum.Contracts.Contract contract, string functionName, params object[] args)
769+
{
770+
var abi = contract.ContractBuilder.ContractABI;
771+
var functions = abi.Functions;
772+
int paramsCount = args?.Length ?? 0;
773+
foreach (var function in functions)
774+
{
775+
if (function.Name == functionName && function.InputParameters.Length == paramsCount)
776+
{
777+
string sha = function.Sha3Signature;
778+
return contract.GetFunctionBySignature(sha);
779+
}
780+
}
781+
throw new UnityException($"Can't find function {functionName} in contract {contract.Address}, that takes: {paramsCount} arguments");
782+
}
767783
}
768784
}

0 commit comments

Comments
 (0)