{
  "name": "wheelhouse",
  "version": "1.0.0",
  "description": "Squeekchain SqueekMining v6 on Sepolia: reads, checkpoints, claims and merges. Reads are permissionless; owner actions are prepared as unsigned transactions for the owner's wallet to sign. Testnet only.",
  "chainId": 11155111,
  "addresses": {
    "core": "0x74665dAecA35A2303e767E76a2FF1FB6F93e119f",
    "mining": "0x3beE588fC20dE788Bac17d33b41Da7346cb27EC4",
    "token": "0x6872bfa5ccc3e9e440c6c16e5ffdabb8dba4cc76",
    "nft": "0x0eAF3E0d40A0a8E5a6Ac030b2459E9FB0B7905c6"
  },
  "safety": [
    "all v6 operations fail closed on same-block chain, identity, runtime hash or wiring mismatch; two RPC block hashes must agree",
    "simulate before proposing a signature",
    "read ownership live, immediately before an owner action",
    "type BURN-<donor> before constructing merge calldata; donor is permanently destroyed",
    "this server never holds or requests a private key"
  ],
  "transports": {
    "web": "window.squeek.callTool(name, args)",
    "postMessage": {
      "request": {
        "type": "squeek.tool",
        "name": "…",
        "args": {},
        "id": "…"
      },
      "response": {
        "type": "squeek.result",
        "id": "…",
        "ok": true,
        "result": {}
      }
    },
    "mcp": "node mcp/server.js (stdio, MCP 2024-11-05)"
  },
  "tools": [
    {
      "name": "squeek_network_status",
      "description": "Network-wide SqueekCore + SqueekMining state: settled round, Squeek block height, checkpoint lag, emission per day, total power, minted/supply cap, level table and whether a checkpoint can advance now.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "sideEffects": "read-only",
      "surfaces": [
        "web",
        "mcp"
      ]
    },
    {
      "name": "squeek_verify",
      "description": "At one cross-checked Sepolia snapshot block, verify both proxies (chain ID, implementation address, runtime hash, layout digest, proxy admin/owner, implementation version, configuration) and the wiring between SqueekCore, SqueekMining, SqueekToken and SqueekNFT. Run this before trusting any other result.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "sideEffects": "read-only",
      "surfaces": [
        "web",
        "mcp"
      ]
    },
    {
      "name": "squeek_wallet_status",
      "description": "Per-address holdings: live Squeek positions (level, active/pending power, merge cooldown block), claimable SQK, total power, network share and estimated SQK/day. Defaults to the connected wallet in the browser.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "owner": {
            "type": "string",
            "description": "0x address to inspect (optional in the browser: defaults to the connected wallet)"
          }
        },
        "required": []
      },
      "sideEffects": "read-only",
      "surfaces": [
        "web",
        "mcp"
      ]
    },
    {
      "name": "squeek_checkpoint_preview",
      "description": "Whether checkpoint() can advance now (corePaused / roundSettled), with the reason when it cannot, the unsigned transaction and a gas estimate. checkpoint() is permissionless: no Squeek needed, no caller reward.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "0x caller address for same-block checkpoint simulation (optional only for connected browser wallet)"
          }
        },
        "required": []
      },
      "sideEffects": "read-only",
      "surfaces": [
        "web",
        "mcp"
      ]
    },
    {
      "name": "squeek_claim_preview",
      "description": "Simulated claim for an owner: total claimable SQK, the 32-ID transaction batches with per-batch gas, and any decoded revert. Signs nothing.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "owner": {
            "type": "string",
            "description": "0x address (optional)"
          },
          "tokenIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "subset of token IDs to claim (optional; default all owned)"
          }
        },
        "required": []
      },
      "sideEffects": "read-only",
      "surfaces": [
        "web",
        "mcp"
      ]
    },
    {
      "name": "squeek_merge_plan",
      "description": "Same-level merge pairs that satisfy every onchain precondition (below max level, no pending activation, cooldown measured in completed Squeek blocks), with power before/after and the gain. Merging always burns the donor.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "owner": {
            "type": "string",
            "description": "0x address (optional)"
          }
        },
        "required": []
      },
      "sideEffects": "read-only",
      "surfaces": [
        "web",
        "mcp"
      ]
    },
    {
      "name": "squeek_merge_preview",
      "description": "Simulate one merge for a survivor/donor pair: gas estimate, resulting level, and an explicit irreversibility warning. Signs nothing.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "owner": {
            "type": "string",
            "description": "0x address (optional)"
          },
          "survivor": {
            "type": "string",
            "description": "token ID that keeps its identity"
          },
          "donor": {
            "type": "string",
            "description": "token ID that gets burned"
          },
          "confirm": {
            "type": "string",
            "description": "must equal BURN-<donor> before building calldata"
          }
        },
        "required": [
          "survivor",
          "donor",
          "confirm"
        ]
      },
      "sideEffects": "read-only",
      "surfaces": [
        "web",
        "mcp"
      ]
    },
    {
      "name": "squeek_art",
      "description": "Onchain DotGrid art and traits for a Squeek token: name, description, trait list and an SVG data URI rendered by the contract. Display it as an isolated image, never as inline markup.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "tokenId": {
            "type": "string",
            "description": "Squeek token ID"
          }
        },
        "required": [
          "tokenId"
        ]
      },
      "sideEffects": "read-only",
      "surfaces": [
        "web",
        "mcp"
      ]
    },
    {
      "name": "squeek_prepare_checkpoint",
      "description": "Return an unsigned checkpoint() transaction (to/data/value/chainId) that the caller's wallet can sign. Use this from MCP; the web app can submit it directly.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "0x caller address for same-block checkpoint simulation (optional only for connected browser wallet)"
          }
        },
        "required": []
      },
      "sideEffects": "prepare-only",
      "surfaces": [
        "mcp"
      ]
    },
    {
      "name": "squeek_prepare_claim",
      "description": "Return unsigned claim() transactions, one per 32-ID batch, for the owner's wallet to sign. Simulated first; ownership is re-read immediately before building.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "owner": {
            "type": "string",
            "description": "0x address that owns the Squeeks"
          },
          "tokenIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "optional subset"
          }
        },
        "required": [
          "owner"
        ]
      },
      "sideEffects": "prepare-only",
      "surfaces": [
        "mcp"
      ]
    },
    {
      "name": "squeek_prepare_merge",
      "description": "Return an unsigned merge() transaction for a survivor/donor pair plus the warning that the donor is burned permanently. Requires confirm: 'BURN-<donor>'.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "owner": {
            "type": "string",
            "description": "0x address that owns both Squeeks"
          },
          "survivor": {
            "type": "string",
            "description": "token ID that survives"
          },
          "donor": {
            "type": "string",
            "description": "token ID that is burned"
          },
          "confirm": {
            "type": "string",
            "description": "must equal BURN-<donor> to acknowledge the burn"
          }
        },
        "required": [
          "owner",
          "survivor",
          "donor",
          "confirm"
        ]
      },
      "sideEffects": "prepare-only",
      "surfaces": [
        "mcp"
      ]
    },
    {
      "name": "squeek_request_checkpoint",
      "description": "Open the user's wallet popup to submit checkpoint(). Works for any wallet, holder or not. The user still confirms in their wallet.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "sideEffects": "wallet-popup",
      "surfaces": [
        "web"
      ]
    },
    {
      "name": "squeek_request_claim",
      "description": "Open the user's wallet popup to claim SQK for the connected owner (simulated first).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "tokenIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "optional subset of token IDs"
          }
        },
        "required": []
      },
      "sideEffects": "wallet-popup",
      "surfaces": [
        "web"
      ]
    },
    {
      "name": "squeek_request_merge",
      "description": "Open the user's wallet popup to merge a pair. Requires confirm: 'BURN-<donor>' so an agent cannot burn an NFT by accident, and the UI still asks the human to type BURN-<donor> before call construction.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "survivor": {
            "type": "string",
            "description": "token ID that survives"
          },
          "donor": {
            "type": "string",
            "description": "token ID that is burned"
          },
          "confirm": {
            "type": "string",
            "description": "must equal BURN-<donor>"
          }
        },
        "required": [
          "survivor",
          "donor",
          "confirm"
        ]
      },
      "sideEffects": "wallet-popup",
      "surfaces": [
        "web"
      ]
    }
  ]
}
