示例#1
0
        public async Task <string> CreateTransferContract(string userAddress, string coinAdapterAddress)
        {
            ITransferContract contract = await GetTransferContract(userAddress, coinAdapterAddress);

            if (contract != null)
            {
                throw new ClientSideException(ExceptionType.EntityAlreadyExists, $"Transfer account for {userAddress} - {coinAdapterAddress} already exists");
            }

            ICoin coin = await GetCoinWithCheck(coinAdapterAddress);

            string queueName = QueueHelper.GenerateQueueNameForContractPool(coinAdapterAddress);
            ITransferContractQueueService transferContractQueueService = _transferContractQueueServiceFactory.Get(queueName);
            ITransferContract             transferContract             = await transferContractQueueService.GetContract();

            transferContract.UserAddress = userAddress;

            await _transferContractRepository.SaveAsync(transferContract);

            await _transferContractUserAssignmentQueueService.PushContract(new TransferContractUserAssignment()
            {
                TransferContractAddress = transferContract.ContractAddress,
                UserAddress             = userAddress,
                CoinAdapterAddress      = coin.AdapterAddress
            });

            return(transferContract.ContractAddress);
        }
        public async Task Execute()
        {
            await _logger.WriteInfoAsync("PoolRenewJob", "Execute", "", "PoolRenewJob has been started ", DateTime.UtcNow);

            await _coinRepository.ProcessAllAsync(async (coins) =>
            {
                foreach (var coin in coins)
                {
                    try
                    {
                        string coinPoolQueueName = QueueHelper.GenerateQueueNameForContractPool(coin.AdapterAddress);
                        ITransferContractQueueService transferContractQueueService =
                            _transferContractQueueServiceFactory.Get(coinPoolQueueName);
                        var count = await transferContractQueueService.Count();

                        for (int i = 0; i < count; i++)
                        {
                            var contract = await transferContractQueueService.GetContract();
                            if (contract == null)
                            {
                                return;
                            }
                            await transferContractQueueService.PushContract(contract);
                        }

                        await _logger.WriteInfoAsync("PoolRenewJob", "Execute", "", $"PoolRenewJob has been finished for {count} contracts in {coinPoolQueueName} ", DateTime.UtcNow);
                    }
                    catch (Exception e)
                    {
                        await _logger.WriteErrorAsync("PoolRenewJob", "Execute", "", e);
                    }
                }
            });
        }
示例#3
0
        public async Task Execute(ICoin coin)
        {
            await InternalBalanceCheck();

            string coinPoolQueueName = QueueHelper.GenerateQueueNameForContractPool(coin.AdapterAddress);
            ITransferContractQueueService transferContractQueueService =
                _transferContractQueueServiceFactory.Get(coinPoolQueueName);

            int currentCount = await transferContractQueueService.Count();

            if (currentCount < _settings.MinContractPoolLength)
            {
                while (currentCount < _settings.MaxContractPoolLength)
                {
                    await InternalBalanceCheck();

                    List <string> trHashes = new List <string>(_settings.ContractsPerRequest);

                    for (int i = 0; i < _settings.ContractsPerRequest; i++)
                    {
                        var transferContractTrHash =
                            await _transferContractService.CreateTransferContractTrHashWithoutUser(coin.AdapterAddress);

                        trHashes.Add(transferContractTrHash);
                    }

                    IEnumerable <string> contractAddresses = await _contractService.GetContractsAddresses(trHashes);

                    List <Task> contractPushTasks = new List <Task>();

                    foreach (var address in contractAddresses)
                    {
                        await transferContractQueueService.PushContract(new TransferContract()
                        {
                            CoinAdapterAddress   = coin.AdapterAddress,
                            ContainsEth          = coin.ContainsEth,
                            ContractAddress      = address,
                            ExternalTokenAddress = coin.ExternalTokenAddress,
                        });
                    }

                    currentCount += _settings.ContractsPerRequest;
                }
            }
        }