private void QueryUnlockAmount(string method)
        {
            string api = accountFrmLock.RpcUrl;

            if (!CheckLockParameter())
            {
                return;
            }

            ScriptBuilder sb = new ScriptBuilder();

            sb.EmitAppCall(UInt160.Parse(tbxLockContract.Text), method, ZoroHelper.GetPublicKeyHashFromAddress(tbxLockerAddress.Text), Genesis.BcpContractAddress);

            try
            {
                var info = ZoroHelper.InvokeScript(api, sb.ToArray(), "");

                JObject json = JObject.Parse(info);
                if (json.ContainsKey("result"))
                {
                    JObject json_result = json["result"] as JObject;
                    JArray  stack       = json_result["stack"] as JArray;

                    string  result = ZoroHelper.GetJsonValue(stack[0] as JObject);
                    decimal value  = Math.Round(decimal.Parse(result) / (decimal)Math.Pow(10, 8), 8);

                    rtbxLockReturnResult.Text = "金额:" + value.ToString();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        private void btnNep5Refresh_Click(object sender, EventArgs e)
        {
            string api = nep5AccountFrm.RpcUrl;

            if (string.IsNullOrEmpty(tbxNep5Hash.Text))
            {
                MessageBox.Show("合约 Hash 不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (string.IsNullOrEmpty(tbxMyAddress.Text))
            {
                MessageBox.Show("查询地址不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            try
            {
                var           addressHash = ZoroHelper.GetPublicKeyHashFromAddress(tbxMyAddress.Text);
                ScriptBuilder sb          = new ScriptBuilder();

                if (tbxNep5Hash.Text == "0x0000000000000000000000000000000000000001" || tbxNep5Hash.Text == "0x0000000000000000000000000000000000000002")
                {
                    sb.EmitSysCall("Zoro.NativeNEP5.Call", "BalanceOf", UInt160.Parse(tbxNep5Hash.Text), addressHash);
                }
                else
                {
                    sb.EmitAppCall(UInt160.Parse(tbxNep5Hash.Text), "balanceOf", addressHash);
                }

                var info = ZoroHelper.InvokeScript(api, sb.ToArray(), "");

                JObject json = JObject.Parse(info);
                if (json.ContainsKey("result"))
                {
                    JObject json_result = json["result"] as JObject;
                    JArray  stack       = json_result["stack"] as JArray;

                    string  result = ZoroHelper.GetJsonValue(stack[0] as JObject);
                    decimal value  = Math.Round(decimal.Parse(result) / (decimal)Math.Pow(10, 8), 8);

                    lblNep5Balance.Text = value.ToString();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        //Invoke
        private void btnInvoke_Click(object sender, EventArgs e)
        {
            string api = invokeAccountFrm.RpcUrl;

            if (string.IsNullOrEmpty(tbxContractScriptHash.Text))
            {
                MessageBox.Show("合约 Hash 不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (string.IsNullOrEmpty(tbxMethodName.Text))
            {
                MessageBox.Show("调用接口不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            ScriptBuilder sb = new ScriptBuilder();

            if (!string.IsNullOrEmpty(rtbxParameterJson.Text))
            {
                try
                {
                    List <dynamic> paraList = GetParameterArray(rtbxParameterJson.Text);
                    sb.EmitAppCall(UInt160.Parse(tbxContractScriptHash.Text), tbxMethodName.Text, paraList.ToArray());
                }
                catch
                {
                    MessageBox.Show("参数格式错误!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else
            {
                sb.EmitAppCall(UInt160.Parse(tbxContractScriptHash.Text), tbxMethodName.Text);
            }

            try
            {
                var info = ZoroHelper.InvokeScript(api, sb.ToArray(), "");

                rtbxReturnJson.Text = info;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        private void GetBalance()
        {
            try
            {
                UInt160 bcpAssetId = Genesis.BcpContractAddress;
                UInt160 bctAssetId = Genesis.BctContractAddress;

                using (ScriptBuilder sb = new ScriptBuilder())
                {
                    sb.EmitSysCall("Zoro.NativeNEP5.Call", "BalanceOf", bcpAssetId, addressHash);
                    sb.EmitSysCall("Zoro.NativeNEP5.Call", "Decimals", bcpAssetId);

                    var info  = ZoroHelper.InvokeScript(RpcUrl, sb.ToArray(), "");
                    var value = GetBalanceFromJson(info);

                    lblBcpBalance.Text = value;
                }

                using (ScriptBuilder sb = new ScriptBuilder())
                {
                    sb.EmitSysCall("Zoro.NativeNEP5.Call", "BalanceOf", bctAssetId, addressHash);
                    sb.EmitSysCall("Zoro.NativeNEP5.Call", "Decimals", bctAssetId);

                    var info  = ZoroHelper.InvokeScript(RpcUrl, sb.ToArray(), "");
                    var value = GetBalanceFromJson(info);

                    lblBctBalance.Text = value;
                }

                //using (ScriptBuilder sb = new ScriptBuilder())
                //{
                //    sb.EmitSysCall("Zoro.NativeNEP5.Call", "BalanceOf", bcsAssetId, addressHash);
                //    sb.EmitSysCall("Zoro.NativeNEP5.Call", "Decimals", bcsAssetId);

                //    var info = ZoroHelper.InvokeScript(RpcUrl, sb.ToArray(), "");
                //    var value = GetBalanceFromJson(info);

                //    lblBcsBalance.Text = value;

                //}
            }
            catch (Exception ex)
            {
                MessageBox.Show("获取余额出错!" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        private void btnCallInvoke_Click(object sender, EventArgs e)
        {
            string api = otherCallAccountFrm.RpcUrl;

            if (string.IsNullOrEmpty(otherCallAccountFrm.wif))
            {
                MessageBox.Show("请输入钱包 wif !", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            if (string.IsNullOrEmpty(tbxCallInterface.Text))
            {
                MessageBox.Show("调用接口不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            ScriptBuilder sb = new ScriptBuilder();

            if (!string.IsNullOrEmpty(rtbxCallParams.Text))
            {
                try
                {
                    List <dynamic> paraList = GetParameterArray(rtbxCallParams.Text);
                    sb.EmitSysCall(tbxCallInterface.Text, paraList.ToArray());
                }
                catch
                {
                    MessageBox.Show("参数格式错误!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            try
            {
                var info = ZoroHelper.InvokeScript(api, sb.ToArray(), "");
                rtbxCallResult.Text = info;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        private void GetLockTimestamp(string method)
        {
            string api = accountFrmLock.RpcUrl;

            if (!CheckLockParameter())
            {
                return;
            }

            ScriptBuilder sb = new ScriptBuilder();

            sb.EmitAppCall(UInt160.Parse(tbxLockContract.Text), method, ZoroHelper.GetPublicKeyHashFromAddress(tbxLockerAddress.Text), Genesis.BcpContractAddress);

            try
            {
                var info = ZoroHelper.InvokeScript(api, sb.ToArray(), "");

                JObject json = JObject.Parse(info);
                if (json.ContainsKey("result"))
                {
                    JObject json_result = json["result"] as JObject;
                    JArray  stack       = json_result["stack"] as JArray;

                    string result = ZoroHelper.GetJsonValue(stack[0] as JObject);
                    long   value  = long.Parse(result);

                    DateTime dtStart  = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
                    long     lTime    = long.Parse(value + "0000000");
                    TimeSpan toNow    = new TimeSpan(lTime);
                    DateTime targetDt = dtStart.Add(toNow);

                    rtbxLockReturnResult.Text = "上次解锁时间:" + targetDt.ToString();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        private void GetUnlockInterval(string method)
        {
            string api = accountFrmLock.RpcUrl;

            if (!CheckLockParameter())
            {
                return;
            }

            ScriptBuilder sb = new ScriptBuilder();

            sb.EmitAppCall(UInt160.Parse(tbxLockContract.Text), method, ZoroHelper.GetPublicKeyHashFromAddress(tbxLockerAddress.Text), Genesis.BcpContractAddress);

            try
            {
                var info = ZoroHelper.InvokeScript(api, sb.ToArray(), "");

                JObject json = JObject.Parse(info);
                if (json.ContainsKey("result"))
                {
                    JObject json_result = json["result"] as JObject;
                    JArray  stack       = json_result["stack"] as JArray;

                    string result = ZoroHelper.GetJsonValue(stack[0] as JObject);
                    long   value  = long.Parse(result);

                    TimeSpan timeSpan = new TimeSpan(value * 10000000);

                    rtbxLockReturnResult.Text = "解锁时间间隔:" + timeSpan.ToString() + " S";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }