State Machine
Job lifecycle and state transitions
Jobs transition through 7 states. The happy path flows Open → Claimed → Submitted → Completed. Failed or contested jobs follow alternate paths through Disputed, Expired, or Cancelled.
States
| State | Description | Terminal? |
|---|---|---|
| Open | Job created, waiting for a worker to claim it | No |
| Claimed | Worker has claimed the job, deadline is ticking | No |
| Submitted | Worker submitted a result hash, awaiting approval | No |
| Completed | Result approved (or dispute resolved in worker's favor) | Yes |
| Disputed | Creator disputes the result, awaiting arbiter decision | No |
| Expired | Deadline passed or dispute lost, retries exhausted | Yes |
| Cancelled | Creator cancelled before any worker claimed it | Yes |
Transitions
| From | To | Instruction | Who |
|---|---|---|---|
| — | Open | create_job | Creator |
| Open | Claimed | claim_job | Worker |
| Open | Cancelled | cancel_job | Creator |
| Claimed | Submitted | submit_result | Worker |
| Claimed | Open/Expired | reclaim_expired | Anyone (crank) |
| Submitted | Completed | approve_result | Creator |
| Submitted | Disputed | dispute_result | Creator |
| Disputed | Completed | resolve_dispute (worker wins) | Arbiter |
| Disputed | Expired | resolve_dispute (worker loses) | Arbiter |
Happy Path
- Create — Creator calls
create_job, depositing reward into vault. Job enters Open. - Claim — Worker calls
claim_job, setting a deadline. Job enters Claimed. - Submit — Worker calls
submit_result(hash), creating a JobResult PDA. Job enters Submitted. - Approve — Creator calls
approve_result, releasing reward to worker. Job enters Completed.
Dispute Path
- Creator calls
dispute_resulton a Submitted job → job enters Disputed. - Arbiter calls
resolve_dispute:- Worker wins → reward released to worker, job enters Completed.
- Worker loses → worker is slashed, reward returned to creator, job enters Expired.
Expiry Path
- Worker fails to submit before deadline on a Claimed job.
- Anyone calls
reclaim_expired:- If
retry_count < max_retries→ job re-opens as Open (reward stays in vault). Worker is slashed. Cranker gets paid. - If retries exhausted → job enters Expired (terminal). Full reward returned to creator.
- If
Retry Behavior
When reclaim_expired is called on a claimed job past its deadline:
- If
retry_count < max_retries: Job re-opens as Open (reward stays in vault for the next worker). Worker is still slashed. Cranker still gets paid. - If retries are exhausted: Job goes to Expired (terminal). Full reward returned to creator.
Terminal States
Only terminal states (Completed, Expired, Cancelled) can be closed via close_job to reclaim rent.