-
Notifications
You must be signed in to change notification settings - Fork 708
/
ABIInfoInMemoryStorage.cs
123 lines (107 loc) · 4.77 KB
/
ABIInfoInMemoryStorage.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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 : 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>>();
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)
{
var abiInfo = GetABIInfo(chainId, contractAddress);
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);
if (abiInfo == null) return null;
return abiInfo.ContractABI.FindErrorABI(signature);
}
public EventABI FindEventABI(BigInteger chainId, string contractAddress, string signature)
{
var abiInfo = GetABIInfo(chainId, contractAddress);
if (abiInfo == null) return null;
return abiInfo.ContractABI.FindEventABI(signature);
}
public List<FunctionABI> FindFunctionABI(string signature)
{
return _signatureToFunctionABIDictionary[signature];
}
public List<ErrorABI> FindErrorABI(string signature)
{
return _signatureToErrorABIDictionary[signature];
}
public List<EventABI> FindEventABI(string signature)
{
return _signatureToEventABIDictionary[signature];
}
public void AddABIInfo(ABIInfo abiInfo)
{
_abiInfos.Add(abiInfo);
abiInfo.InitialiseContractABI();
foreach (var functionABI in abiInfo.ContractABI.Functions)
{
if (_signatureToFunctionABIDictionary.ContainsKey(functionABI.Sha3Signature))
{
var functionABIs = _signatureToFunctionABIDictionary[functionABI.Sha3Signature];
if (!functionABIs.Any(x => x.HasTheSameSignatureValues(functionABI)))
{
functionABIs.Add(functionABI);
}
}
else
{
this._signatureToFunctionABIDictionary.Add(functionABI.Sha3Signature, new List<FunctionABI> { functionABI });
}
}
foreach (var errorABI in abiInfo.ContractABI.Errors)
{
if (_signatureToErrorABIDictionary.ContainsKey(errorABI.Sha3Signature))
{
var errorABIs = _signatureToErrorABIDictionary[errorABI.Sha3Signature];
if (!errorABIs.Any(x => x.HasTheSameSignatureValues(errorABI)))
{
errorABIs.Add(errorABI);
}
}
else
{
this._signatureToErrorABIDictionary.Add(errorABI.Sha3Signature, new List<ErrorABI> { errorABI });
}
}
foreach (var eventABI in abiInfo.ContractABI.Events)
{
if (_signatureToEventABIDictionary.ContainsKey(eventABI.Sha3Signature))
{
var eventABIs = _signatureToEventABIDictionary[eventABI.Sha3Signature];
if (!eventABIs.Any(x => x.HasTheSameSignatureValues(eventABI)))
{
eventABIs.Add(eventABI);
}
}
else
{
this._signatureToEventABIDictionary.Add(eventABI.Sha3Signature, new List<EventABI> { eventABI });
}
}
}
}
}