getMessageComponents method
Implementation
Tuple<MessageHeader, List<SolAddress>> getMessageComponents() {
final mapEntries = _keyMetaMap.entries.toList();
if (mapEntries.length > SolanaTransactionConstant.maximumAccountKeys) {
throw const MessageException("Max static account keys length exceeded");
}
final writableSigners = mapEntries
.where((entry) => entry.value.isSigner && entry.value.isWritable)
.toList();
final readonlySigners = mapEntries
.where((entry) => entry.value.isSigner && !entry.value.isWritable)
.toList();
final writableNonSigners = mapEntries
.where((entry) => !entry.value.isSigner && entry.value.isWritable)
.toList();
final readonlyNonSigners = mapEntries
.where((entry) => !entry.value.isSigner && !entry.value.isWritable)
.toList();
final MessageHeader header = MessageHeader(
numRequiredSignatures: writableSigners.length + readonlySigners.length,
numReadonlySignedAccounts: readonlySigners.length,
numReadonlyUnsignedAccounts: readonlyNonSigners.length);
if (writableSigners.isEmpty) {
throw const MessageException("Expected at least one writable signer key");
}
final payerAddress = writableSigners[0].key;
if (payerAddress != payer.address) {
throw const MessageException(
"Expected first writable signer key to be the fee payer");
}
final List<SolAddress> staticAccountKeys = List<SolAddress>.unmodifiable([
...writableSigners.map((entry) => SolAddress(entry.key)),
...readonlySigners.map((entry) => SolAddress(entry.key)),
...writableNonSigners.map((entry) => SolAddress(entry.key)),
...readonlyNonSigners.map((entry) => SolAddress(entry.key)),
]);
return Tuple(header, staticAccountKeys);
}