use anchor_lang::prelude::*; use instructions::{ ChangeConfig, DeployToken, FinalizeTransfer, FinalizeTransferSol, GetVersion, InitTransfer, InitTransferSol, Initialize, LogMetadata, Pause, UpdateMetadata, __client_accounts_change_config, __client_accounts_deploy_token, __client_accounts_finalize_transfer, __client_accounts_finalize_transfer_sol, __client_accounts_get_version, __client_accounts_init_transfer, __client_accounts_init_transfer_sol, __client_accounts_initialize, __client_accounts_log_metadata, __client_accounts_pause, __client_accounts_update_metadata, }; use state::message::{ deploy_token::DeployTokenPayload, finalize_transfer::FinalizeTransferPayload, init_transfer::InitTransferPayload, SignedPayload, }; pub mod constants; pub mod error; pub mod instructions; pub mod state; include!(concat!(env!("OUT_DIR"), "/program_id.rs")); #[program] #[allow(clippy::needless_pass_by_value)] pub mod bridge_token_factory { use crate::error; use anchor_lang::require; use super::constants::{FINALIZE_TRANSFER_PAUSED, INIT_TRANSFER_PAUSED}; use super::{ msg, ChangeConfig, Context, DeployToken, DeployTokenPayload, FinalizeTransfer, FinalizeTransferPayload, FinalizeTransferSol, GetVersion, InitTransfer, InitTransferPayload, InitTransferSol, Initialize, Key, LogMetadata, Pause, Pubkey, Result, SignedPayload, UpdateMetadata, }; pub fn initialize( ctx: Context, admin: Pubkey, pausable_admin: Pubkey, metadata_admin: Pubkey, derived_near_bridge_address: [u8; 64], ) -> Result<()> { msg!("Initializing"); ctx.accounts.process( admin, pausable_admin, metadata_admin, derived_near_bridge_address, ctx.bumps.config, ctx.bumps.authority, ctx.bumps.sol_vault, ctx.bumps.wormhole_bridge, ctx.bumps.wormhole_fee_collector, ctx.bumps.wormhole_sequence, )?; Ok(()) } pub fn get_version(_ctx: Context) -> Result { Ok(env!("CARGO_PKG_VERSION").to_string()) } pub fn deploy_token( ctx: Context, data: SignedPayload, ) -> Result<()> { msg!("Deploying token"); data.verify_signature((), &ctx.accounts.common.config.derived_near_bridge_address)?; ctx.accounts.initialize_token_metadata(data.payload)?; Ok(()) } pub fn finalize_transfer( ctx: Context, data: SignedPayload, ) -> Result<()> { require!( ctx.accounts.common.config.paused & FINALIZE_TRANSFER_PAUSED == 0, error::ErrorCode::Paused ); msg!("Finalizing transfer"); data.verify_signature( (ctx.accounts.mint.key(), ctx.accounts.recipient.key()), &ctx.accounts.common.config.derived_near_bridge_address, )?; ctx.accounts.process(data.payload)?; Ok(()) } pub fn finalize_transfer_sol( ctx: Context, data: SignedPayload, ) -> Result<()> { require!( ctx.accounts.common.config.paused & FINALIZE_TRANSFER_PAUSED == 0, error::ErrorCode::Paused ); msg!("Finalizing transfer"); data.verify_signature( (Pubkey::default(), ctx.accounts.recipient.key()), &ctx.accounts.config.derived_near_bridge_address, )?; ctx.accounts.process(data.payload)?; Ok(()) } pub fn log_metadata(ctx: Context) -> Result<()> { msg!("Logging metadata"); ctx.accounts.process()?; Ok(()) } pub fn init_transfer(ctx: Context, payload: InitTransferPayload) -> Result<()> { require!( ctx.accounts.common.config.paused & INIT_TRANSFER_PAUSED == 0, error::ErrorCode::Paused ); msg!("Initializing transfer"); ctx.accounts.process(&payload)?; Ok(()) } pub fn init_transfer_sol( ctx: Context, payload: InitTransferPayload, ) -> Result<()> { require!( ctx.accounts.common.config.paused & INIT_TRANSFER_PAUSED == 0, error::ErrorCode::Paused ); msg!("Initializing transfer"); ctx.accounts.process(&payload)?; Ok(()) } pub fn pause(ctx: Context) -> Result<()> { msg!("Pausing"); ctx.accounts.process()?; Ok(()) } pub fn unpause(ctx: Context, paused: u8) -> Result<()> { msg!("Unpausing"); ctx.accounts.set_paused(paused)?; Ok(()) } pub fn set_admin(ctx: Context, admin: Pubkey) -> Result<()> { msg!("Setting admin"); ctx.accounts.set_admin(admin)?; Ok(()) } pub fn set_pausable_admin(ctx: Context, pausable_admin: Pubkey) -> Result<()> { msg!("Setting pausable admin"); ctx.accounts.set_pausable_admin(pausable_admin)?; Ok(()) } pub fn set_metadata_admin(ctx: Context, metadata_admin: Pubkey) -> Result<()> { msg!("Setting metadata admin"); ctx.accounts.set_metadata_admin(metadata_admin)?; Ok(()) } pub fn update_metadata( ctx: Context, name: Option, symbol: Option, uri: Option, ) -> Result<()> { msg!("Updating metadata"); ctx.accounts.process(name, symbol, uri)?; Ok(()) } }