137
.lightningAddress;
138
}
139
140
- Future<String> getBolt11Invoice(BigInt? amount, String description) async {
141
- final response = await sdk.receivePayment(
142
- request: ReceivePaymentRequest(
143
- paymentMethod: ReceivePaymentMethod.bolt11Invoice(
144
- description: description,
145
- amountSats: amount,
140
+ Future<String?> getBolt11Invoice(BigInt? amount, String description) async {
141
+ try {
142
+ final response = await sdk.receivePayment(
143
+ request: ReceivePaymentRequest(
144
+ paymentMethod: ReceivePaymentMethod.bolt11Invoice(
145
+ description: description,
146
+ amountSats: amount,
147
+ ),
148
),
147
- ),
148
- );
149
+ );
150
150
- return response.paymentRequest;
151
+ return response.paymentRequest;
152
+ } on SdkError_NetworkError catch (_) {
153
+ return null;
154
+ } on SdkError_SparkError catch (e) {
155
+ if (!e.field0.contains("dns")) rethrow;
156
+ return null;
157
+ }
158
}
159
160
Future<bool> isCompatible(String input) async {
169
}
170
171
Future<PendingLightningTransaction> createTransaction(
165
- String address, BigInt? amountSats, BitcoinTransactionPriority? priority) async {
172
+ String address, BigInt? amountSats, BitcoinTransactionPriority? priority, bool feesIncluded) async {
173
final inputType = await sdk.parse(input: address);
174
175
+ final feePolicy = feesIncluded ? FeePolicy.feesIncluded : FeePolicy.feesExcluded;
176
+
177
if (inputType is InputType_Bolt11Invoice) {
178
final request = PrepareSendPaymentRequest(
170
- paymentRequest: inputType.field0.invoice.bolt11, amount: amountSats);
179
+ paymentRequest: inputType.field0.invoice.bolt11, amount: amountSats, feePolicy: feePolicy);
180
final prepareResponse = await sdk.prepareSendPayment(request: request);
181
182
final paymentMethod = prepareResponse.paymentMethod;
186
187
return PendingLightningTransaction(
188
id: paymentMethod.invoiceDetails.paymentHash,
180
- amount: amountSats?.toInt() ??
189
+ amount: request.amount?.toInt() ?? amountSats?.toInt() ??
190
((paymentMethod.invoiceDetails.amountMsat?.toInt() ?? 0) / 1000).round(),
191
fee: lightningFeeSats.toInt() + (sparkTransferFeeSats?.toInt() ?? 0),
192
commitOverride: () async {
212
amountSats: amountSats!,
213
payRequest: inputType.field0.payRequest,
214
validateSuccessActionUrl: optionalValidateSuccessActionUrl,
215
+ feePolicy: feePolicy,
216
);
217
} else {
218
request = PrepareLnurlPayRequest(
219
amountSats: amountSats!,
220
payRequest: (inputType as InputType_LnurlPay).field0,
221
validateSuccessActionUrl: optionalValidateSuccessActionUrl,
222
+ feePolicy: feePolicy,
223
);
224
}
225
229
230
return PendingLightningTransaction(
231
id: prepareResponse.invoiceDetails.paymentHash,
221
- amount: ((prepareResponse.invoiceDetails.amountMsat?.toInt() ?? 0) / 1000).round(),
232
+ amount: prepareResponse.amountSats.toInt(),
233
fee: feeSats.toInt(),
234
commitOverride: () async {
235
final res =
238
},
239
);
240
} else if (inputType is InputType_BitcoinAddress) {
230
- final request =
231
- PrepareSendPaymentRequest(paymentRequest: inputType.field0.address, amount: amountSats);
241
+ final request = PrepareSendPaymentRequest(
242
+ paymentRequest: inputType.field0.address,
243
+ amount: amountSats,
244
+ feePolicy: feePolicy,
245
+ );
246
final prepareResponse = await sdk.prepareSendPayment(request: request);
247
248
final paymentMethod = prepareResponse.paymentMethod;
369
return response.txHex;
370
}
371
358
- void setEventListener(
359
- {required Function(ElectrumTransactionInfo) onTransactionEvent, required Function onBalanceChangedEvent}) {
372
+ void setEventListener({
373
+ required Function(ElectrumTransactionInfo) onTransactionEvent,
374
+ required Function onBalanceChangedEvent,
375
+ required Function(Map<String, ElectrumTransactionInfo>) onCreateDepositTransactionEvent,
376
+ required Function(List<ElectrumTransactionInfo>) onUpdateDepositTransactionEvent,
377
+ }) {
378
_eventSubscription = _eventStream?.listen((sdkEvent) {
379
if (sdkEvent is SdkEvent_PaymentSucceeded) {
380
onTransactionEvent(_getElectrumTransactionInfoFromPayment(sdkEvent.payment));
382
onTransactionEvent(_getElectrumTransactionInfoFromPayment(sdkEvent.payment));
383
} else if (sdkEvent is SdkEvent_ClaimedDeposits) {
384
onBalanceChangedEvent();
385
+ onUpdateDepositTransactionEvent(
386
+ sdkEvent.claimedDeposits.map(_getElectrumTransactionInfoFromDepositInfo).toList());
387
+ } else if (sdkEvent is SdkEvent_UnclaimedDeposits) {
388
+ final unclaimedDeposits = <String, ElectrumTransactionInfo>{};
389
+
390
+ for (final deposit in sdkEvent.unclaimedDeposits) {
391
+ unclaimedDeposits[deposit.txid] = _getElectrumTransactionInfoFromDepositInfo(deposit);
392
+ }
393
+
394
+ onCreateDepositTransactionEvent(unclaimedDeposits);
395
}
396
});
397
}
418
additionalInfo: {"isLightning": true},
419
);
420
}
421
+
422
+ ElectrumTransactionInfo _getElectrumTransactionInfoFromDepositInfo(DepositInfo deposit) {
423
+ return ElectrumTransactionInfo(
424
+ WalletType.bitcoin,
425
+ id: deposit.txid,
426
+ amount: deposit.amountSats.toInt(),
427
+ direction: TransactionDirection.incoming,
428
+ isPending: true,
429
+ fee: 0,
430
+ date: DateTime.now(),
431
+ confirmations: 0,
432
+ additionalInfo: {"isLightning": true, "isSparkDeposit": true},
433
+ );
434
+ }
435
}