duelfi_bets_anchor/programs/bets/src/instructions/buy_tickets.rs

80 lines
2.6 KiB
Rust

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<BuyTickets>, 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>,
}