use light_client::rpc::{Rpc, RpcError};
use light_token::instruction::Revoke as RevokeInstruction;
use solana_keypair::Keypair;
use solana_pubkey::Pubkey;
use solana_signature::Signature;
use solana_signer::Signer;
#[derive(Default, Clone, Debug)]
pub struct Revoke {
pub token_account: Pubkey,
pub owner: Option<Pubkey>,
}
impl Revoke {
pub async fn execute<R: Rpc>(
self,
rpc: &mut R,
payer: &Keypair,
) -> Result<Signature, RpcError> {
let owner_pubkey = self.owner.unwrap_or_else(|| payer.pubkey());
if owner_pubkey != payer.pubkey() {
return Err(RpcError::CustomError(
"owner does not match payer; use execute_with_owner for separate owner/payer"
.to_string(),
));
}
let ix = RevokeInstruction {
token_account: self.token_account,
owner: owner_pubkey,
fee_payer: payer.pubkey(),
}
.instruction()
.map_err(|e| RpcError::CustomError(format!("Failed to create instruction: {}", e)))?;
rpc.create_and_send_transaction(&[ix], &payer.pubkey(), &[payer])
.await
}
pub async fn execute_with_owner<R: Rpc>(
self,
rpc: &mut R,
payer: &Keypair,
owner: &Keypair,
) -> Result<Signature, RpcError> {
if let Some(expected_owner) = self.owner {
if expected_owner != owner.pubkey() {
return Err(RpcError::CustomError(format!(
"owner mismatch: self.owner ({}) does not match owner.pubkey() ({})",
expected_owner,
owner.pubkey()
)));
}
}
let ix = RevokeInstruction {
token_account: self.token_account,
owner: owner.pubkey(),
fee_payer: payer.pubkey(),
}
.instruction()
.map_err(|e| RpcError::CustomError(format!("Failed to create instruction: {}", e)))?;
let mut signers: Vec<&Keypair> = vec![payer];
if owner.pubkey() != payer.pubkey() {
signers.push(owner);
}
rpc.create_and_send_transaction(&[ix], &payer.pubkey(), &signers)
.await
}
}