duelfi_bets_anchor/programs/bets/src/instructions/update_leaderboard.rs
2025-07-29 08:36:45 +00:00

65 lines
1.8 KiB
Rust

use anchor_lang::prelude::*;
use crate::{error::LeaderboardError, *};
pub fn update(ctx: Context<UpdateLeaderboard>, id:u64, player:Pubkey, new_score:u64) -> Result<()> {
let leaderboard_entry: &mut Account<LeaderboardEntry> = &mut ctx.accounts.leaderboard_entry;
let leaderboard: &mut Account<TicketLeaderboard> = &mut ctx.accounts.ticket_leaderboard;
let receipt = &mut ctx.accounts.receipt_account;
if receipt.id != id {
return Err(LeaderboardError::InvalidId.into());
}
if !receipt.active {
return Err(LeaderboardError::NotActive.into());
}
// Find existing entry for this payer
if leaderboard_entry.highscore < new_score {
leaderboard_entry.highscore = new_score;
}
leaderboard_entry.total_tickets += 1;
if !leaderboard.players.contains(&player) {
leaderboard.players.push(player);
}
msg!("Successfully updated leaderboard with score: {}", new_score);
Ok(())
}
#[derive(Accounts)]
#[instruction(id:u64, player:Pubkey, new_score:u64)]
pub struct UpdateLeaderboard<'info>{
#[account(mut)]
pub payer: Signer<'info>,
#[account(
mut,
seeds = [b"ticket_leaderboard", id.to_le_bytes().as_ref()],
bump
)]
pub ticket_leaderboard: Account<'info, TicketLeaderboard>,
#[account(
init_if_needed,
payer= payer,
space = 8 + LeaderboardEntry::INIT_SPACE,
seeds = [b"leaderboard_entry", ticket_leaderboard.key().as_ref(), player.as_ref()],
bump
)]
pub leaderboard_entry: Account<'info, LeaderboardEntry>,
#[account(
mut,
seeds = [b"receipt", player.as_ref()],
bump
)]
pub receipt_account: Account<'info, TicketReceiptVault>,
pub system_program: Program<'info, System>,
}