addressToOutputScript static method

Uint8List? addressToOutputScript(
  1. String address, [
  2. NetworkType? nw
])

Implementation

static Uint8List? addressToOutputScript(String address, [NetworkType? nw]) {
  final network = nw ?? bitcoin;
  bool flag = false;
  final parts = address.split(':');
  if (parts.length == 2) {
    final cashAddressPrefix = network.prefix;
    if (cashAddressPrefix == null ||
        !validateCashAddress(address, cashAddressPrefix)) {
      throw ArgumentError('Invalid CashAddr prefix or checksum');
    }
    address = bchToLegacy(address, prefix: cashAddressPrefix);
  }

  try {
    final decodeBase58 = bs58check.decode(address);
    if (decodeBase58[0] == network.pubKeyHash)
      return P2PKH(
        data: PaymentData(address: address),
        network: network,
      ).data.output;
    if (decodeBase58[0] == network.scriptHash)
      return P2SH(
        data: PaymentData(address: address),
        network: network,
      ).data.output;

    throw ArgumentError('Invalid version or Network mismatch');
  } catch (e) {
    flag = true;
  }

  try {
    final decodeBech32 = bech32.decode(address);
    if (network.bech32 != decodeBech32.hrp)
      throw ArgumentError('Invalid prefix or Network mismatch');
    if (decodeBech32.data.isEmpty || decodeBech32.data.first != 0) {
      throw ArgumentError('Unsupported witness version');
    }
    final program = Uint8List.fromList(
      convertBits(decodeBech32.data.sublist(1), 5, 8, strictMode: true),
    );
    if (program.length != 20 && program.length != 32) {
      throw ArgumentError('Invalid SegWit v0 witness program');
    }
    return compile([OPS['OP_0'], program]);
  } catch (e) {
    flag = true;
  }

  try {
    final decodeBech32m = bech32.decode(address, encoding: 'bech32m');
    if (network.bech32 != decodeBech32m.hrp)
      throw ArgumentError('Invalid prefix or Network mismatch');
    if (decodeBech32m.data.isEmpty || decodeBech32m.data.first != 1) {
      throw ArgumentError('Unsupported witness version');
    }

    final hash = Uint8List.fromList(
      convertBits(decodeBech32m.data.sublist(1), 5, 8, strictMode: true),
    );
    if (hash.length != 32) {
      throw ArgumentError('Invalid Taproot witness program');
    }
    return compile([OPS['OP_1'], hash]);
  } catch (e) {
    flag = true;
  }

  if (flag) throw ArgumentError('$address has no matching Script');
}