Exemple #1
0
        public static async Task <IActionResult> CalculateContractFee(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "calculatecontractfee/{address}")] HttpRequest req,
            string address,
            ILogger log,
            [Inject(typeof(IBlockchainClientRepository))] IBlockchainClientRepository blockchainRepo,
            [Inject(typeof(IRepository <DeployedContract>))] IRepository <DeployedContract> repo)
        {
            var contract = await repo.Get(address);

            if (contract.ExpirationDateTime < DateTime.UtcNow)
            {
                return(new BadRequestObjectResult("Expiration date is in the past"));
            }

            var ownerAddress = "0x0";

            var client = blockchainRepo.GetClient(contract.Network.Name);

            if (client != null)
            {
                ownerAddress = await client.GetDefaultAccount();
            }

            var fee = new Fee
            {
                Sender    = contract.OwnerAddress,
                Recipient = ownerAddress,
                Contract  = contract,
                Timestamp = DateTime.UtcNow,
                Amount    = contract.GetRequiredFeeAmount()
            };

            return(new OkObjectResult(fee));
        }
        public static async Task MonitorFeePayments([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, ILogger log,
                                                    [Inject(typeof(IBlockchainClientRepository))] IBlockchainClientRepository blockchainRepo,
                                                    [Inject(typeof(IRepository <Fee>))] IRepository <Fee> feeRepo,
                                                    [Inject(typeof(IRepository <DeployedContract>))] IRepository <DeployedContract> contractRepo)
        {
            log.LogInformation($"Monitor Fee Payments trigger function executed at: {DateTime.Now}");

            // Uncomfirmed fees not older than 1 hour
            var cutOff          = DateTime.UtcNow.AddHours(-1);
            var uncomfirmedFees = await feeRepo.Find(f => !f.IsConfirmed && f.Timestamp >= cutOff);

            foreach (var fee in uncomfirmedFees)
            {
                var client = blockchainRepo.GetClient(fee.Contract.Network.Name);
                if (client != null)
                {
                    var transaction = await client.GetTransaction(fee.TransactionHash);

                    var paidAmount = transaction.Value ?? transaction.Value.Value;
                    if (paidAmount != 0 && paidAmount >= fee.Contract.GetRequiredFeeAmount())
                    {
                        // Complete fee record and register contract
                        fee.IsConfirmed = true;
                        await feeRepo.Update(fee);

                        var contract = await contractRepo.Get(fee.Contract.Address);

                        contract.IsRegistered = true;
                        await contractRepo.Update(contract);

                        log.LogInformation($"{contract.Address}: {paidAmount} received.");
                    }
                }
            }
        }
        public static async Task ListenForInsuranceBoughtEvents([TimerTrigger("*/30 * * * * *")] TimerInfo myTimer, ILogger log,
                                                                [Inject(typeof(IBlockchainClientRepository))] IBlockchainClientRepository blockchainRepo,
                                                                [Inject(typeof(IBlobContractFileRepository))] IBlobContractFileRepository blobContractFileRepository,
                                                                [Inject(typeof(IDictionary <string, ContractEventListener <InsuranceBoughtEvent> >))] IDictionary <string, ContractEventListener <InsuranceBoughtEvent> > listeners,
                                                                [Inject(typeof(IRepository <Purchase>))] IRepository <Purchase> purchaseRepo,
                                                                [Inject(typeof(IRepository <DeployedContract>))] IRepository <DeployedContract> contractRepo)
        {
            try
            {
                log.LogInformation($"Listen for Insurance Bought Events trigger function executed at: {DateTime.Now}");

                var activeContracts = await contractRepo.Find(c => c.ExpirationDateTime >= DateTime.UtcNow);

                foreach (var contract in activeContracts)
                {
                    if (listeners.ContainsKey(contract.Address))
                    {
                        continue;
                    }

                    var client = blockchainRepo.GetClient(contract.Network.Name);
                    if (client == null)
                    {
                        continue;
                    }

                    var blobContractFile = await blobContractFileRepository.GetBlobContractFile(contract.OwnerAddress, contract.ContractFile.Name, true, true, false);

                    var listener = new ContractEventListener <InsuranceBoughtEvent>(client, blobContractFile.Abi.ToString(), contract.Address, "InsuranceBought",
                                                                                    (string contractAddress, InsuranceBoughtEvent capturedEvent) =>
                    {
                        var purchase = new Purchase()
                        {
                            Contract    = contract,
                            UserAddress = capturedEvent.User,
                            Notional    = UnitConversion.Convert.FromWei(capturedEvent.Notional),
                            Premium     = UnitConversion.Convert.FromWei(capturedEvent.Premium),
                            Timestamp   = DateTime.UtcNow
                        };
                        var result = purchaseRepo.AddNew(purchase).Result;

                        log.LogInformation($"Insurance bought: {contractAddress} {capturedEvent.Notional} {capturedEvent.Premium}");
                    },
                                                                                    log);
                    await listener.Start();

                    listeners.Add(contract.Address, listener);
                }

                foreach (var listener in listeners)
                {
                    await listener.Value.GetChanges();
                }
            }
            catch (Exception ex)
            {
                log.LogError($"Insurance Bought Events trigger error: {ex.Message}");
                throw ex;
            }
            finally
            {
                log.LogInformation($"Insurance Bought Events trigger finished at {DateTime.UtcNow.ToString()}");
            }
        }