Пример #1
0
        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()
                });
            }
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
 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;
        }
Пример #11
0
        /// <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);
        }
Пример #12
0
 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();
 }
Пример #13
0
        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);
        }
Пример #14
0
        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));
        }
Пример #15
0
        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());
            }
        }
Пример #16
0
        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);
        }
Пример #17
0
        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);
        }
Пример #19
0
        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));
        }
Пример #20
0
        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);
        }
Пример #21
0
        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);
            }
        }
Пример #22
0
 void ICloneable <ContractState> .FromReplica(ContractState replica)
 {
     Script             = replica.Script;
     ContractProperties = replica.ContractProperties;
 }
Пример #23
0
 void ISerializable.Deserialize(BinaryReader reader)
 {
     Script             = reader.ReadVarBytes();
     ContractProperties = (ContractPropertyState)reader.ReadByte();
 }
Пример #24
0
        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()
                });
            }
        }
Пример #25
0
        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);
        }
Пример #26
0
 public abstract Task <InvocationTransaction> DeployContract(byte[] contractScript, byte[] parameterList,
                                                             ContractParameterType returnType, ContractPropertyState properties,
                                                             string name, string version, string author, string email, string description);
Пример #27
0
        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);
        }
Пример #29
0
 public static extern Contract Migrate(byte[] script, ContractPropertyState contract_property_state);
Пример #30
0
        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);
        }