triad_protocol/instructions/
create_ticker.rs1use 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}