Shonen-Labs/Roster-Rumble

CONTRACT: Team Validation Contract

Open

#23 opened on Apr 23, 2025

View on GitHub
 (0 comments) (0 reactions) (0 assignees)TypeScript (11 forks)auto 404
ODHack 14contracthelp wanted

Repository metrics

Stars
 (4 stars)
PR merge metrics
 (PR metrics pending)

Description

Title: Implement Fantasy Team Composition Rules
Description
Create a Cairo 2.0 contract to enforce fantasy team rules (player positions, salary cap, captain selection).

Acceptance Criteria:

  • Validates team has exactly 11 players
  • Ensures 1 goalkeeper, 3-5 defenders, 3-5 midfielders, 1-3 forwards
  • Verifies total player salaries ≤ 100M "SportSparX Bucks"
  • Requires exactly 1 captain (2x points multiplier)
  • Returns validation errors with error codes

Technical Details:

#[starknet::contract]
mod TeamValidation {
    #[derive(Drop, Serde)]
    struct Player {
        position: u8, // 0=GK, 1=DEF, 2=MID, 3=FWD
        salary: u64,
        is_captain: bool
    }

    #[external(v0)]
    fn validate_team(ref self: ContractState, players: Array<Player>) -> Result<(), u8> {
        let mut total_salary = 0;
        let mut captain_count = 0;
        let mut position_counts = [0; 4];

        for player in players.iter() {
            // Position validation
            if player.position > 3 { return Result::Err(1) }
            position_counts[player.position] += 1;

            // Salary cap
            total_salary += player.salary;
            if total_salary > 100_000_000 { return Result::Err(2) }

            // Captain check
            if player.is_captain {
                captain_count += 1;
                if captain_count > 1 { return Result::Err(3) }
            }
        }

        // Team composition rules
        if players.len() != 11 { return Result::Err(4) }
        if position_counts[0] != 1 { return Result::Err(5) } // GK
        if position_counts[1] < 3 || position_counts[1] > 5 { return Result::Err(6) } // DEF
        if position_counts[2] < 3 || position_counts[2] > 5 { return Result::Err(7) } // MID
        if position_counts[3] < 1 || position_counts[3] > 3 { return Result::Err(8) } // FWD
        
        Result::Ok(())
    }
}

Notes:

  • Use custom error codes for client-side translation
  • Add unit tests for all validation scenarios
  • Implement gas optimization with early returns

Contributor guide