Message.fromBufferReader constructor
Message.fromBufferReader(
- 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,
);
}