addressToOutputScript static method
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');
}