token sup
This commit is contained in:
parent
c84d8a4a6d
commit
8dedb47f8e
|
|
@ -11,15 +11,22 @@ pub fn close_token_bet(ctx: Context<CloseBetToken>, winner: Pubkey, userid: Stri
|
|||
bet_vault.owner == winner || bet_vault.joiner == winner || bet_vault.owner_id == userid || bet_vault.joiner_id == userid,
|
||||
BettingError::InvalidWinner
|
||||
);
|
||||
|
||||
let seeds = &[
|
||||
b"bet_vault",
|
||||
bet_vault.owner.as_ref(),
|
||||
bet_vault.game_id.as_bytes(),
|
||||
&bet_vault.nonce.to_le_bytes(),
|
||||
];
|
||||
// Transfer tokens from vault to winner
|
||||
transfer_tokens(
|
||||
transfer_tokens_pda(
|
||||
&ctx.accounts.token_vault,
|
||||
&ctx.accounts.winner_token_account,
|
||||
&bet_vault.wager,
|
||||
bet_vault.wager,
|
||||
&ctx.accounts.token_mint,
|
||||
&bet_vault.to_account_info(),
|
||||
&ctx.accounts.token_program
|
||||
&bet_vault,
|
||||
&ctx.accounts.token_program,
|
||||
seeds,
|
||||
ctx.bumps.bet_vault,
|
||||
)?;
|
||||
|
||||
// Remove bet from global list
|
||||
|
|
@ -37,7 +44,11 @@ pub struct CloseBetToken<'info> {
|
|||
#[account(mut)]
|
||||
pub bets_list: Account<'info, BetsList>,
|
||||
|
||||
#[account(mut)]
|
||||
#[account(
|
||||
mut,
|
||||
seeds = [b"bet_vault", bet_vault.owner.as_ref(), bet_vault.game_id.as_bytes(), &bet_vault.nonce.to_le_bytes()],
|
||||
bump
|
||||
)]
|
||||
pub bet_vault: Account<'info, BetVault>,
|
||||
|
||||
#[account(mut)]
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ pub fn create(ctx: Context<CreateBet>, wager: u64, user_id:String, game_id:Strin
|
|||
bet_vault.owner = payer.key();
|
||||
bet_vault.owner_id= user_id;
|
||||
bet_vault.wager = wager;
|
||||
|
||||
bet_vault.nonce = _nonce;
|
||||
// Transfer SOL from the payer to the bet vault
|
||||
let cpi_accounts = anchor_lang::system_program::Transfer {
|
||||
from: payer.to_account_info(),
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ pub fn create_token_bet(ctx: Context<CreateBetToken>, wager: u64, user_id:String
|
|||
bet_vault.owner_id= user_id;
|
||||
bet_vault.wager = wager;
|
||||
bet_vault.token_mint = ctx.accounts.token_mint.key();
|
||||
bet_vault.nonce = _nonce;
|
||||
|
||||
transfer_tokens(
|
||||
&ctx.accounts.payer_token_account,
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ use anchor_spl::{
|
|||
associated_token::AssociatedToken,
|
||||
token_interface::{TokenAccount, TokenInterface},
|
||||
};
|
||||
use crate::{error::BettingError, shared::transfer_tokens, *};
|
||||
use crate::{error::BettingError, shared::transfer_tokens_pda, *};
|
||||
|
||||
pub fn handle_deduct_fees_token(ctx: Context<DeductFeesToken>, winner: Pubkey, userid: String) -> Result<()> {
|
||||
let bet_vault = &mut ctx.accounts.bet_vault;
|
||||
|
|
@ -40,35 +40,49 @@ pub fn handle_deduct_fees_token(ctx: Context<DeductFeesToken>, winner: Pubkey, u
|
|||
BettingError::InsufficientFunds
|
||||
);
|
||||
|
||||
// Get PDA seeds and bump
|
||||
let seeds = &[
|
||||
b"bet_vault",
|
||||
bet_vault.owner.as_ref(),
|
||||
bet_vault.game_id.as_bytes(),
|
||||
&bet_vault.nonce.to_le_bytes(),
|
||||
];
|
||||
|
||||
// Transfer referrer fees
|
||||
transfer_tokens(
|
||||
transfer_tokens_pda(
|
||||
&ctx.accounts.token_vault,
|
||||
&ctx.accounts.owner_referrer_token_account,
|
||||
&referrer_fee,
|
||||
referrer_fee,
|
||||
&ctx.accounts.token_mint,
|
||||
&ctx.accounts.bet_vault.to_account_info(),
|
||||
&ctx.accounts.token_program
|
||||
&bet_vault,
|
||||
&ctx.accounts.token_program,
|
||||
seeds,
|
||||
ctx.bumps.bet_vault,
|
||||
)?;
|
||||
msg!("Transferred {} tokens to owner referrer", referrer_fee);
|
||||
|
||||
transfer_tokens(
|
||||
transfer_tokens_pda(
|
||||
&ctx.accounts.token_vault,
|
||||
&ctx.accounts.joiner_referrer_token_account,
|
||||
&referrer_fee,
|
||||
referrer_fee,
|
||||
&ctx.accounts.token_mint,
|
||||
&ctx.accounts.bet_vault.to_account_info(),
|
||||
&ctx.accounts.token_program
|
||||
&bet_vault,
|
||||
&ctx.accounts.token_program,
|
||||
seeds,
|
||||
ctx.bumps.bet_vault,
|
||||
)?;
|
||||
msg!("Transferred {} tokens to joiner referrer", referrer_fee);
|
||||
|
||||
// Transfer platform fee
|
||||
transfer_tokens(
|
||||
transfer_tokens_pda(
|
||||
&ctx.accounts.token_vault,
|
||||
&ctx.accounts.fee_wallet_token_account,
|
||||
&fee,
|
||||
fee,
|
||||
&ctx.accounts.token_mint,
|
||||
&ctx.accounts.bet_vault.to_account_info(),
|
||||
&ctx.accounts.token_program
|
||||
&bet_vault,
|
||||
&ctx.accounts.token_program,
|
||||
seeds,
|
||||
ctx.bumps.bet_vault,
|
||||
)?;
|
||||
msg!("Transferred {} tokens to fee wallet", fee);
|
||||
|
||||
|
|
@ -80,7 +94,11 @@ pub struct DeductFeesToken<'info> {
|
|||
#[account(mut)]
|
||||
pub bets_list: Account<'info, BetsList>,
|
||||
|
||||
#[account(mut)]
|
||||
#[account(
|
||||
mut,
|
||||
seeds = [b"bet_vault", bet_vault.owner.as_ref(), bet_vault.game_id.as_bytes(), &bet_vault.nonce.to_le_bytes()],
|
||||
bump
|
||||
)]
|
||||
pub bet_vault: Account<'info, BetVault>,
|
||||
|
||||
/// CHECK: This is validated against the FEE_COLLECTOR constant.
|
||||
|
|
|
|||
|
|
@ -2,13 +2,14 @@ use anchor_lang::prelude::*;
|
|||
use anchor_spl::token_interface::{
|
||||
transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked,
|
||||
};
|
||||
use crate::*;
|
||||
|
||||
pub fn transfer_tokens<'info>(
|
||||
from: &InterfaceAccount<'info, TokenAccount>,
|
||||
to: &InterfaceAccount<'info, TokenAccount>,
|
||||
amount: &u64,
|
||||
mint: &InterfaceAccount<'info, Mint>,
|
||||
authority: &AccountInfo<'info>,
|
||||
authority: &Signer<'info>,
|
||||
token_program: &Interface<'info, TokenInterface>,
|
||||
) -> Result<()> {
|
||||
let transfer_accounts_options = TransferChecked {
|
||||
|
|
@ -21,4 +22,35 @@ pub fn transfer_tokens<'info>(
|
|||
let cpi_context = CpiContext::new(token_program.to_account_info(), transfer_accounts_options);
|
||||
|
||||
transfer_checked(cpi_context, *amount, mint.decimals)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn transfer_tokens_pda<'info>(
|
||||
from: &InterfaceAccount<'info, TokenAccount>,
|
||||
to: &InterfaceAccount<'info, TokenAccount>,
|
||||
amount: u64,
|
||||
mint: &InterfaceAccount<'info, Mint>,
|
||||
pda_account: &Account<'info, BetVault>,
|
||||
token_program: &Interface<'info, TokenInterface>,
|
||||
seeds: &[&[u8]],
|
||||
bump: u8,
|
||||
) -> Result<()> {
|
||||
let transfer_accounts_options = TransferChecked {
|
||||
from: from.to_account_info(),
|
||||
mint: mint.to_account_info(),
|
||||
to: to.to_account_info(),
|
||||
authority: pda_account.to_account_info(),
|
||||
};
|
||||
|
||||
let bump_seed = [bump];
|
||||
let mut all_seeds = seeds.to_vec();
|
||||
all_seeds.push(&bump_seed);
|
||||
let signer_seeds: &[&[&[u8]]] = &[&all_seeds];
|
||||
|
||||
let cpi_context = CpiContext::new_with_signer(
|
||||
token_program.to_account_info(),
|
||||
transfer_accounts_options,
|
||||
signer_seeds,
|
||||
);
|
||||
|
||||
transfer_checked(cpi_context, amount, mint.decimals)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@ use crate::*;
|
|||
#[account]
|
||||
#[derive(InitSpace)]
|
||||
pub struct BetVault {
|
||||
#[max_len(10)]
|
||||
pub nonce: u64,
|
||||
#[max_len(10)]
|
||||
pub game_id: String,
|
||||
pub owner: Pubkey,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user