static byte[] CreateSignatureRedeemScript(DevWalletAccount account) { var key = account.GetKey(); if (key == null) { throw new Exception("DevWalletAccount missing key"); } using var sb = new Neo.VM.ScriptBuilder(); sb.EmitPush(key.PublicKey.EncodePoint(true)); sb.Emit(Neo.VM.OpCode.CHECKSIG); return(sb.ToArray()); }
public static ScriptBuilder EmitPush(this ScriptBuilder sb, ContractParameter parameter) { switch (parameter.Type) { case ContractParameterType.Signature: case ContractParameterType.ByteArray: sb.EmitPush((byte[])parameter.Value); break; case ContractParameterType.Boolean: sb.EmitPush((bool)parameter.Value); break; case ContractParameterType.Integer: if (parameter.Value is BigInteger bi) sb.EmitPush(bi); else sb.EmitPush((BigInteger)typeof(BigInteger).GetConstructor(new[] { parameter.Value.GetType() }).Invoke(new[] { parameter.Value })); break; case ContractParameterType.Hash160: sb.EmitPush((UInt160)parameter.Value); break; case ContractParameterType.Hash256: sb.EmitPush((UInt256)parameter.Value); break; case ContractParameterType.PublicKey: sb.EmitPush((ECPoint)parameter.Value); break; case ContractParameterType.String: sb.EmitPush((string)parameter.Value); break; case ContractParameterType.Array: { IList<ContractParameter> parameters = (IList<ContractParameter>)parameter.Value; for (int i = parameters.Count - 1; i >= 0; i--) sb.EmitPush(parameters[i]); sb.EmitPush(parameters.Count); sb.Emit(OpCode.PACK); } break; default: throw new ArgumentException(); } return sb; }
/// <summary> /// Emits the opcodes for pushing the specified data onto the stack. /// </summary> /// <param name="builder">The <see cref="ScriptBuilder"/> to be used.</param> /// <param name="obj">The data to be pushed.</param> /// <returns>The same instance as <paramref name="builder"/>.</returns> public static ScriptBuilder EmitPush(this ScriptBuilder builder, object obj) { switch (obj) { case bool data: builder.EmitPush(data); break; case byte[] data: builder.EmitPush(data); break; case string data: builder.EmitPush(data); break; case BigInteger data: builder.EmitPush(data); break; case ISerializable data: builder.EmitPush(data); break; case sbyte data: builder.EmitPush(data); break; case byte data: builder.EmitPush(data); break; case short data: builder.EmitPush(data); break; case ushort data: builder.EmitPush(data); break; case int data: builder.EmitPush(data); break; case uint data: builder.EmitPush(data); break; case long data: builder.EmitPush(data); break; case ulong data: builder.EmitPush(data); break; case Enum data: builder.EmitPush(BigInteger.Parse(data.ToString("d"))); break; case ContractParameter data: builder.EmitPush(data); break; case null: builder.Emit(OpCode.PUSHNULL); break; default: throw new ArgumentException(null, nameof(obj)); } return(builder); }
/// <summary> /// Emits the opcodes for pushing the specified data onto the stack. /// </summary> /// <param name="builder">The <see cref="ScriptBuilder"/> to be used.</param> /// <param name="parameter">The data to be pushed.</param> /// <returns>The same instance as <paramref name="builder"/>.</returns> public static ScriptBuilder EmitPush(this ScriptBuilder builder, ContractParameter parameter) { if (parameter.Value is null) { builder.Emit(OpCode.PUSHNULL); } else { switch (parameter.Type) { case ContractParameterType.Signature: case ContractParameterType.ByteArray: builder.EmitPush((byte[])parameter.Value); break; case ContractParameterType.Boolean: builder.EmitPush((bool)parameter.Value); break; case ContractParameterType.Integer: if (parameter.Value is BigInteger bi) { builder.EmitPush(bi); } else { builder.EmitPush((BigInteger)typeof(BigInteger).GetConstructor(new[] { parameter.Value.GetType() }).Invoke(new[] { parameter.Value })); } break; case ContractParameterType.Hash160: builder.EmitPush((UInt160)parameter.Value); break; case ContractParameterType.Hash256: builder.EmitPush((UInt256)parameter.Value); break; case ContractParameterType.PublicKey: builder.EmitPush((ECPoint)parameter.Value); break; case ContractParameterType.String: builder.EmitPush((string)parameter.Value); break; case ContractParameterType.Array: { IList <ContractParameter> parameters = (IList <ContractParameter>)parameter.Value; for (int i = parameters.Count - 1; i >= 0; i--) { builder.EmitPush(parameters[i]); } builder.EmitPush(parameters.Count); builder.Emit(OpCode.PACK); } break; case ContractParameterType.Map: { var pairs = (IList <KeyValuePair <ContractParameter, ContractParameter> >)parameter.Value; builder.CreateMap(pairs); } break; default: throw new ArgumentException(null, nameof(parameter)); } } return(builder); }
public static ScriptBuilder Emit(this ScriptBuilder sb, params OpCode[] ops) { foreach (OpCode op in ops) sb.Emit(op); return sb; }