コード例 #1
0
        public async Task <WhitelistItemCreateResponse> CreateWhitelistItemAsync(WhitelistItemCreateRequest request)
        {
            var retryPolicy = Policy
                              .Handle <Exception>(ex =>
            {
                _log.WriteWarning(nameof(CreateWhitelistItemAsync), new { requestId = request.RequestId, clientId = request.Scope.UserNativeId, accountId = request.Scope.AccountId }, $"Retry on Exception: {ex.Message}.", ex);
                return(true);
            })
                              .OrResult <WhitelistItemCreateResponse>(response =>
            {
                if (response.BodyCase == WhitelistItemCreateResponse.BodyOneofCase.Error)
                {
                    _log.WriteWarning(nameof(CreateWhitelistItemAsync), response.ToJson(), "Response from sirius.");
                }

                return(response.BodyCase == WhitelistItemCreateResponse.BodyOneofCase.Error);
            }
                                                                      )
                              .WaitAndRetryAsync(_delay);

            try
            {
                _log.WriteInfo(nameof(CreateWhitelistItemAsync), info: "Creating whitelist item in sirius",
                               context: new { requestId = request.RequestId, clientId = request.Scope.UserNativeId, accountId = request.Scope.AccountId });

                var result = await retryPolicy.ExecuteAsync(async() => await _siriusApiClient.WhitelistItems.CreateAsync(request));

                if (result.BodyCase == WhitelistItemCreateResponse.BodyOneofCase.Error)
                {
                    _log.WriteError(nameof(CreateWhitelistItemAsync), new { requestId = request.RequestId, clientId = request.Scope.UserNativeId, accountId = request.Scope.AccountId });
                    return(null);
                }

                _log.WriteInfo(nameof(CreateWhitelistItemAsync), info: "Whitelist item created in siruis",
                               context: new { whitelistItemId = result.WhitelistItem.Id, requestId = request.RequestId, clientId = request.Scope.UserNativeId, accountId = request.Scope.AccountId });

                return(result);
            }
            catch (Exception ex)
            {
                _log.WriteError(nameof(CreateWhitelistItemAsync), new { requestId = request.RequestId, clientId = request.Scope.UserNativeId, accountId = request.Scope.AccountId }, ex);
                return(null);
            }
        }
コード例 #2
0
        public async Task CreateWalletsAsync(string clientId)
        {
            long?accountId = null;

            var accountResponse = await SearchAccountAsync(clientId);

            if (accountResponse == null)
            {
                _log.WriteWarning(nameof(CreateWalletsAsync), info: "Error getting account from sirius", context: new { clientId });
                return;
            }

            if (accountResponse.Body.Items.Count == 0)
            {
                string accountRequestId = $"{_brokerAccountId}_{clientId}_account";
                string userRequestId    = $"{clientId}_user";

                var userCreateResponse = await CreateUserAsync(clientId, userRequestId);

                if (userCreateResponse == null)
                {
                    _log.WriteWarning(nameof(CreateWalletsAsync), info: "Error creating user in sirius",
                                      context: new { clientId, requestId = userRequestId });
                    return;
                }

                var createResponse = await CreateAccountAsync(clientId, userCreateResponse.User.Id, accountRequestId);

                if (createResponse == null)
                {
                    _log.WriteWarning(nameof(CreateWalletsAsync), info: "Error creating account in sirius",
                                      context: new { clientId, requestId = accountRequestId });
                    return;
                }

                accountId = createResponse.Body.Account.Id;

                await WaitForActiveWalletsAsync(clientId, accountId);
            }
            else
            {
                accountId = accountResponse.Body.Items.FirstOrDefault()?.Id;
            }

            var whitelistItemRequest = new WhitelistItemCreateRequest
            {
                Name  = "Trading Wallet Whitelist",
                Scope = new WhitelistItemScope {
                    BrokerAccountId = _brokerAccountId, AccountId = accountId, UserNativeId = clientId
                },
                Details = new WhitelistItemDetails
                {
                    TransactionType = WhitelistTransactionType.Any, TagType = new NullableWhitelistItemTagType {
                        Null = NullValue.NullValue
                    }
                },
                Lifespan = new WhitelistItemLifespan {
                    StartsAt = Timestamp.FromDateTime(DateTime.UtcNow)
                },
                RequestId = $"lykke:trading_wallet:{clientId}"
            };

            var whitelistItemCreateResponse = await CreateWhitelistItemAsync(whitelistItemRequest);

            if (whitelistItemCreateResponse == null)
            {
                _log.WriteWarning(nameof(CreateWalletsAsync), info: "Error creating Whitelist item",
                                  context: new { clientId, accountId });
            }
        }
コード例 #3
0
        public async Task <IActionResult> CreateWhitelistingAsync([FromBody] CreateWhitelistingRequest request)
        {
            if (string.IsNullOrWhiteSpace(request.AddressBase))
            {
                throw LykkeApiErrorException.BadRequest(LykkeApiErrorCodes.Service.InvalidInput);
            }

            var check2FaResult = await _google2FaService.Check2FaAsync <string>(_requestContext.ClientId, request.Code2Fa);

            if (check2FaResult != null)
            {
                return(Ok(check2FaResult));
            }

            var asset = await _assetsHelper.GetAssetAsync(request.AssetId);

            var assetsAvailableToUser = await _assetsHelper.GetSetOfAssetsAvailableToClientAsync(_requestContext.ClientId, _requestContext.PartnerId, true);

            if (asset == null || asset.BlockchainIntegrationType != BlockchainIntegrationType.Sirius && assetsAvailableToUser.Contains(asset.Id))
            {
                throw LykkeApiErrorException.BadRequest(LykkeApiErrorCodes.Service.AssetUnavailable);
            }

            var wallets = (await _clientAccountService.Wallets.GetClientWalletsFilteredAsync(_requestContext.ClientId,
                                                                                             owner: OwnerType.Spot, walletType: WalletType.Trusted)).ToList();

            if (wallets.All(x => x.Id != request.WalletId))
            {
                throw LykkeApiErrorException.BadRequest(LykkeApiErrorCodes.Service.InvalidInput);
            }

            var siriusAsset = await _siriusWalletsService.GetAssetByIdAsync(asset.SiriusAssetId);

            if (siriusAsset == null)
            {
                throw LykkeApiErrorException.BadRequest(LykkeApiErrorCodes.Service.AssetUnavailable);
            }

            var siriusAccount = await _siriusWalletsService.SearchAccountAsync(_requestContext.ClientId, request.WalletId);

            if (siriusAccount == null)
            {
                throw LykkeApiErrorException.BadRequest(LykkeApiErrorCodes.Service.BlockchainWalletDepositAddressNotGenerated);
            }

            var whitelistedItems = await _siriusWalletsService.GetWhitelistItemsAsync(siriusAccount.Body.Items.First().Id);

            if (whitelistedItems.Any(x => x.Details.Address == request.AddressBase && x.Details.Tag == request.AddressExtension))
            {
                throw LykkeApiErrorException.BadRequest(LykkeApiErrorCodes.Service.AddressAlreadyWhitelisted);
            }

            var requestId = $"lykke:hft:withdrawals:{request.WalletId}:{request.Name}:{request.AssetId}:{request.AddressBase}:{request.AddressExtension ?? string.Empty}";

            var whitelistItemRequest = new WhitelistItemCreateRequest
            {
                Name  = request.Name,
                Scope = new WhitelistItemScope {
                    BrokerAccountId = _siriusApiServiceClientSettings.BrokerAccountId,
                    AccountId       = siriusAccount.Body.Items.First().Id,
                    UserNativeId    = _requestContext.ClientId
                },
                Details = new WhitelistItemDetails
                {
                    AssetId      = siriusAsset.Id,
                    BlockchainId = siriusAsset.BlockchainId,
                    Address      = request.AddressBase,
                    Tag          = request.AddressExtension,
                    TagType      =
                        new NullableWhitelistItemTagType
                    {
                        TagType = WhitelistItemTagType.Number     //TODO: specify tag type depending on the blockchain
                    },
                    TransactionType = WhitelistTransactionType.Withdrawal
                },
                Lifespan = new WhitelistItemLifespan {
                    StartsAt = Timestamp.FromDateTime(DateTime.UtcNow.Add(_whitelistingSettings.WaitingPeriod))
                },
                RequestId = requestId
            };

            var result = await _siriusWalletsService.CreateWhitelistItemAsync(whitelistItemRequest);

            if (result == null)
            {
                throw LykkeApiErrorException.BadRequest(LykkeApiErrorCodes.Service.WhitelistingError);
            }

            await SendWhitelistEmail(_requestContext.ClientId, asset.DisplayId, request.AddressBase,
                                     request.AddressExtension);

            return(Ok(Google2FaResultModel <WhitelistingResponseModel> .Success(new WhitelistingResponseModel
            {
                Id = result.WhitelistItem.Id.ToString(),
                WalletName = wallets.Single(y => y.Id == request.WalletId).Name,
                AssetName = asset.DisplayId,
                Status = WhitelistingStatus.Pending,
                AddressBase = request.AddressBase,
                AddressExtension = request.AddressExtension,
                StartsAt = result.WhitelistItem.Lifespan.StartsAt.ToDateTime(),
                CreatedAt = result.WhitelistItem.CreatedAt.ToDateTime(),
                Name = request.Name
            })));
        }