Message.fromBufferReader constructor

Message.fromBufferReader(
  1. BufferReader reader
)

Decodes a buffer reader into a Message instance.

Implementation

factory Message.fromBufferReader(final BufferReader reader) {
  /// Read version.
  final int prefix = reader.getUint8();
  final int maskedPrefix = prefix & versionPrefixMask;
  final int? version = prefix != maskedPrefix ? maskedPrefix : null;
  if (version == null) reader.advance(-1); // unread the first byte.

  /// Read the message header.
  final int numRequiredSignatures = reader.getUint8();
  final int numReadonlySignedAccounts = reader.getUint8();
  final int numReadonlyUnsignedAccounts = reader.getUint8();

  /// Read the accounts.
  final int accountCount = shortvec.decodeLength(reader);
  final List<Pubkey> accountKeys = [];
  for (int i = 0; i < accountCount; ++i) {
    final Buffer account = reader.getBuffer(nacl.pubkeyLength);
    accountKeys.add(Pubkey.fromUint8List(account.asUint8List()));
  }

  /// Read the blockhash.
  final Buffer recentBlockhash = reader.getBuffer(nacl.pubkeyLength);

  /// Read the instructions.
  final int instructionCount = shortvec.decodeLength(reader);
  final List<MessageInstruction> instructions = [];
  for (int i = 0; i < instructionCount; ++i) {
    final int programIdIndex = reader.getUint8();
    final int accountCount = shortvec.decodeLength(reader);
    final accounts = reader.getBuffer(accountCount);
    final int dataLength = shortvec.decodeLength(reader);
    final Buffer dataSlice = reader.getBuffer(dataLength);
    final String data = base58.encode(dataSlice.asUint8List());
    instructions.add(
      MessageInstruction(
        programIdIndex: programIdIndex,
        accounts: accounts,
        data: data,
      ),
    );
  }

  /// Read the address table lookups.
  List<MessageAddressTableLookup>? addressTableLookups;
  if (version != null) {
    addressTableLookups = [];
    final int addressTableLookupsCount = shortvec.decodeLength(reader);
    for (int i = 0; i < addressTableLookupsCount; ++i) {
      final Pubkey accountKey = Pubkey.fromBase58(
          reader.getString(nacl.pubkeyLength, BufferEncoding.base58));
      final int writableIndexesCount = shortvec.decodeLength(reader);
      final Iterable<int> writableIndexes =
          reader.getBuffer(writableIndexesCount);
      final int readonlyIndexesCount = shortvec.decodeLength(reader);
      final Iterable<int> readonlyIndexes =
          reader.getBuffer(readonlyIndexesCount);
      addressTableLookups.add(
        MessageAddressTableLookup(
          accountKey: accountKey,
          writableIndexes: writableIndexes.toList(growable: false),
          readonlyIndexes: readonlyIndexes.toList(growable: false),
        ),
      );
    }
  }

  return Message(
    version: version,
    accountKeys: accountKeys,
    header: MessageHeader(
      numRequiredSignatures: numRequiredSignatures,
      numReadonlySignedAccounts: numReadonlySignedAccounts,
      numReadonlyUnsignedAccounts: numReadonlyUnsignedAccounts,
    ),
    recentBlockhash: base58.encode(recentBlockhash.asUint8List()),
    instructions: instructions,
    addressTableLookups: addressTableLookups,
  );
}