From 1939acaf450f5f230012e7711444e24e6ba6c6b6 Mon Sep 17 00:00:00 2001 From: Sewmina Date: Tue, 29 Jul 2025 08:36:45 +0000 Subject: [PATCH] leaderboard complete --- programs/bets/src/instructions/buy_tickets.rs | 24 ++++++++---- programs/bets/src/instructions/mod.rs | 5 ++- .../src/instructions/remove_leaderboard.rs | 38 +++++++++++++++++++ .../src/instructions/update_leaderboard.rs | 2 +- programs/bets/src/lib.rs | 4 ++ 5 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 programs/bets/src/instructions/remove_leaderboard.rs diff --git a/programs/bets/src/instructions/buy_tickets.rs b/programs/bets/src/instructions/buy_tickets.rs index 917869e..2142aa5 100644 --- a/programs/bets/src/instructions/buy_tickets.rs +++ b/programs/bets/src/instructions/buy_tickets.rs @@ -22,16 +22,24 @@ pub fn buy(ctx: Context, amount: u64) -> Result<()> { ], )?; - //Transfer tokens from leaderboard vault to user vault - let cpi_program: AccountInfo<'_> = ctx.accounts.token_program.to_account_info(); + // Transfer tokens from leaderboard vault to user vault + let cpi_program = 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,)?; + + let seeds = &[ + b"ticket_leaderboards_list".as_ref(), + &[ctx.bumps.ticket_leaderboard_list][..] + ]; + + let signer_seeds = &[&seeds[..]]; + + let cpi_ctx = CpiContext::new_with_signer(cpi_program, cpi_accounts, signer_seeds); + transfer_checked(cpi_ctx, amount, 9)?; Ok(()) } @@ -51,13 +59,14 @@ pub struct BuyTickets<'info>{ #[account( mut, - seeds = [b"ticket_leaderboard_list"], + seeds = [b"ticket_leaderboards_list"], bump )] pub ticket_leaderboard_list: Account<'info, TicketLeaderboardList>, #[account( - mut, + init_if_needed, + payer=payer, associated_token::mint = token_mint, associated_token::authority = ticket_leaderboard_list, associated_token::token_program = token_program @@ -65,7 +74,8 @@ pub struct BuyTickets<'info>{ pub ticket_leaderboard_list_vault: InterfaceAccount<'info, TokenAccount>, #[account( - mut, + init_if_needed, + payer = payer, associated_token::mint = token_mint, associated_token::authority = payer, associated_token::token_program = token_program diff --git a/programs/bets/src/instructions/mod.rs b/programs/bets/src/instructions/mod.rs index 232afea..891268d 100644 --- a/programs/bets/src/instructions/mod.rs +++ b/programs/bets/src/instructions/mod.rs @@ -47,4 +47,7 @@ pub mod buy_tickets; pub use buy_tickets::*; pub mod enter_leaderboard; -pub use enter_leaderboard::*; \ No newline at end of file +pub use enter_leaderboard::*; + +pub mod remove_leaderboard; +pub use remove_leaderboard::*; \ No newline at end of file diff --git a/programs/bets/src/instructions/remove_leaderboard.rs b/programs/bets/src/instructions/remove_leaderboard.rs new file mode 100644 index 0000000..3762778 --- /dev/null +++ b/programs/bets/src/instructions/remove_leaderboard.rs @@ -0,0 +1,38 @@ +use anchor_lang::prelude::*; +use crate::*; + +pub fn remove(ctx: Context, id:u64) -> Result<()> { + + let ticket_leaderboard_list = &mut ctx.accounts.ticket_leaderboard_list; + let ticket_leaderboard = &mut ctx.accounts.ticket_leaderboard; + + ticket_leaderboard_list.leaderboards.retain(|&leaderboard| leaderboard != ticket_leaderboard.key()); + + msg!("Successfully removed leaderboard with id: {}", id); + Ok(()) +} + + +#[derive(Accounts)] +#[instruction(id:u64)] +pub struct RemoveLeaderboard<'info>{ + #[account(mut)] + pub payer: Signer<'info>, + + #[account( + mut, + seeds = [b"ticket_leaderboards_list"], + bump + )] + pub ticket_leaderboard_list: Account<'info, TicketLeaderboardList>, + + #[account( + mut, + seeds = [b"ticket_leaderboard", id.to_le_bytes().as_ref()], + bump + )] + pub ticket_leaderboard: Account<'info, TicketLeaderboard>, + + + pub system_program: Program<'info, System>, +} \ No newline at end of file diff --git a/programs/bets/src/instructions/update_leaderboard.rs b/programs/bets/src/instructions/update_leaderboard.rs index 3b5c1b3..1931d41 100644 --- a/programs/bets/src/instructions/update_leaderboard.rs +++ b/programs/bets/src/instructions/update_leaderboard.rs @@ -48,7 +48,7 @@ pub struct UpdateLeaderboard<'info>{ init_if_needed, payer= payer, space = 8 + LeaderboardEntry::INIT_SPACE, - seeds = [b"leaderboard_entry", ticket_leaderboard.key().as_ref(), payer.key().as_ref()], + seeds = [b"leaderboard_entry", ticket_leaderboard.key().as_ref(), player.as_ref()], bump )] pub leaderboard_entry: Account<'info, LeaderboardEntry>, diff --git a/programs/bets/src/lib.rs b/programs/bets/src/lib.rs index 4c6b146..a9303c9 100644 --- a/programs/bets/src/lib.rs +++ b/programs/bets/src/lib.rs @@ -78,6 +78,10 @@ pub mod bets { pub fn enter_leaderboard(ctx:Context, id:u64)->Result<()>{ enter_leaderboard::enter(ctx, id) } + + pub fn remove_leaderboard(ctx:Context, id:u64)->Result<()>{ + remove_leaderboard::remove(ctx, id) + } }