diff --git a/BTCPayServer/Plugins/Altcoins/Monero/RPC/Models/GetTransferByTransactionIdRequest.cs b/BTCPayServer/Plugins/Altcoins/Monero/RPC/Models/GetTransferByTransactionIdRequest.cs index f7426a1a4..d11f9ac58 100644 --- a/BTCPayServer/Plugins/Altcoins/Monero/RPC/Models/GetTransferByTransactionIdRequest.cs +++ b/BTCPayServer/Plugins/Altcoins/Monero/RPC/Models/GetTransferByTransactionIdRequest.cs @@ -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; } } } diff --git a/BTCPayServer/Services/Altcoins/Monero/Services/MoneroListener.cs b/BTCPayServer/Services/Altcoins/Monero/Services/MoneroListener.cs index e707a977a..ed6338faa 100644 --- a/BTCPayServer/Services/Altcoins/Monero/Services/MoneroListener.cs +++ b/BTCPayServer/Services/Altcoins/Monero/Services/MoneroListener.cs @@ -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( - "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 GetTransferByTxId(string cryptoCode, + string transactionHash, CancellationToken cancellationToken) + { + var accounts = await _moneroRpcProvider.WalletRpcClients[cryptoCode].SendCommandAsync("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 GetTransferByTxId(string cryptoCode, string transactionHash, long? accountIndex) + { + try + { + var result = await _moneroRpcProvider.WalletRpcClients[cryptoCode] + .SendCommandAsync( + "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,