pub use spl_tlv_account_resolution::state::{AccountDataResult, AccountFetchError};
use {
crate::{get_extra_account_metas_address, instruction::ExecuteInstruction},
solana_program::{
instruction::{AccountMeta, Instruction},
program_error::ProgramError,
pubkey::Pubkey,
},
spl_tlv_account_resolution::state::ExtraAccountMetaList,
std::future::Future,
};
pub async fn resolve_extra_account_metas<F, Fut>(
instruction: &mut Instruction,
fetch_account_data_fn: F,
mint: &Pubkey,
permissioned_transfer_program_id: &Pubkey,
) -> Result<(), AccountFetchError>
where
F: Fn(Pubkey) -> Fut,
Fut: Future<Output = AccountDataResult>,
{
let validation_address =
get_extra_account_metas_address(mint, permissioned_transfer_program_id);
let validation_account_data = fetch_account_data_fn(validation_address)
.await?
.ok_or(ProgramError::InvalidAccountData)?;
ExtraAccountMetaList::add_to_instruction::<ExecuteInstruction, _, _>(
instruction,
fetch_account_data_fn,
&validation_account_data,
)
.await?;
instruction.accounts.push(AccountMeta::new_readonly(
*permissioned_transfer_program_id,
false,
));
instruction
.accounts
.push(AccountMeta::new_readonly(validation_address, false));
Ok(())
}