#![cfg_attr(feature = "no-entrypoint", allow(dead_code))]
use anchor_lang::prelude::*;
use solana_program::pubkey::Pubkey;
use instructions::*;
use solana_security_txt::security_txt;
pub mod errors;
pub mod instructions;
pub mod state;
pub mod utils;
declare_id!("JAiLsp5k6ANQAy9UcJC9TfTWieY5Afo42ykihpTeVk8L");
#[cfg(not(feature = "no-entrypoint"))]
security_txt! {
name: "Fracture Staking",
project_url: "https://thefracture.io/",
contacts: "email:dev@thefracture.io,twitter:@TheFracture_",
policy: "private",
preferred_languages: "en",
source_code: "private"
}
#[program]
mod jungle {
use super::*;
pub fn initialize_jungle(
ctx: Context<InitializeJungle>,
bumps: InitializeJungleBumps,
maximum_weekly_multiplier: u64,
weekly_multiplier: u64,
maximum_holdings_multiplier: u64,
holdings_multiplier: u64,
start: i64,
root: [u8; 32],
) -> Result<()> {
instructions::init_jungle::handler(
ctx,
bumps,
maximum_weekly_multiplier,
weekly_multiplier,
maximum_holdings_multiplier,
holdings_multiplier,
start,
root,
)
}
pub fn set_jungle(
ctx: Context<SetJungle>,
maximum_weekly_multiplier: u64,
weekly_multiplier: u64,
maximum_holdings_multiplier: u64,
holdings_multiplier: u64,
start: i64,
root: [u8; 32],
) -> Result<()> {
instructions::set_jungle::handler(
ctx,
maximum_weekly_multiplier,
weekly_multiplier,
maximum_holdings_multiplier,
holdings_multiplier,
start,
root,
)
}
pub fn init_dummy(ctx: Context<InitDummy>, bump: u8) -> Result<()> {
instructions::init_dummy::handler(ctx, bump)
}
pub fn add_reward_token(
ctx: Context<AddRewardToken>,
bumps: u8,
decimals: u8,
value: u64,
) -> Result<()> {
instructions::add_reward_token::handler(ctx, bumps, decimals, value)
}
pub fn update_reward_token(
ctx: Context<UpdateRewardToken>,
decimals: u8,
value: u64,
) -> Result<()> {
instructions::update_reward_token::handler(ctx, decimals, value)
}
pub fn init_staker(ctx: Context<InitStaker>, bumps: u8) -> Result<()> {
instructions::init_staker::handler(ctx, bumps)
}
pub fn init_transaction_batch(ctx: Context<InitTransactionBatch>) -> Result<()> {
instructions::init_transaction_batch::handler(ctx)
}
pub fn stake_animal<'info>(
ctx: Context<'_, '_, '_, 'info, StakeAnimal<'info>>,
bumps: StakeAnimalBumps,
emissions_per_day: u64,
faction: u64,
rules_acc_present: bool,
) -> Result<()> {
instructions::stake_animal::handler(
ctx,
bumps,
emissions_per_day,
faction,
rules_acc_present,
)
}
pub fn unstake_animal<'info>(
ctx: Context<'_, '_, '_, 'info, UnstakeAnimal<'info>>,
authorization_data: Option<AuthorizationDataLocal>,
rules_acc_present: bool,
) -> Result<()> {
instructions::unstake_animal::handler(ctx, authorization_data, rules_acc_present)
}
pub fn claim_staking(ctx: Context<ClaimStaking>) -> Result<()> {
instructions::claim_staking::handler(ctx)
}
pub fn bulk_claim(ctx: Context<BulkClaim>) -> Result<()> {
instructions::bulk_claim::handler(ctx)
}
pub fn swap_points(ctx: Context<SwapPoints>, amount: u64) -> Result<()> {
instructions::swap_points::handler(ctx, amount)
}
pub fn burn_points(ctx: Context<BurnPoints>, amount: u64) -> Result<()> {
instructions::burn_points::handler(ctx, amount)
}
pub fn transfer_points(ctx: Context<TransferPoints>, amount: u64) -> Result<()> {
instructions::transfer_points::handler(ctx, amount)
}
pub fn reward_points(ctx: Context<RewardPoints>, amount: u64) -> Result<()> {
instructions::reward_point::handler(ctx, amount)
}
pub fn force_unstake<'info>(
ctx: Context<'_, '_, '_, 'info, ForceUnstake<'info>>,
authorization_data: Option<AuthorizationDataLocal>,
rules_acc_present: bool,
) -> Result<()> {
instructions::force_unstake::handler(ctx, authorization_data, rules_acc_present)
}
}
#[account]
pub struct Admin {
pub bump: u8,
pub jungle_key: Pubkey,
}
impl Admin {
pub const LEN: usize = 8 + 1 + 32;
}
#[derive(AnchorSerialize, AnchorDeserialize, Clone, Default)]
pub struct InitializeJungleBumps {
pub jungle: u8,
pub escrow: u8,
}
#[account]
#[derive(Default)]
pub struct Jungle {
pub key: Pubkey,
pub owner: Pubkey,
pub bumps: InitializeJungleBumps,
pub escrow: Pubkey,
pub reward_tokens: Vec<Reward>,
pub animals_staked: u64,
pub maximum_weekly_multiplier: u64,
pub weekly_multiplier: u64,
pub maximum_holdings_multiplier: u64,
pub holdings_multiplier: u64,
pub start: i64,
pub root: [u8; 32],
}
#[derive(AnchorSerialize, AnchorDeserialize, Copy, Clone, Default)]
pub struct Reward {
pub bumps: u8,
pub mint: Pubkey,
pub account: Pubkey,
pub decimals: u8,
pub value: u64,
}
impl Reward {
pub const LEN: usize = 8 + 40 + 40 + 1 + 8;
}
#[derive(AnchorSerialize, AnchorDeserialize, Copy, Clone, Default)]
pub struct StakeAnimalBumps {
pub animal: u8,
pub deposit: u8,
pub staker_info: u8,
}
#[account]
#[derive(Default)]
pub struct Animal {
pub bumps: StakeAnimalBumps,
pub mint: Pubkey,
pub staker: Pubkey,
pub emissions_per_day: u64,
pub faction: u8,
pub last_claim: i64,
pub staked_at: i64,
}
impl Animal {
pub const LEN: usize = 8 + 2 + 40 + 40 + 8 + 1 + 8 + 8;
}
#[account]
#[derive(Default)]
pub struct StakerInfo {
pub bumps: u8,
pub staker: Pubkey,
pub holdings: u64,
pub tokens: u64,
}
impl StakerInfo {
pub const LEN: usize = 8 + 1 + 40 + 8 + 8 + 40 * 254; }
#[account]
#[derive(Default)]
pub struct TransactionBatch {
pub staker: Pubkey,
pub transactions: Vec<Transaction>,
}
impl TransactionBatch {
pub const LEN: usize = 8 + 40 + Transaction::LEN * 254; }
#[derive(AnchorSerialize, AnchorDeserialize, Clone, Default)]
pub struct Transaction {
pub timestamp: i64, pub amount: u64, pub description: String, }
impl Transaction {
pub const LEN: usize = 8 + 8 + 24; }