fromFriendlyAddress static method
Implementation
static DecodeAddressResult fromFriendlyAddress(String address) {
final decode = B64Decoder.decodeWithInfo(
address,
urlSafe: true,
validatePadding: false,
);
final data = decode.data;
// 1 byte tag + 1 byte workchain + 32 bytes hash + 2 byte crc
if (data.length != _TonAddressConst.friendlyAddressBytesLength) {
throw AddressConverterException.addressValidationFailed(
reason: "Invalid address bytes.",
details: {"length": data.length.toString()},
);
}
// Prepare data
final addr = data.sublist(0, 34);
final crc = data.sublist(34, 36);
final calcedCrc = Crc16.quickIntDigest(addr);
if (!BytesUtils.bytesEqual(crc, calcedCrc)) {
throw AddressConverterException.addressValidationFailed(
reason: "Invalid address checksum.",
details: {"expected": calcedCrc.toString(), "checksum": crc.toString()},
);
}
final List<FriendlyAddressFlags> flags = [];
// Parse tag
int tag = addr[0];
if ((tag & FriendlyAddressFlags.test.flag) != 0) {
flags.add(FriendlyAddressFlags.test);
tag ^= FriendlyAddressFlags.test.flag;
}
if (tag == FriendlyAddressFlags.bounceable.flag) {
flags.add(FriendlyAddressFlags.bounceable);
} else if (tag == FriendlyAddressFlags.nonBounceable.flag) {
flags.add(FriendlyAddressFlags.nonBounceable);
} else {
throw AddressConverterException.addressValidationFailed(
reason: "Invalid friendly address flags.",
details: {"tag": tag.toString()},
);
}
int? workchain;
if (addr[1] == BinaryOps.mask8) {
workchain = -1;
} else {
workchain = addr[1];
}
final hashPart = addr.sublist(2, 34);
return DecodeAddressResult(
workchain: workchain,
hash: hashPart,
flags: flags,
isUrlSafe: decode.isUrlSafe,
isPaded: decode.isPaded,
);
}