Compare commits

...

6 Commits
master ... prod

Author SHA1 Message Date
e169619589 sync 2025-06-15 08:02:47 +00:00
cc73ac1feb clear func 2025-05-21 11:00:43 +00:00
d8db404453 fixes on close 2025-05-21 10:57:01 +00:00
b32b041a14 fees and pay seperated 2025-05-21 09:45:01 +05:30
fee9ac44f4 init 2025-05-21 04:06:05 +00:00
cf8ef365b2 prod at token launch 2025-05-20 15:47:01 +00:00
7 changed files with 143 additions and 44 deletions

1
bk2.json Normal file
View File

@ -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]

View File

@ -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,
}

View File

@ -0,0 +1,20 @@
use anchor_lang::prelude::*;
use crate::*;
pub fn clear(ctx: Context<ClearBetsList>) -> Result<()> {
let bets_list = &mut ctx.accounts.bets_list;
bets_list.bets.clear();
msg!("Cleared all bets from the list!");
Ok(())
}
#[derive(Accounts)]
pub struct ClearBetsList<'info> {
#[account(
mut
)]
pub bets_list: Account<'info, BetsList>,
#[account(mut)]
pub payer: Signer<'info>,
}

View File

@ -10,40 +10,9 @@ pub fn close(ctx: Context<CloseBet>, winner:Pubkey, userid:String)->Result<()>{
BettingError::InvalidWinner
);
let fee_collector_pubkey = Pubkey::from_str(FEE_COLLECTOR).map_err(|_| BettingError::InvalidFeeCollector)?;
require_keys_eq!(
ctx.accounts.fee_wallet.key(),
fee_collector_pubkey,
BettingError::InvalidFeeCollector
);
// 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
// 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;
}
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;
}
**bet_vault.to_account_info().try_borrow_mut_lamports()? -= fee;
**ctx.accounts.fee_wallet.to_account_info().try_borrow_mut_lamports()? += fee;
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(())
}
@ -57,21 +26,11 @@ pub struct CloseBet<'info>{
#[account(mut, close=winner)]
pub bet_vault: Account<'info, BetVault>,
/// CHECK: This is validated against the FEE_COLLECTOR constant.
#[account(mut)]
pub fee_wallet: AccountInfo<'info>,
#[account(mut)]
pub winner: SystemAccount<'info>,
#[account(mut)]
pub payer: Signer<'info>,
#[account(mut)]
pub owner_referrer: Option<AccountInfo<'info>>,
#[account(mut)]
pub joiner_referrer: Option<AccountInfo<'info>>,
pub system_program: Program<'info, System>
}

View File

@ -0,0 +1,101 @@
use std::str::FromStr;
use anchor_lang::prelude::*;
use crate::{error::BettingError, *};
pub fn deduct(ctx: Context<DeductFees>, winner:Pubkey, userid:String)->Result<()>{
let bet_vault = &mut ctx.accounts.bet_vault;
require!(
bet_vault.owner == winner || bet_vault.joiner == winner || bet_vault.owner_id == userid || bet_vault.joiner_id == userid,
BettingError::InvalidWinner
);
let fee_collector_pubkey = Pubkey::from_str(FEE_COLLECTOR).map_err(|_| BettingError::InvalidFeeCollector)?;
require_keys_eq!(
ctx.accounts.fee_wallet.key(),
fee_collector_pubkey,
BettingError::InvalidFeeCollector
);
// Calculate the 5% fee
let total_lamports = **bet_vault.to_account_info().lamports.borrow();
msg!("Total lamports: {}", total_lamports);
let fee = total_lamports / 40; // 2.5%
// Calculate rent-exempt minimum balance
let rent_exempt_minimum = Rent::get()?.minimum_balance(bet_vault.to_account_info().data_len());
msg!("Rent exempt minimum: {}", rent_exempt_minimum);
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);
// Calculate rent-exempt minimum for referrer accounts
let referrer_rent_exempt = Rent::get()?.minimum_balance(0); // 0 bytes for basic account
msg!("Referrer rent exempt minimum: {}", referrer_rent_exempt);
// 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
);
// Check if referrer accounts have enough SOL for rent
let owner_referrer_balance = **ctx.accounts.owner_referrer.lamports.borrow();
let joiner_referrer_balance = **ctx.accounts.joiner_referrer.lamports.borrow();
require!(
owner_referrer_balance + referrer_fee >= referrer_rent_exempt,
BettingError::InsufficientFunds
);
require!(
joiner_referrer_balance + referrer_fee >= referrer_rent_exempt,
BettingError::InsufficientFunds
);
// 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());
Ok(())
}
#[derive(Accounts)]
pub struct DeductFees<'info>{
#[account(mut)]
pub bets_list: Account<'info, BetsList>,
#[account(mut)]
pub bet_vault: Account<'info, BetVault>,
/// CHECK: This is validated against the FEE_COLLECTOR constant.
#[account(mut)]
pub fee_wallet: AccountInfo<'info>,
#[account(mut)]
pub payer: Signer<'info>,
/// CHECK: No constraints are applied to this account.
#[account(mut)]
pub owner_referrer: AccountInfo<'info>,
/// CHECK: No constraints are applied to this account.
#[account(mut)]
pub joiner_referrer: AccountInfo<'info>,
pub system_program: Program<'info, System>
}

View File

@ -11,4 +11,10 @@ pub mod close_bet;
pub use close_bet::*;
pub mod refund_bet;
pub use refund_bet::*;
pub use refund_bet::*;
pub mod deduct_fees;
pub use deduct_fees::*;
pub mod clear_bets_list;
pub use clear_bets_list::*;

View File

@ -34,4 +34,12 @@ pub mod bets {
pub fn refund_bet(ctx:Context<RefundBet>, owner:Pubkey)->Result<()>{
refund_bet::refund(ctx, owner)
}
pub fn deduct_fees(ctx:Context<DeductFees>, winner:Pubkey, userid:String)->Result<()>{
deduct_fees::deduct(ctx, winner, userid)
}
pub fn clear_bets_list(ctx: Context<ClearBetsList>) -> Result<()> {
clear_bets_list::clear(ctx)
}
}