示例#1
0
 public void Initialize(Dictionary<string, object> appInfo, Dictionary<string, object> entryPointInformation)
 {
     try
     {
         VmcExecuteAddIn.entryPointInfo = entryPointInformation;
         object obj1;
         VmcExecuteAddIn.entryPointInfo.TryGetValue("Title", out obj1);
         VmcExecuteAddIn.ExecutionTitle = obj1 as string;
         object obj2;
         if (!VmcExecuteAddIn.entryPointInfo.TryGetValue("ImageUrl", out obj2))
             VmcExecuteAddIn.entryPointInfo.TryGetValue("ThumbnailUrl", out obj2);
         VmcExecuteAddIn.ExecutionImageUrl = obj2 as string;
         object obj3;
         if (!VmcExecuteAddIn.entryPointInfo.TryGetValue("Context", out obj3))
             throw new InvalidOperationException("Context not found.");
         this.executionInfo = (ExecutionInfo)new XmlSerializer(typeof(ExecutionInfo)).Deserialize((TextReader)new StringReader(((string)obj3).Trim()));
         if (this.executionInfo == null)
             throw new FormatException("Could not interpret context.");
         bool flag1 = !string.IsNullOrEmpty(this.executionInfo.FileName);
         bool flag2 = this.executionInfo.Media != null && this.executionInfo.Media.Count > 0;
         if (!flag1 && !flag2 && !this.executionInfo.Page.HasValue)
             throw new InvalidOperationException("No file name, page or media specified.");
         if (!flag1)
             return;
         this.executionInfo.FileName = System.Environment.ExpandEnvironmentVariables(this.executionInfo.FileName);
         object obj4;
         if (!this.executionInfo.RequiresDirectX && VmcExecuteAddIn.entryPointInfo.TryGetValue("CapabilitiesRequired", out obj4))
             this.executionInfo.RequiresDirectX = ((string)obj4).IndexOf("directx", StringComparison.InvariantCultureIgnoreCase) != -1;
         VmcExecuteAddIn.globalHook = new GlobalHook();
         VmcExecuteAddIn.ExecutionEngine = new ExecutionEngine(this.executionInfo, VmcExecuteAddIn.globalHook);
         VmcExecuteAddIn.ExecutionEngine.ExecutionFinished += (EventHandler)delegate
         {
             Application.DeferredInvoke(new DeferredHandler(this.ExecutionFinishedHandler));
         };
         VmcExecuteAddIn.ExecutionEngine.ExecutionError += (EventHandler<Advent.VmcExecute.ErrorEventArgs>)((sender, args) => Application.DeferredInvoke(new DeferredHandler(this.ExecutionErrorHandler), (object)args));
         if (string.IsNullOrEmpty(VmcExecuteAddIn.ExecutionTitle))
             VmcExecuteAddIn.ExecutionTitle = Path.GetFileNameWithoutExtension(this.executionInfo.FileName);
         VmcExecuteAddIn.messagePump = new Thread((ThreadStart)(() =>
         {
             try
             {
                 if (VmcExecuteAddIn.ExecutionEngine.RequiresKeyboardHook)
                     VmcExecuteAddIn.globalHook.Start(false, true);
                 System.Windows.Threading.Dispatcher.Run();
             }
             catch (ThreadAbortException)
             {
             }
         }));
         VmcExecuteAddIn.messagePump.SetApartmentState(ApartmentState.STA);
         VmcExecuteAddIn.messagePump.IsBackground = true;
         VmcExecuteAddIn.messagePump.Start();
     }
     catch (Exception ex)
     {
         VmcExecuteAddIn.LogError(ex.ToString());
         throw;
     }
 }
示例#2
0
 internal ExecutionContext(ExecutionEngine engine, byte[] script, int rvcount)
 {
     this.Script   = script;
     this.RVCount  = rvcount;
     this.OpReader = new BinaryReader(new MemoryStream(script, false));
 }
示例#3
0
        private bool Asset_Create(ExecutionEngine engine)
        {
            if (Trigger != TriggerType.Application)
            {
                return(false);
            }
            InvocationTransaction tx         = (InvocationTransaction)engine.ScriptContainer;
            AssetType             asset_type = (AssetType)(byte)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger();

            if (!Enum.IsDefined(typeof(AssetType), asset_type) || asset_type == AssetType.CreditFlag || asset_type == AssetType.DutyFlag || asset_type == AssetType.GoverningToken || asset_type == AssetType.UtilityToken)
            {
                return(false);
            }
            if (engine.CurrentContext.EvaluationStack.Peek().GetByteArray().Length > 1024)
            {
                return(false);
            }
            string name   = Encoding.UTF8.GetString(engine.CurrentContext.EvaluationStack.Pop().GetByteArray());
            Fixed8 amount = new Fixed8((long)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger());

            if (amount == Fixed8.Zero || amount < -Fixed8.Satoshi)
            {
                return(false);
            }
            if (asset_type == AssetType.Invoice && amount != -Fixed8.Satoshi)
            {
                return(false);
            }
            byte precision = (byte)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger();

            if (precision > 8)
            {
                return(false);
            }
            if (asset_type == AssetType.Share && precision != 0)
            {
                return(false);
            }
            if (amount != -Fixed8.Satoshi && amount.GetData() % (long)Math.Pow(10, 8 - precision) != 0)
            {
                return(false);
            }
            ECPoint owner = ECPoint.DecodePoint(engine.CurrentContext.EvaluationStack.Pop().GetByteArray(), ECCurve.Secp256r1);

            if (owner.IsInfinity)
            {
                return(false);
            }
            if (!CheckWitness(engine, owner))
            {
                return(false);
            }
            UInt160    admin  = new UInt160(engine.CurrentContext.EvaluationStack.Pop().GetByteArray());
            UInt160    issuer = new UInt160(engine.CurrentContext.EvaluationStack.Pop().GetByteArray());
            AssetState asset  = Snapshot.Assets.GetOrAdd(tx.Hash, () => new AssetState
            {
                AssetId    = tx.Hash,
                AssetType  = asset_type,
                Name       = name,
                Amount     = amount,
                Available  = Fixed8.Zero,
                Precision  = precision,
                Fee        = Fixed8.Zero,
                FeeAddress = new UInt160(),
                Owner      = owner,
                Admin      = admin,
                Issuer     = issuer,
                Expiration = Snapshot.Height + 1 + 2000000,
                IsFrozen   = false
            });

            engine.CurrentContext.EvaluationStack.Push(StackItem.FromInterface(asset));
            return(true);
        }
示例#4
0
 protected virtual bool Blockchain_GetValidators(ExecutionEngine engine)
 {
     ECPoint[] validators = Blockchain.Default.GetValidators();
     engine.EvaluationStack.Push(validators.Select(p => (StackItem)p.EncodePoint(true)).ToArray());
     return(true);
 }
示例#5
0
 public static bool GetAssetId(ExecutionEngine engine)
 {
     //TransactionOutput
     // returns byte[]
     throw new NotImplementedException();
 }
示例#6
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();
            bool need_storage = engine.EvaluationStack.Pop().GetBoolean();

            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,
                    HasStorage    = need_storage,
                    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);
        }
示例#7
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="engine">Engine</param>
 /// <param name="data">Data</param>
 internal ByteArrayStackItem(ExecutionEngine engine, byte[] data) : base(engine, data)
 {
     NativeEngine = engine;
     _handle      = this.CreateNativeItem();
 }
示例#8
0
 public static bool GetContract(ExecutionEngine engine)
 {
     //byte[] script_hash
     //returns Contract
     throw new NotImplementedException();
 }
示例#9
0
 public static bool GetUsage(ExecutionEngine engine)
 {
     // TransactionAttribute
     // returns byte
     throw new NotImplementedException();
 }
 public static void VoidAssertCall(bool value)
 {
     ExecutionEngine.Assert(value == true);
 }
 public static int AssertCall(bool value)
 {
     ExecutionEngine.Assert(value == true, "ERROR");
     return(5);
 }
示例#12
0
        public static bool CheckWitness(ExecutionEngine engine)
        {
            byte[] hashOrPubkey = engine.EvaluationStack.Pop().GetByteArray();

            bool result;

            string matchType;

            var emulator = engine.GetEmulator();

            if (hashOrPubkey.Length == 20) // script hash
            {
                matchType = "Script Hash";

                if (invokerKeys != null)
                {
                    result = invokerKeys.signatureHash.ToArray().ByteMatch(hashOrPubkey);
                }
                else
                {
                    result = false;
                }
            }
            else if (hashOrPubkey.Length == 33) // public key
            {
                matchType = "Public Key";

                if (invokerKeys != null)
                {
                    result = invokerKeys.CompressedPublicKey.ByteMatch(hashOrPubkey);
                }
                else
                {
                    result = false;
                }
            }
            else
            {
                matchType = "Unknown";
                result    = false;
            }

            if (emulator.checkWitnessMode != CheckWitnessMode.Default)
            {
                if (emulator.checkWitnessMode == CheckWitnessMode.AlwaysFalse)
                {
                    result = false;
                }
                else
                if (emulator.checkWitnessMode == CheckWitnessMode.AlwaysTrue)
                {
                    result = true;
                }

                matchType += " / Forced";
            }

            DoLog($"Checking Witness [{matchType}]: {hashOrPubkey.ByteToHex()} => {result}");

            engine.EvaluationStack.Push(new VM.Types.Boolean(result));
            return(true);
        }
示例#13
0
        static void Main(string[] pargs)
        {
            var api = new RemoteRPCNode(10332, "<cron node url>", CronNodesKind.CRON_GLOBAL);

            {
                Console.WriteLine("amount " + new BigInteger("00943577".HexToBytes()));
                Console.WriteLine("to " + new UInt160("fc3f33cb3e2d79f82fadef5f407ac1576d304bc1".HexToBytes()).ToAddress());
                Console.WriteLine("from " + new UInt160("a30cadcc858aa4b89d9db098ef154c5e1ab74464".HexToBytes()).ToAddress());

                return;
            }

            {
                var snap_data = File.ReadAllLines("souls_snap.csv");
                var snap      = Snapshot.Import(snap_data);

                var avm_script = File.ReadAllBytes(@"D:\code\Crypto\PhantasmaNeo\PhantasmaContract\bin\Debug\PhantasmaContract.avm");
                var soul_token = api.GetToken("SOUL");

                var lines = new List <string>();

                uint ico_war_time   = 1527465600;
                uint ico_start_time = 1527379200;

                Console.WriteLine("Block,Stage,Tx Hash,Address,Action,NEO sent,NEO refund");
                snap.Execute(api, soul_token.ScriptHash, vm =>
                {
                    var storage = vm.GetStorage(soul_token);
                    var block   = vm.currentBlock;

                    int stage = (block.Timestamp < ico_war_time) ? ((block.Timestamp < ico_start_time) ? 0 : 1) : 2;

                    //var bytes = storage.Get("totalSupply");
                    //var n = new BigInteger(bytes);

                    foreach (var tx in block.transactions)
                    {
                        UInt160 src = null;

                        /*foreach (var input in tx.inputs)
                         * {
                         *  var input_tx = snap.GetTransaction(input.prevHash);
                         *  if (input_tx == null)
                         *  {
                         *      input_tx = api.GetTransaction(input.prevHash);
                         *  }
                         *  var output = input_tx.outputs[input.prevIndex];
                         *  src = output.scriptHash;
                         * }
                         *
                         * if (src == null)
                         * {
                         *  continue;
                         * }*/

                        decimal neo_sent = 0;
                        foreach (var output in tx.outputs)
                        {
                            if (output.scriptHash == soul_token.ScriptHash)
                            {
                                neo_sent += output.value;
                            }
                        }

                        var src_address = src != null ? src.ToAddress(): "???";

                        if (tx.Hash.ToString() == "0xc39fb2304f721382a40142ed8af9d4470850f39fabeef9bb8bad892a6b63f4d6")
                        {
                            src_address += "";
                        }

                        if (tx.type == TransactionType.ContractTransaction)
                        {
                            decimal refund = 0;
                            foreach (var output in tx.outputs)
                            {
                                if (output.scriptHash == soul_token.ScriptHash)
                                {
                                    refund += output.value;
                                }
                            }
                            Console.WriteLine($"Block #{block.Height},{stage},{tx.Hash},{src_address},contract,{neo_sent},{refund}");
                        }
                        else
                        {
                            var notifications = vm.GetNotifications(tx);

                            if (notifications != null)
                            {
                                foreach (var entry in notifications)
                                {
                                    decimal refund = 0;
                                    if (entry.Name == "refund")
                                    {
                                        var bytes = (byte[])entry.Args[1];
                                        var n     = new BigInteger(bytes);
                                        refund    = (decimal)(n / 100000000);
                                    }
                                    Console.WriteLine($"Block #{block.Height},{stage},{entry.Hash},{src_address},{entry.Name},{neo_sent},{refund}");
                                }
                            }
                        }
                    }
                });

                return;
            }

            uint roundBlock = 2320640;
            uint startBlock = 2313827;
            uint endBlock   = 2320681;

            {
                var snap   = new Snapshot(api.GetToken("SOUL"), startBlock, endBlock);
                var export = snap.Export();
                File.WriteAllLines("souls_snap.csv", export.ToArray());
                return;
            }

            //startBlock = roundBlock;

            var soul_hash     = LuxUtils.ReverseHex("ed07cffad18f1308db51920d99a2af60ac66a7b3").HexToBytes();
            var soul_hash_int = new UInt160(soul_hash);

            var startT = Environment.TickCount;

            uint maxblock = 0;

            var blockCount = api.GetBlockHeight();

            var soul_balances = new Dictionary <UInt160, BigInteger>();
            var bought        = new Dictionary <UInt160, decimal>();

            BigInteger max_supply      = 91136510; // total token amount
            BigInteger team_supply     = 14500000; // team token amount
            BigInteger advisor_supply  = 5500000;  // advisor token amount
            BigInteger platform_supply = 15000000; // company token amount
            BigInteger presale_supply  = 43503435; // presale token amount

            BigInteger total_supply = team_supply + advisor_supply + presale_supply + platform_supply;

            var whitelist = new HashSet <UInt160>();

            var maybe    = new HashSet <UInt160>();
            var sure     = new HashSet <UInt160>();
            var expected = new Dictionary <UInt160, decimal>();

            var txlist = new List <string>();

            for (uint height = startBlock; height <= endBlock; height++)
            {
                var block = api.GetBlock(height);

                //Console.WriteLine(height + " " + block.Timestamp.ToString());

                foreach (var tx in block.transactions)
                {
                    if (tx.type == TransactionType.ContractTransaction)
                    {
                        foreach (var output in tx.outputs)
                        {
                            if (output.scriptHash == soul_hash_int)
                            {
                                /*foreach (var input in tx.inputs)
                                 * {
                                 *  var input_tx = api.GetTransaction(input.prevHash);
                                 *  var outp = input_tx.outputs[input.prevIndex];
                                 *  var sender = outp.scriptHash;
                                 *  Console.WriteLine($"refund,{tx.Hash},{sender.ToAddress()},{output.value}");
                                 *  break;
                                 * }*/
                            }
                        }

                        continue;
                    }

                    if (tx.type != TransactionType.InvocationTransaction)
                    {
                        continue;
                    }

                    List <AVMInstruction> ops;
                    try
                    {
                        ops = CronTools.Disassemble(tx.script);
                    }
                    catch
                    {
                        continue;
                    }

                    if (tx.Hash.ToString() == "0xcf530159dc7fa7d0ea38ca210b479b04da20039b3b6639cf4c06bf528d415339")
                    {
                        tx.gas += 0;
                    }

                    for (int i = 0; i < ops.Count; i++)
                    {
                        var op = ops[i];

                        if (op.opcode == OpCode.APPCALL && op.data.SequenceEqual(soul_hash))
                        {
                            var engine = new ExecutionEngine(null);
                            engine.LoadScript(tx.script);
                            engine.Execute(null);

                            var operation = engine.CurrentContext.EvaluationStack.Peek().GetString();
                            var args      = ((IEnumerable <StackItem>)engine.CurrentContext.EvaluationStack.Peek(1)).ToList();

                            var witnesses = new HashSet <UInt160>();
                            foreach (var input in tx.inputs)
                            {
                                var input_tx = api.GetTransaction(input.prevHash);
                                witnesses.Add(input_tx.outputs[input.prevIndex].scriptHash);
                            }

                            switch (operation)
                            {
                            case "mintTokens":
                            {
                                decimal neo_amount = 0;

                                foreach (var output in tx.outputs)
                                {
                                    if (output.scriptHash == soul_hash_int)
                                    {
                                        neo_amount += output.value;
                                    }
                                }

                                var sender     = witnesses.First();
                                var cur_bought = bought.ContainsKey(sender) ? bought[sender] : 0;

                                decimal refund = 0;

                                if (block.Height >= roundBlock)
                                {
                                    maybe.Add(sender);
                                    expected[sender] = neo_amount * 273;
                                }

                                if (!whitelist.Contains(sender))
                                {
                                    refund     = neo_amount;
                                    neo_amount = 0;
                                }
                                else
                                if (cur_bought + neo_amount > 10)
                                {
                                    var temp = neo_amount;
                                    neo_amount = 10 - cur_bought;

                                    refund = temp - neo_amount;
                                }

                                if (neo_amount > 0)
                                {
                                    BigInteger souls = (int)neo_amount * 273;

                                    /*if (souls + total_supply > max_supply)
                                     * {
                                     *  souls = max_supply - total_supply;
                                     * }*/

                                    total_supply += souls * 2;

                                    if (soul_balances.ContainsKey(sender))
                                    {
                                        soul_balances[sender] += new BigInteger((long)(souls * 100000000));
                                    }
                                    else
                                    {
                                        soul_balances[sender] = new BigInteger((long)(souls * 100000000));
                                    }

                                    Console.WriteLine(block.Height + "," + tx.Hash + ",mint," + soul_hash_int.ToAddress() + "," + sender.ToAddress() + "," + souls);
                                    cur_bought    += neo_amount;
                                    bought[sender] = cur_bought;
                                }
                                else
                                if (refund > 0)
                                {
                                    Console.WriteLine(block.Height + "," + tx.Hash + ",refund," + soul_hash_int.ToAddress() + "," + sender.ToAddress() + "," + refund);
                                }

                                break;
                            }

                            case "whitelistAddFree":
                            {
                                foreach (var addr in args)
                                {
                                    var hash = new UInt160(addr.GetByteArray());
                                    whitelist.Add(hash);
                                }
                                break;
                            }

                            case "whitelistAddFilled":
                            {
                                foreach (var addr in args)
                                {
                                    var hash = new UInt160(addr.GetByteArray());
                                    whitelist.Add(hash);

                                    bought[hash] = 2730;
                                }
                                break;
                            }

                            case "whitelistAddCap":
                            {
                                decimal cap = 0;

                                int index = 0;

                                foreach (var addr in args)
                                {
                                    if (index == 0)
                                    {
                                        var amount = addr.GetBigInteger();
                                        cap = (decimal)(amount / 100000000);
                                    }
                                    else
                                    {
                                        var hash = new UInt160(addr.GetByteArray());
                                        whitelist.Add(hash);

                                        bought[hash] = cap;
                                    }

                                    index++;
                                }
                                break;
                            }

                            case "chainSwap":
                            {
                                throw new Exception("Exploit found");
                                break;
                            }

                            case "deploy":
                            {
                                soul_balances[new UInt160("Abyd4BcStNksGLmfdHtyyPbS1xzhceDKLs".AddressToScriptHash())] = new BigInteger((long)6316538 * (long)100000000);
                                soul_balances[new UInt160("ARWHJefSbhayC2gurKkpjMHm5ReaJZLLJ3".AddressToScriptHash())] = new BigInteger((long)43503435 * (long)100000000);
                                soul_balances[new UInt160("AQFQmVQi9VReLhym1tF3UfPk4EG3VKbAwN".AddressToScriptHash())] = new BigInteger((long)15000000 * (long)100000000);

                                break;
                            }

                            case "transfer":
                            {
                                if (args.Count == 3)
                                {
                                    var from = new UInt160(args[0].GetByteArray());

                                    if (!witnesses.Contains(from))
                                    {
                                        //throw new Exception("Invalid");
                                    }

                                    if (maybe.Contains(from))
                                    {
                                        sure.Add(from);
                                    }

                                    var to    = new UInt160(args[1].GetByteArray());
                                    var value = args[2].GetBigInteger();

                                    var from_addr = from.ToAddress();
                                    var to_addr   = to.ToAddress();

                                    /*if (from == watch)
                                     * {
                                     *  Console.WriteLine("WATCH " + tx.Hash);
                                     * }
                                     * if (to == watch)
                                     * {
                                     *  Console.WriteLine("WATCH " + tx.Hash);
                                     * }*/


                                    decimal amount = (long)value;
                                    int     places = 8;
                                    while (places > 0)
                                    {
                                        amount *= 0.1m;
                                        places--;
                                    }

                                    Console.WriteLine(block.Height + "," + tx.Hash + ",transfer," + from.ToAddress() + "," + to.ToAddress() + "," + amount);
                                }

                                break;
                            }
                            }
                        }
                    }
                }
            }

            /*var lines = new List<string>();
             * foreach (var entry in soul_balances)
             * {
             *  var k = (long)entry.Value;
             *  if (k == 0)
             *  {
             *      continue;
             *  }
             *  var val = (decimal)k / 100000000m;
             *  lines.Add(entry.Key.ToAddress() + "," + val);
             * }
             * File.WriteAllLines("sale_soul.csv", lines.ToArray());*/

            var token = api.GetToken("SOUL");

            foreach (var entry in maybe)
            {
                var addr    = entry.ToAddress();
                var balance = token.BalanceOf(addr);

                if (balance >= expected[entry])
                {
                    sure.Add(entry);
                }
            }

            foreach (var entry in sure)
            {
                maybe.Remove(entry);
                Console.WriteLine(entry.ToAddress() + "," + expected[entry]);

                if (expected[entry] > 50 * 273)
                {
                    throw new Exception("AAAAAAAAA");
                }
            }

            foreach (var entry in maybe)
            {
                Console.WriteLine(entry.ToAddress() + ",0");
            }

            decimal total = 0;

            foreach (var entry in sure)
            {
                total += expected[entry];
            }
            Console.WriteLine("TOTAL " + total);

            var endT  = Environment.TickCount;
            var delta = (endT - startT) / 1000;

            Console.WriteLine("Finished in " + delta + " seconds, loaded " + maxblock + " blocks");

            Console.ReadLine();
            return;


            /*            Console.WriteLine(tkk.BalanceOf("AYxnCZePKhrijk2TQymYYUqm74nuwCftwq"));
             *          //var token = api.GetToken("SOUL");
             *          //var keys = KeyPair.FromWIF("KxnjzXUvK9BLojMrWVJF7jjdbHs37aXvHyFog4rARGNrAQ7LFjLP");
             *
             *          var token = api.GetToken("OBT");
             *          var keys = KeyPair.FromWIF("L5YiR4AdUibLeFf48W3P5P36aBTWANcDu6oQNkvpaQrrHreg4RZC");
             *
             *          var balance = token.BalanceOf(keys);
             *          Console.WriteLine(balance);
             *
             *          var transfers = new Dictionary<string, decimal>();
             *          transfers["AHXWzaYCNYBYvhSypfi2XpAiWz2cCXrDJr"] = 16.7m;
             *          transfers["AHxXMh9cPjE3cYrA9DhWNSBY2hC3a62PcH"] = 16.7m;
             *          transfers["AHY7SidKpLuNj881Mc4Vjsj1Y4jBbX5EPS"] = 16.7m;
             *
             *          var txx  = token.Transfer(keys, transfers);
             *          Console.WriteLine(txx.Hash);*/

            /*
             * uint startBlock = 2298101;
             * uint endblock = 2313169;
             *
             * var soul_hash = LuxUtils.ReverseHex("4b4f63919b9ecfd2483f0c72ff46ed31b5bbb7a4").HexToBytes();
             * var soul_hash_int = new UInt160(soul_hash);
             *
             *
             * var startT = Environment.TickCount;
             *
             * uint maxblock = 0;
             *
             * var blockCount = api.GetBlockHeight();
             *
             * var soul_balances = new Dictionary<UInt160, BigInteger>();
             * var bought = new Dictionary<UInt160, decimal>();
             *
             * BigInteger max_supply = 91136510; // total token amount
             * BigInteger team_supply = 14500000; // team token amount
             * BigInteger advisor_supply = 5500000; // advisor token amount
             * BigInteger platform_supply = 15000000; // company token amount
             * BigInteger presale_supply = 43503435; // presale token amount
             *
             * BigInteger total_supply = team_supply + advisor_supply + presale_supply + platform_supply;
             *
             * var watch = new UInt160( "AQkiyWfwxMT31epRRxWXbR7wvZJH944jqh".AddressToScriptHash());
             *
             * for (uint height = startBlock; height<=endblock; height++)
             * {
             *  var block = api.GetBlock(height);
             *
             *  //Console.WriteLine(height + " " + block.Timestamp.ToString());
             *
             *  foreach (var tx in block.transactions)
             *  {
             *      if (tx.type != TransactionType.InvocationTransaction)
             *      {
             *          continue;
             *      }
             *
             *      List<AVMInstruction> ops;
             *      try
             *      {
             *          ops = NeoTools.Disassemble(tx.script);
             *      }
             *      catch
             *      {
             *          continue;
             *      }
             *
             *      if (tx.Hash.ToString()== "0xcf530159dc7fa7d0ea38ca210b479b04da20039b3b6639cf4c06bf528d415339")
             *      {
             *          tx.gas += 0;
             *      }
             *
             *      for (int i = 0; i < ops.Count; i++)
             *      {
             *          var op = ops[i];
             *
             *          if (op.opcode == OpCode.APPCALL && op.data.SequenceEqual(soul_hash))
             *          {
             *              var engine = new ExecutionEngine(null);
             *              engine.LoadScript(tx.script);
             *              engine.Execute(null);
             *
             *              var operation = engine.EvaluationStack.Peek().GetString();
             *
             *              var witnesses = new HashSet<UInt160>();
             *              foreach (var input in tx.inputs)
             *              {
             *                  var input_tx = api.GetTransaction(input.prevHash);
             *                  witnesses.Add(input_tx.outputs[input.prevIndex].scriptHash);
             *              }
             *
             *              switch (operation)
             *              {
             *                  case "mintTokens":
             *                      {
             *                          decimal neo_amount = 0;
             *
             *                          if (block.Timestamp.ToTimestamp() < 1526947200)
             *                          {
             *                              break;
             *                          }
             *
             *                          if (block.Height> 2298690)
             *                          {
             *                              break;
             *                          }
             *
             *                          foreach (var output in tx.outputs)
             *                          {
             *                              if (output.scriptHash == soul_hash_int)
             *                              {
             *                                  neo_amount += output.value;
             *                              }
             *                          }
             *
             *                          var sender = witnesses.First();
             *                          var cur_bought = bought.ContainsKey(sender) ? bought[sender] : 0;
             *
             *                          if (cur_bought + neo_amount > 10)
             *                          {
             *                              neo_amount = 10 - cur_bought;
             *                          }
             *
             *                          foreach (var wit in witnesses)
             *                          {
             *                              if (wit == watch)
             *                              {
             *                                  Console.WriteLine("WATCH " + tx.Hash);
             *                                  break;
             *                              }
             *                          }
             *
             *                          if (neo_amount > 0)
             *                          {
             *                              BigInteger souls = (int)neo_amount * 273;
             *                              //if (souls + total_supply > max_supply)
             *                              //{
             *                                //  souls = max_supply - total_supply;
             *                              //}
             *
             *                              total_supply += souls * 2;
             *
             *                              if (soul_balances.ContainsKey(sender))
             *                              {
             *                                  soul_balances[sender] += new BigInteger((long)(souls * 100000000));
             *                              }
             *                              else
             *                              {
             *                                  soul_balances[sender] = new BigInteger((long)(souls * 100000000));
             *                              }
             *
             *                              Console.WriteLine(tx.Hash + ",mint," + soul_hash_int.ToAddress() + "," + sender.ToAddress() + "," + souls);
             *                              cur_bought += neo_amount;
             *                              bought[sender] = cur_bought;
             *                          }
             *
             *                          break;
             *                      }
             *
             *                  case "chainSwap":
             *                      {
             *                          throw new Exception("Exploit found");
             *                          break;
             *                      }
             *
             *                  case "transfer":
             *                      {
             *                          var args = (Neo.Lux.VM.Types.Array)engine.EvaluationStack.Peek(1);
             *
             *                          if (args.Count == 3)
             *                          {
             *                              var from = new UInt160(args[0].GetByteArray());
             *
             *                              if (!witnesses.Contains(from))
             *                              {
             *                                  //throw new Exception("Invalid");
             *                              }
             *
             *                              var to = new UInt160(args[1].GetByteArray());
             *                              var value = args[2].GetBigInteger();
             *
             *                              var from_addr = from.ToAddress();
             *                              var to_addr = to.ToAddress();
             *
             *                              if (from == watch)
             *                              {
             *                                  Console.WriteLine("WATCH " + tx.Hash);
             *                              }
             *                              if (to == watch)
             *                              {
             *                                  Console.WriteLine("WATCH " + tx.Hash);
             *                              }
             *
             *                              if (from_addr == "AdkLubeJgL3PCKc1Xv6CEv9PrzB4c5AKNk")
             *                              {
             *                                  value += 0;
             *                              }
             *
             *                              if (soul_balances.ContainsKey(from))
             *                              {
             *                                  var src_balance = soul_balances[from];
             *
             *                                  if (src_balance >= value)
             *                                  {
             *                                      src_balance -= value;
             *                                      soul_balances[from] = src_balance;
             *
             *                                      if (soul_balances.ContainsKey(to))
             *                                      {
             *                                          soul_balances[to] += value;
             *                                      }
             *                                      else
             *                                      {
             *                                          soul_balances[to] = value;
             *                                      }
             *                                  }
             *                              }
             *                              else
             *                              {
             *                                  throw new Exception("Invalid balance");
             *                              }
             *
             *                              decimal amount = (long)value;
             *                              int places = 8;
             *                              while (places > 0)
             *                              {
             *                                  amount *= 0.1m;
             *                                  places--;
             *                              }
             *
             *                              Console.WriteLine(tx.Hash + ",transfer," + from.ToAddress() + "," + to.ToAddress() + "," + amount);
             *                          }
             *
             *                          break;
             *                      }
             *              }
             *
             *          }
             *
             *      }
             *  }
             * }
             *
             * var lines = new List<string>();
             * foreach(var entry in soul_balances)
             * {
             *  var k = (long)entry.Value;
             *  if (k == 0)
             *  {
             *      continue;
             *  }
             *  var val = (decimal)k / 100000000m;
             *  lines.Add(entry.Key.ToAddress() + "," + val);
             * }
             * File.WriteAllLines("soul_snapshop.csv", lines.ToArray());
             *
             * var endT = Environment.TickCount;
             * var delta = (endT - startT) / 1000;
             * Console.WriteLine("Finished in " + delta + " seconds, loaded "+maxblock+" blocks");
             *
             * Console.ReadLine();
             */
        }
示例#14
0
        public static Storage GetStorage(this ExecutionEngine engine)
        {
            var emulator = engine.GetEmulator();

            return(emulator.GetStorage());
        }
示例#15
0
        public static Blockchain GetBlockchain(this ExecutionEngine engine)
        {
            var emulator = engine.GetEmulator();

            return(emulator.blockchain);
        }
示例#16
0
 public static bool GetAsset(ExecutionEngine engine)
 {
     //byte[] asset_id
     // returns Asset
     throw new NotImplementedException();
 }
示例#17
0
        /// <summary>
        /// Execute this test
        /// </summary>
        /// <param name="ut">Test</param>
        public void ExecuteTest(VMUT ut)
        {
            foreach (var test in ut.Tests)
            {
                // Interop service

                IInteropService service = new InteropService();

                // Message provider

                IScriptContainer scriptContainer = null;

                if (test.Message != null)
                {
                    scriptContainer = new MessageProvider(test.Message);
                }


                // Script table

                ScriptTable scriptTable = null;

                if (test.ScriptTable != null)
                {
                    scriptTable = new ScriptTable();

                    foreach (var script in test.ScriptTable)
                    {
                        scriptTable.Add(script.Script);
                    }
                }

                // Create engine

                using (var engine = new ExecutionEngine(scriptContainer, Crypto.Default, scriptTable, service))
                {
                    Debugger debugger = new Debugger(engine);
                    engine.LoadScript(test.Script);

                    // Execute Steps

                    if (test.Steps != null)
                    {
                        foreach (var step in test.Steps)
                        {
                            // Actions

                            if (step.Actions != null)
                            {
                                foreach (var run in step.Actions)
                                {
                                    switch (run)
                                    {
                                    case VMUTActionType.Execute: debugger.Execute(); break;

                                    case VMUTActionType.StepInto: debugger.StepInto(); break;

                                    case VMUTActionType.StepOut: debugger.StepOut(); break;

                                    case VMUTActionType.StepOver: debugger.StepOver(); break;
                                    }
                                }
                            }

                            // Review results

                            var add = string.IsNullOrEmpty(step.Name) ? "" : "-" + step.Name;

                            AssertResult(engine, step.Result, $"{ut.Category}-{ut.Name}-{test.Name}{add}: ");
                        }
                    }
                }
            }
        }
示例#18
0
 public TestOperator(TestModel model, ExecutionEngine engine) : base(engine)
 {
     this.logic = runtime => runtime.Resolve(engine.Create <string>(model.Nested));
 }
示例#19
0
 /// <summary>
 /// 获得该智能合约的脚本容器(最开始的触发者)
 /// </summary>
 /// <param name="engine">当前执行引擎</param>
 /// <returns>执行成功返回true</returns>
 protected bool ExecutionEngine_GetScriptContainer(ExecutionEngine engine)
 {
     engine.CurrentContext.EvaluationStack.Push(StackItem.FromInterface(engine.ScriptContainer));
     return(true);
 }
示例#20
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="engine">Engine</param>
 /// <param name="handle">Handle</param>
 /// <param name="value">Raw value</param>
 internal ByteArrayStackItem(ExecutionEngine engine, IntPtr handle, byte[] value) : base(engine, value)
 {
     NativeEngine = engine;
     _handle      = handle;
 }
示例#21
0
 /// <summary>
 /// 获得该智能合约的入口点(合约调用链的起点)的脚本哈希
 /// </summary>
 /// <param name="engine">当前执行引擎</param>
 /// <returns>执行成功返回true</returns>
 protected bool ExecutionEngine_GetEntryScriptHash(ExecutionEngine engine)
 {
     engine.CurrentContext.EvaluationStack.Push(engine.EntryContext.ScriptHash);
     return(true);
 }
示例#22
0
 public static bool GetValue(ExecutionEngine engine)
 {
     //TransactionOutput
     // returns long
     throw new NotImplementedException();
 }
示例#23
0
 /// <summary>
 /// 获得运行该智能合约的平台
 /// </summary>
 /// <param name="engine">当前执行引擎</param>
 /// <returns>执行成功返回true</returns>
 protected bool Runtime_Platform(ExecutionEngine engine)
 {
     engine.CurrentContext.EvaluationStack.Push(Encoding.ASCII.GetBytes("NEO"));
     return(true);
 }
示例#24
0
 protected bool CheckWitness(ExecutionEngine engine, ECPoint pubkey)
 {
     return(CheckWitness(engine, Contract.CreateSignatureRedeemScript(pubkey).ToScriptHash()));
 }
示例#25
0
 /// <summary>
 /// 获得该智能合约的触发条件(应用合约 or 鉴权合约)
 /// </summary>
 /// <param name="engine">当前执行引擎</param>
 /// <returns>执行成功返回true</returns>
 protected bool Runtime_GetTrigger(ExecutionEngine engine)
 {
     engine.CurrentContext.EvaluationStack.Push((int)Trigger);
     return(true);
 }
示例#26
0
 private bool Blockchain_GetValidators(ExecutionEngine engine)
 {
     ECPoint[] validators = Snapshot.GetValidators();
     engine.CurrentContext.EvaluationStack.Push(validators.Select(p => (StackItem)p.EncodePoint(true)).ToArray());
     return(true);
 }
示例#27
0
 /// <summary>
 /// 获得当前区块高度
 /// </summary>
 /// <param name="engine">当前执行引擎</param>
 /// <returns>执行成功则返回true</returns>
 protected bool Blockchain_GetHeight(ExecutionEngine engine)
 {
     engine.CurrentContext.EvaluationStack.Push(Snapshot.Height);
     return(true);
 }
示例#28
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
                        });
                    }
                }
            }
            engine.CurrentContext.EvaluationStack.Push(StackItem.FromInterface(contract));
            return(Contract_Destroy(engine));
        }
示例#29
0
 public static bool GetTransaction(ExecutionEngine engine)
 {
     //byte[] hash
     //returns Transaction
     throw new NotImplementedException();
 }
示例#30
0
 public static bool GetValidators(ExecutionEngine engine)
 {
     //returns byte[][]
     throw new NotImplementedException();
 }
示例#31
0
        public static Account GetAccount(this ExecutionEngine engine)
        {
            var emulator = engine.GetEmulator();

            return(emulator.currentAccount);
        }