65 lines
1.8 KiB
Rust
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>,
|
|
} |