public override async Task Execute()
        {
            var currentState = await _state.GetAsync();

            var state = currentState != null ? currentState.State : default;
            var trace = await _job.TraceDepositsAsync(state, async assetId => await _assets.GetAsync(assetId));

            var operationHashes = new HashSet <string>();
            var deposits        = new List <BlockchainAction>();

            foreach (var action in trace.actions)
            {
                // to be able to enroll fake transfers properly
                // we keep block number increased by one order of magnitude
                action.BlockNumber *= 10;

                // changes made by our operations are accounted by API service,
                // so here we enroll external deposits only
                if (operationHashes.Contains(action.TransactionHash))
                {
                    continue;
                }
                else if (await _operations.GetOperationIndexAsync(action.TransactionHash) != null)
                {
                    operationHashes.Add(action.TransactionHash);
                }
                else
                {
                    deposits.Add(action);
                }
            }

            // filter out actions with invalid Azure symbols
            deposits = deposits
                       .Where(a =>
            {
                var containsInvalidSymbols =
                    !Validators.ValidateAzureKey(a.ActionId) ||
                    !Validators.ValidateAzureKey(a.Address) ||
                    !Validators.ValidateAzureKey(a.AssetId) ||
                    !Validators.ValidateAzureKey(a.TransactionHash);

                if (containsInvalidSymbols)
                {
                    _log.Warning("Invalid Azure symbols and/or length in action", context: a);
                }

                return(!containsInvalidSymbols);
            })
                       .ToList();

            await _depositWallets.EnrollIfObservedAsync(deposits);

            _chaosKitty?.Meow($"{nameof(Execute)}_Enroll");

            await _state.UpsertAsync(trace.state);

            _chaosKitty?.Meow($"{nameof(Execute)}_UpdateState");
        }
Exemplo n.º 2
0
        public async Task GetAssetbyID_Database_test(int id)
        {
            using var connection = Database_init();
            var options = new DbContextOptionsBuilder <mmpproject2Context>().UseSqlite(connection).Options;

            using var context = new mmpproject2Context(options);
            var repo = new AssetRepository(options);

            var asset = await repo.GetAsync(id);

            var assetActual = context.Assets.Where(x => x.Id == id).Single();

            Assert.Equal(asset.Id, assetActual.Id);
            Assert.Equal(asset.Quantity, assetActual.Quantity);
        }
Exemplo n.º 3
0
        public async Task <ActionResult> Transfer(TestingTransferRequest request)
        {
            var caps = _api.GetCapabilities();

            if (!caps.IsTestingTransfersSupported.HasValue ||
                !caps.IsTestingTransfersSupported.Value)
            {
                return(StatusCode(501));
            }

            var asset = await _assets.GetAsync(request.AssetId);

            if (asset == null)
            {
                return(BadRequest(BlockchainErrorResponse.Create("Unknown asset")));
            }

            var amount = 0M;

            try
            {
                amount = Conversions.CoinsFromContract(request.Amount, asset.Accuracy);
            }
            catch (ConversionException)
            {
                return(BadRequest(BlockchainErrorResponse.Create("Invalid amount format")));
            }

            if (amount < 0 || !_api.AddressIsValid(request.FromAddress) || !_api.AddressIsValid(request.ToAddress))
            {
                return(BadRequest(BlockchainErrorResponse.Create("Invalid address(es) and/or negative amount")));
            }

            var result = await _api.TestingTransfer(
                request.FromAddress,
                request.FromPrivateKey,
                request.ToAddress,
                asset,
                amount);

            return(Ok(result));
        }
Exemplo n.º 4
0
        public async Task <ActionResult <PaginationResponse <WalletBalanceContract> > > Get(int take, string continuation)
        {
            if (take <= 0)
            {
                return(BadRequest(BlockchainErrorResponse.Create("'take' must be grater than zero")));
            }

            if (!Validators.ValidateAzureContinuation(continuation))
            {
                return(BadRequest(BlockchainErrorResponse.Create("'continuation' must be null or valid Azure continuation token")));
            }

            IEnumerable <DepositWalletBalanceEntity> balances;

            if (_api.CanGetBalances)
            {
                // to be able to enroll fake transfers properly
                // we keep block number increased by one order of magnitude
                var lastConfirmedBlock = await _api.GetLastConfirmedBlockNumberAsync() * 10;

                var depositWallets = await _depositWallets.GetWalletsAsync(take, continuation);

                var addresses = depositWallets.items.Select(w => w.Address).ToArray();

                continuation = depositWallets.continuation;
                balances     = (await _api.GetBalancesAsync(addresses, async assetId => await _assets.GetAsync(assetId)))
                               .Select(b => new DepositWalletBalanceEntity(b.Address, b.AssetId)
                {
                    Amount      = b.Amount,
                    BlockNumber = lastConfirmedBlock
                });
            }
            else
            {
                (balances, continuation) =
                    await _depositWallets.GetBalanceAsync(take, continuation);
            }

            var result = new List <WalletBalanceContract>();

            foreach (var balance in balances)
            {
                // blockchain may return unknown assets,
                // filter out such items

                var accuracy = (await _assets.GetAsync(balance.AssetId))?.Accuracy;
                if (accuracy == null)
                {
                    continue;
                }

                result.Add(new WalletBalanceContract
                {
                    Address = balance.Address,
                    AssetId = balance.AssetId,
                    Balance = Conversions.CoinsToContract(balance.Amount, accuracy.Value),
                    Block   = balance.BlockNumber
                });
            }

            return(PaginationResponse.From(continuation, result));
        }