Hooklist builder
Generate a fail-closed Solidity scaffold and versioned manifest. Every selected callback reverts until you implement its policy, and the manifest remains a draft until every deployment and trust declaration is entered and reviewed.
The deployment, verifier evidence, dependency bindings, privileged-role holders, proxy authority, and gas measurements must all describe this chain.
Each dependency binding uses deployments: [{ chainId: 84532, addresses?: [...], url?: "https://..." }]. API bindings use a URL and no addresses.
Each holder uses { chainId: 84532, address: "0x..." }. A proxy admin holder must use this deployment chain.
One non-zero address per line or comma. The current protocol supports at most eight defaults plus custom hooks together.
V1 sends this one byte-string value to checkFund on every custom and default hook. Taskmarket does not support a different hookData value per hook.
Protocol defaults, called first
2 of 8 total hooks after adding 1 custom hook.
CLI attachment command
taskmarket task create --description "..." --reward <usdc> --duration <hours> --hook 0xfc6f92657d29a4f46ff417efef680ec8c5842f89 --hook-data 0x{
"manifestVersion": "1.0.0",
"identity": {
"name": "Draft Taskmarket Hook",
"slug": "my-taskmarket-hook",
"version": "1.0.0",
"description": "Draft manifest. Do not publish."
},
"author": {
"name": "DRAFT: unknown author",
"url": "https://example.invalid"
},
"source": {
"repository": "https://example.invalid/draft",
"commit": "0000000",
"path": "src/MyTaskmarketHook.sol"
},
"license": "MIT",
"deployments": [
{
"chainId": 1,
"network": "draft",
"hook": "0xfc6f92657d29a4f46ff417efef680ec8c5842f89",
"taskmarketDiamond": "0x0000000000000000000000000000000000000000",
"deployment": {
"transactionHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"blockNumber": 0
},
"runtimeCodehash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gas": {
"estimates": {
"checkFund": {
"typical": 0,
"maximum": 0,
"methodology": "DRAFT: gas has not been measured."
}
}
},
"proxy": {
"kind": "none",
"upgradeable": false
}
}
],
"callbacks": [
"checkFund"
],
"taskModes": [
"bounty"
],
"hookData": {
"encoding": "none",
"schema": {},
"examples": [
{
"name": "no configuration",
"decoded": null,
"encoded": "0x"
}
]
},
"sourceVerification": {
"status": "unverified",
"verifiers": []
},
"privilegedRoles": [],
"externalDependencies": [],
"liveness": {
"requirements": [],
"failureMode": "DRAFT: failure mode has not been reviewed."
},
"security": {
"audits": [
{
"status": "unaudited",
"scope": "DRAFT: audit scope has not been recorded."
}
],
"notes": [
"DRAFT: security review has not been recorded."
]
},
"listing": {
"status": "unlisted"
},
"conformance": {
"status": "not-claimed",
"standard": "ITMPHook / ERC-8195"
},
"protocolDefault": {
"status": "not-default"
},
"x-schema": "https://taskmarket.dev/schemas/taskmarket-hook/1.0.0/schema.json",
"x-draft": {
"warning": "This file is a draft. Replace placeholders and independently verify every declaration before publishing.",
"missing": [
"project name",
"description",
"author name",
"author HTTPS URL",
"source repository HTTPS URL",
"nonzero source commit SHA",
"source contract path",
"deployment chain ID",
"deployment network",
"nonzero Taskmarket Diamond address",
"deployment transaction hash",
"deployment block number",
"runtime codehash",
"nonzero typical gas estimate",
"nonzero maximum gas at least typical gas",
"gas methodology",
"source verification declaration and verifier evidence",
"listing declaration",
"conformance declaration",
"protocol-default declaration",
"liveness failure mode",
"security audit status",
"security audit scope",
"security notes",
"review of every trust declaration"
]
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import { BaseTMPHook } from "@taskmarket/contracts/src/hooks/base/BaseTMPHook.sol";
import { ITMPCore } from "@taskmarket/contracts/src/interfaces/ITMPCore.sol";
/// @notice Fail-closed Taskmarket hook scaffold; selected callbacks revert until implemented.
contract MyTaskmarketHook is BaseTMPHook {
error HookPolicyNotImplemented();
constructor(address taskmarket_) BaseTMPHook(taskmarket_) { }
// TODO: implement checkFund policy; this stub intentionally reverts.
function _checkFund(bytes32, ITMPCore.TaskContext calldata, bytes calldata) internal override returns (bool) { revert HookPolicyNotImplemented(); }
}