|
@@ -5,11 +5,20 @@ using System.Linq;
|
|
|
using System.Threading.Tasks;
|
|
|
using Newtonsoft.Json;
|
|
|
using Console = HyperCube.Utils.AdvConsole;
|
|
|
+using System.Text.RegularExpressions;
|
|
|
|
|
|
//0xe5D682717955d6C35d465A3485625C64655a04f4 - HCB in rinkeby
|
|
|
|
|
|
namespace HyperCube.Models
|
|
|
{
|
|
|
+ public struct TransactionObject
|
|
|
+ {
|
|
|
+ public string from;
|
|
|
+ public string to;
|
|
|
+ public string data;
|
|
|
+ public string gas;
|
|
|
+ }
|
|
|
+
|
|
|
public class Blockchain
|
|
|
{
|
|
|
public static Blockchain Dev
|
|
@@ -226,6 +235,26 @@ namespace HyperCube.Models
|
|
|
return jsonDe.result;
|
|
|
}
|
|
|
|
|
|
+ public async Task<string> GetBalance(AccountModel account)
|
|
|
+ {
|
|
|
+ var addr = await account.GetOrCreateActualAddress(this);
|
|
|
+ var ret = await RunFunction("eth_getBalance", $"\"{addr}\",\"latest\"");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task<string> GetBalance(string address)
|
|
|
+ {
|
|
|
+ var ret = await RunFunction("eth_getBalance", $"\"{address}\",\"latest\"");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task<string> GetBalance()
|
|
|
+ {
|
|
|
+ var ret = await RunFunction("eth_getBalance", $"\"{address}\",\"latest\"");
|
|
|
+ var balanceInt = AccountModel.ConvertBalance(ret);
|
|
|
+ return balanceInt.ToString();
|
|
|
+ }
|
|
|
+
|
|
|
public async Task<string> RunFunction(string name, string parms)
|
|
|
{
|
|
|
Console.WriteLine($"RunFunction {name} params {parms}");
|
|
@@ -239,24 +268,89 @@ namespace HyperCube.Models
|
|
|
//return "test answer";
|
|
|
}
|
|
|
|
|
|
- public async Task<string> GetBalance(AccountModel account)
|
|
|
+ public async Task<string> RunFunction2(string name, TransactionObject to)
|
|
|
+ {
|
|
|
+ Dictionary<string, string> paramDict = new Dictionary<string, string>();
|
|
|
+ string parms = "{";
|
|
|
+ if (to.from != "")
|
|
|
+ paramDict["from"] = to.from;
|
|
|
+ //parms += "\"from\":" + to.from;
|
|
|
+ if (to.to != "")
|
|
|
+ paramDict["to"] = to.to;
|
|
|
+ //parms += "\"to\":"+to.to;
|
|
|
+
|
|
|
+ int count = 0;
|
|
|
+ foreach (var p in paramDict)
|
|
|
+ {
|
|
|
+ parms += $"\"{p.Key}\":\"{p.Value}\"";
|
|
|
+ count++;
|
|
|
+ if (paramDict.Count > count)
|
|
|
+ {
|
|
|
+ parms += ",";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Console.WriteLine($"RunFunction {name} params {parms}");
|
|
|
+ var req = $"{{ \"jsonrpc\":\"2.0\",\"method\":\"{name}\",\"params\":[{parms}], \"id\":1}}";
|
|
|
+
|
|
|
+ var answer = await Post.PostRequestAsync(this, req);
|
|
|
+ dynamic jsonDe = JsonConvert.DeserializeObject(answer);
|
|
|
+
|
|
|
+ Console.WriteLine("RunFunction result " + jsonDe.result);
|
|
|
+ return jsonDe.result;
|
|
|
+ //return "test answer";
|
|
|
+ }
|
|
|
+
|
|
|
+ async Task<string> mySHA3(string code)
|
|
|
{
|
|
|
- var addr = await account.GetOrCreateActualAddress(this);
|
|
|
- var ret = await RunFunction("eth_getBalance", $"\"{addr}\",\"latest\"");
|
|
|
+ var res = await Blockchain.GetSHA3(code);
|
|
|
+ Console.WriteLine($"GetSHA3 {code} {res}");
|
|
|
+ var ret = res.Substring(2, 8);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- public async Task<string> GetBalance(string address)
|
|
|
+ async Task<string> compileFunction(string input)
|
|
|
{
|
|
|
- var ret = await RunFunction("eth_getBalance", $"\"{address}\",\"latest\"");
|
|
|
- return ret;
|
|
|
+ string pattern = @"function\s+(\S+)\s*\((.*)\).*";
|
|
|
+ string replacement_name = "$1";
|
|
|
+ string replacement_params = "$2";
|
|
|
+ string resultname = Regex.Replace(input, pattern, replacement_name).Trim();
|
|
|
+ string param_pattern = @"(uint8|address)";
|
|
|
+ string final = resultname + "(";
|
|
|
+ if (input != resultname)
|
|
|
+ {
|
|
|
+ string resultparams = Regex.Replace(input, pattern, replacement_params).Trim();
|
|
|
+ if (input != resultparams)
|
|
|
+ {
|
|
|
+ int i = 0;
|
|
|
+ foreach (Match match in Regex.Matches(resultparams, param_pattern))
|
|
|
+ {
|
|
|
+ if (i > 0)
|
|
|
+ final += "," + match.Value;
|
|
|
+ else
|
|
|
+ final += match.Value;
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ string function_processed = final + ")";
|
|
|
+ string sha3 = await mySHA3(function_processed);
|
|
|
+
|
|
|
+ return sha3;
|
|
|
}
|
|
|
|
|
|
- public async Task<string> GetBalance()
|
|
|
+ public async Task<string> ImportERC20(string contractAddress)
|
|
|
{
|
|
|
- var ret = await RunFunction("eth_getBalance", $"\"{address}\",\"latest\"");
|
|
|
- var balanceInt = AccountModel.ConvertBalance(ret);
|
|
|
- return balanceInt.ToString();
|
|
|
+ //runfunction balanceOf totalSupply symbol name
|
|
|
+ //RunContractRead
|
|
|
+ TransactionObject to = new TransactionObject();
|
|
|
+ to.to = contractAddress;
|
|
|
+
|
|
|
+ //compile data
|
|
|
+ to.data = await compileFunction("name()");
|
|
|
+ var answer = await RunFunction2("eth_call", to);
|
|
|
+ //var answer = await RunFunction("eth_sendTransaction", $"{{\"from\":\"{address}\",\"to\":\"{contractAddress}\",\"gas\":\"{gas}\", \"data\":\"{data}\", \"value\":\"{value}\"}}");
|
|
|
+ Console.WriteLine("ImportERC20 "+ answer);
|
|
|
+ return answer;
|
|
|
}
|
|
|
|
|
|
public async void RunContractRead()
|
|
@@ -279,12 +373,6 @@ namespace HyperCube.Models
|
|
|
return answer;
|
|
|
}
|
|
|
|
|
|
- public async Task<string> ImportERC20(string contractAddress)
|
|
|
- {
|
|
|
- var answer = await RunFunction("eth_sendTransaction", $"{{\"from\":\"{address}\",\"to\":\"{contractAddress}\",\"gas\":\"{gas}\", \"data\":\"{data}\", \"value\":\"{value}\"}}");
|
|
|
- return answer;
|
|
|
- }
|
|
|
-
|
|
|
//{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{ "from":"0xD81eeE6b39d9556c3067A3551A3FB2882b92F327", "to":"0x119b58faddcdbc09cafcd272530aa079cec10004", "gas":"0x31b2ef", "data":"0x11111111"}], "id":1}
|
|
|
public async Task<string> RunContractWrite(string contractAddress, string data, string gas, string value)
|
|
|
{
|