Skip to content

Commit

Permalink
add locktool
Browse files Browse the repository at this point in the history
  • Loading branch information
lightszero committed Jan 31, 2019
1 parent 5bf7c4a commit 7c8743e
Show file tree
Hide file tree
Showing 1,216 changed files with 525 additions and 1,706,518 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,4 @@
/signtool/obj
/locktool/obj
/locktool/bin
/packages
239 changes: 239 additions & 0 deletions locktool/Helper.cs
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 + "&params=[");
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&params=["
+ "'" + _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&params=['" + _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);
}
}
}
58 changes: 41 additions & 17 deletions locktool/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,48 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:locktool"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
Title="MainWindow" Height="580.106" Width="1212.997">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="16*"/>
<ColumnDefinition Width="83*"/>
</Grid.ColumnDefinitions>
<TextBlock HorizontalAlignment="Left" Margin="68,82,0,0" TextWrapping="Wrap" Text="pubkey" VerticalAlignment="Top" Width="83" Grid.Column="1"/>
<Button Content="gen LockAddress" HorizontalAlignment="Left" Margin="68,215,0,0" VerticalAlignment="Top" Width="178" Click="Button_Click" Grid.Column="1"/>
<TextBox x:Name="txt_pubkey" HorizontalAlignment="Left" Height="23" Margin="128,81,0,0" TextWrapping="Wrap" Text="02bf055764de0320c8221920d856d3d9b93dfc1dcbc759a560fd42553aa025ba5c" VerticalAlignment="Top" Width="489" Grid.Column="1"/>
<TextBlock x:Name="label_addr" HorizontalAlignment="Left" Margin="92,104,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Grid.Column="1"/>
<TextBlock x:Name="label_lockscript" HorizontalAlignment="Left" Margin="105,38,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Grid.ColumnSpan="2"/>
<DatePicker x:Name="datepicker" Grid.Column="1" HorizontalAlignment="Left" Margin="92,124,0,0" VerticalAlignment="Top" Width="309"/>
<TextBlock x:Name="label_time" Grid.Column="1" HorizontalAlignment="Left" Margin="92,163,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
<TextBox x:Name="txt_time" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="429,124,0,0" TextWrapping="Wrap" Text="12:00:00" VerticalAlignment="Top" Width="120"/>
<TextBlock x:Name="label_timeutc" Grid.Column="1" HorizontalAlignment="Left" Margin="92,183,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
<TextBlock x:Name="txt_addrout" Grid.Column="1" HorizontalAlignment="Left" Margin="68,358,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
<Label Content="锁仓合约脚本生成" HorizontalAlignment="Left" Margin="105,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="-3.113,0.141" Grid.ColumnSpan="2"/>
<TextBox x:Name="txt_contract" Grid.Column="1" HorizontalAlignment="Left" Height="114" Margin="68,239,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="333" IsReadOnlyCaretVisible="True"/>
<GroupBox Header="锁仓合约设置" HorizontalAlignment="Left" Height="396" VerticalAlignment="Top" Width="574">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="16*"/>
<ColumnDefinition Width="83*"/>
</Grid.ColumnDefinitions>
<TextBlock HorizontalAlignment="Left" Margin="11,71,0,0" TextWrapping="Wrap" Text="pubkey" VerticalAlignment="Top" Width="83"/>
<Button Content="gen LockAddress" HorizontalAlignment="Left" Margin="71,199,0,0" VerticalAlignment="Top" Width="178" Click="Button_Click" Grid.ColumnSpan="2"/>
<TextBox x:Name="txt_pubkey" HorizontalAlignment="Left" Height="23" Margin="71,70,0,0" TextWrapping="Wrap" Text="02bf055764de0320c8221920d856d3d9b93dfc1dcbc759a560fd42553aa025ba5c" VerticalAlignment="Top" Width="489" Grid.ColumnSpan="2"/>
<TextBlock x:Name="label_addr" HorizontalAlignment="Left" Margin="39,98,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Grid.ColumnSpan="2" Width="499"/>
<TextBlock x:Name="label_lockscript" HorizontalAlignment="Left" Margin="6,32,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Grid.ColumnSpan="2" Width="532"/>
<DatePicker x:Name="datepicker" HorizontalAlignment="Left" Margin="41,119,0,0" VerticalAlignment="Top" Width="309" Grid.ColumnSpan="2"/>
<TextBlock x:Name="label_time" HorizontalAlignment="Left" Margin="41,159,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Grid.ColumnSpan="2" Width="439"/>
<TextBox x:Name="txt_time" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="255,119,0,0" TextWrapping="Wrap" Text="12:00:00" VerticalAlignment="Top" Width="120"/>
<TextBlock x:Name="label_timeutc" HorizontalAlignment="Left" Margin="41,179,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Grid.ColumnSpan="2" Width="439"/>
<TextBox x:Name="txt_contract" HorizontalAlignment="Left" Height="73" Margin="41,223,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="519" IsReadOnlyCaretVisible="True" Grid.ColumnSpan="2" IsReadOnly="True"/>
<TextBox x:Name="txt_addrout" HorizontalAlignment="Left" Height="23" Margin="41,327,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="519" Grid.ColumnSpan="2" IsReadOnly="True"/>

</Grid>
</GroupBox>
<GroupBox Header="提款" HorizontalAlignment="Left" Height="510" Margin="579,10,0,0" VerticalAlignment="Top" Width="569">
<Grid>
<Button Content="资产查询" HorizontalAlignment="Left" Margin="13,42,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1" RenderTransformOrigin="0.496,1.873"/>
<ListBox x:Name="listAsset" HorizontalAlignment="Left" Height="100" Margin="13,66,0,0" VerticalAlignment="Top" Width="537"/>
<TextBox HorizontalAlignment="Left" Height="23" Margin="48,3,0,0" TextWrapping="Wrap" Text="https://api.nel.group/api/testnet" VerticalAlignment="Top" Width="439"/>
<Button Content="提取Nep5,广播 慎点" HorizontalAlignment="Left" Margin="10,225,0,0" VerticalAlignment="Top" Width="111" RenderTransformOrigin="-0.782,-1.254" Click="Button_Click_2" Background="#FFFFBF37"/>
<TextBlock HorizontalAlignment="Left" Margin="13,166,0,0" TextWrapping="Wrap" Text="提取目标地址" VerticalAlignment="Top"/>
<TextBox x:Name="txt_get_addr" HorizontalAlignment="Left" Height="23" Margin="114,166,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="387"/>
<TextBlock HorizontalAlignment="Left" Margin="13,192,0,0" TextWrapping="Wrap" Text="提取数量" VerticalAlignment="Top" RenderTransformOrigin="1.011,1.571"/>
<TextBox x:Name="txt_get_balance" HorizontalAlignment="Left" Height="23" Margin="114,194,0,0" TextWrapping="Wrap" Text="9.9" VerticalAlignment="Top" Width="387"/>
<TextBox x:Name="txt_get_result" HorizontalAlignment="Left" Height="105" Margin="13,249,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="534" IsReadOnlyCaretVisible="True" IsReadOnly="True"/>
<TextBox x:Name="txt_get_srcaddr" HorizontalAlignment="Left" Height="23" Margin="114,38,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="373" IsReadOnly="True"/>
<TextBlock HorizontalAlignment="Left" Margin="126,225,0,0" TextWrapping="Wrap" Text="wif" VerticalAlignment="Top" RenderTransformOrigin="1.973,0.167"/>
<TextBox x:Name="txt_wifGetter" HorizontalAlignment="Left" Height="23" Margin="148,221,0,0" TextWrapping="Wrap" Text="L2CmHCqgeNHL1i9XFhTLzUXsdr5LGjag4d56YY98FqEi4j5d83Mv" VerticalAlignment="Top" Width="402"/>
<TextBox x:Name="txt_bc_result" HorizontalAlignment="Left" Height="95" Margin="13,383,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="534" IsReadOnly="True" IsReadOnlyCaretVisible="True"/>
<Button Content="生成交易Only,不签名不广播" HorizontalAlignment="Left" Margin="13,359,0,0" VerticalAlignment="Top" Width="187" Click="Button_Click_5"/>
<Button Content="生成交易Only,只签名不广播" HorizontalAlignment="Left" Margin="227,359,0,0" VerticalAlignment="Top" Width="187" Click="Button_Click_4"/>

</Grid>
</GroupBox>

</Grid>
</Window>
Loading

0 comments on commit 7c8743e

Please sign in to comment.