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 } } } }