Skip to content

Important: status enum doesn't model finalized-but-unclaimed states #26

@0xdevcollins

Description

@0xdevcollins

Severity: Important (UX + indexer)

After the pull-model refactor, status == Completed covers three distinct realities:

  1. Finalized; no prizes claimed yet
  2. Finalized; some prizes claimed
  3. Finalized; claim window expired

Frontend has to query each WinnerRecord to figure out the payout state.

Options

Option A — derived helper (lightweight):

pub enum PayoutState {
    NotFinalized,
    Claimable { unclaimed_count: u32, total_unclaimed: i128 },
    PartiallyClaimed { unclaimed_count: u32, total_unclaimed: i128, claimed_count: u32 },
    FullyClaimed,
    Reclaimable { unclaimed_count: u32, total_unclaimed: i128 },
}

pub fn get_payout_state(env: Env, hackathon_id: u64) -> Result<PayoutState, Error>;

Option B — emit HackathonFullyClaimed event when last claim happens: indexer-friendly, no extra storage.

Recommend both: derived query for one-shot UI loads, event for streaming indexers.

Tests

  • Each PayoutState branch covered
  • Event fires exactly once on transition to FullyClaimed

Metadata

Metadata

Assignees

No one assigned

    Labels

    audit-findingSurfaced during internal audit / reviewenhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions