fromFriendlyAddress static method

DecodeAddressResult fromFriendlyAddress(
  1. String address
)

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