Skip to content

Commit 2e382df

Browse files
committed
Do not crash the whole invoice creation if monero isn't available
1 parent e2a3421 commit 2e382df

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

Plugins/Monero/Payments/MoneroLikePaymentMethodHandler.cs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,32 +40,41 @@ public MoneroLikePaymentMethodHandler(MoneroLikeSpecificBtcPayNetwork network, M
4040
Serializer = BlobSerializer.CreateSerializer().Serializer;
4141
_moneroRpcProvider = moneroRpcProvider;
4242
}
43+
bool IsReady() => _moneroRpcProvider.IsConfigured(_network.CryptoCode) && _moneroRpcProvider.IsAvailable(_network.CryptoCode);
4344

44-
public Task BeforeFetchingRates(PaymentMethodContext context)
45+
public Task BeforeFetchingRates(PaymentMethodContext context)
4546
{
4647
context.Prompt.Currency = _network.CryptoCode;
4748
context.Prompt.Divisibility = _network.Divisibility;
48-
if (context.Prompt.Activated)
49+
if (context.Prompt.Activated && IsReady())
4950
{
5051
var supportedPaymentMethod = ParsePaymentMethodConfig(context.PaymentMethodConfig);
5152
var walletClient = _moneroRpcProvider.WalletRpcClients[_network.CryptoCode];
5253
var daemonClient = _moneroRpcProvider.DaemonRpcClients[_network.CryptoCode];
53-
context.State = new Prepare()
54+
try
5455
{
55-
GetFeeRate = daemonClient.SendCommandAsync<GetFeeEstimateRequest, GetFeeEstimateResponse>("get_fee_estimate", new GetFeeEstimateRequest()),
56-
ReserveAddress = s => walletClient.SendCommandAsync<CreateAddressRequest, CreateAddressResponse>("create_address", new CreateAddressRequest() { Label = $"btcpay invoice #{s}", AccountIndex = supportedPaymentMethod.AccountIndex }),
57-
AccountIndex = supportedPaymentMethod.AccountIndex
58-
};
59-
}
56+
context.State = new Prepare()
57+
{
58+
GetFeeRate = daemonClient.SendCommandAsync<GetFeeEstimateRequest, GetFeeEstimateResponse>("get_fee_estimate", new GetFeeEstimateRequest()),
59+
ReserveAddress = s => walletClient.SendCommandAsync<CreateAddressRequest, CreateAddressResponse>("create_address", new CreateAddressRequest() { Label = $"btcpay invoice #{s}", AccountIndex = supportedPaymentMethod.AccountIndex }),
60+
AccountIndex = supportedPaymentMethod.AccountIndex
61+
};
62+
}
63+
catch (Exception ex)
64+
{
65+
context.Logs.Write($"Error in BeforeFetchingRates: {ex.Message}", InvoiceEventData.EventSeverity.Error);
66+
}
67+
}
6068
return Task.CompletedTask;
6169
}
6270

63-
public async Task ConfigurePrompt(PaymentMethodContext context)
71+
public async Task ConfigurePrompt(PaymentMethodContext context)
6472
{
65-
if (!_moneroRpcProvider.IsAvailable(_network.CryptoCode))
73+
if (!_moneroRpcProvider.IsConfigured(_network.CryptoCode))
74+
throw new PaymentMethodUnavailableException($"BTCPAY_XMR_WALLET_DAEMON_URI or BTCPAY_XMR_DAEMON_URI isn't configured");
75+
if (!_moneroRpcProvider.IsAvailable(_network.CryptoCode) || context.State is not Prepare moneroPrepare)
6676
throw new PaymentMethodUnavailableException($"Node or wallet not available");
6777
var invoice = context.InvoiceEntity;
68-
Prepare moneroPrepare = (Prepare)context.State;
6978
var feeRatePerKb = await moneroPrepare.GetFeeRate;
7079
var address = await moneroPrepare.ReserveAddress(invoice.Id);
7180

Plugins/Monero/Services/MoneroRPCProvider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ public MoneroRPCProvider(MoneroLikeConfiguration moneroLikeConfiguration,
5757

5858
public ImmutableDictionary<string, JsonRpcClient> CashCowWalletRpcClients { get; set; }
5959

60-
public bool IsAvailable(string cryptoCode)
60+
public bool IsConfigured(string cryptoCode) => WalletRpcClients.ContainsKey(cryptoCode) && DaemonRpcClients.ContainsKey(cryptoCode);
61+
public bool IsAvailable(string cryptoCode)
6162
{
6263
cryptoCode = cryptoCode.ToUpperInvariant();
6364
return _summaries.ContainsKey(cryptoCode) && IsAvailable(_summaries[cryptoCode]);

0 commit comments

Comments
 (0)