Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e169619589 | |||
| cc73ac1feb | |||
| d8db404453 | |||
| b32b041a14 | |||
| fee9ac44f4 | |||
| cf8ef365b2 |
1
bk2.json
Normal file
1
bk2.json
Normal 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]
|
||||
|
|
@ -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,
|
||||
}
|
||||
20
programs/bets/src/instructions/clear_bets_list.rs
Normal file
20
programs/bets/src/instructions/clear_bets_list.rs
Normal 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>,
|
||||
}
|
||||
|
|
@ -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>
|
||||
}
|
||||
101
programs/bets/src/instructions/deduct_fees.rs
Normal file
101
programs/bets/src/instructions/deduct_fees.rs
Normal 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>
|
||||
}
|
||||
|
|
@ -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::*;
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user