Contract e9f0bc1a6baa2cddd306b1df03f846328ca643c2e7f248e504414c1712511124

← Back to Index 📥 Download WASM

Meta

cliver 23.3.0#08473ac20016c369067ce0dbca91d9595e72d6d4
rssdkver 23.1.0#7456be9d91fe1f4cb070fc2732bac78244ce6c3f
rsver 1.91.1

Instances

  • CAHPLVEDW2HWY2EOTCTECDK5ZRHAB5FLER3WGHQ5OPFMBMMFJSTBRJZU

Interface

Pause the contract (emergency stop)

When paused, all player-facing functions are disabled except admin functions. This is an emergency mechanism to protect player funds in case of discovered vulnerabilities.

Errors

  • NotAdmin - If caller is not the admin
fn pause(env: soroban_sdk::Env) -> Result<(), soroban_sdk::Error>

Check if a contract is an approved game

fn is_game(env: soroban_sdk::Env, id: soroban_sdk::Address) -> bool

Unpause the contract

Restores normal contract functionality after emergency pause.

Errors

  • NotAdmin - If caller is not the admin
fn unpause(env: soroban_sdk::Env) -> Result<(), soroban_sdk::Error>

Update the contract WASM hash (upgrade contract)

Errors

  • NotAdmin - If caller is not the admin
fn upgrade(
    env: soroban_sdk::Env,
    new_wasm_hash: soroban_sdk::BytesN<32>,
) -> Result<(), soroban_sdk::Error>

Add a game contract to the approved list

Errors

  • NotAdmin - If caller is not the admin
fn add_game(
    env: soroban_sdk::Env,
    id: soroban_sdk::Address,
) -> Result<(), soroban_sdk::Error>

End a game session with outcome verification

Requires game contract authorization. Both players' FP wagers are spent/burned. Only the winner's wager contributes to their faction standings.

Outcome verification is handled by the individual game contracts. Each game is responsible for implementing its own verification mechanism (multi-sig oracle, ZK proofs, etc.) before calling this function.

Arguments

  • session_id - The unique session identifier
  • player1_won - true if player1 won, false if player2 won

Errors

  • SessionNotFound - If session doesn't exist
  • InvalidSessionState - If session is not Pending
  • GameExpired - If game is from a previous epoch
fn end_game(
    env: soroban_sdk::Env,
    session_id: u32,
    player1_won: bool,
) -> Result<(), soroban_sdk::Error>

Get the admin address

fn get_admin(env: soroban_sdk::Env) -> soroban_sdk::Address

Get epoch information for a specific epoch

Arguments

  • epoch - The epoch number to retrieve

Errors

  • EpochNotFinalized - If requested epoch doesn't exist
fn get_epoch(
    env: soroban_sdk::Env,
    epoch: u32,
) -> Result

Check if contract is paused

fn is_paused(env: soroban_sdk::Env) -> bool

Update the admin address

Errors

  • NotAdmin - If caller is not the current admin
fn set_admin(
    env: soroban_sdk::Env,
    new_admin: soroban_sdk::Address,
) -> Result<(), soroban_sdk::Error>

Get the current configuration

fn get_config(env: soroban_sdk::Env) -> Config

Get player information

Returns complete persistent player data including selected faction, total deposited, and deposit timestamp.

Errors

  • PlayerNotFound - If player has never interacted with the contract
fn get_player(
    env: soroban_sdk::Env,
    player: soroban_sdk::Address,
) -> Result

Start a new game session

Locks factions and fp for both players. If this is a player's first game in the epoch, initializes their fp and locks their faction.

Errors

  • GameNotWhitelisted - If game_id is not approved
  • SessionAlreadyExists - If session_id already exists
  • InvalidAmount - If wagers are <= 0
  • PlayerNotFound - If players don't exist
  • InsufficientFactionPoints - If players don't have enough fp
  • ContractPaused - If contract is in emergency pause mode
fn start_game(
    env: soroban_sdk::Env,
    game_id: soroban_sdk::Address,
    session_id: u32,
    player1: soroban_sdk::Address,
    player2: soroban_sdk::Address,
    player1_wager: i128,
    player2_wager: i128,
) -> Result<(), soroban_sdk::Error>

Cycle to the next epoch

Finalizes current epoch (determines winner, withdraws BLND, swaps to USDC, sets reward pool) and opens next epoch.

Returns

The new epoch number

Errors

  • EpochNotReady - If not enough time has passed
  • EpochAlreadyFinalized - If current epoch is already finalized
  • FeeVaultError - If fee-vault operations fail
  • SwapError - If BLND → USDC swap fails
fn cycle_epoch(env: soroban_sdk::Env) -> Result

Remove a game contract from the approved list

Errors

  • NotAdmin - If caller is not the admin
fn remove_game(
    env: soroban_sdk::Env,
    id: soroban_sdk::Address,
) -> Result<(), soroban_sdk::Error>
fn __check_auth(
    env: soroban_sdk::Env,
    signature_payload: soroban_sdk::BytesN<32>,
    signature: Option,
    auth_contexts: soroban_sdk::Vec,
) -> Result<(), soroban_sdk::Error>

Initialize the contract

Sets up the admin, external contract addresses, and creates the first epoch.

Arguments

  • admin - Admin address (can modify config and upgrade contract)
  • fee_vault - fee-vault-v2 contract address
  • soroswap_router - Soroswap router contract address
  • blnd_token - BLND token address
  • usdc_token - USDC token address
  • epoch_duration - Duration of each epoch in seconds (default: 345,600 = 4 days)
  • reserve_token_ids - Reserve token IDs for claiming BLND emissions (e.g., vec![&env, 1] for reserve 0 b-tokens)
  • free_fp_per_epoch - Base FP granted to all players each epoch (enables free play)
  • min_deposit_to_claim - Minimum vault balance required to claim rewards (anti-sybil)
fn __constructor(
    env: soroban_sdk::Env,
    admin: soroban_sdk::Address,
    fee_vault: soroban_sdk::Address,
    soroswap_router: soroban_sdk::Address,
    blnd_token: soroban_sdk::Address,
    usdc_token: soroban_sdk::Address,
    epoch_duration: u64,
    reserve_token_ids: soroban_sdk::Vec,
    free_fp_per_epoch: i128,
    min_deposit_to_claim: i128,
)

Update global configuration

Allows admin to update specific configuration parameters. Only updates parameters that are provided (non-None).

Arguments

  • new_fee_vault - New fee-vault-v2 contract address (optional)
  • new_soroswap_router - New Soroswap router contract address (optional)
  • new_blnd_token - New BLND token address (optional)
  • new_usdc_token - New USDC token address (optional)
  • new_epoch_duration - New epoch duration in seconds (optional)
  • new_reserve_token_ids - New reserve token IDs for claiming BLND emissions (optional)
  • new_free_fp_per_epoch - New base FP for free play (optional)
  • new_min_deposit_to_claim - New minimum deposit to claim rewards (optional)

Errors

  • NotAdmin - If caller is not the admin
fn update_config(
    env: soroban_sdk::Env,
    new_fee_vault: Option,
    new_soroswap_router: Option,
    new_blnd_token: Option,
    new_usdc_token: Option,
    new_epoch_duration: Option,
    new_reserve_token_ids: Option>,
    new_free_fp_per_epoch: Option,
    new_min_deposit_to_claim: Option,
) -> Result<(), soroban_sdk::Error>

Migrate configuration from old format to new format

This function is used to migrate deployed contracts that have the old 6-field Config struct to the new 8-field Config struct with free play fields. It reads the existing config, creates a new config with default values for the new fields, and saves it.

Default Values

  • free_fp_per_epoch - 100 FP (100_0000000 with 7 decimals)
  • min_deposit_to_claim - 1 USDC (1_0000000 with 7 decimals)

Panics

Panics if config doesn't exist (should never happen on deployed contract)

fn migrate_config(env: soroban_sdk::Env) -> Config

Select a faction for the player

Sets the player's persistent faction preference. Can be changed at ANY time. If you haven't played a game this epoch, the new faction applies immediately. If you've already played this epoch, the current epoch stays locked to your old faction, and the new selection applies starting next epoch.

Arguments

  • faction - Faction ID (0=WholeNoodle, 1=PointyStick, 2=SpecialRock)

Errors

  • InvalidFaction - If faction ID is not 0, 1, or 2
fn select_faction(
    env: soroban_sdk::Env,
    player: soroban_sdk::Address,
    faction: u32,
) -> Result<(), soroban_sdk::Error>

Get player's epoch-specific information for any epoch

Returns complete epoch-specific data including locked faction, available FP, total FP contributed, and balance snapshot. Consistent with get_epoch(epoch) which also requires an epoch parameter.

Behavior for current epoch: If player hasn't played any games this epoch yet, calculates what their FP WOULD be based on current vault balance without writing to storage. This allows UIs to display FP before the player's first game.

Behavior for historical epochs: Only returns data if player participated in that epoch (played at least one game).

Arguments

  • epoch - Epoch number to query
  • player - Player address

Examples

// Current epoch
let current = contract.get_current_epoch();
let player_data = contract.get_epoch_player(&current, &player)?;

// Historical epoch
let epoch0_data = contract.get_epoch_player(&0, &player)?;

Errors

  • FactionNotSelected - If querying current epoch and player hasn't selected faction
  • `PlayerNot
fn get_epoch_player(
    env: soroban_sdk::Env,
    epoch: u32,
    player: soroban_sdk::Address,
) -> Result

Get the current epoch number

Returns

The current epoch number

fn get_current_epoch(env: soroban_sdk::Env) -> u32

Claim epoch reward for a player for a specific epoch

Players who contributed FP to the winning faction can claim their share of the epoch's reward pool (USDC converted from BLND yield).

Note: To check claimable amounts or claim status before calling, use transaction simulation. This is the idiomatic Soroban pattern.

Returns

Amount of USDC claimed

Errors

  • EpochNotFinalized - If epoch doesn't exist or isn't finalized
  • RewardAlreadyClaimed - If player already claimed for this epoch
  • NotWinningFaction - If player wasn't in the winning faction
  • NoRewardsAvailable - If player has no rewards to claim
  • ContractPaused - If contract is in emergency pause mode
fn claim_epoch_reward(
    env: soroban_sdk::Env,
    player: soroban_sdk::Address,
    epoch: u32,
) -> Result

Imports

WebAssembly Text (WAT) ▶