triad_protocol/instructions/
swap_404.rs

1use crate::{ errors::TriadProtocolError, User };
2
3use anchor_lang::prelude::*;
4
5#[derive(Accounts)]
6pub struct Swap404<'info> {
7    #[account(mut)]
8    pub signer: Signer<'info>,
9
10    #[account(mut, seeds = [User::PREFIX_SEED, signer.key().as_ref()], bump)]
11    pub user: Account<'info, User>,
12
13    pub system_program: Program<'info, System>,
14}
15
16pub fn swap_404(ctx: Context<Swap404>) -> Result<()> {
17    let user: &mut Account<User> = &mut ctx.accounts.user;
18
19    let ts = Clock::get()?.unix_timestamp;
20    let is_24h = ts - user.first_swap < 24 * 60 * 60;
21
22    let reached_limit = user.swaps_made >= user.swaps;
23
24    if reached_limit && is_24h {
25        user.swaps_made = 0;
26        user.first_swap = ts;
27    }
28
29    if reached_limit && !is_24h {
30        return Err(TriadProtocolError::SwapsReachedLimit.into());
31    }
32
33    user.swaps_made += 1;
34
35    Ok(())
36}