feat: add Reserved Addresses view with filtering, pagination and labels (#6796)

* feat: add reservedAt metadata when address is generated from receive

* feat: add link to Reserved Addresses in wallet navigation

* feat: add ReservedAddressesViewModel with labels and reserved timestamp

* feat: implement Reserved Addresses view with filtering, pagination and label management

* feat: add GetReservedAddressesWithDetails with label and timestamp support

* feat: add ReservedAddresses endpoint

* test: add Reserved Addresses view test with label, filter and pagination

* test: use stable ID for filter input instead of placeholder

* Moving Reserved Addresses to Receive page

* feat: sync labels created via Label Manager using labelmanager:changed event

* refactor: optimize GetReservedAddressesWithDetails using direct SQL query

* feat: add link to filter Reserved Addresses by label from Wallet Labels view

* refactor: remove legacy selenium test

* test: add playwright tests with label filtering, pagination and redirect from Wallet Labels view

* refactor: optimize Reserved Addresses filtering with Set and Safe.Json

---------

Co-authored-by: rockstardev <5191402+rockstardev@users.noreply.github.com>
This commit is contained in:
thgO.O
2025-07-03 21:30:23 -03:00
committed by GitHub
parent 5d5eb19142
commit 632d4433e0
11 changed files with 422 additions and 8 deletions

View File

@@ -763,6 +763,26 @@ namespace BTCPayServer.Controllers
return RedirectToAction(nameof(WalletReceive), new { walletId, returnUrl = vm.ReturnUrl });
}
[HttpGet("{walletId}/addresses")]
public async Task<IActionResult> ReservedAddresses(
[ModelBinder(typeof(WalletIdModelBinder))] WalletId walletId)
{
var paymentMethod = GetDerivationSchemeSettings(walletId);
if (paymentMethod == null)
return NotFound();
var labeledAddresses = await WalletRepository.GetReservedAddressesWithDetails(walletId);
var vm = new ReservedAddressesViewModel
{
WalletId = walletId.ToString(),
CryptoCode = walletId.CryptoCode,
Addresses = labeledAddresses
};
return View(vm);
}
private async Task SendFreeMoney(Cheater cheater, WalletId walletId, DerivationSchemeSettings paymentMethod)
{
var c = this.ExplorerClientProvider.GetExplorerClient(walletId.CryptoCode);