-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
5bf7c4a
commit 7c8743e
Showing
1,216 changed files
with
525 additions
and
1,706,518 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,3 +24,4 @@ | |
/signtool/obj | ||
/locktool/obj | ||
/locktool/bin | ||
/packages |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,239 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Collections.Specialized; | ||
using System.IO; | ||
using System.Linq; | ||
using System.Net; | ||
using System.Net.Http; | ||
using System.Net.Http.Headers; | ||
using System.Text; | ||
using System.Threading.Tasks; | ||
|
||
namespace Demo | ||
{ | ||
|
||
public class Utxo | ||
{ | ||
//txid[n] 是utxo的属性 | ||
public ThinNeo.Hash256 txid; | ||
public int n; | ||
|
||
//asset资产、addr 属于谁,value数额,这都是查出来的 | ||
public string addr; | ||
public string asset; | ||
public decimal value; | ||
public Utxo(string _addr, ThinNeo.Hash256 _txid, string _asset, decimal _value, int _n) | ||
{ | ||
this.addr = _addr; | ||
this.txid = _txid; | ||
this.asset = _asset; | ||
this.value = _value; | ||
this.n = _n; | ||
} | ||
} | ||
public class Helper | ||
{ | ||
public static string MakeRpcUrlPost(string url, string method, out byte[] data, params MyJson.IJsonNode[] _params) | ||
{ | ||
//if (url.Last() != '/') | ||
// url = url + "/"; | ||
var json = new MyJson.JsonNode_Object(); | ||
json["id"] = new MyJson.JsonNode_ValueNumber(1); | ||
json["jsonrpc"] = new MyJson.JsonNode_ValueString("2.0"); | ||
json["method"] = new MyJson.JsonNode_ValueString(method); | ||
StringBuilder sb = new StringBuilder(); | ||
var array = new MyJson.JsonNode_Array(); | ||
for (var i = 0; i < _params.Length; i++) | ||
{ | ||
|
||
array.Add(_params[i]); | ||
} | ||
json["params"] = array; | ||
data = System.Text.Encoding.UTF8.GetBytes(json.ToString()); | ||
return url; | ||
} | ||
public static string MakeRpcUrl(string url, string method, params MyJson.IJsonNode[] _params) | ||
{ | ||
StringBuilder sb = new StringBuilder(); | ||
if (url.Last() != '/') | ||
url = url + "/"; | ||
|
||
sb.Append(url + "?jsonrpc=2.0&id=1&method=" + method + "¶ms=["); | ||
for (var i = 0; i < _params.Length; i++) | ||
{ | ||
_params[i].ConvertToString(sb); | ||
if (i != _params.Length - 1) | ||
sb.Append(","); | ||
} | ||
sb.Append("]"); | ||
return sb.ToString(); | ||
} | ||
|
||
|
||
|
||
public static async Task<List<Utxo>> GetUtxosToPay(string api, string _addr, string assetid, double number) | ||
{ | ||
MyJson.JsonNode_Object response = (MyJson.JsonNode_Object)MyJson.Parse(await Helper.HttpGet(api + "?method=getutxostopay&id=1¶ms=[" | ||
+ "'" + _addr + "','" + assetid + "'," + number + "]")); | ||
MyJson.JsonNode_Array resJA = (MyJson.JsonNode_Array)response["result"]; | ||
List<Utxo> list = new List<Utxo>(); | ||
foreach (MyJson.JsonNode_Object j in resJA) | ||
{ | ||
Utxo utxo = new Utxo(j["addr"].ToString(), new ThinNeo.Hash256(j["txid"].ToString()), j["asset"].ToString(), decimal.Parse(j["value"].ToString()), int.Parse(j["n"].ToString())); | ||
list.Add(utxo); | ||
} | ||
|
||
return list; | ||
} | ||
|
||
//获取地址的utxo来得出地址的资产 | ||
public static async Task<Dictionary<string, List<Utxo>>> GetBalanceByAddress(string api, string _addr) | ||
{ | ||
MyJson.JsonNode_Object response = (MyJson.JsonNode_Object)MyJson.Parse(await Helper.HttpGet(api + "?method=getutxo&id=1¶ms=['" + _addr + "']")); | ||
MyJson.JsonNode_Array resJA = (MyJson.JsonNode_Array)response["result"]; | ||
Dictionary<string, List<Utxo>> _dir = new Dictionary<string, List<Utxo>>(); | ||
foreach (MyJson.JsonNode_Object j in resJA) | ||
{ | ||
Utxo utxo = new Utxo(j["addr"].ToString(), new ThinNeo.Hash256(j["txid"].ToString()), j["asset"].ToString(), decimal.Parse(j["value"].ToString()), int.Parse(j["n"].ToString())); | ||
if (_dir.ContainsKey(j["asset"].ToString())) | ||
{ | ||
_dir[j["asset"].ToString()].Add(utxo); | ||
} | ||
else | ||
{ | ||
List<Utxo> l = new List<Utxo>(); | ||
l.Add(utxo); | ||
_dir[j["asset"].ToString()] = l; | ||
} | ||
|
||
} | ||
return _dir; | ||
} | ||
public static ThinNeo.Transaction makeTran(List<Utxo> utxos, string targetaddr, ThinNeo.Hash256 assetid, decimal sendcount, decimal extgas = 0, List<Utxo> utxos_ext = null, string extaddr = null) | ||
{ | ||
var tran = new ThinNeo.Transaction(); | ||
tran.type = ThinNeo.TransactionType.ContractTransaction; | ||
if (extgas >= 1) | ||
{ | ||
tran.version = 1;//0 or 1 | ||
} | ||
else | ||
{ | ||
tran.version = 0;//0 or 1 | ||
} | ||
tran.extdata = null; | ||
|
||
tran.attributes = new ThinNeo.Attribute[0]; | ||
var scraddr = ""; | ||
decimal count = decimal.Zero; | ||
List<ThinNeo.TransactionInput> list_inputs = new List<ThinNeo.TransactionInput>(); | ||
|
||
if (utxos != null) | ||
{ | ||
utxos.Sort((a, b) => | ||
{ | ||
if (a.value > b.value) | ||
return 1; | ||
else if (a.value < b.value) | ||
return -1; | ||
else | ||
return 0; | ||
}); | ||
for (var i = 0; i < utxos.Count; i++) | ||
{ | ||
ThinNeo.TransactionInput input = new ThinNeo.TransactionInput(); | ||
input.hash = utxos[i].txid; | ||
input.index = (ushort)utxos[i].n; | ||
list_inputs.Add(input); | ||
count += utxos[i].value; | ||
scraddr = utxos[i].addr; | ||
if (count >= sendcount) | ||
{ | ||
break; | ||
} | ||
} | ||
} | ||
decimal count_ext = decimal.Zero; | ||
if (utxos_ext != null) | ||
{ | ||
//手续费 | ||
ThinNeo.TransactionInput input = new ThinNeo.TransactionInput(); | ||
input.hash = utxos_ext[0].txid; | ||
input.index = (ushort)utxos_ext[0].n; | ||
count_ext = utxos_ext[0].value; | ||
list_inputs.Add(input); | ||
} | ||
|
||
tran.inputs = list_inputs.ToArray(); | ||
if (count >= sendcount)//输入大于等于输出 | ||
{ | ||
List<ThinNeo.TransactionOutput> list_outputs = new List<ThinNeo.TransactionOutput>(); | ||
//输出 | ||
if (sendcount > decimal.Zero && targetaddr != null) | ||
{ | ||
ThinNeo.TransactionOutput output = new ThinNeo.TransactionOutput(); | ||
output.assetId = assetid; | ||
output.value = sendcount; | ||
output.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(targetaddr); | ||
list_outputs.Add(output); | ||
} | ||
var change = count - sendcount - extgas; | ||
decimal extchange = decimal.Zero; | ||
//找零 | ||
if (utxos_ext != null) | ||
{ | ||
change = count - sendcount; | ||
extchange = count_ext - extgas; | ||
} | ||
else | ||
{ | ||
change = count - sendcount - extgas; | ||
} | ||
if (change > decimal.Zero) | ||
{ | ||
ThinNeo.TransactionOutput outputchange = new ThinNeo.TransactionOutput(); | ||
outputchange.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(scraddr); | ||
outputchange.value = change; | ||
outputchange.assetId = assetid; | ||
list_outputs.Add(outputchange); | ||
} | ||
if (extchange > decimal.Zero) | ||
{ | ||
ThinNeo.TransactionOutput outputchange = new ThinNeo.TransactionOutput(); | ||
outputchange.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(extaddr); | ||
outputchange.value = extchange; | ||
outputchange.assetId = assetid; | ||
list_outputs.Add(outputchange); | ||
} | ||
tran.outputs = list_outputs.ToArray(); | ||
} | ||
else | ||
{ | ||
throw new Exception("no enough money."); | ||
} | ||
return tran; | ||
} | ||
|
||
/// <summary> | ||
/// 同步get请求 | ||
/// </summary> | ||
/// <param name="url">链接地址</param> | ||
/// <param name="formData">写在header中的键值对</param> | ||
/// <returns></returns> | ||
|
||
public static async Task<string> HttpGet(string url) | ||
{ | ||
WebClient wc = new WebClient(); | ||
wc.Headers["content-type"] = "text/plain;charset=UTF-8"; | ||
|
||
return await wc.DownloadStringTaskAsync(url); | ||
} | ||
public static async Task<string> HttpPost(string url, byte[] data) | ||
{ | ||
WebClient wc = new WebClient(); | ||
wc.Headers["content-type"] = "text/plain;charset=UTF-8"; | ||
byte[] retdata = await wc.UploadDataTaskAsync(url, "POST", data); | ||
return System.Text.Encoding.UTF8.GetString(retdata); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.