equanetwork-cli 0.0.4

The Equa Network command line interface
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)))
}