cake_wallet/lib/view_model/lightning_view_model.dart

129 lines
4 KiB
Dart
Raw Normal View History

2024-02-14 17:34:52 +00:00
import 'dart:async';
import 'package:breez_sdk/breez_sdk.dart';
2024-03-06 18:38:11 +00:00
import 'package:breez_sdk/bridge_generated.dart' as BZG;
import 'package:cake_wallet/entities/calculate_fiat_amount_raw.dart';
import 'package:cake_wallet/entities/fiat_currency.dart';
import 'package:cake_wallet/lightning/lightning.dart';
import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
import 'package:cake_wallet/store/settings_store.dart';
import 'package:cw_core/crypto_currency.dart';
2024-02-14 17:34:52 +00:00
import 'package:mobx/mobx.dart';
part 'lightning_view_model.g.dart';
class LightningViewModel = LightningViewModelBase with _$LightningViewModel;
abstract class LightningViewModelBase with Store {
2024-03-07 06:10:40 +00:00
LightningViewModelBase() {}
2024-03-06 18:38:11 +00:00
2024-03-07 06:10:40 +00:00
Future<ReceiveOnchainResult> receiveOnchain() async {
2024-02-14 18:21:37 +00:00
final sdk = await BreezSDK();
2024-03-06 18:38:11 +00:00
BZG.ReceiveOnchainRequest req = const BZG.ReceiveOnchainRequest();
BZG.SwapInfo swapInfo = await sdk.receiveOnchain(req: req);
2024-02-14 18:21:37 +00:00
print("Minimum amount allowed to deposit in sats: ${swapInfo.minAllowedDeposit}");
print("Maximum amount allowed to deposit in sats: ${swapInfo.maxAllowedDeposit}");
2024-03-07 18:17:56 +00:00
int fee = 0;
double feePercent = 0;
try {
final nodeState = (await sdk.nodeInfo())!;
int inboundLiquidity = nodeState.inboundLiquidityMsats ~/ 1000;
final openingFees = await sdk.openChannelFee(
req: BZG.OpenChannelFeeRequest(amountMsat: inboundLiquidity + 1));
if (openingFees.usedFeeParams != null) {
feePercent = (openingFees.usedFeeParams!.proportional * 100) / 1000000;
fee = openingFees.usedFeeParams!.minMsat ~/ 1000;
}
} catch (_) {}
2024-03-07 06:10:40 +00:00
return ReceiveOnchainResult(
bitcoinAddress: swapInfo.bitcoinAddress,
minAllowedDeposit: swapInfo.minAllowedDeposit,
maxAllowedDeposit: swapInfo.maxAllowedDeposit,
2024-03-07 18:17:56 +00:00
feePercent: feePercent,
2024-03-07 06:10:40 +00:00
fee: fee,
);
2024-02-14 18:21:37 +00:00
}
2024-02-14 17:34:52 +00:00
2024-03-04 17:47:39 +00:00
Future<String> createInvoice({required String amountSats, String? description}) async {
2024-02-14 18:21:37 +00:00
final sdk = await BreezSDK();
2024-03-06 18:38:11 +00:00
final req = BZG.ReceivePaymentRequest(
2024-03-04 17:47:39 +00:00
amountMsat: (double.parse(amountSats) * 1000).round(),
2024-02-14 18:21:37 +00:00
description: description ?? '',
);
final res = await sdk.receivePayment(req: req);
return res.lnInvoice.bolt11;
}
2024-02-14 17:34:52 +00:00
2024-03-07 06:10:40 +00:00
Future<InvoiceSoftLimitsResult> invoiceSoftLimitsSats() async {
double feePercent = 0.4;
int minFee = (2500 * 1000) ~/ 1000; // 2500 sats
int inboundLiquidity = 1000000000 * 1000 * 10; // 10 BTC
2024-03-01 17:08:32 +00:00
int balance = 0;
final sdk = await BreezSDK();
2024-03-01 16:49:24 +00:00
try {
final nodeState = (await sdk.nodeInfo())!;
inboundLiquidity = nodeState.inboundLiquidityMsats ~/ 1000;
final openingFees = await sdk.openChannelFee(
req: BZG.OpenChannelFeeRequest(amountMsat: inboundLiquidity + 1));
if (openingFees.usedFeeParams != null) {
feePercent = (openingFees.usedFeeParams!.proportional * 100) / 1000000;
minFee = openingFees.usedFeeParams!.minMsat ~/ 1000;
2024-03-04 23:37:22 +00:00
}
balance = nodeState.channelsBalanceMsat ~/ 1000;
2024-03-01 16:49:24 +00:00
} catch (_) {}
2024-03-07 06:10:40 +00:00
return InvoiceSoftLimitsResult(
minFee: minFee,
inboundLiquidity: inboundLiquidity,
feePercent: feePercent,
2024-03-07 06:10:40 +00:00
balance: balance,
);
2024-03-01 17:08:32 +00:00
}
Future<int> getBalanceSats() async {
try {
final sdk = await BreezSDK();
final nodeState = (await sdk.nodeInfo())!;
return nodeState.channelsBalanceMsat ~/ 1000;
} catch (_) {
return 0;
}
2024-03-01 16:49:24 +00:00
}
2024-02-14 17:34:52 +00:00
}
2024-03-07 06:10:40 +00:00
class ReceiveOnchainResult {
final String bitcoinAddress;
final int minAllowedDeposit;
final int maxAllowedDeposit;
final int fee;
2024-03-07 18:17:56 +00:00
final double feePercent;
2024-03-07 06:10:40 +00:00
ReceiveOnchainResult({
required this.bitcoinAddress,
required this.minAllowedDeposit,
required this.maxAllowedDeposit,
required this.fee,
2024-03-07 18:17:56 +00:00
required this.feePercent,
2024-03-07 06:10:40 +00:00
});
}
class InvoiceSoftLimitsResult {
final double feePercent;
final int minFee;
final int inboundLiquidity;
2024-03-07 06:10:40 +00:00
final int balance;
InvoiceSoftLimitsResult({
required this.inboundLiquidity,
required this.feePercent,
required this.minFee,
2024-03-07 06:10:40 +00:00
required this.balance,
});
}