void check_plat_notify(MyJson.IJsonNode json) { b_notify_need_refresh = false; var json_pending = json.AsDict()["pending"].AsList(); if (json_pending.Count > 0) {//有pending数据,开启定时器 b_notify_need_refresh = true; } var json_complete = json.AsDict()["complete"].AsList(); if (json_complete.Count > 0) { foreach (var item in json_complete) { string txid = item.AsDict()["txid"].ToString(); string ext = item.AsDict()["ext"].ToString(); if (!m_platNotifyTxids.ContainsKey(txid)) { //notify do_plat_notify(item, ext); m_platNotifyTxids[txid] = 1; } } } }
public void do_plat_notify(MyJson.IJsonNode json_complete, string ext = "") { string txid = json_complete.AsDict()["txid"].ToString(); switch (json_complete.AsDict()["type"].ToString()) { case "2": //sgas->gas退款 if (json_complete.AsDict()["state"].ToString() == "1") { if (ext == "") { //sgas->utxo确认 sdk_http._instance.transform_sgas_gas2(json_complete); } else { //utxo->gas提交成功,循环获取结果 doPlatNotifyRefundRes(txid, ext); } } else { api_tool._instance.walletNotify(roleInfo.getInstance().uid, roleInfo.getInstance().token, txid, global.netType, null); } break; } }
MyJson.JsonNode_Object getJsonResult(MyJson.JsonNode_Array json, string pos) { var pp = pos.Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries); if (pp[0] == "result") { MyJson.IJsonNode value = json; for (var i = 1; i < pp.Length; i++) { if (value is MyJson.JsonNode_Object && value.AsDict()["type"].AsString() == "Array") { value = value.AsDict()["value"]; } var index = int.Parse(pp[i]); value = value.AsList()[index]; } return(value.AsDict()); } return(null); }
IEnumerator HTTP_nel_post_sgas_gas2(MyJson.IJsonNode json_complete) { string txid = json_complete.AsDict()["txid"].ToString(); var nep55_shash = new ThinNeo.Hash160(global.id_sgas); string nep55_address = ThinNeo.Helper.GetAddressFromScriptHash(nep55_shash); WWWForm www_getuxo_form_2 = Helper.GetWWWFormPost("getutxo", new MyJson.JsonNode_ValueString(nep55_address)); WWW www_utxo_2 = new WWW(global.api, www_getuxo_form_2); yield return(www_utxo_2); Dictionary <string, List <Utxo> > _dir_2 = get_utxo(www_utxo_2.text); if (_dir_2.ContainsKey(global.id_GAS) == false) { Debug.Log("no gas"); } List <Utxo> newlist_2 = new List <Utxo>(); foreach (var utxo in _dir_2[global.id_GAS]) { if (utxo.n == 0 && utxo.txid.ToString().Equals(txid)) { newlist_2.Add(utxo); } } if (newlist_2.Count == 0) { Debug.Log("找不到要使用的UTXO"); yield return(null); } {//检查utxo byte[] script = null; using (var sb = new ThinNeo.ScriptBuilder()) { var array = new MyJson.JsonNode_Array(); array.AddArrayValue("(hex256)" + newlist_2[0].txid.ToString()); sb.EmitParamJson(array); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)getRefundTarget")); //参数倒序入 var shash = new ThinNeo.Hash160(global.id_sgas); sb.EmitAppCall(shash); //nep5脚本 script = sb.ToArray(); } WWWForm www_getTarget_form = Helper.GetWWWFormPost("invokescript", new MyJson.JsonNode_ValueString(ThinNeo.Helper.Bytes2HexString(script))); WWW www_form = new WWW(global.api, www_getTarget_form); yield return(www_form); var jsonCU = MyJson.Parse(www_form.text); var stack = jsonCU.AsDict()["result"].AsList()[0].AsDict()["stack"].AsList()[0].AsDict(); var value = stack["value"].AsString(); if (value.Length == 0)//未标记的UTXO,不能使用 { Debug.Log("这个utxo没有标记"); yield return(null); } var hash = new ThinNeo.Hash160(ThinNeo.Helper.HexString2Bytes(value)); if (hash.ToString() != ThinNeo.Helper.GetPublicKeyHashFromAddress(roleInfo.getInstance().address).ToString()) { Debug.Log("这个utxo不是标记给你用的"); Debug.Log(hash.ToString()); Debug.Log(ThinNeo.Helper.Bytes2HexString(roleInfo.getInstance().scripthash)); yield return(null); } } ThinNeo.Transaction tran_2 = Helper.makeTran(newlist_2, roleInfo.getInstance().address, new ThinNeo.Hash256(global.id_GAS), newlist_2[0].value); tran_2.type = ThinNeo.TransactionType.ContractTransaction; tran_2.version = 0; //sign and broadcast {//做智能合约的签名 byte[] n55contract = null; { WWWForm www_getState = Helper.GetWWWFormPost("getcontractstate", new MyJson.JsonNode_ValueString(global.id_sgas)); WWW www_state = new WWW(global.api, www_getState); yield return(www_state); var _json = MyJson.Parse(www_state.text).AsDict(); var _resultv = _json["result"].AsList()[0].AsDict(); n55contract = ThinNeo.Helper.HexString2Bytes(_resultv["script"].AsString()); } byte[] iscript = null; using (var sb = new ThinNeo.ScriptBuilder()) { sb.EmitPushNumber(0); sb.EmitPushNumber(0); iscript = sb.ToArray(); } tran_2.AddWitnessScript(n55contract, iscript); } var trandata_2 = tran_2.GetRawData(); var strtrandata_2 = ThinNeo.Helper.Bytes2HexString(trandata_2); ThinNeo.Transaction testde_2 = new ThinNeo.Transaction(); testde_2.Deserialize(new System.IO.MemoryStream(trandata_2)); WWWForm www_transaction_2 = Helper.GetWWWFormPost("sendrawtransaction", new MyJson.JsonNode_ValueString(strtrandata_2)); WWW www_tran_2 = new WWW(global.api, www_transaction_2); yield return(www_tran_2); Debug.Log(www_tran_2.text); var json_2 = MyJson.Parse(www_tran_2.text).AsDict(); if (json_2.ContainsKey("result")) { var resultv = json_2["result"].AsList()[0].AsDict(); var ext = resultv["txid"].AsString(); if (txid.Length > 0) { Debug.Log("txid=" + ext); testtool.panel_main.do_plat_notify(json_complete, ext); api_tool._instance.walletNotifyExt(roleInfo.getInstance().uid, roleInfo.getInstance().token, txid, ext, global.netType, null); } else { Debug.Log("交易失败"); } } else { Debug.Log("交易失败"); } }
async Task test_claimSimple() { var addr = ThinNeo.Helper.GetAddressFromScriptHash(Config.sneo); byte[] postdata; var url = Helper.MakeRpcUrlPost(Config.api, "getclaimgas", out postdata, new MyJson.JsonNode_ValueString(addr)); var result = await Helper.HttpPost(url, postdata); //Console.WriteLine("得到的结果是:" + result); var json = MyJson.Parse(result).AsDict(); if (json.ContainsKey("result")) { //gas总量 var gas = json["result"].AsList()[0].AsDict()["gas"] + ""; //var gas = 0.00004; //Console.WriteLine("gas:" + gas); var claims = json["result"].AsList()[0].AsDict()["claims"].AsList(); //Console.WriteLine("claims:" + claims); //var assetIDStr = "0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7"; //选择GAS支付合约调用费用 var assetID = HexString2Bytes(Config.id_GAS.Replace("0x", "")).Reverse().ToArray(); //构建交易体 ThinNeo.Transaction claimTran = new ThinNeo.Transaction { type = ThinNeo.TransactionType.ClaimTransaction,//领取Gas合约 attributes = new ThinNeo.Attribute[0], inputs = new ThinNeo.TransactionInput[0], outputs = new ThinNeo.TransactionOutput[1], extdata = new ThinNeo.ClaimTransData() }; claimTran.outputs[0] = new ThinNeo.TransactionOutput { assetId = assetID, toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(this.address), value = Decimal.Parse("0.00006552") }; Console.WriteLine("claim addr:" + this.address); List <ThinNeo.TransactionInput> claimVins = new List <ThinNeo.TransactionInput>(); MyJson.JsonNode_Array array = (MyJson.JsonNode_Array)claims; MyJson.IJsonNode node = array[0]; Console.WriteLine("claims:" + node); claimVins.Add(new ThinNeo.TransactionInput { hash = ThinNeo.Debug.DebugTool.HexString2Bytes((node.AsDict()["txid"].ToString()).Replace("0x", "")).Reverse().ToArray(), index = ushort.Parse(node.AsDict()["n"].ToString()) }); (claimTran.extdata as ThinNeo.ClaimTransData).claims = claimVins.ToArray(); //做智能合约的签名 byte[] iscript = null; using (var sb = new ThinNeo.ScriptBuilder()) { sb.EmitPushString("whatever"); sb.EmitPushNumber(250); iscript = sb.ToArray(); } claimTran.AddWitnessScript(n55contract, iscript); var trandata = claimTran.GetRawData(); var strtrandata = ThinNeo.Helper.Bytes2HexString(trandata); byte[] postdata2; url = Helper.MakeRpcUrlPost(Config.api, "sendrawtransaction", out postdata2, new MyJson.JsonNode_ValueString(strtrandata)); var result2 = await Helper.HttpPost(url, postdata2); Console.WriteLine("得到的结果是:" + result2); } }