Seeds economy
How the Seeds economy works.
This page documents every way Seeds enter or leave the system. Numbers below come from lib/economy/policy.ts and update whenever the operator changes them.
Sources (credits)
- solver_reward— paid to the user whose submission is accepted. Amount = the challenge's posted reward (typically 10).
- first_solver_bonus — extra 3 Seeds for the first solver of a challenge, once per challenge ever.
- creator_reward — when the first non-author solver lands an accept, the challenge author receives 5 Seeds. Subsequent solves do not pay the author again.
- bounty_awarded — when an active bounty pays out, the solver receives a newly-minted credit equal to the bounty amount.
- review_deposit_refunded— challenge author's deposit returned (on approval or refunded-reject).
- bounty_refunded— funder's locked Seeds released back to spendable (on cancel / expiry / self-solve).
- admin_grant— admin top-up. Always recorded with a required reason and the admin's user id.
- system_migration / legacy_solver_accept — one-time backfill from the pre-redesign single-bucket world.
Sinks (debits)
- review_deposit_locked— moves Seeds from the author's spendable bucket to their locked bucket when a challenge is submitted for review. Default 5.
- bounty_funded— moves Seeds from the funder's spendable bucket to their locked bucket. Min 1, max 10,000.
- review_deposit_burned — sink. Forfeited deposit on an abuse-flagged reject. Admin choice; rare.
- bounty_payout_sink— sink. The funder's locked Seeds disappear when a bounty pays out; the solver gets a separately-minted
bounty_awardedcredit. There is no direct A→B transfer. - admin_clawback — sink. Recovers Seeds from a confirmed bad actor. Required reason; logged.
Invariants
- Every balance change has a matching immutable ledger row, written in the same transaction.
- No bucket on any user can go negative. Attempts to drive one negative throw
insufficient_balance. - The cached bucket fields on the User row can be reproduced exactly by replaying the ledger.
- There is no user-to-user transfer row in the schema. Two-sided events use one debit and one credit, on the two different users, sharing an audit linkage in metadata.
- Self-solving a challenge you authored: no Seeds are awarded (solver, creator, or first-solver bonus).
Feature flags
The economy can be rolled out incrementally. Operator-side env vars:
SEEDS_AWARDS_ENABLED— master kill-switch for award and spend writes. Default on.SEEDS_REVIEW_DEPOSIT_ENABLED— whether posting a challenge for review locks a deposit. Default off during initial rollout.SEEDS_BOUNTIES_ENABLED— whether the bounty UI is shown / functional. Default off during initial rollout.SEEDS_CREATOR_REWARD_ENABLED/SEEDS_FIRST_SOLVER_BONUS_ENABLED— both default on.
The full category list
Credits: solver_rewardfirst_solver_bonuscreator_rewardbounty_awardedreview_deposit_refundedbounty_refundedadmin_grantlegacy_solver_acceptsystem_migration
Debits / sinks: review_deposit_lockedbounty_fundedreview_deposit_burnedbounty_payout_sinkadmin_clawback
See also: What are Seeds? · Legal boundaries.