Ejemplo n.º 1
0
        public Task <TransactionReceipt> SetSchemeRequestAndWaitForReceiptAsync(List <AttributeDefinition> definitions, CancellationTokenSource cancellationToken = null)
        {
            var setSchemeFunction = new SetSchemeFunction();

            setSchemeFunction.Definitions = definitions;

            return(ContractHandler.SendRequestAndWaitForReceiptAsync(setSchemeFunction, cancellationToken));
        }
Ejemplo n.º 2
0
        public Task <string> SetSchemeRequestAsync(List <AttributeDefinition> definitions)
        {
            var setSchemeFunction = new SetSchemeFunction();

            setSchemeFunction.Definitions = definitions;

            return(ContractHandler.SendRequestAsync(setSchemeFunction));
        }
Ejemplo n.º 3
0
 public Task <string> SetSchemeRequestAsync(SetSchemeFunction setSchemeFunction)
 {
     return(ContractHandler.SendRequestAsync(setSchemeFunction));
 }
Ejemplo n.º 4
0
 public Task <TransactionReceipt> SetSchemeRequestAndWaitForReceiptAsync(SetSchemeFunction setSchemeFunction, CancellationTokenSource cancellationToken = null)
 {
     return(ContractHandler.SendRequestAndWaitForReceiptAsync(setSchemeFunction, cancellationToken));
 }
Ejemplo n.º 5
0
        public async Task <ActionStatus> StoreScheme(long accountId, Client.Common.Entities.AttributeDefinition[] attributeDefinitions)
        {
            ActionStatus actionStatus = new ActionStatus
            {
                IntegrationType   = Key,
                IntegrationAction = nameof(StoreScheme),
                ActionSucceeded   = true
            };

            await _semaphoreSlim.WaitAsync();

            try
            {
                var privateKey = _dataAccessService.GetAccountKeyValue(accountId, "RskSecretKey");
                if (string.IsNullOrEmpty(privateKey))
                {
                    actionStatus.ActionSucceeded = false;
                    actionStatus.ErrorMsg        = $"Account {accountId} has no integration with {Key}";
                }
                else
                {
                    var account = new Account(privateKey);

                    actionStatus.IntegrationAddress = account.Address;

                    var web3 = new Web3(account, _integrationConfiguration.RpcUri);
                    var o10IdentityService = new O10IdentityService(web3, _integrationConfiguration.ContractAddress);

                    var issuers = await o10IdentityService.GetAllIssuersQueryAsync().ConfigureAwait(false);

                    if (!issuers.ReturnValue1.Any(issuers => issuers.Address.Equals(account.Address, StringComparison.InvariantCultureIgnoreCase)))
                    {
                        actionStatus.ActionSucceeded = false;
                        actionStatus.ErrorMsg        = $"Account with Id {accountId} not registered as an Identity Provider";
                    }
                    else
                    {
                        GetSchemeOutputDTO scheme = null;
                        try
                        {
                            scheme = await o10IdentityService.GetSchemeQueryAsync(account.Address).ConfigureAwait(false);
                        }
                        catch (Exception)
                        {
                            scheme = null;
                        }

                        List <AttributeDefinition> definitions = attributeDefinitions.Select(a => new AttributeDefinition {
                            AttributeName = a.AttributeName, AttributeScheme = a.SchemeName, Alias = a.Alias, IsRoot = a.IsRoot
                        }).ToList();
                        if (scheme?.ReturnValue2.All(a => definitions.Any(d => a.AttributeName == d.AttributeName && a.AttributeScheme == d.AttributeScheme && a.Alias == d.Alias && a.IsRoot == d.IsRoot)) ?? false)
                        {
                            actionStatus.ActionSucceeded = true;
                        }
                        else
                        {
                            var balance = await web3.Eth.GetBalance.SendRequestAsync(account.Address).ConfigureAwait(false);

                            var functionTransactionHandler = web3.Eth.GetContractTransactionHandler <SetSchemeFunction>();
                            SetSchemeFunction func         = new SetSchemeFunction
                            {
                                Definitions = definitions
                            };
                            var esimatedGas = await functionTransactionHandler.EstimateGasAsync(_integrationConfiguration.ContractAddress, func).ConfigureAwait(false);

                            func.Gas = new BigInteger(esimatedGas.ToLong() * 10);
                            if (balance < func.Gas)
                            {
                                actionStatus.ActionSucceeded = false;
                                actionStatus.ErrorMsg        = "Not enough funds";
                            }
                            else
                            {
                                var receipt = await o10IdentityService.SetSchemeRequestAndWaitForReceiptAsync(func).ConfigureAwait(false);

                                if (receipt.Failed())
                                {
                                    actionStatus.ActionSucceeded = false;
                                    actionStatus.ErrorMsg        = $"Transaction with hash {receipt.TransactionHash} failed";
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.Error($"{nameof(StoreScheme)} failed for the acccount {accountId}", ex);
                actionStatus.ActionSucceeded = false;
                actionStatus.ErrorMsg        = ex.Message;
            }
            finally
            {
                _semaphoreSlim.Release();
            }

            return(actionStatus);
        }