fees and pay seperated
This commit is contained in:
parent
fee9ac44f4
commit
b32b041a14
|
|
@ -9,67 +9,6 @@ pub fn close(ctx: Context<CloseBet>, winner:Pubkey, userid:String)->Result<()>{
|
||||||
bet_vault.owner == winner || bet_vault.joiner == winner || bet_vault.owner_id == userid || bet_vault.joiner_id == userid,
|
bet_vault.owner == winner || bet_vault.joiner == winner || bet_vault.owner_id == userid || bet_vault.joiner_id == userid,
|
||||||
BettingError::InvalidWinner
|
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);
|
|
||||||
|
|
||||||
// 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
|
|
||||||
);
|
|
||||||
|
|
||||||
// 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());
|
|
||||||
|
|
||||||
// Close the bet vault account
|
|
||||||
let bet_vault_account = bet_vault.to_account_info();
|
|
||||||
let rent_lamports = bet_vault_account.lamports();
|
|
||||||
**bet_vault_account.try_borrow_mut_lamports()? = 0;
|
|
||||||
**ctx.accounts.payer.try_borrow_mut_lamports()? += rent_lamports;
|
|
||||||
|
|
||||||
msg!("Bet {} closed by {}", bet_vault.key(), winner);
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
@ -83,22 +22,11 @@ pub struct CloseBet<'info>{
|
||||||
#[account(mut)]
|
#[account(mut)]
|
||||||
pub bet_vault: Account<'info, BetVault>,
|
pub bet_vault: Account<'info, BetVault>,
|
||||||
|
|
||||||
/// CHECK: This is validated against the FEE_COLLECTOR constant.
|
|
||||||
#[account(mut)]
|
|
||||||
pub fee_wallet: AccountInfo<'info>,
|
|
||||||
|
|
||||||
#[account(mut)]
|
#[account(mut)]
|
||||||
pub winner: SystemAccount<'info>,
|
pub winner: SystemAccount<'info>,
|
||||||
|
|
||||||
#[account(mut)]
|
#[account(mut)]
|
||||||
pub payer: Signer<'info>,
|
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>
|
pub system_program: Program<'info, System>
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,83 @@
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use anchor_lang::prelude::*;
|
use anchor_lang::prelude::*;
|
||||||
use crate::{error::BettingError, *};
|
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);
|
||||||
|
|
||||||
|
// 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
|
||||||
|
);
|
||||||
|
|
||||||
|
// 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>
|
||||||
|
}
|
||||||
|
|
@ -34,4 +34,8 @@ pub mod bets {
|
||||||
pub fn refund_bet(ctx:Context<RefundBet>, owner:Pubkey)->Result<()>{
|
pub fn refund_bet(ctx:Context<RefundBet>, owner:Pubkey)->Result<()>{
|
||||||
refund_bet::refund(ctx, owner)
|
refund_bet::refund(ctx, owner)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn deduct_fees(ctx:Context<DeductFees>, winner:Pubkey, userid:String)->Result<()>{
|
||||||
|
deduct_fees::deduct(ctx, winner, userid)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user