triad_protocol/instructions/
create_ticker.rs

1use crate::{
2    constants::ADMIN,
3    errors::TriadProtocolError,
4    state::{ CreateTickerArgs, Ticker },
5    Vault,
6};
7
8use anchor_lang::prelude::*;
9use anchor_spl::token::{ Mint, Token, TokenAccount };
10
11#[derive(Accounts)]
12#[instruction(args: CreateTickerArgs)]
13pub struct CreateTicker<'info> {
14    #[account(mut)]
15    pub signer: Signer<'info>,
16
17    #[account(
18        init,
19        payer = signer,
20        space = Ticker::SPACE,
21        seeds = [Ticker::PREFIX_SEED, args.name.as_bytes()],
22        bump
23    )]
24    pub ticker: Box<Account<'info, Ticker>>,
25
26    #[account(
27        init,
28        payer = signer,
29        space = Vault::SPACE,
30        seeds = [Vault::PREFIX_SEED, ticker.to_account_info().key.as_ref()],
31        bump
32    )]
33    pub vault: Box<Account<'info, Vault>>,
34
35    pub payer_token_mint: Box<Account<'info, Mint>>,
36
37    #[account(
38        init,
39        seeds = [Vault::PREFIX_SEED_VAULT_TOKEN_ACCOUNT, vault.key().as_ref()],
40        bump,
41        payer = signer,
42        token::mint = payer_token_mint,
43        token::authority = vault
44    )]
45    pub token_account: Box<Account<'info, TokenAccount>>,
46
47    pub system_program: Program<'info, System>,
48    pub token_program: Program<'info, Token>,
49}
50
51pub fn create_ticker(ctx: Context<CreateTicker>, args: CreateTickerArgs) -> Result<()> {
52    if ctx.accounts.signer.key.to_string() != ADMIN {
53        return Err(TriadProtocolError::Unauthorized.into());
54    }
55
56    let ticker_key = *ctx.accounts.ticker.to_account_info().key;
57    let token_account_key = *ctx.accounts.token_account.to_account_info().key;
58    let signer_key = *ctx.accounts.signer.key;
59    let current_timestamp = Clock::get()?.unix_timestamp;
60
61    let ticker: &mut Account<Ticker> = &mut ctx.accounts.ticker;
62    let vault: &mut Account<Vault> = &mut ctx.accounts.vault;
63
64    vault.bump = ctx.bumps.vault;
65    vault.authority = signer_key;
66    vault.name = args.name.clone();
67    vault.ticker_address = ticker_key;
68    vault.token_account = token_account_key;
69    vault.total_deposited = 0;
70    vault.total_withdrawn = 0;
71    vault.init_ts = current_timestamp;
72    vault.net_deposits = 0;
73
74    ticker.bump = ctx.bumps.ticker;
75    ticker.authority = signer_key;
76    ticker.name = args.name;
77    ticker.vault = *ctx.accounts.vault.to_account_info().key;
78    ticker.price = 0;
79    ticker.protocol_program_id = args.protocol_program_id;
80    ticker.init_ts = current_timestamp;
81    ticker.updated_ts = current_timestamp;
82
83    Ok(())
84}