Ver código fonte

работа с тестовой сетью Rinkeby + много всякий правок

Rimmon 3 anos atrás
pai
commit
912dc8a8b7

+ 53 - 7
Models/AccountModel.cs

@@ -12,7 +12,15 @@ namespace HyperCube.Models
     {
         //public event EventHandler<int> RolesChanged;
         public Action<int> RolesChanged;
-        public byte blockchain_selected;
+        public byte bsel;
+        public byte blockchain_selected
+        {
+            get { return bsel; }
+            set {               
+                bsel = value;
+                bcselupdate();
+            }
+        }
         public List<Role> Roles = new();
 
         public void AddRole(Role role)
@@ -22,6 +30,11 @@ namespace HyperCube.Models
             Console.WriteLine($"role added, count: {Roles.Count}");
         }
 
+        async Task bcselupdate()
+        {
+            MySQLConnector.Instance().SQLInsert($"update aspnetusers set blockchain_selected = {blockchain_selected} where Id='{UUID}'");
+        }
+
         public void RemoveRole(Role role)
         {
             Roles.Remove(role);
@@ -31,16 +44,49 @@ namespace HyperCube.Models
 
         public static Dictionary<string, AccountModel> Loaded = new();
         public static AccountModel Current;
-        public string eth_address { get; set; }
-        public string eth_address1 { get; set; }
+        string eth_address { get; set; }
+        string eth_address1 { get; set; }
         /// <summary>
         /// ASP Identity ID
         /// </summary>
         public string UUID { get; set; }
         public string Name { get; set; }
         public string Email { get; set; }
+        public string PWDHash { get; set; }
         public Role AccRole { get; set; }
 
+        public string GetActualAddress(Blockchain bc)
+        {
+            string addr;
+            if (bc.port == 8666)
+                addr = eth_address1;
+            else
+                addr = eth_address;
+
+            return addr;
+        }
+
+        public async Task<string> GetOrCreateActualAddress(Blockchain bc)
+        {
+            string addr;
+            if (bc.port == 8666)
+                addr = eth_address1;
+            else
+                addr = eth_address;
+
+            if (addr == null || addr == "")
+                addr = await bc.CreateBlockchainAccount(this, PWDHash);
+            return addr;
+        }
+
+        public void SetActualAddress(string value, Blockchain bc)
+        {
+            if (bc.port == 8666)
+                eth_address1 = value;
+            else
+                eth_address = value;
+        }
+
         public AccountModel()
         {
         }
@@ -122,10 +168,10 @@ namespace HyperCube.Models
             }            
         }
 
-        public async Task CreateEthAddress(string pass)
-        {
-            var addr = await Blockchain.GetMain().CreateBlockchainAccount(this, pass);
-        }
+        //public async Task CreateEthAddress(string pass)
+        //{
+        //    var addr = await Blockchain.GetMain().CreateBlockchainAccount(this, pass);
+        //}
 
         public async Task<string> GetBalance()
         {

+ 58 - 21
Models/Blockchain.cs

@@ -57,6 +57,13 @@ namespace HyperCube.Models
             }
         }
 
+        public static Blockchain Find(int id)
+        {
+            if (loaded.ContainsKey(id))
+                return loaded[id];            
+            return null;
+        }
+
         public async Task<string> Initialize()
         {
             if (!loaded.ContainsKey(id))
@@ -70,6 +77,14 @@ namespace HyperCube.Models
             return $"{name} {url}:{port}";
         }
 
+        public static string dec2hex(int decValue, bool prefix = true)
+        {
+            string hexValue = decValue.ToString("X");
+            if (prefix)
+                hexValue = "0x"+hexValue;
+            return hexValue;
+        }
+
         //public static Blockchain GetInstance()
         //{
         //    if (instance == null)
@@ -97,8 +112,12 @@ namespace HyperCube.Models
             {
                 Console.WriteLine($"CreateBlockchainAccount {account}: {res}");
                 //query = $"update aspnetusers set eth_address='{res}' where UserName='{account.Name}'";
-                query = $"update account_wallets set uuid='{res}' where account_uuid='{account.UUID}'";
-                account.eth_address = res;
+                var addr = account.GetActualAddress(this);                
+                if (addr == null)
+                    query = $"insert into account_wallets (uuid, blockchain_id, account_uuid, password_plain) values ('{res}',{id},'{account.UUID}','{account.PWDHash}')";
+                else
+                    query = $"update account_wallets set uuid='{res}', password_plain='{account.PWDHash}' where account_uuid='{account.UUID}' and blockchain_id={id}";
+                account.SetActualAddress(res, this);
                 Console.WriteLine($"CreateBlockchainAccount query {query}");
                 MySQLConnector.Instance().SQLInsert(query);
             }
@@ -220,7 +239,7 @@ namespace HyperCube.Models
 
         public async Task<string> GetBalance(AccountModel account)
         {
-            var addr = id == 0 ? account.eth_address : account.eth_address1;
+            var addr = await account.GetOrCreateActualAddress(this);
             var ret = await RunFunction("eth_getBalance", $"\"{addr}\",\"latest\"");
             return ret;
         }
@@ -249,18 +268,20 @@ namespace HyperCube.Models
             address = answer;
         }
         
-        public async Task<string> SendTransaction(string fromAddress, string toAddress, string sum)
+        public async Task<string> SendTransaction(string fromAddress, string toAddress, int wei)
         {
+            var sum = dec2hex(wei);
+            var gas = await GetEstimatedGasTransaction(wei);
             Console.WriteLine($"SendTransaction from {fromAddress} to {toAddress} sum {sum}");
-            var answer = await RunFunction("eth_sendTransaction", $"{{\"from\":\"{address}\",\"to\":\"{toAddress}\",\"gas\":\"0x31b2ef\", \"data\":\"\", \"value\":\"{sum}\"}}");
+            var answer = await RunFunction("eth_sendTransaction", $"{{\"from\":\"{address}\",\"to\":\"{toAddress}\",\"gas\":\"{gas}\", \"data\":\"\", \"value\":\"{sum}\"}}");
             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)
+        public async Task<string> RunContractWrite(string contractAddress, string data, string gas, string value)
         {
             Console.WriteLine("RunContract contractAddress " + contractAddress);
-            var answer = await RunFunction("eth_sendTransaction", $"{{\"from\":\"{address}\",\"to\":\"{contractAddress}\",\"gas\":\"0x31b2ef\", \"data\":\"{data}\", \"value\":\"0x32555\"}}");
+            var answer = await RunFunction("eth_sendTransaction", $"{{\"from\":\"{address}\",\"to\":\"{contractAddress}\",\"gas\":\"{gas}\", \"data\":\"{data}\", \"value\":\"{value}\"}}");
             //$"{{ \"jsonrpc\":\"2.0\",\"method\":\"eth_sendTransaction\",\"params\":[{{\"from\":\"{address}\",\"to\":\"{contractAddress}\",\"gas\":\"0x31b2ef\", \"data\":\"{data}\"}}], \"id\":1}}";
             //var answer = await Post.PostRequestAsync(req);
             //dynamic jsonDe = JsonConvert.DeserializeObject(answer);
@@ -277,22 +298,31 @@ namespace HyperCube.Models
             var answer = await Post.PostRequestAsync(this, req);
 
             dynamic jsonDe = JsonConvert.DeserializeObject(answer);
-            var blockHash = jsonDe.result.blockHash;
-            var blockNumber = jsonDe.result.blockNumber;
-            var contractAddress = jsonDe.result.contractAddress;
-            MySQLConnector.Instance().SQLInsert($"insert into transactions (result, name) values ('{Convert.ToString(jsonDe.result)}', 'eth_getTransactionReceipt')");
-            Console.WriteLine("result " + answer);
-            if (returnAddress)
-                return contractAddress;
+            if (jsonDe.result != null)
+            {
+                var blockHash = jsonDe.result.blockHash;
+                var blockNumber = jsonDe.result.blockNumber;
+                var contractAddress = jsonDe.result.contractAddress;
+                MySQLConnector.Instance().SQLInsert($"insert into transactions (result, name) values ('{Convert.ToString(jsonDe.result)}', 'eth_getTransactionReceipt')");
+                Console.WriteLine("result " + answer);
+                if (returnAddress)
+                    return contractAddress;
+                else
+                    return Convert.ToString(jsonDe.result);
+            }
             else
-                return Convert.ToString(jsonDe.result);
+            {
+                Console.WriteLine("eth_getTransactionReceipt reuslt NULL " + transactionAddress);
+                return null;
+            }
         }
 
         //TODO add GAS!!!
         public async Task<object[]> AddContract(string name, string code, string bytecode)
         {
             Console.WriteLine("bytecode " + bytecode);
-            var req = $"{{ \"jsonrpc\":\"2.0\",\"method\":\"eth_sendTransaction\",\"params\":[{{\"from\":\"{address}\",\"gas\":\"0x31b2e\", \"data\":\"{bytecode}\"}}], \"id\":1}}";
+            var gas = await GetEstimatedGasContractAdd(bytecode);
+            var req = $"{{ \"jsonrpc\":\"2.0\",\"method\":\"eth_sendTransaction\",\"params\":[{{\"from\":\"{address}\",\"gas\":\"{gas}\", \"data\":\"{bytecode}\"}}], \"id\":1}}";
 
             var answer = await Post.PostRequestAsync(this, req);
             dynamic jsonDe = JsonConvert.DeserializeObject(answer);
@@ -300,8 +330,8 @@ namespace HyperCube.Models
             Console.WriteLine("result AddContract transactionAddress: " + res);
             if (res != null)
             {                
-                SmartContract newctr = new SmartContract(name, code, bytecode);
-                var gas = await GetEstimatedGas(newctr);
+                SmartContract newctr = new SmartContract(name, code, bytecode, this.id, gas);
+                
                 if (gas == null)
                     gas = "invalid";
                 int id = (int)MySQLConnector.Instance().SQLInsert($"insert into smart_contracts (code, bytecode, name, date_add, gas_cost, blockchain_id) values ('{code}','{bytecode}','{name}',NOW(), '{gas}', {this.id})");
@@ -313,17 +343,24 @@ namespace HyperCube.Models
             return null;
         }
 
-        public async Task<string> GetEstimatedGas(SmartContract contract)
+        public async Task<string> GetEstimatedGasTransaction(int weiAmount)
         {
-            if (contract != null)
+            if (weiAmount > 0)
             {
-                var ret = await RunFunction("eth_estimateGas", $"{{\"from\":\"{address}\",\"data\":\"{contract.ByteCode}\"}}");
+                var ret = await RunFunction("eth_estimateGas", $"{{\"from\":\"{address}\",\"value\":\"{dec2hex(weiAmount)}\"}}");
                 Console.WriteLine("GetEstimatedGas " + ret);
                 return ret;
             }
             return null;
         }
 
+        public async Task<string> GetEstimatedGasContractAdd(string bytecode)
+        {
+            var ret = await RunFunction("eth_estimateGas", $"{{\"from\":\"{address}\",\"data\":\"{bytecode}\"}}");
+            Console.WriteLine("GetEstimatedGasContractAdd " + ret);
+            return ret;
+        }
+
         public string GetAddress()
         {
             //this.address = address;

+ 33 - 25
Models/SmartContract.cs

@@ -10,17 +10,18 @@ namespace HyperCube.Models
     public class SmartContract
     {
         public int ID;
+        public int blockchainId;
         public string Code;
         public string ByteCode;
         public string Name = "";
+        public string Gas = "";
         public string Address = "";
         public int functionId = 0;
         public string functionName = "";
         public string functionCompiledHeader = "";
 
-        public static SmartContract Find(string name)
+        public static SmartContract Find(string name, Blockchain bc)
         {
-            var bc = Blockchain.GetMain();
             if (bc != null)
             {
                 var contracts = bc.contractNames;
@@ -40,11 +41,13 @@ namespace HyperCube.Models
             return null;
         }
 
-        public SmartContract(string name, string code, string bytecode)
+        public SmartContract(string name, string code, string bytecode, int blockchain_id, string gas)
         {            
             Name = name;
             Code = code;
-            ByteCode = bytecode;            
+            ByteCode = bytecode;
+            blockchainId = blockchain_id;
+            Gas = gas;
         }
 
         public async Task LoadFunction()
@@ -71,7 +74,7 @@ namespace HyperCube.Models
     public class VerifyContract : SmartContract
     {
         public VerifyContract() : base() { }
-        public VerifyContract(string name, string code, string bytecode) : base(name, code, bytecode) { }        
+        public VerifyContract(string name, string code, string bytecode, int blockchain_id, string gas) : base(name, code, bytecode, blockchain_id, gas) { }        
 
         /// <summary>
         /// 
@@ -82,28 +85,33 @@ namespace HyperCube.Models
         public async Task<string> Run(ArticleModel newArticle, string weiValue = "0x0")
         {
             var uuid = await newArticle.GetInitiatorUUID();
-            var verifier_address = AccountModel.Current.eth_address;
+            var bc = Blockchain.Find(blockchainId);
+            if (bc != null)
+            {
+                var verifier_address = await AccountModel.Current.GetOrCreateActualAddress(bc);
 
-            var initiator = AccountModel.Find(uuid);
-            var initiator_address = initiator.eth_address;
-            var article_value = (int)newArticle.Rating;
-            
-            var article_value_hex = article_value.ToString("X64");
-            //Console.WriteLine($"article_value {article_value} hex {article_value_hex}");
-            var edits = await newArticle.GetEditsCount();
-            var edits_hex = edits.ToString("X64");
-            verifier_address = Blockchain.zerofill(verifier_address, 64, true);
-            initiator_address = Blockchain.zerofill(initiator_address, 64, true);
+                var initiator = AccountModel.Find(uuid);
+                var initiator_address = await initiator.GetOrCreateActualAddress(bc);
+                var article_value = (int)newArticle.Rating;
 
-            Console.WriteLine($"VerifyContract params article_value  {article_value} edits {edits} verifier {AccountModel.Current.Name} verifier_address: {verifier_address} initiator {initiator.Name} initiator_address: {initiator_address}");
-            //function verify( address payable verifier, address payable initiator, int article_value, int verify_complexity) public returns (uint vReward, uint iReward) 
-            var paramstring = "0x" + functionCompiledHeader + verifier_address + initiator_address + article_value_hex + edits_hex;
-            Console.WriteLine($"VerifyContract Run {initiator.Name} params {paramstring}");
-            var res = await Blockchain.GetMain().RunContractWrite(Address, $"{paramstring}");
-            Console.WriteLine($"VerifyContract transactionId res {res}");
-            var receipt = await Blockchain.GetMain().GetReceipt(res);
-            Console.WriteLine("VerifyContract receipt " + receipt);
-            return res;
+                var article_value_hex = article_value.ToString("X64");
+                //Console.WriteLine($"article_value {article_value} hex {article_value_hex}");
+                var edits = await newArticle.GetEditsCount();
+                var edits_hex = edits.ToString("X64");
+                verifier_address = Blockchain.zerofill(verifier_address, 64, true);
+                initiator_address = Blockchain.zerofill(initiator_address, 64, true);
+
+                Console.WriteLine($"VerifyContract params article_value  {article_value} edits {edits} verifier {AccountModel.Current.Name} verifier_address: {verifier_address} initiator {initiator.Name} initiator_address: {initiator_address}");
+                //function verify( address payable verifier, address payable initiator, int article_value, int verify_complexity) public returns (uint vReward, uint iReward) 
+                var paramstring = "0x" + functionCompiledHeader + verifier_address + initiator_address + article_value_hex + edits_hex;
+                Console.WriteLine($"VerifyContract Run {initiator.Name} params {paramstring}");
+                var res = await bc.RunContractWrite(Address, $"{paramstring}", Gas, "0x100");
+                Console.WriteLine($"VerifyContract transactionId res {res}");
+                var receipt = await bc.GetReceipt(res);
+                Console.WriteLine("VerifyContract receipt " + receipt);
+                return res;
+            }
+            return "none";
         }
     }
 }

+ 42 - 35
MySQLConnector.cs

@@ -77,13 +77,14 @@ namespace HyperCube
                     newacc.UUID = rdr.GetString(0); 
                     newacc.Name = rdr.GetString(1);
                     newacc.Email = rdr.GetString(3);
+                    newacc.PWDHash = rdr.GetString(6);
                     //if (!rdr.IsDBNull(15))
                     //    newacc.eth_address = rdr.GetString(15);
 
 
                     if (!accs.ContainsKey(newacc.UUID))
                         accs.Add(newacc.UUID, newacc);
-                    newacc.blockchain_selected = rdr.GetByte(17);
+                    newacc.bsel = rdr.GetByte(17);
                 }
 
                 await Task.WhenAll();
@@ -98,46 +99,52 @@ namespace HyperCube
 
         public async Task<Dictionary<int, SmartContract>> SQLSelectContracts(int blockchainId)
         {
-            string sql = "select * from smart_contracts where blockchain_id ="+blockchainId;
-            Dictionary<int, SmartContract> contracts = new();
-
-            bool connected = IsConnect();
-            if (connected)
+            var bc = Blockchain.Find(blockchainId);
+            if (bc != null)
             {
-                SQLcom = new(sql, Connection);
-                MySqlDataReader rdr = SQLcom.ExecuteReader();
+                string sql = "select * from smart_contracts where blockchain_id =" + blockchainId;
+                Dictionary<int, SmartContract> contracts = new();
 
-                while (rdr.Read())
-                {                   
-                    var id = rdr.GetInt32(0);
-                    var code = rdr.GetString(1);
-                    var bytecode = rdr.GetString(2);
-                    var name = rdr.GetString(3);
-
-                    SmartContract contract;
-                    if (name == "Verify")
-                        contract = new VerifyContract(name, code, bytecode);
-                    else
-                        contract = new SmartContract(name, code, bytecode);
-                    contract.ID = id;
-                    if (!rdr.IsDBNull(6))
+                bool connected = IsConnect();
+                if (connected)
+                {
+                    SQLcom = new(sql, Connection);
+                    MySqlDataReader rdr = SQLcom.ExecuteReader();
+
+                    while (rdr.Read())
                     {
-                        contract.Address = rdr.GetString(6);
-                    }                    
-                    Console.WriteLine($"SQLSelectContracts rdr Read {contract.Name}");
-                    if (!contracts.ContainsKey(contract.ID))
-                        contracts.Add(contract.ID, contract);
-                    if (!Blockchain.GetMain().contractNames.ContainsKey(name))
-                        Blockchain.GetMain().contractNames.Add(name, contract);                    
-                }
+                        var id = rdr.GetInt32(0);
+                        var code = rdr.GetString(1);
+                        var bytecode = rdr.GetString(2);
+                        var name = rdr.GetString(3);
+                        var gas = rdr.GetString(8);
+
+                        SmartContract contract;
+                        if (name == "Verify")
+                            contract = new VerifyContract(name, code, bytecode, blockchainId, gas);
+                        else
+                            contract = new SmartContract(name, code, bytecode, blockchainId, gas);
+                        contract.ID = id;
+                        if (!rdr.IsDBNull(6))
+                        {
+                            contract.Address = rdr.GetString(6);
+                        }
+                        Console.WriteLine($"SQLSelectContracts rdr Read {contract.Name}");
+                        if (!contracts.ContainsKey(contract.ID))
+                            contracts.Add(contract.ID, contract);
+                        if (!bc.contractNames.ContainsKey(name))
+                            bc.contractNames.Add(name, contract);
+                    }
 
-                await Task.WhenAll();
-                rdr.Close();
-                return contracts;
+                    await Task.WhenAll();
+                    rdr.Close();
+                    return contracts;
+                }
+                else
+                    Console.WriteLine("Not connected to DB.");
             }
             else
-                Console.WriteLine("Not connected to DB.");
-
+                Console.WriteLine($"Error: blockchain {blockchainId} not found");
             return null;
         }
 

Diferenças do arquivo suprimidas por serem muito extensas
+ 161 - 132
Pages/Blockchains.razor


+ 1 - 1
Pages/DocEdit.razor.cs

@@ -37,7 +37,7 @@ namespace HyperCube.Pages
             Console.WriteLine($"Verify starting");
             try
             {
-                VerifyContract verifyContract = SmartContract.Find("Verify") as VerifyContract;
+                VerifyContract verifyContract = SmartContract.Find("Verify", Blockchain.GetMain()) as VerifyContract;
                 if (verifyContract != null)
                 {
                     Console.WriteLine($"VerifyContract found");

+ 2 - 2
Pages/Wallet.razor

@@ -22,7 +22,7 @@
         {
             <a class="tabs__btn">Заказы</a>
         }
-        </div>
+    </div>
     <div class="upload">
         <h2 class="upload__title">Кошелек</h2>
     </div>
@@ -42,7 +42,7 @@
             </tr>
             <tr>
                 <td>ETH Address:</td>
-                <td>@account.eth_address</td>
+                <td>@account.GetActualAddress(Blockchain.GetMain())</td>
             </tr>
             <tr>
                 <td>Balance:</td>

+ 82 - 82
Pages/Wallet.razor.cs

@@ -1,119 +1,119 @@
-using System.Threading.Tasks;
-using HyperCube.Models;
-using HyperCube;
-
-namespace HyperCube.Pages
-{
-    public partial class Wallet
-    {
-        private AccountModel account = new();
-        string myBalance = "";
-
-        protected override async Task OnInitializedAsync()
-        {
-            account = await GetCurrentAcc();
-            if (Blockchain.GetMain() != null)
-                myBalance = await account.GetBalance();
-        }
-
-        private async Task<AccountModel> GetCurrentAcc()
-        {
-            AccountModel account = new();
-
-            var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
-            var user = authState.User;
-
-            if (user.Identity.IsAuthenticated)
-            {
-                var currentUser = await UserManager.GetUserAsync(user);
-                var acc = AccountModel.Find(currentUser.Id);
-                if (acc != null)
-                    account = acc;
-
-                account.LoadRoles();
-                return account;
-            }
-
-            return null;
-        }
-
-        bool admin
-        {
-            get { return account.Roles.Contains(Role.Admin); }
-            set
-            {
+using System.Threading.Tasks;
+using HyperCube.Models;
+using HyperCube;
+
+namespace HyperCube.Pages
+{
+    public partial class Wallet
+    {
+        private AccountModel account = new();
+        string myBalance = "";
+
+        protected override async Task OnInitializedAsync()
+        {
+            account = await GetCurrentAcc();
+            if (Blockchain.GetMain() != null)
+                myBalance = await account.GetBalance();
+        }
+
+        private async Task<AccountModel> GetCurrentAcc()
+        {
+            AccountModel account = new();
+
+            var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
+            var user = authState.User;
+
+            if (user.Identity.IsAuthenticated)
+            {
+                var currentUser = await UserManager.GetUserAsync(user);
+                var acc = AccountModel.Find(currentUser.Id);
+                if (acc != null)
+                    account = acc;
+
+                account.LoadRoles();
+                return account;
+            }
+
+            return null;
+        }
+
+        bool admin
+        {
+            get { return account.Roles.Contains(Role.Admin); }
+            set
+            {
                 if (!account.Roles.Contains(Role.Admin))
                 {
                     account.AddRole(Role.Admin);
                     InsertRole(Role.Admin);                    
-                }
+                }
                 else
                 {
                     account.RemoveRole(Role.Admin);
                     DeleteRole(Role.Admin);                    
-                }
-            }
-        }
-        bool initiator
-        {
-            get { return account.Roles.Contains(Role.Initiator); }
-            set
+                }
+            }
+        }
+        bool initiator
+        {
+            get { return account.Roles.Contains(Role.Initiator); }
+            set
             {
                 if (!account.Roles.Contains(Role.Initiator))
                 {
                     account.AddRole(Role.Initiator);
                     InsertRole(Role.Initiator);                    
-                }
+                }
                 else
                 {
                     account.RemoveRole(Role.Initiator);
                     DeleteRole(Role.Initiator);                    
-                }
-            }
-        }
-        bool verifier
-        {
-            get { return account.Roles.Contains(Role.Verifier); }
-            set
-            {
+                }
+            }
+        }
+        bool verifier
+        {
+            get { return account.Roles.Contains(Role.Verifier); }
+            set
+            {
                 if (!account.Roles.Contains(Role.Verifier))
                 {
                     account.AddRole(Role.Verifier);
                     InsertRole(Role.Verifier);                    
-                }
+                }
                 else
                 {
                     account.RemoveRole(Role.Verifier);
                     DeleteRole(Role.Verifier);                    
-                }
-            }
-        }
-        bool requester
-        {
-            get { return account.Roles.Contains(Role.Requester); }
-            set
-            {
+                }
+            }
+        }
+        bool requester
+        {
+            get { return account.Roles.Contains(Role.Requester); }
+            set
+            {
                 if (!account.Roles.Contains(Role.Requester))
                 {
                     account.AddRole(Role.Requester);
                     InsertRole(Role.Requester);                    
-                }
+                }
                 else
                 {
                     account.RemoveRole(Role.Requester);
                     DeleteRole(Role.Requester);                    
-                }
-            }
-        }
-
-        void InsertRole(Role role)
+                }
+            }
+        }
+
+        void InsertRole(Role role)
         {
             MySQLConnector.Instance().SQLInsert($"insert into account_roles (account_uuid, role_id) values ('{account.UUID}', {(int)role})");
-        }
-
-        void DeleteRole(Role role)
+        }
+
+        void DeleteRole(Role role)
         {
-            MySQLConnector.Instance().SQLInsert($"delete from account_roles where account_uuid = '{account.UUID}' and role_id={(int)role}");
-        }
-    }
+            MySQLConnector.Instance().SQLInsert($"delete from account_roles where account_uuid = '{account.UUID}' and role_id={(int)role}");
+        }
+    }
 }