public async Task ProcessPayment(Payment payment, ApplicationDbContext db) { try { var sw = new Stopwatch(); sw.Start(); if (string.IsNullOrEmpty(payment.MerchantTransactionId)) { var transaction = new TransactionRequest { Address = payment.MerchantWallet, Amount = GraftConvert.ToAtomicUnits(payment.MerchantAmount) }; db.TransactionRequests.Add(transaction); await db.SaveChangesAsync(); payment.MerchantTransactionId = transaction.Id; } if (string.IsNullOrEmpty(payment.ProviderTransactionId)) { var transaction = new TransactionRequest { Address = payment.ServiceProviderWallet, Amount = GraftConvert.ToAtomicUnits(payment.ServiceProviderFee) }; db.TransactionRequests.Add(transaction); await db.SaveChangesAsync(); payment.ProviderTransactionId = transaction.Id; } if (State != WatchableServiceState.OK) { SetState(WatchableServiceState.OK); } sw.Stop(); UpdateStopwatchMetrics(sw, true); totalPaymentsBySession++; Metrics[$"Total Payments By Session"] = totalPaymentsBySession.ToString(); totalAmountPaymentBySession += payment.ReceivedAmount; Metrics[$"Total Received Payments By Session"] = totalAmountPaymentBySession.ToString(); } catch (Exception ex) { SetState(WatchableServiceState.Error, ex.Message); throw; } finally { LastOperationTime = DateTime.UtcNow; } }
internal async Task <PaymentStatus> Pay(string id, int blockNumber, string address, decimal amount) { // sale_details ----------------------------------------- var dapiSaleDetailsParams = new DapiSaleDetailsParams { PaymentId = id, BlockNumber = blockNumber }; var saleDetailsResult = await _dapi.SaleDetails(dapiSaleDetailsParams); // prepare payment var destinations = new List <Destination>(); // add fee for each node in the AuthSample ulong totalAuthSampleFee = 0; foreach (var item in saleDetailsResult.AuthSample) { destinations.Add(new Destination { Amount = item.Fee, Address = item.Address }); totalAuthSampleFee += item.Fee; } // destination - ServiceProvider destinations.Add(new Destination { Amount = GraftConvert.ToAtomicUnits(amount) - totalAuthSampleFee, Address = address }); var transferParams = new TransferParams { Destinations = destinations.ToArray(), DoNotRelay = true, GetTxHex = true, GetTxMetadata = true, GetTxKey = true }; var transferResult = await _wallet.TransferRta(transferParams); // DAPI pay var payParams = new DapiPayParams { Address = address, PaymentId = id, BlockNumber = blockNumber, Amount = GraftConvert.ToAtomicUnits(amount), Transactions = new string[] { transferResult.TxBlob } }; var payResult = await _dapi.Pay(payParams); return(await GetSaleStatus(id, blockNumber)); }
public async Task <int> Sale(string id, decimal amount) { var dapiParams = new DapiSaleParams { PaymentId = id, SaleDetails = "exchange", Address = _settings.GraftWalletAddress, Amount = GraftConvert.ToAtomicUnits(amount) }; var res = await _dapi.Sale(dapiParams); return(res.BlockNumber); }
async Task <Payment> GraftSale(GatewaySaleParams model, Terminal terminal) { var graftRate = await _rateCache.GetRateToUsd("GRFT"); var graftAmount = model.SaleAmount / graftRate; var payment = new Payment { Id = Guid.NewGuid().ToString(), TransactionDate = DateTime.UtcNow, Status = PaymentStatus.New, TerminalId = terminal.Id, StoreId = terminal.StoreId, ServiceProviderId = terminal.ServiceProviderId, SaleAmount = model.SaleAmount, SaleCurrency = model.SaleCurrency, PayToSaleRate = graftRate, GraftToSaleRate = graftRate, PayCurrency = model.PayCurrency, PayAmount = graftAmount, ServiceProviderFee = 0, ExchangeBrokerFee = 0, MerchantAmount = graftAmount, SaleDetails = model.SaleDetails }; var dapiParams = new DapiSaleParams { PaymentId = payment.Id, SaleDetails = model.SaleDetails, Address = terminal.Merchant.WalletAddress, Amount = GraftConvert.ToAtomicUnits(payment.PayAmount) }; //todo //var dapiResult = await _dapi.Sale(dapiParams); //payment.Status = PaymentStatus.Waiting; //payment.BlockNumber = dapiResult.BlockNumber; //payment.PayWalletAddress = $"{payment.Id};{terminal.Merchant.WalletAddress};{payment.PayAmount:N8};{dapiResult.BlockNumber}"; return(payment); }
public async Task ProcessExchange(Exchange exchange, ApplicationDbContext db) { try { var sw = new Stopwatch(); sw.Start(); if (string.IsNullOrEmpty(exchange.BuyerTransactionId)) { exchange.Log($"Initiated payout GRAFT transaction of {exchange.BuyAmount}"); var transaction = new TransactionRequest { Address = exchange.BuyerWallet, Amount = GraftConvert.ToAtomicUnits(exchange.BuyAmount) }; db.TransactionRequests.Add(transaction); await db.SaveChangesAsync(); exchange.BuyerTransactionId = transaction.Id; } if (State != WatchableServiceState.OK) { SetState(WatchableServiceState.OK); } sw.Stop(); UpdateStopwatchMetrics(sw, true); totalExchangesBySession++; Metrics[$"Total Payments By Session"] = totalExchangesBySession.ToString(); totalAmountExchangeBySession += exchange.ReceivedAmount; Metrics[$"Total Received Exchange By Session"] = totalAmountExchangeBySession.ToString(); } catch (Exception ex) { SetState(WatchableServiceState.Error, ex.Message); throw; } finally { LastOperationTime = DateTime.UtcNow; } }
public static async void Run() { try { //var wallet = new Wallet("http://54.84.187.74:29982/", "", ""); var wallet = new Wallet("http://54.84.187.74:29817/", "", ""); //var wallet = new Wallet("http://100.24.50.163:28682/", "", ""); var address = await wallet.GetAddress(); var balance = await wallet.GetBalance(); Console.WriteLine($"Wallet {address} \nbalance: {GraftConvert.FromAtomicUnits(balance.Balance)}\nUnlocked balance: {GraftConvert.FromAtomicUnits(balance.UnlockedBalance)}"); // params ulong amount = GraftConvert.ToAtomicUnits(1.23M); string merchantWalletAddress = "FAPnEQ1ev195ntzFnZGtHWDocyDaDPxUyV9SLp1e4seE1QDewvnMotsUwBYLFU5RsDBnJqpQFSsYjZUfP7g1urucLoiSPCv"; string paymentId = Guid.NewGuid().ToString(); //18.214.197.224 rta - alpha1 //18.214.197.50 rta - alpha2 //35.169.179.171 rta - alpha3 //34.192.115.160 rta - alpha4 var dapi = new GraftDapi("http://18.214.197.224:28690/dapi/v2.0/"); //var dapi = new GraftDapi("http://100.24.50.163:28690/dapi/v2.0/"); // sale ----------------------------------------- var dapiParams = new DapiSaleParams { PaymentId = paymentId, SaleDetails = "sale details string", Address = merchantWalletAddress, Amount = amount }; var saleResult = await dapi.Sale(dapiParams); Console.WriteLine($">>> Sale result: {saleResult.PaymentId}, {saleResult.BlockNumber}"); // sale_status ----------------------------------------- var dapiStatusParams = new DapiSaleStatusParams { PaymentId = paymentId, BlockNumber = saleResult.BlockNumber }; var saleStatusResult = await dapi.GetSaleStatus(dapiStatusParams); Console.WriteLine($"Sale status: {saleStatusResult.Status}"); // sale_details ----------------------------------------- var dapiSaleDetailsParams = new DapiSaleDetailsParams { PaymentId = paymentId, BlockNumber = saleResult.BlockNumber }; var saleDetailsResult = await dapi.SaleDetails(dapiSaleDetailsParams); var json = JsonConvert.SerializeObject(saleDetailsResult, Formatting.Indented); Console.WriteLine($"Sale Details:\n{json}"); // prepare payment var destinations = new List <Destination>(); ulong totalAuthSampleFee = 0; foreach (var item in saleDetailsResult.AuthSample) { destinations.Add(new Destination { Amount = item.Fee, Address = item.Address }); totalAuthSampleFee += item.Fee; } destinations.Add(new Destination { Amount = amount - totalAuthSampleFee, Address = merchantWalletAddress }); var transferParams = new TransferParams { Destinations = destinations.ToArray(), //PaymentId = paymentId, DoNotRelay = true, GetTxHex = true, GetTxMetadata = true, GetTxKey = true }; var transferResult = await wallet.TransferRta(transferParams); json = JsonConvert.SerializeObject(transferResult, Formatting.Indented); //Console.WriteLine($"Transfer Result:\n{json}"); Console.WriteLine($"Transfer Result: {transferResult.Amount}"); // DAPI pay var payParams = new DapiPayParams { Address = merchantWalletAddress, PaymentId = paymentId, BlockNumber = saleResult.BlockNumber, Amount = amount, Transactions = new string[] { transferResult.TxBlob } }; json = JsonConvert.SerializeObject(payParams, Formatting.Indented); Debug.WriteLine($"Pay Parameters:\n{json}"); var payResult = await dapi.Pay(payParams); json = JsonConvert.SerializeObject(payResult, Formatting.Indented); Console.WriteLine($"Pay Result:\n{json}"); while (true) { saleStatusResult = await dapi.GetSaleStatus(dapiStatusParams); Console.WriteLine($"Sale status: {saleStatusResult.Status}"); await Task.Delay(1000); //saleDetailsResult = await dapi.SaleDetails(dapiSaleDetailsParams); //json = JsonConvert.SerializeObject(saleDetailsResult, Formatting.Indented); //Console.WriteLine($"Sale Details:\n{json}"); } } catch (Exception ex) { Console.WriteLine(ex.Message); } }