예제 #1
0
        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;
            }
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
            }
        }