/// <summary> /// Imports a public key to the wallet of the server node. /// This allows for checking the balance of the public key. /// </summary> /// <param name="person"></param> public static void ImportPublicKeyToWallet(Person person) { string chainName = WebConfigurationManager.AppSettings["ChainName"]; string nodeIp = WebConfigurationManager.AppSettings["NodeIp"]; MultiChainClient client = new MultiChainClient(chainName,nodeIp); client.ImportAddress(person.PublicKey); }
/// <summary> /// Gets a given person's (user) assets. /// </summary> /// <param name="person">person (user)</param> /// <returns>AddressBalance array</returns> public static AddressBalance[] GetPersonBalance(Person person) { string chainName = WebConfigurationManager.AppSettings["ChainName"]; string nodeIp = WebConfigurationManager.AppSettings["NodeIp"]; MultiChainClient client = new MultiChainClient(chainName,nodeIp); var resp = client.GetAddressbalances (person.PublicKey); return resp.Balances; }
protected async void OnButton1Clicked (object sender, EventArgs e) { //Make RPC connection to servernode MultiChainClient client = new MultiChainClient("testChain"); Dictionary<string,int> dictionary = new Dictionary<string, int>(); dictionary.Add("F",1); dictionary.Add("S",1); var resp = client.PrepareLockUnspent(dictionary); }
/// <summary> /// Issues an S or F to a user for a recommendation. /// </summary> /// <param name="recommendation">Recommendation</param> /// <param name="rewardUser">true for S asset and false for F</param> public static void Issue(TrustLessModelLib.Recommendation recommendation, bool rewardUser) { string chainName = WebConfigurationManager.AppSettings["ChainName"]; string nodeIp = WebConfigurationManager.AppSettings["NodeIp"]; MultiChainClient client = new MultiChainClient(chainName,nodeIp); GetTxOutResponse getTxOutResponse = client.GetTxOut(recommendation.Transaction.Tx,recommendation.Transaction.Vout); if (getTxOutResponse == null) return; Dictionary<string,int> amount = new Dictionary<string, int>(); amount.Add(getTxOutResponse.assets.First(x => x.name.StartsWith(rewardUser ? "S_" : "F_")).name,1); string multichainPublicKey = WebConfigurationManager.AppSettings["MultichainPublicKey"]; var resp = client.CreateRawTransaction (recommendation.Person.PublicKey, recommendation.Transaction.Tx,recommendation.Transaction.Vout, amount); var respAppendRawChange = client.AppendRawChange (resp.Hex, multichainPublicKey); var respSignTransaction = client.SignRawTransaction (respAppendRawChange.Hex); if (respSignTransaction.complete) { var respSendRawTransaction = client.SendRawTransaction (respSignTransaction.hex); if (String.IsNullOrEmpty (respSendRawTransaction.TransactionId)) client.LockUnspent (true, recommendation.Transaction.Tx,recommendation.Transaction.Vout); } }
public int GetF() { //TODO ask client node for F'er //Make RPC connection to servernode string chainName = WebConfigurationManager.AppSettings["ChainName"]; string nodeIp = WebConfigurationManager.AppSettings["NodeIp"]; MultiChainClient client = new MultiChainClient(chainName,nodeIp); var resp = client.GetTotalBalances (); return resp.Balances.Where (x => x.name.StartsWith("F_")).Sum(y => (int)y.qty); }
private string GetPublicKey() { //Make RPC connection to servernode try { string chainName = WebConfigurationManager.AppSettings["ChainName"]; string nodeIp = WebConfigurationManager.AppSettings["NodeIp"]; MultiChainClient client = new MultiChainClient(chainName,nodeIp); var resp = client.GetAddresses (); return resp.Addresses.First (); } catch { return ""; } }
/// <summary> /// Reserves/locks away one S and F asset and sets the recommendation to reference these assets. /// </summary> /// <param name="db">DataContext</param> /// <param name="recommendation">Recommendation</param> public static void MakeRecommendation(DataContext db, TrustLessModelLib.Recommendation recommendation) { string chainName = WebConfigurationManager.AppSettings["ChainName"]; string nodeIp = WebConfigurationManager.AppSettings["NodeIp"]; MultiChainClient client = new MultiChainClient(chainName,nodeIp); Dictionary<string,int> dictionary = new Dictionary<string, int>(); AddressBalance[] addressBalances = client.GetTotalBalances ().Balances; var lastFasset = addressBalances.OrderBy (x => x.name).LastOrDefault (x => x.name.StartsWith ("F_")); var lastSasset = addressBalances.OrderBy (x => x.name).LastOrDefault (x => x.name.StartsWith ("S_")); if (lastFasset == null || lastSasset == null) { GenerateFunds (client); MakeRecommendation (db, recommendation); return; } string lastF = lastFasset.name; string lastS = lastSasset.name; dictionary.Add(lastF,1); dictionary.Add(lastS,1); try { var resp = client.PrepareLockUnspent(dictionary); recommendation.Transaction = new ReservedTransaction() { Tx = resp.txid, Vout = resp.vout }; } catch { //Insurficient funds GenerateFunds(client); MakeRecommendation (db, recommendation); return; } db.SaveChanges (); }
/// <summary> /// If the balance of S_X or F_X is equals zero, a new unique asset S_X or F_X will be issued. /// </summary> /// <param name="client">MultichainClient</param> private static void GenerateFunds(MultiChainClient client) { lock (issueLock) { AddressBalance[] addressBalances = client.GetTotalBalances ().Balances; ListAssetsResponseAsset[] assets = client.ListAssets ().Assets; string rootKey = WebConfigurationManager.AppSettings["MultichainPublicKey"]; ListAssetsResponseAsset lastSasset = assets.OrderBy (x => x.name).LastOrDefault (x => x.name.StartsWith ("S_")); string lastS = lastSasset != null ? lastSasset.name : "S_0"; ListAssetsResponseAsset lastFasset = assets.OrderBy (x => x.name).LastOrDefault (x => x.name.StartsWith ("F_")); string lastF = lastSasset != null ? lastSasset.name : "F_0"; string newS = "S_" + (Convert.ToInt32 (lastS.Substring (2)) + 1); string newF = "F_" + (Convert.ToInt32 (lastS.Substring (2)) + 1); var balanceS = addressBalances.FirstOrDefault (x => x.name == lastS); var balanceF = addressBalances.FirstOrDefault (x => x.name == lastF); if (balanceS == null || balanceS.qty == 0) client.Issue (rootKey, newS, 100000, 1.0); if (balanceF == null || balanceF.qty == 0) client.Issue (rootKey, newF, 100000, 1.0); } }