Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions src/Data/Repositories/FUTXORepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -144,5 +144,31 @@ public async Task<List<FMUTXO>> GetLockedUTXOs(int? ignoredWalletWithdrawalReque

return result;
}

public async Task<List<FMUTXO>> GetLockedUTXOsByWalletId(int walletId)
{
await using var applicationDbContext = await _dbContextFactory.CreateDbContextAsync();

var walletWithdrawalRequestsLockedUTXOs = await applicationDbContext.WalletWithdrawalRequests
.Include(x => x.UTXOs)
.Where(x => x.Status == WalletWithdrawalRequestStatus.Pending ||
x.Status == WalletWithdrawalRequestStatus.PSBTSignaturesPending ||
x.Status == WalletWithdrawalRequestStatus.FinalizingPSBT ||
x.Status == WalletWithdrawalRequestStatus.OnChainConfirmationPending)
.Where(x => x.WalletId == walletId)
.SelectMany(x => x.UTXOs)
.ToListAsync();

var channelOperationRequestsLockedUTXOs = await applicationDbContext.ChannelOperationRequests.Include(x => x.Utxos)
.Where(x => x.Status == ChannelOperationRequestStatus.Pending ||
x.Status == ChannelOperationRequestStatus.PSBTSignaturesPending ||
x.Status == ChannelOperationRequestStatus.FinalizingPSBT ||
x.Status == ChannelOperationRequestStatus.OnChainConfirmationPending)
.Where(x => x.WalletId == walletId)
.SelectMany(x => x.Utxos)
.ToListAsync();

return walletWithdrawalRequestsLockedUTXOs.Union(channelOperationRequestsLockedUTXOs).ToList();
}
}
}
1 change: 1 addition & 0 deletions src/Data/Repositories/Interfaces/IFMUTXORepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,5 @@ public interface IFMUTXORepository
/// </summary>
/// <returns></returns>
Task<List<FMUTXO>> GetLockedUTXOs(int? ignoredWalletWithdrawalRequestId = null, int? ignoredChannelOperationRequestId = null);
Task<List<FMUTXO>> GetLockedUTXOsByWalletId(int walletId);
}
11 changes: 10 additions & 1 deletion src/Rpc/NodeGuardService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1003,10 +1003,19 @@ public override async Task<GetUtxosResponse> GetAvailableUtxos(GetAvailableUtxos
throw new Exception("Derivation strategy not found for wallet with id {walletId}");
}

var lockedUtxos = await _fmutxoRepository.GetLockedUTXOs();
var walletUtxos = await _nbXplorerService.GetUTXOsAsync(derivationStrategy);
var lockedUtxos = await _fmutxoRepository.GetLockedUTXOsByWalletId(wallet.Id);
var ignoreOutpoints = new List<string>();
var listLocked = lockedUtxos.Select(utxo => $"{utxo.TxId}-{utxo.OutputIndex}").ToList();
var listFrozen = await _coinSelectionService.GetFrozenUTXOs();

// filter frozen list by only including UTXOs that belong to the wallet
// TODO: find a way to add wallet id to the UTXOTag model
listFrozen = listFrozen
.Where(utxo => walletUtxos.Confirmed.UTXOs.Any(u => u.Outpoint.ToString() == utxo) ||
walletUtxos.Unconfirmed.UTXOs.Any(u => u.Outpoint.ToString() == utxo))
.ToList();

ignoreOutpoints.AddRange(listLocked);
ignoreOutpoints.AddRange(listFrozen);

Expand Down
Loading