compatibleTransferProtocol method

WalletPaymentProtocol? compatibleTransferProtocol({
  1. required Wallet source,
  2. required Wallet destination,
})

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;
}