Rimmon 3 лет назад
Родитель
Сommit
a9114684ae
2 измененных файлов с 116 добавлено и 20 удалено
  1. 104 16
      Models/Blockchain.cs
  2. 12 4
      Pages/Blockchains.razor

+ 104 - 16
Models/Blockchain.cs

@@ -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)
         {

+ 12 - 4
Pages/Blockchains.razor

@@ -98,10 +98,14 @@
     <div style="visibility: @contractAddDisabled">
         <button @onclick="AddContract">Add</button>
     </div>
+    <div>
+        <button @onclick="TestERC20">TestERC20</button>
+    </div>
+
     @*<div>
-        <button @onclick="TestHTTP">TestHTTP</button>
-    </div>*@
-    
+            <button @onclick="TestHTTP">TestHTTP</button>
+        </div>*@
+
     <p><input id="getsha3" size="100" @bind="sha3" name="getsha3" type="text" placeholder="SHA3" @bind:event="oninput" /></p>
     @*<button @onclick="GetSHA3_2">GetSHA3</button>*@
     @*<p>
@@ -168,7 +172,7 @@
 }
 @code
     {
-    AccountModel account;
+        AccountModel account;
     private Random r = new Random();
     private string bcURL = Blockchain.URLdefault;
     private int bcport = Blockchain.defaultPort;
@@ -192,6 +196,10 @@
         return ret;
     }
 
+    async Task TestERC20()
+    {
+        await Blockchain.GetMain().ImportERC20("0xe5D682717955d6C35d465A3485625C64655a04f4");
+    }
 
     async Task EstimateGas()
     {