IRONQ

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

StateDescriptionTerminal?
OpenJob created, waiting for a worker to claim itNo
ClaimedWorker has claimed the job, deadline is tickingNo
SubmittedWorker submitted a result hash, awaiting approvalNo
CompletedResult approved (or dispute resolved in worker's favor)Yes
DisputedCreator disputes the result, awaiting arbiter decisionNo
ExpiredDeadline passed or dispute lost, retries exhaustedYes
CancelledCreator cancelled before any worker claimed itYes

Transitions

FromToInstructionWho
Opencreate_jobCreator
OpenClaimedclaim_jobWorker
OpenCancelledcancel_jobCreator
ClaimedSubmittedsubmit_resultWorker
ClaimedOpen/Expiredreclaim_expiredAnyone (crank)
SubmittedCompletedapprove_resultCreator
SubmittedDisputeddispute_resultCreator
DisputedCompletedresolve_dispute (worker wins)Arbiter
DisputedExpiredresolve_dispute (worker loses)Arbiter

Happy Path

  1. Create — Creator calls create_job, depositing reward into vault. Job enters Open.
  2. Claim — Worker calls claim_job, setting a deadline. Job enters Claimed.
  3. Submit — Worker calls submit_result(hash), creating a JobResult PDA. Job enters Submitted.
  4. Approve — Creator calls approve_result, releasing reward to worker. Job enters Completed.

Dispute Path

  1. Creator calls dispute_result on a Submitted job → job enters Disputed.
  2. 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

  1. Worker fails to submit before deadline on a Claimed job.
  2. 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.

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.