getAccounts method

List<AccountMeta> getAccounts({
  1. required Ed25519HDPublicKey feePayer,
})

Prepares all the accounts from instructions:

  • extracts accounts from every instruction;
  • appends program id accounts (accounts with the sample public keys);
  • removes duplicates (by picking signers and writeable accounts over non-writeable and non-signers);
  • sorts accounts according to Account Addresses Format.

Implementation

List<AccountMeta> getAccounts({
  required Ed25519HDPublicKey feePayer,
}) {
  final accounts = expand<AccountMeta>(
    (Instruction instruction) => [
      ...instruction.accounts,

      /// Append the instruction program id
      AccountMeta.readonly(
        pubKey: instruction.programId,
        isSigner: false,
      ),
    ],
  ).toList();
  final index = accounts.indexWhere((account) => account.pubKey == feePayer);
  if (index != -1) {
    // If the account is already here, remove it as we are going
    // to put it as the first element of the accounts array anyway
    accounts.removeAt(index);
  }
  // The fee payer must be the first account in they "keys" provided with
  // the message object
  accounts.insert(
    0,
    AccountMeta.writeable(pubKey: feePayer, isSigner: true),
  );

  return accounts.unique()..sort();
}