@@ -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