use anchor_lang::prelude::*; use anchor_spl::{associated_token::AssociatedToken, token::{transfer_checked, TransferChecked}, token_interface::{TokenAccount, TokenInterface}}; use crate::{error::BettingError, *}; use crate::constants::TICKET_SALE_VAULT_ADDRESS; use std::str::FromStr; pub fn buy(ctx: Context, amount: u64) -> Result<()> { let transfer_amount = 100000000; // 0.1 SOL in lamports let ix = anchor_lang::solana_program::system_instruction::transfer( &ctx.accounts.payer.key(), &ctx.accounts.ticket_sale_vault.key(), transfer_amount ); anchor_lang::solana_program::program::invoke( &ix, &[ ctx.accounts.payer.to_account_info(), ctx.accounts.ticket_sale_vault.to_account_info(), ], )?; //Transfer tokens from leaderboard vault to user vault let cpi_program: AccountInfo<'_> = ctx.accounts.token_program.to_account_info(); let cpi_accounts = TransferChecked { from: ctx.accounts.ticket_leaderboard_list_vault.to_account_info(), to: ctx.accounts.user_token_vault.to_account_info(), authority: ctx.accounts.ticket_leaderboard_list.to_account_info(), mint: ctx.accounts.token_mint.to_account_info(), }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); transfer_checked(cpi_ctx, amount, 9,)?; Ok(()) } #[derive(Accounts)] pub struct BuyTickets<'info>{ #[account(mut)] pub payer: Signer<'info>, /// CHECK: The vault that receives SOL payments for tickets #[account( mut, address = Pubkey::from_str(TICKET_SALE_VAULT_ADDRESS).unwrap() @ BettingError::InvalidTicketSaleVault )] pub ticket_sale_vault: AccountInfo<'info>, #[account( mut, seeds = [b"ticket_leaderboard_list"], bump )] pub ticket_leaderboard_list: Account<'info, TicketLeaderboardList>, #[account( mut, associated_token::mint = token_mint, associated_token::authority = ticket_leaderboard_list, associated_token::token_program = token_program )] pub ticket_leaderboard_list_vault: InterfaceAccount<'info, TokenAccount>, #[account( mut, associated_token::mint = token_mint, associated_token::authority = payer, associated_token::token_program = token_program )] pub user_token_vault: InterfaceAccount<'info, TokenAccount>, pub token_mint: InterfaceAccount<'info, anchor_spl::token_interface::Mint>, pub system_program: Program<'info, System>, pub token_program: Interface<'info, TokenInterface>, pub associated_token_program: Program<'info, AssociatedToken>, }