private async Task CreatePoForQuote(ILogger logger, WalletBuyerService walletBuyerService, Quote quote) { var existing = await walletBuyerService.GetPoBySellerAndQuoteQueryAsync(_config.SellerId, quote.Id); if (existing?.Po?.PoNumber > 0) { quote.PoNumber = (long)existing.Po.PoNumber; quote.Status = QuoteStatus.AwaitingOrder; await _quoteRepository.UpdateAsync(quote); return; } var po = CreateDummyPoForPurchasingCreate(quote).ToBuyerPo(); var receipt = await walletBuyerService.CreatePurchaseOrderRequestAndWaitForReceiptAsync(po); var createdEvent = receipt.DecodeAllEvents <PurchaseOrderCreatedLogEventDTO>().FirstOrDefault(); if (createdEvent != null) { logger.LogInformation($"Created PO from quote. Block Number: {receipt.BlockNumber}, PO: {createdEvent?.Event.PoNumber}"); quote.PoNumber = (long)createdEvent.Event.PoNumber; quote.Status = QuoteStatus.AwaitingOrder; quote.TransactionHash = receipt.TransactionHash; await _quoteRepository.UpdateAsync(quote); } else { logger.LogError($"PO Creation failed for quote {quote.Id}. No created event log was found in the receipt"); } }
public async Task ExecuteAsync(ILogger logger) { if (!_config.CreateFakePurchaseOrders) { return; } var pendingQuotes = await _quoteRepository.ListAsync(new GetQuotesRequiringPurchaseOrderSpec()); logger.LogInformation($"{pendingQuotes.Count} were found requiring a purchase order"); if (!pendingQuotes.Any()) { return; } var account = new Account(_config.AccountPrivateKey); var web3 = new Web3.Web3(account); var walletBuyerService = new WalletBuyerService(web3, _config.BuyerWalletAddress); foreach (var quote in pendingQuotes) { await CreatePoForQuote(logger, walletBuyerService, quote); } }
private async Task GetAllBalances() { var rpcClient = new RpcClient(new Uri(RpcUrl), new HttpClient()); var web3 = new Web3(rpcClient); var wbs = new WalletBuyerService(web3, WalletBuyerAddress); var wbsBal = await wbs.GetTokenBalanceOwnedByThisQueryAsync(TokenAddress); WalletBuyerBalance = $"{wbsBal.ToString()} {TokenSymbol}"; var fs = new FundingService(web3, FundingAddress); var fsBal = await fs.GetBalanceOfThisQueryAsync(TokenAddress); FundingBalance = $"{fsBal.ToString()} {TokenSymbol}"; var wss = new WalletSellerService(web3, WalletSellerAddress); var wssBal = await wss.GetTokenBalanceOwnedByThisQueryAsync(TokenAddress); WalletSellerBalance = $"{wssBal.ToString()} {TokenSymbol}"; }
private async Task GetAllDescs() { var rpcClient = new RpcClient(new Uri(RpcUrl), new HttpClient()); var web3 = new Web3(rpcClient); // Buyer // use wallet to get system id, then bp storage to get system desc var wbs = new WalletBuyerService(web3, WalletBuyerAddress); var wbsSysId = await wbs.SystemIdQueryAsync(); var bpss = new BusinessPartnerStorageService(web3, BusinessPartnersContractAddress); WalletBuyerDesc = await bpss.GetSystemDescriptionQueryAsync(wbsSysId); // Seller var wss = new WalletSellerService(web3, WalletSellerAddress); var wssSysId = await wss.SystemIdQueryAsync(); WalletSellerDesc = await bpss.GetSystemDescriptionQueryAsync(wssSysId); // Funding doesnt have an owner FundingDesc = ""; }
public async Task ExecuteAsync(ILogger logger) { if (!_config.Enabled) { logger.LogInformation($"{nameof(ProcessPurchaseOrderEventLogs)} is not enabled - see app settings"); return; } const int RequestRetryWeight = 0; // see below for retry algorithm var web3 = new Web3.Web3(_eshopConfiguration.EthereumRpcUrl); var walletBuyerService = new WalletBuyerService(web3, _eshopConfiguration.BuyerWalletAddress); var purchasingContractAddress = await walletBuyerService.PurchasingQueryAsync(); var filter = new NewFilterInput { Address = new[] { purchasingContractAddress } }; ILog log = logger.ToILog(); EventLogProcessorHandler <PurchaseOrderCreatedLogEventDTO> poCreatedHandler = CreatePurchaseOrderCreatedHandler(logger); var logProcessorHandlers = new ProcessorHandler <FilterLog>[] { poCreatedHandler }; IBlockchainProcessingOrchestrator orchestrator = new LogOrchestrator( ethApi: web3.Eth, logProcessors: logProcessorHandlers, filterInput: filter, defaultNumberOfBlocksPerRequest: (int)_config.NumberOfBlocksPerBatch, retryWeight: RequestRetryWeight); IWaitStrategy waitForBlockConfirmationsStrategy = new WaitStrategy(); ILastConfirmedBlockNumberService lastConfirmedBlockNumberService = new LastConfirmedBlockNumberService( web3.Eth.Blocks.GetBlockNumber, waitForBlockConfirmationsStrategy, _config.MinimumBlockConfirmations, log); var processor = new BlockchainProcessor( orchestrator, BlockProgressRepository, lastConfirmedBlockNumberService); var cancellationToken = new CancellationTokenSource(_config.TimeoutMs); var currentBlockOnChain = await web3.Eth.Blocks.GetBlockNumber.SendRequestAsync(); var blockToProcessTo = currentBlockOnChain.Value - _config.MinimumBlockConfirmations; var lastBlockProcessed = await BlockProgressRepository.GetLastBlockNumberProcessedAsync(); var minStartingBlock = _config.GetMinimumStartingBlock(); logger.LogInformation( $"Processing logs. To Block: {blockToProcessTo}, Last Block Processed: {lastBlockProcessed ?? 0}, Min Block: {minStartingBlock}"); await processor.ExecuteAsync( toBlockNumber : blockToProcessTo, cancellationToken : cancellationToken.Token, startAtBlockNumberIfNotProcessed : minStartingBlock); }