use anchor_lang::prelude::*;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod vault {
use super::*;
pub fn initialize(ctx: Context<Initialize>, max_amount: u64) -> Result<()> {
require!(max_amount > 0, ErrorCode::InvalidMaxAmount);
let vault = &mut ctx.accounts.vault;
vault.authority = ctx.accounts.authority.key();
vault.balance = 0;
vault.max_amount = max_amount;
msg!("Vault initialized with max amount: {}", max_amount);
Ok(())
}
pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
require!(amount > 0, ErrorCode::InvalidAmount);
let vault = &mut ctx.accounts.vault;
let new_balance = vault.balance
.checked_add(amount)
.ok_or(ErrorCode::Overflow)?;
require!(new_balance <= vault.max_amount, ErrorCode::ExceedsMaxAmount);
vault.balance = new_balance;
msg!("Deposited {}. New balance: {}", amount, vault.balance);
Ok(())
}
pub fn withdraw(
ctx: Context<Withdraw>,
amount: u64,
) -> Result<()> {
require!(amount > 0, ErrorCode::InvalidAmount);
require_gte!(ctx.accounts.vault.balance, amount, ErrorCode::InsufficientFunds);
let vault = &mut ctx.accounts.vault;
vault.balance = vault.balance
.checked_sub(amount)
.ok_or(ErrorCode::Underflow)?;
msg!("Withdrew {}. Remaining balance: {}", amount, vault.balance);
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(
init,
payer = authority,
space = 8 + Vault::INIT_SPACE
)]
pub vault: Account<'info, Vault>,
#[account(mut)]
pub authority: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct Deposit<'info> {
#[account(mut)]
pub vault: Account<'info, Vault>,
}
#[derive(Accounts)]
pub struct Withdraw<'info> {
#[account(
mut,
has_one = authority @ ErrorCode::Unauthorized
)]
pub vault: Account<'info, Vault>,
pub authority: Signer<'info>,
}
#[account]
#[derive(InitSpace)]
pub struct Vault {
pub authority: Pubkey,
pub balance: u64,
pub max_amount: u64,
}
#[error_code]
pub enum ErrorCode {
#[msg("Amount must be greater than zero")]
InvalidAmount,
#[msg("Max amount must be greater than zero")]
InvalidMaxAmount,
#[msg("Insufficient funds in vault")]
InsufficientFunds,
#[msg("Deposit would exceed maximum vault amount")]
ExceedsMaxAmount,
#[msg("Only the authority can perform this action")]
Unauthorized,
#[msg("Arithmetic overflow occurred")]
Overflow,
#[msg("Arithmetic underflow occurred")]
Underflow,
}