Esempio n. 1
0
        private async Task <Transaction> SignTransactionAsync(TransferSigningRequest request)
        {
            var protectionType = request.DoubleSpendingProtectionType switch
            {
                DoubleSpendingProtectionType.Coins =>
                Swisschain.Sirius.Sdk.Primitives.DoubleSpendingProtectionType.Coins,
                DoubleSpendingProtectionType.Nonce =>
                Swisschain.Sirius.Sdk.Primitives.DoubleSpendingProtectionType.Nonce,
                _ => throw new InvalidEnumArgumentException(
                          nameof(request.DoubleSpendingProtectionType),
                          (int)request.DoubleSpendingProtectionType,
                          typeof(DoubleSpendingProtectionType))
            };

            var coins = request.CoinsToSpend?
                        .Select(x =>
                                new Coin(
                                    new Swisschain.Sirius.Sdk.Primitives.CoinId(x.Id.TransactionId,
                                                                                x.Id.Number),
                                    new Swisschain.Sirius.Sdk.Primitives.BlockchainAsset(
                                        new Swisschain.Sirius.Sdk.Primitives.BlockchainAssetId(
                                            x.Asset.Id.Symbol,
                                            x.Asset.Id.Address),
                                        x.Asset.Accuracy),
                                    x.Value,
                                    x.Address,
                                    x.Redeem
                                    ))
                        .ToArray() ?? Array.Empty <Coin>();

            var transaction = await Transaction.Create(
                _walletRepository,
                _encryptionService,
                request.Id,
                request.BlockchainId,
                request.CreatedAt.ToDateTime(),
                request.NetworkType switch
            {
                NetworkType.Private => Swisschain.Sirius.Sdk.Primitives.NetworkType.Private,
                NetworkType.Test => Swisschain.Sirius.Sdk.Primitives.NetworkType.Test,
                NetworkType.Public => Swisschain.Sirius.Sdk.Primitives.NetworkType.Public,
                _ => throw new ArgumentOutOfRangeException(nameof(request.NetworkType),
                                                           request.NetworkType,
                                                           null)
            },
        public async Task InsertOrUpdateAsync(TransferSigningRequest transferSigningRequest)
        {
            await using var context = new DatabaseContext(_dbContextOptionsBuilder.Options);

            var affectedRowsCount = await context.TransferSigningRequests
                                    .Where(entity => entity.Id == transferSigningRequest.Id &&
                                           entity.UpdatedAt <= transferSigningRequest.UpdatedAt)
                                    .UpdateAsync(x => new TransferSigningRequest
            {
                Id                     = transferSigningRequest.Id,
                TransferId             = transferSigningRequest.TransferId,
                TenantId               = transferSigningRequest.TenantId,
                VaultId                = transferSigningRequest.VaultId,
                VaultType              = transferSigningRequest.VaultType,
                Blockchain             = transferSigningRequest.Blockchain,
                BuiltTransaction       = transferSigningRequest.BuiltTransaction,
                SigningAddresses       = transferSigningRequest.SigningAddresses,
                CoinsToSpend           = transferSigningRequest.CoinsToSpend,
                RejectionReason        = transferSigningRequest.RejectionReason,
                RejectionReasonMessage = transferSigningRequest.RejectionReasonMessage,
                State                  = transferSigningRequest.State,
                Document               = transferSigningRequest.Document,
                Signature              = transferSigningRequest.Signature,
                Group                  = transferSigningRequest.Group,
                Sequence               = transferSigningRequest.Sequence,
                CreatedAt              = transferSigningRequest.CreatedAt,
                UpdatedAt              = transferSigningRequest.UpdatedAt
            });

            if (affectedRowsCount == 0)
            {
                try
                {
                    context.TransferSigningRequests.Add(transferSigningRequest);
                    await context.SaveChangesAsync();
                }
                catch (DbUpdateException exception) when(exception.InnerException is PostgresException pgException &&
                                                         pgException.SqlState == PostgresErrorCodes.UniqueViolation)
                {
                    // ignore
                }
            }
        }
    }