From 8464988f25b2603d7548a79c93223187b2d3b36e Mon Sep 17 00:00:00 2001 From: Juan Blanco Date: Sat, 12 Aug 2023 12:24:24 +0200 Subject: [PATCH] IAbiInfoStorage and Further extensions --- buildConf/Version.props | 4 +-- .../ABIRepository/ABIInfoInMemoryStorage.cs | 35 ++++++++++++------- .../ABIRepository/IABIInfoStorage.cs | 19 ++++++++++ src/Nethereum.ABI/Model/ModelExtensions.cs | 24 +++++++++++-- 4 files changed, 64 insertions(+), 18 deletions(-) create mode 100644 src/Nethereum.ABI/ABIRepository/IABIInfoStorage.cs diff --git a/buildConf/Version.props b/buildConf/Version.props index 890508802..e96321f1a 100644 --- a/buildConf/Version.props +++ b/buildConf/Version.props @@ -1,8 +1,8 @@ 4 - 15 - 2 + 16 + 0 $(VersionMajor).$(VersionMinor).0 $(NonDevAssemblyVersion) $(ReleaseSuffix) diff --git a/src/Nethereum.ABI/ABIRepository/ABIInfoInMemoryStorage.cs b/src/Nethereum.ABI/ABIRepository/ABIInfoInMemoryStorage.cs index 10d6be248..140f6ac51 100644 --- a/src/Nethereum.ABI/ABIRepository/ABIInfoInMemoryStorage.cs +++ b/src/Nethereum.ABI/ABIRepository/ABIInfoInMemoryStorage.cs @@ -1,17 +1,19 @@ using Nethereum.ABI.Model; using Nethereum.Hex.HexConvertors.Extensions; +using System; using System.Collections.Generic; using System.Linq; using System.Numerics; namespace Nethereum.ABI.ABIRepository { - public class ABIInfoInMemoryStorage - { + public class ABIInfoInMemoryStorage : IABIInfoStorage + { private List _abiInfos = new List(); - private IDictionary> _signatureToFunctionABIDictionary { get; set; } = new Dictionary>(); - private IDictionary> _signatureToErrorABIDictionary { get; set; } = new Dictionary>(); - private IDictionary> _signatureToEventABIDictionary { get; set; } = new Dictionary>(); + private IDictionary> _signatureToFunctionABIDictionary { get; set; } = new Dictionary>(); + private IDictionary> _signatureToErrorABIDictionary { get; set; } = new Dictionary>(); + private IDictionary> _signatureToEventABIDictionary { get; set; } = new Dictionary>(); + public ABIInfo GetABIInfo(BigInteger chainId, string contractAddress) { @@ -19,13 +21,20 @@ public ABIInfo GetABIInfo(BigInteger chainId, string contractAddress) return _abiInfos.FirstOrDefault(x => x.Address == contractAddress && chainId == x.ChainId); } - public FunctionABI FindFunctionABI(BigInteger chainId, string contractAddress, string signature) - { + public FunctionABI FindFunctionABI(BigInteger chainId, string contractAddress, string signature) + { var abiInfo = GetABIInfo(chainId, contractAddress); - if(abiInfo == null) return null; + if (abiInfo == null) return null; return abiInfo.ContractABI.FindFunctionABI(signature); } + public FunctionABI FindFunctionABIFromInputData(BigInteger chainId, string contractAddress, string inputData) + { + var abiInfo = GetABIInfo(chainId, contractAddress); + if (abiInfo == null) return null; + return abiInfo.ContractABI.FindFunctionABIFromInputData(inputData); + } + public ErrorABI FindErrorABI(BigInteger chainId, string contractAddress, string signature) { var abiInfo = GetABIInfo(chainId, contractAddress); @@ -42,7 +51,7 @@ public EventABI FindEventABI(BigInteger chainId, string contractAddress, string public List FindFunctionABI(string signature) { - return _signatureToFunctionABIDictionary[signature]; + return _signatureToFunctionABIDictionary[signature]; } public List FindErrorABI(string signature) @@ -60,21 +69,21 @@ public void AddABIInfo(ABIInfo abiInfo) _abiInfos.Add(abiInfo); abiInfo.InitialiseContractABI(); - foreach(var functionABI in abiInfo.ContractABI.Functions) + foreach (var functionABI in abiInfo.ContractABI.Functions) { if (_signatureToFunctionABIDictionary.ContainsKey(functionABI.Sha3Signature)) { var functionABIs = _signatureToFunctionABIDictionary[functionABI.Sha3Signature]; - if(!functionABIs.Any(x => x.HasTheSameSignatureValues(functionABI))) + if (!functionABIs.Any(x => x.HasTheSameSignatureValues(functionABI))) { functionABIs.Add(functionABI); } } else { - this._signatureToFunctionABIDictionary.Add(functionABI.Sha3Signature, new List{functionABI}); + this._signatureToFunctionABIDictionary.Add(functionABI.Sha3Signature, new List { functionABI }); } - + } foreach (var errorABI in abiInfo.ContractABI.Errors) diff --git a/src/Nethereum.ABI/ABIRepository/IABIInfoStorage.cs b/src/Nethereum.ABI/ABIRepository/IABIInfoStorage.cs new file mode 100644 index 000000000..07260c673 --- /dev/null +++ b/src/Nethereum.ABI/ABIRepository/IABIInfoStorage.cs @@ -0,0 +1,19 @@ +using Nethereum.ABI.Model; +using System.Collections.Generic; +using System.Numerics; + +namespace Nethereum.ABI.ABIRepository +{ + public interface IABIInfoStorage + { + void AddABIInfo(ABIInfo abiInfo); + ErrorABI FindErrorABI(BigInteger chainId, string contractAddress, string signature); + List FindErrorABI(string signature); + EventABI FindEventABI(BigInteger chainId, string contractAddress, string signature); + List FindEventABI(string signature); + FunctionABI FindFunctionABI(BigInteger chainId, string contractAddress, string signature); + List FindFunctionABI(string signature); + FunctionABI FindFunctionABIFromInputData(BigInteger chainId, string contractAddress, string inputData); + ABIInfo GetABIInfo(BigInteger chainId, string contractAddress); + } +} \ No newline at end of file diff --git a/src/Nethereum.ABI/Model/ModelExtensions.cs b/src/Nethereum.ABI/Model/ModelExtensions.cs index 57084c610..6bde1147f 100644 --- a/src/Nethereum.ABI/Model/ModelExtensions.cs +++ b/src/Nethereum.ABI/Model/ModelExtensions.cs @@ -9,6 +9,15 @@ namespace Nethereum.ABI.Model { public static class ModelExtensions { + public static string GetSignatureFromData(string data) + { + if (string.IsNullOrEmpty(data)) throw new Exception("Invalid data cannot be null"); + + data = data.EnsureHexPrefix(); + if (data.Length < 10) throw new Exception("Invalid data cannot be less than 4 bytes or 8 hex characters"); + return data.Substring(0, 10); + } + public static FunctionABI FindFunctionABI(this ContractABI contractABI, string signature) { foreach (var functionABI in contractABI.Functions) @@ -69,9 +78,7 @@ public static bool HasTheSameSignatureValues(this Parameter parameter, Parameter public static FunctionABI FindFunctionABIFromInputData(this ContractABI contractABI, string inputData) { if (string.IsNullOrEmpty(inputData)) return null; - inputData = inputData.EnsureHexPrefix(); - if(inputData.Length < 10) return null; - var signature = inputData.Substring(0, 10); + var signature = GetSignatureFromData(inputData); return contractABI.FindFunctionABI(signature); } @@ -100,6 +107,17 @@ public static ErrorABI FindErrorABI(this ContractABI contractABI, string signatu return null; } + public static bool IsDataForFunction(this FunctionABI functionABI, string data) + { + var sha3Signature = GetSignatureFromData(data); + var functionSignature = functionABI.Sha3Signature.EnsureHexPrefix(); + + if (sha3Signature == "0x") return false; + + if (string.Equals(sha3Signature.ToLower(), functionSignature.ToLower(), StringComparison.Ordinal)) return true; + return false; + } + public static bool IsSignatureForFunction(this FunctionABI functionABI, string sha3Signature) { sha3Signature = sha3Signature.EnsureHexPrefix();