readExtionsionBytesFromAccountData static method

List<int> readExtionsionBytesFromAccountData({
  1. required ExtensionType extensionType,
  2. required List<int> accountBytes,
  3. SolanaTokenAccountType? type,
})

Implementation

static List<int> readExtionsionBytesFromAccountData(
    {required ExtensionType extensionType,
    required List<int> accountBytes,
    SolanaTokenAccountType? type}) {
  try {
    final extensionBytesOffset = SolanaTokenAccountUtils.accountSize +
        SolanaTokenAccountUtils.accountTypeSize;
    final tlvData = accountBytes.sublist(extensionBytesOffset);
    if (tlvData.length < (extensionType.layoutSize ?? 0)) {
      throw MessageException("Account extension data length is insufficient.",
          details: {
            "Expected": extensionType.layoutSize,
            "length": tlvData.length
          });
    }
    if (type != null) {
      final accountType = SolanaTokenAccountType.fromValue(
          accountBytes[SolanaTokenAccountUtils.accountSize]);
      if (accountType != type) {
        throw MessageException("invalid account type",
            details: {"Excepted": type.name, "Type": accountType.name});
      }
    }
    final extensionBytes = SPLToken2022Utils.getExtensionData(
        extension: extensionType, tlvData: tlvData);

    return extensionBytes!;
  } catch (e) {
    throw const MessageException("Invalid extionsion bytes");
  }
}