compatibleTransferProtocol method
Returns the protocol that can transfer funds from source to
destination, or null when the wallets have no compatible payment path.
Implementation
WalletPaymentProtocol? compatibleTransferProtocol({
required Wallet source,
required Wallet destination,
}) {
if (source.id == destination.id ||
!source.canSend ||
!destination.canReceive ||
!source.supportedUnits.contains('sat') ||
!destination.supportedUnits.contains('sat')) {
return null;
}
final common = source.sendPaymentProtocols.intersection(
destination.receivePaymentProtocols,
);
// A BOLT12-only destination must use the reusable offer through BIP-321.
if (destination.receivePaymentProtocols.length == 1 &&
destination.receivePaymentProtocols.contains(
WalletPaymentProtocol.bolt12,
) &&
common.contains(WalletPaymentProtocol.bolt12) &&
source.supportsBip321Pay &&
destination.supportsBip321Receive) {
return WalletPaymentProtocol.bolt12;
}
if (common.contains(WalletPaymentProtocol.bolt11)) {
final genericPath = source.supportsBip321Pay &&
(destination.supportsBip321Receive ||
destination.supportsBolt11InvoiceReceive);
final invoicePath = source.supportsBolt11InvoicePay &&
destination.supportsBolt11InvoiceReceive;
if (genericPath || invoicePath) return WalletPaymentProtocol.bolt11;
}
if (common.contains(WalletPaymentProtocol.bolt12) &&
source.supportsBip321Pay &&
destination.supportsBip321Receive) {
return WalletPaymentProtocol.bolt12;
}
return null;
}