Skip to content

Commit 234d9de

Browse files
devhawkHarry
andauthored
add ConvertObject and ConvertStackItem static methods to ContractParameterParser (#56)
Co-authored-by: Harry <[email protected]>
1 parent 6601761 commit 234d9de

File tree

1 file changed

+131
-0
lines changed

1 file changed

+131
-0
lines changed

src/bctklib/ContractParameterParser.cs

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,137 @@ public IEnumerable<ContractParameter> ParseParameters(JToken json)
102102
_ => new[] { ParseParameter(json) }
103103
};
104104

105+
public static ContractParameter ConvertStackItem(Neo.VM.Types.StackItem item)
106+
{
107+
return item switch {
108+
// Neo.VM.Types.Struct value handled by Array branch
109+
Neo.VM.Types.Array value => new ContractParameter()
110+
{
111+
Type = ContractParameterType.Array,
112+
Value = value.Select(ConvertStackItem).ToList()
113+
},
114+
Neo.VM.Types.Boolean value => new ContractParameter()
115+
{
116+
Type = ContractParameterType.Boolean,
117+
Value = value.GetBoolean()
118+
},
119+
Neo.VM.Types.Buffer value => new ContractParameter()
120+
{
121+
Type = ContractParameterType.ByteArray,
122+
Value = value.InnerBuffer
123+
},
124+
Neo.VM.Types.ByteString value => new ContractParameter()
125+
{
126+
Type = ContractParameterType.ByteArray,
127+
Value = value.GetSpan().ToArray()
128+
},
129+
Neo.VM.Types.Integer value => new ContractParameter()
130+
{
131+
Type = ContractParameterType.Integer,
132+
Value = value.GetInteger()
133+
},
134+
Neo.VM.Types.Map value => new ContractParameter()
135+
{
136+
Type = ContractParameterType.Map,
137+
Value = value.Select(kvp => KeyValuePair.Create(ConvertStackItem(kvp.Key), ConvertStackItem(kvp.Value))).ToList()
138+
},
139+
Neo.VM.Types.Null value => new ContractParameter
140+
{
141+
Type = ContractParameterType.Any,
142+
Value = null
143+
},
144+
Neo.VM.Types.InteropInterface _ => throw new NotSupportedException("InteropInterface instances cannot be converted into a ContractParameter"),
145+
Neo.VM.Types.Pointer _ => throw new NotSupportedException("Pointer instances cannot be converted into a ContractParameter"),
146+
_ => throw new ArgumentException($"Unknown Stack Item Type {item.GetType().Name}", nameof(item)),
147+
};
148+
}
149+
150+
// logic for ConvertObject borrowed from Neo.VM.Helper.EmitPush(ScriptBuilder, object)
151+
// but extended to support converting more types to ContractParameter (StackItem types in particular)
152+
public static ContractParameter ConvertObject(object? obj)
153+
{
154+
return obj switch {
155+
ContractParameter value => value,
156+
Neo.VM.Types.StackItem value => ConvertStackItem(value),
157+
bool value => new ContractParameter()
158+
{
159+
Type = ContractParameterType.Boolean,
160+
Value = value
161+
},
162+
byte[] value => new ContractParameter()
163+
{
164+
Type = ContractParameterType.ByteArray,
165+
Value = value,
166+
},
167+
string value => new ContractParameter
168+
{
169+
Type = ContractParameterType.String,
170+
Value = value,
171+
},
172+
BigInteger value => new ContractParameter
173+
{
174+
Type = ContractParameterType.Integer,
175+
Value = value,
176+
},
177+
sbyte value => new ContractParameter
178+
{
179+
Type = ContractParameterType.Integer,
180+
Value = new BigInteger(value),
181+
},
182+
byte value => new ContractParameter
183+
{
184+
Type = ContractParameterType.Integer,
185+
Value = new BigInteger(value),
186+
},
187+
short value => new ContractParameter
188+
{
189+
Type = ContractParameterType.Integer,
190+
Value = new BigInteger(value),
191+
},
192+
ushort value => new ContractParameter
193+
{
194+
Type = ContractParameterType.Integer,
195+
Value = new BigInteger(value),
196+
},
197+
int value => new ContractParameter
198+
{
199+
Type = ContractParameterType.Integer,
200+
Value = new BigInteger(value),
201+
},
202+
uint value => new ContractParameter
203+
{
204+
Type = ContractParameterType.Integer,
205+
Value = new BigInteger(value),
206+
},
207+
long value => new ContractParameter
208+
{
209+
Type = ContractParameterType.Integer,
210+
Value = new BigInteger(value),
211+
},
212+
ulong value => new ContractParameter
213+
{
214+
Type = ContractParameterType.Integer,
215+
Value = new BigInteger(value),
216+
},
217+
Enum value => new ContractParameter
218+
{
219+
Type = ContractParameterType.Integer,
220+
Value = BigInteger.Parse(value.ToString("d")),
221+
},
222+
ISerializable value => new ContractParameter
223+
{
224+
Type = ContractParameterType.ByteArray,
225+
Value = value.ToArray(),
226+
},
227+
null => new ContractParameter
228+
{
229+
Type = ContractParameterType.Any,
230+
Value = null
231+
},
232+
_ => throw new ArgumentException($"Unconvertible parameter type {obj.GetType().Name}", nameof(obj)),
233+
};
234+
}
235+
105236
public ContractParameter ParseParameter(JToken? json)
106237
{
107238
if (json == null)

0 commit comments

Comments
 (0)