[
 {
  "type": "constructor",
  "inputs": [
   {
    "name": "token_",
    "type": "address",
    "internalType": "contract IERC20"
   },
   {
    "name": "decisions_",
    "type": "address",
    "internalType": "contract DecisionLog"
   },
   {
    "name": "models_",
    "type": "address",
    "internalType": "contract ModelRegistry"
   },
   {
    "name": "staking_",
    "type": "address",
    "internalType": "contract WorkerStaking"
   },
   {
    "name": "owner_",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "guardian_",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "config_",
    "type": "tuple",
    "internalType": "struct TaskBoard.Config",
    "components": [
     {
      "name": "hireThresholdBps",
      "type": "uint16",
      "internalType": "uint16"
     },
     {
      "name": "gradeThresholdBps",
      "type": "uint16",
      "internalType": "uint16"
     },
     {
      "name": "ruleThresholdBps",
      "type": "uint16",
      "internalType": "uint16"
     },
     {
      "name": "minDuration",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "maxDuration",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "gradeWindow",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "disputeWindow",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "ruleWindow",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "minBounty",
      "type": "uint128",
      "internalType": "uint128"
     }
    ]
   }
  ],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "MAX_FEE_BPS",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint16",
    "internalType": "uint16"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "config",
  "inputs": [],
  "outputs": [
   {
    "name": "hireThresholdBps",
    "type": "uint16",
    "internalType": "uint16"
   },
   {
    "name": "gradeThresholdBps",
    "type": "uint16",
    "internalType": "uint16"
   },
   {
    "name": "ruleThresholdBps",
    "type": "uint16",
    "internalType": "uint16"
   },
   {
    "name": "minDuration",
    "type": "uint64",
    "internalType": "uint64"
   },
   {
    "name": "maxDuration",
    "type": "uint64",
    "internalType": "uint64"
   },
   {
    "name": "gradeWindow",
    "type": "uint64",
    "internalType": "uint64"
   },
   {
    "name": "disputeWindow",
    "type": "uint64",
    "internalType": "uint64"
   },
   {
    "name": "ruleWindow",
    "type": "uint64",
    "internalType": "uint64"
   },
   {
    "name": "minBounty",
    "type": "uint128",
    "internalType": "uint128"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "count",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "decisionUsed",
  "inputs": [
   {
    "name": "",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "outputs": [
   {
    "name": "",
    "type": "bool",
    "internalType": "bool"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "decisions",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "contract DecisionLog"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "dispute",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "outputs": [],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "feeBps",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint16",
    "internalType": "uint16"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "feeRouter",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "address"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "finalize",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "outputs": [],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "get",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "outputs": [
   {
    "name": "",
    "type": "tuple",
    "internalType": "struct TaskBoard.Task",
    "components": [
     {
      "name": "poster",
      "type": "address",
      "internalType": "address"
     },
     {
      "name": "bounty",
      "type": "uint128",
      "internalType": "uint128"
     },
     {
      "name": "deadline",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "status",
      "type": "uint8",
      "internalType": "enum TaskBoard.Status"
     },
     {
      "name": "accepted",
      "type": "bool",
      "internalType": "bool"
     },
     {
      "name": "disputed",
      "type": "bool",
      "internalType": "bool"
     },
     {
      "name": "disputedByModel",
      "type": "bool",
      "internalType": "bool"
     },
     {
      "name": "model",
      "type": "bytes32",
      "internalType": "bytes32"
     },
     {
      "name": "briefHash",
      "type": "bytes32",
      "internalType": "bytes32"
     },
     {
      "name": "resultHash",
      "type": "bytes32",
      "internalType": "bytes32"
     },
     {
      "name": "submittedAt",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "gradedAt",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "disputedAt",
      "type": "uint64",
      "internalType": "uint64"
     }
    ]
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "grade",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "internalType": "uint256"
   },
   {
    "name": "decisionId",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "outputs": [],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "guardian",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "address"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "hire",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "internalType": "uint256"
   },
   {
    "name": "decisionId",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "outputs": [],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "models",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "contract ModelRegistry"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "owner",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "address"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "paused",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "bool",
    "internalType": "bool"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "post",
  "inputs": [
   {
    "name": "bounty",
    "type": "uint128",
    "internalType": "uint128"
   },
   {
    "name": "deadline",
    "type": "uint64",
    "internalType": "uint64"
   },
   {
    "name": "briefHash",
    "type": "bytes32",
    "internalType": "bytes32"
   },
   {
    "name": "briefURI",
    "type": "string",
    "internalType": "string"
   }
  ],
  "outputs": [
   {
    "name": "id",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "rule",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "internalType": "uint256"
   },
   {
    "name": "decisionId",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "outputs": [],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "setConfig",
  "inputs": [
   {
    "name": "config_",
    "type": "tuple",
    "internalType": "struct TaskBoard.Config",
    "components": [
     {
      "name": "hireThresholdBps",
      "type": "uint16",
      "internalType": "uint16"
     },
     {
      "name": "gradeThresholdBps",
      "type": "uint16",
      "internalType": "uint16"
     },
     {
      "name": "ruleThresholdBps",
      "type": "uint16",
      "internalType": "uint16"
     },
     {
      "name": "minDuration",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "maxDuration",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "gradeWindow",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "disputeWindow",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "ruleWindow",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "minBounty",
      "type": "uint128",
      "internalType": "uint128"
     }
    ]
   }
  ],
  "outputs": [],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "setFee",
  "inputs": [
   {
    "name": "feeBps_",
    "type": "uint16",
    "internalType": "uint16"
   },
   {
    "name": "feeRouter_",
    "type": "address",
    "internalType": "address"
   }
  ],
  "outputs": [],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "setGuardian",
  "inputs": [
   {
    "name": "guardian_",
    "type": "address",
    "internalType": "address"
   }
  ],
  "outputs": [],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "setOwner",
  "inputs": [
   {
    "name": "owner_",
    "type": "address",
    "internalType": "address"
   }
  ],
  "outputs": [],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "setPaused",
  "inputs": [
   {
    "name": "paused_",
    "type": "bool",
    "internalType": "bool"
   }
  ],
  "outputs": [],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "staking",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "contract WorkerStaking"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "function",
  "name": "submit",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "internalType": "uint256"
   },
   {
    "name": "resultHash",
    "type": "bytes32",
    "internalType": "bytes32"
   },
   {
    "name": "resultURI",
    "type": "string",
    "internalType": "string"
   }
  ],
  "outputs": [],
  "stateMutability": "nonpayable"
 },
 {
  "type": "function",
  "name": "token",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "contract IERC20"
   }
  ],
  "stateMutability": "view"
 },
 {
  "type": "event",
  "name": "BountyPaid",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   },
   {
    "name": "model",
    "type": "bytes32",
    "indexed": true,
    "internalType": "bytes32"
   },
   {
    "name": "account",
    "type": "address",
    "indexed": true,
    "internalType": "address"
   },
   {
    "name": "amount",
    "type": "uint128",
    "indexed": false,
    "internalType": "uint128"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "BountyRefunded",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   },
   {
    "name": "poster",
    "type": "address",
    "indexed": true,
    "internalType": "address"
   },
   {
    "name": "amount",
    "type": "uint128",
    "indexed": false,
    "internalType": "uint128"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "ConfigSet",
  "inputs": [
   {
    "name": "config",
    "type": "tuple",
    "indexed": false,
    "internalType": "struct TaskBoard.Config",
    "components": [
     {
      "name": "hireThresholdBps",
      "type": "uint16",
      "internalType": "uint16"
     },
     {
      "name": "gradeThresholdBps",
      "type": "uint16",
      "internalType": "uint16"
     },
     {
      "name": "ruleThresholdBps",
      "type": "uint16",
      "internalType": "uint16"
     },
     {
      "name": "minDuration",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "maxDuration",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "gradeWindow",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "disputeWindow",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "ruleWindow",
      "type": "uint64",
      "internalType": "uint64"
     },
     {
      "name": "minBounty",
      "type": "uint128",
      "internalType": "uint128"
     }
    ]
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "FeeSet",
  "inputs": [
   {
    "name": "feeBps",
    "type": "uint16",
    "indexed": false,
    "internalType": "uint16"
   },
   {
    "name": "feeRouter",
    "type": "address",
    "indexed": false,
    "internalType": "address"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "FeeTaken",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   },
   {
    "name": "fee",
    "type": "uint128",
    "indexed": false,
    "internalType": "uint128"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "GradeDisputed",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   },
   {
    "name": "opener",
    "type": "address",
    "indexed": true,
    "internalType": "address"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "GuardianSet",
  "inputs": [
   {
    "name": "guardian",
    "type": "address",
    "indexed": true,
    "internalType": "address"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "HireHeld",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   },
   {
    "name": "decisionId",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "OwnerSet",
  "inputs": [
   {
    "name": "owner",
    "type": "address",
    "indexed": true,
    "internalType": "address"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "PausedSet",
  "inputs": [
   {
    "name": "paused",
    "type": "bool",
    "indexed": false,
    "internalType": "bool"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "Posted",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   },
   {
    "name": "poster",
    "type": "address",
    "indexed": true,
    "internalType": "address"
   },
   {
    "name": "bounty",
    "type": "uint128",
    "indexed": false,
    "internalType": "uint128"
   },
   {
    "name": "deadline",
    "type": "uint64",
    "indexed": false,
    "internalType": "uint64"
   },
   {
    "name": "briefHash",
    "type": "bytes32",
    "indexed": false,
    "internalType": "bytes32"
   },
   {
    "name": "briefURI",
    "type": "string",
    "indexed": false,
    "internalType": "string"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "Ruled",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   },
   {
    "name": "decisionId",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   },
   {
    "name": "paid",
    "type": "bool",
    "indexed": false,
    "internalType": "bool"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "WorkGraded",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   },
   {
    "name": "decisionId",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   },
   {
    "name": "accepted",
    "type": "bool",
    "indexed": false,
    "internalType": "bool"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "WorkSubmitted",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   },
   {
    "name": "model",
    "type": "bytes32",
    "indexed": true,
    "internalType": "bytes32"
   },
   {
    "name": "resultHash",
    "type": "bytes32",
    "indexed": false,
    "internalType": "bytes32"
   },
   {
    "name": "resultURI",
    "type": "string",
    "indexed": false,
    "internalType": "string"
   }
  ],
  "anonymous": false
 },
 {
  "type": "event",
  "name": "WorkerHired",
  "inputs": [
   {
    "name": "id",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   },
   {
    "name": "model",
    "type": "bytes32",
    "indexed": true,
    "internalType": "bytes32"
   },
   {
    "name": "decisionId",
    "type": "uint256",
    "indexed": true,
    "internalType": "uint256"
   }
  ],
  "anonymous": false
 },
 {
  "type": "error",
  "name": "AddressEmptyCode",
  "inputs": [
   {
    "name": "target",
    "type": "address",
    "internalType": "address"
   }
  ]
 },
 {
  "type": "error",
  "name": "AddressInsufficientBalance",
  "inputs": [
   {
    "name": "account",
    "type": "address",
    "internalType": "address"
   }
  ]
 },
 {
  "type": "error",
  "name": "BadBounty",
  "inputs": []
 },
 {
  "type": "error",
  "name": "BadConfig",
  "inputs": []
 },
 {
  "type": "error",
  "name": "BadDeadline",
  "inputs": []
 },
 {
  "type": "error",
  "name": "BadDecision",
  "inputs": []
 },
 {
  "type": "error",
  "name": "BadFee",
  "inputs": []
 },
 {
  "type": "error",
  "name": "BadStatus",
  "inputs": []
 },
 {
  "type": "error",
  "name": "DecisionUsed",
  "inputs": []
 },
 {
  "type": "error",
  "name": "FailedInnerCall",
  "inputs": []
 },
 {
  "type": "error",
  "name": "IsPaused",
  "inputs": []
 },
 {
  "type": "error",
  "name": "ModelInactive",
  "inputs": []
 },
 {
  "type": "error",
  "name": "NotBrain",
  "inputs": []
 },
 {
  "type": "error",
  "name": "NotDisputant",
  "inputs": []
 },
 {
  "type": "error",
  "name": "NotGuardian",
  "inputs": []
 },
 {
  "type": "error",
  "name": "NotOwner",
  "inputs": []
 },
 {
  "type": "error",
  "name": "NotWorker",
  "inputs": []
 },
 {
  "type": "error",
  "name": "ReentrancyGuardReentrantCall",
  "inputs": []
 },
 {
  "type": "error",
  "name": "SafeERC20FailedOperation",
  "inputs": [
   {
    "name": "token",
    "type": "address",
    "internalType": "address"
   }
  ]
 },
 {
  "type": "error",
  "name": "TooEarly",
  "inputs": []
 },
 {
  "type": "error",
  "name": "TooLate",
  "inputs": []
 },
 {
  "type": "error",
  "name": "TransferMismatch",
  "inputs": []
 },
 {
  "type": "error",
  "name": "ZeroAddress",
  "inputs": []
 }
]
