80 lines
2.6 KiB
Rust
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>,
|
|
} |