From cf8ef365b2bfffdc9e80c66199947f839209bf8e Mon Sep 17 00:00:00 2001 From: Sewmina Date: Tue, 20 May 2025 15:47:01 +0000 Subject: [PATCH] prod at token launch --- bk2.json | 1 + programs/bets/src/error.rs | 8 +++- programs/bets/src/instructions/close_bet.rs | 53 ++++++++++++++------- 3 files changed, 42 insertions(+), 20 deletions(-) create mode 100644 bk2.json diff --git a/bk2.json b/bk2.json new file mode 100644 index 0000000..8e4da66 --- /dev/null +++ b/bk2.json @@ -0,0 +1 @@ +[148,41,155,174,198,60,158,184,194,95,32,154,56,15,105,221,184,104,78,95,198,191,73,206,7,204,237,221,77,118,10,185,141,91,28,223,24,106,252,190,71,7,81,159,21,139,95,162,137,133,175,102,147,41,2,59,136,124,237,109,240,37,214,136] diff --git a/programs/bets/src/error.rs b/programs/bets/src/error.rs index 2fdc8dc..bb5a0d4 100644 --- a/programs/bets/src/error.rs +++ b/programs/bets/src/error.rs @@ -17,6 +17,10 @@ pub enum BettingError { InvalidWinner, #[msg("Please use the correct fee collector address")] InvalidFeeCollector, - #[msg("")] - JoinerAccountNotProvided + #[msg("Joiner account not provided")] + JoinerAccountNotProvided, + #[msg("Insufficient funds")] + InsufficientFunds, + #[msg("Fee calculation error")] + FeeCalculationError, } \ No newline at end of file diff --git a/programs/bets/src/instructions/close_bet.rs b/programs/bets/src/instructions/close_bet.rs index e783aa9..4d5d466 100644 --- a/programs/bets/src/instructions/close_bet.rs +++ b/programs/bets/src/instructions/close_bet.rs @@ -19,31 +19,47 @@ pub fn close(ctx: Context, winner:Pubkey, userid:String)->Result<()>{ // Calculate the 5% fee let total_lamports = **bet_vault.to_account_info().lamports.borrow(); - let mut fee = total_lamports / 20; // 5% - let referrer_fee = fee / 4; //50% for each referrer + msg!("Total lamports: {}", total_lamports); + + let fee = total_lamports / 40; // 2.5% + let referrer_fee = total_lamports / 80; //1.25% for each referrer + msg!("Fee: {}, Referrer fee: {}", fee, referrer_fee); + msg!("Total to be sent: {}", fee + referrer_fee + referrer_fee); - // In the close function: - if let Some(owner_ref) = &ctx.accounts.owner_referrer { - fee -= referrer_fee; - **bet_vault.to_account_info().try_borrow_mut_lamports()? -= referrer_fee; - **owner_ref.try_borrow_mut_lamports()? += referrer_fee; - } + // Verify we have enough funds for all transfers + let total_transfer = fee.checked_add(referrer_fee) + .and_then(|sum| sum.checked_add(referrer_fee)) + .ok_or(BettingError::InsufficientFunds)?; + + require!( + total_transfer <= total_lamports, + BettingError::InsufficientFunds + ); - if let Some(joiner_ref) = &ctx.accounts.joiner_referrer { - fee -= referrer_fee; - **bet_vault.to_account_info().try_borrow_mut_lamports()? -= referrer_fee; - **joiner_ref.try_borrow_mut_lamports()? += referrer_fee; - } + // Transfer referrer fees + **bet_vault.to_account_info().try_borrow_mut_lamports()? -= referrer_fee; + **ctx.accounts.owner_referrer.try_borrow_mut_lamports()? += referrer_fee; + msg!("After owner referrer transfer - Vault balance: {}", **bet_vault.to_account_info().lamports.borrow()); + + **bet_vault.to_account_info().try_borrow_mut_lamports()? -= referrer_fee; + **ctx.accounts.joiner_referrer.try_borrow_mut_lamports()? += referrer_fee; + msg!("After joiner referrer transfer - Vault balance: {}", **bet_vault.to_account_info().lamports.borrow()); **bet_vault.to_account_info().try_borrow_mut_lamports()? -= fee; **ctx.accounts.fee_wallet.to_account_info().try_borrow_mut_lamports()? += fee; + msg!("After fee transfer - Vault balance: {}", **bet_vault.to_account_info().lamports.borrow()); + + // Transfer remaining balance to winner + let remaining_balance = **bet_vault.to_account_info().lamports.borrow(); + **bet_vault.to_account_info().try_borrow_mut_lamports()? -= remaining_balance; + **ctx.accounts.winner.try_borrow_mut_lamports()? += remaining_balance; + msg!("After winner transfer - Vault balance: {}", **bet_vault.to_account_info().lamports.borrow()); let bets_list = &mut ctx.accounts.bets_list; // Remove the bet_vault public key from the list bets_list.bets.retain(|&bet| bet != bet_vault.key()); msg!("Bet {} closed by {}", bet_vault.key(), winner); - Ok(()) } @@ -54,7 +70,7 @@ pub struct CloseBet<'info>{ #[account(mut)] pub bets_list: Account<'info, BetsList>, - #[account(mut, close=winner)] + #[account(mut)] pub bet_vault: Account<'info, BetVault>, /// CHECK: This is validated against the FEE_COLLECTOR constant. @@ -66,12 +82,13 @@ pub struct CloseBet<'info>{ #[account(mut)] pub payer: Signer<'info>, - + /// CHECK: No constraints are applied to this account. #[account(mut)] - pub owner_referrer: Option>, + pub owner_referrer: AccountInfo<'info>, + /// CHECK: No constraints are applied to this account. #[account(mut)] - pub joiner_referrer: Option>, + pub joiner_referrer: AccountInfo<'info>, pub system_program: Program<'info, System> } \ No newline at end of file