use anyhow::{anyhow, Result};
use equanetwork::{get_permission_address, VaultInitialize};
use solana_instruction::Instruction;
use solana_signer::Signer;
use crate::{
config::{Command, Config, VaultCommand},
log_context,
transaction::process_instructions,
};
use super::helpers::{addr, ensure_ata, pk, require_signer, vault_pda};
pub fn handle(config: &Config) -> Result<()> {
let Command::Vault {
command: VaultCommand::Initialize { network, mint },
} = &config.command
else {
unreachable!()
};
let signer = require_signer(config)?;
let rpc = config.rpc_client();
let authority = signer.pubkey();
let (permission, _) = get_permission_address(&addr(authority));
let vault = vault_pda(network, mint);
let mut ixs: Vec<Instruction> = Vec::new();
let network_token_ata = ensure_ata(&rpc, &mut ixs, &signer, network, mint);
log_context!(
action => "vault_initialize",
authority => authority.to_string(),
network => network.to_string(),
mint => mint.to_string(),
vault => vault.to_string(),
network_token_ata => network_token_ata.to_string(),
);
ixs.push(
VaultInitialize {
payer: addr(authority),
authority: addr(authority),
authority_permission: permission,
network: addr(*network),
vault,
mint: addr(*mint),
network_token_ata: addr(network_token_ata),
token_program: addr(spl_token_interface::ID),
system_program: addr(solana_system_interface::program::ID),
}
.instruction(),
);
process_instructions(&rpc, &[signer], &ixs).map_err(|e| anyhow!("{e}; vault pda {}", pk(vault)))
}