private bool Contract_Create(ExecutionEngine engine) { if (Trigger != TriggerType.Application) { return(false); } byte[] script = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); if (script.Length > 1024 * 1024) { return(false); } ContractPropertyState contract_properties = (ContractPropertyState)(byte)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger(); UInt160 hash = script.ToScriptHash(); ContractState contract = Snapshot.Contracts.TryGet(hash); if (contract == null) { contract = new ContractState { Script = script, ContractProperties = contract_properties }; Snapshot.Contracts.Add(hash, contract); ContractsCreated.Add(hash, new UInt160(engine.CurrentContext.ScriptHash)); } engine.CurrentContext.EvaluationStack.Push(StackItem.FromInterface(contract)); return(true); }
/// <summary> /// MIgrate Fip /// </summary> /// <param name="script"></param> /// <param name="plist"></param>'0710' /// <param name="rtype"></param>'05' /// <param name="cps"></param>1 /// <param name="name"></param> /// <param name="version"></param> /// <param name="author"></param> /// <param name="email"></param> /// <param name="description"></param> /// <returns></returns> private static Boolean Migrate(byte[] script, byte[] plist, byte rtype, ContractPropertyState cps, string name, string version, string author, string email, string description) { if (!Runtime.CheckWitness(Master)) { MigrateError("401"); return(false); } var contract = Contract.Migrate(script, plist, rtype, cps, name, version, author, email, description); return(true); }
public InvocationTransaction GetTransaction() { byte[] script = textBox8.Text.HexToBytes(); byte[] parameter_list = textBox6.Text.HexToBytes(); ContractParameterType return_type = textBox7.Text.HexToBytes().Select(p => (ContractParameterType?)p).FirstOrDefault() ?? ContractParameterType.Void; ContractPropertyState properties = ContractPropertyState.NoProperty; if (checkBox1.Checked) { properties |= ContractPropertyState.HasStorage; } if (checkBox2.Checked) { properties |= ContractPropertyState.HasDynamicInvoke; } if (checkBox3.Checked) { properties |= ContractPropertyState.Payable; } string name = textBox1.Text; string version = textBox2.Text; string author = textBox3.Text; string email = textBox4.Text; string description = textBox5.Text; using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitSysCall("Neo.Contract.Create", script, parameter_list, return_type, properties, name, version, author, email, description); return(new InvocationTransaction { Script = sb.ToArray() }); } }
protected virtual long GetPriceForSysCall() { Instruction instruction = CurrentContext.CurrentInstruction; uint api_hash = instruction.Operand.Length == 4 ? instruction.TokenU32 : instruction.TokenString.ToInteropMethodHash(); long price = Service.GetPrice(api_hash); if (price > 0) { return(price); } if (api_hash == "Neo.Contract.Create".ToInteropMethodHash() || api_hash == "Neo.Contract.Migrate".ToInteropMethodHash()) { long fee = 100L; ContractPropertyState contract_properties = (ContractPropertyState)(byte)CurrentContext.EvaluationStack.Peek(3).GetBigInteger(); if (contract_properties.HasFlag(ContractPropertyState.HasStorage)) { fee += 400L; } return(fee * 100000000L / ratio); } if (api_hash == "System.Storage.Put".ToInteropMethodHash() || api_hash == "System.Storage.PutEx".ToInteropMethodHash()) { return(((CurrentContext.EvaluationStack.Peek(1).GetByteArray().Length + CurrentContext.EvaluationStack.Peek(2).GetByteArray().Length - 1) / 1024 + 1) * 1000); } return(1); }
protected virtual long GetPriceForSysCall() { if (CurrentContext.InstructionPointer >= CurrentContext.Script.Length - 3) { return(1); } byte length = CurrentContext.Script[CurrentContext.InstructionPointer + 1]; if (CurrentContext.InstructionPointer > CurrentContext.Script.Length - length - 2) { return(1); } uint api_hash = length == 4 ? System.BitConverter.ToUInt32(CurrentContext.Script, CurrentContext.InstructionPointer + 2) : Encoding.ASCII.GetString(CurrentContext.Script, CurrentContext.InstructionPointer + 2, length).ToInteropMethodHash(); long price = Service.GetPrice(api_hash); if (price > 0) { return(price); } if (api_hash == "Neo.Asset.Create".ToInteropMethodHash() || api_hash == "AntShares.Asset.Create".ToInteropMethodHash()) { return(5000L * 100000000L / ratio); } if (api_hash == "Neo.Asset.Renew".ToInteropMethodHash() || api_hash == "AntShares.Asset.Renew".ToInteropMethodHash()) { return((byte)CurrentContext.EvaluationStack.Peek(1).GetBigInteger() * 5000L * 100000000L / ratio); } if (api_hash == "Neo.Contract.Create".ToInteropMethodHash() || api_hash == "Neo.Contract.Migrate".ToInteropMethodHash() || api_hash == "AntShares.Contract.Create".ToInteropMethodHash() || api_hash == "AntShares.Contract.Migrate".ToInteropMethodHash()) { long fee = 100L; ContractPropertyState contract_properties = (ContractPropertyState)(byte)CurrentContext.EvaluationStack.Peek(3).GetBigInteger(); if (contract_properties.HasFlag(ContractPropertyState.HasStorage)) { fee += 400L; } if (contract_properties.HasFlag(ContractPropertyState.HasDynamicInvoke)) { fee += 500L; } return(fee * 100000000L / ratio); } if (api_hash == "System.Storage.Put".ToInteropMethodHash() || api_hash == "System.Storage.PutEx".ToInteropMethodHash() || api_hash == "Neo.Storage.Put".ToInteropMethodHash() || api_hash == "AntShares.Storage.Put".ToInteropMethodHash()) { return(((CurrentContext.EvaluationStack.Peek(1).GetByteArray().Length + CurrentContext.EvaluationStack.Peek(2).GetByteArray().Length - 1) / 1024 + 1) * 1000); } return(1); }
private static readonly byte[] FromAssetListPrefix = new byte[] { 0x01, 0x01 }; // "FromAssetList"; public static object Main(string method, object[] args) { if (Runtime.Trigger == TriggerType.Application) { var callscript = ExecutionEngine.CallingScriptHash; if (method == "bindProxyHash") { return(BindProxyHash((BigInteger)args[0], (byte[])args[1])); } if (method == "bindAssetHash") { return(BindAssetHash((byte[])args[0], (BigInteger)args[1], (byte[])args[2])); } if (method == "getAssetBalance") { return(GetAssetBalance((byte[])args[0])); } if (method == "getProxyHash") { return(GetProxyHash((BigInteger)args[0])); } if (method == "getAssetHash") { return(GetAssetHash((byte[])args[0], (BigInteger)args[1])); } if (method == "lock") { return(Lock((byte[])args[0], (byte[])args[1], (BigInteger)args[2], (byte[])args[3], (BigInteger)args[4])); } if (method == "unlock") { return(Unlock((byte[])args[0], (byte[])args[1], (BigInteger)args[2], callscript)); } if (method == "upgrade") { Runtime.Notify("In upgrade"); if (args.Length < 9) { return(false); } byte[] script = (byte[])args[0]; byte[] plist = (byte[])args[1]; byte rtype = (byte)args[2]; ContractPropertyState cps = (ContractPropertyState)args[3]; string name = (string)args[4]; string version = (string)args[5]; string author = (string)args[6]; string email = (string)args[7]; string description = (string)args[8]; return(Upgrade(script, plist, rtype, cps, name, version, author, email, description)); } } return(false); }
protected virtual long GetPriceForSysCall() { Instruction instruction = CurrentContext.CurrentInstruction; uint method = instruction.TokenU32; long price = InteropService.GetPrice(method); if (price > 0) { return(price); } if (method == InteropService.Neo_Crypto_CheckMultiSig) { if (CurrentContext.EvaluationStack.Count == 0) { return(1); } var item = CurrentContext.EvaluationStack.Peek(); int n; if (item is VMArray array) { n = array.Count; } else { n = (int)item.GetBigInteger(); } if (n < 1) { return(1); } return(100 * n); } if (method == InteropService.Neo_Contract_Create || method == InteropService.Neo_Contract_Migrate) { long fee = 100L; ContractPropertyState contract_properties = (ContractPropertyState)(byte)CurrentContext.EvaluationStack.Peek(3).GetBigInteger(); if (contract_properties.HasFlag(ContractPropertyState.HasStorage)) { fee += 400L; } return(fee * (long)NativeContract.GAS.Factor / ratio); } if (method == InteropService.System_Storage_Put || method == InteropService.System_Storage_PutEx) { return(((CurrentContext.EvaluationStack.Peek(1).GetByteArray().Length + CurrentContext.EvaluationStack.Peek(2).GetByteArray().Length - 1) / 1024 + 1) * 1000); } return(1); }
void ICloneable <ContractState> .FromReplica(ContractState replica) { Script = replica.Script; ParameterList = replica.ParameterList; ReturnType = replica.ReturnType; ContractProperties = replica.ContractProperties; Name = replica.Name; CodeVersion = replica.CodeVersion; Author = replica.Author; Email = replica.Email; Description = replica.Description; }
// params: 0710 // return : 05 public static Object Main(string operation, params object[] args) { if (Runtime.Trigger == TriggerType.Verification) { // param Owner must be script hash if (Runtime.CheckWitness(TOK.Owner)) { return(true); } // Check if attached assets are accepted return(false); } if (Runtime.Trigger == TriggerType.Application) { if (operation == "migrate") { if (args.Length < 9) { MigrateError("error_missing_migrate_params"); return(false); } byte[] script = (byte[])args[0]; byte[] plist = (byte[])args[1]; byte rtype = (byte)args[2]; ContractPropertyState cps = (ContractPropertyState)args[3]; string name = (string)args[4]; string version = (string)args[5]; string author = (string)args[6]; string email = (string)args[7]; string description = (string)args[8]; return(Migrate(script, plist, rtype, cps, name, version, author, email, description)); } //if not migrate var ret = ApplicationMethods(operation, args); if (ret != null) { return(ret); } } return(false); }
public static object Main(string method, object[] args) { if (Runtime.Trigger == TriggerType.Verification) { return Runtime.CheckWitness(GetAdmin()); } else if (Runtime.Trigger == TriggerType.Application) { if (method == "swapTokenInForTokenOut") return SwapTokenInForTokenOut((byte[])args[0], (BigInteger)args[1], (BigInteger)args[2], (byte[][])args[3], (BigInteger)args[4]); if (method == "swapTokenOutForTokenIn") return SwapTokenOutForTokenIn((byte[])args[0], (BigInteger)args[1], (BigInteger)args[2], (byte[][])args[3], (BigInteger)args[4]); if (method == "addLiquidity") return AddLiquidity((byte[])args[0], (byte[])args[1], (byte[])args[2], (BigInteger)args[3], (BigInteger)args[4], (BigInteger)args[5], (BigInteger)args[6], (BigInteger)args[7]); if (method == "removeLiquidity") return RemoveLiquidity((byte[])args[0], (byte[])args[1], (byte[])args[2], (BigInteger)args[3], (BigInteger)args[4], (BigInteger)args[5], (BigInteger)args[6]); //var msgSender = ExecutionEngine.CallingScriptHash;//等价以太坊的msg.sender if (method == "quote") return Quote((BigInteger)args[0], (BigInteger)args[1], (BigInteger)args[2]); if (method == "getReserves") return GetReserves((byte[])args[0], (byte[])args[1]); if (method == "getAmountOut") return GetAmountOut((BigInteger)args[0], (BigInteger)args[1], (BigInteger)args[2]); if (method == "getAmountsOut") return GetAmountsOut(args[0].ToBigInt(), (byte[][])args[1]); if (method == "getAmountIn") return GetAmountIn((BigInteger)args[0], (BigInteger)args[1], (BigInteger)args[2]); if (method == "getAmountsIn") return GetAmountsIn(args[0].ToBigInt(), (byte[][])args[1]); if (method == "getAdmin") return GetAdmin(); if (method == "setAdmin") return SetAdmin((byte[])args[0]); if (method == "upgrade") { Assert(args.Length == 9, "upgrade: args.Length != 9."); byte[] script = (byte[])args[0]; byte[] plist = (byte[])args[1]; byte rtype = (byte)args[2]; ContractPropertyState cps = (ContractPropertyState)args[3]; string name = (string)args[4]; string version = (string)args[5]; string author = (string)args[6]; string email = (string)args[7]; string description = (string)args[8]; return Upgrade(script, plist, rtype, cps, name, version, author, email, description); } } return false; }
/// <summary> /// Builds a contract script to be deployed on the network. /// </summary> /// <param name="contractScript"></param> /// <param name="parameterList"></param> /// <param name="returnType"></param> /// <param name="properties"></param> /// <param name="name"></param> /// <param name="version"></param> /// <param name="author"></param> /// <param name="email"></param> /// <param name="description"></param> /// <returns></returns> public static byte[] PrepareDeployContract(byte[] contractScript, byte[] parameterList, ContractParameterType returnType, ContractPropertyState properties, string name, string version, string author, string email, string description) { byte[] script; using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitSysCall("Neo.Contract.Create", contractScript, parameterList, returnType, properties, name, version, author, email, description); script = sb.ToArray(); } return(script); }
public override void Deserialize(BinaryReader reader) { base.Deserialize(reader); Script = reader.ReadVarBytes(); ParameterList = reader.ReadVarBytes().Select(p => (ContractParameterType)p).ToArray(); ReturnType = (ContractParameterType)reader.ReadByte(); ContractProperties = (ContractPropertyState)reader.ReadByte(); Name = reader.ReadVarString(); CodeVersion = reader.ReadVarString(); Author = reader.ReadVarString(); Email = reader.ReadVarString(); Description = reader.ReadVarString(); }
private static bool Upgrade(object[] args) { //不是管理员 不能操作 if (!Runtime.CheckWitness(Owner)) { return(false); } if (args.Length != 1 && args.Length != 9) { return(false); } byte[] script = Blockchain.GetContract(ExecutionEngine.ExecutingScriptHash).Script; byte[] new_script = (byte[])args[0]; //如果传入的脚本一样 不继续操作 if (script == new_script) { return(false); } byte[] parameter_list = new byte[] { 0x07, 0x10 }; byte return_type = 0x05; ContractPropertyState need_storage = (ContractPropertyState)(object)07; string name = "ECT"; string version = "1"; string author = "james"; string email = "0"; string description = "Easy Cheers Token"; if (args.Length == 9) { parameter_list = (byte[])args[1]; return_type = (byte)args[2]; need_storage = (ContractPropertyState)args[3]; name = (string)args[4]; version = (string)args[5]; author = (string)args[6]; email = (string)args[7]; description = (string)args[8]; } Contract.Migrate(new_script, parameter_list, return_type, need_storage, name, version, author, email, description); return(true); }
private bool Contract_Migrate(ExecutionEngine engine) { if (Trigger != TriggerType.Application) { return(false); } byte[] script = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); if (script.Length > 1024 * 1024) { return(false); } ContractPropertyState contract_properties = (ContractPropertyState)(byte)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger(); UInt160 hash = script.ToScriptHash(); ContractState contract = Snapshot.Contracts.TryGet(hash); if (contract == null) { contract = new ContractState { Script = script, ContractProperties = contract_properties }; Snapshot.Contracts.Add(hash, contract); ContractsCreated.Add(hash, new UInt160(engine.CurrentContext.ScriptHash)); if (contract.HasStorage) { foreach (var pair in Snapshot.Storages.Find(engine.CurrentContext.ScriptHash).ToArray()) { Snapshot.Storages.Add(new StorageKey { ScriptHash = hash, Key = pair.Key.Key }, new StorageItem { Value = pair.Value.Value, IsConstant = false }); } } } engine.CurrentContext.EvaluationStack.Push(StackItem.FromInterface(contract)); return(Contract_Destroy(engine)); }
private byte[] LoadDeploymentScript(string avmFilePath, bool hasStorage, bool isPayable, out UInt160 scriptHash) { byte[] script = File.ReadAllBytes(avmFilePath); scriptHash = script.ToScriptHash(); ContractPropertyState properties = ContractPropertyState.NoProperty; if (hasStorage) { properties |= ContractPropertyState.HasStorage; } if (isPayable) { properties |= ContractPropertyState.Payable; } using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitSysCall(InteropService.Neo_Contract_Create, script, properties); return(sb.ToArray()); } }
public long GetPrice(uint api_hash, ExecutionEngine engine) { long price = base.GetPrice(api_hash); if (price > 0) { return(price); } if (api_hash == NativeNEP5Service.SysCall_MethodHash) { price = NativeNEP5Service.GetPrice(engine); } else { if (IsUnpricedMethod(api_hash, "Contract.Create") || IsUnpricedMethod(api_hash, "Contract.Migrate")) { long fee = 10_000L; ContractPropertyState contract_properties = (ContractPropertyState)(byte)engine.CurrentContext.EvaluationStack.Peek(3).GetBigInteger(); if (contract_properties.HasFlag(ContractPropertyState.HasStorage)) { fee += 40_000L; } if (contract_properties.HasFlag(ContractPropertyState.HasDynamicInvoke)) { fee += 50_000L; } return(fee); } if (IsUnpricedMethod(api_hash, "Storage.Put") || IsUnpricedMethod(api_hash, "Storage.PutEx")) { return(((engine.CurrentContext.EvaluationStack.Peek(1).GetByteArray().Length + engine.CurrentContext.EvaluationStack.Peek(2).GetByteArray().Length - 1) / 1024 + 1) * 1000); } } return(price); }
public InvocationTransaction LoadScriptTransaction( string avmFilePath, string paramTypes, string returnTypeHexString, bool hasStorage, bool hasDynamicInvoke, bool isPayable, string contractName, string contractVersion, string contractAuthor, string contractEmail, string contractDescription, out UInt160 scriptHash) { byte[] script = File.ReadAllBytes(avmFilePath); // See ContractParameterType Enum byte[] parameterList = paramTypes.HexToBytes(); ContractParameterType returnType = returnTypeHexString.HexToBytes() .Select(p => (ContractParameterType?)p).FirstOrDefault() ?? ContractParameterType.Void; ContractPropertyState properties = ContractPropertyState.NoProperty; if (hasStorage) { properties |= ContractPropertyState.HasStorage; } if (hasDynamicInvoke) { properties |= ContractPropertyState.HasDynamicInvoke; } if (isPayable) { properties |= ContractPropertyState.Payable; } using (ScriptBuilder sb = new ScriptBuilder()) { scriptHash = script.ToScriptHash(); sb.EmitSysCall("Neo.Contract.Create", script, parameterList, returnType, properties, contractName, contractVersion, contractAuthor, contractEmail, contractDescription); return(new InvocationTransaction { Script = sb.ToArray() }); } }
public static byte[] Upgrade(byte[] newScript, byte[] paramList, byte returnType, ContractPropertyState cps, string name, string version, string author, string email, string description) { Assert(Runtime.CheckWitness(GetAdmin()), "upgrade: CheckWitness failed!"); byte[] newContractHash = Hash160(newScript); Assert(Blockchain.GetContract(newContractHash).Serialize().Equals(new byte[] { 0x00, 0x00 }), "upgrade: The contract already exists"); Contract newContract = Contract.Migrate(newScript, paramList, returnType, cps, name, version, author, email, description); Runtime.Notify("upgrade", ExecutionEngine.ExecutingScriptHash, newContractHash); return(newContractHash); }
private bool Contract_Migrate(ExecutionEngine engine) { if (Trigger != TriggerType.Application) { return(false); } byte[] script = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); if (script.Length > 1024 * 1024) { return(false); } ContractParameterType[] parameter_list = engine.CurrentContext.EvaluationStack.Pop().GetByteArray().Select(p => (ContractParameterType)p).ToArray(); if (parameter_list.Length > 252) { return(false); } ContractParameterType return_type = (ContractParameterType)(byte)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger(); ContractPropertyState contract_properties = (ContractPropertyState)(byte)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger(); if (engine.CurrentContext.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string name = Encoding.UTF8.GetString(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); if (engine.CurrentContext.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string version = Encoding.UTF8.GetString(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); if (engine.CurrentContext.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string author = Encoding.UTF8.GetString(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); if (engine.CurrentContext.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string email = Encoding.UTF8.GetString(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); if (engine.CurrentContext.EvaluationStack.Peek().GetByteArray().Length > 65536) { return(false); } string description = Encoding.UTF8.GetString(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); UInt160 hash = script.ToScriptHash(); ContractState contract = Snapshot.Contracts.TryGet(hash); if (contract == null) { contract = new ContractState { Script = script, ParameterList = parameter_list, ReturnType = return_type, ContractProperties = contract_properties, Name = name, CodeVersion = version, Author = author, Email = email, Description = description }; Snapshot.Contracts.Add(hash, contract); ContractsCreated.Add(hash, new UInt160(engine.CurrentContext.ScriptHash)); if (contract.HasStorage) { foreach (var pair in Snapshot.Storages.Find(engine.CurrentContext.ScriptHash).ToArray()) { Snapshot.Storages.Add(new StorageKey { ScriptHash = hash, Key = pair.Key.Key }, new StorageItem { Value = pair.Value.Value, IsConstant = false }); } } } engine.CurrentContext.EvaluationStack.Push(StackItem.FromInterface(contract)); return(Contract_Destroy(engine)); }
private bool Contract_Create(ExecutionEngine engine) { byte[] script = engine.EvaluationStack.Pop().GetByteArray(); if (script.Length > 1024 * 1024) { return(false); } ContractParameterType[] parameter_list = engine.EvaluationStack.Pop().GetByteArray().Select(p => (ContractParameterType)p).ToArray(); if (parameter_list.Length > 252) { return(false); } ContractParameterType return_type = (ContractParameterType)(byte)engine.EvaluationStack.Pop().GetBigInteger(); ContractPropertyState contract_properties = (ContractPropertyState)(byte)engine.EvaluationStack.Pop().GetBigInteger(); if (engine.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string name = Encoding.UTF8.GetString(engine.EvaluationStack.Pop().GetByteArray()); if (engine.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string version = Encoding.UTF8.GetString(engine.EvaluationStack.Pop().GetByteArray()); if (engine.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string author = Encoding.UTF8.GetString(engine.EvaluationStack.Pop().GetByteArray()); if (engine.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string email = Encoding.UTF8.GetString(engine.EvaluationStack.Pop().GetByteArray()); if (engine.EvaluationStack.Peek().GetByteArray().Length > 65536) { return(false); } string description = Encoding.UTF8.GetString(engine.EvaluationStack.Pop().GetByteArray()); UInt160 hash = script.ToScriptHash(); ContractState contract = contracts.TryGet(hash); if (contract == null) { contract = new ContractState { Script = script, ParameterList = parameter_list, ReturnType = return_type, ContractProperties = contract_properties, Name = name, CodeVersion = version, Author = author, Email = email, Description = description }; contracts.Add(hash, contract); contracts_created.Add(hash, new UInt160(engine.CurrentContext.ScriptHash)); } engine.EvaluationStack.Push(StackItem.FromInterface(contract)); return(true); }
protected virtual long GetPriceForSysCall() { if (CurrentContext.InstructionPointer >= CurrentContext.Script.Length - 3) { return(1); } byte length = CurrentContext.Script[CurrentContext.InstructionPointer + 1]; if (CurrentContext.InstructionPointer > CurrentContext.Script.Length - length - 2) { return(1); } string api_name = Encoding.ASCII.GetString(CurrentContext.Script, CurrentContext.InstructionPointer + 2, length); switch (api_name) { case "System.Runtime.CheckWitness": case "Bhp.Runtime.CheckWitness": return(200); case "System.Blockchain.GetHeader": case "Bhp.Blockchain.GetHeader": return(100); case "System.Blockchain.GetBlock": case "Bhp.Blockchain.GetBlock": return(200); case "System.Blockchain.GetTransaction": case "Bhp.Blockchain.GetTransaction": return(100); case "System.Blockchain.GetTransactionHeight": case "Bhp.Blockchain.GetTransactionHeight": return(100); case "Bhp.Blockchain.GetAccount": return(100); case "Bhp.Blockchain.GetValidators": return(200); case "Bhp.Blockchain.GetAsset": return(100); case "System.Blockchain.GetContract": case "Bhp.Blockchain.GetContract": return(100); case "Bhp.Transaction.GetReferences": case "Bhp.Transaction.GetUnspentCoins": return(200); case "Bhp.Account.SetVotes": return(1000); case "Bhp.Validator.Register": return(1000L * 100000000L / ratio); case "Bhp.Asset.Create": return(5000L * 100000000L / ratio); case "Bhp.Asset.Renew": return((byte)CurrentContext.EvaluationStack.Peek(1).GetBigInteger() * 5000L * 100000000L / ratio); case "Bhp.Contract.Create": case "Bhp.Contract.Migrate": long fee = 100L; ContractPropertyState contract_properties = (ContractPropertyState)(byte)CurrentContext.EvaluationStack.Peek(3).GetBigInteger(); if (contract_properties.HasFlag(ContractPropertyState.HasStorage)) { fee += 400L; } if (contract_properties.HasFlag(ContractPropertyState.HasDynamicInvoke)) { fee += 500L; } return(fee * 100000000L / ratio); case "System.Storage.Get": case "Bhp.Storage.Get": return(100); case "System.Storage.Put": case "Bhp.Storage.Put": return(((CurrentContext.EvaluationStack.Peek(1).GetByteArray().Length + CurrentContext.EvaluationStack.Peek(2).GetByteArray().Length - 1) / 1024 + 1) * 1000); case "System.Storage.Delete": case "Bhp.Storage.Delete": return(100); default: return(1); } }
void ICloneable <ContractState> .FromReplica(ContractState replica) { Script = replica.Script; ContractProperties = replica.ContractProperties; }
void ISerializable.Deserialize(BinaryReader reader) { Script = reader.ReadVarBytes(); ContractProperties = (ContractPropertyState)reader.ReadByte(); }
public static InvocationTransaction GetDeployContractTransaction(ContractModel contractModel, out string scriptHash, out string scriptBytesString) { MainWindow mainWindow = (MainWindow)App.Current.MainWindow; scriptHash = null; scriptBytesString = null; if (mainWindow.ActiveDocument == null) { return(null); } RIPEMD160 myRIPEMD160 = RIPEMD160Managed.Create(); string uniqueTempHash = BitConverter.ToString(myRIPEMD160.ComputeHash(Guid.NewGuid().ToByteArray())); mainWindow.ActiveDocument.scintilla.Text = mainWindow.ActiveDocument.scintilla.Text.Replace("MI4m2tqy+RPxxQfKGdKhg1Hb62s=", uniqueTempHash); mainWindow.ActiveDocument.Save(); if (!SmartContract.Build()) { return(null); } string contractFileName = Path.Combine(Path.GetDirectoryName(mainWindow.ActiveDocument.FilePath), Path.GetFileNameWithoutExtension(mainWindow.ActiveDocument.FilePath), ".avm"); if (!File.Exists(contractFileName)) { return(null); } if (!contractModel.Validate()) { return(null); } byte[] script = File.ReadAllBytes(contractFileName); scriptHash = script.ToScriptHash().ToString(); byte[] parameter_list = contractModel.ParameterHexValue.HexToBytes(); ContractParameterType return_type = contractModel.ReturnTypeHexValue.HexToBytes().Select(p => (ContractParameterType?)p).FirstOrDefault() ?? ContractParameterType.Void; ContractPropertyState properties = ContractPropertyState.NoProperty; if (contractModel.IsStorageRequired) { properties |= ContractPropertyState.HasStorage; } if (contractModel.HasDynamicInvoke) { properties |= ContractPropertyState.HasDynamicInvoke; } using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitSysCall("Neo.Contract.Create", script, parameter_list, return_type, properties, contractModel.Name, contractModel.Version, contractModel.Author, contractModel.Email, contractModel.Description); return(new InvocationTransaction { Script = sb.ToArray() }); } }
private static readonly BigInteger total_amount = new BigInteger("000000e4d20cc8dcd2b75200".HexToBytes()); // total token amount, 1*10^18 //private const ulong max = ulong.MaxValue; //18446744073709551615 // StorageMap contract, key: "totalSupply", value: total_amount // StorageMap contract, key: "owner", value: owner, byte[20], legal address // StorageMap contract, key: "paused", value: 1 (true) or 0 (false) // StorageMap asset, key: account, value: balance public static object Main(string method, object[] args) { if (Runtime.Trigger == TriggerType.Verification) { return(Runtime.CheckWitness(GetOwner())); } else if (Runtime.Trigger == TriggerType.Application) { var callscript = ExecutionEngine.CallingScriptHash; // Contract deployment if (method == "deploy") { return(Deploy()); } if (method == "isDeployed") { return(IsDeployed()); } // Cross chain if (method == "bindContractAddress") { return(BindContractAddress((BigInteger)args[0], (byte[])args[1])); } if (method == "getContractAddress") { return(GetContractAddress((BigInteger)args[0])); } if (method == "lock") { return(Lock((byte[])args[0], (BigInteger)args[1], (byte[])args[2], (BigInteger)args[3])); } if (method == "unlock") { return(Unlock((byte[])args[0], (byte[])args[1], (BigInteger)args[2], callscript)); } // NEP5 standard methods if (method == "balanceOf") { return(BalanceOf((byte[])args[0])); } if (method == "decimals") { return(Decimals()); } if (method == "name") { return(Name()); } if (method == "symbol") { return(Symbol()); } if (method == "totalSupply") { return(TotalSupply()); } if (method == "transfer") { return(Transfer((byte[])args[0], (byte[])args[1], (BigInteger)args[2], callscript)); } // Owner management if (method == "transferOwnership") { return(TransferOwnership((byte[])args[0])); } if (method == "getOwner") { return(GetOwner()); } // Contract management if (method == "supportedStandards") { return(SupportedStandards()); } if (method == "pause") { return(Pause()); } if (method == "unpause") { return(Unpause()); } if (method == "isPaused") { return(IsPaused()); } if (method == "upgrade") { Runtime.Notify("In upgrade"); if (args.Length < 9) { return(false); } byte[] script = (byte[])args[0]; byte[] plist = (byte[])args[1]; byte rtype = (byte)args[2]; ContractPropertyState cps = (ContractPropertyState)args[3]; string name = (string)args[4]; string version = (string)args[5]; string author = (string)args[6]; string email = (string)args[7]; string description = (string)args[8]; return(Upgrade(script, plist, rtype, cps, name, version, author, email, description)); } } return(false); }
public abstract Task <InvocationTransaction> DeployContract(byte[] contractScript, byte[] parameterList, ContractParameterType returnType, ContractPropertyState properties, string name, string version, string author, string email, string description);
public static bool Upgrade(byte[] newScript, byte[] paramList, byte returnType, ContractPropertyState cps, string name, string version, string author, string email, string description) { if (!Runtime.CheckWitness(GetOwner())) { Runtime.Notify("Only allowed to be called by owner."); return(false); } var contract = Contract.Migrate(newScript, paramList, returnType, cps, name, version, author, email, description); Runtime.Notify("Proxy contract upgraded"); return(true); }
public static object Main(string method, object[] args) { if (Runtime.Trigger == TriggerType.Verification) { return(Runtime.CheckWitness(GetAdmin())); } else if (Runtime.Trigger == TriggerType.Application) { //合约调用时,等价以太坊的msg.sender //直接调用时,此处为 tx.Script.ToScriptHash(); var msgSender = ExecutionEngine.CallingScriptHash; if (method == "getReserves") { return(ReservePair); } if (method == "mint") { return(Mint(msgSender, (byte[])args[0])); //msgSender应当为router } if (method == "burn") { return(Burn(msgSender, (byte[])args[0])); //msgSender应当为router } if (method == "swap") { return(Swap(msgSender, (BigInteger)args[0], (BigInteger)args[1], (byte[])args[2])); } if (method == "transfer") { return(Transfer((byte[])args[0], (byte[])args[1], (BigInteger)args[2], msgSender)); } if (method == "balanceOf") { return(BalanceOf((byte[])args[0])); } if (method == "decimals") { return(Decimals()); } if (method == "name") { return(Name()); } if (method == "symbol") { return(Symbol()); } if (method == "supportedStandards") { return(SupportedStandards()); } if (method == "totalSupply") { return(GetTotalSupply()); } if (method == "getToken0") { return(Token0); } if (method == "getToken1") { return(Token1); } if (method == "getAdmin") { return(GetAdmin()); } if (method == "setAdmin") { return(SetAdmin((byte[])args[0])); } if (method == "getWhiteListContract") { return(GetWhiteListContract()); } if (method == "setWhiteListContract") { return(SetWhiteListContract((byte[])args[0])); } if (method == "checkIsRouter") { return(CheckIsRouter((byte[])args[0])); } if (method == "upgrade") { Assert(args.Length == 9, "upgrade: args.Length != 9"); byte[] script = (byte[])args[0]; byte[] plist = (byte[])args[1]; byte rtype = (byte)args[2]; ContractPropertyState cps = (ContractPropertyState)args[3]; string name = (string)args[4]; string version = (string)args[5]; string author = (string)args[6]; string email = (string)args[7]; string description = (string)args[8]; return(Upgrade(script, plist, rtype, cps, name, version, author, email, description)); } } return(false); }
public static extern Contract Migrate(byte[] script, ContractPropertyState contract_property_state);
public static object Main(string method, object[] args) { if (Runtime.Trigger == TriggerType.Verification) { return(Runtime.CheckWitness(GetAdmin())); } if (Runtime.Trigger == TriggerType.Application) { if (method == "getExchangePair") { //var tokenA = (byte[])args[0]; //var tokenB = (byte[])args[1]; //return Storage.Get(tokenA.AsBigInteger() < tokenB.AsBigInteger() // ? ExchangeMapKey.AsByteArray().Concat(tokenA).Concat(tokenB) // : ExchangeMapKey.AsByteArray().Concat(tokenB).Concat(tokenA));//0.182 return(Storage.Get(GetPairKey((byte[])args[0], (byte[])args[1])));//优化gas,0.199 //return GetExchangePair((byte[])args[0], (byte[])args[1]); } if (method == "getAllExchangePair") { return(GetAllExchangePair()); } if (method == "createExchangePair") { return(CreateExchangePair((byte[])args[0], (byte[])args[1], (byte[])args[2])); } if (method == "removeExchangePair") { return(RemoveExchangePair((byte[])args[0], (byte[])args[1])); } if (method == "getFeeTo") { return(GetFeeTo()); } if (method == "setFeeTo") { return(SetFeeTo((byte[])args[0])); } if (method == "getAdmin") { return(GetAdmin()); } if (method == "setAdmin") { return(SetAdmin((byte[])args[0])); } if (method == "upgrade") { Assert(args.Length == 9, "upgrade: args.Length != 9."); byte[] script = (byte[])args[0]; byte[] plist = (byte[])args[1]; byte rtype = (byte)args[2]; ContractPropertyState cps = (ContractPropertyState)args[3]; string name = (string)args[4]; string version = (string)args[5]; string author = (string)args[6]; string email = (string)args[7]; string description = (string)args[8]; return(Upgrade(script, plist, rtype, cps, name, version, author, email, description)); } } return(false); }