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);
            }
        }
Exemple #3
0
        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}";
        }
Exemple #4
0
        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 = "";
        }
Exemple #5
0
        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);
        }