Skip to content

Commit

Permalink
IAbiInfoStorage and Further extensions
Browse files Browse the repository at this point in the history
  • Loading branch information
juanfranblanco committed Aug 12, 2023
1 parent 04e9494 commit 8464988
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 18 deletions.
4 changes: 2 additions & 2 deletions buildConf/Version.props
@@ -1,8 +1,8 @@
<Project>
<PropertyGroup>
<VersionMajor>4</VersionMajor>
<VersionMinor>15</VersionMinor>
<VersionPatch>2</VersionPatch>
<VersionMinor>16</VersionMinor>
<VersionPatch>0</VersionPatch>
<NonDevAssemblyVersion>$(VersionMajor).$(VersionMinor).0</NonDevAssemblyVersion>
<AssemblyVersion>$(NonDevAssemblyVersion)</AssemblyVersion>
<RelSuffix>$(ReleaseSuffix)</RelSuffix>
Expand Down
35 changes: 22 additions & 13 deletions src/Nethereum.ABI/ABIRepository/ABIInfoInMemoryStorage.cs
@@ -1,31 +1,40 @@
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<ABIInfo> _abiInfos = new List<ABIInfo>();
private IDictionary<string, List<FunctionABI>> _signatureToFunctionABIDictionary { get; set; } = new Dictionary<string, List<FunctionABI>>();
private IDictionary<string, List<ErrorABI>> _signatureToErrorABIDictionary { get; set; } = new Dictionary<string, List<ErrorABI>>();
private IDictionary<string, List<EventABI>> _signatureToEventABIDictionary { get; set; } = new Dictionary<string, List<EventABI>>();
private IDictionary<string, List<FunctionABI>> _signatureToFunctionABIDictionary { get; set; } = new Dictionary<string, List<FunctionABI>>();
private IDictionary<string, List<ErrorABI>> _signatureToErrorABIDictionary { get; set; } = new Dictionary<string, List<ErrorABI>>();
private IDictionary<string, List<EventABI>> _signatureToEventABIDictionary { get; set; } = new Dictionary<string, List<EventABI>>();


public ABIInfo GetABIInfo(BigInteger chainId, string contractAddress)
{
contractAddress = contractAddress.ToLowerInvariant();
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);
Expand All @@ -42,7 +51,7 @@ public EventABI FindEventABI(BigInteger chainId, string contractAddress, string

public List<FunctionABI> FindFunctionABI(string signature)
{
return _signatureToFunctionABIDictionary[signature];
return _signatureToFunctionABIDictionary[signature];
}

public List<ErrorABI> FindErrorABI(string signature)
Expand All @@ -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>{functionABI});
this._signatureToFunctionABIDictionary.Add(functionABI.Sha3Signature, new List<FunctionABI> { functionABI });
}

}

foreach (var errorABI in abiInfo.ContractABI.Errors)
Expand Down
19 changes: 19 additions & 0 deletions 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<ErrorABI> FindErrorABI(string signature);
EventABI FindEventABI(BigInteger chainId, string contractAddress, string signature);
List<EventABI> FindEventABI(string signature);
FunctionABI FindFunctionABI(BigInteger chainId, string contractAddress, string signature);
List<FunctionABI> FindFunctionABI(string signature);
FunctionABI FindFunctionABIFromInputData(BigInteger chainId, string contractAddress, string inputData);
ABIInfo GetABIInfo(BigInteger chainId, string contractAddress);
}
}
24 changes: 21 additions & 3 deletions src/Nethereum.ABI/Model/ModelExtensions.cs
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit 8464988

Please sign in to comment.