-
Notifications
You must be signed in to change notification settings - Fork 708
/
ModelExtensions.cs
136 lines (117 loc) · 5.22 KB
/
ModelExtensions.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
124
125
126
127
128
129
130
131
132
133
134
135
136
using Nethereum.ABI.FunctionEncoding;
using Nethereum.Hex.HexConvertors.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Nethereum.ABI.Model
{
public static class ModelExtensions
{
public static FunctionABI FindFunctionABI(this ContractABI contractABI, string signature)
{
foreach (var functionABI in contractABI.Functions)
{
if (functionABI.IsSignatureForFunction(signature))
{
return functionABI;
}
}
return null;
}
public static bool HasTheSameSignatureValues(this FunctionABI first, FunctionABI other)
{
if (first.Sha3Signature.ToLowerInvariant() != other.Sha3Signature.ToLowerInvariant()) return false;
if(first.Name != other.Name) return false;
if(!first.InputParameters.AreTheSameSignatureValues(other.InputParameters)) return false;
if (!first.OutputParameters.AreTheSameSignatureValues(other.OutputParameters)) return false;
return true;
}
public static bool HasTheSameSignatureValues(this EventABI first, EventABI other)
{
if (first.Sha3Signature.ToLowerInvariant() != other.Sha3Signature.ToLowerInvariant()) return false;
if (first.Name != other.Name) return false;
if (!first.InputParameters.AreTheSameSignatureValues(other.InputParameters)) return false;
return true;
}
public static bool HasTheSameSignatureValues(this ErrorABI first, ErrorABI other)
{
if (first.Sha3Signature.ToLowerInvariant() != other.Sha3Signature.ToLowerInvariant()) return false;
if (first.Name != other.Name) return false;
if (!first.InputParameters.AreTheSameSignatureValues(other.InputParameters)) return false;
return true;
}
public static bool AreTheSameSignatureValues(this IEnumerable<Parameter> first, IEnumerable<Parameter> other)
{
if (first.Count() != other.Count()) return false;
foreach (var parameter in first)
{
var otherParameter = other.FirstOrDefault(x => x.Name == parameter.Name);
if(otherParameter == null) return false;
if(!parameter.HasTheSameSignatureValues(otherParameter)) return false;
}
return true;
}
public static bool HasTheSameSignatureValues(this Parameter parameter, Parameter other)
{
if (parameter.Order != other.Order) return false;
if (parameter.ABIType != other.ABIType) return false;
if (parameter.Indexed != other.Indexed) return false;
return true;
}
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);
return contractABI.FindFunctionABI(signature);
}
public static EventABI FindEventABI(this ContractABI contractABI, string signature)
{
foreach (var eventABI in contractABI.Events)
{
if (eventABI.IsSignatureForEvent(signature))
{
return eventABI;
}
}
return null;
}
public static ErrorABI FindErrorABI(this ContractABI contractABI, string signature)
{
foreach (var errorAbi in contractABI.Errors)
{
if (errorAbi.IsSignatureForError(signature))
{
return errorAbi;
}
}
return null;
}
public static bool IsSignatureForFunction(this FunctionABI functionABI, string sha3Signature)
{
sha3Signature = sha3Signature.EnsureHexPrefix();
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 IsSignatureForEvent(this EventABI eventABI, string sha3Signature)
{
sha3Signature = sha3Signature.EnsureHexPrefix();
var eventSignature = eventABI.Sha3Signature.EnsureHexPrefix();
if (sha3Signature == "0x") return false;
if (string.Equals(sha3Signature.ToLower(), eventSignature.ToLower(), StringComparison.Ordinal)) return true;
return false;
}
public static bool IsSignatureForError(this ErrorABI errorABI, string sha3Signature)
{
sha3Signature = sha3Signature.EnsureHexPrefix();
var errorSignature = errorABI.Sha3Signature.EnsureHexPrefix();
if (sha3Signature == "0x") return false;
if (string.Equals(sha3Signature.ToLower(), errorSignature.ToLower(), StringComparison.Ordinal)) return true;
return false;
}
}
}