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,
|
bet_vault.owner == winner || bet_vault.joiner == winner || bet_vault.owner_id == userid || bet_vault.joiner_id == userid,
|
||||||
BettingError::InvalidWinner
|
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 from vault to winner
|
||||||
transfer_tokens(
|
transfer_tokens_pda(
|
||||||
&ctx.accounts.token_vault,
|
&ctx.accounts.token_vault,
|
||||||
&ctx.accounts.winner_token_account,
|
&ctx.accounts.winner_token_account,
|
||||||
&bet_vault.wager,
|
bet_vault.wager,
|
||||||
&ctx.accounts.token_mint,
|
&ctx.accounts.token_mint,
|
||||||
&bet_vault.to_account_info(),
|
&bet_vault,
|
||||||
&ctx.accounts.token_program
|
&ctx.accounts.token_program,
|
||||||
|
seeds,
|
||||||
|
ctx.bumps.bet_vault,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
// Remove bet from global list
|
// Remove bet from global list
|
||||||
|
|
@ -37,7 +44,11 @@ pub struct CloseBetToken<'info> {
|
||||||
#[account(mut)]
|
#[account(mut)]
|
||||||
pub bets_list: Account<'info, BetsList>,
|
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>,
|
pub bet_vault: Account<'info, BetVault>,
|
||||||
|
|
||||||
#[account(mut)]
|
#[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 = payer.key();
|
||||||
bet_vault.owner_id= user_id;
|
bet_vault.owner_id= user_id;
|
||||||
bet_vault.wager = wager;
|
bet_vault.wager = wager;
|
||||||
|
bet_vault.nonce = _nonce;
|
||||||
// Transfer SOL from the payer to the bet vault
|
// Transfer SOL from the payer to the bet vault
|
||||||
let cpi_accounts = anchor_lang::system_program::Transfer {
|
let cpi_accounts = anchor_lang::system_program::Transfer {
|
||||||
from: payer.to_account_info(),
|
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.owner_id= user_id;
|
||||||
bet_vault.wager = wager;
|
bet_vault.wager = wager;
|
||||||
bet_vault.token_mint = ctx.accounts.token_mint.key();
|
bet_vault.token_mint = ctx.accounts.token_mint.key();
|
||||||
|
bet_vault.nonce = _nonce;
|
||||||
|
|
||||||
transfer_tokens(
|
transfer_tokens(
|
||||||
&ctx.accounts.payer_token_account,
|
&ctx.accounts.payer_token_account,
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ use anchor_spl::{
|
||||||
associated_token::AssociatedToken,
|
associated_token::AssociatedToken,
|
||||||
token_interface::{TokenAccount, TokenInterface},
|
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<()> {
|
pub fn handle_deduct_fees_token(ctx: Context<DeductFeesToken>, winner: Pubkey, userid: String) -> Result<()> {
|
||||||
let bet_vault = &mut ctx.accounts.bet_vault;
|
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
|
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 referrer fees
|
||||||
transfer_tokens(
|
transfer_tokens_pda(
|
||||||
&ctx.accounts.token_vault,
|
&ctx.accounts.token_vault,
|
||||||
&ctx.accounts.owner_referrer_token_account,
|
&ctx.accounts.owner_referrer_token_account,
|
||||||
&referrer_fee,
|
referrer_fee,
|
||||||
&ctx.accounts.token_mint,
|
&ctx.accounts.token_mint,
|
||||||
&ctx.accounts.bet_vault.to_account_info(),
|
&bet_vault,
|
||||||
&ctx.accounts.token_program
|
&ctx.accounts.token_program,
|
||||||
|
seeds,
|
||||||
|
ctx.bumps.bet_vault,
|
||||||
)?;
|
)?;
|
||||||
msg!("Transferred {} tokens to owner referrer", referrer_fee);
|
msg!("Transferred {} tokens to owner referrer", referrer_fee);
|
||||||
|
|
||||||
transfer_tokens(
|
transfer_tokens_pda(
|
||||||
&ctx.accounts.token_vault,
|
&ctx.accounts.token_vault,
|
||||||
&ctx.accounts.joiner_referrer_token_account,
|
&ctx.accounts.joiner_referrer_token_account,
|
||||||
&referrer_fee,
|
referrer_fee,
|
||||||
&ctx.accounts.token_mint,
|
&ctx.accounts.token_mint,
|
||||||
&ctx.accounts.bet_vault.to_account_info(),
|
&bet_vault,
|
||||||
&ctx.accounts.token_program
|
&ctx.accounts.token_program,
|
||||||
|
seeds,
|
||||||
|
ctx.bumps.bet_vault,
|
||||||
)?;
|
)?;
|
||||||
msg!("Transferred {} tokens to joiner referrer", referrer_fee);
|
msg!("Transferred {} tokens to joiner referrer", referrer_fee);
|
||||||
|
|
||||||
// Transfer platform fee
|
// Transfer platform fee
|
||||||
transfer_tokens(
|
transfer_tokens_pda(
|
||||||
&ctx.accounts.token_vault,
|
&ctx.accounts.token_vault,
|
||||||
&ctx.accounts.fee_wallet_token_account,
|
&ctx.accounts.fee_wallet_token_account,
|
||||||
&fee,
|
fee,
|
||||||
&ctx.accounts.token_mint,
|
&ctx.accounts.token_mint,
|
||||||
&ctx.accounts.bet_vault.to_account_info(),
|
&bet_vault,
|
||||||
&ctx.accounts.token_program
|
&ctx.accounts.token_program,
|
||||||
|
seeds,
|
||||||
|
ctx.bumps.bet_vault,
|
||||||
)?;
|
)?;
|
||||||
msg!("Transferred {} tokens to fee wallet", fee);
|
msg!("Transferred {} tokens to fee wallet", fee);
|
||||||
|
|
||||||
|
|
@ -80,7 +94,11 @@ pub struct DeductFeesToken<'info> {
|
||||||
#[account(mut)]
|
#[account(mut)]
|
||||||
pub bets_list: Account<'info, BetsList>,
|
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>,
|
pub bet_vault: Account<'info, BetVault>,
|
||||||
|
|
||||||
/// CHECK: This is validated against the FEE_COLLECTOR constant.
|
/// CHECK: This is validated against the FEE_COLLECTOR constant.
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,14 @@ use anchor_lang::prelude::*;
|
||||||
use anchor_spl::token_interface::{
|
use anchor_spl::token_interface::{
|
||||||
transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked,
|
transfer_checked, Mint, TokenAccount, TokenInterface, TransferChecked,
|
||||||
};
|
};
|
||||||
|
use crate::*;
|
||||||
|
|
||||||
pub fn transfer_tokens<'info>(
|
pub fn transfer_tokens<'info>(
|
||||||
from: &InterfaceAccount<'info, TokenAccount>,
|
from: &InterfaceAccount<'info, TokenAccount>,
|
||||||
to: &InterfaceAccount<'info, TokenAccount>,
|
to: &InterfaceAccount<'info, TokenAccount>,
|
||||||
amount: &u64,
|
amount: &u64,
|
||||||
mint: &InterfaceAccount<'info, Mint>,
|
mint: &InterfaceAccount<'info, Mint>,
|
||||||
authority: &AccountInfo<'info>,
|
authority: &Signer<'info>,
|
||||||
token_program: &Interface<'info, TokenInterface>,
|
token_program: &Interface<'info, TokenInterface>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let transfer_accounts_options = TransferChecked {
|
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);
|
let cpi_context = CpiContext::new(token_program.to_account_info(), transfer_accounts_options);
|
||||||
|
|
||||||
transfer_checked(cpi_context, *amount, mint.decimals)
|
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]
|
#[account]
|
||||||
#[derive(InitSpace)]
|
#[derive(InitSpace)]
|
||||||
pub struct BetVault {
|
pub struct BetVault {
|
||||||
|
#[max_len(10)]
|
||||||
|
pub nonce: u64,
|
||||||
#[max_len(10)]
|
#[max_len(10)]
|
||||||
pub game_id: String,
|
pub game_id: String,
|
||||||
pub owner: Pubkey,
|
pub owner: Pubkey,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user