use light_client::rpc::{Rpc, RpcError};
use light_token::instruction::{get_associated_token_address, CreateAssociatedTokenAccount};
use solana_keypair::Keypair;
use solana_pubkey::Pubkey;
use solana_signature::Signature;
use solana_signer::Signer;
#[derive(Default, Clone, Debug)]
pub struct CreateAta {
pub mint: Pubkey,
pub owner: Pubkey,
pub idempotent: bool,
}
impl CreateAta {
pub async fn execute<R: Rpc>(
self,
rpc: &mut R,
payer: &Keypair,
) -> Result<(Signature, Pubkey), RpcError> {
let mut instruction_builder =
CreateAssociatedTokenAccount::new(payer.pubkey(), self.owner, self.mint);
if self.idempotent {
instruction_builder = instruction_builder.idempotent();
}
let ix = instruction_builder
.instruction()
.map_err(|e| RpcError::CustomError(format!("Failed to create instruction: {}", e)))?;
let signature = rpc
.create_and_send_transaction(&[ix], &payer.pubkey(), &[payer])
.await?;
Ok((
signature,
get_associated_token_address(&self.owner, &self.mint),
))
}
}