Fix: Monero payments in mempool not detected if accountIndex != 0 (Fix #6430) (#6544)

This commit is contained in:
Nicolas Dorier
2025-01-10 20:21:33 +09:00
committed by GitHub
parent d2c52c10bd
commit e0a51537a1
2 changed files with 45 additions and 5 deletions

View File

@@ -6,6 +6,6 @@ namespace BTCPayServer.Services.Altcoins.Monero.RPC.Models
{
[JsonProperty("txid")] public string TransactionId { get; set; }
[JsonProperty("account_index")] public long AccountIndex { get; set; }
[JsonProperty("account_index", DefaultValueHandling = DefaultValueHandling.Ignore)] public long? AccountIndex { get; set; }
}
}

View File

@@ -234,10 +234,7 @@ namespace BTCPayServer.Services.Altcoins.Monero.Services
private async Task OnTransactionUpdated(string cryptoCode, string transactionHash)
{
var paymentMethodId = PaymentTypes.CHAIN.GetPaymentMethodId(cryptoCode);
var transfer = await _moneroRpcProvider.WalletRpcClients[cryptoCode]
.SendCommandAsync<GetTransferByTransactionIdRequest, GetTransferByTransactionIdResponse>(
"get_transfer_by_txid",
new GetTransferByTransactionIdRequest() { TransactionId = transactionHash });
var transfer = await GetTransferByTxId(cryptoCode, transactionHash, this.CancellationToken);
var paymentsToUpdate = new List<(PaymentEntity Payment, InvoiceEntity invoice)>();
@@ -275,6 +272,49 @@ namespace BTCPayServer.Services.Altcoins.Monero.Services
}
}
private async Task<GetTransferByTransactionIdResponse> GetTransferByTxId(string cryptoCode,
string transactionHash, CancellationToken cancellationToken)
{
var accounts = await _moneroRpcProvider.WalletRpcClients[cryptoCode].SendCommandAsync<GetAccountsRequest, GetAccountsResponse>("get_accounts", new GetAccountsRequest(), cancellationToken);
var accountIndexes = accounts
.SubaddressAccounts
.Select(a => new long?(a.AccountIndex))
.ToList();
if (accountIndexes.Count is 0)
accountIndexes.Add(null);
var req = accountIndexes
.Select(i => GetTransferByTxId(cryptoCode, transactionHash, i))
.ToArray();
foreach (var task in req)
{
var result = await task;
if (result != null)
return result;
}
return null;
}
private async Task<GetTransferByTransactionIdResponse> GetTransferByTxId(string cryptoCode, string transactionHash, long? accountIndex)
{
try
{
var result = await _moneroRpcProvider.WalletRpcClients[cryptoCode]
.SendCommandAsync<GetTransferByTransactionIdRequest, GetTransferByTransactionIdResponse>(
"get_transfer_by_txid",
new GetTransferByTransactionIdRequest()
{
TransactionId = transactionHash,
AccountIndex = accountIndex
});
return result;
}
catch (JsonRpcClient.JsonRpcApiException e)
{
return null;
}
}
private async Task HandlePaymentData(string cryptoCode, string address, long totalAmount, long subaccountIndex,
long subaddressIndex,
string txId, long confirmations, long blockHeight, long locktime, InvoiceEntity invoice,