private static WithdrawInfo GetTransferInfo(string coinType, string txid, JArray jValue, JToken tx) { var address = ZoroHelper.GetJsonAddress((JObject)jValue[1]); var amount = ZoroHelper.GetJsonDecimal((JObject)jValue[3], 8); if (((JArray)tx["attributes"]).Count > 0) { JObject attribute = (JObject)tx["attributes"][0]; string usage = (string)attribute["usage"]; string data = Encoding.UTF8.GetString(ZoroHelper.HexString2Bytes((string)attribute["data"])); if (usage != "Remark1") { return(null); } WithdrawInfo withdrawInfo = new WithdrawInfo(); withdrawInfo.Method = "withdraw"; withdrawInfo.FromAddress = address; withdrawInfo.ReceiveAddress = data; withdrawInfo.Value = amount; withdrawInfo.CoinType = coinType; Logger.Info("Zoro destroy: Address:" + withdrawInfo.FromAddress + ", CoinType:" + withdrawInfo.CoinType + " , Value:" + withdrawInfo.Value + ", Txid: " + txid); return(withdrawInfo); } return(null); }
private void GetBalance(UInt160 assetHash, WalletAccount account) { using (ScriptBuilder sb = new ScriptBuilder()) { sb.EmitAppCall(assetHash, "balanceOf", account.ScriptHash); sb.EmitAppCall(assetHash, "decimals"); sb.EmitAppCall(assetHash, "symbol"); var script = sb.ToArray().ToHexString(); Zoro.IO.Json.JArray _params = new Zoro.IO.Json.JArray(); _params.Add(""); _params.Add(script); var info = Handler.Process("invokescript", _params); JObject json = JObject.Parse(info.ToString()); if (json.ContainsKey("stack")) { JArray stack = json["stack"] as JArray; if (stack[0]["value"].ToString() == "" || stack[1]["value"].ToString() == "" || stack[2]["value"].ToString() == "") { return; } string value = ZoroHelper.GetJsonValue((JObject)stack[0]); string decimals = BigInteger.Parse(stack[1]["value"].ToString()).ToString(); string symbol = Encoding.UTF8.GetString(ZoroHelper.HexString2Bytes(stack[2]["value"].ToString())); decimal balance = Math.Round(decimal.Parse(value) / (decimal)Math.Pow(10, double.Parse(decimals)), int.Parse(decimals)); if (balance > 0) { IsShow = true; this.lblAddress.Text = account.Address; this.lblAsset.Text = assetHash.ToString() + "(" + symbol + ")"; this.lblBalance.Text = balance.ToString(); Account = account; AssetHash = assetHash; AssetSymbol = symbol; Decimals = int.Parse(decimals); } } } }
private void GetBalance(UInt160 assetHash, WalletAccount account) { try { using (ScriptBuilder sb = new ScriptBuilder()) { if (assetHash == Genesis.BcpContractAddress || assetHash == Genesis.BctContractAddress) { sb.EmitSysCall("Zoro.NativeNEP5.Call", "BalanceOf", assetHash, Account.ScriptHash); sb.EmitSysCall("Zoro.NativeNEP5.Call", "Decimals", assetHash); sb.EmitSysCall("Zoro.NativeNEP5.Call", "Symbol", assetHash); } else { sb.EmitAppCall(assetHash, "balanceOf", account.ScriptHash); sb.EmitAppCall(assetHash, "decimals"); sb.EmitAppCall(assetHash, "symbol"); } var script = sb.ToArray().ToHexString(); Zoro.IO.Json.JArray _params = new Zoro.IO.Json.JArray(); _params.Add(""); _params.Add(script); Zoro.IO.Json.JObject info; info = Program.Handler.Process("invokescript", _params); JObject json = JObject.Parse(info.ToString()); string decimals; string symbol = ""; decimal balance = 0.00m; if (json.ContainsKey("stack")) { JArray stack = json["stack"] as JArray; symbol = Encoding.UTF8.GetString(ZoroHelper.HexString2Bytes(stack[2]["value"].ToString())); decimals = BigInteger.Parse(stack[1]["value"].ToString()).ToString(); if (stack[0]["value"].ToString() == "" || stack[1]["value"].ToString() == "" || stack[2]["value"].ToString() == "") { this.lblBalance.Text = "0.00"; this.btnTransfer.Enabled = false; } else { string value = ZoroHelper.GetJsonValue((JObject)stack[0]); balance = Math.Round(decimal.Parse(value) / (decimal)Math.Pow(10, double.Parse(decimals)), int.Parse(decimals)); if (balance != 0) { this.btnTransfer.Enabled = true; } } Account = account; AssetHash = assetHash; AssetSymbol = symbol; Decimals = int.Parse(decimals); } this.lblAsset.Text = assetHash.ToString() + "(" + symbol + ")"; this.lblBalance.Text = balance.ToString(); } } catch { return; } }
private static TransState TransParse(WebClient wc, JToken tx, ulong currentHeight, ulong blockTime) { TransState transState = new TransState(); List <WithdrawInfo> withdrawInfoList = new List <WithdrawInfo>(); string txid = tx["txid"].ToString(); var applicationlogInfo = GetApplicationlog(wc, txid); var executions = applicationlogInfo["executions"] as JToken; if (executions[0]["vmstate"].ToString() == "FAULT, BREAK") { return(null); } var notifications = executions[0]["notifications"] as JArray; if (notifications == null || notifications.Count == 0) { return(null); } for (int i = 0; i < notifications.Count; i++) { string contract = notifications[i]["contract"].ToString(); //nep5 foreach (var token in Config._nep5TokenHashDict) { if (contract == token.Value) { var jValue = notifications[i]["state"]["value"] as JArray; string method = Encoding.UTF8.GetString(ZoroHelper.HexString2Bytes(jValue[0]["value"].ToString())); if (method == "transfer") { //游戏发奖 退款 if (jValue[1]["value"].ToString() == Config._gameConfig.IssueAddressHexString) { SendGameIssueResult(currentHeight, blockTime, txid, token.Key, jValue, method); break; } //销毁 提币使用 if (jValue[2]["value"].ToString() == Config._destroyAddressHexString) { var withdrawInfo = GetTransferInfo(token.Key.ToUpper(), txid, jValue, tx); if (withdrawInfo != null) { withdrawInfoList.Add(withdrawInfo); } break; } //游戏中付款 else if (jValue[2]["value"].ToString() == Config._gameConfig.CollectionAddressHexString) { SendGameSpendResult(currentHeight, blockTime, txid, token.Key, jValue, method); break; } } break; } } //nep10 foreach (var token in Config._nftHashDict) { if (contract == token.Value) { var jValue = notifications[i]["state"]["value"] as JArray; string method = Encoding.UTF8.GetString(ZoroHelper.HexString2Bytes(jValue[0]["value"].ToString())); dynamic transLog = null; switch (method) { case "mintToken": transLog = MintTokenResult(jValue); break; case "transfer": transLog = TransferTokenResult(jValue); break; //case "modifyRwData": // transLog = ModifyRwDataResult(jValue); // break; case "modifyProperties": transLog = ModifyPropertiesResult(jValue); break; case "freeze": transLog = FreezeTokenResult(jValue); break; case "unfreeze": transLog = UnfreezeTokenResult(jValue); break; } if (transLog != null && !string.IsNullOrEmpty((string)transLog.tokenId)) { transLog.method = method; transLog.txid = txid; transLog.blockTime = blockTime; transLog.blockHeight = zoroHeight; string url = Config._gameConfig.GameUrl + "/sysGame/syncNFTInfo"; string jsonData = JsonConvert.SerializeObject(transLog); SendNftTrans(jsonData, url); } break; } } #region nftex //nft exchange //if (contract == Config._nftExchangeHash) //{ // var jValue = notifications[i]["state"]["value"] as JArray; // string method = Encoding.UTF8.GetString(ZoroHelper.HexString2Bytes(jValue[0]["value"].ToString())); // dynamic transLog = null; // switch (method) // { // case "deposit": // transLog = DepositResult(jValue); // break; // case "withdraw": // transLog = WithdrawResult(jValue); // break; // case "makeOffer": // transLog = MakeOfferResult(jValue); // break; // case "fillOffer": // transLog = FillOfferResult(jValue); // break; // case "cancelOffer": // transLog = CancelOffer(jValue); // break; // } // if (transLog != null) // { // transLog.Method = method; // transLog.Txid = txid; // transLog.blockTime = blockTime; // transLog.blockHeight = currentHeight; // //string url = Config._gameConfig.GameUrl + "/sysGame/transConfirm"; // //string jsonData = JsonConvert.SerializeObject(transLog); // //SendTransTimer(jsonData, url); // } // break; //} #endregion } if (withdrawInfoList.Count > 0) { transState.Txid = txid; transState.VmState = true; transState.Notifications = withdrawInfoList; return(transState); } return(null); }
private void BtnPublish_Click(object sender, EventArgs e) { if (contractScript.Length == 0) { MessageBox.Show("Contract file error!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } byte[] parameter__list = ZoroHelper.HexString2Bytes(tbxParameterType.Text); byte[] return_type = ZoroHelper.HexString2Bytes("05"); int need_storage = cbxNeedStorge.Checked == true ? 1 : 0; int need_nep4 = cbxNeedNep4.Checked == true ? 2 : 0; int need_canCharge = cbxNeedCharge.Checked == true ? 4 : 0; try { using (ScriptBuilder sb = new ScriptBuilder()) { var ss = need_storage | need_nep4 | need_canCharge; sb.EmitPush(tbxDescri.Text); sb.EmitPush(tbxEmail.Text); sb.EmitPush(tbxAuthor.Text); sb.EmitPush(tbxVersion.Text); sb.EmitPush(tbxContractName.Text); sb.EmitPush(ss); sb.EmitPush(return_type); sb.EmitPush(parameter__list); sb.EmitPush(contractScript); sb.EmitSysCall("Zoro.Contract.Create"); var tx = ZoroHelper.MakeTransaction(sb.ToArray(), walletAccount.GetKey(), Fixed8.Zero, Fixed8.FromDecimal(0.00001m)); Zoro.IO.Json.JArray _params = new Zoro.IO.Json.JArray(); _params.Add(""); _params.Add(tx.ToArray().ToHexString()); //var info = Program.Handler.Process("estimategas", _params); //JObject json_response = JObject.Parse(info.ToString()); //string json_gas_consumed = json_response["gas_consumed"].ToString(); //lblZoroFee.Text = json_gas_consumed; tx = ZoroHelper.MakeTransaction(sb.ToArray(), walletAccount.GetKey(), Fixed8.FromDecimal(decimal.Parse(lblZoroFee.Text)), Fixed8.FromDecimal(0.0001m)); string txid = tx.Hash.ToString(); var script = sb.ToArray().ToHexString(); Zoro.IO.Json.JArray _paramss = new Zoro.IO.Json.JArray(); _paramss.Add(""); _paramss.Add(tx.ToArray().ToHexString()); var result = Program.Handler.Process("sendrawtransaction", _paramss); string[] text = new string[] { "Result : " + result.ToString(), "Txid : " + txid }; tbxResult.Lines = text; } } catch (Exception ex) { MessageBox.Show("Published error:" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } }