{"schema":"keel.docs.v1","pages":[{"slug":"quickstart","navTitle":"Quickstart","eyebrow":"Start building","title":"Build, prepare, and publish with KEEL.","summary":"The shortest path from local source to a verified release, with the same planning rules in Studio, the SDK, and MCP.","thesis":"Keep the source graph, storage choice, viewer, delivery format, and publication evidence explicit.","audience":["Developers","Agent builders"],"sections":[{"id":"workflow","title":"The publication workflow","intro":"Studio can guide this sequence. With an agent, connect the KEEL MCP and ask it to prepare a work from your actual files.","cards":[{"title":"Start from the source graph","body":"Give each HTML entry, stylesheet, script, reusable module, and asset a stable identity and explicit dependencies. Preserve the creator's originals. A single public tokenURI call can still assemble a modular project.","bullets":["Inspect the target README and architecture before choosing modules.","Discover compatible modules on the selected chain; resolve their actual receipts and bytes.","Reuse unchanged object IDs. Upload changed resources and the necessary bindings only."],"source":"keel-sdk/docs/KEEL_PREPARED_COPY_ASSEMBLY.md"},{"title":"Prepare before the wallet opens","body":"Measure original bytes, stored bytes, decoded bytes, complete tokenURI bytes, and read gas separately. Render the exact prepared result locally, then build a reviewable publication plan. Wallet approval authorizes the concrete transactions, not an unmeasured substitute.","source":"keel-sdk/docs/KEEL_PREPARED_DENSE_COPY.md"},{"title":"Read back after publication","body":"Check receipts, storage identity, ordered bindings, complete returned bytes, and decoded integrity on the selected public chain. Open that exact return in a browser. A build or local preview alone is not a completed onchain release.","source":"keel-sdk/packages/sdk/src/prepared-copy-publication.ts"}]},{"id":"choices","title":"Independent choices","intro":"These settings solve different problems; changing one must not silently change another.","cards":[{"title":"Storage","body":"Compact is the default: use beneficial supported lossless compression and store one representation. Raw preserves supplied bytes and deliberate encoding without automatic compression.","source":"keel-sdk/docs/KEEL_PAYLOAD_STORAGE.md"},{"title":"Viewer","body":"The registered verification shell is the default. An explicit viewer=none preserves a supported creator-owned self-contained HTML artifact without claiming canonical protection. Reusable custom shells use their declared registration and compatibility path.","source":"keel-sdk/docs/KEEL_PAYLOAD_STORAGE.md"},{"title":"Delivery","body":"At or below 2,000,000 complete prepared tokenURI bytes, full Inline is the automatic delivery default: one public collection call carries the work's modules and assets. Internal storage reads still consume gas. Preserve explicit delivery choices and verify the actual RPC ceiling.","source":"keel-sdk/docs/KEEL_PREPARED_DENSE_COPY.md"}]},{"id":"example","title":"Ask an agent to prepare a work","intro":"Use a concrete request that supplies creative intent while leaving technical discovery to the tools.","cards":[{"title":"Example request","body":"Review the plan and measured costs before approving the wallet. The agent must report missing registrations or incompatible readers instead of inventing a fallback.","code":"Prepare this project for KEEL on my selected chain.\nKeep the HTML, scripts, styles, and assets as logical resources.\nReuse any unchanged published objects.\nUse Compact storage and the registered verification shell.\nUse full Inline when the complete tokenURI fits the supported limit.\nShow the exact preview, returned byte count, read gas, and upload quote.\nDo not publish until I review the plan.","source":"keel-sdk/packages/mcp/src/prompts.ts"}]}],"related":["storage","agents","sdk","contracts"]},{"slug":"storage","navTitle":"Storage & COPY","eyebrow":"Encoding and delivery","title":"Store once. Prepare once. Copy at read time.","summary":"Native bytes, compression, URI81, shell boot fragments, exact reuse, escaping, and complete-return accounting.","thesis":"Storage bytes and return carriage are separate boundaries. Never infer paid storage from a displayed data URI.","audience":["SDK users","Contract integrators"],"sections":[{"id":"dense-copy","title":"Fresh dense COPY","intro":"For nested URI/JSON delivery, select URI81 bulk transport explicitly when preparing compressed binary COPY work. The shell decodes the payload in the browser; carriage defaults depend on the installed SDK revision.","cards":[{"title":"Build-time preparation","body":"Compress the source first, prepare URI81-block-v1 text, and store that prepared representation once. buildKeelPreparedDenseCopyShell is exported by @keel/sdk. Only compressed shell boot fragments use Base64 literals; do not wrap the complete HTML, metadata, or bulk payload in another Base64 layer.","code":"import { buildKeelPreparedDenseCopyShell } from '@keel/sdk';\n\n// Supply the verified graph, resources, and selected-chain binding.\nconst shell = await buildKeelPreparedDenseCopyShell({\n  ...verifiedShellOptions,\n  embeddedContainerDelivery: { chainId, store },\n  binaryPayloadCarriage: 'uri81',\n  shellBootCompression: 'gzip',\n});","source":"keel-sdk/packages/sdk/src/prepared-dense-copy.ts"},{"title":"Contract COPY and browser decoding","body":"The compatible registered contract copies committed prefix, payload, descriptor, and suffix fragments. It does not encode or decompress the bulk resources during tokenURI. The browser checks stored, decoded, and member commitments before mounting the chosen shell.","source":"keel-sdk/docs/KEEL_PREPARED_DENSE_COPY.md"},{"title":"Strict URI and JSON boundaries","body":"URI81's alphabet is literal-safe for the nested URI/JSON payload. Surrounding metadata and HTML still need correct escaping. Use the SDK serializers; Base90/Base91 do not waive URI escaping. Quotes, script terminators, percent signs, and unsafe URI characters each belong to their actual serialization boundary.","source":"keel-sdk/packages/sdk/src/dense-transport.ts"}]},{"id":"reuse","title":"Existing objects and native binary","intro":"Keep compatible immutable resources intact. A new wrapper is not a reason to pay for another encoded copy.","cards":[{"title":"Assembly-only reuse","body":"Call keel-inline-reuse-plan before preparation or upload. Preserve exact ordered IDs, media types, chain, store, and bytes. Existing prepared Base64 or percent fragments use their matching builder without transcoding. Assembly-only reuse has zero new source bytes and no object-write plan.","source":"keel-sdk/docs/KEEL_PREPARED_COPY_ASSEMBLY.md"},{"title":"An incompatible binary pack is different","body":"Padding arbitrary native binary cannot make it a valid Base64 slice or prepared dense fragment. Use its registered native reader/composer when available. A creator-authorized migration to COPY needs new prepared fragments and an honest new-storage quote.","source":"keel-sdk/docs/KEEL_BINARY_RESOURCE_DELIVERY.md"}]},{"id":"budget","title":"Measure the actual return","intro":"Use separate measurements for storage economics, public reads, and browser execution.","cards":[{"title":"Required measurements","body":"The collector receives the complete tokenURI, including both URI layers, image, shell, decoder, payloads, descriptors, and delimiters. A 900 KB compressed pack does not promise a 900 KB tokenURI. Upload gas is independent of read gas.","facts":[{"label":"Source","value":"Original bytes and their digest"},{"label":"Storage","value":"New versus reused carrier bytes"},{"label":"Return","value":"Exact complete collection response"},{"label":"Read","value":"Actual call gas within the public RPC limit"},{"label":"Runtime","value":"Decoded bytes, browser memory, and execution"}],"source":"keel-sdk/docs/KEEL_PREPARED_DENSE_COPY.md"},{"title":"Publication gate","body":"Run keel-inline-token-audit and keel-inline-publication-check against the exact expected and actual collection return. Local byte equality remains distinct from selected-chain receipts and offline browser proof. Reject altered transport, missing resources, and digest mismatches.","source":"keel-sdk/packages/mcp/src/copy-read-tool.ts"}]}],"related":["viewer-storage","agents","proof-status"]},{"slug":"agents","navTitle":"MCP & agents","eyebrow":"Tool reference","title":"Give an agent the same KEEL workflow as Studio.","summary":"Discovery, contract inspection, asset planning, safe reuse, prepared publication, and explicit wallet review.","thesis":"Planning and inspection tools are not signing authority. Use returned schemas and registered modules, not invented interfaces.","audience":["MCP clients","Agent developers"],"sections":[{"id":"discovery","title":"Connect and discover","intro":"The public machine-readable endpoints describe the current installation. Load tool schemas from the configured MCP server.","cards":[{"title":"Installation discovery","body":"Use /.well-known/keel.json for public connection details, /llms.txt for agent guidance, and /api/access/schema for declared access capabilities. Authenticated access and provider configuration remain server-controlled; these public documents do not grant permissions.","code":"GET https://onkeel.io/.well-known/keel.json\nGET https://onkeel.io/llms.txt\nGET https://studio.onkeel.io/api/access/schema","source":"keel-site/apps/studio/src/app/.well-known/keel.json/route.ts"},{"title":"Contract-first discovery","body":"Read the target repository and relevant docs, run keel-contract-workflow-preflight, then inspect engine modules, selected network, compatible library modules, and exact contract controls. A supplied ABI proves neither code identity nor user authority.","code":"keel-contract-workflow-preflight\nkeel-engine-catalog\nkeel-network-inspect\nkeel-library-search\nkeel-contract-controls","source":"keel-sdk/packages/mcp/src/engine-tools.ts"}]},{"id":"tools","title":"Prepare and validate","intro":"Pass arguments from each advertised tool schema. This list describes roles, not a substitute for those schemas.","cards":[{"title":"Reuse and revision","body":"keel-inline-reuse-plan inspects existing objects and returns review-only reuse evidence. For changed source, a revision plan distinguishes unchanged references from new resources. Do not republish an unchanged graph just because the agent started a fresh conversation.","source":"keel-sdk/packages/mcp/src/prepared-copy-tools.ts"},{"title":"Preparation","body":"keel-inline-prepare handles supported new creator source, preserving both viewer and payloadStorage. Omitted choices use the verification shell and Compact storage. Existing compatible prepared objects take the reuse route first.","source":"keel-sdk/packages/mcp/src/tools.ts"},{"title":"Full return checking","body":"keel-inline-token-audit inspects actual delivery bytes. keel-inline-publication-check checks expected-versus-returned prepared COPY evidence before publish-plan. The publication plan binds the concrete check and still needs receipt authentication, selected-chain read-back, and browser verification.","source":"keel-sdk/packages/mcp/src/copy-read-tool.ts"}]},{"id":"authority","title":"Access, recovery, and wallet review","intro":"Keep drafts and technical planning separate from the person's approval to publish.","cards":[{"title":"Studio planning state","body":"Studio preserves conversation context, pending edits, request identity, defaults, and owner review. Resume a draft from durable state rather than repeating an operation after a stale tab or delayed response. Only an authenticated, authorized owner can complete the protected flow.","source":"keel-site/apps/studio/src/server/services/studio-agent-conversation-service.ts"},{"title":"Do not infer capability from a catalog result","body":"A local package or module description is not a selected-chain deployment. Resolve the actual registered builder, shell, policy, and compatible revision. If required evidence is missing, surface the missing step before proposing wallet transactions.","source":"keel-sdk/packages/mcp/src/prepared-copy-guidance.ts"}]}],"related":["quickstart","sdk","access","studio"]},{"slug":"editor","navTitle":"Desktop Editor","eyebrow":"Local authoring & integration","title":"KEEL Editor","summary":"Local projects, source files, live previews, contract inspection, wallet review, and an SDK/MCP connection to your desktop workspace.","thesis":"The desktop Editor is a local application; Studio is the hosted release and management interface.","audience":["Creators","Developers","Assistant integrations"],"related":["studio","sdk","agents","contracts","networks"],"sections":[{"id":"install","title":"Run the Editor","intro":"The source checkout provides an Electron desktop application. These commands run the development build; they do not install a signed public desktop release.","cards":[{"title":"Requirements and commands","body":"Use Node.js 22 and pnpm 10 in the keel-sdk repository. The Editor stores its workspace locally and retains projects between launches.","code":"git clone --branch keel-onchain-data https://github.com/keel-web3/keel-sdk.git\ncd keel-sdk\npnpm install\npnpm desktop:build\npnpm desktop","links":[{"label":"Editor source and README","href":"https://github.com/keel-web3/keel-sdk/tree/keel-onchain-data/apps/desktop"}]},{"title":"Practice without broadcasting","body":"The practice workspace uses simulated contracts and separate persistent practice data. It exercises creation, review, and wallet preparation without sending chain transactions.","code":"pnpm desktop:test-drive","links":[{"label":"Editor testing instructions","href":"https://github.com/keel-web3/keel-sdk/blob/keel-onchain-data/apps/desktop/TESTING.md"}]}]},{"id":"projects","title":"Project workflow","intro":"Keep editable source and independently reusable files separate from the published token presentation.","cards":[{"title":"Create → edit → preview → review","body":"Start an image, GIF, edition, collection, or interactive project. Attach source files and assets, edit metadata and dependencies, then preview the current project. Review the exact selected-chain plan before using a wallet.","bullets":["Files retains original content-addressed bytes and measurements.","Viewing selects the registered verification shell or an explicit creator-owned shell.","Compact compares supported lossless codecs; Raw preserves supplied bytes. This choice is independent of the shell.","Metadata holds titles, descriptions, cover media, and typed traits.","Contracts tracks addresses, ABIs, chain identity, ownership, and release configuration.","Local preview and local preparation do not prove a public-chain deployment."],"links":[{"label":"Storage and prepared COPY","href":"/docs/storage"},{"label":"Publication workflow","href":"/docs/quickstart"}]},{"title":"Workspace persistence and boundaries","body":"Project metadata lives in workspace.sqlite; content-addressed object files retain the original bytes. Local preview runs in a project sandbox with no Node or editor IPC access. Exports exclude credentials and conversation secrets.","facts":[{"label":"State","value":"Local SQLite workspace and content-addressed files"},{"label":"Preview authority","value":"Sandboxed project content; no wallet signing"},{"label":"Publication authority","value":"Creator-reviewed wallet operations and receipts"}],"links":[{"label":"Workspace integration contract","href":"https://github.com/keel-web3/keel-sdk/blob/keel-onchain-data/apps/desktop/AGENT_WORKSPACE.md"}]}]},{"id":"contracts","title":"Track and inspect contracts","intro":"A saved address is a target, not proof of its interface or authority. Inspect on the selected network.","cards":[{"title":"EVM contract inspection","body":"Import an ABI or build artifact, choose the contract network and address, then inspect code, proxy implementation, read methods, overloads, and write preparation. Match the ABI to the deployed implementation. Transaction signing remains a wallet review action.","links":[{"label":"Sepolia addresses","href":"/docs/networks#addresses"},{"label":"Solidity ABI reference","href":"/docs/contracts"}]},{"title":"Native Tezos inspection","body":"Use the Tezos chain identity, KT1 contract, Micheline entrypoints, native storage, and wallet operation details. An Ethereum ABI cannot describe a Tezos contract. Publication dependency placeholders are resolved from confirmed originations.","links":[{"label":"Shadownet entrypoints","href":"/docs/networks#shadownet"},{"label":"Native chain reference","href":"/docs/native-chains"}]}]},{"id":"connection","title":"Connect an external assistant or SDK","intro":"In Setup, choose “Use your assistant from another app” and use the generated workspace-connection.json. The stable descriptor follows Editor socket changes on restart.","cards":[{"title":"MCP configuration","body":"Point KEEL_EDITOR_CONNECTION at the descriptor for the running Editor. The descriptor connects to a local workspace service; do not expose it or the Editor socket as a public service.","code":"export KEEL_EDITOR_CONNECTION=\"/absolute/path/workspace-connection.json\"\n# Start the KEEL MCP server using your configured SDK checkout.\n# Optional advanced override: KEEL_EDITOR_SOCKET=/absolute/path/editor.sock","tables":[{"caption":"Editor MCP tools","columns":["Tool","Behavior"],"rows":[{"cells":["keel-editor-project-list","List local projects."]},{"cells":["keel-editor-project-read","Read project state and revision."]},{"cells":["keel-editor-project-update","Apply an explicit patch with the latest project revision; stale revisions fail."]},{"cells":["keel-editor-project-open","Open the saved project in the Editor."]}]}],"links":[{"label":"MCP workspace contract","href":"https://github.com/keel-web3/keel-sdk/blob/keel-onchain-data/apps/desktop/AGENT_WORKSPACE.md"}]},{"title":"SDK example","body":"Read before updating and pass the returned revision. Never guess a project revision or silently overwrite an intervening creator edit.","code":"import { connectKeelEditor } from '@keel/sdk/editor-client';\n\nconst editor = await connectKeelEditor(connectionFile);\nconst { projects } = await editor.listProjects();\nif (!projects.length) throw new Error('Create a project in the Editor first');\nconst { project, revision } = await editor.readProject(projects[0].id);\nawait editor.updateProject(project.id, revision, { title: 'Revised artwork' });\nawait editor.openProject(project.id);","links":[{"label":"Typed Editor client","href":"https://github.com/keel-web3/keel-sdk/blob/keel-onchain-data/packages/sdk/src/editor-client.ts"}]},{"title":"Import bytes and attach the result","body":"importObject accepts local bytes, filename, media type, and workspace revision. Attach the returned object ID using a project update. Local IPC framing is transport only; it does not choose on-chain encoding or require another stored encoded copy.","code":"const imported = await editor.importObject(\n  bytes, 'texture.png', 'image/png', revision,\n);\n// Use the returned object ID and current revision in the project's attachment patch.","facts":[{"label":"IPC","value":"Local socket / named pipe; structured requests and responses"},{"label":"Message limit","value":"64 MiB per transport message; not a chain storage limit"},{"label":"Request timeout","value":"30 seconds"}],"links":[{"label":"Client implementation","href":"https://github.com/keel-web3/keel-sdk/blob/keel-onchain-data/packages/sdk/src/editor-client.ts"}]}]},{"id":"testing","title":"Tests and publication handoff","intro":"The Editor owns authoring; the selected chain owns the final receipt and public bytes.","cards":[{"title":"Run local acceptance","body":"The Electron smoke test uses a temporary local workspace and simulated fixture. Follow the testing README for prerequisites. Public publication still requires receipt validation, exact read-back, and the final collector viewer.","code":"pnpm desktop:test\npnpm desktop:test:electron","links":[{"label":"Test instructions","href":"https://github.com/keel-web3/keel-sdk/blob/keel-onchain-data/apps/desktop/TESTING.md"},{"label":"Release and receipt checks","href":"/docs/quickstart"},{"label":"Hosted Studio","href":"/docs/studio"}]}]}]},{"slug":"native-chains","navTitle":"EVM & native Tezos","eyebrow":"Chain integration","title":"EVM and native Tezos","summary":"Separate native implementations with explicit network identities, interfaces, wallets, storage, and receipt verification.","thesis":"Shared intent does not make the wire formats interchangeable.","audience":["Developers","Contract integrators"],"related":["contracts","networks","editor"],"sections":[{"id":"identity","title":"Network and contract identity","intro":"Key state by chain family, exact network identity, and contract address. Select the deployment profile explicitly.","cards":[{"title":"EVM","body":"Sepolia uses numeric chain ID 11155111, 0x addresses, Solidity ABI encoding, and Ethereum transaction receipts. Read calls use eth_call at a pinned block; writes require an approved wallet transaction.","links":[{"label":"Sepolia deployment directory","href":"/docs/networks#addresses"},{"label":"Versioned EVM interfaces","href":"/docs/contracts"}]},{"title":"Tezos","body":"Shadownet uses NetXsqzbfFenSTS, KT1 originated contracts, Micheline entrypoints and storage, FA2 ownership, and native operation receipts. Preserve Base58 address casing. Use the native RPC schema, not an Ethereum ABI.","links":[{"label":"Shadownet configuration","href":"/docs/networks#shadownet"}]}]},{"id":"source","title":"Find the native implementation","intro":"Each module reference links directly to its implementation, tests, compilation targets, entrypoints, and views.","cards":[{"title":"Repository layout","body":"Solidity lives in src/modules/<module>/. SmartPy lives in src/modules/<module>/tezos/. Module manifests declare deployable contracts and dependencies. Source coverage, tested behavior, originated addresses, and audited parity are separate records.","code":"src/modules/keel-hold/KeelHold.sol\nsrc/modules/keel-hold/tezos/keel_hold.py\nsrc/modules/keel-hold/tezos/keel_hold_onchfs.py\nmodules/keel-hold/keel.module.json\nmodules/keel-hold/deployments/11155111.json","links":[{"label":"Storage native methods","href":"/docs/module-keel-hold#tezos"},{"label":"Native parity review","href":"https://github.com/Ravonus/keel-contracts/blob/master/docs/TEZOS_PARITY_REVIEW.md"}]}]},{"id":"publication","title":"Native publication and dependency resolution","intro":"Prepare unsigned native operations; confirm each origination and resolve its real dependencies before the next stage.","cards":[{"title":"SDK publication adapter","body":"tezos-publication.ts defines the native publication plan, exact network validation, operation details, object inscriptions, and confirmed dependency resolution. Placeholder addresses are preparation scaffolding, never deployment evidence.","links":[{"label":"Native publication implementation","href":"https://github.com/keel-web3/keel-sdk/blob/keel-onchain-data/packages/sdk/src/tezos-publication.ts"},{"label":"Native module catalog","href":"https://github.com/keel-web3/keel-sdk/blob/keel-onchain-data/packages/sdk/src/tezos-modules.generated.ts"}]},{"title":"Read back after publication","body":"Verify the exact network, confirmed operation, originated address, entrypoint/storage types, object bytes, and decoded digest. Then run the resulting token viewer. A local compile or simulated plan does not establish a deployed native reader.","links":[{"label":"Recorded deployed carrier","href":"/docs/networks#shadownet"},{"label":"Verification evidence","href":"/docs/proof-status"}]}]}]},{"slug":"contracts","navTitle":"Contract reference","eyebrow":"Technical reference","title":"Contract reference","summary":"Versioned Solidity ABIs, native SmartPy entrypoints, deployment records, dependencies, and explorer links for every KEEL module.","thesis":"Versioned Solidity ABIs, native SmartPy entrypoints, deployment records, dependencies, and explorer links for every KEEL module.","audience":["Developers","Integrators"],"sections":[{"id":"index","title":"Module index","intro":"19 modules · 101 deployable ABI references · 2505 Solidity functions. Generated from the committed contracts repository; unrelated working-tree changes are excluded.","cards":[{"title":"Choose the owning module","body":"Start with Hold for bytes; Graph for dependency bindings; Harness for tokenURI assembly; Artifacts for revisions and authority; Die for token ownership; Mint Access for distribution.","links":[{"label":"Anchors · keel-anchors","href":"/docs/module-keel-anchors"},{"label":"Object model · keel-artifacts","href":"/docs/module-keel-artifacts"},{"label":"Codecs · keel-codecs","href":"/docs/module-keel-codecs"},{"label":"Creator identity · keel-creator-identity","href":"/docs/module-keel-creator-identity"},{"label":"Optional cross-chain mint bridge · keel-cross-chain-mint","href":"/docs/module-keel-cross-chain-mint"},{"label":"Collection verification · keel-crucible","href":"/docs/module-keel-crucible"},{"label":"Token base · keel-die","href":"/docs/module-keel-die"},{"label":"Graph trust lattice · keel-graph","href":"/docs/module-keel-graph"},{"label":"On-chain HTML builder · keel-harness","href":"/docs/module-keel-harness"},{"label":"Storage · keel-hold","href":"/docs/module-keel-hold"},{"label":"IP control · keel-ip-control","href":"/docs/module-keel-ip-control"},{"label":"Kernel · keel-kernel","href":"/docs/module-keel-kernel"},{"label":"Market · keel-market","href":"/docs/module-keel-market"},{"label":"Mint access · keel-mint-access","href":"/docs/module-keel-mint-access"},{"label":"Presentation state · keel-presentation","href":"/docs/module-keel-presentation"},{"label":"Publication · keel-publication","href":"/docs/module-keel-publication"},{"label":"Metadata resolver · keel-sleeve","href":"/docs/module-keel-sleeve"},{"label":"Stake objects · keel-stake","href":"/docs/module-keel-stake"},{"label":"web3:// adapter · keel-web3-url","href":"/docs/module-keel-web3-url"}]},{"title":"Reference snapshot","body":"Each module links to its source and tests at this exact revision. ABIs are downloadable. Contract functions include parameter types and names, return values, mutability, events, and custom errors.","facts":[{"label":"Contracts revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"},{"label":"RPC observation","value":"2026-10-08T00:16:22.720223+00:00"},{"label":"Sepolia block","value":"11866511"}],"links":[{"label":"Deployment directory","href":"/docs/networks"},{"label":"Contracts repository","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules"}]}]},{"id":"workflow","title":"Follow a contract call","intro":"Keep object identity, active presentation, token ownership, and wallet authorization separate.","cards":[{"title":"Bytes → graph → presentation → token","body":"castSlug / castSlugs persist storage bytes; weldObject constructs a content-addressed object. Graph and Artifact registries bind dependencies and revision identity. A configured Harness assembles tokenURI. The Die collection exposes ERC-721 or ERC-1155 ownership. Mint Access applies the chosen distribution route.","links":[{"label":"Storage methods","href":"/docs/module-keel-hold#keelhold"},{"label":"Harness methods","href":"/docs/module-keel-harness#keelharnessbuilder"},{"label":"Collection interfaces","href":"/docs/module-keel-die"}]},{"title":"Read an exact target first","body":"Read chain ID and bytecode at a pinned block, then use the ABI matching that deployment. A bytecode observation is not a source-code verification or permission to reuse an unrelated ABI.","code":"import { createPublicClient, http, parseAbi } from 'viem';\nimport { sepolia } from 'viem/chains';\n\nconst client = createPublicClient({ chain: sepolia, transport: http(rpcUrl) });\nif (await client.getChainId() !== 11155111) throw new Error('Wrong network');\nconst blockNumber = await client.getBlockNumber();\nconst address = '0x0a4f31d5ab08029e4c68f6f3227d9fa3a2d66267';\nif (!await client.getCode({ address, blockNumber })) throw new Error('No contract');\nconst manager = await client.readContract({\n  address, blockNumber, abi: parseAbi(['function manager() view returns (address)']),\n  functionName: 'manager',\n});","links":[{"label":"Hold deployment record","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-hold/deployments/11155111.json"}]}]},{"id":"rebuild","title":"Updating this reference","intro":"Regenerate when a manifest, deployment record, or ABI changes. Review the generated diff and run the documentation tests before publishing.","cards":[{"title":"Source of truth","body":"The generator reads committed module manifests and ABIs with git show. A separate read-back snapshot records network, block, code presence, receipt availability, and native entrypoint types. Re-run the RPC snapshot when checking deployments; it is a dated observation, not a perpetual live badge.","code":"python3 apps/studio/scripts/generate-contract-docs.py \\\n  --contracts ../keel-contracts --site . \\\n  --readback apps/studio/src/components/docs/contract-readback.json","links":[{"label":"Editor integration","href":"/docs/editor"},{"label":"SDK workflows","href":"/docs/sdk"}]}]}],"related":["networks","editor","sdk","native-chains"]},{"slug":"networks","navTitle":"Testnets & deployments","eyebrow":"Technical reference","title":"Testnets & deployments","summary":"Ethereum Sepolia and native Tezos Shadownet: chain identity, RPC endpoints, deployed addresses, contract explorer links, and reproducible read-back.","thesis":"Ethereum Sepolia and native Tezos Shadownet: chain identity, RPC endpoints, deployed addresses, contract explorer links, and reproducible read-back.","audience":["Developers","Integrators"],"sections":[{"id":"sepolia","title":"Ethereum Sepolia","intro":"All Ethereum deployment records on this page target chain 11155111. Profiles are intentionally separate; there is no implied mainnet deployment.","cards":[{"title":"Network configuration","body":"Use an RPC endpoint that returns the documented chain ID. Public RPC limits and availability vary; supply your own endpoint for production tooling.","facts":[{"label":"Chain ID","value":"11155111 (0xaa36a7)"},{"label":"Native token","value":"Sepolia ETH"},{"label":"RPC used for observation","value":"https://ethereum-sepolia-rpc.publicnode.com"},{"label":"Observed at","value":"2026-10-08T00:16:22.720223+00:00"},{"label":"Observed block","value":"11866511"}],"links":[{"label":"Sepolia explorer","href":"https://sepolia.etherscan.io"},{"label":"Ethereum network documentation","href":"https://ethereum.org/en/developers/docs/networks/"}]},{"title":"What was checked","body":"All 33 unique recorded addresses returned non-empty bytecode. 11 recorded deployment receipts returned success. Missing historical receipts remain explicitly unconfirmed. These checks establish network/code presence, not ABI equivalence, audits, or current authority.","code":"curl -s \"$RPC_URL\" -H \"Content-Type: application/json\" \\\n  --data '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_chainId\",\"params\":[]}'"}]},{"id":"addresses","title":"Sepolia deployment directory","intro":"Addresses are grouped by their recorded deployment profile. Explorer and transaction links remain available even when a historical receipt is not returned by the read-back RPC.","cards":[{"title":"KeelManager · showcase","body":"Module: keel-artifacts. Redeployed on the post-rename ABI; the superseded address answers the pre-rename selectors.","facts":[{"label":"Address","value":"0x940004faaee674c99b20ca7ecce6f877b996c3e5"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11629033"},{"label":"Code read-back","value":"23889 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x940004faaee674c99b20ca7ecce6f877b996c3e5#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-artifacts/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-artifacts"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x0f0d3bbd3aa1266c13c763235b4fefaf999849ac971c78a9574f7a89b0d8229e"}]},{"title":"KeelManagerProxy · showcase","body":"Module: keel-artifacts. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0x7cb6d62cdd968ba45a8a1f0d99a02e5e274fe6e3"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11476924"},{"label":"Code read-back","value":"130 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x7cb6d62cdd968ba45a8a1f0d99a02e5e274fe6e3#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-artifacts/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-artifacts"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0xd651408d7ec6f222aa5a47655ce34e7f92fd02a92c58bee1f1f69c69d25455c2"}]},{"title":"KeelArtifactRegistry · showcase","body":"Module: keel-artifacts. Redeployed on the post-rename ABI; the superseded address answers the pre-rename selectors.","facts":[{"label":"Address","value":"0xe85884ba2af3932d4f98507668ed5fe8fed6db92"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11629038"},{"label":"Code read-back","value":"10551 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xe85884ba2af3932d4f98507668ed5fe8fed6db92#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-artifacts/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-artifacts"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x235a86349768f288282f939b4decfa211bf45acf691a74dc1490c70ea0037d41"}]},{"title":"KeelHarnessRegistry · showcase","body":"Module: keel-artifacts. Redeployed on the post-rename ABI; the superseded address answers the pre-rename selectors.","facts":[{"label":"Address","value":"0xa5d6ae35c327f998403aa1eb713df3741e3f3136"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11629039"},{"label":"Code read-back","value":"11153 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xa5d6ae35c327f998403aa1eb713df3741e3f3136#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-artifacts/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-artifacts"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0xf7e21d4950805b330a8e11f532695586353ae1c41121efc237daee979bded83f"}]},{"title":"KeelLinkRegistry · showcase","body":"Module: keel-artifacts. Redeployed on the post-rename ABI; the superseded address answers the pre-rename selectors.","facts":[{"label":"Address","value":"0xc2b94319334359171a653c93e402b12b93e24102"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11629040"},{"label":"Code read-back","value":"6457 bytes at block 11866511"},{"label":"Recorded receipt","value":"Confirmed success"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xc2b94319334359171a653c93e402b12b93e24102#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-artifacts/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-artifacts"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x2ede42b1097011f7485c99e85d0eefbd2d69fbe1234d52858bdd8f68e8c42f7e"}]},{"title":"KeelSeedRegistry · showcase","body":"Module: keel-artifacts. Redeployed on the post-rename ABI; the superseded address answers the pre-rename selectors.","facts":[{"label":"Address","value":"0xf6b301e56c813692aeb75b9659864c7e76cf4c8b"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11629041"},{"label":"Code read-back","value":"4305 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xf6b301e56c813692aeb75b9659864c7e76cf4c8b#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-artifacts/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-artifacts"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0xc44f7d534294cf1f47c46c9751fa56f007fff6ee09b06080918f20e2a302e672"}]},{"title":"KeelCreatorProfileRegistry · showcase","body":"Module: keel-creator-identity. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0xa4112eda52ca519adaeebee7c12c4770594529fa"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11476926"},{"label":"Code read-back","value":"5932 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xa4112eda52ca519adaeebee7c12c4770594529fa#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-creator-identity/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-creator-identity"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x09edbc01e0f41681c211e2781d54ba5f8a7931ea14224bb730b24773365c51a6"}]},{"title":"KeelCommunityReplicationRegistry · showcase","body":"Module: keel-crucible. Redeployed on the post-rename ABI; the superseded address answers the pre-rename selectors.","facts":[{"label":"Address","value":"0xe8a4618e7327c75631afcdd2ff7b0f4a73d42595"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11629043"},{"label":"Code read-back","value":"21879 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xe8a4618e7327c75631afcdd2ff7b0f4a73d42595#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-crucible/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-crucible"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x10993ef95265d08e7beabc0c88584f2963ddc3a021c6c4e25a50c847277d8717"}]},{"title":"KeelFactory · showcase","body":"Module: keel-die. Redeployed on the post-rename ABI; the superseded address answers the pre-rename selectors.","facts":[{"label":"Address","value":"0x8839dab4505128378947aa2f75a0556554043ce6"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11629044"},{"label":"Code read-back","value":"4652 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x8839dab4505128378947aa2f75a0556554043ce6#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-die/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-die"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0xba468375724a1f02bc2baec26da7a57592c89dd16e734ae7d2fc7ced562671cd"}]},{"title":"KEEL721 · showcase","body":"Module: keel-die. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0x71B25649E8A27992494eDAD355497c0Bea50A8e0"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11476935"},{"label":"Code read-back","value":"20317 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x71B25649E8A27992494eDAD355497c0Bea50A8e0#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-die/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-die"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x77739909a00b20931c21517d1594dbe386ad94ce0fdced4f6321aec16db03bde"}]},{"title":"KeelGraphRegistry · showcase","body":"Module: keel-graph. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0x5b86439598d2091bf45971c3676eb25c5d64dca4"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11476949"},{"label":"Code read-back","value":"5822 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x5b86439598d2091bf45971c3676eb25c5d64dca4#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-graph/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-graph"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x894cb84bf69f040db859ad9dd018c7fb62059282015e384422f6c73114ef2a72"}]},{"title":"KeelPluginRegistry · showcase","body":"Module: keel-graph. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0xb7a4f9d0ef9d81ab4190d847e804e27c1ea820fd"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11476951"},{"label":"Code read-back","value":"7861 bytes at block 11866511"},{"label":"Recorded receipt","value":"Confirmed success"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xb7a4f9d0ef9d81ab4190d847e804e27c1ea820fd#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-graph/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-graph"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x555896b004c2cf657d46ba545436dfaa7e3ea30b5ffaa06b8dd15b034ea6730f"}]},{"title":"KeelModuleReviewRegistry · trusted-runtime","body":"Module: keel-graph. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0x9abb1f929a05e0ddf558aa9f594ec7775e28f8b2"},{"label":"Profile","value":"trusted-runtime"},{"label":"Recorded block","value":"Not recorded"},{"label":"Code read-back","value":"5772 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not recorded"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x9abb1f929a05e0ddf558aa9f594ec7775e28f8b2#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-graph/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-graph"}]},{"title":"KeelGraphRegistry · trusted-runtime","body":"Module: keel-graph. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0x5b86439598d2091bf45971c3676eb25c5d64dca4"},{"label":"Profile","value":"trusted-runtime"},{"label":"Recorded block","value":"Not recorded"},{"label":"Code read-back","value":"5822 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not recorded"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x5b86439598d2091bf45971c3676eb25c5d64dca4#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-graph/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-graph"}]},{"title":"KeelHarnessBuilder · showcase","body":"Module: keel-harness. The inline route lives here: harnessDataURI, registeredPreEncodedTokenURI and the five-argument setShell. This module had no deployments record at all until now, which is why the on-chain shell route was undiscoverable and agents kept manufacturing a replacement.","facts":[{"label":"Address","value":"0x7ac86609d6781e896c541210fdd8d1d919c5584a"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11631488"},{"label":"Code read-back","value":"24200 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x7ac86609d6781e896c541210fdd8d1d919c5584a#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-harness/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-harness"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x822a9256583393e43a4fbca24adbc5bf8ba8f5611ae889fcdb08ae46f4a7e2d6"}]},{"title":"KeelHold · showcase","body":"Module: keel-hold. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0x0a4f31d5ab08029e4c68f6f3227d9fa3a2d66267"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11559677"},{"label":"Code read-back","value":"6922 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x0a4f31d5ab08029e4c68f6f3227d9fa3a2d66267#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-hold/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-hold"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0xae9e37ce8705258f4395498747e03682207d3a4e04e23e734086fedd01d404ef"}]},{"title":"KeelIndex · showcase","body":"Module: keel-hold. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0x2b706ded15fb27a582da256321f2b3295413b8ac"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11559678"},{"label":"Code read-back","value":"8487 bytes at block 11866511"},{"label":"Recorded receipt","value":"Confirmed success"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x2b706ded15fb27a582da256321f2b3295413b8ac#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-hold/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-hold"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x93bdfd7694deb532a01aee4092020b8aad25a1720317d609949ab68166e944fc"}]},{"title":"KeelIPControl · ip-v1","body":"Module: keel-ip-control. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0x9f62Aec9E1bd5117864C6A19a7FC8C4e51F39aD0"},{"label":"Profile","value":"ip-v1"},{"label":"Recorded block","value":"11491416"},{"label":"Code read-back","value":"17731 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x9f62Aec9E1bd5117864C6A19a7FC8C4e51F39aD0#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-ip-control/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-ip-control"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x924da433760a9ecbfbf1d146a328c065bdf04960d8133c13401763f82293113d"}]},{"title":"KeelIPActionExecutor · ip-v1","body":"Module: keel-ip-control. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0x82548953d1a8baba9f4902844877FFA747ff243D"},{"label":"Profile","value":"ip-v1"},{"label":"Recorded block","value":"11491417"},{"label":"Code read-back","value":"6007 bytes at block 11866511"},{"label":"Recorded receipt","value":"Confirmed success"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x82548953d1a8baba9f4902844877FFA747ff243D#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-ip-control/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-ip-control"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0xf5fcae22f51b8f381ef67c80b4f6f399e3c176936e45ba36813f49aaad8e3347"}]},{"title":"KeelIPWrapped721 · ip-v1","body":"Module: keel-ip-control. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0xD6290b9777B1Be895719e32900552107aADD674c"},{"label":"Profile","value":"ip-v1"},{"label":"Recorded block","value":"11491418"},{"label":"Code read-back","value":"4586 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xD6290b9777B1Be895719e32900552107aADD674c#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-ip-control/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-ip-control"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x8d2653dcc830a8a400ac5c6cd10d543d3d289fc3e1a1c34701c76e79f009888d"}]},{"title":"KeelIPControl · showcase","body":"Module: keel-ip-control. Redeployed on the post-rename ABI; the superseded address answers the pre-rename selectors.","facts":[{"label":"Address","value":"0x1b982718504aef51423f20856b79c62378cb62eb"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11629049"},{"label":"Code read-back","value":"17583 bytes at block 11866511"},{"label":"Recorded receipt","value":"Confirmed success"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x1b982718504aef51423f20856b79c62378cb62eb#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-ip-control/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-ip-control"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x6372164607cc4ac7322669f4938909cc34821ffc04c357cb808e51c008d6ba50"}]},{"title":"KeelMarket · showcase","body":"Module: keel-market. Redeployed on the post-rename ABI; the superseded address answers the pre-rename selectors.","facts":[{"label":"Address","value":"0x4f9c6ea07aed067c3f04d798bf22a1e6c5c524a8"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11629048"},{"label":"Code read-back","value":"12998 bytes at block 11866511"},{"label":"Recorded receipt","value":"Confirmed success"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x4f9c6ea07aed067c3f04d798bf22a1e6c5c524a8#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-market/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-market"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x58e89f90f505e167890dba648ede9e1811083a7fd7461dafa3abc2e5fd93c0ac"}]},{"title":"KeelMintGate · showcase","body":"Module: keel-mint-access. Redeployed on the post-rename ABI; the superseded address answers the pre-rename selectors.","facts":[{"label":"Address","value":"0x9f21416da06edddb7f21a70bcbc91cd732803262"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11629047"},{"label":"Code read-back","value":"17378 bytes at block 11866511"},{"label":"Recorded receipt","value":"Confirmed success"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x9f21416da06edddb7f21a70bcbc91cd732803262#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-mint-access/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-mint-access"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x8ed484bcf0319f0ecf56a3b727f0b8d7f6562d10ec81dc93bdd4fc924ea5b62f"}]},{"title":"OneMintController · showcase","body":"Module: keel-mint-access. Redeployed on the post-rename ABI; the superseded address answers the pre-rename selectors.","facts":[{"label":"Address","value":"0xc5a82b8320b6ad23cda749f079e3d7ad7b45cec9"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11629046"},{"label":"Code read-back","value":"21900 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xc5a82b8320b6ad23cda749f079e3d7ad7b45cec9#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-mint-access/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-mint-access"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0xb261303956960015186934bf8ca1131ed4f1284d3f771621897cfd4c34e5f867"}]},{"title":"KeelMintRouteRegistry · showcase","body":"Module: keel-mint-access. Redeployed on the post-rename ABI; the superseded address answers the pre-rename selectors.","facts":[{"label":"Address","value":"0x4dcc1132decf43ce72bbfad6f3ae109e85196fde"},{"label":"Profile","value":"showcase"},{"label":"Recorded block","value":"11629045"},{"label":"Code read-back","value":"9365 bytes at block 11866511"},{"label":"Recorded receipt","value":"Confirmed success"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x4dcc1132decf43ce72bbfad6f3ae109e85196fde#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-mint-access/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-mint-access"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0xa2dd281009ab971aa62c2cd5fc58f09059075fb7615ad04c8273a2c469fb792f"}]},{"title":"KeelMintRouteRegistry · creator-inline-20261005","body":"Module: keel-mint-access. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0xB3CD12cEf903B889Bc6C500726411d4c04f62bC1"},{"label":"Profile","value":"creator-inline-20261005"},{"label":"Recorded block","value":"11852705"},{"label":"Code read-back","value":"24164 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not returned by this RPC"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xB3CD12cEf903B889Bc6C500726411d4c04f62bC1#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-mint-access/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-mint-access"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x420dc8294b5a9243d6aae643e1a9c8eb671981949cc07a157226f2b7c13013ac"}]},{"title":"KeelMintRouteRegistry · studio-audience-checkout-20261006","body":"Module: keel-mint-access. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0x96Cef44bDd8647F42c66d1B82e69334a9b4aDcB3"},{"label":"Profile","value":"studio-audience-checkout-20261006"},{"label":"Recorded block","value":"11860361"},{"label":"Code read-back","value":"24164 bytes at block 11866511"},{"label":"Recorded receipt","value":"Confirmed success"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x96Cef44bDd8647F42c66d1B82e69334a9b4aDcB3#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-mint-access/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-mint-access"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x73b06797679e78d74eacf3c25dd50b2e25965256a414ee5e4c049c09a63e1d4c"}]},{"title":"KeelOneMintBatch · studio-audience-checkout-20261006","body":"Module: keel-mint-access. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0xF3F919f9841eAcd166E49EBc42660e1F48491018"},{"label":"Profile","value":"studio-audience-checkout-20261006"},{"label":"Recorded block","value":"11860363"},{"label":"Code read-back","value":"21930 bytes at block 11866511"},{"label":"Recorded receipt","value":"Confirmed success"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xF3F919f9841eAcd166E49EBc42660e1F48491018#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-mint-access/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-mint-access"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x2b353f0a5c17e5f55a86a661cd71287bf0148bc45e92357977936676f4564d95"}]},{"title":"OpenOneMintController · studio-audience-checkout-20261006","body":"Module: keel-mint-access. Recorded deployment; inspect the selected profile and matching implementation before using its ABI.","facts":[{"label":"Address","value":"0xEF3306378895a9B49ed16416A8fCb767E79b8595"},{"label":"Profile","value":"studio-audience-checkout-20261006"},{"label":"Recorded block","value":"11860365"},{"label":"Code read-back","value":"22934 bytes at block 11866511"},{"label":"Recorded receipt","value":"Confirmed success"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xEF3306378895a9B49ed16416A8fCb767E79b8595#code"},{"label":"Deployment manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-mint-access/deployments/11155111.json"},{"label":"Module reference","href":"/docs/module-keel-mint-access"},{"label":"Recorded deployment transaction","href":"https://sepolia.etherscan.io/tx/0x653fc27e4b519864ba76db379fa6beef5fb17bfe4a8c9869395a3fd47671d894"}]},{"title":"KeelHold · studio-runtime-20261007","body":"Module: keel-hold. Selected address captured from the active Studio runtime public deployment record. It may use an earlier interface than the source ABI reference.","facts":[{"label":"Address","value":"0x0a4f31d5ab08029e4c68f6f3227d9fa3a2d66267"},{"label":"Profile","value":"studio-runtime-20261007"},{"label":"Recorded block","value":"Not recorded"},{"label":"Code read-back","value":"6922 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not recorded"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x0a4f31d5ab08029e4c68f6f3227d9fa3a2d66267#code"},{"label":"Deployment manifest","href":"/docs/deployments/studio-sepolia.json"},{"label":"Module reference","href":"/docs/module-keel-hold"}]},{"title":"KeelHarnessBuilder · studio-runtime-20261007","body":"Module: keel-harness. Selected address captured from the active Studio runtime public deployment record. It may use an earlier interface than the source ABI reference.","facts":[{"label":"Address","value":"0x63a172ae55a6c7413a2f80be9de9cd9cb106973d"},{"label":"Profile","value":"studio-runtime-20261007"},{"label":"Recorded block","value":"Not recorded"},{"label":"Code read-back","value":"24458 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not recorded"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x63a172ae55a6c7413a2f80be9de9cd9cb106973d#code"},{"label":"Deployment manifest","href":"/docs/deployments/studio-sepolia.json"},{"label":"Module reference","href":"/docs/module-keel-harness"}]},{"title":"KeelIndex · studio-runtime-20261007","body":"Module: keel-hold. Selected address captured from the active Studio runtime public deployment record. It may use an earlier interface than the source ABI reference.","facts":[{"label":"Address","value":"0x2b706ded15fb27a582da256321f2b3295413b8ac"},{"label":"Profile","value":"studio-runtime-20261007"},{"label":"Recorded block","value":"Not recorded"},{"label":"Code read-back","value":"8487 bytes at block 11866511"},{"label":"Recorded receipt","value":"Confirmed success"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x2b706ded15fb27a582da256321f2b3295413b8ac#code"},{"label":"Deployment manifest","href":"/docs/deployments/studio-sepolia.json"},{"label":"Module reference","href":"/docs/module-keel-hold"}]},{"title":"OneMintController · studio-runtime-20261007","body":"Module: keel-mint-access. Selected address captured from the active Studio runtime public deployment record. It may use an earlier interface than the source ABI reference.","facts":[{"label":"Address","value":"0x3b11713b690c50a8ce94ab89a02b904950f0432a"},{"label":"Profile","value":"studio-runtime-20261007"},{"label":"Recorded block","value":"Not recorded"},{"label":"Code read-back","value":"18695 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not recorded"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x3b11713b690c50a8ce94ab89a02b904950f0432a#code"},{"label":"Deployment manifest","href":"/docs/deployments/studio-sepolia.json"},{"label":"Module reference","href":"/docs/module-keel-mint-access"}]},{"title":"KeelFactory · studio-runtime-20261007","body":"Module: keel-die. Selected address captured from the active Studio runtime public deployment record. It may use an earlier interface than the source ABI reference.","facts":[{"label":"Address","value":"0xe7f47a76d2887d0a54f7c40dcf7ffcc69e6f22be"},{"label":"Profile","value":"studio-runtime-20261007"},{"label":"Recorded block","value":"Not recorded"},{"label":"Code read-back","value":"4652 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not recorded"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0xe7f47a76d2887d0a54f7c40dcf7ffcc69e6f22be#code"},{"label":"Deployment manifest","href":"/docs/deployments/studio-sepolia.json"},{"label":"Module reference","href":"/docs/module-keel-die"}]},{"title":"KeelPublicationJob · studio-runtime-20261007","body":"Module: keel-publication. Selected address captured from the active Studio runtime public deployment record. It may use an earlier interface than the source ABI reference.","facts":[{"label":"Address","value":"0x93f8bb414f22d5df29db6d67b78224d69453a094"},{"label":"Profile","value":"studio-runtime-20261007"},{"label":"Recorded block","value":"Not recorded"},{"label":"Code read-back","value":"5851 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not recorded"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x93f8bb414f22d5df29db6d67b78224d69453a094#code"},{"label":"Deployment manifest","href":"/docs/deployments/studio-sepolia.json"},{"label":"Module reference","href":"/docs/module-keel-publication"}]},{"title":"KeelCompactBuilder (legacy target) · studio-runtime-20261007","body":"Module: keel-harness. Selected address captured from the active Studio runtime public deployment record. It may use an earlier interface than the source ABI reference.","facts":[{"label":"Address","value":"0x39916079bf2cf26edf0c8610aebd33dd8c2b0e2e"},{"label":"Profile","value":"studio-runtime-20261007"},{"label":"Recorded block","value":"Not recorded"},{"label":"Code read-back","value":"7761 bytes at block 11866511"},{"label":"Recorded receipt","value":"Not recorded"}],"links":[{"label":"Explorer / contract","href":"https://sepolia.etherscan.io/address/0x39916079bf2cf26edf0c8610aebd33dd8c2b0e2e#code"},{"label":"Deployment manifest","href":"/docs/deployments/studio-sepolia.json"},{"label":"Module reference","href":"/docs/module-keel-harness"}]}]},{"id":"shadownet","title":"Tezos Shadownet","intro":"Native Tezos uses KT1 contracts, Micheline parameters, FA2/TZIP metadata, Tezos wallet operations, and native receipts. It does not use EVM addresses or ERC ABI calls.","cards":[{"title":"Network configuration","body":"Shadownet is Tezos’s long-running test network. This RPC returned the exact native chain identity below during read-back.","facts":[{"label":"Chain identity","value":"NetXsqzbfFenSTS"},{"label":"RPC","value":"https://rpc.shadownet.teztnets.com"},{"label":"Native token","value":"Test tez"},{"label":"Observed level","value":"5399320"}],"links":[{"label":"Official Shadownet documentation","href":"https://teztnets.com/shadownet-about"},{"label":"Test tez faucet","href":"https://faucet.shadownet.teztnets.com/"},{"label":"Shadownet explorer","href":"https://shadownet.tzkt.io"}]},{"title":"Deployed OnchFS carrier","body":"This carrier is recorded by the SDK showcase release. Its native RPC entrypoints were returned during this observation. KEEL’s additional native SmartPy ports have source and tests; they are not all declared deployed here.","facts":[{"label":"Carrier address","value":"KT1WGYJVUzsoxrhUvYbSiEgciirPXkvW5TsL"}],"links":[{"label":"Carrier explorer","href":"https://shadownet.tzkt.io/KT1WGYJVUzsoxrhUvYbSiEgciirPXkvW5TsL"},{"label":"Live native entrypoint schema","href":"https://rpc.shadownet.teztnets.com/chains/main/blocks/head/context/contracts/KT1WGYJVUzsoxrhUvYbSiEgciirPXkvW5TsL/entrypoints"},{"label":"SDK release record","href":"https://github.com/keel-web3/keel-sdk/blob/keel-onchain-data/docs/KEEL_SHOWCASE_RELEASE.md"}],"tables":[{"columns":["Entrypoint","Micheline parameter type"],"rows":[{"cells":["write_chunk","{\"prim\":\"bytes\"}"]},{"cells":["create_file","{\"prim\":\"pair\",\"args\":[{\"prim\":\"list\",\"args\":[{\"prim\":\"bytes\"}],\"annots\":[\"%chunk_pointers\"]},{\"prim\":\"bytes\",\"annots\":[\"%metadata\"]}]}"]},{"cells":["create_directory","{\"prim\":\"map\",\"args\":[{\"prim\":\"string\"},{\"prim\":\"bytes\"}]}"]},{"cells":["bind_stratus_object","{\"prim\":\"pair\",\"args\":[{\"prim\":\"bytes\",\"annots\":[\"%compression\"]},{\"prim\":\"pair\",\"args\":[{\"prim\":\"nat\",\"annots\":[\"%decoded_byte_length\"]},{\"prim\":\"pair\",\"args\":[{\"prim\":\"bytes\",\"annots\":[\"%decoded_sha256\"]},{\"prim\":\"pair\",\"args\":[{\"prim\":\"bytes\",\"annots\":[\"%file_cid\"]},{\"prim\":\"pair\",\"args\":[{\"prim\":\"bytes\",\"annots\":[\"%manifest\"]},{\"prim\":\"pair\",\"args\":[{\"prim\":\"bytes\",\"annots\":[\"%manifest_sha256\"]},{\"prim\":\"pair\",\"args\":[{\"prim\":\"bytes\",\"annots\":[\"%media_type\"]},{\"prim\":\"pair\",\"args\":[{\"prim\":\"bytes\",\"annots\":[\"%object_id\"]},{\"prim\":\"pair\",\"args\":[{\"prim\":\"nat\",\"annots\":[\"%stored_byte_length\"]},{\"prim\":\"bytes\",\"annots\":[\"%stored_sha256\"]}]}]}]}]}]}]}]}]}]}"]}],"caption":"Deployed native interface","collapsed":false}],"code":"curl -s https://rpc.shadownet.teztnets.com/chains/main/chain_id\n\ncurl -s https://rpc.shadownet.teztnets.com/chains/main/blocks/head/context/contracts/KT1WGYJVUzsoxrhUvYbSiEgciirPXkvW5TsL/entrypoints"},{"title":"Port coverage","body":"Open any module’s Native Tezos section for its SmartPy contracts, entrypoints, views, compiler targets, and tests. Originate and read back the selected native target before claiming deployment or parity.","links":[{"label":"Native chain workflow","href":"/docs/native-chains"},{"label":"Hold native source","href":"/docs/module-keel-hold#tezos"}]}]}],"related":["contracts","native-chains","editor"]},{"slug":"module-keel-anchors","navTitle":"Anchors (keel-anchors)","eyebrow":"Technical reference","title":"Anchors (keel-anchors)","summary":"Cross-chain and off-chain anchoring: portable commitments, permissionless L2 state proofs, and zk verification backends.","thesis":"Cross-chain and off-chain anchoring: portable commitments, permissionless L2 state proofs, and zk verification backends.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Cross-chain and off-chain anchoring: portable commitments, permissionless L2 state proofs, and zk verification backends.","cards":[{"title":"keel-anchors","body":"Cross-chain and off-chain anchoring: portable commitments, permissionless L2 state proofs, and zk verification backends.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-kernel, keel-codecs, keel-artifacts, keel-graph, keel-hold"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-anchors/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-anchors"}]}]},{"id":"keelproofupgradecontroller","title":"KeelProofUpgradeController","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelProofUpgradeController","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelProofUpgradeController.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelProofUpgradeController.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["EXECUTION_WINDOW()","uint64","view"]},{"cells":["REVIEW_DELAY()","uint64","view"]},{"cells":["activate(bytes32 id)","—","nonpayable"]},{"cells":["approve(bytes32 id)","—","nonpayable"]},{"cells":["cancel(bytes32 id)","—","nonpayable"]},{"cells":["isAdmitted(bytes32 id, address adapter, uint8 family, uint32 network)","bool","view"]},{"cells":["manager()","address","view"]},{"cells":["profileId((uint8,uint32,address,bytes32,bytes32,bytes32) profile)","bytes32","view"]},{"cells":["proposal(bytes32 id)","(bool,bool,uint64,uint64,uint64,address,(uint8,uint32,address,bytes32,bytes32,bytes32))","view"]},{"cells":["propose((uint8,uint32,address,bytes32,bytes32,bytes32) profile, string manifestURI)","bytes32 id","nonpayable"]},{"cells":["recommended(bytes32 route)","bytes32","view"]},{"cells":["routeId(uint8 family, uint32 network)","bytes32","pure"]},{"cells":["suspend(bytes32 id)","—","nonpayable"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["Activated(bytes32 indexed id, bytes32 indexed route)"]},{"cells":["Approved(uint64 readyAt, uint64 expiresAt, bytes32 indexed id)"]},{"cells":["Cancelled(bytes32 indexed id)"]},{"cells":["Proposed(bytes32 indexed id, address indexed proposer, (uint8,uint32,address,bytes32,bytes32,bytes32) profile, string manifestURI)"]},{"cells":["Suspended(bytes32 indexed id)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CodeChanged()"]},{"cells":["DuplicateProfile()"]},{"cells":["InvalidProfile()"]},{"cells":["InvalidState()"]},{"cells":["NotReady()"]},{"cells":["Unauthorized()"]},{"cells":["UnknownProfile()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address manager_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelanchorreplicationbridge","title":"KeelAnchorReplicationBridge","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelAnchorReplicationBridge","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelAnchorReplicationBridge.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelAnchorReplicationBridge.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ANCHOR_STATUS_VERIFIED()","uint8","view"]},{"cells":["CARRIER_ORDINALS()","uint8","view"]},{"cells":["CARRIER_TEZOS()","uint8","view"]},{"cells":["FAMILY_BITCOIN()","uint8","view"]},{"cells":["FAMILY_TEZOS()","uint8","view"]},{"cells":["NETWORK_BITCOIN_MAINNET()","uint32","view"]},{"cells":["NETWORK_TEZOS_MAINNET()","uint32","view"]},{"cells":["PROOF_STATUS_PENDING()","uint8","view"]},{"cells":["anchorRegistry()","address","view"]},{"cells":["applyVerifiedAnchor(address replicationRegistry_, bytes32 campaignId, uint8 carrier, bytes32 anchorId)","—","nonpayable"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["CarrierProofBridged(bytes32 indexed campaignId, uint8 indexed carrier, bytes32 indexed anchorId, address caller)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AnchorNotVerified()"]},{"cells":["CampaignMismatch()"]},{"cells":["CampaignMissing()"]},{"cells":["InvalidContract()"]},{"cells":["LocatorMismatch()"]},{"cells":["ProofNotPending()"]},{"cells":["UnsupportedCarrier()"]},{"cells":["WrongSourceNetwork()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address anchorRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelattestedanchorregistry","title":"KeelAttestedAnchorRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelAttestedAnchorRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelAttestedAnchorRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelAttestedAnchorRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ANCHOR_CLAIM_LEASE()","uint64","view"]},{"cells":["ANCHOR_DOMAIN()","bytes","view"]},{"cells":["ANCHOR_POLICY_RESTRICT_FLAG()","uint256","view"]},{"cells":["ATTESTED_ANCHOR_DOMAIN()","bytes32","view"]},{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["DIGEST_ALGORITHM_SHA256()","uint8","view"]},{"cells":["DIGEST_KIND_CHUNK_KECCAK256()","uint8","view"]},{"cells":["DIGEST_KIND_DECODED_SHA256()","uint8","view"]},{"cells":["EMISSION_SCALE()","uint256","view"]},{"cells":["MAX_ANCHOR_TASKS()","uint256","view"]},{"cells":["MAX_FAMILY_LABEL_BYTES()","uint256","view"]},{"cells":["MAX_LOCATOR_BYTES()","uint256","view"]},{"cells":["NATIVE_EVENT_DOMAIN()","bytes32","view"]},{"cells":["NATIVE_VERIFIER_ID()","bytes32","view"]},{"cells":["PLUGIN_ID_VALUE()","bytes32","view"]},{"cells":["PLUGIN_PROTOCOL_VALUE()","bytes32","view"]},{"cells":["SOURCE_FAMILY_BITCOIN()","uint8","view"]},{"cells":["SOURCE_FAMILY_ETHEREUM()","uint8","view"]},{"cells":["SOURCE_FAMILY_TEZOS()","uint8","view"]},{"cells":["TRUST_CLASS_ATTESTED()","uint8","view"]},{"cells":["TRUST_CLASS_CLIENT()","uint8","view"]},{"cells":["TRUST_CLASS_NATIVE()","uint8","view"]},{"cells":["TRUST_CLASS_OPTIMISTIC()","uint8","view"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["anchorByRoot(bytes32 anchorRoot)","bytes32","view"]},{"cells":["anchorState(bytes32 anchorId)","(bytes32,uint64,(uint8,uint32,bytes32,bytes32,uint64,bytes32),bytes32,bytes32,bytes32,address,address,uint32,uint32,uint64,uint64,uint64,uint64,uint8)","view"]},{"cells":["anchorSummary(bytes32 anchorId)","uint8 status, bytes32 objectId, uint64 artifactRevision, uint8 sourceFamily, uint32 sourceNetwork, bytes32 anchorRoot, address contributor, uint32 taskCount","view"]},{"cells":["anchorTask(bytes32 anchorId, uint32 taskIndex)","(bytes32,bytes32,uint8,uint64,uint64,uint8,string)","view"]},{"cells":["anchorVerificationContext(bytes32 anchorId, uint32 taskIndex)","uint8 anchorStatus, uint64 nonce, address verifierAdapter, address contributor, uint8 sourceFamily, uint32 sourceNetwork, uint8 taskStatus, uint8 digestKind, bytes32 expectedDigest, string locator","view"]},{"cells":["anchorVerifier(bytes32 verifierId)","(address,uint256,bytes32,uint8,uint64,uint64,bool,bool)","view"]},{"cells":["artifactRegistry()","address","view"]},{"cells":["cancelAnchor(bytes32 anchorId)","—","nonpayable"]},{"cells":["chainFamily(uint8 familyId)","(string,string,uint64,bool,bool)","view"]},{"cells":["computeAnchorRoot(bytes32 portableRoot, uint8 sourceFamily, uint32 sourceNetwork, bytes32 sourceRegistry, bytes32 sourceObjectKey, uint64 sourceRevision, bytes32 sourceEventDigest)","bytes32","pure"]},{"cells":["contributorStats(address contributor)","(uint128,uint64,uint64,uint256)","view"]},{"cells":["driveAnchor(bytes32 objectId, uint64 artifactRevision, (uint8,uint32,bytes32,bytes32,uint64,bytes32) source, bytes32 verifierId, string[] locators, bytes32[] slugIds)","bytes32 anchorId","nonpayable"]},{"cells":["effectiveEmission(uint8 familyId, uint32 network)","(uint128,uint64,uint56,bool) rate","view"]},{"cells":["familyEmission(uint8 familyId)","(uint128,uint64,uint56,bool)","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["grip(bytes32 objectId)","uint256","view"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["isChainAnchored(bytes32 objectId, uint64 artifactRevision, uint8 family, uint32 network)","bool","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["networkAnchor(bytes32 objectId, uint64 artifactRevision, uint8 family, uint32 network)","bytes32","view"]},{"cells":["networkEmission(uint8 familyId, uint32 network)","(uint128,uint64,uint56,bool)","view"]},{"cells":["objectAnchorFamilyAllowed(bytes32 objectId, uint8 family)","bool","view"]},{"cells":["objectAnchorPolicy(bytes32 objectId)","uint256","view"]},{"cells":["objectAnchorStamp(bytes32 objectId, uint64 artifactRevision)","uint8 nativeStatus, bytes32 nativeAnchorRoot, uint256 attestedFamilyMask, bool frozen","view"]},{"cells":["objectAnchoredChainAt(bytes32 objectId, uint256 index)","(uint8,uint32,uint64,bytes32,bytes32)","view"]},{"cells":["objectAnchoredChains(bytes32 objectId)","(uint8,uint32,uint64,bytes32,bytes32)[]","view"]},{"cells":["objectAttestedFamilyMask(bytes32 objectId)","uint256","view"]},{"cells":["objectChainAnchored(bytes32 objectId, uint8 family, uint32 network)","bool","view"]},{"cells":["objectFamilyAnchored(bytes32 objectId, uint8 family)","bool","view"]},{"cells":["pluginId()","bytes32","pure"]},{"cells":["pluginProtocol()","bytes32","pure"]},{"cells":["pluginVersion()","uint64","pure"]},{"cells":["predictAnchorId(bytes32 objectId, uint64 artifactRevision, (uint8,uint32,bytes32,bytes32,uint64,bytes32) source)","bytes32","view"]},{"cells":["registerChainFamily(uint8 familyId, string name, string locatorScheme)","—","nonpayable"]},{"cells":["registerVerifier(bytes32 verifierId, address adapter, uint256 familyMask, uint8 trustClass, uint64 version, bytes32 specDigest)","—","nonpayable"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["retireChainFamily(uint8 familyId)","—","nonpayable"]},{"cells":["retireVerifier(bytes32 verifierId)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["setAnchor(bytes32 anchorId)","—","nonpayable"]},{"cells":["setFamilyEmission(uint8 familyId, uint128 perByteMilli, uint64 perTaskBonus, uint56 perAnchorBonus)","—","nonpayable"]},{"cells":["setNetworkEmission(uint8 familyId, uint32 network, uint128 perByteMilli, uint64 perTaskBonus, uint56 perAnchorBonus)","—","nonpayable"]},{"cells":["setObjectAnchorPolicy(bytes32 objectId, uint256 policy)","—","nonpayable"]},{"cells":["stampNative(bytes32 objectId, uint64 artifactRevision)","bytes32 anchorId","nonpayable"]},{"cells":["submitTaskResult(bytes32 anchorId, uint64 nonce, uint32 taskIndex, bytes32 verifiedDigest, uint64 verifiedByteLength, bool verified)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AnchorCancelled(bytes32 indexed anchorId, uint64 nonce)"]},{"cells":["AnchorDriven(bytes32 indexed anchorId, bytes32 indexed objectId, uint8 indexed sourceFamily, uint64 artifactRevision, uint32 sourceNetwork, bytes32 sourceRegistry, bytes32 sourceObjectKey, uint64 sourceRevision, bytes32 verifierId, address contributor, uint32 taskCount, uint64 nonce)"]},{"cells":["AnchorEmissionCredited(bytes32 indexed anchorId, address indexed contributor, uint256 emission)"]},{"cells":["AnchorRejected(bytes32 indexed anchorId, uint64 nonce)"]},{"cells":["AnchorTaskOpened(bytes32 indexed anchorId, uint32 taskIndex, bytes32 expectedDigest, uint8 digestKind, string locator)"]},{"cells":["AnchorTaskRejected(bytes32 indexed anchorId, uint32 taskIndex, bytes32 reportedDigest)"]},{"cells":["AnchorTaskVerified(bytes32 indexed anchorId, uint32 taskIndex, bytes32 verifiedDigest, uint64 byteLength)"]},{"cells":["AnchorVerified(bytes32 indexed anchorId, bytes32 indexed anchorRoot, bytes32 indexed objectId, uint64 artifactRevision, uint8 sourceFamily, uint32 sourceNetwork, address contributor)"]},{"cells":["AnchorVerifierRegistered(bytes32 indexed verifierId, address indexed adapter, uint256 familyMask, uint8 trustClass, uint64 version, bytes32 specDigest)"]},{"cells":["AnchorVerifierRetired(bytes32 indexed verifierId)"]},{"cells":["ChainFamilyRegistered(uint8 indexed familyId, string name, string locatorScheme)"]},{"cells":["ChainFamilyRetired(uint8 indexed familyId)"]},{"cells":["FamilyEmissionSet(uint8 indexed familyId, uint128 perByteMilli, uint64 perTaskBonus, uint56 perAnchorBonus)"]},{"cells":["NetworkEmissionSet(uint8 indexed familyId, uint32 indexed network, uint128 perByteMilli, uint64 perTaskBonus, uint56 perAnchorBonus)"]},{"cells":["ObjectAnchorPolicySet(bytes32 indexed objectId, uint256 policy, address setter)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["AnchorActive()"]},{"cells":["AnchorMissing()"]},{"cells":["AnchorNotPending()"]},{"cells":["FamilyDisabledForObject()"]},{"cells":["FamilyExists()"]},{"cells":["FamilyMissing()"]},{"cells":["FamilyRetired()"]},{"cells":["InvalidCommitment()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidFamily()"]},{"cells":["InvalidLocator()"]},{"cells":["InvalidNonce()"]},{"cells":["InvalidSource()"]},{"cells":["InvalidTasks()"]},{"cells":["InvalidTrustClass()"]},{"cells":["InvalidVerifier()"]},{"cells":["LastAdministrator()"]},{"cells":["RevisionMissing()"]},{"cells":["StringsInsufficientHexLength(uint256 value, uint256 length)"]},{"cells":["TaskNotPending()"]},{"cells":["Unauthorized()"]},{"cells":["UnsupportedDigestAlgorithm()"]},{"cells":["VerifierExists()"]},{"cells":["VerifierMissing()"]},{"cells":["VerifierRetired()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address artifactRegistry_, address admin)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelipfscidverifier","title":"KeelIpfsCidVerifier","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelIpfsCidVerifier","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelIpfsCidVerifier.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelIpfsCidVerifier.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ANCHOR_STATUS_PENDING()","uint8","view"]},{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["DIGEST_KIND_DECODED_SHA256()","uint8","view"]},{"cells":["TASK_STATUS_PENDING()","uint8","view"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["anchorRegistry()","address","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["ipfsFamily()","uint8","view"]},{"cells":["keelHold()","address","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["maxVerifiableBytes()","uint64","view"]},{"cells":["previewCidDigest(bytes32 keelHoldObjectId)","bytes32","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["setIpfsFamily(uint8 familyId)","—","nonpayable"]},{"cells":["setMaxVerifiableBytes(uint64 maxBytes)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["verifyIpfsAnchor(bytes32 anchorId, uint32 taskIndex, bytes32 keelHoldObjectId)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["IpfsAnchorVerified(bytes32 indexed anchorId, uint64 nonce, uint32 taskIndex, bytes32 cidDigest, uint64 byteLength)"]},{"cells":["IpfsFamilyConfigured(uint8 familyId)"]},{"cells":["MaxVerifiableBytesConfigured(uint64 maxBytes)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["AdapterNotPinned()"]},{"cells":["AnchorNotPending()"]},{"cells":["CidMismatch(bytes32 computed, bytes32 claimed)"]},{"cells":["ContentDigestMismatch()"]},{"cells":["ContentTooLarge(uint256 length, uint64 limit)"]},{"cells":["DagTooDeep(uint256 slugCount)"]},{"cells":["FamilyNotConfigured()"]},{"cells":["LastAdministrator()"]},{"cells":["TaskNotPending()"]},{"cells":["UnsupportedDigestKind()"]},{"cells":["WrongFamily()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address anchorRegistry_, address keelHold_, address admin)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keell2anchorverifier","title":"KeelL2AnchorVerifier","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelL2AnchorVerifier","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelL2AnchorVerifier.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelL2AnchorVerifier.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["anchorRegistry()","address","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["lockConfiguration()","—","nonpayable"]},{"cells":["locked()","bool","view"]},{"cells":["remoteObjectStore(uint32 network)","address objectStore","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["setRemoteObjectStore(uint32 network, address objectStore)","—","nonpayable"]},{"cells":["stateVerifier()","address","view"]},{"cells":["submitArbitrumAnchor(bytes32 anchorId, uint32 taskIndex, bytes32 sendRoot, bytes header, bytes32 slot, bytes[] accountProof, bytes[] storageProof)","—","nonpayable"]},{"cells":["submitOpStackAnchor(bytes32 anchorId, uint32 taskIndex, bytes32 versionByte, bytes32 stateRoot, bytes32 messagePasserStorageRoot, bytes32 latestBlockHash, bytes32 slot, bytes[] accountProof, bytes[] storageProof)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["ConfigurationLocked()"]},{"cells":["L2AnchorApplied(bytes32 indexed anchorId, uint64 nonce, uint32 taskIndex, bytes32 digest, uint32 network)"]},{"cells":["RemoteObjectStoreSet(uint32 indexed network, address objectStore)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["AdapterNotPinned()"]},{"cells":["AnchorNotPending()"]},{"cells":["ConfigurationIsLocked()"]},{"cells":["DigestMismatch(bytes32 expected, bytes32 proven)"]},{"cells":["LastAdministrator()"]},{"cells":["NoRemoteStore(uint32 network)"]},{"cells":["TaskNotPending()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address anchorRegistry_, address stateVerifier_, address admin)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keell2stateverifier","title":"KeelL2StateVerifier","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelL2StateVerifier","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelL2StateVerifier.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelL2StateVerifier.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["arbitrumStateRoot(uint64 chainId, bytes32 sendRoot, bytes header)","bytes32 stateRoot, uint256 blockNumber","view"]},{"cells":["opStackStateRoot(uint64 chainId, bytes32 versionByte, bytes32 stateRoot, bytes32 messagePasserStorageRoot, bytes32 latestBlockHash)","bytes32","view"]},{"cells":["opStackStateRootAtGame(uint64 chainId, uint256 gameIndex, bytes32 versionByte, bytes32 stateRoot, bytes32 messagePasserStorageRoot, bytes32 latestBlockHash)","bytes32 root, uint256 l2BlockNumber","view"]},{"cells":["registry()","address","view"]},{"cells":["storageValue(bytes32 stateRoot, address account, bytes[] accountProof, bytes32 slot, bytes[] storageProof)","bytes","pure"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["BadTerminalDepth(uint256 depth)"]},{"cells":["EmbeddedNodeUnsupported(uint256 length)"]},{"cells":["GameNotResolvedForProposer(uint8 status)"]},{"cells":["GameTypeNotRespected(uint32 gameType, uint32 respected)"]},{"cells":["HeaderHashMismatch(bytes32 expected, bytes32 actual)"]},{"cells":["MalformedNode(uint256 items)"]},{"cells":["MalformedRlp()"]},{"cells":["NoSettlementContract()"]},{"cells":["NoValue()"]},{"cells":["NodeHashMismatch(uint256 index)"]},{"cells":["NotAHeader(uint256 items)"]},{"cells":["NotAnAccount()"]},{"cells":["OutputRootMismatch(bytes32 expected, bytes32 actual)"]},{"cells":["PathMismatch(uint256 depth)"]},{"cells":["SendRootNotConfirmed(bytes32 sendRoot)"]},{"cells":["TrailingNodes()"]},{"cells":["WrongStackForThisPath(uint8 stack)"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address registry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelnoderegistry","title":"KeelNodeRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelNodeRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelNodeRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelNodeRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["GOVERNOR()","address","view"]},{"cells":["MAX_NODES()","uint256","view"]},{"cells":["MAX_URI_BYTES()","uint256","view"]},{"cells":["NODE_SET_DOMAIN()","bytes32","view"]},{"cells":["commitNodeSet(uint256 chainId, bytes32 digest)","—","nonpayable"]},{"cells":["committedDigest(uint256 chainId)","bytes32","view"]},{"cells":["epochFor(uint256 chainId)","uint64","view"]},{"cells":["nodeSetDigest(uint256 chainId, string[] endpoints)","bytes32","pure"]},{"cells":["nodesFor(uint256 chainId)","string[]","view"]},{"cells":["publishNodeSet(uint256 chainId, string[] endpoints)","uint64 epoch","nonpayable"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["NodeSetCommitted(uint256 indexed chainId, bytes32 digest, address indexed by)"]},{"cells":["NodeSetPublished(uint256 indexed chainId, bytes32 digest, uint64 epoch, address indexed relayedBy)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CredentialsInUri(string uri)"]},{"cells":["EmptySet()"]},{"cells":["NotGovernor()"]},{"cells":["NotHttps(string uri)"]},{"cells":["NothingCommitted(uint256 chainId)"]},{"cells":["SetDoesNotMatchCommitment(bytes32 supplied, bytes32 committed)"]},{"cells":["TooManyNodes(uint256 supplied, uint256 maximum)"]},{"cells":["UriTooLong(uint256 length, uint256 maximum)"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address governor)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelportableanchorregistry","title":"KeelPortableAnchorRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelPortableAnchorRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelPortableAnchorRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelPortableAnchorRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ANCHOR_DOMAIN()","bytes","view"]},{"cells":["DIGEST_ALGORITHM_SHA256()","uint8","view"]},{"cells":["MAX_PORTABLE_MANIFEST_BYTES()","uint64","view"]},{"cells":["PORTABLE_MANIFEST_MEDIA_TYPE_DIGEST()","bytes32","view"]},{"cells":["SOURCE_EVENT_DOMAIN()","bytes32","view"]},{"cells":["SOURCE_FAMILY_ETHEREUM()","uint8","view"]},{"cells":["SOURCE_REF_DOMAIN()","bytes32","view"]},{"cells":["anchor(bytes32 anchorRoot)","(bytes32,uint64,bytes32,uint64,bytes32,bytes32,address,bool)","view"]},{"cells":["artifactRegistry()","address","view"]},{"cells":["computeAnchorRoot(bytes32 portableRoot, uint8 sourceFamily, uint32 sourceNetwork, bytes32 sourceRegistry, bytes32 sourceObjectKey, uint64 sourceRevision, bytes32 sourceEventDigest)","bytes32","pure"]},{"cells":["portableAnchor(bytes32 portableRoot)","bytes32","view"]},{"cells":["publishObjectAnchor(bytes32 manifestObjectId, uint64 manifestObjectRevision, bytes32 decodedObjectId, uint64 decodedObjectRevision, bytes32 portableRoot)","bytes32 anchorRoot","nonpayable"]},{"cells":["revisionSourceDigest(bytes32 objectId, uint64 artifactRevision)","bytes32","view"]},{"cells":["sourceAnchor(bytes32 objectId, uint64 artifactRevision)","bytes32","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["PortableRootAnchored(bytes32 indexed anchorRoot, bytes32 indexed portableRoot, bytes32 indexed objectId, uint64 artifactRevision, bytes32 decodedObjectId, uint64 decodedObjectRevision, bytes32 sourceEventDigest, address registrar)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidContract()"]},{"cells":["InvalidPortableManifestSource()"]},{"cells":["InvalidPortableRoot()"]},{"cells":["PortableRootAlreadyAnchored()"]},{"cells":["SourceAlreadyAnchored()"]},{"cells":["Unauthorized()"]},{"cells":["UnsupportedNetwork()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address artifactRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelsettlementregistry","title":"KeelSettlementRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelSettlementRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelSettlementRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelSettlementRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["chainOf(uint64 chainId)","(bool,uint8,uint64,uint8,uint8,uint8,address)","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["isRecorded(uint64 chainId)","bool","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["lockConfiguration()","—","nonpayable"]},{"cells":["locked()","bool","view"]},{"cells":["pathToRoot(uint64 chainId)","uint256 hops, bool fullyOnChain","view"]},{"cells":["recordChain(uint64 chainId, (bool,uint8,uint64,uint8,uint8,uint8,address) chain)","—","nonpayable"]},{"cells":["recordedChains()","uint64[]","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["ChainRecorded(uint64 indexed chainId, uint8 depth, uint8 stack, uint8 da)"]},{"cells":["ConfigurationLocked()"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["ConfigurationIsLocked()"]},{"cells":["InvalidTopology()"]},{"cells":["LastAdministrator()"]},{"cells":["UnknownChain(uint64 chainId)"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelsp1gatewayproofbackend","title":"KeelSp1GatewayProofBackend","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelSp1GatewayProofBackend","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelSp1GatewayProofBackend.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelSp1GatewayProofBackend.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["configLocked()","bool","view"]},{"cells":["configurationHash()","bytes32","view"]},{"cells":["configure(bytes32 programVKey_)","—","nonpayable"]},{"cells":["gateway()","address","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["lockConfiguration()","—","nonpayable"]},{"cells":["programVKey()","bytes32","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["verifierCodeHash()","bytes32","view"]},{"cells":["verifyAnchorProof(bytes publicValues, bytes proofData)","bool","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["BackendConfigured(bytes32 programVKey)"]},{"cells":["ConfigurationLockedEvent(address locker)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["ConfigMissing()"]},{"cells":["ConfigurationLocked()"]},{"cells":["LastAdministrator()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address gateway_, address admin)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelsp1gatewayproofverifier","title":"KeelSp1GatewayProofVerifier","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelSp1GatewayProofVerifier","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelSp1GatewayProofVerifier.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelSp1GatewayProofVerifier.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["configLocked()","bool","view"]},{"cells":["gateway()","address","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["lockConfiguration()","—","nonpayable"]},{"cells":["programVKey()","bytes32","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["setProgram(bytes32 programVKey_)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["verifyAnchorProof(bytes publicValues, bytes proofData)","bool","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["ConfigurationLockedEvent(address locker)"]},{"cells":["ProgramConfigured(bytes32 programVKey)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["ConfigMissing()"]},{"cells":["ConfigurationLocked()"]},{"cells":["LastAdministrator()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address gateway_, address admin)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelzkanchorverifier","title":"KeelZkAnchorVerifier","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelZkAnchorVerifier","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelZkAnchorVerifier.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelZkAnchorVerifier.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ANCHOR_STATUS_PENDING()","uint8","view"]},{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["MAX_FUTURE_SECONDS()","uint32","view"]},{"cells":["MAX_TIP_AGE()","uint32","view"]},{"cells":["TASK_STATUS_PENDING()","uint8","view"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["anchorPoint(bytes32 blockHash)","(uint32,uint32,uint32,uint32,bool)","view"]},{"cells":["anchorRegistry()","address","view"]},{"cells":["bestAnchorHeight()","uint32","view"]},{"cells":["bestChainWork()","uint256","view"]},{"cells":["bestHeadersRoot()","bytes32","view"]},{"cells":["bestTipHash()","bytes32","view"]},{"cells":["bitcoinLocator(bytes32 txid, uint32 inputIndex)","string","pure"]},{"cells":["bitcoinSourceSchema()","bytes32","pure"]},{"cells":["bootstrapHash()","bytes32","view"]},{"cells":["configLocked()","bool","view"]},{"cells":["configurationHash()","bytes32","view"]},{"cells":["encodePublicValues((bytes32,uint32,uint32,uint32,uint32,bytes32,uint32,uint32,uint32,uint32,bytes32,uint64,bytes32,uint32,uint32,bytes32,bytes32,uint32,bytes32,uint32,uint8) values)","bytes","pure"]},{"cells":["familyPolicy(uint8 familyId)","(uint32,uint256,bool)","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["lockConfiguration()","—","nonpayable"]},{"cells":["proofBackend()","address","view"]},{"cells":["proofController()","address","view"]},{"cells":["proofProfileId()","bytes32","view"]},{"cells":["receipts(bytes32 anchorId)","uint32 blockHeight, uint64 acceptedAt, uint64 nonce, bytes32 blockHash, bytes32 evidenceHash, bytes32 acceptedTip, bytes32 acceptedRoot","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["seedAnchorPoint(bytes32 blockHash, uint32 height, uint32 bits, uint32 timestamp, uint32 epochStart)","—","nonpayable"]},{"cells":["setFamilyPolicy(uint8 familyId, uint32 minConfirmations, uint256 minCumulativeWork)","—","nonpayable"]},{"cells":["setProofBackend(address backend)","—","nonpayable"]},{"cells":["setProofProfile(address controller, bytes32 profileId)","—","nonpayable"]},{"cells":["sourceStatus(bytes32 anchorId, bytes32 currentBlockHash, bytes32[] path)","uint8","view"]},{"cells":["submitHeaderChain((bytes32,uint32,uint32,uint32,uint32,bytes32,uint32,uint32,uint32,uint32,bytes32,uint64,bytes32,uint32,uint32,bytes32,bytes32,uint32,bytes32,uint32,uint8) values, bytes proofData)","—","nonpayable"]},{"cells":["submitZkAnchor(bytes32 anchorId, uint32 taskIndex, (bytes32,uint32,uint32,uint32,uint32,bytes32,uint32,uint32,uint32,uint32,bytes32,uint64,bytes32,uint32,uint32,bytes32,bytes32,uint32,bytes32,uint32,uint8) values, bytes proofData)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AnchorPointAdvanced(bytes32 indexed blockHash, uint32 height, uint32 previousBest)"]},{"cells":["AnchorPointSeeded(bytes32 indexed blockHash, uint32 height)"]},{"cells":["BestBranchSelected(bytes32 indexed tipHash, bytes32 headersRoot, uint256 chainWork, uint32 height)"]},{"cells":["ConfigurationLockedEvent(address locker)"]},{"cells":["FamilyConfigured(uint8 indexed familyId, uint32 minConfirmations, uint256 minCumulativeWork)"]},{"cells":["ProofBackendConfigured(address backend)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["ZkAnchorApplied(bytes32 indexed anchorId, uint64 nonce, uint32 taskIndex, bytes32 anchorRoot, uint32 blockHeight, uint32 confirmations)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["AdapterNotPinned()"]},{"cells":["AlreadySeeded()"]},{"cells":["AnchorNotPending()"]},{"cells":["ConfigMissing()"]},{"cells":["ConfigurationLocked()"]},{"cells":["DigestMismatch()"]},{"cells":["HeaderOnlyClaim()"]},{"cells":["InsufficientConfirmations()"]},{"cells":["InsufficientWork()"]},{"cells":["InvalidChainEvidence()"]},{"cells":["LastAdministrator()"]},{"cells":["LocalContentMismatch()"]},{"cells":["LosingBranch()"]},{"cells":["OriginRecordMismatch()"]},{"cells":["ProfileNotAdmitted()"]},{"cells":["ProofRejected()"]},{"cells":["SourceBindingMismatch()"]},{"cells":["StaleBranch()"]},{"cells":["StringsInsufficientHexLength(uint256 value, uint256 length)"]},{"cells":["TaskNotPending()"]},{"cells":["UnknownOrigin(bytes32 originHash)"]},{"cells":["UnsupportedLocalCompression()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address anchorRegistry_, address admin)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelzkverifyproofbackend","title":"KeelZkVerifyProofBackend","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelZkVerifyProofBackend","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelZkVerifyProofBackend.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelZkVerifyProofBackend.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["PROVING_SYSTEM_ID()","bytes32","view"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["configLocked()","bool","view"]},{"cells":["configure(uint256 domainId_, bytes32 programVKey_, string proofVersion_)","—","nonpayable"]},{"cells":["domainId()","uint256","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["leafDigest(bytes publicValues)","bytes32","view"]},{"cells":["lockConfiguration()","—","nonpayable"]},{"cells":["programVKey()","bytes32","view"]},{"cells":["proofVersion()","string","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["verifyAnchorProof(bytes publicValues, bytes proofData)","bool","view"]},{"cells":["zkVerify()","address","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["BackendConfigured(uint256 domainId, bytes32 programVKey, string proofVersion)"]},{"cells":["ConfigurationLockedEvent(address locker)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["ConfigMissing()"]},{"cells":["ConfigurationLocked()"]},{"cells":["LastAdministrator()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address zkVerify_, address admin)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelzkverifyproofverifier","title":"KeelZkVerifyProofVerifier","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelZkVerifyProofVerifier","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/KeelZkVerifyProofVerifier.sol"},{"label":"Download ABI","href":"/docs/abi/keel-anchors/KeelZkVerifyProofVerifier.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["PROVING_SYSTEM_ID()","bytes32","view"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["configLocked()","bool","view"]},{"cells":["domainId()","uint256","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["leafDigest(bytes publicValues)","bytes32","view"]},{"cells":["lockConfiguration()","—","nonpayable"]},{"cells":["programVKey()","bytes32","view"]},{"cells":["proofVersion()","string","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["setDomain(uint256 domainId_)","—","nonpayable"]},{"cells":["setProgram(bytes32 programVKey_, string proofVersion_)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["verifyAnchorProof(bytes publicValues, bytes proofData)","bool","view"]},{"cells":["zkVerify()","address","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["ConfigurationLockedEvent(address locker)"]},{"cells":["DomainConfigured(uint256 domainId)"]},{"cells":["ProgramConfigured(bytes32 programVKey, string proofVersion)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["ConfigMissing()"]},{"cells":["ConfigurationLocked()"]},{"cells":["LastAdministrator()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address zkVerify_, address admin)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelBtcHeaderChain, KeelEthStateProof","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-anchors/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-anchors/tezos"},{"label":"Native module configuration","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-anchors/keel.module.json"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["seed_anchor","entrypoint","keel_btc_header_chain.py"]},{"cells":["lock_configuration","entrypoint","keel_btc_header_chain.py"]},{"cells":["submit_headers","entrypoint","keel_btc_header_chain.py"]},{"cells":["verify_inscription","entrypoint","keel_btc_header_chain.py"]},{"cells":["is_anchor","onchain_view","keel_btc_header_chain.py"]},{"cells":["anchor_of","onchain_view","keel_btc_header_chain.py"]},{"cells":["is_verified","onchain_view","keel_btc_header_chain.py"]},{"cells":["best","onchain_view","keel_btc_header_chain.py"]},{"cells":["verify_inclusion","entrypoint","keel_eth_state_proof.py"]},{"cells":["last","onchain_view","keel_eth_state_proof.py"]},{"cells":["verify","onchain_view","keel_eth_state_proof.py"]},{"cells":["verify_account","onchain_view","keel_eth_state_proof.py"]},{"cells":["verify_account","onchain_view","keel_eth_state_proof.py"]}],"caption":"Native interface","collapsed":false}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-artifacts","navTitle":"Object model (keel-artifacts)","eyebrow":"Technical reference","title":"Object model (keel-artifacts)","summary":"The Keel object graph: objects, viewers, links, seeds, and the manager that fronts them.","thesis":"The Keel object graph: objects, viewers, links, seeds, and the manager that fronts them.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"The Keel object graph: objects, viewers, links, seeds, and the manager that fronts them.","cards":[{"title":"keel-artifacts","body":"The Keel object graph: objects, viewers, links, seeds, and the manager that fronts them.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-hold, keel-kernel"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-artifacts/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-artifacts"}]}]},{"id":"keelartifactregistry","title":"KeelArtifactRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelArtifactRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelArtifactRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelArtifactRegistry.json"},{"label":"Sepolia showcase · 0xe85884ba2af3932d4f98507668ed5fe8fed6db92","href":"https://sepolia.etherscan.io/address/0xe85884ba2af3932d4f98507668ed5fe8fed6db92#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["OBJECT_ID_DOMAIN()","bytes32","view"]},{"cells":["appendArtifactRevision(bytes32 objectId, uint64 expectedParent, bytes32 contentObjectId, uint8 digestAlgorithm, bytes32 decodedDigest, bytes32 metadataDigest, bytes32 fidelitySetDigest)","uint64 revision","nonpayable"]},{"cells":["artifactCreator(bytes32 objectId)","address","view"]},{"cells":["artifactIsFrozen(bytes32 objectId)","bool","view"]},{"cells":["artifactLineage(bytes32 objectId)","(address,(address,uint256),uint8,uint64,bool,bool)","view"]},{"cells":["artifactOwner(bytes32 objectId)","address","view"]},{"cells":["artifactRevision(bytes32 objectId, uint64 revision)","(bytes32,bytes32,bytes32,bytes32,bytes32,uint64,uint64,uint64,address,uint8,uint8,bool)","view"]},{"cells":["artifactRevisionDescriptor(bytes32 objectId, uint64 revision)","address store, bytes32 contentObjectId, bytes32 decodedDigest, bytes32 metadataDigest, bytes32 fidelitySetDigest, bytes32 mediaTypeDigest, uint64 byteLength, uint8 digestAlgorithm, uint8 compression, address publisher","view"]},{"cells":["artifactRevisionExists(bytes32 objectId, uint64 revision)","bool","view"]},{"cells":["artifactRevisionSource(bytes32 objectId, uint64 revision)","address store, bytes32 contentObjectId, uint8 digestAlgorithm, bytes32 decodedDigest, uint64 byteLength, uint8 compression, string mediaType","view"]},{"cells":["canEditArtifact(bytes32 objectId, address account)","bool","view"]},{"cells":["forgeArtifact(bytes32 salt, (address,uint256) binding, uint8 policy, bytes32 contentObjectId, uint8 digestAlgorithm, bytes32 decodedDigest, bytes32 metadataDigest, bytes32 fidelitySetDigest)","bytes32 objectId","payable"]},{"cells":["forgeArtifactFor(address creator, bytes32 salt, (address,uint256) binding, uint8 policy, bytes32 contentObjectId, uint8 digestAlgorithm, bytes32 decodedDigest, bytes32 metadataDigest, bytes32 fidelitySetDigest)","bytes32 objectId","payable"]},{"cells":["forgeArtifactWithRevisionPolicy(bytes32 salt, (address,uint256) binding, uint8 policy, bytes32 contentObjectId, uint8 digestAlgorithm, bytes32 decodedDigest, bytes32 metadataDigest, bytes32 fidelitySetDigest, address revisionPolicy_)","bytes32 objectId","payable"]},{"cells":["forgingFee()","uint256","view"]},{"cells":["freezeArtifact(bytes32 objectId)","—","nonpayable"]},{"cells":["keelHold()","address","view"]},{"cells":["latestArtifactRevision(bytes32 objectId)","uint64","view"]},{"cells":["manager()","address","view"]},{"cells":["predictArtifactId(address creator, bytes32 salt)","bytes32","pure"]},{"cells":["protocolFeeRecipient()","address","view"]},{"cells":["publicationJob()","address","view"]},{"cells":["revisionPolicy(bytes32 objectId)","address policy","view"]},{"cells":["setForgingFee(uint256 nextFee, address nextRecipient)","—","nonpayable"]},{"cells":["setPublicationJob(address nextPublicationJob)","—","nonpayable"]},{"cells":["setRevisionPolicy(bytes32 objectId, address policy)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["ArtifactForged(bytes32 indexed objectId, address indexed creator, address indexed collection, uint256 tokenId, uint8 policy)"]},{"cells":["ArtifactPermanentlyFrozen(bytes32 indexed objectId, uint64 indexed revision)"]},{"cells":["ArtifactRevisionAppended(bytes32 indexed objectId, uint64 indexed revision, uint64 indexed parentRevision, bytes32 contentObjectId, bytes32 decodedDigest, bytes32 metadataDigest, bytes32 fidelitySetDigest, bytes32 mediaTypeDigest, uint64 byteLength, uint8 digestAlgorithm, uint8 compression, address publisher)"]},{"cells":["ArtifactRevisionPolicySet(bytes32 indexed objectId, address indexed policy, uint64 indexed revision)"]},{"cells":["ForgingFeeConfigured(uint256 indexed previousFee, uint256 indexed nextFee, address indexed feeRecipient)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["ArtifactAlreadyExists()"]},{"cells":["ArtifactFrozen()"]},{"cells":["ArtifactMissing()"]},{"cells":["ContentObjectMissing()"]},{"cells":["DigestMismatch()"]},{"cells":["FeeTransferFailed()"]},{"cells":["IncorrectPayment(uint256 expected, uint256 received)"]},{"cells":["InvalidBinding()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidFeeRecipient()"]},{"cells":["InvalidMetadataDigest()"]},{"cells":["InvalidParent()"]},{"cells":["InvalidRevisionPolicy()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["RevisionMissing()"]},{"cells":["RevisionPolicyAlreadySet()"]},{"cells":["SealRequired(bytes32 objectId)"]},{"cells":["Unauthorized()"]},{"cells":["UnauthorizedGovernance()"]},{"cells":["UnauthorizedManager()"]},{"cells":["UnauthorizedPublicationJob()"]},{"cells":["UnexpectedEther()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address keelHold_, address manager_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelharnessregistry","title":"KeelHarnessRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelHarnessRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelHarnessRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelHarnessRegistry.json"},{"label":"Sepolia showcase · 0xa5d6ae35c327f998403aa1eb713df3741e3f3136","href":"https://sepolia.etherscan.io/address/0xa5d6ae35c327f998403aa1eb713df3741e3f3136#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["HARNESS_ID_DOMAIN()","bytes32","view"]},{"cells":["MAX_SLOTS()","uint256","view"]},{"cells":["TREE_DOMAIN()","bytes32","view"]},{"cells":["activateFork(bytes32 harnessId, uint256 tokenId, uint64 forkRevision, uint64 keelIndexRevision)","—","nonpayable"]},{"cells":["appendHarnessRevision(bytes32 harnessId, uint64 expectedParent, bytes32[] slotObjectIds, uint64[] slotObjectRevisions, bytes32 manifestDigest, bytes32 seedSetDigest)","uint64 revision","nonpayable"]},{"cells":["appendHarnessSelections(bytes32 harnessId, uint64 expectedParent, uint64[] selectedObjectRevisions, bytes32 manifestDigest, bytes32 seedSetDigest)","uint64 revision","nonpayable"]},{"cells":["appendHarnessTree(bytes32 harnessId, uint64 expectedParent, uint8 childCount, uint256[] children, bytes32 manifestDigest, bytes32 seedSetDigest)","uint64 revision","nonpayable"]},{"cells":["artifactRegistry()","address","view"]},{"cells":["cancelPendingFork(bytes32 harnessId, uint256 tokenId)","—","nonpayable"]},{"cells":["effectiveHarness(bytes32 harnessId, uint256 tokenId)","(uint64,uint64,uint64,bytes32,bytes32,uint64[],bytes32[]) result","view"]},{"cells":["forgeHarness(bytes32 salt, address collection, uint8 editPolicy, uint8 forkPolicy, bytes32[] slotObjectIds, uint64[] slotObjectRevisions, bytes32 manifestDigest, bytes32 seedSetDigest)","bytes32 harnessId","nonpayable"]},{"cells":["forgeHarnessFor(address creator, bytes32 salt, address collection, uint8 editPolicy, uint8 forkPolicy, bytes32[] slotObjectIds, uint64[] slotObjectRevisions, bytes32 manifestDigest, bytes32 seedSetDigest)","bytes32 harnessId","nonpayable"]},{"cells":["forgeHarnessTree(bytes32 salt, address collection, uint8 editPolicy, uint8 forkPolicy, uint8 childCount, uint256[] children, bytes32 manifestDigest, bytes32 seedSetDigest)","bytes32","nonpayable"]},{"cells":["forgeHarnessTreeFor(address creator, bytes32 salt, address collection, uint8 editPolicy, uint8 forkPolicy, uint8 childCount, uint256[] children, bytes32 manifestDigest, bytes32 seedSetDigest)","bytes32","nonpayable"]},{"cells":["forkHarnessForToken(bytes32 harnessId, uint256 tokenId, uint64 baseHarnessRevision, uint64 expectedForkParent, uint64[] selectedObjectRevisions, bytes32 manifestDigest)","uint64 forkRevision","nonpayable"]},{"cells":["forkHarnessTreeForToken(bytes32 harnessId, uint256 tokenId, uint64 baseHarnessRevision, uint64 expectedForkParent, uint256[] children, bytes32 manifestDigest)","uint64 forkRevision","nonpayable"]},{"cells":["freezeHarness(bytes32 harnessId)","—","nonpayable"]},{"cells":["freezeTokenFork(bytes32 harnessId, uint256 tokenId)","—","nonpayable"]},{"cells":["harnessCollection(bytes32 harnessId)","address","view"]},{"cells":["harnessCreator(bytes32 harnessId)","address","view"]},{"cells":["harnessIds(uint32 key)","bytes32 harnessId","view"]},{"cells":["harnessKeys(bytes32 harnessId)","uint32 key","view"]},{"cells":["harnessLineage(bytes32 harnessId)","(bool,bool,uint64,address,address,uint8,uint8)","view"]},{"cells":["harnessNode(uint32 key, uint32 revision)","uint256 metadata, uint256[] children, bytes32[] objectIds, uint64[] revisions","view"]},{"cells":["harnessRevision(bytes32 harnessId, uint64 revision)","(bool,uint64,uint64,uint80,uint40,bytes32,bytes32,bytes32,address)","view"]},{"cells":["harnessRevisionCommitment(bytes32 harnessId, uint64 revision)","bytes32 manifestDigest, bytes32 slotsDigest, bytes32 seedSetDigest","view"]},{"cells":["harnessRevisionExists(bytes32 harnessId, uint64 revision)","bool","view"]},{"cells":["harnessRevisionPublisher(bytes32 harnessId, uint64 revision)","address","view"]},{"cells":["harnessSeedContext(bytes32 harnessId, uint64 revision)","bool exists, address collection, address publisher, bytes32 manifestDigest, bytes32 seedSetDigest","view"]},{"cells":["harnessSlots(bytes32 harnessId, uint64 revision)","bytes32[] objectIds, uint64[] artifactRevisions","view"]},{"cells":["harnessTree(bytes32 harnessId, uint64 revision)","uint256 metadata, uint256[] children","view"]},{"cells":["keelIndex()","address","view"]},{"cells":["latestHarnessRevision(bytes32 harnessId)","uint64","view"]},{"cells":["predictHarnessId(address creator, bytes32 salt, address collection)","bytes32","pure"]},{"cells":["publicationJob()","address","view"]},{"cells":["registerHarnessKey(bytes32 harnessId)","uint32 key","nonpayable"]},{"cells":["registerHarnessKeys(bytes32[] ids)","uint32[] keys","nonpayable"]},{"cells":["setPublicationJob(address nextPublicationJob)","—","nonpayable"]},{"cells":["setTreeLimits(uint8 maxDepth, uint64 maxObjects)","—","nonpayable"]},{"cells":["tokenForkLineage(bytes32 harnessId, uint256 tokenId)","(bool,uint64,uint64,uint64)","view"]},{"cells":["tokenForkRevision(bytes32 harnessId, uint256 tokenId, uint64 revision)","(bool,bool,uint64,uint64,uint64,bytes32,bytes32,address,uint80)","view"]},{"cells":["tokenForkSelections(bytes32 harnessId, uint256 tokenId, uint64 revision)","uint64[]","view"]},{"cells":["tokenForkTree(bytes32 harnessId, uint256 tokenId, uint64 revision)","uint256 metadata, uint256[] children","view"]},{"cells":["treeControl()","uint256","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["HarnessForged(uint8 editPolicy, uint8 forkPolicy, bytes32 indexed harnessId, address indexed creator, address indexed collection)"]},{"cells":["HarnessKeyRegistered(uint32 indexed key, bytes32 indexed harnessId)"]},{"cells":["HarnessPermanentlyFrozen(uint64 indexed revision, bytes32 indexed harnessId)"]},{"cells":["HarnessRevisionAppended(uint64 indexed revision, uint64 indexed parentRevision, bytes32 indexed harnessId, bytes32 slotsDigest, bytes32 seedSetDigest, bytes32 manifestDigest, address publisher)"]},{"cells":["TokenForkActivated(uint64 indexed forkRevision, uint64 keelIndexRevision, bytes32 indexed harnessId, uint256 indexed tokenId)"]},{"cells":["TokenForkCancelled(uint64 indexed forkRevision, bytes32 indexed harnessId, uint256 indexed tokenId)"]},{"cells":["TokenForkPermanentlyFrozen(uint64 indexed forkRevision, bytes32 indexed harnessId, uint256 indexed tokenId)"]},{"cells":["TokenForkPublished(uint64 indexed forkRevision, uint64 parentRevision, uint64 baseHarnessRevision, bytes32 indexed harnessId, bytes32 manifestDigest, bytes32 selectionDigest, uint256 indexed tokenId, address publisher)"]},{"cells":["TreeLimitsSet(uint256 control)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["ArtifactRevisionMissing()"]},{"cells":["ForkFrozen()"]},{"cells":["ForkMissing()"]},{"cells":["ForksDisabled()"]},{"cells":["HarnessAlreadyExists()"]},{"cells":["HarnessFrozen()"]},{"cells":["HarnessKeyOverflow()"]},{"cells":["HarnessMissing()"]},{"cells":["HarnessRevisionMissing()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidManifestDigest()"]},{"cells":["InvalidParent()"]},{"cells":["InvalidSlots()"]},{"cells":["InvalidTree()"]},{"cells":["NoPendingFork()"]},{"cells":["PendingForkExists()"]},{"cells":["RegistryCommitmentMismatch()"]},{"cells":["SlotSourceTooLarge()"]},{"cells":["TreeLimitExceeded()"]},{"cells":["Unauthorized()"]},{"cells":["UnauthorizedGovernance()"]},{"cells":["UnauthorizedPublicationJob()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address artifactRegistry_, address keelIndex_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keellinkregistry","title":"KeelLinkRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelLinkRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelLinkRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelLinkRegistry.json"},{"label":"Sepolia showcase · 0xc2b94319334359171a653c93e402b12b93e24102","href":"https://sepolia.etherscan.io/address/0xc2b94319334359171a653c93e402b12b93e24102#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["LINK_ID_DOMAIN()","bytes32","view"]},{"cells":["LINK_SET_DOMAIN()","bytes32","view"]},{"cells":["MAX_FIDELITY_LINKS()","uint256","view"]},{"cells":["MAX_MEDIA_TYPE_BYTES()","uint256","view"]},{"cells":["MAX_URI_BYTES()","uint256","view"]},{"cells":["REQUIRED_SHELL_ID()","bytes32","view"]},{"cells":["artifactRegistry()","address","view"]},{"cells":["computeLinkSetDigest(bytes32 objectId, uint64 artifactRevision, (uint8,uint8,uint8,uint8,string,string,bytes32,bytes32,uint64)[] inputs)","bytes32","pure"]},{"cells":["fidelityLink(bytes32 objectId, uint64 artifactRevision, uint8 fidelity)","(bytes32,uint64,uint8,uint8,uint8,uint8,string,string,bytes32,bytes32,uint64,uint64,address,address,bool)","view"]},{"cells":["linkById(bytes32 linkId)","(bytes32,uint64,uint8,uint8,uint8,uint8,string,string,bytes32,bytes32,uint64,uint64,address,address,bool)","view"]},{"cells":["linkExists(bytes32 objectId, uint64 artifactRevision, uint8 fidelity)","bool","view"]},{"cells":["linkForPresentation(bytes32 linkId, bytes32 shellId)","(bytes32,uint64,uint8,uint8,uint8,uint8,string,string,bytes32,bytes32,uint64,uint64,address,address,bool) record","view"]},{"cells":["linkSet(bytes32 objectId, uint64 artifactRevision)","bytes32 digest, uint8 count","view"]},{"cells":["linkURI(bytes32 linkId)","string","view"]},{"cells":["predictLinkId(bytes32 objectId, uint64 artifactRevision, uint8 fidelity)","bytes32","pure"]},{"cells":["presentationBuilders(bytes32 shellId)","address builder","view"]},{"cells":["presentationURI(bytes32 linkId, bytes32 shellId)","string","view"]},{"cells":["publishFidelityLinks(bytes32 objectId, uint64 artifactRevision, (uint8,uint8,uint8,uint8,string,string,bytes32,bytes32,uint64)[] inputs)","bytes32 linkSetDigest","nonpayable"]},{"cells":["setPresentationBuilder(bytes32 shellId, address builder)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["FidelityLinkPublished(uint8 scheme, uint8 indexed fidelity, uint8 compression, uint8 digestAlgorithm, uint64 byteLength, uint64 indexed artifactRevision, bytes32 linkId, bytes32 indexed objectId, bytes32 uriDigest, bytes32 decodedDigest, bytes32 mediaTypeDigest, bytes32 provenanceDigest, address revealer, address publisher)"]},{"cells":["FidelityLinkSetPublished(uint8 count, uint64 indexed artifactRevision, bytes32 indexed objectId, bytes32 indexed linkSetDigest, address revealer, address publisher)"]},{"cells":["PresentationBuilderSet(bytes32 indexed shellId, address indexed builder)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["HybridAlgorithmMismatch()"]},{"cells":["HybridDigestMismatch()"]},{"cells":["HybridLengthMismatch()"]},{"cells":["HybridMediaTypeMismatch()"]},{"cells":["InvalidCommitment()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidLinkSet()"]},{"cells":["InvalidMediaType()"]},{"cells":["InvalidPresentationBuilder()"]},{"cells":["InvalidURI()"]},{"cells":["LinkMissing()"]},{"cells":["LinkSetAlreadyExists()"]},{"cells":["LinkSetCommitmentMismatch()"]},{"cells":["LinkSetNotCommitted()"]},{"cells":["PresentationBuilderMissing()"]},{"cells":["SchemeMismatch()"]},{"cells":["UnauthorizedGovernance()"]},{"cells":["VerificationShellRequired()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address artifactRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelmanager","title":"KeelManager","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelManager","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelManager.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelManager.json"},{"label":"Sepolia showcase · 0x940004faaee674c99b20ca7ecce6f877b996c3e5","href":"https://sepolia.etherscan.io/address/0x940004faaee674c99b20ca7ecce6f877b996c3e5#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["AUTOMATION_ACTION_TYPEHASH()","bytes32","view"]},{"cells":["CHANGE_ADMIN_SELECTOR()","bytes4","view"]},{"cells":["CONTRACT_SIGNATURE_TYPEHASH()","bytes32","view"]},{"cells":["ERC1271_INVALID_VALUE()","bytes4","view"]},{"cells":["ERC1271_MAGIC_VALUE()","bytes4","view"]},{"cells":["GOVERNANCE_ACTION_TYPEHASH()","bytes32","view"]},{"cells":["GOVERNANCE_DENOMINATOR()","uint256","view"]},{"cells":["GOVERNANCE_NUMERATOR()","uint256","view"]},{"cells":["GOVERNOR_ACCEPTANCE_TYPEHASH()","bytes32","view"]},{"cells":["GOVERNOR_SET_TYPEHASH()","bytes32","view"]},{"cells":["MANAGER_VERSION()","string","view"]},{"cells":["MAX_AUTOMATION_KEY_LIFETIME()","uint64","view"]},{"cells":["MAX_GOVERNORS()","uint256","view"]},{"cells":["MAX_GOVERNOR_ACTIVATION_WINDOW()","uint64","view"]},{"cells":["MAX_GOVERNOR_SCHEDULING_DELAY()","uint64","view"]},{"cells":["MAX_RPC_HOSTS()","uint256","view"]},{"cells":["MAX_RPC_HOST_BYTES()","uint256","view"]},{"cells":["MAX_SIGNATURE_APPROVAL_DURATION()","uint64","view"]},{"cells":["MIN_GOVERNORS()","uint256","view"]},{"cells":["MIN_GOVERNOR_ACTIVATION_WINDOW()","uint64","view"]},{"cells":["MIN_GOVERNOR_ROTATION_DELAY()","uint64","view"]},{"cells":["RENOUNCE_OWNERSHIP_SELECTOR()","bytes4","view"]},{"cells":["RPC_HOST_LIST_DOMAIN()","string","view"]},{"cells":["SET_ADMIN_SELECTOR()","bytes4","view"]},{"cells":["TRANSFER_OWNERSHIP_SELECTOR()","bytes4","view"]},{"cells":["UPGRADE_DELAY()","uint64","view"]},{"cells":["UPGRADE_INTERFACE_VERSION()","string","view"]},{"cells":["UPGRADE_TO_SELECTOR()","bytes4","view"]},{"cells":["accountTier(address account)","uint8","view"]},{"cells":["accountTierNonce(address account)","uint256","view"]},{"cells":["activateGovernorReconfiguration()","—","nonpayable"]},{"cells":["approveSignature(bytes32 digest, uint64 validUntil)","—","nonpayable"]},{"cells":["automationActionDigest(address signer, (address,uint256,bytes) call_, uint64 deadline)","bytes32","view"]},{"cells":["automationCapability(address signer, address target, bytes4 selector)","(uint96,uint64,uint64,bool,uint256)","view"]},{"cells":["automationKeyState(address signer)","(uint64,uint256,uint256) state","view"]},{"cells":["banner()","string","pure"]},{"cells":["cancelGovernorReconfiguration()","—","nonpayable"]},{"cells":["cancelUpgrade()","—","nonpayable"]},{"cells":["capabilityIsProtected(bytes4 selector)","bool","pure"]},{"cells":["computeRpcHostListDigest(string[] hosts, uint64 revision, uint64 epoch)","bytes32","view"]},{"cells":["configureAccountTier(address account, uint8 tier)","—","nonpayable"]},{"cells":["configureAutomationCapability(address signer, address target, bytes4 selector, uint64 validAfter, uint64 validUntil, uint96 maxValue, bool enabled)","—","nonpayable"]},{"cells":["configureAutomationKey(address signer, uint64 validUntil)","—","nonpayable"]},{"cells":["configureExecutionPolicy(address target, bytes4 selector, uint8 minimumTier, uint96 maxValue, bool enabled)","—","nonpayable"]},{"cells":["configureModule(bytes32 moduleId, address activeModule, bytes32 expectedCodeHash)","—","nonpayable"]},{"cells":["configureRpcHostList(string[] hosts, uint64 expectedRevision)","—","nonpayable"]},{"cells":["contractSignatureDigest(bytes32 digest, uint64 deadline)","bytes32","view"]},{"cells":["decodeSignatureEnvelope(bytes encoded)","uint64 deadline, uint64 epoch, (address,bytes)[] signatures","pure"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["executeAutomation(address signer, (address,uint256,bytes) call_, uint64 deadline, bytes signature)","bytes result","payable"]},{"cells":["executeGovernance((address,uint256,bytes) call_, uint64 deadline, (address,bytes)[] signatures)","bytes result","payable"]},{"cells":["executeRole((address,uint256,bytes) call_)","bytes result","payable"]},{"cells":["executionMode()","uint8","view"]},{"cells":["executionPolicyState(address target, bytes4 selector)","(uint96,uint8,bool,uint256) state","view"]},{"cells":["expireGovernorReconfiguration()","—","nonpayable"]},{"cells":["freezeModule(bytes32 moduleId)","—","nonpayable"]},{"cells":["governanceActionDigest((address,uint256,bytes) call_, uint64 deadline)","bytes32","view"]},{"cells":["governanceEpoch()","uint64","view"]},{"cells":["governanceState()","(uint256,uint256,uint64,uint64) state","view"]},{"cells":["governorSetDigest(address[] nextGovernors, uint64 validAfter, uint64 expiresAt, uint64 nextEpoch, uint64 changeNonce)","bytes32","view"]},{"cells":["governors()","address[]","view"]},{"cells":["initialize(address[] initialGovernors, address[] initialAdmins, address[] initialModerators)","—","nonpayable"]},{"cells":["isGovernor(address account)","bool","view"]},{"cells":["isValidSignature(bytes32 digest, bytes signature)","bytes4","view"]},{"cells":["module(bytes32 moduleId)","(address,uint64,bool,bytes32)","view"]},{"cells":["newGovernorAcceptanceDigest(bytes32 setDigest, address governor)","bytes32","view"]},{"cells":["pause()","—","nonpayable"]},{"cells":["pauseSystems(uint192 mask)","—","nonpayable"]},{"cells":["paused()","bool","view"]},{"cells":["pendingGovernorReconfiguration()","bytes32 setDigest, uint64 validAfter, uint64 expiresAt","view"]},{"cells":["pendingGovernors()","address[]","view"]},{"cells":["pendingUpgrade()","address implementation, uint64 readyAt","view"]},{"cells":["policyKey(address target, bytes4 selector)","bytes32","pure"]},{"cells":["proxiableUUID()","bytes32","view"]},{"cells":["requireSystemsActive(uint192 mask)","—","view"]},{"cells":["resolveModule(bytes32 moduleId)","address active","view"]},{"cells":["resumeSystems(uint192 mask, uint64 expectedRevision)","—","nonpayable"]},{"cells":["revokeSignature(bytes32 digest)","—","nonpayable"]},{"cells":["rpcHostCount()","uint256","view"]},{"cells":["rpcHostList()","string[] hosts, uint64 revision, uint64 listEpoch, uint64 currentEpoch, bytes32 digest","view"]},{"cells":["rpcHostListPreimage(string[] hosts, uint64 revision, uint64 epoch)","bytes","view"]},{"cells":["scheduleGovernorReconfiguration(address[] nextGovernors, uint64 validAfter, uint64 expiresAt, uint64 expectedEpoch, uint64 expectedChangeNonce, (address,bytes)[] acceptances)","—","nonpayable"]},{"cells":["scheduleUpgrade(address newImplementation)","—","nonpayable"]},{"cells":["signatureApproval(bytes32 digest)","uint64 validUntil","view"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","pure"]},{"cells":["systemPauseState()","uint192 flags, uint64 revision","view"]},{"cells":["unpause()","—","nonpayable"]},{"cells":["upgradeToAndCall(address newImplementation, bytes data)","—","payable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccountTierConfigured(address indexed account, uint8 indexed previousTier, uint8 indexed nextTier)"]},{"cells":["AutomationCapabilityConfigured(address indexed signer, address indexed target, bytes4 indexed selector, uint64 validAfter, uint64 validUntil, uint96 maxValue, bool enabled, uint256 keyGeneration)"]},{"cells":["AutomationExecuted(address indexed signer, address indexed relayer, address indexed target, bytes4 selector, uint256 nonce, uint256 value)"]},{"cells":["AutomationKeyConfigured(address indexed signer, uint64 validUntil, uint256 nonce, uint256 keyGeneration)"]},{"cells":["EIP712DomainChanged()"]},{"cells":["ExecutionPolicyConfigured(address indexed target, bytes4 indexed selector, uint8 minimumTier, uint96 maxValue, bool enabled, uint256 policyNonce)"]},{"cells":["GovernanceExecuted(bytes32 indexed digest, uint256 indexed nonce, address indexed target, uint256 value, bytes4 selector)"]},{"cells":["GovernorReconfigurationActivated(bytes32 indexed governorSetDigest, uint64 indexed epoch, uint256 governorCount, uint256 threshold)"]},{"cells":["GovernorReconfigurationCancelled(bytes32 indexed governorSetDigest)"]},{"cells":["GovernorReconfigurationExpired(bytes32 indexed governorSetDigest)"]},{"cells":["GovernorReconfigurationScheduled(bytes32 indexed governorSetDigest, uint64 indexed nextEpoch, uint64 validAfter, uint64 expiresAt, uint256 governorCount, uint256 threshold)"]},{"cells":["Initialized(uint64 version)"]},{"cells":["ManagerPaused(address indexed account)"]},{"cells":["ManagerUnpaused()"]},{"cells":["ModuleConfigured(bytes32 indexed moduleId, address indexed previousModule, address indexed activeModule, uint64 revision, bytes32 codeHash)"]},{"cells":["ModuleFrozen(bytes32 indexed moduleId, address indexed activeModule, uint64 revision)"]},{"cells":["RoleExecuted(address indexed executor, address indexed target, bytes4 indexed selector, uint256 value)"]},{"cells":["RpcHostListConfigured(bytes32 indexed digest, uint64 revision, uint64 epoch, uint256 hostCount)"]},{"cells":["SignatureApproved(bytes32 indexed digest, uint64 validUntil)"]},{"cells":["SignatureRevoked(bytes32 indexed digest)"]},{"cells":["SystemsPaused(uint192 flags, uint64 revision, address indexed operator)"]},{"cells":["UpgradeCancelled(address indexed implementation)"]},{"cells":["UpgradeScheduled(address indexed implementation, uint64 readyAt)"]},{"cells":["Upgraded(address indexed implementation)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AddressEmptyCode(address target)"]},{"cells":["AutomationCapabilityMissing()"]},{"cells":["AutomationKeyInactive()"]},{"cells":["CodeHashMismatch(bytes32 actual, bytes32 expected)"]},{"cells":["ERC1967InvalidImplementation(address implementation)"]},{"cells":["ERC1967NonPayable()"]},{"cells":["ExecutionNotAllowed()"]},{"cells":["FailedCall()"]},{"cells":["GovernorAlreadyExists()"]},{"cells":["GovernorChangeExpired()"]},{"cells":["GovernorChangeMissing()"]},{"cells":["GovernorChangeNotReady()"]},{"cells":["GovernorChangePending()"]},{"cells":["GovernorMissing()"]},{"cells":["GovernorSignaturesNotSorted()"]},{"cells":["GovernorThresholdNotMet(uint256 supplied, uint256 required)"]},{"cells":["IncorrectValue(uint256 expected, uint256 received)"]},{"cells":["InvalidAccessTier()"]},{"cells":["InvalidApproval()"]},{"cells":["InvalidGovernorChange()"]},{"cells":["InvalidGovernorSet()"]},{"cells":["InvalidGovernorSignature(address signer)"]},{"cells":["InvalidImplementation()"]},{"cells":["InvalidInitialization()"]},{"cells":["InvalidModule()"]},{"cells":["InvalidPauseMask()"]},{"cells":["InvalidRpcHostList()"]},{"cells":["InvalidSelector()"]},{"cells":["InvalidShortString()"]},{"cells":["InvalidSignature()"]},{"cells":["InvalidTarget()"]},{"cells":["InvalidValidityWindow()"]},{"cells":["ManagerAlreadyPaused()"]},{"cells":["ManagerIsPaused()"]},{"cells":["ManagerNotPaused()"]},{"cells":["ModuleIsFrozen()"]},{"cells":["ModuleUnavailable(bytes32 moduleId)"]},{"cells":["NotInitializing()"]},{"cells":["ProtectedCapability(bytes4 selector)"]},{"cells":["ProtectedManagerFunction()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["RpcHostListRevisionMismatch(uint64 supplied, uint64 current)"]},{"cells":["SignatureExpired()"]},{"cells":["StalePauseRevision()"]},{"cells":["StringTooLong(string str)"]},{"cells":["SystemsUnavailable(uint192 flags)"]},{"cells":["UUPSUnauthorizedCallContext()"]},{"cells":["UUPSUnsupportedProxiableUUID(bytes32 slot)"]},{"cells":["UnauthorizedRole()"]},{"cells":["UnauthorizedSelfCall()"]},{"cells":["UpgradeAlreadyScheduled()"]},{"cells":["UpgradeNotReady(uint64 readyAt)"]},{"cells":["UpgradeNotScheduled()"]},{"cells":["ValueLimitExceeded()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor()","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keeltestownermanager","title":"KeelTestOwnerManager","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelTestOwnerManager","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelTestOwnerManager.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelTestOwnerManager.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["AUTOMATION_ACTION_TYPEHASH()","bytes32","view"]},{"cells":["CHANGE_ADMIN_SELECTOR()","bytes4","view"]},{"cells":["CONTRACT_SIGNATURE_TYPEHASH()","bytes32","view"]},{"cells":["ERC1271_INVALID_VALUE()","bytes4","view"]},{"cells":["ERC1271_MAGIC_VALUE()","bytes4","view"]},{"cells":["GOVERNANCE_ACTION_TYPEHASH()","bytes32","view"]},{"cells":["GOVERNANCE_DENOMINATOR()","uint256","view"]},{"cells":["GOVERNANCE_NUMERATOR()","uint256","view"]},{"cells":["GOVERNOR_ACCEPTANCE_TYPEHASH()","bytes32","view"]},{"cells":["GOVERNOR_SET_TYPEHASH()","bytes32","view"]},{"cells":["MANAGER_VERSION()","string","view"]},{"cells":["MAX_AUTOMATION_KEY_LIFETIME()","uint64","view"]},{"cells":["MAX_GOVERNORS()","uint256","view"]},{"cells":["MAX_GOVERNOR_ACTIVATION_WINDOW()","uint64","view"]},{"cells":["MAX_GOVERNOR_SCHEDULING_DELAY()","uint64","view"]},{"cells":["MAX_RPC_HOSTS()","uint256","view"]},{"cells":["MAX_RPC_HOST_BYTES()","uint256","view"]},{"cells":["MAX_SIGNATURE_APPROVAL_DURATION()","uint64","view"]},{"cells":["MIN_GOVERNORS()","uint256","view"]},{"cells":["MIN_GOVERNOR_ACTIVATION_WINDOW()","uint64","view"]},{"cells":["MIN_GOVERNOR_ROTATION_DELAY()","uint64","view"]},{"cells":["RENOUNCE_OWNERSHIP_SELECTOR()","bytes4","view"]},{"cells":["RPC_HOST_LIST_DOMAIN()","string","view"]},{"cells":["SET_ADMIN_SELECTOR()","bytes4","view"]},{"cells":["TEST_MIN_GOVERNORS()","uint256","view"]},{"cells":["TRANSFER_OWNERSHIP_SELECTOR()","bytes4","view"]},{"cells":["UPGRADE_DELAY()","uint64","view"]},{"cells":["UPGRADE_INTERFACE_VERSION()","string","view"]},{"cells":["UPGRADE_TO_SELECTOR()","bytes4","view"]},{"cells":["accountTier(address account)","uint8","view"]},{"cells":["accountTierNonce(address account)","uint256","view"]},{"cells":["activateGovernorReconfiguration()","—","nonpayable"]},{"cells":["approveSignature(bytes32 digest, uint64 validUntil)","—","nonpayable"]},{"cells":["automationActionDigest(address signer, (address,uint256,bytes) call_, uint64 deadline)","bytes32","view"]},{"cells":["automationCapability(address signer, address target, bytes4 selector)","(uint96,uint64,uint64,bool,uint256)","view"]},{"cells":["automationKeyState(address signer)","(uint64,uint256,uint256) state","view"]},{"cells":["banner()","string","pure"]},{"cells":["cancelGovernorReconfiguration()","—","nonpayable"]},{"cells":["cancelUpgrade()","—","nonpayable"]},{"cells":["capabilityIsProtected(bytes4 selector)","bool","pure"]},{"cells":["computeRpcHostListDigest(string[] hosts, uint64 revision, uint64 epoch)","bytes32","view"]},{"cells":["configureAccountTier(address account, uint8 tier)","—","nonpayable"]},{"cells":["configureAutomationCapability(address signer, address target, bytes4 selector, uint64 validAfter, uint64 validUntil, uint96 maxValue, bool enabled)","—","nonpayable"]},{"cells":["configureAutomationKey(address signer, uint64 validUntil)","—","nonpayable"]},{"cells":["configureExecutionPolicy(address target, bytes4 selector, uint8 minimumTier, uint96 maxValue, bool enabled)","—","nonpayable"]},{"cells":["configureModule(bytes32 moduleId, address activeModule, bytes32 expectedCodeHash)","—","nonpayable"]},{"cells":["configureRpcHostList(string[] hosts, uint64 expectedRevision)","—","nonpayable"]},{"cells":["contractSignatureDigest(bytes32 digest, uint64 deadline)","bytes32","view"]},{"cells":["decodeSignatureEnvelope(bytes encoded)","uint64 deadline, uint64 epoch, (address,bytes)[] signatures","pure"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["executeAutomation(address signer, (address,uint256,bytes) call_, uint64 deadline, bytes signature)","bytes result","payable"]},{"cells":["executeGovernance((address,uint256,bytes) call_, uint64 deadline, (address,bytes)[] signatures)","bytes result","payable"]},{"cells":["executeRole((address,uint256,bytes) call_)","bytes result","payable"]},{"cells":["executionMode()","uint8","view"]},{"cells":["executionPolicyState(address target, bytes4 selector)","(uint96,uint8,bool,uint256) state","view"]},{"cells":["expireGovernorReconfiguration()","—","nonpayable"]},{"cells":["freezeModule(bytes32 moduleId)","—","nonpayable"]},{"cells":["governanceActionDigest((address,uint256,bytes) call_, uint64 deadline)","bytes32","view"]},{"cells":["governanceEpoch()","uint64","view"]},{"cells":["governanceState()","(uint256,uint256,uint64,uint64) state","view"]},{"cells":["governorSetDigest(address[] nextGovernors, uint64 validAfter, uint64 expiresAt, uint64 nextEpoch, uint64 changeNonce)","bytes32","view"]},{"cells":["governors()","address[]","view"]},{"cells":["initialize(address[] initialGovernors, address[] initialAdmins, address[] initialModerators)","—","nonpayable"]},{"cells":["isGovernor(address account)","bool","view"]},{"cells":["isValidSignature(bytes32 digest, bytes signature)","bytes4","view"]},{"cells":["module(bytes32 moduleId)","(address,uint64,bool,bytes32)","view"]},{"cells":["newGovernorAcceptanceDigest(bytes32 setDigest, address governor)","bytes32","view"]},{"cells":["pause()","—","nonpayable"]},{"cells":["pauseSystems(uint192 mask)","—","nonpayable"]},{"cells":["paused()","bool","view"]},{"cells":["pendingGovernorReconfiguration()","bytes32 setDigest, uint64 validAfter, uint64 expiresAt","view"]},{"cells":["pendingGovernors()","address[]","view"]},{"cells":["pendingUpgrade()","address implementation, uint64 readyAt","view"]},{"cells":["policyKey(address target, bytes4 selector)","bytes32","pure"]},{"cells":["proxiableUUID()","bytes32","view"]},{"cells":["requireSystemsActive(uint192 mask)","—","view"]},{"cells":["resolveModule(bytes32 moduleId)","address active","view"]},{"cells":["resumeSystems(uint192 mask, uint64 expectedRevision)","—","nonpayable"]},{"cells":["revokeSignature(bytes32 digest)","—","nonpayable"]},{"cells":["rpcHostCount()","uint256","view"]},{"cells":["rpcHostList()","string[] hosts, uint64 revision, uint64 listEpoch, uint64 currentEpoch, bytes32 digest","view"]},{"cells":["rpcHostListPreimage(string[] hosts, uint64 revision, uint64 epoch)","bytes","view"]},{"cells":["scheduleGovernorReconfiguration(address[] nextGovernors, uint64 validAfter, uint64 expiresAt, uint64 expectedEpoch, uint64 expectedChangeNonce, (address,bytes)[] acceptances)","—","nonpayable"]},{"cells":["scheduleUpgrade(address newImplementation)","—","nonpayable"]},{"cells":["signatureApproval(bytes32 digest)","uint64 validUntil","view"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","pure"]},{"cells":["systemPauseState()","uint192 flags, uint64 revision","view"]},{"cells":["unpause()","—","nonpayable"]},{"cells":["upgradeToAndCall(address newImplementation, bytes data)","—","payable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccountTierConfigured(address indexed account, uint8 indexed previousTier, uint8 indexed nextTier)"]},{"cells":["AutomationCapabilityConfigured(address indexed signer, address indexed target, bytes4 indexed selector, uint64 validAfter, uint64 validUntil, uint96 maxValue, bool enabled, uint256 keyGeneration)"]},{"cells":["AutomationExecuted(address indexed signer, address indexed relayer, address indexed target, bytes4 selector, uint256 nonce, uint256 value)"]},{"cells":["AutomationKeyConfigured(address indexed signer, uint64 validUntil, uint256 nonce, uint256 keyGeneration)"]},{"cells":["EIP712DomainChanged()"]},{"cells":["ExecutionPolicyConfigured(address indexed target, bytes4 indexed selector, uint8 minimumTier, uint96 maxValue, bool enabled, uint256 policyNonce)"]},{"cells":["GovernanceExecuted(bytes32 indexed digest, uint256 indexed nonce, address indexed target, uint256 value, bytes4 selector)"]},{"cells":["GovernorReconfigurationActivated(bytes32 indexed governorSetDigest, uint64 indexed epoch, uint256 governorCount, uint256 threshold)"]},{"cells":["GovernorReconfigurationCancelled(bytes32 indexed governorSetDigest)"]},{"cells":["GovernorReconfigurationExpired(bytes32 indexed governorSetDigest)"]},{"cells":["GovernorReconfigurationScheduled(bytes32 indexed governorSetDigest, uint64 indexed nextEpoch, uint64 validAfter, uint64 expiresAt, uint256 governorCount, uint256 threshold)"]},{"cells":["Initialized(uint64 version)"]},{"cells":["ManagerPaused(address indexed account)"]},{"cells":["ManagerUnpaused()"]},{"cells":["ModuleConfigured(bytes32 indexed moduleId, address indexed previousModule, address indexed activeModule, uint64 revision, bytes32 codeHash)"]},{"cells":["ModuleFrozen(bytes32 indexed moduleId, address indexed activeModule, uint64 revision)"]},{"cells":["RoleExecuted(address indexed executor, address indexed target, bytes4 indexed selector, uint256 value)"]},{"cells":["RpcHostListConfigured(bytes32 indexed digest, uint64 revision, uint64 epoch, uint256 hostCount)"]},{"cells":["SignatureApproved(bytes32 indexed digest, uint64 validUntil)"]},{"cells":["SignatureRevoked(bytes32 indexed digest)"]},{"cells":["SystemsPaused(uint192 flags, uint64 revision, address indexed operator)"]},{"cells":["UpgradeCancelled(address indexed implementation)"]},{"cells":["UpgradeScheduled(address indexed implementation, uint64 readyAt)"]},{"cells":["Upgraded(address indexed implementation)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AddressEmptyCode(address target)"]},{"cells":["AutomationCapabilityMissing()"]},{"cells":["AutomationKeyInactive()"]},{"cells":["CodeHashMismatch(bytes32 actual, bytes32 expected)"]},{"cells":["ERC1967InvalidImplementation(address implementation)"]},{"cells":["ERC1967NonPayable()"]},{"cells":["ExecutionNotAllowed()"]},{"cells":["FailedCall()"]},{"cells":["GovernorAlreadyExists()"]},{"cells":["GovernorChangeExpired()"]},{"cells":["GovernorChangeMissing()"]},{"cells":["GovernorChangeNotReady()"]},{"cells":["GovernorChangePending()"]},{"cells":["GovernorMissing()"]},{"cells":["GovernorSignaturesNotSorted()"]},{"cells":["GovernorThresholdNotMet(uint256 supplied, uint256 required)"]},{"cells":["IncorrectValue(uint256 expected, uint256 received)"]},{"cells":["InvalidAccessTier()"]},{"cells":["InvalidApproval()"]},{"cells":["InvalidGovernorChange()"]},{"cells":["InvalidGovernorSet()"]},{"cells":["InvalidGovernorSignature(address signer)"]},{"cells":["InvalidImplementation()"]},{"cells":["InvalidInitialization()"]},{"cells":["InvalidModule()"]},{"cells":["InvalidPauseMask()"]},{"cells":["InvalidRpcHostList()"]},{"cells":["InvalidSelector()"]},{"cells":["InvalidShortString()"]},{"cells":["InvalidSignature()"]},{"cells":["InvalidTarget()"]},{"cells":["InvalidValidityWindow()"]},{"cells":["ManagerAlreadyPaused()"]},{"cells":["ManagerIsPaused()"]},{"cells":["ManagerNotPaused()"]},{"cells":["ModuleIsFrozen()"]},{"cells":["ModuleUnavailable(bytes32 moduleId)"]},{"cells":["NotInitializing()"]},{"cells":["ProtectedCapability(bytes4 selector)"]},{"cells":["ProtectedManagerFunction()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["RpcHostListRevisionMismatch(uint64 supplied, uint64 current)"]},{"cells":["SignatureExpired()"]},{"cells":["StalePauseRevision()"]},{"cells":["StringTooLong(string str)"]},{"cells":["SystemsUnavailable(uint192 flags)"]},{"cells":["UUPSUnauthorizedCallContext()"]},{"cells":["UUPSUnsupportedProxiableUUID(bytes32 slot)"]},{"cells":["UnauthorizedRole()"]},{"cells":["UnauthorizedSelfCall()"]},{"cells":["UnsupportedTestChain(uint256 chainId)"]},{"cells":["UpgradeAlreadyScheduled()"]},{"cells":["UpgradeNotReady(uint64 readyAt)"]},{"cells":["UpgradeNotScheduled()"]},{"cells":["ValueLimitExceeded()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor()","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelmanagerproxy","title":"KeelManagerProxy","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelManagerProxy","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelManagerProxy.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelManagerProxy.json"},{"label":"Sepolia showcase · 0x7cb6d62cdd968ba45a8a1f0d99a02e5e274fe6e3","href":"https://sepolia.etherscan.io/address/0x7cb6d62cdd968ba45a8a1f0d99a02e5e274fe6e3#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["RECOVERY_SCOPE()","bytes32","view"]},{"cells":["configureBackup(bytes32 nextGroup, uint64 revision, uint64 deadline, (address,bytes)[] currentApprovals, (address,bytes)[] incomingApprovals)","—","nonpayable"]},{"cells":["recoverGovernors(address[] governors, uint64 deadline, (address,bytes)[] approvals, (address,bytes)[] acceptances)","—","nonpayable"]},{"cells":["recoveryGroups()","address","view"]},{"cells":["upgradeWithBackup(address implementation, bytes initializer, uint64 deadline, (address,bytes)[] approvals)","—","nonpayable"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["ManagerRecovered(uint64 governanceEpoch, uint64 recoveryEpoch, address[] governors)"]},{"cells":["Upgraded(address indexed implementation)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AddressEmptyCode(address target)"]},{"cells":["ERC1967InvalidImplementation(address implementation)"]},{"cells":["ERC1967NonPayable()"]},{"cells":["ERC1967ProxyUninitialized()"]},{"cells":["FailedCall()"]},{"cells":["InvalidRecoveryGovernors()"]},{"cells":["InvalidRecoveryGroup()"]},{"cells":["InvalidRecoveryRoster()"]},{"cells":["InvalidRecoverySignatures()"]},{"cells":["RecoveryExpired()"]},{"cells":["RecoveryLocked()"]},{"cells":["RecoveryNotConfigured()"]},{"cells":["RecoveryRevisionMismatch()"]},{"cells":["ReentrancyGuardReentrantCall()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address implementation, bytes initializer)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelseedregistry","title":"KeelSeedRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelSeedRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelSeedRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelSeedRegistry.json"},{"label":"Sepolia showcase · 0xf6b301e56c813692aeb75b9659864c7e76cf4c8b","href":"https://sepolia.etherscan.io/address/0xf6b301e56c813692aeb75b9659864c7e76cf4c8b#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["MINT_SEED_SET_COMMITMENT_DOMAIN()","bytes32","view"]},{"cells":["MINT_TOKEN_SEED_DOMAIN()","bytes32","view"]},{"cells":["SEED_SET_COMMITMENT_DOMAIN()","bytes32","view"]},{"cells":["SEED_SET_ID_DOMAIN()","bytes32","view"]},{"cells":["TOKEN_SEED_DOMAIN()","bytes32","view"]},{"cells":["computeMintSeedSetCommitment(bytes32 harnessId, uint64 harnessRevision, bytes32 rootSeed, bytes32 provenanceDigest)","bytes32","pure"]},{"cells":["computeSeedSetCommitment(bytes32 harnessId, uint64 harnessRevision, bytes32 rootSeed, bytes32 provenanceDigest)","bytes32","pure"]},{"cells":["deriveTokenSeed(bytes32 seedSetId, uint256 tokenId)","bytes32","view"]},{"cells":["harnessRegistry()","address","view"]},{"cells":["keelIndex()","address","view"]},{"cells":["mintEntropyEnabled(bytes32 seedSetId)","bool enabled","view"]},{"cells":["predictSeedSetId(bytes32 harnessId, uint64 harnessRevision)","bytes32","pure"]},{"cells":["publishMintSeedSet(bytes32 harnessId, uint64 harnessRevision, bytes32 rootSeed, bytes32 provenanceDigest)","bytes32 seedSetId","nonpayable"]},{"cells":["publishSeedSet(bytes32 harnessId, uint64 harnessRevision, bytes32 rootSeed, bytes32 provenanceDigest)","bytes32 seedSetId","nonpayable"]},{"cells":["seedSet(bytes32 seedSetId)","(bytes32,uint64,address,bytes32,bytes32,bytes32,uint64,address,address,bool)","view"]},{"cells":["seedSetCollection(bytes32 seedSetId)","address","view"]},{"cells":["seedSetForHarnessRevision(bytes32 harnessId, uint64 harnessRevision)","(bytes32,uint64,address,bytes32,bytes32,bytes32,uint64,address,address,bool)","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["SeedSetPublished(uint64 indexed harnessRevision, bytes32 rootSeed, bytes32 indexed seedSetId, bytes32 indexed harnessId, bytes32 provenanceDigest, bytes32 harnessManifestDigest, address revealer, address publisher, address collection)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["HarnessRevisionMissing()"]},{"cells":["InvalidCommitment()"]},{"cells":["InvalidContract()"]},{"cells":["MintSeedMissing()"]},{"cells":["RegistryMismatch()"]},{"cells":["SeedSetAlreadyExists()"]},{"cells":["SeedSetCommitmentMismatch()"]},{"cells":["SeedSetMissing()"]},{"cells":["SeedSetNotCommitted()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address harnessRegistry_, address keelIndex_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelmanagerrecovery","title":"KeelManagerRecovery","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelManagerRecovery","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelManagerRecovery.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelManagerRecovery.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["restore(address[] governors)","—","nonpayable"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["ManagerRecovered(uint64 governanceEpoch, uint64 recoveryEpoch, address[] governors)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidRecoveryGovernors()"]}],"caption":"Custom errors","collapsed":true}]}]},{"id":"keelmanagerrpcpolicy","title":"KeelManagerRpcPolicy","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelManagerRpcPolicy","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelManagerRpcPolicy.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelManagerRpcPolicy.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["configureRpcHostList(string[] hosts, uint64 expectedRevision)","—","nonpayable"]},{"cells":["preimage(string[] hosts, uint64 revision, uint64 epoch, string domain)","bytes result","pure"]},{"cells":["validate(string[] hosts, uint256 maximumBytes)","—","pure"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["RpcHostListConfigured(bytes32 indexed digest, uint64 revision, uint64 epoch, uint256 hostCount)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidRpcHostList()"]},{"cells":["RpcHostListRevisionMismatch(uint64 supplied, uint64 current)"]}],"caption":"Custom errors","collapsed":true}]}]},{"id":"keellinkuribuilder","title":"KeelLinkURIBuilder","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelLinkURIBuilder","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelLinkURIBuilder.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelLinkURIBuilder.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["arweaveGateway()","string","view"]},{"cells":["assetDisplayObjectId()","bytes32","view"]},{"cells":["buildURI(bytes32 linkId)","string","view"]},{"cells":["ipfsGateway()","string","view"]},{"cells":["keelHold()","address","view"]},{"cells":["linkRegistry()","address","view"]},{"cells":["maxResponseBytes()","uint64","view"]},{"cells":["prefixObjectId()","bytes32","view"]},{"cells":["shellId()","bytes32","view"]},{"cells":["suffixObjectId()","bytes32","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["FragmentMismatch()"]},{"cells":["InvalidConfiguration()"]},{"cells":["ResponseTooLarge()"]},{"cells":["StringsInsufficientHexLength(uint256 value, uint256 length)"]},{"cells":["UnsupportedLink()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address registry, bytes32 shellId_, (uint64,string,string,bytes32,bytes32,bytes32) config)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelrawfragmentvalidationregistry","title":"KeelRawFragmentValidationRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelRawFragmentValidationRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelRawFragmentValidationRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelRawFragmentValidationRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["MAX_SCAN_BYTES()","uint32","view"]},{"cells":["builder()","address","view"]},{"cells":["imageValidationProgress(bytes32 objectId)","bytes32 digest, uint64 offset, uint8 paddingState","view"]},{"cells":["requireVerifiedRawShellParts(address hold_, bytes32 prefix, bytes32 suffix)","—","view"]},{"cells":["validate(bytes32 objectId, bytes32 digest)","bool","nonpayable"]},{"cells":["validateImage(bytes32 objectId, bytes32 digest)","bool","nonpayable"]},{"cells":["validationProgress(bytes32 objectId)","bytes32 digest, uint64 offset, uint8 percentState","view"]},{"cells":["verifiedDigest(bytes32)","bytes32","view"]},{"cells":["verifiedImageDigest(bytes32)","bytes32","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["FragmentValidationProgress(uint8 percentState, uint64 nextOffset, bytes32 indexed digest, bytes32 indexed objectId)"]},{"cells":["FragmentVerified(bytes32 indexed digest, bytes32 indexed objectId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidSource()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address builder_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelrawfragmentrevisionpolicy","title":"KeelRawFragmentRevisionPolicy","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelRawFragmentRevisionPolicy","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelRawFragmentRevisionPolicy.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelRawFragmentRevisionPolicy.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["artifactRegistry()","address","view"]},{"cells":["builder()","address","view"]},{"cells":["validateRevisionAppend(bytes32, uint64, address, bytes32 contentObjectId, uint8 algorithm, bytes32 digest, bytes32, bytes32)","—","view"]},{"cells":["validationRegistry()","address","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidRevision()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address registry_, address builder_, address validationRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelrawimagerevisionpolicy","title":"KeelRawImageRevisionPolicy","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelRawImageRevisionPolicy","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelRawImageRevisionPolicy.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelRawImageRevisionPolicy.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["IMAGE_URI_PROFILE()","bytes32","view"]},{"cells":["artifactRegistry()","address","view"]},{"cells":["builder()","address","view"]},{"cells":["validateRevisionAppend(bytes32, uint64, address, bytes32 contentObjectId, uint8 algorithm, bytes32 digest, bytes32, bytes32)","—","view"]},{"cells":["validationRegistry()","address","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidRevision()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address registry_, address builder_, address validationRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelartifactfragmentresolver","title":"KeelArtifactFragmentResolver","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelArtifactFragmentResolver","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelArtifactFragmentResolver.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelArtifactFragmentResolver.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["artifactRegistry()","address","view"]},{"cells":["builder()","address","view"]},{"cells":["handles()","bytes32[]","view"]},{"cells":["requiredPolicy()","address","view"]},{"cells":["resolve()","uint64[] revisions, bytes32[] objects, bytes32[] digests","view"]},{"cells":["resolveAt(uint64[] revisions)","bytes32[] objects, bytes32[] digests","view"]},{"cells":["tokenURI(bytes rawPrefix, bytes rawSuffix)","string","view"]},{"cells":["tokenURIAt(uint64[] revisions, bytes rawPrefix, bytes rawSuffix)","string","view"]},{"cells":["validationRegistry()","address","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidHandles()"]},{"cells":["InvalidSource()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address registry_, address builder_, address requiredPolicy_, bytes32[] handles_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelregisteredartifactfragmentresolver","title":"KeelRegisteredArtifactFragmentResolver","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelRegisteredArtifactFragmentResolver","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/KeelRegisteredArtifactFragmentResolver.sol"},{"label":"Download ABI","href":"/docs/abi/keel-artifacts/KeelRegisteredArtifactFragmentResolver.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["artifactRegistry()","address","view"]},{"cells":["body()","address","view"]},{"cells":["builder()","address","view"]},{"cells":["handles()","bytes32[] result","view"]},{"cells":["imageHandle()","bytes32","view"]},{"cells":["imagePolicy()","address","view"]},{"cells":["imageURIAt(uint64 revision)","string","view"]},{"cells":["resolve()","uint64[] revisions, bytes32[] objects, bytes32[] digests","view"]},{"cells":["resolveAt(uint64[] revisions)","bytes32[] objects, bytes32[] digests","view"]},{"cells":["shellId()","bytes32","view"]},{"cells":["shellRegistry()","address","view"]},{"cells":["tokenURI(bytes prefix, bytes suffix)","string","view"]},{"cells":["tokenURIAt(uint64[] revisions, bytes prefix, bytes suffix)","string","view"]},{"cells":["validationRegistry()","address","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidBinding()"]},{"cells":["InvalidSource()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address body_, address shellRegistry_, bytes32 imageHandle_, address imagePolicy_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelAccessController, KeelArtifactRegistry, KeelHarnessRegistry, KeelImmutableCheckpointRegistry, KeelLinkRegistry, KeelManager, KeelSeedRegistry, KeelSignatureAuthority","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-artifacts/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-artifacts/tezos"},{"label":"Compilation targets","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/script/tezos/keel-artifacts"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["forge_artifact","entrypoint","keel_artifact_registry.py"]},{"cells":["forge_artifact_for","entrypoint","keel_artifact_registry.py"]},{"cells":["forge_with_revision_policy","entrypoint","keel_artifact_registry.py"]},{"cells":["set_publication_job","entrypoint","keel_artifact_registry.py"]},{"cells":["append_artifact_revision","entrypoint","keel_artifact_registry.py"]},{"cells":["set_forging_fee","entrypoint","keel_artifact_registry.py"]},{"cells":["claim_protocol_fees","entrypoint","keel_artifact_registry.py"]},{"cells":["default","entrypoint","keel_artifact_registry.py"]},{"cells":["set_revision_policy","entrypoint","keel_artifact_registry.py"]},{"cells":["freeze_artifact","entrypoint","keel_artifact_registry.py"]},{"cells":["keel_hold","onchain_view","keel_artifact_registry.py"]},{"cells":["manager","onchain_view","keel_artifact_registry.py"]},{"cells":["publication_job","onchain_view","keel_artifact_registry.py"]},{"cells":["forging_fee","onchain_view","keel_artifact_registry.py"]},{"cells":["protocol_fee_recipient","onchain_view","keel_artifact_registry.py"]},{"cells":["protocol_fees_accrued","onchain_view","keel_artifact_registry.py"]},{"cells":["predict_artifact_id","onchain_view","keel_artifact_registry.py"]},{"cells":["artifact_lineage","onchain_view","keel_artifact_registry.py"]},{"cells":["artifact_revision","onchain_view","keel_artifact_registry.py"]},{"cells":["artifact_revision_exists","onchain_view","keel_artifact_registry.py"]},{"cells":["revision_policy","onchain_view","keel_artifact_registry.py"]},{"cells":["latest_artifact_revision","onchain_view","keel_artifact_registry.py"]},{"cells":["artifact_revision_descriptor","onchain_view","keel_artifact_registry.py"]},{"cells":["artifact_revision_source","onchain_view","keel_artifact_registry.py"]},{"cells":["artifact_owner","onchain_view","keel_artifact_registry.py"]},{"cells":["artifact_creator","onchain_view","keel_artifact_registry.py"]},{"cells":["can_edit_artifact","onchain_view","keel_artifact_registry.py"]},{"cells":["artifact_is_frozen","onchain_view","keel_artifact_registry.py"]},{"cells":["forge_harness","entrypoint","keel_harness_registry.py"]},{"cells":["forge_harness_for","entrypoint","keel_harness_registry.py"]},{"cells":["set_publication_job","entrypoint","keel_harness_registry.py"]},{"cells":["append_harness_revision","entrypoint","keel_harness_registry.py"]},{"cells":["freeze_harness","entrypoint","keel_harness_registry.py"]},{"cells":["fork_harness_for_token","entrypoint","keel_harness_registry.py"]},{"cells":["cancel_pending_fork","entrypoint","keel_harness_registry.py"]},{"cells":["activate_fork","entrypoint","keel_harness_registry.py"]},{"cells":["freeze_token_fork","entrypoint","keel_harness_registry.py"]},{"cells":["keel_index","onchain_view","keel_harness_registry.py"]},{"cells":["artifact_registry","onchain_view","keel_harness_registry.py"]},{"cells":["manager","onchain_view","keel_harness_registry.py"]},{"cells":["publication_job","onchain_view","keel_harness_registry.py"]},{"cells":["harness_lineage","onchain_view","keel_harness_registry.py"]},{"cells":["predict_harness_id","onchain_view","keel_harness_registry.py"]},{"cells":["harness_creator","onchain_view","keel_harness_registry.py"]},{"cells":["harness_revision","onchain_view","keel_harness_registry.py"]},{"cells":["harness_revision_exists","onchain_view","keel_harness_registry.py"]},{"cells":["latest_harness_revision","onchain_view","keel_harness_registry.py"]},{"cells":["harness_collection","onchain_view","keel_harness_registry.py"]},{"cells":["harness_revision_commitment","onchain_view","keel_harness_registry.py"]},{"cells":["harness_revision_publisher","onchain_view","keel_harness_registry.py"]},{"cells":["harness_slots","onchain_view","keel_harness_registry.py"]},{"cells":["token_fork_lineage","onchain_view","keel_harness_registry.py"]},{"cells":["token_fork_revision","onchain_view","keel_harness_registry.py"]},{"cells":["token_fork_selections","onchain_view","keel_harness_registry.py"]},{"cells":["effective_harness","onchain_view","keel_harness_registry.py"]},{"cells":["begin_checkpoint","entrypoint","keel_immutable_checkpoint.py"]},{"cells":["append_checkpoint_slug","entrypoint","keel_immutable_checkpoint.py"]},{"cells":["seal_checkpoint","entrypoint","keel_immutable_checkpoint.py"]},{"cells":["predict_object_id","onchain_view","keel_immutable_checkpoint.py"]},{"cells":["get_checkpoint","onchain_view","keel_immutable_checkpoint.py"]},{"cells":["read_checkpoint_pointer","onchain_view","keel_immutable_checkpoint.py"]},{"cells":["get_immutable_object","onchain_view","keel_immutable_checkpoint.py"]},{"cells":["harness_html","onchain_view","keel_immutable_checkpoint.py"]},{"cells":["harness_html_with_context","onchain_view","keel_immutable_checkpoint.py"]},{"cells":["read_immutable_object","onchain_view","keel_immutable_checkpoint.py"]},{"cells":["publish_fidelity_links","entrypoint","keel_link_registry.py"]},{"cells":["artifact_registry","onchain_view","keel_link_registry.py"]},{"cells":["predict_link_id","onchain_view","keel_link_registry.py"]},{"cells":["compute_link_set_digest","onchain_view","keel_link_registry.py"]},{"cells":["fidelity_link","onchain_view","keel_link_registry.py"]},{"cells":["link_by_id","onchain_view","keel_link_registry.py"]},{"cells":["link_exists","onchain_view","keel_link_registry.py"]},{"cells":["link_set","onchain_view","keel_link_registry.py"]},{"cells":["propose","entrypoint","keel_manager.py"]},{"cells":["approve","entrypoint","keel_manager.py"]},{"cells":["schedule_governor_change","entrypoint","keel_manager.py"]},{"cells":["accept_governor_reconfiguration","entrypoint","keel_manager.py"]},{"cells":["cancel_governor_reconfiguration","entrypoint","keel_manager.py"]},{"cells":["activate_governor_change","entrypoint","keel_manager.py"]},{"cells":["expire_governor_reconfiguration","entrypoint","keel_manager.py"]},{"cells":["configure_module","entrypoint","keel_manager.py"]},{"cells":["freeze_module","entrypoint","keel_manager.py"]},{"cells":["configure_rpc_host_list","entrypoint","keel_manager.py"]},{"cells":["rpc_host_list","onchain_view","keel_manager.py"]},{"cells":["rpc_host_count","onchain_view","keel_manager.py"]},{"cells":["module","onchain_view","keel_manager.py"]},{"cells":["resolve_module","onchain_view","keel_manager.py"]},{"cells":["governance_threshold","onchain_view","keel_manager.py"]},{"cells":["banner","onchain_view","keel_manager.py"]},{"cells":["configure_role","entrypoint","keel_manager.py"]},{"cells":["configure_policy","entrypoint","keel_manager.py"]},{"cells":["pause","entrypoint","keel_manager.py"]},{"cells":["unpause","entrypoint","keel_manager.py"]},{"cells":["execute_role","entrypoint","keel_manager.py"]},{"cells":["capability_key_of","onchain_view","keel_manager.py"]},{"cells":["role_security","onchain_view","keel_manager.py"]},{"cells":["configure_automation_key","entrypoint","keel_manager.py"]},{"cells":["configure_signature_grant","entrypoint","keel_manager.py"]},{"cells":["configure_pauser","entrypoint","keel_manager.py"]},{"cells":["approve_signature","entrypoint","keel_manager.py"]},{"cells":["revoke_signature","entrypoint","keel_manager.py"]},{"cells":["pause","entrypoint","keel_manager.py"]},{"cells":["unpause","entrypoint","keel_manager.py"]},{"cells":["approve_signature_automation","entrypoint","keel_manager.py"]},{"cells":["signature_signing_payload","onchain_view","keel_manager.py"]},{"cells":["is_signature_approved","onchain_view","keel_manager.py"]},{"cells":["publish_seed_set","entrypoint","keel_seed_registry.py"]},{"cells":["publish_mint_seed_set","entrypoint","keel_seed_registry.py"]},{"cells":["harness_registry","onchain_view","keel_seed_registry.py"]},{"cells":["keel_index","onchain_view","keel_seed_registry.py"]},{"cells":["predict_seed_set_id","onchain_view","keel_seed_registry.py"]},{"cells":["compute_seed_set_commitment","onchain_view","keel_seed_registry.py"]},{"cells":["mint_seed_set_commitment","onchain_view","keel_seed_registry.py"]},{"cells":["seed_set","onchain_view","keel_seed_registry.py"]},{"cells":["seed_set_for_harness_revision","onchain_view","keel_seed_registry.py"]},{"cells":["seed_set_collection","onchain_view","keel_seed_registry.py"]},{"cells":["mint_entropy_enabled","onchain_view","keel_seed_registry.py"]},{"cells":["derive_token_seed","onchain_view","keel_seed_registry.py"]}],"caption":"Native interface","collapsed":true}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-codecs","navTitle":"Codecs (keel-codecs)","eyebrow":"Technical reference","title":"Codecs (keel-codecs)","summary":"Pure, stateless decoders: RLP, Merkle-Patricia, block headers, IPFS CIDs, base32/58, BLS12-381.","thesis":"Pure, stateless decoders: RLP, Merkle-Patricia, block headers, IPFS CIDs, base32/58, BLS12-381.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Pure, stateless decoders: RLP, Merkle-Patricia, block headers, IPFS CIDs, base32/58, BLS12-381.","cards":[{"title":"keel-codecs","body":"Pure, stateless decoders: RLP, Merkle-Patricia, block headers, IPFS CIDs, base32/58, BLS12-381.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"None"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-codecs/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-codecs"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-codecs"}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"Native codec source and tests","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-codecs/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-codecs/tezos"},{"label":"Native module configuration","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-codecs/keel.module.json"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[],"caption":"Native interface","collapsed":false}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-creator-identity","navTitle":"Creator identity (keel-creator-identity)","eyebrow":"Technical reference","title":"Creator identity (keel-creator-identity)","summary":"Creator profiles, commitments, and attribution records.","thesis":"Creator profiles, commitments, and attribution records.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Creator profiles, commitments, and attribution records.","cards":[{"title":"keel-creator-identity","body":"Creator profiles, commitments, and attribution records.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-artifacts, keel-kernel"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-creator-identity/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-creator-identity"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-creator-identity"}]}]},{"id":"keelattributionregistry","title":"KeelAttributionRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelAttributionRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-creator-identity/KeelAttributionRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-creator-identity/KeelAttributionRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ATTRIBUTION_ID_DOMAIN()","bytes32","view"]},{"cells":["MAX_ENTRIES()","uint256","view"]},{"cells":["MAX_TAG_BYTES()","uint256","view"]},{"cells":["SUBJECT_ID_DOMAIN()","bytes32","view"]},{"cells":["artifactRegistry()","address","view"]},{"cells":["attribution(uint8 subjectKind, bytes32 subjectId, address account, string tag)","(address,bytes32,string,uint64,uint64,address,bool,bool,bool)","view"]},{"cells":["attributionById(bytes32 id)","(address,bytes32,string,uint64,uint64,address,bool,bool,bool)","view"]},{"cells":["attributionCount(uint8 subjectKind, bytes32 subjectId)","uint256","view"]},{"cells":["attributionId(uint8 subjectKind, bytes32 subjectId, address account, string tag)","bytes32","pure"]},{"cells":["canManage(uint8 subjectKind, bytes32 subjectId, address account)","bool","view"]},{"cells":["harnessRegistry()","address","view"]},{"cells":["removeAttribution(uint8 subjectKind, bytes32 subjectId, address account, string tag)","—","nonpayable"]},{"cells":["setAttribution(uint8 subjectKind, bytes32 subjectId, address account, string tag, bool active)","bytes32 id","nonpayable"]},{"cells":["subjectAttributionIds(uint8 subjectKind, bytes32 subjectId)","bytes32[]","view"]},{"cells":["subjectKey(uint8 subjectKind, bytes32 subjectId)","bytes32","pure"]},{"cells":["tagIdFor(string tag)","bytes32","pure"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["AttributionUpdated(bytes32 indexed subjectId, uint8 indexed subjectKind, address indexed account, bytes32 tagId, string tag, bool active, bool verified, address publisher)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AttributionMissing()"]},{"cells":["InvalidAccount()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidTag()"]},{"cells":["SubjectMissing()"]},{"cells":["TooManyAttributions()"]},{"cells":["Unauthorized()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address artifactRegistry_, address harnessRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelcreatorcommitmentregistry","title":"KeelCreatorCommitmentRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelCreatorCommitmentRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-creator-identity/KeelCreatorCommitmentRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-creator-identity/KeelCreatorCommitmentRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["commitmentAt(address collection, uint64 revision)","(bytes32,uint64,address,uint8,bool)","view"]},{"cells":["commitmentCount(address collection)","uint256","view"]},{"cells":["latestCommitment(address collection)","(bytes32,uint64,address,uint8,bool) commitment, uint64 revision","view"]},{"cells":["leaf(uint256 tokenId, bytes32 metadataDigest, bytes32 assetDigest)","bytes32","pure"]},{"cells":["publish(address collection, bytes32 root)","uint64 revision","nonpayable"]},{"cells":["resolveAuthority(address collection, address account)","uint8","view"]},{"cells":["verify(address collection, uint64 revision, uint256 tokenId, bytes32 metadataDigest, bytes32 assetDigest, bytes32[] proof)","bool","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["CommitmentPublished(address indexed collection, uint64 indexed revision, bytes32 indexed root, address publisher, uint8 authority)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["NoCommitment()"]},{"cells":["NotAnAuthority()"]},{"cells":["UnknownRevision()"]},{"cells":["ZeroRoot()"]}],"caption":"Custom errors","collapsed":true}]}]},{"id":"keelcreatorprofileregistry","title":"KeelCreatorProfileRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelCreatorProfileRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-creator-identity/KeelCreatorProfileRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-creator-identity/KeelCreatorProfileRegistry.json"},{"label":"Sepolia showcase · 0xa4112eda52ca519adaeebee7c12c4770594529fa","href":"https://sepolia.etherscan.io/address/0xa4112eda52ca519adaeebee7c12c4770594529fa#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["CREATOR_ID_DOMAIN()","bytes32","view"]},{"cells":["MAX_METADATA_URI_BYTES()","uint256","view"]},{"cells":["MAX_NORMALIZED_USERNAME_BYTES()","uint256","view"]},{"cells":["USERNAME_HASH_DOMAIN()","bytes32","view"]},{"cells":["canCreateDrop(address creator)","bool","view"]},{"cells":["createProfile((bytes32,string,address,bytes32,bytes32,uint64,address) input)","bytes32 creatorId","nonpayable"]},{"cells":["creatorIdOf(address creator)","bytes32","view"]},{"cells":["ensureProfile(address creator, (bytes32,string,address,bytes32,bytes32,uint64,address) input)","bytes32 creatorId, bool created","nonpayable"]},{"cells":["manager()","address","view"]},{"cells":["predictCreatorId(address creator)","bytes32","view"]},{"cells":["profile(bytes32 creatorId)","(address,address,bytes32,string,address,bytes32,bytes32,uint64,uint64,uint64,uint64,bool,bool)","view"]},{"cells":["profileComplete(address creator)","bool","view"]},{"cells":["profileOf(address creator)","(address,address,bytes32,string,address,bytes32,bytes32,uint64,uint64,uint64,uint64,bool,bool)","view"]},{"cells":["recoverProfile(bytes32 creatorId, address expectedCreator, address newCreator)","—","nonpayable"]},{"cells":["updateProfile(bytes32 creatorId, uint64 expectedRevision, (bytes32,string,address,bytes32,bytes32,uint64,address) input)","—","nonpayable"]},{"cells":["usernameCommitment(string normalizedUsername)","bytes32","pure"]},{"cells":["walletWasBound(address wallet)","bool","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["CreatorProfileConfigured(bytes32 indexed creatorId, address indexed creator, address indexed actor, uint64 revision, bytes32 usernameHash, string metadataURI, address metadataObjectRegistry, bytes32 metadataObjectId, uint64 metadataObjectRevision, bytes32 organizationId, address recoveryAddress, bool complete)"]},{"cells":["CreatorWalletRecovered(bytes32 indexed creatorId, address indexed previousCreator, address indexed creator, address recoveryAuthority, uint64 revision)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidContract()"]},{"cells":["InvalidMetadataReference()"]},{"cells":["InvalidNormalizedUsername()"]},{"cells":["InvalidRevision()"]},{"cells":["ManagerCannotSetRecovery()"]},{"cells":["MetadataURITooLong()"]},{"cells":["ProfileAlreadyExists()"]},{"cells":["ProfileMissing()"]},{"cells":["UnauthorizedCreator()"]},{"cells":["UnauthorizedGovernance()"]},{"cells":["UnauthorizedManager()"]},{"cells":["UnauthorizedRecovery()"]},{"cells":["UnexpectedCreator()"]},{"cells":["WalletAlreadyBound()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address manager_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelAttributionRegistry, KeelCreatorCommitmentRegistry, KeelCreatorProfileRegistry","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-creator-identity/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-creator-identity/tezos"},{"label":"Native module configuration","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-creator-identity/keel.module.json"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["create_profile","entrypoint","keel_creator_profile.py"]},{"cells":["ensure_profile","entrypoint","keel_creator_profile.py"]},{"cells":["update_profile","entrypoint","keel_creator_profile.py"]},{"cells":["recover_profile","entrypoint","keel_creator_profile.py"]},{"cells":["predict_creator_id","onchain_view","keel_creator_profile.py"]},{"cells":["username_commitment","onchain_view","keel_creator_profile.py"]},{"cells":["creator_id_of","onchain_view","keel_creator_profile.py"]},{"cells":["wallet_was_bound","onchain_view","keel_creator_profile.py"]},{"cells":["profile","onchain_view","keel_creator_profile.py"]},{"cells":["profile_of","onchain_view","keel_creator_profile.py"]},{"cells":["profile_complete","onchain_view","keel_creator_profile.py"]},{"cells":["can_create_drop","onchain_view","keel_creator_profile.py"]},{"cells":["publish","entrypoint","keel_creator_profile.py"]},{"cells":["leaf","onchain_view","keel_creator_profile.py"]},{"cells":["verify","onchain_view","keel_creator_profile.py"]},{"cells":["commitment_at","onchain_view","keel_creator_profile.py"]},{"cells":["commitment_count","onchain_view","keel_creator_profile.py"]},{"cells":["latest_commitment","onchain_view","keel_creator_profile.py"]},{"cells":["resolve_authority","onchain_view","keel_creator_profile.py"]},{"cells":["set_attribution","entrypoint","keel_creator_profile.py"]},{"cells":["remove_attribution","entrypoint","keel_creator_profile.py"]},{"cells":["subject_key","onchain_view","keel_creator_profile.py"]},{"cells":["attribution_id","onchain_view","keel_creator_profile.py"]},{"cells":["tag_id_for","onchain_view","keel_creator_profile.py"]},{"cells":["attribution","onchain_view","keel_creator_profile.py"]},{"cells":["attribution_by_id","onchain_view","keel_creator_profile.py"]},{"cells":["subject_attribution_ids","onchain_view","keel_creator_profile.py"]},{"cells":["attribution_count","onchain_view","keel_creator_profile.py"]},{"cells":["can_manage","onchain_view","keel_creator_profile.py"]}],"caption":"Native interface","collapsed":true}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-cross-chain-mint","navTitle":"Optional cross-chain mint bridge (keel-cross-chain-mint)","eyebrow":"Technical reference","title":"Optional cross-chain mint bridge (keel-cross-chain-mint)","summary":"Optional attested cross-chain mint requests; not required for storage, publication, or local minting.","thesis":"Optional attested cross-chain mint requests; not required for storage, publication, or local minting.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Optional attested cross-chain mint requests; not required for storage, publication, or local minting.","cards":[{"title":"keel-cross-chain-mint","body":"Optional attested cross-chain mint requests; not required for storage, publication, or local minting.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-kernel, keel-mint-access"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-cross-chain-mint/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-cross-chain-mint"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-cross-chain-mint"}]}]},{"id":"keelcrosschainmintbridge","title":"KeelCrossChainMintBridge","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelCrossChainMintBridge","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-cross-chain-mint/KeelCrossChainMintBridge.sol"},{"label":"Download ABI","href":"/docs/abi/keel-cross-chain-mint/KeelCrossChainMintBridge.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ANCHOR_STATUS_VERIFIED()","uint8","view"]},{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["NO_OBJECT_ID_OFFSET()","uint32","view"]},{"cells":["SOURCE_FAMILY_ETHEREUM()","uint8","view"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["anchorRegistry()","address","view"]},{"cells":["artifactRegistry()","address","view"]},{"cells":["configLocked()","bool","view"]},{"cells":["crossMintCompleted(uint32 sourceNetwork, address sourceCollection, uint256 sourceTokenId)","bool","view"]},{"cells":["executeRouteMint(uint256 registryRouteId, bytes32 allocationId, address target, address recipient, bytes mintData)","—","nonpayable"]},{"cells":["expectedWorkflowId()","bytes32","view"]},{"cells":["expectedWorkflowName()","bytes10","view"]},{"cells":["expectedWorkflowOwner()","address","view"]},{"cells":["forwarder()","address","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["localNetwork()","uint32","view"]},{"cells":["lockConfiguration()","—","nonpayable"]},{"cells":["mintRoute(uint32 sourceNetwork, address sourceCollection)","(address,address,uint256,uint32,bool,bool)","view"]},{"cells":["mintRouteKey(uint32 sourceNetwork, address sourceCollection)","bytes32","pure"]},{"cells":["mintRouteRegistry()","address","view"]},{"cells":["onReport(bytes metadata, bytes report)","—","nonpayable"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["requestCrossMint(address collection, uint256 tokenId, bytes32 objectId, uint64 artifactRevision, uint32 targetNetwork, address recipient, bytes mintData)","uint64 nonce","nonpayable"]},{"cells":["requireSystemsActive(uint192 mask)","—","view"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["setForwarder(address forwarder_)","—","nonpayable"]},{"cells":["setMintRoute(uint32 sourceNetwork, address sourceCollection, address creator, address targetCollection, uint32 objectIdOffset, bool enabled)","—","nonpayable"]},{"cells":["setWorkflowIdentity(address expectedOwner, bytes10 expectedName, bytes32 workflowId)","—","nonpayable"]},{"cells":["sourceTokenKey(uint32 sourceNetwork, address sourceCollection, uint256 sourceTokenId)","bytes32","view"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["ConfigurationLockedEvent(address locker)"]},{"cells":["CrossMintCompleted(bytes32 indexed sourceTokenKey, address indexed targetCollection, address indexed recipient, bytes32 objectId, uint64 nonce)"]},{"cells":["CrossMintRequested(bytes32 indexed objectId, address indexed collection, uint256 tokenId, uint32 targetNetwork, address recipient, uint64 artifactRevision, uint64 nonce, bytes mintData)"]},{"cells":["CrossMintSkipped(bytes32 indexed sourceTokenKey, uint64 nonce, bytes reason)"]},{"cells":["ForwarderConfigured(address forwarder)"]},{"cells":["MintRouteConfigured(bytes32 indexed routeKey, uint32 indexed sourceNetwork, address sourceCollection, address creator, address targetCollection, uint256 registryRouteId, uint32 objectIdOffset, bool enabled)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["WorkflowIdentityConfigured(address expectedOwner, bytes10 expectedName, bytes32 expectedWorkflowId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["ConfigurationLocked()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidReport()"]},{"cells":["LastAdministrator()"]},{"cells":["NotAnchoredOnTargetChain()"]},{"cells":["NotTokenOwner()"]},{"cells":["OnlyForwarderCanReport()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["RevisionMissing()"]},{"cells":["RouteDisabled()"]},{"cells":["RouteMissing()"]},{"cells":["Unauthorized()"]},{"cells":["WorkflowIdentityMismatch()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address anchorRegistry_, address artifactRegistry_, address mintRouteRegistry_, address forwarder_, address admin)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelCrossChainMintAttestor","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-cross-chain-mint/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-cross-chain-mint/tezos"},{"label":"Compilation targets","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/script/tezos/keel-cross-chain-mint"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["register_attestor","entrypoint","keel_cross_chain_mint_attestor.py"]},{"cells":["retire_attestor","entrypoint","keel_cross_chain_mint_attestor.py"]},{"cells":["set_min_threshold_floor","entrypoint","keel_cross_chain_mint_attestor.py"]},{"cells":["set_route","entrypoint","keel_cross_chain_mint_attestor.py"]},{"cells":["set_mint_target","entrypoint","keel_cross_chain_mint_attestor.py"]},{"cells":["lock_configuration","entrypoint","keel_cross_chain_mint_attestor.py"]},{"cells":["set_administrator","entrypoint","keel_cross_chain_mint_attestor.py"]},{"cells":["pause","entrypoint","keel_cross_chain_mint_attestor.py"]},{"cells":["unpause","entrypoint","keel_cross_chain_mint_attestor.py"]},{"cells":["submit_cross_mint","entrypoint","keel_cross_chain_mint_attestor.py"]},{"cells":["authorization_payload","onchain_view","keel_cross_chain_mint_attestor.py"]},{"cells":["current_epoch","onchain_view","keel_cross_chain_mint_attestor.py"]},{"cells":["min_threshold_floor","onchain_view","keel_cross_chain_mint_attestor.py"]},{"cells":["active_attestor_count","onchain_view","keel_cross_chain_mint_attestor.py"]},{"cells":["mint_target","onchain_view","keel_cross_chain_mint_attestor.py"]},{"cells":["attestor","onchain_view","keel_cross_chain_mint_attestor.py"]},{"cells":["is_attestor_active","onchain_view","keel_cross_chain_mint_attestor.py"]},{"cells":["route_enabled","onchain_view","keel_cross_chain_mint_attestor.py"]},{"cells":["source_token_minted","onchain_view","keel_cross_chain_mint_attestor.py"]},{"cells":["nonce_used","onchain_view","keel_cross_chain_mint_attestor.py"]}],"caption":"Native interface","collapsed":true}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-crucible","navTitle":"Collection verification (keel-crucible)","eyebrow":"Technical reference","title":"Collection verification (keel-crucible)","summary":"Collection attestation, community replication, and preservation bounties.","thesis":"Collection attestation, community replication, and preservation bounties.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Collection attestation, community replication, and preservation bounties.","cards":[{"title":"keel-crucible","body":"Collection attestation, community replication, and preservation bounties.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-kernel, keel-hold, keel-artifacts"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-crucible/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-crucible"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-crucible"}]}]},{"id":"keelcollectionattestationregistry","title":"KeelCollectionAttestationRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelCollectionAttestationRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-crucible/KeelCollectionAttestationRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-crucible/KeelCollectionAttestationRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ATTESTATION_TYPEHASH()","bytes32","view"]},{"cells":["ATTESTOR_ADMIN_ROLE()","bytes32","view"]},{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["approvedAttestor(address signer)","bool approved","view"]},{"cells":["attestationDigest((uint256,address,address,uint256,bytes32,address,bytes32,address,address,address,bytes32,bytes32,uint64,uint64,bytes32,bytes32,bytes32,bytes32,uint64,bytes32,bytes32,bytes32,uint64,uint64) value)","bytes32","view"]},{"cells":["attestationWindowOpen(bytes32 digest)","bool","view"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["nonceUsed(bytes32 nonceKey)","bool used","view"]},{"cells":["receipt(bytes32 digest)","(bytes32,bytes32,address,uint256,uint64,bytes32,uint64,uint64,uint16,bool,bool)","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revoke(bytes32 digest, bytes32 reasonDigest)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["setAttestor(address signer, bool approved)","—","nonpayable"]},{"cells":["setThreshold(uint16 next)","—","nonpayable"]},{"cells":["submit((uint256,address,address,uint256,bytes32,address,bytes32,address,address,address,bytes32,bytes32,uint64,uint64,bytes32,bytes32,bytes32,bytes32,uint64,bytes32,bytes32,bytes32,uint64,uint64) value, bytes[] signatures)","bytes32 digest","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["threshold()","uint16","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AttestorSet(address indexed signer, bool approved)"]},{"cells":["CollectionAttestationRevoked(bytes32 indexed digest, bytes32 reasonDigest)"]},{"cells":["CollectionAttested(bytes32 indexed digest, address indexed collection, uint256 indexed tokenId, bytes32 evidenceRoot, uint64 blockNumber, bytes32 blockHash, uint16 signerCount)"]},{"cells":["EIP712DomainChanged()"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["ThresholdSet(uint16 threshold)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["DuplicateOrUnsortedSigner()"]},{"cells":["ECDSAInvalidSignature()"]},{"cells":["ECDSAInvalidSignatureLength(uint256 length)"]},{"cells":["ECDSAInvalidSignatureS(bytes32 s)"]},{"cells":["InsufficientSignatures()"]},{"cells":["InvalidAttestation()"]},{"cells":["InvalidCodeIdentity()"]},{"cells":["InvalidPinnedBlock()"]},{"cells":["InvalidShortString()"]},{"cells":["InvalidThreshold()"]},{"cells":["ReceiptUnavailable()"]},{"cells":["Replay()"]},{"cells":["StringTooLong(string str)"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin, uint16 threshold_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelcollectionverificationregistry","title":"KeelCollectionVerificationRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelCollectionVerificationRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-crucible/KeelCollectionVerificationRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-crucible/KeelCollectionVerificationRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ADAPTER_PROTOCOL()","bytes32","view"]},{"cells":["AUDITOR_ROLE()","bytes32","view"]},{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["HOOK_PROTOCOL()","bytes32","view"]},{"cells":["MAX_TOKEN_URI_BYTES()","uint256","view"]},{"cells":["POLICY_ROLE()","bytes32","view"]},{"cells":["PRESENTATION_CONTENT_DOMAIN()","bytes32","view"]},{"cells":["SUPPLY_KNOWN_BURNED()","uint16","view"]},{"cells":["SUPPLY_KNOWN_LIFETIME_MINTED()","uint16","view"]},{"cells":["SUPPLY_KNOWN_MAX()","uint16","view"]},{"cells":["SUPPLY_KNOWN_OUTSTANDING()","uint16","view"]},{"cells":["SUPPLY_KNOWN_REMAINING()","uint16","view"]},{"cells":["SUPPLY_KNOWN_RESERVED()","uint16","view"]},{"cells":["approvedEvidenceRoot(address collection, uint256 tokenId, bytes32 policyKey)","bytes32","view"]},{"cells":["computePresentationContentDigest(uint256 chainId, address collection, address keelIndex, uint256 presentationScope, uint64 presentationRevision, bytes32 manifestDigest, bytes32 portableRoot, bytes32 portableAnchorRoot)","bytes32","pure"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["inspectCurrent(address collection, uint256 tokenId, bytes32 policyKey)","(bytes32,address,address,uint256,bool,address,uint64,bytes32,bytes32,uint8,address,address,address,bytes32,bool,bool,bool,uint8,uint8,address,bytes32,uint32,address,address,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint16,uint8,bool,address,address,bool,uint8,address,address,address,bool,address,address,bool) state, (uint8,uint8,uint8,uint8,uint8,uint8) facets","view"]},{"cells":["latestReceipt(address collection, uint256 tokenId)","bytes32 receiptId","view"]},{"cells":["policy(bytes32 id)","((uint8,bytes32,address,bytes32,address,bytes32,address,address,bytes32,uint64),bool,bool)","view"]},{"cells":["policyId((uint8,bytes32,address,bytes32,address,bytes32,address,address,bytes32,uint64) input)","bytes32","pure"]},{"cells":["portableAnchorRegistry()","address","view"]},{"cells":["receipt(bytes32 id)","(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,address,address,address,address,address,address,address,address,address,address,address,address,address,address,address,address,address,bytes32,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint16,uint64,uint64,uint64,uint64,bytes32,uint64,uint32,uint8,uint8,uint8,uint8,uint8,uint8,(uint8,uint8,uint8,uint8,uint8,uint8),bool,bool,bool,bool,bool,bool,bool,bool,bool,bool,bool)","view"]},{"cells":["receiptCurrent(bytes32 id)","bool","view"]},{"cells":["recordApproved(address collection, uint256 tokenId, bytes32 policyKey)","bytes32 receiptId","nonpayable"]},{"cells":["recordContentOnly(address collection, uint256 tokenId, bytes32 policyKey, bytes32 expectedTokenURIHash, bytes32 portableRoot, bytes32 manifestDigest, bytes32 evidenceRoot, uint64 evidenceBlock, bytes32 evidenceBlockHash, uint64 expiresAt)","bytes32 receiptId","nonpayable"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revoke(bytes32 receiptId, bytes32 reasonDigest)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["sealObservation(bytes32 receiptId, bytes32 observedBlockHash)","—","nonpayable"]},{"cells":["setPolicy((uint8,bytes32,address,bytes32,address,bytes32,address,address,bytes32,uint64) input, bool enabled)","bytes32 id","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CollectionVerificationObservationSealed(bytes32 indexed receiptId, uint64 indexed observedBlock, bytes32 blockHash)"]},{"cells":["CollectionVerificationRecorded(bytes32 indexed receiptId, address indexed collection, uint256 indexed tokenId, bytes32 policyId, bytes32 previousReceipt, bytes32 evidenceRoot, bytes32 portableRoot, uint64 presentationRevision, uint8 lane, uint8 routeVerdict, uint8 contentVerdict, address auditor)"]},{"cells":["CollectionVerificationRevoked(bytes32 indexed receiptId, address indexed auditor, bytes32 reasonDigest)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["VerificationPolicySet(bytes32 indexed policyId, bytes32 indexed policyDigest, uint64 version, uint8 lane, bool enabled)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["AdapterCodeMismatch()"]},{"cells":["HookProtocolMismatch()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidEvidence()"]},{"cells":["InvalidEvidenceBlock()"]},{"cells":["InvalidPolicy()"]},{"cells":["ObservationAlreadySealed()"]},{"cells":["PolicyUnavailable()"]},{"cells":["PortableRootUnanchored()"]},{"cells":["ReceiptAlreadyRevoked()"]},{"cells":["ReceiptUnavailable()"]},{"cells":["RuntimeCodeMismatch()"]},{"cells":["TokenURIMismatch()"]},{"cells":["TokenURIReadFailed()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin, address portableAnchorRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelcommunityreplicationregistry","title":"KeelCommunityReplicationRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelCommunityReplicationRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-crucible/KeelCommunityReplicationRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-crucible/KeelCommunityReplicationRegistry.json"},{"label":"Sepolia showcase · 0xe8a4618e7327c75631afcdd2ff7b0f4a73d42595","href":"https://sepolia.etherscan.io/address/0xe8a4618e7327c75631afcdd2ff7b0f4a73d42595#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["CAMPAIGN_ID_DOMAIN()","bytes32","view"]},{"cells":["CARRIER_EVM()","uint8","view"]},{"cells":["CARRIER_ORDINALS()","uint8","view"]},{"cells":["CARRIER_PROOF_ID_DOMAIN()","bytes32","view"]},{"cells":["CARRIER_SCORE_BONUS()","uint256","view"]},{"cells":["CARRIER_TEZOS()","uint8","view"]},{"cells":["CHUNK_SCORE_BONUS()","uint256","view"]},{"cells":["MAX_CHUNKS()","uint32","view"]},{"cells":["MAX_CLAIM_BATCH()","uint32","view"]},{"cells":["MAX_CLAIM_LEASE()","uint32","view"]},{"cells":["MAX_LOCATOR_BYTES()","uint256","view"]},{"cells":["MAX_SUBMIT_BATCH()","uint32","view"]},{"cells":["MIN_CLAIM_LEASE()","uint32","view"]},{"cells":["VALID_CARRIER_MASK()","uint8","view"]},{"cells":["artifactRegistry()","address","view"]},{"cells":["bindObjectRevision(bytes32 campaignId)","—","nonpayable"]},{"cells":["campaignCarrierStatus(bytes32 campaignId)","uint8 requiredMask, uint8 completedMask, bool complete","view"]},{"cells":["campaignContributorStats(bytes32 campaignId, address contributor)","(uint128,uint64,uint64,uint256)","view"]},{"cells":["campaignCurrent(bytes32 campaignId)","bool","view"]},{"cells":["campaignForRevision(bytes32 objectId, uint64 revision)","bytes32 campaignId","view"]},{"cells":["campaignState(bytes32 campaignId)","(address,bytes32,uint64,uint64,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,uint64,uint64,uint64,uint32,uint32,uint32,uint8,uint8,uint8,uint8,bool,bool,bool,bool,string)","view"]},{"cells":["carrierProof(bytes32 campaignId, uint8 carrier)","(address,address,bytes32,bytes32,bytes32,uint64,uint64,uint64,uint8,string)","view"]},{"cells":["carrierTask(bytes32 campaignId, uint8 carrier)","(address,uint64)","view"]},{"cells":["claimCarrier(bytes32 campaignId, uint8 carrier)","—","nonpayable"]},{"cells":["claimSlugs(bytes32 campaignId, uint32[] indices)","—","nonpayable"]},{"cells":["createCampaign((bytes32,bytes32,uint64,uint64,uint8,bytes32,bytes32,bytes32,bytes32,uint64,uint64,uint8,string,uint8,uint32) input, (bytes32,uint32)[] slugs)","bytes32 campaignId","nonpayable"]},{"cells":["enableExternalCarriers(bytes32 campaignId, uint8 carrierMask)","—","nonpayable"]},{"cells":["finalizeEvmCarrier(bytes32 campaignId)","bytes32 contentObjectId","nonpayable"]},{"cells":["globalContributorStats(address contributor)","(uint128,uint64,uint64,uint256)","view"]},{"cells":["keelHold()","address","view"]},{"cells":["predictCampaignId((bytes32,bytes32,uint64,uint64,uint8,bytes32,bytes32,bytes32,bytes32,uint64,uint64,uint8,string,uint8,uint32) input, address creator)","bytes32","pure"]},{"cells":["predictCarrierProofDigest(bytes32 campaignId, uint8 carrier, bytes32 locatorDigest, bytes32 readbackDigest)","bytes32","pure"]},{"cells":["proofVerifier()","address","view"]},{"cells":["releaseCarrierClaim(bytes32 campaignId, uint8 carrier)","—","nonpayable"]},{"cells":["releaseSlugClaim(bytes32 campaignId, uint32 slugIndex)","—","nonpayable"]},{"cells":["replaceCampaign(bytes32 priorCampaignId, (bytes32,bytes32,uint64,uint64,uint8,bytes32,bytes32,bytes32,bytes32,uint64,uint64,uint8,string,uint8,uint32) input, (bytes32,uint32)[] slugs)","bytes32 campaignId","nonpayable"]},{"cells":["requiredCarrierMask(bytes32 objectId)","uint8","view"]},{"cells":["reviewCarrierProof(bytes32 campaignId, uint8 carrier, bool accepted)","—","nonpayable"]},{"cells":["setCampaignEnabled(bytes32 campaignId, bool enabled)","—","nonpayable"]},{"cells":["slugTask(bytes32 campaignId, uint32 slugIndex)","(bytes32,address,address,uint64,uint32,bool,bool)","view"]},{"cells":["submitCarrierProof(bytes32 campaignId, uint8 carrier, string locator, bytes32 readbackDigest)","—","nonpayable"]},{"cells":["submitSlug(bytes32 campaignId, uint32 slugIndex, bytes data)","—","nonpayable"]},{"cells":["submitSlugs(bytes32 campaignId, uint32[] indices, bytes[] payloads)","—","nonpayable"]},{"cells":["validateRevisionAppend(bytes32 objectId, uint64 revision, address publisher, bytes32 contentObjectId, uint8 digestAlgorithm, bytes32 decodedDigest, bytes32 metadataDigest, bytes32 fidelitySetDigest)","—","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CarrierClaimReleased(bytes32 indexed campaignId, uint8 indexed carrier, address indexed contributor)"]},{"cells":["CarrierClaimed(bytes32 indexed campaignId, uint8 indexed carrier, address indexed contributor, uint64 expiresAt)"]},{"cells":["CarrierProofReviewed(bytes32 indexed campaignId, uint8 indexed carrier, address indexed contributor, address verifier, bool accepted, uint256 score)"]},{"cells":["CarrierProofSubmitted(bytes32 indexed campaignId, uint8 indexed carrier, address indexed contributor, bytes32 locatorDigest, bytes32 proofDigest, bytes32 readbackDigest, uint64 byteLength, string locator)"]},{"cells":["EvmCarrierFinalized(bytes32 indexed campaignId, bytes32 indexed contentObjectId, address indexed finalizer)"]},{"cells":["ObjectCarrierPolicyAdvanced(bytes32 indexed objectId, uint64 indexed revision, uint8 addedCarrierMask, uint8 requiredCarrierMask)"]},{"cells":["ObjectRevisionBound(bytes32 indexed campaignId, bytes32 indexed objectId, uint64 indexed revision, bytes32 contentObjectId)"]},{"cells":["ReplicationCampaignCreated(bytes32 indexed campaignId, bytes32 indexed objectId, uint64 indexed targetRevision, uint64 expectedParent, address creator, uint8 digestAlgorithm, bytes32 decodedDigest, bytes32 metadataDigest, bytes32 fidelitySetDigest, bytes32 indexDigest, bytes32 mediaTypeDigest, uint64 byteLength, uint64 storedByteLength, uint32 slugCount, uint8 compression, uint8 carrierMask, uint8 requiredCarrierMask, uint32 claimLeaseSeconds, bool evmFinalized)"]},{"cells":["ReplicationCampaignEnabled(bytes32 indexed campaignId, bool enabled)"]},{"cells":["ReplicationCampaignSuperseded(bytes32 indexed objectId, uint64 indexed revision, bytes32 indexed priorCampaignId, bytes32 campaignId)"]},{"cells":["ReplicationCarriersEnabled(bytes32 indexed campaignId, uint8 addedCarrierMask, uint8 carrierMask)"]},{"cells":["SlugClaimReleased(bytes32 indexed campaignId, uint32 indexed slugIndex, address indexed contributor)"]},{"cells":["SlugClaimed(bytes32 indexed campaignId, uint32 indexed slugIndex, address indexed contributor, uint64 expiresAt)"]},{"cells":["SlugContributionAccepted(bytes32 indexed campaignId, uint32 indexed slugIndex, bytes32 indexed slugId, address contributor, address pointer, uint32 byteLength, uint256 score, uint32 completedSlugs)"]},{"cells":["SlugResolvedAsPreexisting(bytes32 indexed campaignId, uint32 indexed slugIndex, bytes32 indexed slugId, address pointer)"]},{"cells":["SlugTaskCommitted(bytes32 indexed campaignId, uint32 indexed slugIndex, bytes32 indexed slugId, uint32 byteLength, bool preexisting)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CampaignDisabled()"]},{"cells":["CampaignExists()"]},{"cells":["CampaignMissing()"]},{"cells":["CampaignStale()"]},{"cells":["CarrierRegression()"]},{"cells":["ClaimMissing()"]},{"cells":["EvmAlreadyFinalized()"]},{"cells":["EvmIncomplete()"]},{"cells":["EvmNotEnabled()"]},{"cells":["InvalidBatch()"]},{"cells":["InvalidCampaign()"]},{"cells":["InvalidCarrier()"]},{"cells":["InvalidCommitment()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidRevision()"]},{"cells":["InvalidRevisionPolicy()"]},{"cells":["InvalidSlug()"]},{"cells":["ProofAlreadyAccepted()"]},{"cells":["ProofMissing()"]},{"cells":["ProofPending()"]},{"cells":["RevisionAlreadyBound()"]},{"cells":["SlugAlreadyClaimed()"]},{"cells":["SlugComplete()"]},{"cells":["Unauthorized()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address artifactRegistry_, address proofVerifier_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelCollectionAttestationRegistry, KeelCollectionVerificationHookBase, KeelCollectionVerificationRegistry, KeelCommunityReplicationRegistry","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-crucible/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-crucible/tezos"},{"label":"Native module configuration","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-crucible/keel.module.json"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["set_code_identity","entrypoint","keel_crucible.py"]},{"cells":["set_attestor","entrypoint","keel_crucible.py"]},{"cells":["set_threshold","entrypoint","keel_crucible.py"]},{"cells":["attestation_digest","onchain_view","keel_crucible.py"]},{"cells":["submit","entrypoint","keel_crucible.py"]},{"cells":["revoke","entrypoint","keel_crucible.py"]},{"cells":["receipt","onchain_view","keel_crucible.py"]},{"cells":["attestation_window_open","onchain_view","keel_crucible.py"]},{"cells":["keel_verification_protocol","onchain_view","keel_crucible.py"]},{"cells":["keel_route","onchain_view","keel_crucible.py"]},{"cells":["keel_verification_state","onchain_view","keel_crucible.py"]},{"cells":["register_collection_identity","entrypoint","keel_crucible.py"]},{"cells":["register_adapter_identity","entrypoint","keel_crucible.py"]},{"cells":["register_portable_anchor","entrypoint","keel_crucible.py"]},{"cells":["observe_token_uri","entrypoint","keel_crucible.py"]},{"cells":["policy_id","onchain_view","keel_crucible.py"]},{"cells":["set_policy","entrypoint","keel_crucible.py"]},{"cells":["record_content_only","entrypoint","keel_crucible.py"]},{"cells":["record_approved","entrypoint","keel_crucible.py"]},{"cells":["approved_evidence_root","onchain_view","keel_crucible.py"]},{"cells":["seal_observation","entrypoint","keel_crucible.py"]},{"cells":["inspect_current","onchain_view","keel_crucible.py"]},{"cells":["revoke","entrypoint","keel_crucible.py"]},{"cells":["policy","onchain_view","keel_crucible.py"]},{"cells":["receipt","onchain_view","keel_crucible.py"]},{"cells":["receipt_current","onchain_view","keel_crucible.py"]},{"cells":["latest_receipt","onchain_view","keel_crucible.py"]},{"cells":["last_receipt","onchain_view","keel_crucible.py"]},{"cells":["presentation_content_digest","onchain_view","keel_crucible.py"]},{"cells":["predict_artifact_id","onchain_view","keel_crucible.py"]},{"cells":["predict_campaign_id","onchain_view","keel_crucible.py"]},{"cells":["predict_carrier_proof_digest","onchain_view","keel_crucible.py"]},{"cells":["create_campaign","entrypoint","keel_crucible.py"]},{"cells":["replace_campaign","entrypoint","keel_crucible.py"]},{"cells":["set_campaign_enabled","entrypoint","keel_crucible.py"]},{"cells":["enable_external_carriers","entrypoint","keel_crucible.py"]},{"cells":["claim_slugs","entrypoint","keel_crucible.py"]},{"cells":["release_slug_claim","entrypoint","keel_crucible.py"]},{"cells":["submit_slug","entrypoint","keel_crucible.py"]},{"cells":["submit_slugs","entrypoint","keel_crucible.py"]},{"cells":["predict_content_object_id","onchain_view","keel_crucible.py"]},{"cells":["finalize_evm_carrier","entrypoint","keel_crucible.py"]},{"cells":["record_artifact_revision","entrypoint","keel_crucible.py"]},{"cells":["set_artifact_editor","entrypoint","keel_crucible.py"]},{"cells":["set_artifact_frozen","entrypoint","keel_crucible.py"]},{"cells":["bind_object_revision","entrypoint","keel_crucible.py"]},{"cells":["claim_carrier","entrypoint","keel_crucible.py"]},{"cells":["release_carrier_claim","entrypoint","keel_crucible.py"]},{"cells":["submit_carrier_proof","entrypoint","keel_crucible.py"]},{"cells":["review_carrier_proof","entrypoint","keel_crucible.py"]},{"cells":["campaign_state","onchain_view","keel_crucible.py"]},{"cells":["campaign_current","onchain_view","keel_crucible.py"]},{"cells":["required_carrier_mask","onchain_view","keel_crucible.py"]},{"cells":["campaign_carrier_status","onchain_view","keel_crucible.py"]},{"cells":["slug_task","onchain_view","keel_crucible.py"]},{"cells":["carrier_task","onchain_view","keel_crucible.py"]},{"cells":["carrier_proof","onchain_view","keel_crucible.py"]},{"cells":["global_contributor_stats","onchain_view","keel_crucible.py"]},{"cells":["campaign_contributor_stats","onchain_view","keel_crucible.py"]},{"cells":["validate_revision_append","entrypoint","keel_crucible.py"]},{"cells":["last_campaign_id","onchain_view","keel_crucible.py"]},{"cells":["last_content_object_id","onchain_view","keel_crucible.py"]}],"caption":"Native interface","collapsed":true}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-die","navTitle":"Token base (keel-die)","eyebrow":"Technical reference","title":"Token base (keel-die)","summary":"Compact creator-owned ERC-721/ERC-1155 collections, a shared multi-creator ERC-1155, renderer boundaries, and factories that organize them.","thesis":"Compact creator-owned ERC-721/ERC-1155 collections, a shared multi-creator ERC-1155, renderer boundaries, and factories that organize them.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Compact creator-owned ERC-721/ERC-1155 collections, a shared multi-creator ERC-1155, renderer boundaries, and factories that organize them.","cards":[{"title":"keel-die","body":"Compact creator-owned ERC-721/ERC-1155 collections, a shared multi-creator ERC-1155, renderer boundaries, and factories that organize them.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-kernel, keel-harness, keel-presentation, keel-artifacts, keel-hold, keel-codecs"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-die/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-die"}]}]},{"id":"keel721","title":"KEEL721","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KEEL721","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KEEL721.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KEEL721.json"},{"label":"Sepolia showcase · 0x71B25649E8A27992494eDAD355497c0Bea50A8e0","href":"https://sepolia.etherscan.io/address/0x71B25649E8A27992494eDAD355497c0Bea50A8e0#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["MINTER_ROLE()","bytes32","view"]},{"cells":["PER_TOKEN_MINT_DATA_DOMAIN()","bytes32","view"]},{"cells":["adminStrike(address to, uint256 quantity)","—","nonpayable"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["approve(address to, uint256 tokenId)","—","nonpayable"]},{"cells":["balanceOf(address owner)","uint256","view"]},{"cells":["collectionDescription()","string","view"]},{"cells":["defaultPresentationBinding()","bytes32","view"]},{"cells":["defaultPresentationFrozen()","bool","view"]},{"cells":["freezeDefaultPresentation()","—","nonpayable"]},{"cells":["freezePresentation(uint256 tokenId)","—","nonpayable"]},{"cells":["getApproved(uint256 tokenId)","address","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["harnessContext(uint256 tokenId)","bytes","view"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["isApprovedForAll(address owner, address operator)","bool","view"]},{"cells":["isCampaignCreator(address account)","bool","view"]},{"cells":["keelIndex()","address","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["maxSupply()","uint256","view"]},{"cells":["metadataRelay()","address","view"]},{"cells":["name()","string","view"]},{"cells":["nextTokenId()","uint256","view"]},{"cells":["notifyDependencyMetadata(uint256 first, uint256 last)","—","nonpayable"]},{"cells":["notifyIndexRevision(uint256 tokenId, bool tokenSpecific)","—","nonpayable"]},{"cells":["onchainHarnessBuilder()","address","view"]},{"cells":["onchainPresentation()","address builder, bytes32 harnessObjectId, bytes32 harnessDigest, bytes32 fragmentObjectId, bytes32 fragmentDigest","view"]},{"cells":["ownerOf(uint256 tokenId)","address","view"]},{"cells":["presentation(uint256 tokenId)","string manifestURI, bytes32 manifestDigest, string previewImageURI","view"]},{"cells":["releaseStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["removeMetadataDependency(address relay, uint256 id)","—","nonpayable"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["reserveStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["reservedStrikeCapacity(address manager)","uint256 quantity","view"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["royaltyInfo(uint256 tokenId, uint256 salePrice)","address receiver, uint256 amount","view"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId)","—","nonpayable"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId, bytes data)","—","nonpayable"]},{"cells":["setApprovalForAll(address operator, bool approved)","—","nonpayable"]},{"cells":["setCollectionDescription(string value)","—","nonpayable"]},{"cells":["setDefaultPresentation(string manifestURI, bytes32 manifestDigest, string previewImageURI, string harnessBaseURI_)","—","nonpayable"]},{"cells":["setDefaultRoyalty(address receiver, uint96 feeNumerator)","—","nonpayable"]},{"cells":["setKeelIndex(address registry)","—","nonpayable"]},{"cells":["setMetadataRelay(address relay)","—","nonpayable"]},{"cells":["setOnchainHarness(address builder, bytes32 objectId, bytes32 digest)","—","nonpayable"]},{"cells":["setPreEncodedOnchainHarness(address builder, bytes32 objectId, bytes32 digest)","—","nonpayable"]},{"cells":["setPreparedOnchainHarness(address builder, bytes32 objectId, bytes32 digest, bytes encodedPrefix, bytes encodedSuffix)","—","nonpayable"]},{"cells":["setTokenOwnerCanEdit(bool enabled)","—","nonpayable"]},{"cells":["setTokenPresentation(uint256 tokenId, string manifestURI, bytes32 manifestDigest, string previewImageURI)","—","nonpayable"]},{"cells":["strikeFromManager(address to, uint256 quantity, bytes data)","—","nonpayable"]},{"cells":["subscribeMetadataDependency(address source, bytes query, uint32 readGas, uint256 first, uint256 last)","uint256","nonpayable"]},{"cells":["supportsCompactTokenURI()","bool","pure"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["symbol()","string","view"]},{"cells":["tokenJSON(uint256 tokenId)","string","view"]},{"cells":["tokenOwnerCanEdit()","bool","view"]},{"cells":["tokenURI(uint256 tokenId)","string","view"]},{"cells":["totalReservedStrikeCapacity()","uint256","view"]},{"cells":["totalSupply()","uint256","view"]},{"cells":["transferFrom(address from, address to, uint256 tokenId)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)"]},{"cells":["ApprovalForAll(address indexed owner, address indexed operator, bool approved)"]},{"cells":["BatchMetadataUpdate(uint256 fromTokenId, uint256 toTokenId)"]},{"cells":["DefaultPresentationPermanentlyFrozen()"]},{"cells":["DefaultPresentationUpdated(string manifestURI, bytes32 manifestDigest, string previewImageURI)"]},{"cells":["HarnessBaseURIUpdated(string harnessBaseURI)"]},{"cells":["KeelIndexUpdated(address indexed registry)"]},{"cells":["ManagerStrikeData(address indexed recipient, uint256 indexed firstTokenId, uint256 quantity, bytes data)"]},{"cells":["ManagerTokenStrikeData(address indexed recipient, uint256 indexed tokenId, uint256 indexed tokenIndex, bytes32 mintDataDigest)"]},{"cells":["MetadataRelaySet(uint256 indexed scope, address indexed relay)"]},{"cells":["MetadataUpdate(uint256 tokenId)"]},{"cells":["OnchainHarnessUpdated(address indexed builder, bytes32 indexed objectId, bytes32 indexed digest)"]},{"cells":["OnchainTokenURIFragmentUpdated(bytes32 indexed objectId, bytes32 indexed digest)"]},{"cells":["PreparedTokenURIFragmentsUpdated(bytes32 indexed prefixDigest, bytes32 indexed suffixDigest)"]},{"cells":["PresentationFrozenForToken(uint256 indexed tokenId)"]},{"cells":["PresentationModuleSet(address indexed module)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["StrikeCapacityConsumed(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReleased(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReserved(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["TokenPresentationUpdated(uint256 indexed tokenId, string manifestURI, bytes32 manifestDigest, string previewImageURI)"]},{"cells":["Transfer(address indexed from, address indexed to, uint256 indexed tokenId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidDefaultRoyaltyReceiver(address receiver)"]},{"cells":["ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver)"]},{"cells":["ERC721IncorrectOwner(address sender, uint256 tokenId, address owner)"]},{"cells":["ERC721InsufficientApproval(address operator, uint256 tokenId)"]},{"cells":["ERC721InvalidApprover(address approver)"]},{"cells":["ERC721InvalidOperator(address operator)"]},{"cells":["ERC721InvalidOwner(address owner)"]},{"cells":["ERC721InvalidReceiver(address receiver)"]},{"cells":["ERC721InvalidSender(address sender)"]},{"cells":["ERC721NonexistentToken(uint256 tokenId)"]},{"cells":["InvalidMetadataRange()"]},{"cells":["InvalidMetadataRelay()"]},{"cells":["InvalidPerTokenMintData()"]},{"cells":["InvalidPresentation()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidReservation()"]},{"cells":["InvalidRoyalty()"]},{"cells":["InvalidSupply()"]},{"cells":["LastAdministrator()"]},{"cells":["OutstandingMintReservation()"]},{"cells":["PreparedTokenURIOnly()"]},{"cells":["PresentationFrozen()"]},{"cells":["ReservedCapacityExceeded()"]},{"cells":["SupplyExceeded()"]},{"cells":["UnauthorizedMetadataRelay()"]},{"cells":["UnauthorizedPresentationEditor()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(string name_, string symbol_, address admin, address mintManager, address registry, address royaltyReceiver, uint96 royaltyBps, uint256 maxSupply_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keel721deployer","title":"KEEL721Deployer","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KEEL721Deployer","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KEEL721Deployer.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KEEL721Deployer.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["creationCodeHash()","bytes32","view"]},{"cells":["deploy(bytes32 salt, string name, string symbol, address admin, address mintManager, address keelIndex, address royaltyReceiver, uint96 royaltyBps, uint256 maxSupply)","address collection","nonpayable"]},{"cells":["predict(bytes32 salt, string name, string symbol, address admin, address mintManager, address keelIndex, address royaltyReceiver, uint96 royaltyBps, uint256 maxSupply)","address predicted","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor()","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelartifacttokenrenderer","title":"KeelArtifactTokenRenderer","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelArtifactTokenRenderer","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelArtifactTokenRenderer.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelArtifactTokenRenderer.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["announceTokenPresentation(address collection, uint256 tokenId)","—","nonpayable"]},{"cells":["artifactRegistry()","address","view"]},{"cells":["bindCollectionMetadata(address collection, bytes32 artifactId, uint64 revision)","—","nonpayable"]},{"cells":["bindTokenPresentation(address collection, uint256 tokenId, bytes32 viewerArtifactId, uint64 viewerRevision, bytes32 posterArtifactId, uint64 posterRevision)","—","nonpayable"]},{"cells":["bindingAuthority()","address","view"]},{"cells":["collectionBinding(address collection)","(bytes32,uint64,bool)","view"]},{"cells":["contractURI(address collection)","string","view"]},{"cells":["harnessBuilder()","address","view"]},{"cells":["tokenPresentationBinding(address collection, uint256 tokenId)","(bytes32,uint64,bytes32,uint64,bool)","view"]},{"cells":["tokenURI(address collection, uint256 tokenId)","string","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["CollectionMetadataBound(address indexed collection, bytes32 indexed artifactId, uint64 indexed revision)"]},{"cells":["MetadataNotificationFailed(address indexed collection, uint256 indexed tokenId)"]},{"cells":["TokenPresentationBound(address indexed collection, uint256 indexed tokenId, bytes32 indexed viewerArtifactId, uint64 viewerRevision, bytes32 posterArtifactId, uint64 posterRevision)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["BindingConflict(address collection, uint256 tokenId, bytes32 boundArtifactId, uint64 boundRevision, bytes32 requestedArtifactId, uint64 requestedRevision)"]},{"cells":["BindingMissing(address collection, uint256 tokenId)"]},{"cells":["InvalidBinding()"]},{"cells":["InvalidContract()"]},{"cells":["StringsInsufficientHexLength(uint256 value, uint256 length)"]},{"cells":["TokenPresentationBindingConflict(address collection, uint256 tokenId, bytes32 boundViewerArtifactId, uint64 boundViewerRevision, bytes32 boundPosterArtifactId, uint64 boundPosterRevision, bytes32 requestedViewerArtifactId, uint64 requestedViewerRevision, bytes32 requestedPosterArtifactId, uint64 requestedPosterRevision)"]},{"cells":["Unauthorized()"]},{"cells":["UnsupportedArtifact(bytes32 artifactId, uint64 revision)"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address bindingAuthority_, address artifactRegistry_, address harnessBuilder_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelcreator1155","title":"KeelCreator1155","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelCreator1155","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelCreator1155.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelCreator1155.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["acceptOwnership()","—","nonpayable"]},{"cells":["announceMetadataURI(uint256 tokenId)","—","nonpayable"]},{"cells":["balanceOf(address account, uint256 id)","uint256","view"]},{"cells":["balanceOfBatch(address[] accounts, uint256[] ids)","uint256[]","view"]},{"cells":["canCreateDrop(address account, uint256 tokenId)","bool","view"]},{"cells":["closeCollection()","—","nonpayable"]},{"cells":["closeItem(uint256 tokenId)","—","nonpayable"]},{"cells":["collectionOpen()","bool","view"]},{"cells":["contractURI()","string","view"]},{"cells":["createItem(uint128 maxSupply_)","uint256 tokenId","nonpayable"]},{"cells":["initialize(string name_, string symbol_, address creator, address mintManager_, address lifecycleManager_, address renderer_, address royaltyReceiver, uint96 royaltyBps)","—","nonpayable"]},{"cells":["initializeDeferredItem(uint128 maxSupply_)","uint256 tokenId","nonpayable"]},{"cells":["isApprovedForAll(address account, address operator)","bool","view"]},{"cells":["item(uint256 tokenId)","(uint128,uint128,uint128,bool,bool)","view"]},{"cells":["lifecycleManager()","address","view"]},{"cells":["metadataRelay()","address","view"]},{"cells":["metadataRenderer()","address","view"]},{"cells":["mintManager()","address","view"]},{"cells":["name()","string","view"]},{"cells":["nextItemId()","uint256","view"]},{"cells":["notifyDependencyMetadata(uint256 first, uint256 last)","—","nonpayable"]},{"cells":["notifyMetadataUpdate(uint256 tokenId)","—","nonpayable"]},{"cells":["owner()","address","view"]},{"cells":["pendingOwner()","address","view"]},{"cells":["releaseStrikeCapacity(uint256 tokenId, uint256 quantity)","—","nonpayable"]},{"cells":["removeMetadataDependency(address relay, uint256 id)","—","nonpayable"]},{"cells":["reserveStrikeCapacity(uint256 tokenId, uint256 quantity)","—","nonpayable"]},{"cells":["reservedStrikeCapacity(uint256 tokenId, address manager)","uint256","view"]},{"cells":["royaltyInfo(uint256 tokenId, uint256 salePrice)","address receiver, uint256 amount","view"]},{"cells":["safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] values, bytes data)","—","nonpayable"]},{"cells":["safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes data)","—","nonpayable"]},{"cells":["setApprovalForAll(address operator, bool approved)","—","nonpayable"]},{"cells":["setMetadataRelay(address relay)","—","nonpayable"]},{"cells":["skipOneMintHook()","bool","view"]},{"cells":["strikeBatchFromManager(address to, uint256[] tokenIds, uint256[] quantities, bytes)","—","nonpayable"]},{"cells":["strikeFromManager(address to, uint256 tokenId, uint256 quantity, bytes)","—","nonpayable"]},{"cells":["subscribeMetadataDependency(address source, bytes query, uint32 readGas, uint256 first, uint256 last)","uint256","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["symbol()","string","view"]},{"cells":["transferOwnership(address nextOwner)","—","nonpayable"]},{"cells":["uri(uint256 tokenId)","string","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["ApprovalForAll(address indexed account, address indexed operator, bool approved)"]},{"cells":["CollectionClosedPermanently()"]},{"cells":["ItemClosedPermanently(uint256 indexed tokenId)"]},{"cells":["ItemCreated(uint256 indexed tokenId, uint256 maxSupply)"]},{"cells":["MetadataRelaySet(uint256 indexed scope, address indexed relay)"]},{"cells":["OwnershipTransferStarted(address indexed owner, address indexed pendingOwner)"]},{"cells":["OwnershipTransferred(address indexed previousOwner, address indexed owner)"]},{"cells":["StrikeCapacityConsumed(uint256 indexed tokenId, uint256 quantity, address indexed manager)"]},{"cells":["StrikeCapacityReleased(uint256 indexed tokenId, uint256 quantity, address indexed manager)"]},{"cells":["StrikeCapacityReserved(uint256 indexed tokenId, uint256 quantity, address indexed manager)"]},{"cells":["TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values)"]},{"cells":["TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value)"]},{"cells":["URI(string value, uint256 indexed id)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AlreadyInitialized()"]},{"cells":["BatchMintUnsupported()"]},{"cells":["CollectionClosed()"]},{"cells":["ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId)"]},{"cells":["ERC1155InvalidApprover(address approver)"]},{"cells":["ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength)"]},{"cells":["ERC1155InvalidOperator(address operator)"]},{"cells":["ERC1155InvalidReceiver(address receiver)"]},{"cells":["ERC1155InvalidSender(address sender)"]},{"cells":["ERC1155MissingApprovalForAll(address operator, address owner)"]},{"cells":["ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidDefaultRoyaltyReceiver(address receiver)"]},{"cells":["ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver)"]},{"cells":["InvalidMetadataRange()"]},{"cells":["InvalidMetadataRelay()"]},{"cells":["InvalidMintBatch()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidReservation()"]},{"cells":["InvalidRoyalty()"]},{"cells":["InvalidSupply()"]},{"cells":["ItemClosed()"]},{"cells":["ItemMissing()"]},{"cells":["SupplyExceeded()"]},{"cells":["Unauthorized()"]},{"cells":["UnauthorizedMetadataRelay()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor()","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelcreator721","title":"KeelCreator721","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelCreator721","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelCreator721.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelCreator721.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["acceptOwnership()","—","nonpayable"]},{"cells":["approve(address to, uint256 tokenId)","—","nonpayable"]},{"cells":["balanceOf(address owner)","uint256","view"]},{"cells":["canCreateDrop(address account)","bool","view"]},{"cells":["closeCollection()","—","nonpayable"]},{"cells":["collectionOpen()","bool","view"]},{"cells":["contractURI()","string","view"]},{"cells":["getApproved(uint256 tokenId)","address","view"]},{"cells":["initialize(string name_, string symbol_, address creator, address mintManager_, address lifecycleManager_, address renderer_, address royaltyReceiver, uint96 royaltyBps, uint256 maxSupply_)","—","nonpayable"]},{"cells":["isApprovedForAll(address owner, address operator)","bool","view"]},{"cells":["isCampaignCreator(address account)","bool","view"]},{"cells":["lifecycleManager()","address","view"]},{"cells":["maxSupply()","uint256","view"]},{"cells":["metadataRelay()","address","view"]},{"cells":["metadataRenderer()","address","view"]},{"cells":["mintManager()","address","view"]},{"cells":["name()","string","view"]},{"cells":["nextTokenId()","uint256","view"]},{"cells":["notifyDependencyMetadata(uint256 first, uint256 last)","—","nonpayable"]},{"cells":["notifyMetadataUpdate(uint256 tokenId)","—","nonpayable"]},{"cells":["owner()","address","view"]},{"cells":["ownerOf(uint256 tokenId)","address","view"]},{"cells":["pendingOwner()","address","view"]},{"cells":["releaseStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["removeMetadataDependency(address relay, uint256 id)","—","nonpayable"]},{"cells":["reserveStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["reservedStrikeCapacity(address manager)","uint256 quantity","view"]},{"cells":["royaltyInfo(uint256 tokenId, uint256 salePrice)","address receiver, uint256 amount","view"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId)","—","nonpayable"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId, bytes data)","—","nonpayable"]},{"cells":["setApprovalForAll(address operator, bool approved)","—","nonpayable"]},{"cells":["setMetadataRelay(address relay)","—","nonpayable"]},{"cells":["skipOneMintHook()","bool","pure"]},{"cells":["strikeFromManager(address to, uint256 quantity, bytes)","—","nonpayable"]},{"cells":["subscribeMetadataDependency(address source, bytes query, uint32 readGas, uint256 first, uint256 last)","uint256","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["symbol()","string","view"]},{"cells":["tokenURI(uint256 tokenId)","string","view"]},{"cells":["totalReservedStrikeCapacity()","uint256","view"]},{"cells":["totalSupply()","uint256","view"]},{"cells":["transferFrom(address from, address to, uint256 tokenId)","—","nonpayable"]},{"cells":["transferOwnership(address nextOwner)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)"]},{"cells":["ApprovalForAll(address indexed owner, address indexed operator, bool approved)"]},{"cells":["BatchMetadataUpdate(uint256 fromTokenId, uint256 toTokenId)"]},{"cells":["CollectionClosedPermanently()"]},{"cells":["MetadataRelaySet(uint256 indexed scope, address indexed relay)"]},{"cells":["MetadataUpdate(uint256 tokenId)"]},{"cells":["OwnershipTransferStarted(address indexed owner, address indexed pendingOwner)"]},{"cells":["OwnershipTransferred(address indexed previousOwner, address indexed owner)"]},{"cells":["StrikeCapacityConsumed(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReleased(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReserved(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["Transfer(address indexed from, address indexed to, uint256 indexed tokenId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AlreadyInitialized()"]},{"cells":["CollectionClosed()"]},{"cells":["ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidDefaultRoyaltyReceiver(address receiver)"]},{"cells":["ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver)"]},{"cells":["ERC721IncorrectOwner(address sender, uint256 tokenId, address owner)"]},{"cells":["ERC721InsufficientApproval(address operator, uint256 tokenId)"]},{"cells":["ERC721InvalidApprover(address approver)"]},{"cells":["ERC721InvalidOperator(address operator)"]},{"cells":["ERC721InvalidOwner(address owner)"]},{"cells":["ERC721InvalidReceiver(address receiver)"]},{"cells":["ERC721InvalidSender(address sender)"]},{"cells":["ERC721NonexistentToken(uint256 tokenId)"]},{"cells":["InvalidMetadataRange()"]},{"cells":["InvalidMetadataRelay()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidReservation()"]},{"cells":["InvalidRoyalty()"]},{"cells":["InvalidSupply()"]},{"cells":["SupplyExceeded()"]},{"cells":["Unauthorized()"]},{"cells":["UnauthorizedMetadataRelay()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor()","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelcreator721a","title":"KeelCreator721A","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelCreator721A","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelCreator721A.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelCreator721A.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["acceptOwnership()","—","nonpayable"]},{"cells":["approve(address to, uint256 tokenId)","—","payable"]},{"cells":["balanceOf(address owner)","uint256","view"]},{"cells":["canCreateDrop(address account)","bool","view"]},{"cells":["closeCollection()","—","nonpayable"]},{"cells":["collectionOpen()","bool","view"]},{"cells":["contractURI()","string","view"]},{"cells":["getApproved(uint256 tokenId)","address","view"]},{"cells":["initialize(string name_, string symbol_, address creator, address mintManager_, address lifecycleManager_, address renderer_, address royaltyReceiver, uint96 royaltyBps, uint256 maxSupply_)","—","nonpayable"]},{"cells":["isApprovedForAll(address owner, address operator)","bool","view"]},{"cells":["isCampaignCreator(address account)","bool","view"]},{"cells":["lifecycleManager()","address","view"]},{"cells":["maxSupply()","uint256","view"]},{"cells":["metadataRelay()","address","view"]},{"cells":["metadataRenderer()","address","view"]},{"cells":["mintManager()","address","view"]},{"cells":["name()","string","view"]},{"cells":["nextTokenId()","uint256","view"]},{"cells":["notifyDependencyMetadata(uint256 first, uint256 last)","—","nonpayable"]},{"cells":["notifyMetadataUpdate(uint256 tokenId)","—","nonpayable"]},{"cells":["owner()","address","view"]},{"cells":["ownerOf(uint256 tokenId)","address","view"]},{"cells":["pendingOwner()","address","view"]},{"cells":["releaseStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["removeMetadataDependency(address relay, uint256 id)","—","nonpayable"]},{"cells":["reserveStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["reservedStrikeCapacity(address manager)","uint256 quantity","view"]},{"cells":["royaltyInfo(uint256 tokenId, uint256 salePrice)","address receiver, uint256 amount","view"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId)","—","payable"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)","—","payable"]},{"cells":["setApprovalForAll(address operator, bool approved)","—","nonpayable"]},{"cells":["setMetadataRelay(address relay)","—","nonpayable"]},{"cells":["skipOneMintHook()","bool","pure"]},{"cells":["strikeFromManager(address to, uint256 quantity, bytes data)","—","nonpayable"]},{"cells":["subscribeMetadataDependency(address source, bytes query, uint32 readGas, uint256 first, uint256 last)","uint256","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["symbol()","string","view"]},{"cells":["tokenURI(uint256 tokenId)","string","view"]},{"cells":["totalReservedStrikeCapacity()","uint256","view"]},{"cells":["totalSupply()","uint256 result","view"]},{"cells":["transferFrom(address from, address to, uint256 tokenId)","—","payable"]},{"cells":["transferOwnership(address nextOwner)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)"]},{"cells":["ApprovalForAll(address indexed owner, address indexed operator, bool approved)"]},{"cells":["BatchMetadataUpdate(uint256 fromTokenId, uint256 toTokenId)"]},{"cells":["CollectionClosedPermanently()"]},{"cells":["ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to)"]},{"cells":["MetadataRelaySet(uint256 indexed scope, address indexed relay)"]},{"cells":["MetadataUpdate(uint256 tokenId)"]},{"cells":["OwnershipTransferStarted(address indexed owner, address indexed pendingOwner)"]},{"cells":["OwnershipTransferred(address indexed previousOwner, address indexed owner)"]},{"cells":["StrikeCapacityConsumed(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReleased(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReserved(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["Transfer(address indexed from, address indexed to, uint256 indexed tokenId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AlreadyInitialized()"]},{"cells":["ApprovalCallerNotOwnerNorApproved()"]},{"cells":["ApprovalQueryForNonexistentToken()"]},{"cells":["BalanceQueryForZeroAddress()"]},{"cells":["CollectionClosed()"]},{"cells":["ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidDefaultRoyaltyReceiver(address receiver)"]},{"cells":["ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver)"]},{"cells":["InvalidMetadataRange()"]},{"cells":["InvalidMetadataRelay()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidReservation()"]},{"cells":["InvalidRoyalty()"]},{"cells":["InvalidSupply()"]},{"cells":["MintERC2309QuantityExceedsLimit()"]},{"cells":["MintToZeroAddress()"]},{"cells":["MintZeroQuantity()"]},{"cells":["NotCompatibleWithSpotMints()"]},{"cells":["OwnerQueryForNonexistentToken()"]},{"cells":["OwnershipNotInitializedForExtraData()"]},{"cells":["SequentialMintExceedsLimit()"]},{"cells":["SequentialUpToTooSmall()"]},{"cells":["SpotMintTokenIdTooSmall()"]},{"cells":["SupplyExceeded()"]},{"cells":["TokenAlreadyExists()"]},{"cells":["TransferCallerNotOwnerNorApproved()"]},{"cells":["TransferFromIncorrectOwner()"]},{"cells":["TransferToNonERC721ReceiverImplementer()"]},{"cells":["TransferToZeroAddress()"]},{"cells":["URIQueryForNonexistentToken()"]},{"cells":["Unauthorized()"]},{"cells":["UnauthorizedMetadataRelay()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor()","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelcreatorfactory","title":"KeelCreatorFactory","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelCreatorFactory","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelCreatorFactory.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelCreatorFactory.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["FACTORY_VERSION()","bytes32","view"]},{"cells":["MAX_NAME_BYTES()","uint256","view"]},{"cells":["MAX_SYMBOL_BYTES()","uint256","view"]},{"cells":["closeCollection(uint256 collectionId)","—","nonpayable"]},{"cells":["closeERC1155Item(uint256 collectionId, uint256 tokenId)","—","nonpayable"]},{"cells":["collection(uint256 collectionId)","(address,address,uint128,uint64,uint8,uint8,bool,bool,string,bytes32)","view"]},{"cells":["collectionIdByKey(bytes32 key)","uint256 collectionId","view"]},{"cells":["collectionKey(address tokenContract, uint128 sharedCollectionId)","bytes32","pure"]},{"cells":["createDeferredERC1155((bool,address,address,bytes32,bytes32) request, (string,string,address,uint96,bytes32) config)","uint256 collectionId, address tokenContract","nonpayable"]},{"cells":["createDeferredERC721((bool,address,address,bytes32,bytes32) request, (string,string,uint256,address,uint96,bytes32) config, uint8 kind)","uint256 collectionId, address tokenContract","nonpayable"]},{"cells":["createERC1155((string,string,address,uint96,bytes32) config)","uint256 collectionId, address tokenContract","nonpayable"]},{"cells":["createERC721((string,string,uint256,address,uint96,bytes32) config)","uint256 collectionId, address tokenContract","nonpayable"]},{"cells":["createSeededERC721((string,string,uint256,address,uint96,bytes32) config, (bool,bool,uint32,uint32,address,uint8,uint8) profile)","uint256 collectionId, address tokenContract","nonpayable"]},{"cells":["createSharedERC1155(string name_, bytes32 metadataDigest)","uint256 collectionId, uint128 sharedCollectionId","nonpayable"]},{"cells":["createStandardERC721((string,string,uint256,address,uint96,bytes32) config)","uint256 collectionId, address tokenContract","nonpayable"]},{"cells":["creatorCollectionCount(address creator)","uint256","view"]},{"cells":["creatorCollectionIds(address creator)","uint256[]","view"]},{"cells":["creatorNonces(address creator)","uint256 nonce","view"]},{"cells":["deferredCollectionId(address creator, address resolver, bytes32 salt)","bytes32","view"]},{"cells":["deferredCollections(bytes32 reservationId)","bytes32 commitment","view"]},{"cells":["deferredERC1155Commitment((string,string,address,uint96,bytes32) config)","bytes32","pure"]},{"cells":["deferredERC721Commitment((string,string,uint256,address,uint96,bytes32) config, uint8 kind)","bytes32","pure"]},{"cells":["deferredMintRoute(bytes32 reservationId)","uint256","view"]},{"cells":["erc721ImplementationKind(uint256 collectionId)","uint8 kind","view"]},{"cells":["implementation1155()","address","view"]},{"cells":["implementation721()","address","view"]},{"cells":["implementationSeeded721()","address","view"]},{"cells":["implementationStandard721()","address","view"]},{"cells":["metadataRenderer()","address","view"]},{"cells":["mintManager()","address","view"]},{"cells":["nextCollectionId()","uint256","view"]},{"cells":["predictNextCollectionAddress(address creator, uint8 standard)","address","view"]},{"cells":["predictNextSeededERC721Address(address creator)","address","view"]},{"cells":["predictNextStandardERC721Address(address creator)","address","view"]},{"cells":["recordCreatorTransfer(uint128 sharedCollectionId, address previousCreator, address nextCreator)","—","nonpayable"]},{"cells":["refreshExternalCreator(uint256 collectionId)","—","nonpayable"]},{"cells":["registerExternalCollection(address tokenContract, string name_, bytes32 metadataDigest)","uint256 collectionId","nonpayable"]},{"cells":["reserveDeferredCollection(address resolver, bytes32 salt, bytes32 bidderCommitment, bytes32 patronCommitment)","bytes32 reservationId","nonpayable"]},{"cells":["shared1155()","address","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CreatorCollectionClosed(bool enforcedOnToken, uint256 indexed collectionId, address indexed tokenContract, uint128 sharedCollectionId)"]},{"cells":["CreatorCollectionRegistered(bool mintCompatible, uint8 standard, uint8 deployment, string name, uint256 indexed collectionId, address indexed creator, address indexed tokenContract, uint128 sharedCollectionId, bytes32 metadataDigest)"]},{"cells":["CreatorCollectionTransferred(uint256 indexed collectionId, address indexed creator, address indexed previousCreator)"]},{"cells":["CreatorERC721ImplementationSelected(uint8 kind, uint256 indexed collectionId, address indexed tokenContract)"]},{"cells":["DeferredCollectionCreated(bool patrons, uint256 collectionId, address indexed tokenContract, bytes32 indexed reservationId)"]},{"cells":["DeferredCollectionReserved(address indexed creator, address indexed executor, bytes32 indexed reservationId, bytes32 bidderCommitment, bytes32 patronCommitment)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CollectionClosed()"]},{"cells":["CollectionExists()"]},{"cells":["CollectionMissing()"]},{"cells":["DeferredCollectionExists()"]},{"cells":["DeferredCollectionMismatch()"]},{"cells":["FailedDeployment()"]},{"cells":["InsufficientBalance(uint256 balance, uint256 needed)"]},{"cells":["InvalidCollection()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidMetadata()"]},{"cells":["InvalidName()"]},{"cells":["InvalidRoyalty()"]},{"cells":["InvalidStandard()"]},{"cells":["InvalidSymbol()"]},{"cells":["Unauthorized()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address mintManager_, address renderer_, address implementation721_, address implementationStandard721_, address implementation1155_, address implementationSeeded721_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelfactory","title":"KeelFactory","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelFactory","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelFactory.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelFactory.json"},{"label":"Sepolia showcase · 0x8839dab4505128378947aa2f75a0556554043ce6","href":"https://sepolia.etherscan.io/address/0x8839dab4505128378947aa2f75a0556554043ce6#code"},{"label":"Sepolia studio-runtime-20261007 · 0xe7f47a76d2887d0a54f7c40dcf7ffcc69e6f22be","href":"https://sepolia.etherscan.io/address/0xe7f47a76d2887d0a54f7c40dcf7ffcc69e6f22be#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["COLLECTION_AUTHORIZATION_TYPEHASH()","bytes32","view"]},{"cells":["FACTORY_VERSION()","bytes32","view"]},{"cells":["MAX_COLLECTION_AUTHORIZATION_LIFETIME()","uint64","view"]},{"cells":["castDie((string,string,address,address,uint96,uint256,address,address) config)","address collection","nonpayable"]},{"cells":["castDieFor(address creator, (string,string,address,address,uint96,uint256,address,address) config, uint64 deadline, uint256 nonce, bytes signature)","address collection","nonpayable"]},{"cells":["collectionDeployer()","address","view"]},{"cells":["creatorNonces(address creator)","uint256 nonce","view"]},{"cells":["dieAuthorizationDigest(address creator, address agent, uint256 nonce, uint64 deadline, bytes32 configDigest)","bytes32","view"]},{"cells":["dieConfigDigest((string,string,address,address,uint96,uint256,address,address) config)","bytes32","pure"]},{"cells":["dieCreationCodeHash()","bytes32","view"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["invalidateCreatorNonce(uint256 nextNonce)","—","nonpayable"]},{"cells":["predictDieAddress((string,string,address,address,uint96,uint256,address,address) config, address creator, uint256 nonce)","address predicted","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["CreatorNonceInvalidated(address indexed creator, uint256 previousNonce, uint256 nextNonce)"]},{"cells":["DieCast(address indexed collection, address indexed creator, address indexed admin, string name, string symbol, uint256 maxSupply)"]},{"cells":["DieCastByAgent(address indexed collection, address indexed creator, address indexed agent, uint256 nonce, bytes32 authorizationDigest, bytes32 configDigest)"]},{"cells":["EIP712DomainChanged()"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AuthorizationExpired()"]},{"cells":["InvalidAuthorizationNonce()"]},{"cells":["InvalidAuthorizationSignature()"]},{"cells":["InvalidAuthorizationWindow()"]},{"cells":["InvalidShortString()"]},{"cells":["StringTooLong(string str)"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor()","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelfactorysepolia","title":"KeelFactorySepolia","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelFactorySepolia","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelFactorySepolia.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelFactorySepolia.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["COLLECTION_AUTHORIZATION_TYPEHASH()","bytes32","view"]},{"cells":["FACTORY_VERSION()","bytes32","view"]},{"cells":["MAX_COLLECTION_AUTHORIZATION_LIFETIME()","uint64","view"]},{"cells":["castDieFor(address creator, (string,string,address,address,uint96,uint256,address,address) config, uint64 deadline, uint256 nonce, bytes signature)","address collection","nonpayable"]},{"cells":["collectionDeployer()","address","view"]},{"cells":["creatorNonces(address creator)","uint256 nonce","view"]},{"cells":["dieConfigDigest((string,string,address,address,uint96,uint256,address,address) config)","bytes32","pure"]},{"cells":["dieCreationCodeHash()","bytes32","view"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["invalidateCreatorNonce(uint256 nextNonce)","—","nonpayable"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["CreatorNonceInvalidated(address indexed creator, uint256 previousNonce, uint256 nextNonce)"]},{"cells":["DieCast(address indexed collection, address indexed creator, address indexed admin, string name, string symbol, uint256 maxSupply)"]},{"cells":["DieCastByAgent(address indexed collection, address indexed creator, address indexed agent, uint256 nonce, bytes32 authorizationDigest, bytes32 configDigest)"]},{"cells":["EIP712DomainChanged()"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AuthorizationExpired()"]},{"cells":["InvalidAuthorizationNonce()"]},{"cells":["InvalidAuthorizationSignature()"]},{"cells":["InvalidAuthorizationWindow()"]},{"cells":["InvalidShortString()"]},{"cells":["StringTooLong(string str)"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address deployer, bytes32 creationCodeHash)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelshared1155","title":"KeelShared1155","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelShared1155","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelShared1155.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelShared1155.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["acceptCollection(uint128 collectionId)","—","nonpayable"]},{"cells":["announceMetadataURI(uint256 tokenId)","—","nonpayable"]},{"cells":["balanceOf(address account, uint256 id)","uint256","view"]},{"cells":["balanceOfBatch(address[] accounts, uint256[] ids)","uint256[]","view"]},{"cells":["canCreateDrop(address account, uint256 tokenId)","bool","view"]},{"cells":["closeCollection(uint128 collectionId)","—","nonpayable"]},{"cells":["closeItem(uint256 tokenId)","—","nonpayable"]},{"cells":["collection(uint128 collectionId)","(address,address,uint128,bool,bool,string)","view"]},{"cells":["collectionIdOf(uint256 tokenId)","uint128","pure"]},{"cells":["contractURI()","string","view"]},{"cells":["createCollection(address creator, string name_)","uint128 collectionId","nonpayable"]},{"cells":["createItem(uint128 collectionId, uint128 maxSupply_, address royaltyReceiver, uint96 royaltyBps)","uint256 tokenId","nonpayable"]},{"cells":["factory()","address","view"]},{"cells":["isApprovedForAll(address account, address operator)","bool","view"]},{"cells":["item(uint256 tokenId)","(uint128,uint128,uint128,bool,bool)","view"]},{"cells":["itemIndexOf(uint256 tokenId)","uint128","pure"]},{"cells":["metadataRelay(uint128 collectionId)","address","view"]},{"cells":["metadataRenderer()","address","view"]},{"cells":["mintManager()","address","view"]},{"cells":["nextCollectionId()","uint128","view"]},{"cells":["notifyDependencyMetadata(uint256 first, uint256 last)","—","nonpayable"]},{"cells":["notifyMetadataUpdate(uint256 tokenId)","—","nonpayable"]},{"cells":["releaseStrikeCapacity(uint256 tokenId, uint256 quantity)","—","nonpayable"]},{"cells":["removeMetadataDependency(uint128 collectionId, address relay, uint256 id)","—","nonpayable"]},{"cells":["reserveStrikeCapacity(uint256 tokenId, uint256 quantity)","—","nonpayable"]},{"cells":["reservedStrikeCapacity(uint256 tokenId, address manager)","uint256","view"]},{"cells":["royaltyInfo(uint256 tokenId, uint256 salePrice)","address receiver, uint256 amount","view"]},{"cells":["safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] values, bytes data)","—","nonpayable"]},{"cells":["safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes data)","—","nonpayable"]},{"cells":["setApprovalForAll(address operator, bool approved)","—","nonpayable"]},{"cells":["setMetadataRelay(uint128 collectionId, address relay)","—","nonpayable"]},{"cells":["skipOneMintHook()","bool","view"]},{"cells":["strikeBatchFromManager(address to, uint256[] tokenIds, uint256[] quantities, bytes)","—","nonpayable"]},{"cells":["strikeFromManager(address to, uint256 tokenId, uint256 quantity, bytes)","—","nonpayable"]},{"cells":["subscribeMetadataDependency(address source, bytes query, uint32 readGas, uint256 first, uint256 last)","uint256","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["tokenIdFor(uint128 collectionId, uint128 itemIndex)","uint256","pure"]},{"cells":["transferCollection(uint128 collectionId, address nextCreator)","—","nonpayable"]},{"cells":["uri(uint256 tokenId)","string","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["ApprovalForAll(address indexed account, address indexed operator, bool approved)"]},{"cells":["MetadataRelaySet(uint256 indexed scope, address indexed relay)"]},{"cells":["SharedCollectionClosedPermanently(uint128 indexed collectionId)"]},{"cells":["SharedCollectionCreated(string name, uint128 indexed collectionId, address indexed creator)"]},{"cells":["SharedCollectionCreatorTransferStarted(uint128 indexed collectionId, address indexed creator, address indexed pendingCreator)"]},{"cells":["SharedCollectionCreatorTransferred(uint128 indexed collectionId, address indexed creator, address indexed previousCreator)"]},{"cells":["SharedItemClosedPermanently(uint256 indexed tokenId)"]},{"cells":["SharedItemCreated(uint128 indexed itemIndex, uint128 indexed collectionId, uint256 indexed tokenId, uint256 maxSupply)"]},{"cells":["TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values)"]},{"cells":["TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value)"]},{"cells":["URI(string value, uint256 indexed id)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["BatchMintUnsupported()"]},{"cells":["CollectionClosed()"]},{"cells":["CollectionMissing()"]},{"cells":["ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId)"]},{"cells":["ERC1155InvalidApprover(address approver)"]},{"cells":["ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength)"]},{"cells":["ERC1155InvalidOperator(address operator)"]},{"cells":["ERC1155InvalidReceiver(address receiver)"]},{"cells":["ERC1155InvalidSender(address sender)"]},{"cells":["ERC1155MissingApprovalForAll(address operator, address owner)"]},{"cells":["ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidDefaultRoyaltyReceiver(address receiver)"]},{"cells":["ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver)"]},{"cells":["InvalidMetadataRange()"]},{"cells":["InvalidMetadataRelay()"]},{"cells":["InvalidMintBatch()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidReservation()"]},{"cells":["InvalidRoyalty()"]},{"cells":["InvalidSupply()"]},{"cells":["ItemClosed()"]},{"cells":["ItemMissing()"]},{"cells":["RangeExhausted()"]},{"cells":["SupplyExceeded()"]},{"cells":["Unauthorized()"]},{"cells":["UnauthorizedMetadataRelay()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address factory_, address mintManager_, address renderer_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelrawprepared721","title":"KeelRawPrepared721","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelRawPrepared721","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelRawPrepared721.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelRawPrepared721.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["CAMPAIGN_CREATOR_ROLE()","bytes32","view"]},{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["MINTER_ROLE()","bytes32","view"]},{"cells":["PRESENTATION_ROLE()","bytes32","view"]},{"cells":["adminStrike(address to)","—","nonpayable"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["approve(address to, uint256 tokenId)","—","nonpayable"]},{"cells":["balanceOf(address owner)","uint256","view"]},{"cells":["getApproved(uint256 tokenId)","address","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["isApprovedForAll(address owner, address operator)","bool","view"]},{"cells":["isCampaignCreator(address account)","bool","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["maxSupply()","uint256","view"]},{"cells":["metadataRelay()","address","view"]},{"cells":["name()","string","view"]},{"cells":["nextTokenId()","uint256","view"]},{"cells":["notifyDependencyMetadata(uint256 first, uint256 last)","—","nonpayable"]},{"cells":["ownerOf(uint256 tokenId)","address","view"]},{"cells":["rawKeelHold()","address","view"]},{"cells":["rawPreparedEnvelope()","bytes encodedPrefix, bytes encodedSuffix","view"]},{"cells":["rawTokenURIDigest()","bytes32","view"]},{"cells":["rawTokenURIObjectId()","bytes32","view"]},{"cells":["releaseStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["removeMetadataDependency(address relay, uint256 id)","—","nonpayable"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["reserveStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["reservedStrikeCapacity(address manager)","uint256 quantity","view"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["royaltyInfo(uint256 tokenId, uint256 salePrice)","address receiver, uint256 amount","view"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId)","—","nonpayable"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId, bytes data)","—","nonpayable"]},{"cells":["setApprovalForAll(address operator, bool approved)","—","nonpayable"]},{"cells":["setMetadataRelay(address relay)","—","nonpayable"]},{"cells":["setRawPreparedOnchainHarness(address validator, bytes32 objectId, bytes32 digest, bytes encodedPrefix, bytes encodedSuffix)","—","nonpayable"]},{"cells":["strikeFromManager(address to, uint256 quantity, bytes data)","—","nonpayable"]},{"cells":["subscribeMetadataDependency(address source, bytes query, uint32 readGas, uint256 first, uint256 last)","uint256","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["symbol()","string","view"]},{"cells":["tokenURI(uint256 tokenId)","string","view"]},{"cells":["totalReservedStrikeCapacity()","uint256","view"]},{"cells":["totalSupply()","uint256","view"]},{"cells":["transferFrom(address from, address to, uint256 tokenId)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)"]},{"cells":["ApprovalForAll(address indexed owner, address indexed operator, bool approved)"]},{"cells":["BatchMetadataUpdate(uint256 fromTokenId, uint256 toTokenId)"]},{"cells":["ManagerStrikeData(address indexed recipient, uint256 indexed tokenId, bytes data)"]},{"cells":["MetadataRelaySet(uint256 indexed scope, address indexed relay)"]},{"cells":["MetadataUpdate(uint256 tokenId)"]},{"cells":["RawPreparedOnchainHarnessUpdated(address indexed store, bytes32 indexed objectId, bytes32 digest)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["StrikeCapacityReleased(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReserved(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["Transfer(address indexed from, address indexed to, uint256 indexed tokenId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidDefaultRoyaltyReceiver(address receiver)"]},{"cells":["ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver)"]},{"cells":["ERC721IncorrectOwner(address sender, uint256 tokenId, address owner)"]},{"cells":["ERC721InsufficientApproval(address operator, uint256 tokenId)"]},{"cells":["ERC721InvalidApprover(address approver)"]},{"cells":["ERC721InvalidOperator(address operator)"]},{"cells":["ERC721InvalidOwner(address owner)"]},{"cells":["ERC721InvalidReceiver(address receiver)"]},{"cells":["ERC721InvalidSender(address sender)"]},{"cells":["ERC721NonexistentToken(uint256 tokenId)"]},{"cells":["InvalidMetadataRange()"]},{"cells":["InvalidMetadataRelay()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidRawPresentation()"]},{"cells":["InvalidReservation()"]},{"cells":["InvalidRoyalty()"]},{"cells":["LastAdministrator()"]},{"cells":["OutstandingMintReservation()"]},{"cells":["RawFragmentDigestMismatch()"]},{"cells":["RawFragmentLengthMismatch()"]},{"cells":["RawFragmentTooDeep()"]},{"cells":["SupplyExceeded()"]},{"cells":["UnauthorizedMetadataRelay()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(string name_, string symbol_, address admin, address mintManager, address royaltyReceiver, uint96 royaltyBps)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keel721presentation","title":"Keel721Presentation","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"Keel721Presentation","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/Keel721Presentation.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/Keel721Presentation.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["freeze(uint256 tokenId)","—","nonpayable"]},{"cells":["frozen(address collection, uint256 tokenId)","bool","view"]},{"cells":["imageSources(address collection, uint256 tokenId)","bytes32 objectId, address store, bool configured, bool frozen","view"]},{"cells":["imageURI(address collection, uint256 tokenId, string fallbackURI)","string","view"]},{"cells":["setImageSource(address collection, uint256 tokenId, address store, bytes32 objectId)","—","nonpayable"]},{"cells":["setTokenURIRoute(address collection, uint256 tokenId, string prefix, string postfix, bool appendTokenId)","—","nonpayable"]},{"cells":["tokenURI(address collection, uint256 tokenId)","bool overridden, string uri","view"]},{"cells":["tokenURIRoutes(address collection, uint256 tokenId)","bool configured, bool appendTokenId, string prefix, string postfix","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["ImageSourceSet(bytes32 indexed objectId, address store, address indexed collection, uint256 indexed tokenId)"]},{"cells":["TokenURIRouteSet(bool appendTokenId, string prefix, string postfix, address indexed collection, uint256 indexed tokenId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidPerTokenMintData()"]},{"cells":["InvalidPresentation()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidReservation()"]},{"cells":["InvalidRoyalty()"]},{"cells":["InvalidSupply()"]},{"cells":["OutstandingMintReservation()"]},{"cells":["PreparedTokenURIOnly()"]},{"cells":["PresentationFrozen()"]},{"cells":["ReservedCapacityExceeded()"]},{"cells":["SupplyExceeded()"]},{"cells":["UnauthorizedPresentationEditor()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true}]}]},{"id":"keelrouted721","title":"KeelRouted721","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelRouted721","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelRouted721.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelRouted721.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["MINTER_ROLE()","bytes32","view"]},{"cells":["PER_TOKEN_MINT_DATA_DOMAIN()","bytes32","view"]},{"cells":["adminStrike(address to, uint256 quantity)","—","nonpayable"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["approve(address to, uint256 tokenId)","—","nonpayable"]},{"cells":["authorizePresentation(uint256 tokenId, address account, bool image)","—","nonpayable"]},{"cells":["balanceOf(address owner)","uint256","view"]},{"cells":["collectionDescription()","string","view"]},{"cells":["defaultPresentationBinding()","bytes32","view"]},{"cells":["defaultPresentationFrozen()","bool","view"]},{"cells":["freezeDefaultPresentation()","—","nonpayable"]},{"cells":["freezePresentation(uint256 tokenId)","—","nonpayable"]},{"cells":["getApproved(uint256 tokenId)","address","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["harnessContext(uint256 tokenId)","bytes","view"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["isApprovedForAll(address owner, address operator)","bool","view"]},{"cells":["isCampaignCreator(address account)","bool","view"]},{"cells":["keelIndex()","address","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["maxSupply()","uint256","view"]},{"cells":["metadataRelay()","address","view"]},{"cells":["name()","string","view"]},{"cells":["nextTokenId()","uint256","view"]},{"cells":["notifyDependencyMetadata(uint256 first, uint256 last)","—","nonpayable"]},{"cells":["notifyIndexRevision(uint256 tokenId, bool tokenSpecific)","—","nonpayable"]},{"cells":["onchainHarnessBuilder()","address","view"]},{"cells":["onchainPresentation()","address builder, bytes32 harnessObjectId, bytes32 harnessDigest, bytes32 fragmentObjectId, bytes32 fragmentDigest","view"]},{"cells":["ownerOf(uint256 tokenId)","address","view"]},{"cells":["presentation(uint256 tokenId)","string manifestURI, bytes32 manifestDigest, string previewImageURI","view"]},{"cells":["presentationModule()","address","view"]},{"cells":["releaseStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["removeMetadataDependency(address relay, uint256 id)","—","nonpayable"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["reserveStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["reservedStrikeCapacity(address manager)","uint256 quantity","view"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["royaltyInfo(uint256 tokenId, uint256 salePrice)","address receiver, uint256 amount","view"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId)","—","nonpayable"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId, bytes data)","—","nonpayable"]},{"cells":["setApprovalForAll(address operator, bool approved)","—","nonpayable"]},{"cells":["setCollectionDescription(string value)","—","nonpayable"]},{"cells":["setDefaultPresentation(string manifestURI, bytes32 manifestDigest, string previewImageURI, string harnessBaseURI_)","—","nonpayable"]},{"cells":["setDefaultRoyalty(address receiver, uint96 feeNumerator)","—","nonpayable"]},{"cells":["setKeelIndex(address registry)","—","nonpayable"]},{"cells":["setMetadataRelay(address relay)","—","nonpayable"]},{"cells":["setOnchainHarness(address builder, bytes32 objectId, bytes32 digest)","—","nonpayable"]},{"cells":["setPreEncodedOnchainHarness(address builder, bytes32 objectId, bytes32 digest)","—","nonpayable"]},{"cells":["setPreparedOnchainHarness(address builder, bytes32 objectId, bytes32 digest, bytes encodedPrefix, bytes encodedSuffix)","—","nonpayable"]},{"cells":["setPresentationModule(address module)","—","nonpayable"]},{"cells":["setTokenOwnerCanEdit(bool enabled)","—","nonpayable"]},{"cells":["setTokenPresentation(uint256 tokenId, string manifestURI, bytes32 manifestDigest, string previewImageURI)","—","nonpayable"]},{"cells":["strikeFromManager(address to, uint256 quantity, bytes data)","—","nonpayable"]},{"cells":["subscribeMetadataDependency(address source, bytes query, uint32 readGas, uint256 first, uint256 last)","uint256","nonpayable"]},{"cells":["supportsCompactTokenURI()","bool","pure"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["symbol()","string","view"]},{"cells":["tokenJSON(uint256 tokenId)","string","view"]},{"cells":["tokenOwnerCanEdit()","bool","view"]},{"cells":["tokenURI(uint256 tokenId)","string","view"]},{"cells":["totalReservedStrikeCapacity()","uint256","view"]},{"cells":["totalSupply()","uint256","view"]},{"cells":["transferFrom(address from, address to, uint256 tokenId)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)"]},{"cells":["ApprovalForAll(address indexed owner, address indexed operator, bool approved)"]},{"cells":["BatchMetadataUpdate(uint256 fromTokenId, uint256 toTokenId)"]},{"cells":["DefaultPresentationPermanentlyFrozen()"]},{"cells":["DefaultPresentationUpdated(string manifestURI, bytes32 manifestDigest, string previewImageURI)"]},{"cells":["HarnessBaseURIUpdated(string harnessBaseURI)"]},{"cells":["KeelIndexUpdated(address indexed registry)"]},{"cells":["ManagerStrikeData(address indexed recipient, uint256 indexed firstTokenId, uint256 quantity, bytes data)"]},{"cells":["ManagerTokenStrikeData(address indexed recipient, uint256 indexed tokenId, uint256 indexed tokenIndex, bytes32 mintDataDigest)"]},{"cells":["MetadataRelaySet(uint256 indexed scope, address indexed relay)"]},{"cells":["MetadataUpdate(uint256 tokenId)"]},{"cells":["OnchainHarnessUpdated(address indexed builder, bytes32 indexed objectId, bytes32 indexed digest)"]},{"cells":["OnchainTokenURIFragmentUpdated(bytes32 indexed objectId, bytes32 indexed digest)"]},{"cells":["PreparedTokenURIFragmentsUpdated(bytes32 indexed prefixDigest, bytes32 indexed suffixDigest)"]},{"cells":["PresentationFrozenForToken(uint256 indexed tokenId)"]},{"cells":["PresentationModuleSet(address indexed module)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["StrikeCapacityConsumed(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReleased(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReserved(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["TokenPresentationUpdated(uint256 indexed tokenId, string manifestURI, bytes32 manifestDigest, string previewImageURI)"]},{"cells":["Transfer(address indexed from, address indexed to, uint256 indexed tokenId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidDefaultRoyaltyReceiver(address receiver)"]},{"cells":["ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver)"]},{"cells":["ERC721IncorrectOwner(address sender, uint256 tokenId, address owner)"]},{"cells":["ERC721InsufficientApproval(address operator, uint256 tokenId)"]},{"cells":["ERC721InvalidApprover(address approver)"]},{"cells":["ERC721InvalidOperator(address operator)"]},{"cells":["ERC721InvalidOwner(address owner)"]},{"cells":["ERC721InvalidReceiver(address receiver)"]},{"cells":["ERC721InvalidSender(address sender)"]},{"cells":["ERC721NonexistentToken(uint256 tokenId)"]},{"cells":["InvalidMetadataRange()"]},{"cells":["InvalidMetadataRelay()"]},{"cells":["InvalidPerTokenMintData()"]},{"cells":["InvalidPresentation()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidReservation()"]},{"cells":["InvalidRoyalty()"]},{"cells":["InvalidSupply()"]},{"cells":["LastAdministrator()"]},{"cells":["OutstandingMintReservation()"]},{"cells":["PreparedTokenURIOnly()"]},{"cells":["PresentationFrozen()"]},{"cells":["ReservedCapacityExceeded()"]},{"cells":["SupplyExceeded()"]},{"cells":["UnauthorizedMetadataRelay()"]},{"cells":["UnauthorizedPresentationEditor()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(string name_, string symbol_, address admin, address mintManager, address registry, address royaltyReceiver, uint96 royaltyBps, uint256 maxSupply_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelcreatorseeded721a","title":"KeelCreatorSeeded721A","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelCreatorSeeded721A","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelCreatorSeeded721A.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelCreatorSeeded721A.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["acceptOwnership()","—","nonpayable"]},{"cells":["approve(address to, uint256 tokenId)","—","payable"]},{"cells":["balanceOf(address owner)","uint256","view"]},{"cells":["blockArchive()","address","view"]},{"cells":["canCreateDrop(address account)","bool","view"]},{"cells":["closeCollection()","—","nonpayable"]},{"cells":["collectionOpen()","bool","view"]},{"cells":["configureSeedProfile((bool,bool,uint32,uint32,address,uint8,uint8) profile)","—","nonpayable"]},{"cells":["contractURI()","string","view"]},{"cells":["fulfillSeedBatch(uint256 batchId, bytes32 word)","—","nonpayable"]},{"cells":["getApproved(uint256 tokenId)","address","view"]},{"cells":["initialize(string name_, string symbol_, address creator, address mintManager_, address lifecycleManager_, address renderer_, address royaltyReceiver, uint96 royaltyBps, uint256 maxSupply_)","—","nonpayable"]},{"cells":["isApprovedForAll(address owner, address operator)","bool","view"]},{"cells":["isCampaignCreator(address account)","bool","view"]},{"cells":["keelMintSeededProfile(uint256)","bytes32, bytes32[] names, uint64[] fields, uint8[] formats, uint64","pure"]},{"cells":["keelMintSeededSeed(uint256 id)","bytes32","view"]},{"cells":["keelMintSeededWord(uint256 id, uint32 word)","uint256","view"]},{"cells":["lifecycleManager()","address","view"]},{"cells":["maxSupply()","uint256","view"]},{"cells":["metadataRelay()","address","view"]},{"cells":["metadataRenderer()","address","view"]},{"cells":["mintManager()","address","view"]},{"cells":["name()","string","view"]},{"cells":["nextTokenId()","uint256","view"]},{"cells":["notifyDependencyMetadata(uint256 first, uint256 last)","—","nonpayable"]},{"cells":["notifyMetadataUpdate(uint256 tokenId)","—","nonpayable"]},{"cells":["owner()","address","view"]},{"cells":["ownerOf(uint256 tokenId)","address","view"]},{"cells":["pendingOwner()","address","view"]},{"cells":["releaseStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["removeMetadataDependency(address relay, uint256 id)","—","nonpayable"]},{"cells":["reserveStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["reservedStrikeCapacity(address manager)","uint256 quantity","view"]},{"cells":["revealSeedBatch(uint256 batchId)","bytes32","nonpayable"]},{"cells":["royaltyInfo(uint256 tokenId, uint256 salePrice)","address receiver, uint256 amount","view"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId)","—","payable"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)","—","payable"]},{"cells":["seedBatchId(uint256 tokenId)","uint256","view"]},{"cells":["seedConfigured()","bool","view"]},{"cells":["seedDraws(uint256 batchId)","uint256 drawState","view"]},{"cells":["seedMaterialized(uint256 tokenId)","bool","view"]},{"cells":["seedProfile()","bool useVrf, bool lockUntilReveal, uint32 futureBlockDelay, uint32 sourceGas, address source, uint8 transferStorage, uint8 mode","view"]},{"cells":["seedSourceHash()","bytes32","view"]},{"cells":["seedVrfRequestable(uint256 batchId, address adapter)","bool","view"]},{"cells":["setApprovalForAll(address operator, bool approved)","—","nonpayable"]},{"cells":["setMetadataRelay(address relay)","—","nonpayable"]},{"cells":["skipOneMintHook()","bool","pure"]},{"cells":["strikeFromManager(address to, uint256 quantity, bytes data)","—","nonpayable"]},{"cells":["subscribeMetadataDependency(address source, bytes query, uint32 readGas, uint256 first, uint256 last)","uint256","nonpayable"]},{"cells":["supportsInterface(bytes4 id)","bool","view"]},{"cells":["symbol()","string","view"]},{"cells":["tokenSeed(uint256 tokenId)","bytes32","view"]},{"cells":["tokenURI(uint256 tokenId)","string","view"]},{"cells":["totalReservedStrikeCapacity()","uint256","view"]},{"cells":["totalSupply()","uint256 result","view"]},{"cells":["transferFrom(address from, address to, uint256 tokenId)","—","payable"]},{"cells":["transferOwnership(address nextOwner)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)"]},{"cells":["ApprovalForAll(address indexed owner, address indexed operator, bool approved)"]},{"cells":["BatchMetadataUpdate(uint256 fromTokenId, uint256 toTokenId)"]},{"cells":["BlockHashSaved(uint256 indexed blockNumber, bytes32 indexed blockHash)"]},{"cells":["CollectionClosedPermanently()"]},{"cells":["ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to)"]},{"cells":["MetadataRelaySet(uint256 indexed scope, address indexed relay)"]},{"cells":["MetadataUpdate(uint256 tokenId)"]},{"cells":["OwnershipTransferStarted(address indexed owner, address indexed pendingOwner)"]},{"cells":["OwnershipTransferred(address indexed previousOwner, address indexed owner)"]},{"cells":["SeedBatchCommitted(uint64 targetBlock, uint256 indexed batchId, uint256 quantity, uint256 firstTokenId, bytes32 indexed commitment)"]},{"cells":["SeedBatchRevealed(uint256 indexed batchId, bytes32 indexed seed)"]},{"cells":["SeedProfileConfigured(bytes32 indexed profileDigest)"]},{"cells":["StrikeCapacityConsumed(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReleased(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReserved(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["Transfer(address indexed from, address indexed to, uint256 indexed tokenId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AlreadyInitialized()"]},{"cells":["ApprovalCallerNotOwnerNorApproved()"]},{"cells":["ApprovalQueryForNonexistentToken()"]},{"cells":["BalanceQueryForZeroAddress()"]},{"cells":["CollectionClosed()"]},{"cells":["ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidDefaultRoyaltyReceiver(address receiver)"]},{"cells":["ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver)"]},{"cells":["InvalidHeaderProof()"]},{"cells":["InvalidMetadataRange()"]},{"cells":["InvalidMetadataRelay()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidReservation()"]},{"cells":["InvalidRoyalty()"]},{"cells":["InvalidSeedBatch()"]},{"cells":["InvalidSeedProfile()"]},{"cells":["InvalidSupply()"]},{"cells":["MintERC2309QuantityExceedsLimit()"]},{"cells":["MintToZeroAddress()"]},{"cells":["MintZeroQuantity()"]},{"cells":["NotCompatibleWithSpotMints()"]},{"cells":["OwnerQueryForNonexistentToken()"]},{"cells":["OwnershipNotInitializedForExtraData()"]},{"cells":["SeedBatchMissing()"]},{"cells":["SeedBatchMissing(uint256 tokenId)"]},{"cells":["SeedHashUnavailable(uint256 targetBlock)"]},{"cells":["SeedProfileLocked()"]},{"cells":["SeedRevealPending(uint256 targetBlock)"]},{"cells":["SeedSourceChanged()"]},{"cells":["SeedSourceFailed()"]},{"cells":["SeedVrfPending(uint256 batchId)"]},{"cells":["SequentialMintExceedsLimit()"]},{"cells":["SequentialUpToTooSmall()"]},{"cells":["SpotMintTokenIdTooSmall()"]},{"cells":["SupplyExceeded()"]},{"cells":["TokenAlreadyExists()"]},{"cells":["TransferCallerNotOwnerNorApproved()"]},{"cells":["TransferFromIncorrectOwner()"]},{"cells":["TransferToNonERC721ReceiverImplementer()"]},{"cells":["TransferToZeroAddress()"]},{"cells":["URIQueryForNonexistentToken()"]},{"cells":["Unauthorized()"]},{"cells":["UnauthorizedMetadataRelay()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address archive)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelseedblockarchive","title":"KeelSeedBlockArchive","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelSeedBlockArchive","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelSeedBlockArchive.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelSeedBlockArchive.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["checkpoint(uint256 number)","bytes32 value","nonpayable"]},{"cells":["hashOf(uint256 number)","bytes32 value","view"]},{"cells":["proveParents(uint256 number, bytes[] headers)","bytes32 value","nonpayable"]},{"cells":["saved(uint256 blockNumber)","bytes32 blockHash","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["BatchMetadataUpdate(uint256 fromTokenId, uint256 toTokenId)"]},{"cells":["BlockHashSaved(uint256 indexed blockNumber, bytes32 indexed blockHash)"]},{"cells":["SeedBatchCommitted(uint64 targetBlock, uint256 indexed batchId, uint256 quantity, uint256 firstTokenId, bytes32 indexed commitment)"]},{"cells":["SeedBatchRevealed(uint256 indexed batchId, bytes32 indexed seed)"]},{"cells":["SeedProfileConfigured(bytes32 indexed profileDigest)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidHeaderProof()"]},{"cells":["InvalidSeedProfile()"]},{"cells":["MalformedRlp()"]},{"cells":["SeedBatchMissing()"]},{"cells":["SeedHashUnavailable(uint256 targetBlock)"]},{"cells":["SeedProfileLocked()"]},{"cells":["SeedRevealPending(uint256 targetBlock)"]},{"cells":["SeedSourceChanged()"]},{"cells":["SeedSourceFailed()"]},{"cells":["SeedVrfPending(uint256 batchId)"]}],"caption":"Custom errors","collapsed":true}]}]},{"id":"keelseedvrfadapter","title":"KeelSeedVrfAdapter","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelSeedVrfAdapter","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelSeedVrfAdapter.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelSeedVrfAdapter.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["access(address account)","uint256 flags","view"]},{"cells":["batchEntropy(address collection, uint256 batchId)","bool ready, bytes32 word","view"]},{"cells":["buyClaims(uint256 quantity, uint256 expectedPrice)","—","payable"]},{"cells":["callbackGas()","uint32","view"]},{"cells":["claimPriceWei()","uint256","view"]},{"cells":["claims(address account)","uint256 credits","view"]},{"cells":["confirmations()","uint16","view"]},{"cells":["coordinator()","address","view"]},{"cells":["deliver(uint256 requestId)","—","nonpayable"]},{"cells":["deliveries(uint256 requestId)","address collection, uint32 batchId, bool ready, bool delivered, bytes32 word","view"]},{"cells":["keyHash()","bytes32","view"]},{"cells":["nativePayment()","bool","view"]},{"cells":["owner()","address","view"]},{"cells":["prepaid()","bool","view"]},{"cells":["rawFulfillRandomWords(uint256 requestId, uint256[] words)","—","nonpayable"]},{"cells":["renounceOwnership()","—","nonpayable"]},{"cells":["request(address collection, uint256 batchId)","uint256 requestId","nonpayable"]},{"cells":["requests(address collection, uint256 batchId)","uint256 requestId","view"]},{"cells":["setAccess(address account, uint256 flags)","—","nonpayable"]},{"cells":["setClaimPrice(uint256 price)","—","nonpayable"]},{"cells":["subscriptionId()","uint256","view"]},{"cells":["transferOwnership(address newOwner)","—","nonpayable"]},{"cells":["treasury()","address","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["OwnershipTransferred(address indexed previousOwner, address indexed newOwner)"]},{"cells":["SeedCreditPriceSet(uint256 priceWei)"]},{"cells":["SeedCreditsBought(uint256 paidWei, uint256 quantity, address indexed buyer)"]},{"cells":["SeedVrfAccessSet(uint256 flags, address indexed account)"]},{"cells":["SeedVrfDelivered(uint256 indexed requestId)"]},{"cells":["SeedVrfReceived(uint256 indexed requestId)"]},{"cells":["SeedVrfRequested(uint256 indexed batchId, uint256 indexed requestId, address indexed collection)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["InsufficientSeedCredits()"]},{"cells":["InvalidVrfConfiguration()"]},{"cells":["InvalidVrfResponse()"]},{"cells":["OwnableInvalidOwner(address owner)"]},{"cells":["OwnableUnauthorizedAccount(address account)"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["SeedCreditPaymentFailed()"]},{"cells":["SeedCreditPaymentMismatch()"]},{"cells":["UnauthorizedVrfRequest()"]},{"cells":["VrfRequestNotReady()"]},{"cells":["VrfRequestUsed()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin, address coordinator_, bytes32 keyHash_, uint256 subscription, uint16 confirmations_, uint32 callbackGas_, bool native_, bool prepaid_, address treasury_, uint256 price)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelrevisioned721","title":"KeelRevisioned721","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelRevisioned721","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelRevisioned721.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelRevisioned721.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["MINTER_ROLE()","bytes32","view"]},{"cells":["PER_TOKEN_MINT_DATA_DOMAIN()","bytes32","view"]},{"cells":["adminStrike(address to, uint256 quantity)","—","nonpayable"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["approve(address to, uint256 tokenId)","—","nonpayable"]},{"cells":["balanceOf(address owner)","uint256","view"]},{"cells":["collectionDescription()","string","view"]},{"cells":["defaultPresentationBinding()","bytes32","view"]},{"cells":["defaultPresentationFrozen()","bool","view"]},{"cells":["freezeDefaultPresentation()","—","nonpayable"]},{"cells":["freezePresentation(uint256 tokenId)","—","nonpayable"]},{"cells":["getApproved(uint256 tokenId)","address","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["harnessContext(uint256 tokenId)","bytes","view"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["isApprovedForAll(address owner, address operator)","bool","view"]},{"cells":["isCampaignCreator(address account)","bool","view"]},{"cells":["keelIndex()","address","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["maxSupply()","uint256","view"]},{"cells":["metadataRelay()","address","view"]},{"cells":["name()","string","view"]},{"cells":["nextTokenId()","uint256","view"]},{"cells":["notifyDependencyMetadata(uint256 first, uint256 last)","—","nonpayable"]},{"cells":["notifyIndexRevision(uint256 tokenId, bool tokenSpecific)","—","nonpayable"]},{"cells":["onchainHarnessBuilder()","address","view"]},{"cells":["onchainPresentation()","address builder, bytes32 harnessObjectId, bytes32 harnessDigest, bytes32 fragmentObjectId, bytes32 fragmentDigest","view"]},{"cells":["ownerOf(uint256 tokenId)","address","view"]},{"cells":["presentation(uint256 tokenId)","string manifestURI, bytes32 manifestDigest, string previewImageURI","view"]},{"cells":["presentationModule()","address","view"]},{"cells":["releaseStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["removeMetadataDependency(address relay, uint256 id)","—","nonpayable"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["reserveStrikeCapacity(uint256 quantity)","—","nonpayable"]},{"cells":["reservedStrikeCapacity(address manager)","uint256 quantity","view"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["royaltyInfo(uint256 tokenId, uint256 salePrice)","address receiver, uint256 amount","view"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId)","—","nonpayable"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId, bytes data)","—","nonpayable"]},{"cells":["setApprovalForAll(address operator, bool approved)","—","nonpayable"]},{"cells":["setCollectionDescription(string value)","—","nonpayable"]},{"cells":["setDefaultPresentation(string manifestURI, bytes32 manifestDigest, string previewImageURI, string harnessBaseURI_)","—","nonpayable"]},{"cells":["setDefaultRoyalty(address receiver, uint96 feeNumerator)","—","nonpayable"]},{"cells":["setKeelIndex(address registry)","—","nonpayable"]},{"cells":["setMetadataRelay(address relay)","—","nonpayable"]},{"cells":["setOnchainHarness(address builder, bytes32 objectId, bytes32 digest)","—","nonpayable"]},{"cells":["setPreEncodedOnchainHarness(address builder, bytes32 objectId, bytes32 digest)","—","nonpayable"]},{"cells":["setPreparedOnchainHarness(address builder, bytes32 objectId, bytes32 digest, bytes encodedPrefix, bytes encodedSuffix)","—","nonpayable"]},{"cells":["setPresentationModule(address module)","—","nonpayable"]},{"cells":["setTokenOwnerCanEdit(bool enabled)","—","nonpayable"]},{"cells":["setTokenPresentation(uint256 tokenId, string manifestURI, bytes32 manifestDigest, string previewImageURI)","—","nonpayable"]},{"cells":["strikeFromManager(address to, uint256 quantity, bytes data)","—","nonpayable"]},{"cells":["subscribeMetadataDependency(address source, bytes query, uint32 readGas, uint256 first, uint256 last)","uint256","nonpayable"]},{"cells":["supportsCompactTokenURI()","bool","pure"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["symbol()","string","view"]},{"cells":["tokenJSON(uint256 tokenId)","string","view"]},{"cells":["tokenOwnerCanEdit()","bool","view"]},{"cells":["tokenURI(uint256 tokenId)","string","view"]},{"cells":["totalReservedStrikeCapacity()","uint256","view"]},{"cells":["totalSupply()","uint256","view"]},{"cells":["transferFrom(address from, address to, uint256 tokenId)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)"]},{"cells":["ApprovalForAll(address indexed owner, address indexed operator, bool approved)"]},{"cells":["BatchMetadataUpdate(uint256 fromTokenId, uint256 toTokenId)"]},{"cells":["DefaultPresentationPermanentlyFrozen()"]},{"cells":["DefaultPresentationUpdated(string manifestURI, bytes32 manifestDigest, string previewImageURI)"]},{"cells":["HarnessBaseURIUpdated(string harnessBaseURI)"]},{"cells":["KeelIndexUpdated(address indexed registry)"]},{"cells":["ManagerStrikeData(address indexed recipient, uint256 indexed firstTokenId, uint256 quantity, bytes data)"]},{"cells":["ManagerTokenStrikeData(address indexed recipient, uint256 indexed tokenId, uint256 indexed tokenIndex, bytes32 mintDataDigest)"]},{"cells":["MetadataRelaySet(uint256 indexed scope, address indexed relay)"]},{"cells":["MetadataUpdate(uint256 tokenId)"]},{"cells":["OnchainHarnessUpdated(address indexed builder, bytes32 indexed objectId, bytes32 indexed digest)"]},{"cells":["OnchainTokenURIFragmentUpdated(bytes32 indexed objectId, bytes32 indexed digest)"]},{"cells":["PreparedTokenURIFragmentsUpdated(bytes32 indexed prefixDigest, bytes32 indexed suffixDigest)"]},{"cells":["PresentationFrozenForToken(uint256 indexed tokenId)"]},{"cells":["PresentationModuleSet(address indexed module)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["StrikeCapacityConsumed(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReleased(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["StrikeCapacityReserved(address indexed manager, uint256 quantity, uint256 managerTotal, uint256 globalTotal)"]},{"cells":["TokenPresentationUpdated(uint256 indexed tokenId, string manifestURI, bytes32 manifestDigest, string previewImageURI)"]},{"cells":["Transfer(address indexed from, address indexed to, uint256 indexed tokenId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidDefaultRoyaltyReceiver(address receiver)"]},{"cells":["ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator)"]},{"cells":["ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver)"]},{"cells":["ERC721IncorrectOwner(address sender, uint256 tokenId, address owner)"]},{"cells":["ERC721InsufficientApproval(address operator, uint256 tokenId)"]},{"cells":["ERC721InvalidApprover(address approver)"]},{"cells":["ERC721InvalidOperator(address operator)"]},{"cells":["ERC721InvalidOwner(address owner)"]},{"cells":["ERC721InvalidReceiver(address receiver)"]},{"cells":["ERC721InvalidSender(address sender)"]},{"cells":["ERC721NonexistentToken(uint256 tokenId)"]},{"cells":["InvalidMetadataRange()"]},{"cells":["InvalidMetadataRelay()"]},{"cells":["InvalidPerTokenMintData()"]},{"cells":["InvalidPresentation()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidReservation()"]},{"cells":["InvalidRoyalty()"]},{"cells":["InvalidSupply()"]},{"cells":["LastAdministrator()"]},{"cells":["OutstandingMintReservation()"]},{"cells":["PreparedTokenURIOnly()"]},{"cells":["PresentationFrozen()"]},{"cells":["ReservedCapacityExceeded()"]},{"cells":["SupplyExceeded()"]},{"cells":["UnauthorizedMetadataRelay()"]},{"cells":["UnauthorizedPresentationEditor()"]},{"cells":["UnsupportedPresentationRoute()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(string name_, string symbol_, address admin, address mintManager, address registry, address royaltyReceiver, uint96 royaltyBps, uint256 maxSupply_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelregisteredartifactfragment721presentation","title":"KeelRegisteredArtifactFragment721Presentation","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelRegisteredArtifactFragment721Presentation","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/KeelRegisteredArtifactFragment721Presentation.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/KeelRegisteredArtifactFragment721Presentation.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["collection()","address","view"]},{"cells":["contextJSON(uint256 tokenId)","bytes","view"]},{"cells":["freeze(uint256 tokenId)","—","nonpayable"]},{"cells":["frozen(address collection_, uint256 tokenId)","bool","view"]},{"cells":["imageURI(address collection_, uint256 tokenId, string)","string","view"]},{"cells":["resolver()","address","view"]},{"cells":["seedOf(uint256 tokenId)","bytes32","view"]},{"cells":["seedRegistry()","address","view"]},{"cells":["seedSetId()","bytes32","view"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","pure"]},{"cells":["tokenURI(address collection_, uint256 tokenId)","bool overridden, string uri","view"]},{"cells":["tokenURIDirect(address collection_, uint256 tokenId)","string","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidBinding()"]},{"cells":["PresentationFrozen()"]},{"cells":["StringsInsufficientHexLength(uint256 value, uint256 length)"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address collection_, address resolver_, address seedRegistry_, bytes32 seedSetId_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keel721metadataformatting","title":"Keel721MetadataFormatting","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"Keel721MetadataFormatting","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/libraries/Keel721MetadataFormatting.sol"},{"label":"Download ABI","href":"/docs/abi/keel-die/Keel721MetadataFormatting.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["contextScriptTail(bytes contextJSON)","bytes","pure"]},{"cells":["defaultContext(uint256 tokenId, bytes32 manifestDigest)","bytes","view"]},{"cells":["footer(string uri, bytes32 digest, string attributes)","string","pure"]},{"cells":["harnessURL(string value, uint256 tokenId)","string","view"]},{"cells":["head(string name, string description, uint256 id, string image)","string","pure"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["StringsInsufficientHexLength(uint256 value, uint256 length)"]}],"caption":"Custom errors","collapsed":true}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelCollectionFA2","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-die/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-die/tezos"},{"label":"Native module configuration","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-die/keel.module.json"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["add_administrator","entrypoint","keel_collection_fa2.py"]},{"cells":["remove_administrator","entrypoint","keel_collection_fa2.py"]},{"cells":["set_minter","entrypoint","keel_collection_fa2.py"]},{"cells":["reserve_capacity","entrypoint","keel_collection_fa2.py"]},{"cells":["release_capacity","entrypoint","keel_collection_fa2.py"]},{"cells":["strike","entrypoint","keel_collection_fa2.py"]},{"cells":["set_keel_index","entrypoint","keel_collection_fa2.py"]},{"cells":["set_default_presentation","entrypoint","keel_collection_fa2.py"]},{"cells":["freeze_default_presentation","entrypoint","keel_collection_fa2.py"]},{"cells":["set_token_metadata","entrypoint","keel_collection_fa2.py"]},{"cells":["set_token_json","entrypoint","keel_collection_fa2.py"]},{"cells":["freeze_token_metadata","entrypoint","keel_collection_fa2.py"]},{"cells":["transfer","entrypoint","keel_collection_fa2.py"]},{"cells":["update_operators","entrypoint","keel_collection_fa2.py"]},{"cells":["balance_of","entrypoint","keel_collection_fa2.py"]},{"cells":["get_balance","onchain_view","keel_collection_fa2.py"]},{"cells":["token_metadata","onchain_view","keel_collection_fa2.py"]},{"cells":["token_json","onchain_view","keel_collection_fa2.py"]},{"cells":["token_metadata_frozen","onchain_view","keel_collection_fa2.py"]},{"cells":["total_supply","onchain_view","keel_collection_fa2.py"]},{"cells":["is_administrator","onchain_view","keel_collection_fa2.py"]},{"cells":["administrator_count","onchain_view","keel_collection_fa2.py"]},{"cells":["is_minter","onchain_view","keel_collection_fa2.py"]},{"cells":["reserved_capacity_of","onchain_view","keel_collection_fa2.py"]},{"cells":["keel_index","onchain_view","keel_collection_fa2.py"]},{"cells":["default_presentation","onchain_view","keel_collection_fa2.py"]},{"cells":["presentation_frozen","onchain_view","keel_collection_fa2.py"]}],"caption":"Native interface","collapsed":true}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-graph","navTitle":"Graph trust lattice (keel-graph)","eyebrow":"Technical reference","title":"Graph trust lattice (keel-graph)","summary":"Graph/plugin/library/module registries — the on-chain trust lattice the runtime re-derives against.","thesis":"Graph/plugin/library/module registries — the on-chain trust lattice the runtime re-derives against.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Graph/plugin/library/module registries — the on-chain trust lattice the runtime re-derives against.","cards":[{"title":"keel-graph","body":"Graph/plugin/library/module registries — the on-chain trust lattice the runtime re-derives against.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"None"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-graph/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-graph"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-graph"}]}]},{"id":"keelassettagregistry","title":"KeelAssetTagRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelAssetTagRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-graph/KeelAssetTagRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-graph/KeelAssetTagRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["MAX_COMMUNITY_ACTIVE_TAGS()","uint256","view"]},{"cells":["MAX_LABEL_BYTES()","uint256","view"]},{"cells":["MAX_TAG_BATCH()","uint256","view"]},{"cells":["bitIndex(uint64 tagId_)","uint8","pure"]},{"cells":["canonicalTagWord(bytes32 assetId, uint256 wordIndex_)","uint256","view"]},{"cells":["canonicalWord(bytes32 assetId, uint256 wordIndex_)","uint256","view"]},{"cells":["communityCount(bytes32 assetId, address account)","uint256","view"]},{"cells":["communityTagCount(bytes32 assetId, address account)","uint256","view"]},{"cells":["communityTagWord(bytes32 assetId, address account, uint256 wordIndex_)","uint256","view"]},{"cells":["communityWord(bytes32 assetId, address account, uint256 wordIndex_)","uint256","view"]},{"cells":["defineCanonicalTag(bytes32 assetId, string label_)","uint64 tagId_","nonpayable"]},{"cells":["defineCanonicalTags(bytes32 assetId, string[] labels)","uint64[] tagIds","nonpayable"]},{"cells":["has(bytes32 assetId, uint64 tagId_)","bool","view"]},{"cells":["hasCommunityTag(bytes32 assetId, address account, uint64 tagId_)","bool","view"]},{"cells":["hasTag(bytes32 assetId, uint64 tagId_)","bool","view"]},{"cells":["id(string label_)","uint64","view"]},{"cells":["label(uint64 tagId_)","string","view"]},{"cells":["libraryRegistry()","address","view"]},{"cells":["nextTagId()","uint64","view"]},{"cells":["setCanonicalTags(bytes32 assetId, uint64[] tagIds, bool enabled)","—","nonpayable"]},{"cells":["setCanonicalTagsByLabel(bytes32 assetId, string[] labels, bool enabled)","uint64[] tagIds","nonpayable"]},{"cells":["setCommunityTags(bytes32 assetId, uint64[] tagIds, bool enabled)","—","nonpayable"]},{"cells":["setCommunityTagsByLabel(bytes32 assetId, string[] labels, bool enabled)","uint64[] tagIds","nonpayable"]},{"cells":["tagId(string label_)","uint64","view"]},{"cells":["tagIdFor(string label_)","uint64","view"]},{"cells":["tagLabel(uint64 tagId_)","string","view"]},{"cells":["word(bytes32 assetId, uint256 wordIndex_)","uint256","view"]},{"cells":["wordIndex(uint64 tagId_)","uint256","pure"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CanonicalTagUpdated(bytes32 indexed assetId, uint64 indexed tagId, bool enabled, address indexed actor)"]},{"cells":["CommunityTagUpdated(bytes32 indexed assetId, address indexed account, uint64 indexed tagId, bool enabled)"]},{"cells":["TagDefined(uint64 indexed tagId, bytes32 indexed labelHash, string label, address indexed actor)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["BatchTooLarge()"]},{"cells":["CommunityTagLimitExceeded()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidLabel()"]},{"cells":["LibraryAssetFrozen()"]},{"cells":["LibraryAssetMissing()"]},{"cells":["TagIdExhausted()"]},{"cells":["TagMissing()"]},{"cells":["UnauthorizedCanonicalWriter()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address libraryRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelgraphregistry","title":"KeelGraphRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelGraphRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-graph/KeelGraphRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-graph/KeelGraphRegistry.json"},{"label":"Sepolia showcase · 0x5b86439598d2091bf45971c3676eb25c5d64dca4","href":"https://sepolia.etherscan.io/address/0x5b86439598d2091bf45971c3676eb25c5d64dca4#code"},{"label":"Sepolia trusted-runtime · 0x5b86439598d2091bf45971c3676eb25c5d64dca4","href":"https://sepolia.etherscan.io/address/0x5b86439598d2091bf45971c3676eb25c5d64dca4#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["GRAPH_ID_DOMAIN()","bytes32","view"]},{"cells":["MAX_MANIFEST_URI_BYTES()","uint256","view"]},{"cells":["acceptPublisher(bytes32 graphId)","—","nonpayable"]},{"cells":["activateVersion(bytes32 graphId, uint64 version)","—","nonpayable"]},{"cells":["activeVersion(bytes32 graphId)","(string,bytes32,bytes32,bytes32,uint64,uint64,uint64,uint8,bool,bool)","view"]},{"cells":["beginPublisherTransfer(bytes32 graphId, address pendingPublisher)","—","nonpayable"]},{"cells":["createGraph(bytes32 salt, uint8 kind, string manifestURI, bytes32 manifestDigest, bytes32 resourceGraphDigest, bytes32 metadataDigest, uint8 storageTier)","bytes32 graphId","nonpayable"]},{"cells":["freezeGraph(bytes32 graphId)","—","nonpayable"]},{"cells":["graph(bytes32 graphId)","(address,address,uint8,uint8,uint64,uint64,bool,bool)","view"]},{"cells":["graphKind(bytes32 graphId)","uint8","view"]},{"cells":["graphPublisher(bytes32 graphId)","address","view"]},{"cells":["predictGraphId(address publisher, bytes32 salt)","bytes32","pure"]},{"cells":["promoteMinimumTier(bytes32 graphId, uint8 minimumTier)","—","nonpayable"]},{"cells":["publishVersion(bytes32 graphId, uint64 expectedParent, string manifestURI, bytes32 manifestDigest, bytes32 resourceGraphDigest, bytes32 metadataDigest, uint8 storageTier)","uint64 version","nonpayable"]},{"cells":["versionOf(bytes32 graphId, uint64 version)","(string,bytes32,bytes32,bytes32,uint64,uint64,uint64,uint8,bool,bool)","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["GraphCreated(bytes32 indexed graphId, address indexed publisher, uint8 indexed kind)"]},{"cells":["GraphMinimumTierPromoted(bytes32 indexed graphId, uint8 previousTier, uint8 indexed minimumTier)"]},{"cells":["GraphPermanentlyFrozen(bytes32 indexed graphId, uint64 indexed activeVersion, uint8 minimumTier)"]},{"cells":["GraphPublisherTransferStarted(bytes32 indexed graphId, address indexed previousPublisher, address indexed pendingPublisher)"]},{"cells":["GraphPublisherTransferred(bytes32 indexed graphId, address indexed previousPublisher, address indexed publisher)"]},{"cells":["GraphVersionActivated(bytes32 indexed graphId, uint64 indexed version, uint8 storageTier)"]},{"cells":["GraphVersionPublished(bytes32 indexed graphId, uint64 indexed version, uint64 indexed parentVersion, bytes32 manifestDigest, bytes32 resourceGraphDigest, bytes32 metadataDigest, uint8 storageTier, string manifestURI, address publisher)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["GraphAlreadyExists()"]},{"cells":["GraphFrozen()"]},{"cells":["GraphMissing()"]},{"cells":["InvalidManifest()"]},{"cells":["InvalidParent()"]},{"cells":["InvalidPublisherTransfer()"]},{"cells":["PendingVersionExists()"]},{"cells":["StorageTierRegression()"]},{"cells":["Unauthorized()"]},{"cells":["VersionMissing()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true}]}]},{"id":"keellibraryregistry","title":"KeelLibraryRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelLibraryRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-graph/KeelLibraryRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-graph/KeelLibraryRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ALLOWLIST_LEAF_DOMAIN()","bytes32","view"]},{"cells":["ASSET_ID_DOMAIN()","bytes32","view"]},{"cells":["PAID_GRANT_DOMAIN()","bytes32","view"]},{"cells":["POLICY_COMMITMENT_DOMAIN()","bytes32","view"]},{"cells":["TOKEN_GATE_GAS_LIMIT()","uint256","view"]},{"cells":["acceptController(bytes32 assetId)","—","nonpayable"]},{"cells":["accessRequest(bytes32 assetId, uint64 policyVersion, address account)","(uint64,uint64,uint64,bytes32,bytes32,uint8)","view"]},{"cells":["activatePolicy(bytes32 assetId, uint64 policyVersion)","—","nonpayable"]},{"cells":["activePolicy(bytes32 assetId)","(bytes32,bytes32,bytes32,bytes32,uint64,uint8,uint8,address,uint128,uint64,uint64,uint64,bytes32,address,uint128,bytes32,uint64,uint64,bool) value, uint64 policyVersion","view"]},{"cells":["allowlistClaimed(bytes32 assetId, uint64 policyVersion, address account)","bool claimed","view"]},{"cells":["allowlistLeaf(bytes32 assetId, uint64 policyVersion, address account)","bytes32","view"]},{"cells":["asset(bytes32 assetId)","(bytes32,uint64,uint64,uint8,uint8,address,address,bool,bool,bool)","view"]},{"cells":["beginControllerTransfer(bytes32 assetId, address pendingController)","—","nonpayable"]},{"cells":["claimAllowlistAccess(bytes32 assetId, uint64 expectedPolicyVersion, bytes32 expectedPolicyCommitment, bytes32[] proof)","—","nonpayable"]},{"cells":["closeAsset(bytes32 assetId)","—","nonpayable"]},{"cells":["credit(address account)","uint256 amount","view"]},{"cells":["entitlement(bytes32 assetId, uint64 policyVersion, address account)","(uint64,uint64,uint64,bool,bool)","view"]},{"cells":["freezeAsset(bytes32 assetId)","—","nonpayable"]},{"cells":["grantCount(bytes32 assetId, uint64 policyVersion, address account)","uint64","view"]},{"cells":["grantRecord(bytes32 assetId, uint64 policyVersion, address account, uint64 grantNumber)","(address,uint64,uint64,uint64,bytes32,bool)","view"]},{"cells":["graphRegistry()","address","view"]},{"cells":["hasAccess(bytes32 assetId, address account)","bool","view"]},{"cells":["hasAccessAtPolicy(bytes32 assetId, uint64 policyVersion, address account)","bool","view"]},{"cells":["hasAccessWithProof(bytes32 assetId, address account, bytes32[] proof)","bool","view"]},{"cells":["hasAccessWithProofAtPolicy(bytes32 assetId, uint64 policyVersion, address account, bytes32[] proof)","bool","view"]},{"cells":["indexAsset(bytes32 salt, bytes32 graphId, uint64 graphVersion, uint8 kind, bytes32 catalogMetadataDigest, (uint8,address,uint128,uint64,uint64,uint64,bytes32,address,uint128,bytes32) initialPolicy)","bytes32 assetId","nonpayable"]},{"cells":["policy(bytes32 assetId, uint64 policyVersion)","(bytes32,bytes32,bytes32,bytes32,uint64,uint8,uint8,address,uint128,uint64,uint64,uint64,bytes32,address,uint128,bytes32,uint64,uint64,bool)","view"]},{"cells":["policyCommitment(bytes32 assetId, bytes32 graphId, uint64 graphVersion, uint64 policyVersion, bytes32 manifestDigest, bytes32 resourceGraphDigest, uint8 storageTier, bytes32 catalogMetadataDigest, (uint8,address,uint128,uint64,uint64,uint64,bytes32,address,uint128,bytes32) input)","bytes32","view"]},{"cells":["predictAssetId(address creator, bytes32 salt)","bytes32","view"]},{"cells":["promoteMinimumTier(bytes32 assetId, uint8 minimumTier)","—","nonpayable"]},{"cells":["publishPolicy(bytes32 assetId, uint64 expectedParent, uint64 graphVersion, bytes32 catalogMetadataDigest, (uint8,address,uint128,uint64,uint64,uint64,bytes32,address,uint128,bytes32) input)","uint64 policyVersion","nonpayable"]},{"cells":["purchaseAccess(bytes32 assetId, uint64 expectedPolicyVersion, bytes32 expectedPolicyCommitment)","—","payable"]},{"cells":["resolveAccessRequest(bytes32 assetId, uint64 policyVersion, bytes32 expectedPolicyCommitment, address account, bool approve, bytes32 decisionDigest)","—","nonpayable"]},{"cells":["submitAccessRequest(bytes32 assetId, uint64 expectedPolicyVersion, bytes32 expectedPolicyCommitment, bytes32 submissionDigest)","—","nonpayable"]},{"cells":["totalCreditLiability()","uint256","view"]},{"cells":["withdraw(address recipient)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessGranted(bytes32 indexed assetId, address indexed account, uint64 indexed grantNumber, uint64 policyVersion, uint64 startsAt, uint64 expiresAt, bool permanent, bytes32 evidenceDigest, address issuer)"]},{"cells":["AccessPolicyActivated(bytes32 indexed assetId, uint64 indexed policyVersion)"]},{"cells":["AccessPolicyPublished(bytes32 indexed assetId, uint64 indexed policyVersion, uint64 indexed parentVersion, uint64 graphVersion, uint8 mode, bytes32 termsDigest, bytes32 policyCommitment, address publisher)"]},{"cells":["AccessPurchased(bytes32 indexed assetId, uint64 indexed policyVersion, address indexed account, uint256 amount, address payout)"]},{"cells":["AccessRequestResolved(bytes32 indexed assetId, uint64 indexed policyVersion, address indexed account, bool approved, bytes32 decisionDigest)"]},{"cells":["AccessRequested(bytes32 indexed assetId, uint64 indexed policyVersion, address indexed account, bytes32 submissionDigest)"]},{"cells":["LibraryAssetIndexed(bytes32 indexed assetId, bytes32 indexed graphId, uint64 indexed graphVersion, uint8 kind, bytes32 manifestDigest, bytes32 resourceGraphDigest, uint8 storageTier, bytes32 catalogMetadataDigest, bytes32 policyCommitment, address publisher)"]},{"cells":["LibraryAssetPermanentlyClosed(bytes32 indexed assetId, uint64 indexed policyVersion)"]},{"cells":["LibraryAssetPermanentlyFrozen(bytes32 indexed assetId, uint64 indexed policyVersion)"]},{"cells":["LibraryControllerTransferStarted(bytes32 indexed assetId, address indexed previousController, address indexed pendingController)"]},{"cells":["LibraryControllerTransferred(bytes32 indexed assetId, address indexed previousController, address indexed controller)"]},{"cells":["LibraryMinimumTierPromoted(bytes32 indexed assetId, uint8 previousTier, uint8 indexed minimumTier)"]},{"cells":["ProceedsWithdrawn(address indexed account, address indexed recipient, uint256 amount)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AlreadyClaimed()"]},{"cells":["AlreadyPermanent()"]},{"cells":["AssetAlreadyExists()"]},{"cells":["AssetClosed()"]},{"cells":["AssetFrozen()"]},{"cells":["AssetMissing()"]},{"cells":["EtherTransferFailed()"]},{"cells":["IncorrectPayment()"]},{"cells":["InvalidCommitment()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidControllerTransfer()"]},{"cells":["InvalidGrant()"]},{"cells":["InvalidParent()"]},{"cells":["InvalidPolicy()"]},{"cells":["InvalidProof()"]},{"cells":["InvalidWindow()"]},{"cells":["NothingToWithdraw()"]},{"cells":["PendingPolicyExists()"]},{"cells":["PolicyInactive()"]},{"cells":["PolicyMissing()"]},{"cells":["PolicyUnavailable()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["RequestAlreadyExists()"]},{"cells":["RequestMissing()"]},{"cells":["Unauthorized()"]},{"cells":["WrongAccessMode()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address graphRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelmodulereviewregistry","title":"KeelModuleReviewRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelModuleReviewRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-graph/KeelModuleReviewRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-graph/KeelModuleReviewRegistry.json"},{"label":"Sepolia trusted-runtime · 0x9abb1f929a05e0ddf558aa9f594ec7775e28f8b2","href":"https://sepolia.etherscan.io/address/0x9abb1f929a05e0ddf558aa9f594ec7775e28f8b2#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["APPROVER_ROLE()","bytes32","view"]},{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["MODULE_PROTOCOL()","bytes32","view"]},{"cells":["SPEC_DOMAIN()","bytes32","view"]},{"cells":["bindingsMatch(bytes32 digest)","bool","view"]},{"cells":["deprecateModule(bytes32 digest, bytes32 reasonDigest, bytes32 replacementSpecDigest, uint64 validUntil)","—","nonpayable"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["graphRegistry()","address","view"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["moduleAuthorized(bytes32 digest)","bool","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["review(bytes32 digest)","(uint8,bytes32,bytes32,bytes32,uint64,uint64,address)","view"]},{"cells":["revokeModule(bytes32 digest, bytes32 reasonDigest, bytes32 replacementSpecDigest)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["sanctionModule(bytes32 digest, bytes32 reviewDigest, uint64 validUntil)","—","nonpayable"]},{"cells":["specDigest((bytes32,uint64,uint8,bytes32,uint64,bytes32,bytes32,bytes32) spec)","bytes32","view"]},{"cells":["submission(bytes32 digest)","((bytes32,uint64,uint8,bytes32,uint64,bytes32,bytes32,bytes32),address,uint64,bool)","view"]},{"cells":["submitModule((bytes32,uint64,uint8,bytes32,uint64,bytes32,bytes32,bytes32) spec)","bytes32 digest","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["ModuleDeprecated(bytes32 indexed specDigest, bytes32 indexed reasonDigest, bytes32 indexed replacementSpecDigest, uint64 validUntil, address reviewer)"]},{"cells":["ModuleRevoked(bytes32 indexed specDigest, bytes32 indexed reasonDigest, bytes32 indexed replacementSpecDigest, address reviewer)"]},{"cells":["ModuleSanctioned(bytes32 indexed specDigest, bytes32 indexed reviewDigest, uint64 validUntil, address indexed reviewer)"]},{"cells":["ModuleSubmitted(bytes32 indexed specDigest, bytes32 indexed moduleId, uint64 indexed moduleVersion, uint8 format, bytes32 graphId, uint64 graphVersion, bytes32 manifestDigest, address submitter)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["InvalidContract()"]},{"cells":["InvalidExpiry()"]},{"cells":["InvalidGraphKind()"]},{"cells":["InvalidSpec()"]},{"cells":["InvalidStatus()"]},{"cells":["ManifestBindingMismatch()"]},{"cells":["ResourceBindingMismatch()"]},{"cells":["SpecAlreadySubmitted()"]},{"cells":["SpecMissing()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin, address approver, address graphRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelpluginregistry","title":"KeelPluginRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelPluginRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-graph/KeelPluginRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-graph/KeelPluginRegistry.json"},{"label":"Sepolia showcase · 0xb7a4f9d0ef9d81ab4190d847e804e27c1ea820fd","href":"https://sepolia.etherscan.io/address/0xb7a4f9d0ef9d81ab4190d847e804e27c1ea820fd#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["APPROVER_ROLE()","bytes32","view"]},{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["PLUGIN_PROTOCOL()","bytes32","view"]},{"cells":["SPEC_DOMAIN()","bytes32","view"]},{"cells":["bindingsMatch(bytes32 digest)","bool","view"]},{"cells":["deprecatePlugin(bytes32 digest, bytes32 reasonDigest, bytes32 replacementSpecDigest, uint64 walletValidUntil)","—","nonpayable"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["graphRegistry()","address","view"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["review(bytes32 digest)","(uint8,bytes32,bytes32,bytes32,uint64,uint64,address)","view"]},{"cells":["revokePlugin(bytes32 digest, bytes32 reasonDigest, bytes32 replacementSpecDigest)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["sanctionPlugin(bytes32 digest, bytes32 reviewDigest, uint64 walletValidUntil)","—","nonpayable"]},{"cells":["specDigest((bytes32,uint64,uint8,address,bytes32,bytes4,bytes32,uint64,bytes32,bytes32,bytes32,bytes32,bytes32,address,bytes32) spec)","bytes32","view"]},{"cells":["submission(bytes32 digest)","((bytes32,uint64,uint8,address,bytes32,bytes4,bytes32,uint64,bytes32,bytes32,bytes32,bytes32,bytes32,address,bytes32),address,uint64,bool)","view"]},{"cells":["submitPlugin((bytes32,uint64,uint8,address,bytes32,bytes4,bytes32,uint64,bytes32,bytes32,bytes32,bytes32,bytes32,address,bytes32) spec)","bytes32 digest","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["walletAuthorized(bytes32 digest)","bool","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["PluginDeprecated(bytes32 indexed specDigest, bytes32 indexed reasonDigest, bytes32 indexed replacementSpecDigest, uint64 walletValidUntil, address reviewer)"]},{"cells":["PluginRevoked(bytes32 indexed specDigest, bytes32 indexed reasonDigest, bytes32 indexed replacementSpecDigest, address reviewer)"]},{"cells":["PluginSanctioned(bytes32 indexed specDigest, bytes32 indexed reviewDigest, uint64 walletValidUntil, address indexed reviewer)"]},{"cells":["PluginSubmitted(bytes32 indexed specDigest, bytes32 indexed pluginId, uint64 indexed pluginVersion, uint8 kind, address target, bytes32 targetRuntimeCodeHash, bytes32 graphId, uint64 graphVersion, bytes32 pluginManifestDigest, address submitter)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["ContractBindingMismatch()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidExpiry()"]},{"cells":["InvalidSpec()"]},{"cells":["InvalidStatus()"]},{"cells":["ManifestBindingMismatch()"]},{"cells":["SpecAlreadySubmitted()"]},{"cells":["SpecMissing()"]},{"cells":["UpgradeableTargetForbidden()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin, address approver, address graphRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelGraphRegistry, KeelLibraryRegistry, KeelModuleReviewRegistry, KeelPluginRegistry","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-graph/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-graph/tezos"},{"label":"Native module configuration","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-graph/keel.module.json"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["predict_graph_id","onchain_view","keel_graph.py"]},{"cells":["create_graph","entrypoint","keel_graph.py"]},{"cells":["publish_version","entrypoint","keel_graph.py"]},{"cells":["activate_version","entrypoint","keel_graph.py"]},{"cells":["promote_minimum_tier","entrypoint","keel_graph.py"]},{"cells":["begin_publisher_transfer","entrypoint","keel_graph.py"]},{"cells":["accept_publisher","entrypoint","keel_graph.py"]},{"cells":["freeze_graph","entrypoint","keel_graph.py"]},{"cells":["graph","onchain_view","keel_graph.py"]},{"cells":["graph_exists","onchain_view","keel_graph.py"]},{"cells":["graph_record","onchain_view","keel_graph.py"]},{"cells":["graph_publisher","onchain_view","keel_graph.py"]},{"cells":["graph_publisher_opt","onchain_view","keel_graph.py"]},{"cells":["graph_kind","onchain_view","keel_graph.py"]},{"cells":["graph_kind_opt","onchain_view","keel_graph.py"]},{"cells":["version_of","onchain_view","keel_graph.py"]},{"cells":["get_version","onchain_view","keel_graph.py"]},{"cells":["active_version","onchain_view","keel_graph.py"]},{"cells":["index_asset","entrypoint","keel_graph.py"]},{"cells":["publish_policy","entrypoint","keel_graph.py"]},{"cells":["activate_policy","entrypoint","keel_graph.py"]},{"cells":["freeze_asset","entrypoint","keel_graph.py"]},{"cells":["close_asset","entrypoint","keel_graph.py"]},{"cells":["promote_minimum_tier","entrypoint","keel_graph.py"]},{"cells":["begin_controller_transfer","entrypoint","keel_graph.py"]},{"cells":["accept_controller","entrypoint","keel_graph.py"]},{"cells":["purchase_access","entrypoint","keel_graph.py"]},{"cells":["claim_allowlist_access","entrypoint","keel_graph.py"]},{"cells":["submit_access_request","entrypoint","keel_graph.py"]},{"cells":["resolve_access_request","entrypoint","keel_graph.py"]},{"cells":["withdraw","entrypoint","keel_graph.py"]},{"cells":["predict_asset_id","onchain_view","keel_graph.py"]},{"cells":["policy_commitment","onchain_view","keel_graph.py"]},{"cells":["allowlist_leaf","onchain_view","keel_graph.py"]},{"cells":["has_access","onchain_view","keel_graph.py"]},{"cells":["has_access_at_policy","onchain_view","keel_graph.py"]},{"cells":["has_access_with_proof","onchain_view","keel_graph.py"]},{"cells":["has_access_with_proof_at_policy","onchain_view","keel_graph.py"]},{"cells":["asset","onchain_view","keel_graph.py"]},{"cells":["policy","onchain_view","keel_graph.py"]},{"cells":["active_policy","onchain_view","keel_graph.py"]},{"cells":["entitlement","onchain_view","keel_graph.py"]},{"cells":["grant_count","onchain_view","keel_graph.py"]},{"cells":["grant_record","onchain_view","keel_graph.py"]},{"cells":["access_request","onchain_view","keel_graph.py"]},{"cells":["allowlist_claimed","onchain_view","keel_graph.py"]},{"cells":["credit_of","onchain_view","keel_graph.py"]},{"cells":["total_credit_liability","onchain_view","keel_graph.py"]},{"cells":["grant_approver","entrypoint","keel_graph.py"]},{"cells":["revoke_approver","entrypoint","keel_graph.py"]},{"cells":["submit_module","entrypoint","keel_graph.py"]},{"cells":["sanction_module","entrypoint","keel_graph.py"]},{"cells":["deprecate_module","entrypoint","keel_graph.py"]},{"cells":["revoke_module","entrypoint","keel_graph.py"]},{"cells":["module_protocol","onchain_view","keel_graph.py"]},{"cells":["spec_digest","onchain_view","keel_graph.py"]},{"cells":["submission","onchain_view","keel_graph.py"]},{"cells":["review","onchain_view","keel_graph.py"]},{"cells":["module_authorized","onchain_view","keel_graph.py"]},{"cells":["bindings_match","onchain_view","keel_graph.py"]},{"cells":["has_approver","onchain_view","keel_graph.py"]},{"cells":["grant_approver","entrypoint","keel_graph.py"]},{"cells":["revoke_approver","entrypoint","keel_graph.py"]},{"cells":["submit_plugin","entrypoint","keel_graph.py"]},{"cells":["sanction_plugin","entrypoint","keel_graph.py"]},{"cells":["deprecate_plugin","entrypoint","keel_graph.py"]},{"cells":["revoke_plugin","entrypoint","keel_graph.py"]},{"cells":["plugin_protocol","onchain_view","keel_graph.py"]},{"cells":["spec_digest","onchain_view","keel_graph.py"]},{"cells":["submission","onchain_view","keel_graph.py"]},{"cells":["review","onchain_view","keel_graph.py"]},{"cells":["wallet_authorized","onchain_view","keel_graph.py"]},{"cells":["bindings_match","onchain_view","keel_graph.py"]},{"cells":["has_approver","onchain_view","keel_graph.py"]}],"caption":"Native interface","collapsed":true}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-harness","navTitle":"On-chain HTML builder (keel-harness)","eyebrow":"Technical reference","title":"On-chain HTML builder (keel-harness)","summary":"Assembles viewer HTML from chunk-stored resources entirely on chain.","thesis":"Assembles viewer HTML from chunk-stored resources entirely on chain.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Assembles viewer HTML from chunk-stored resources entirely on chain.","cards":[{"title":"keel-harness","body":"Assembles viewer HTML from chunk-stored resources entirely on chain.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-hold, keel-kernel, keel-artifacts"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-harness/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-harness"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-harness"}]}]},{"id":"keelharnessbuilder","title":"KeelHarnessBuilder","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelHarnessBuilder","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-harness/KeelHarnessBuilder.sol"},{"label":"Download ABI","href":"/docs/abi/keel-harness/KeelHarnessBuilder.json"},{"label":"Sepolia showcase · 0x7ac86609d6781e896c541210fdd8d1d919c5584a","href":"https://sepolia.etherscan.io/address/0x7ac86609d6781e896c541210fdd8d1d919c5584a#code"},{"label":"Sepolia studio-runtime-20261007 · 0x63a172ae55a6c7413a2f80be9de9cd9cb106973d","href":"https://sepolia.etherscan.io/address/0x63a172ae55a6c7413a2f80be9de9cd9cb106973d#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["INLINE_PROTECTION_SHELL_ID()","bytes32","view"]},{"cells":["MAX_OBJECT_DEPTH()","uint256","view"]},{"cells":["MAX_RECONSTRUCTED_BYTES()","uint256","view"]},{"cells":["PROTECTION_SHELL_ID()","bytes32","view"]},{"cells":["SHELL_ID_DOMAIN()","bytes32","view"]},{"cells":["assembleWithContext(bytes32 objectId, bytes32 expectedDigest, bytes injection)","bytes","view"]},{"cells":["creatorManagedShell(bytes32 shellId)","bool managed","view"]},{"cells":["creatorShellImmutable(bytes32 shellId)","bool immutable_","view"]},{"cells":["freezeShell(bytes32 shellId)","uint64 revision","nonpayable"]},{"cells":["harnessDataURI(bytes32 objectId, bytes32 expectedDigest)","string","view"]},{"cells":["harnessDataURIWithContext(bytes32 objectId, bytes32 expectedDigest, bytes contextJSON)","string","view"]},{"cells":["harnessHTML(bytes32 objectId, bytes32 expectedDigest)","bytes output","view"]},{"cells":["harnessHTMLWithContext(bytes32 objectId, bytes32 expectedDigest, bytes contextJSON)","bytes","view"]},{"cells":["harnessInlineURI(bytes32 objectId, bytes32 expectedDigest)","string","view"]},{"cells":["harnessInlineURIWithContext(bytes32 objectId, bytes32 expectedDigest, bytes contextJSON)","string","view"]},{"cells":["harnessSourceValid(bytes32 objectId, bytes32 expectedDigest)","bool","view"]},{"cells":["itemBytes(bytes32 objectId, bytes32 expectedDigest)","bytes output","view"]},{"cells":["keelHold()","address","view"]},{"cells":["keeper()","address","view"]},{"cells":["percentEscape(bytes input)","bytes output","pure"]},{"cells":["preEncodedTokenJSONMiddle(bytes32 objectId, bytes32 expectedDigest)","bytes","view"]},{"cells":["preEncodedTokenURI(bytes32 objectId, bytes32 expectedDigest, bytes rawPrefix, bytes rawSuffix)","string","view"]},{"cells":["preEncodedTokenURIFragmentValid(bytes32 objectId, bytes32 expectedDigest)","bool","view"]},{"cells":["predictShellId(address creator, bytes32 salt)","bytes32","pure"]},{"cells":["preparedTokenURI(bytes32 objectId, bytes32 expectedDigest, bytes encodedPrefix, bytes encodedSuffix)","string","view"]},{"cells":["preparedTokenURIFragmentValid(bytes32 objectId, bytes32 expectedDigest)","bool","view"]},{"cells":["reconstructHTML(bytes32 objectId, bytes32 expectedDigest)","bytes output","view"]},{"cells":["registerShell(bytes32 salt, bytes32 prefix, bytes32 suffix, uint8 payloadMode, bytes32 metadataObjectId)","bytes32 shellId","nonpayable"]},{"cells":["registeredPreEncodedTokenURI(bytes32 shellId, bytes32 objectId, bytes32 expectedDigest, bytes rawPrefix, bytes rawSuffix)","string","view"]},{"cells":["requireRegistration(bytes32 objectId)","bool compact","view"]},{"cells":["setKeeper(address next)","—","nonpayable"]},{"cells":["setShell(bytes32 shellId, bytes32 prefix, bytes32 suffix, uint8 payloadMode)","—","nonpayable"]},{"cells":["setShell(bytes32 shellId, bytes32 prefix, bytes32 suffix)","—","nonpayable"]},{"cells":["setShell(bytes32 shellId, bytes32 prefix, bytes32 suffix, uint8 payloadMode, bytes32 metadataObjectId)","—","nonpayable"]},{"cells":["shellCreator(bytes32 shellId)","address creator","view"]},{"cells":["shellDataURI(bytes32 shellId, bytes32 artifactObjectId, bytes32 artifactDigest, bytes contextJSON)","string","view"]},{"cells":["shellDataURI(bytes32 artifactObjectId, bytes32 artifactDigest, bytes contextJSON)","string","view"]},{"cells":["shellLatestRevision(bytes32 shellId)","uint64 revision","view"]},{"cells":["shellMetadataObjectId(bytes32 shellId)","bytes32 metadataObjectId","view"]},{"cells":["shellRevision(bytes32 shellId, uint64 revision)","bytes32 prefixObjectId, bytes32 suffixObjectId, uint8 payloadMode, bool exists, bytes32 metadataObjectId","view"]},{"cells":["shells(bytes32 shellId)","bytes32 prefixObjectId, bytes32 suffixObjectId, uint8 payloadMode, bool exists","view"]},{"cells":["updateShell(bytes32 shellId, bytes32 prefix, bytes32 suffix, uint8 payloadMode, bytes32 metadataObjectId)","uint64 revision","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["KeeperChanged(address from, address to)"]},{"cells":["ShellChanged(bytes32 indexed shellId, bytes32 prefix, bytes32 suffix, uint8 payloadMode, address by)"]},{"cells":["ShellFrozen(bytes32 indexed shellId, uint64 indexed revision, address indexed creator)"]},{"cells":["ShellRegistered(bytes32 indexed shellId, address indexed creator, bytes32 indexed metadataObjectId, bytes32 metadataDigest, bytes32 prefix, bytes32 suffix, uint8 payloadMode)"]},{"cells":["ShellRevisionPublished(bytes32 indexed shellId, uint64 indexed revision, address indexed creator, bytes32 metadataObjectId, bytes32 metadataDigest, bytes32 prefix, bytes32 suffix, uint8 payloadMode)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CreatorShellImmutable(bytes32 shellId)"]},{"cells":["DigestMismatch()"]},{"cells":["FragmentDigestMismatch()"]},{"cells":["FragmentDigestMismatch()"]},{"cells":["FragmentLengthMismatch()"]},{"cells":["FragmentLengthMismatch()"]},{"cells":["FragmentTooDeep()"]},{"cells":["FragmentTooDeep()"]},{"cells":["InvalidAlignment()"]},{"cells":["InvalidAlignment()"]},{"cells":["InvalidBase64()"]},{"cells":["InvalidFragment()"]},{"cells":["InvalidFragment()"]},{"cells":["InvalidHTMLMediaType()"]},{"cells":["InvalidObject()"]},{"cells":["InvalidShellId()"]},{"cells":["InvalidShellMetadata()"]},{"cells":["InvalidShellRevision(bytes32 shellId, uint64 revision)"]},{"cells":["InvalidStore()"]},{"cells":["LengthMismatch()"]},{"cells":["NoContextSlot()"]},{"cells":["NoShell(bytes32 shellId)"]},{"cells":["NotKeeper()"]},{"cells":["NotShellCreator(bytes32 shellId)"]},{"cells":["ObjectTooDeep()"]},{"cells":["ObjectTooLarge()"]},{"cells":["ShellAlreadyExists(bytes32 shellId)"]},{"cells":["ShellGraphMismatch(bytes32 shellId, bytes32 objectId)"]},{"cells":["ShellNotCreatorManaged(bytes32 shellId)"]},{"cells":["StringsInsufficientHexLength(uint256 value, uint256 length)"]},{"cells":["UnsupportedCompression()"]},{"cells":["UnsupportedShellAssembly(bytes32 shellId, uint8 payloadMode)"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address keelHold_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelpercenttokenuribuilder","title":"KeelPercentTokenURIBuilder","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelPercentTokenURIBuilder","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-harness/KeelPercentTokenURIBuilder.sol"},{"label":"Download ABI","href":"/docs/abi/keel-harness/KeelPercentTokenURIBuilder.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["keelHold()","address","view"]},{"cells":["preparedTokenURI(bytes32 objectId, bytes32 expectedDigest, bytes encodedPrefix, bytes encodedSuffix)","string","view"]},{"cells":["preparedTokenURIEnvelopeValid(bytes32 objectId, bytes32 expectedDigest, bytes encodedPrefix, bytes encodedSuffix)","bool","view"]},{"cells":["preparedTokenURIFragmentValid(bytes32 objectId, bytes32 expectedDigest)","bool","view"]},{"cells":["requireRegistration(bytes32 objectId)","bool compact","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["FragmentDigestMismatch()"]},{"cells":["FragmentLengthMismatch()"]},{"cells":["FragmentTooDeep()"]},{"cells":["InvalidEnvelope()"]},{"cells":["InvalidFragment()"]},{"cells":["InvalidStore()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address keelHold_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelobjecturibuilder","title":"KeelObjectURIBuilder","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelObjectURIBuilder","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-harness/KeelObjectURIBuilder.sol"},{"label":"Download ABI","href":"/docs/abi/keel-harness/KeelObjectURIBuilder.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["MAX_OBJECT_BYTES()","uint256","view"]},{"cells":["keelHold()","address","view"]},{"cells":["objectBytes(bytes32 objectId, bytes32 expectedDigest)","bytes payload","view"]},{"cells":["objectDataURI(bytes32 objectId, bytes32 expectedDigest)","string","view"]},{"cells":["objectURIValid(bytes32 objectId, bytes32 expectedDigest)","bool","view"]},{"cells":["requireRegistration(bytes32 objectId)","bool compact","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["DigestMismatch()"]},{"cells":["InvalidObject()"]},{"cells":["InvalidStore()"]},{"cells":["ObjectTooLarge(uint256 byteLength, uint256 maximum)"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address keelHold_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelrawtokenuribuilder","title":"KeelRawTokenURIBuilder","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelRawTokenURIBuilder","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-harness/KeelRawTokenURIBuilder.sol"},{"label":"Download ABI","href":"/docs/abi/keel-harness/KeelRawTokenURIBuilder.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["contextURI(bytes contextJSON)","bytes","pure"]},{"cells":["harnessInlineURIWithContext(bytes32 objectId, bytes32 digest, bytes contextJSON)","string","view"]},{"cells":["keelHold()","address","view"]},{"cells":["percentEscape(bytes value)","bytes","pure"]},{"cells":["preEncodedTokenJSONMiddle(bytes32 objectId, bytes32 digest)","bytes","view"]},{"cells":["preEncodedTokenURI(bytes32 objectId, bytes32 digest, bytes rawPrefix, bytes rawSuffix)","string","view"]},{"cells":["preEncodedTokenURIFragmentValid(bytes32 objectId, bytes32 digest)","bool","view"]},{"cells":["preEncodedTokenURIFragments(bytes32[] objectIds, bytes32[] digests, bytes rawPrefix, bytes rawSuffix)","string","view"]},{"cells":["preEncodedTokenURIFragmentsWithImage(bytes32[] objectIds, bytes32[] digests, bytes32 imageObjectId, bytes32 imageDigest, bytes rawPrefix, bytes rawSuffix)","string","view"]},{"cells":["preEncodedTokenURIWithImage(bytes32 objectId, bytes32 digest, bytes32 imageObjectId, bytes rawPrefix, bytes rawSuffix)","string","view"]},{"cells":["preparedImageURI(bytes32 objectId, bytes32 digest)","string","view"]},{"cells":["preparedTokenURI(bytes32 objectId, bytes32 expectedDigest, bytes encodedPrefix, bytes encodedSuffix)","string","view"]},{"cells":["preparedTokenURIEnvelopeValid(bytes32 objectId, bytes32 expectedDigest, bytes encodedPrefix, bytes encodedSuffix)","bool","view"]},{"cells":["preparedTokenURIFragmentValid(bytes32 objectId, bytes32 expectedDigest)","bool","view"]},{"cells":["rawTokenURI()","bool","pure"]},{"cells":["requireRegistration(bytes32 objectId)","bool compact","view"]},{"cells":["validatePreparedImageURIFragmentSegment(bytes32 objectId, bytes32 expectedDigest, uint64 offset, uint32 maxBytes, uint8 paddingState)","uint64 nextOffset, uint8 nextState, bool complete","view"]},{"cells":["validatePreparedTokenURIFragment(bytes32 objectId, bytes32 expectedDigest)","bool","view"]},{"cells":["validatePreparedTokenURIFragmentSegment(bytes32 objectId, bytes32 expectedDigest, uint64 offset, uint32 maxBytes, uint8 percentState)","uint64 nextOffset, uint8 nextState, bool complete","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["FragmentDigestMismatch()"]},{"cells":["FragmentLengthMismatch()"]},{"cells":["FragmentTooDeep()"]},{"cells":["InvalidEnvelope()"]},{"cells":["InvalidFragment()"]},{"cells":["InvalidStore()"]},{"cells":["StringsInsufficientHexLength(uint256 value, uint256 length)"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address keelHold_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelrawinlineshellregistry","title":"KeelRawInlineShellRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelRawInlineShellRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-harness/KeelRawInlineShellRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-harness/KeelRawInlineShellRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["MAX_METADATA_BYTES()","uint256","view"]},{"cells":["RAW_INLINE_PROTECTION_SHELL_ID()","bytes32","view"]},{"cells":["RAW_PERCENT_GRAPH()","uint8","view"]},{"cells":["appendShellRevision(bytes32 shellId, uint64 expectedRevision, bytes32 prefix, bytes32 suffix, bytes32 metadataObjectId)","uint64 revision","nonpayable"]},{"cells":["creatorManagedShell(bytes32)","bool","pure"]},{"cells":["freezeShell(bytes32 shellId, uint64 expectedRevision)","uint64 revision","nonpayable"]},{"cells":["frozen()","bool","view"]},{"cells":["keelHold()","address","view"]},{"cells":["keeper()","address","view"]},{"cells":["platformAuthority()","address","view"]},{"cells":["rawBuilder()","address","view"]},{"cells":["rawFragmentValidationRegistry()","address","view"]},{"cells":["shellLatestRevision(bytes32 shellId)","uint64","view"]},{"cells":["shellRevision(bytes32 shellId, uint64 revision)","bytes32 prefix, bytes32 suffix, uint8 payloadMode, bool exists, bytes32 metadataObjectId","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["CanonicalShellFrozen(uint64 indexed revision, bytes32 indexed shellId, address by)"]},{"cells":["ShellRevisionPublished(uint64 indexed revision, bytes32 prefix, bytes32 suffix, bytes32 indexed shellId, bytes32 metadataDigest, bytes32 metadataObjectId, address by)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidBinding()"]},{"cells":["InvalidMetadata()"]},{"cells":["InvalidRevision()"]},{"cells":["InvalidShell()"]},{"cells":["NotKeeper()"]},{"cells":["ShellFrozen()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address hold_, address validationRegistry_, address platformAuthority_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelHarnessBuilder","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-harness/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-harness/tezos"},{"label":"Native module configuration","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-harness/keel.module.json"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["predict_shell_id","onchain_view","keel_harness_builder.py"]},{"cells":["set_shell","entrypoint","keel_harness_builder.py"]},{"cells":["register_shell","entrypoint","keel_harness_builder.py"]},{"cells":["update_shell","entrypoint","keel_harness_builder.py"]},{"cells":["freeze_shell","entrypoint","keel_harness_builder.py"]},{"cells":["shells","onchain_view","keel_harness_builder.py"]},{"cells":["shell_revision","onchain_view","keel_harness_builder.py"]},{"cells":["shell_latest_revision","onchain_view","keel_harness_builder.py"]},{"cells":["shell_data_uri","onchain_view","keel_harness_builder.py"]},{"cells":["set_protector","entrypoint","keel_harness_builder.py"]},{"cells":["set_keeper","entrypoint","keel_harness_builder.py"]},{"cells":["identity","onchain_view","keel_harness_builder.py"]},{"cells":["harness_source_valid","onchain_view","keel_harness_builder.py"]},{"cells":["item_bytes","onchain_view","keel_harness_builder.py"]},{"cells":["reconstruct_html","onchain_view","keel_harness_builder.py"]},{"cells":["verified_html","onchain_view","keel_harness_builder.py"]},{"cells":["harness_html","onchain_view","keel_harness_builder.py"]},{"cells":["harness_data_uri","onchain_view","keel_harness_builder.py"]},{"cells":["harness_html_with_context","onchain_view","keel_harness_builder.py"]},{"cells":["harness_data_uri_with_context","onchain_view","keel_harness_builder.py"]},{"cells":["harness_inline_uri_with_context","onchain_view","keel_harness_builder.py"]},{"cells":["base64_encode","onchain_view","keel_harness_builder.py"]},{"cells":["percent_escape","onchain_view","keel_harness_builder.py"]},{"cells":["protected_harness_data_uri","onchain_view","keel_harness_builder.py"]},{"cells":["build_id","onchain_view","keel_harness_builder.py"]}],"caption":"Native interface","collapsed":true}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-hold","navTitle":"Storage (keel-hold)","eyebrow":"Technical reference","title":"Storage (keel-hold)","summary":"Immutable content-addressed chunk storage and the artifact registry that activates revisions.","thesis":"Immutable content-addressed chunk storage and the artifact registry that activates revisions.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Immutable content-addressed chunk storage and the artifact registry that activates revisions.","cards":[{"title":"keel-hold","body":"Immutable content-addressed chunk storage and the artifact registry that activates revisions.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-kernel"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-hold/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-hold"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-hold"}]}]},{"id":"ingot","title":"Ingot","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"Ingot","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-hold/Ingot.sol"},{"label":"Download ABI","href":"/docs/abi/keel-hold/Ingot.json"}],"tables":[{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(bytes data)","payable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelhold","title":"KeelHold","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelHold","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-hold/KeelHold.sol"},{"label":"Download ABI","href":"/docs/abi/keel-hold/KeelHold.json"},{"label":"Sepolia showcase · 0x0a4f31d5ab08029e4c68f6f3227d9fa3a2d66267","href":"https://sepolia.etherscan.io/address/0x0a4f31d5ab08029e4c68f6f3227d9fa3a2d66267#code"},{"label":"Sepolia studio-runtime-20261007 · 0x0a4f31d5ab08029e4c68f6f3227d9fa3a2d66267","href":"https://sepolia.etherscan.io/address/0x0a4f31d5ab08029e4c68f6f3227d9fa3a2d66267#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DESCRIPTOR_MAGIC()","bytes4","view"]},{"cells":["DESCRIPTOR_VERSION()","uint8","view"]},{"cells":["castSlug(bytes data)","bytes32 slugId, address pointer","nonpayable"]},{"cells":["castSlugFor(bytes32 intentId, bytes data)","bytes32 slugId, address pointer","nonpayable"]},{"cells":["castSlugs(bytes[] payloads)","bytes32[] slugIds, address[] pointers","nonpayable"]},{"cells":["castSlugsFor(bytes32 intentId, bytes[] payloads)","bytes32[] slugIds, address[] pointers","nonpayable"]},{"cells":["configureHarnessFees(uint32 expectedRevision, uint64 registrationWei)","—","nonpayable"]},{"cells":["configureLimits(uint64 expectedRevision, uint32 maxSlugBytes, uint32 maxBatchSlugs, uint32 maxChildrenPerObject, uint32 maxReadDepth)","—","nonpayable"]},{"cells":["configureSealFees(uint32 expectedRevision, uint64 perChunkWei, uint64 baseSealWei, uint64 stepSealWei, uint32 chunksPerStep)","—","nonpayable"]},{"cells":["descriptorPointer(bytes32 objectId)","address pointer","view"]},{"cells":["feeExempt(address account)","bool exempt","view"]},{"cells":["feeTreasury()","address","view"]},{"cells":["flatSlugCount(bytes32 objectId)","uint256","view"]},{"cells":["getObject(bytes32 objectId)","(bytes32,bytes32,address,uint64,uint64,uint32,uint8,bool,bool,string)","view"]},{"cells":["getObjectPartIds(bytes32 objectId, uint256 offset, uint256 limit)","bytes32[] result","view"]},{"cells":["getObjectSlugPointers(bytes32 objectId, uint256 offset, uint256 limit)","address[] result","view"]},{"cells":["getSlug(bytes32 slugId)","bytes data","view"]},{"cells":["harnessFees()","(uint64,uint32)","view"]},{"cells":["harnessRegistered(bytes32 objectId, address renderer)","bool registered","view"]},{"cells":["haulObject(bytes32 objectId)","bytes data","view"]},{"cells":["initWeld(bytes32 objectId, uint32 slugCount, address executor, uint32 expectedFeeRevision)","bytes32 intentId","payable"]},{"cells":["isSealed(bytes32 objectId)","bool","view"]},{"cells":["limits()","uint32 maxSlugBytes, uint32 maxBatchSlugs, uint32 maxChildrenPerObject, uint32 maxReadDepth, uint64 revision","view"]},{"cells":["manager()","address","view"]},{"cells":["objectExists(bytes32 objectId)","bool","view"]},{"cells":["preparedTokenURIEnvelopeValid(bytes prefix, bytes suffix)","bool","pure"]},{"cells":["quoteHarness(bytes32 objectId, address renderer, address payer)","uint256 fee, uint32 revision","view"]},{"cells":["quoteWeld(uint32 slugCount, address payer)","uint256 fee, uint32 revision","view"]},{"cells":["readSlug(bytes32 objectId, uint256 index)","bytes data, bool hasNext","view"]},{"cells":["registerHarness(bytes32 objectId, address renderer, uint32 expectedRevision)","—","payable"]},{"cells":["requireHarness(bytes32 objectId, address renderer)","—","view"]},{"cells":["requireSystemsActive(uint192 mask)","—","view"]},{"cells":["sealFees()","(uint64,uint64,uint64,uint32,uint32)","view"]},{"cells":["sealObject(bytes32 intentId)","—","nonpayable"]},{"cells":["sealRequired(bytes32 objectId)","bool","view"]},{"cells":["setFeeExempt(address account, bool exempt)","—","nonpayable"]},{"cells":["slugPointer(bytes32 slugId)","address","view"]},{"cells":["weldComposite(bytes32[] partObjectIds, bytes32 digest, uint64 byteLength, string mediaType)","bytes32 objectId","nonpayable"]},{"cells":["weldIntent(bytes32 intentId)","(address,uint32,uint32,bool,bytes32)","view"]},{"cells":["weldIntentId(address payer, bytes32 objectId, address executor)","bytes32","pure"]},{"cells":["weldObject(bytes32[] slugIds, bytes32 digest, uint64 byteLength, uint8 compression, string mediaType)","bytes32 objectId","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["FeeExemptionSet(address indexed account, bool exempt)"]},{"cells":["HarnessFeesConfigured(uint64 registrationWei, uint32 revision)"]},{"cells":["HarnessRegistered(bytes32 indexed objectId, address indexed renderer, address indexed payer, uint256 fee)"]},{"cells":["LimitsConfigured(uint64 indexed revision, bytes32 packedLimits)"]},{"cells":["ObjectSealed(bytes32 indexed objectId, bytes32 indexed intentId, uint64 slugCount)"]},{"cells":["ObjectWelded(bytes32 indexed objectId, bytes32 indexed digest, bytes32 indexed indexDigest, address descriptorPointer, bytes32 metadata, string mediaType)"]},{"cells":["SealFeesConfigured(bytes32 packedFees)"]},{"cells":["SlugCast(bytes32 indexed slugId, address indexed pointer, uint256 byteLength)"]},{"cells":["WeldInitiated(bytes32 indexed intentId, bytes32 indexed objectId, address indexed payer, address executor, uint32 slugCount, uint256 fee)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CompressedObjectReadUnsupported()"]},{"cells":["EmptyBatch()"]},{"cells":["EmptyObject()"]},{"cells":["EmptySlug()"]},{"cells":["FeeTransferFailed()"]},{"cells":["HarnessRegistrationRequired(bytes32 objectId, address renderer)"]},{"cells":["IncorrectHarnessFee(uint256 supplied, uint256 required)"]},{"cells":["IncorrectSealFee(uint256 supplied, uint256 required)"]},{"cells":["IntentAlreadyOpened(bytes32 intentId)"]},{"cells":["IntentComplete()"]},{"cells":["IntentCountMismatch(uint256 actual, uint256 planned)"]},{"cells":["IntentRequired()"]},{"cells":["InvalidByteLength()"]},{"cells":["InvalidDescriptor()"]},{"cells":["InvalidDigest()"]},{"cells":["InvalidFeeRecipient()"]},{"cells":["InvalidHarness()"]},{"cells":["InvalidIntent()"]},{"cells":["InvalidLimits()"]},{"cells":["InvalidManager()"]},{"cells":["InvalidMediaType()"]},{"cells":["InvalidSealFees()"]},{"cells":["ObjectMissing(bytes32 objectId)"]},{"cells":["ObjectReadLengthMismatch()"]},{"cells":["ReadDepthExceeded()"]},{"cells":["SealRequired(bytes32 objectId)"]},{"cells":["SliceOutOfBounds()"]},{"cells":["SlugAllowanceExceeded(uint256 supplied, uint256 remaining)"]},{"cells":["SlugMissing(bytes32 slugId)"]},{"cells":["SlugTooLarge(uint256 supplied, uint256 maximum)"]},{"cells":["StaleHarnessFeeRevision(uint32 supplied, uint32 current)"]},{"cells":["StaleLimitsRevision(uint64 supplied, uint64 current)"]},{"cells":["StaleSealFeeRevision(uint32 supplied, uint32 current)"]},{"cells":["TooManyBatchSlugs(uint256 supplied, uint256 maximum)"]},{"cells":["TooManyChildren(uint256 supplied, uint256 maximum)"]},{"cells":["UnauthorizedGovernance()"]},{"cells":["UnauthorizedUploader()"]},{"cells":["WrongObjectKind()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address manager_, address feeTreasury_, (uint64,uint64,uint64,uint32,uint32) initialSealFees, uint64 initialHarnessFeeWei)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelindex","title":"KeelIndex","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelIndex","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-hold/KeelIndex.sol"},{"label":"Download ABI","href":"/docs/abi/keel-hold/KeelIndex.json"},{"label":"Sepolia showcase · 0x2b706ded15fb27a582da256321f2b3295413b8ac","href":"https://sepolia.etherscan.io/address/0x2b706ded15fb27a582da256321f2b3295413b8ac#code"},{"label":"Sepolia studio-runtime-20261007 · 0x2b706ded15fb27a582da256321f2b3295413b8ac","href":"https://sepolia.etherscan.io/address/0x2b706ded15fb27a582da256321f2b3295413b8ac#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["REGISTRAR_ROLE()","bytes32","view"]},{"cells":["activateCollectionRevision(address collection, uint64 revision)","—","nonpayable"]},{"cells":["activateTokenRevision(address collection, uint256 tokenId, uint64 revision)","—","nonpayable"]},{"cells":["activePresentation(address collection, uint256 tokenId)","string manifestURI, bytes32 manifestDigest, uint64 revision","view"]},{"cells":["activeRevision(address collection, uint256 tokenId)","(string,bytes32,uint64,uint64,uint64,uint64,uint64,uint8,bool)","view"]},{"cells":["announceActiveRevision(address collection, uint256 tokenId, bool tokenSpecific)","—","nonpayable"]},{"cells":["claimCollection(address collection)","—","nonpayable"]},{"cells":["collectionController(address collection)","address controller","view"]},{"cells":["freezeCollection(address collection)","—","nonpayable"]},{"cells":["freezeToken(address collection, uint256 tokenId)","—","nonpayable"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["presentationMatches(address collection, uint256 tokenId, bytes32 manifestDigest, uint64 revision)","bool","view"]},{"cells":["publishCollectionRevision(address collection, string manifestURI, bytes32 manifestDigest, uint64 parentRevision, uint64 compatibilityMin, uint64 compatibilityMax, uint8 policy, uint64 activationTime)","uint64 revision","nonpayable"]},{"cells":["publishTokenRevision(address collection, uint256 tokenId, string manifestURI, bytes32 manifestDigest, uint64 parentRevision, uint64 compatibilityMin, uint64 compatibilityMax, uint8 policy, uint64 activationTime)","uint64 revision","nonpayable"]},{"cells":["registerCollection(address collection, address controller)","—","nonpayable"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revisionOf(address collection, uint256 tokenId, bool tokenSpecific, uint64 revision)","(string,bytes32,uint64,uint64,uint64,uint64,uint64,uint8,bool)","view"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["scopeStatus(address collection, uint256 tokenId, bool tokenSpecific)","uint64 latest, uint64 active, bool frozen","view"]},{"cells":["setCollectionController(address collection, address controller)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CollectionControllerUpdated(address indexed collection, address indexed previousController, address indexed controller)"]},{"cells":["CollectionRegistered(address indexed collection, address indexed controller)"]},{"cells":["MetadataNotificationFailed(address indexed collection, uint256 indexed tokenId, bool tokenSpecific)"]},{"cells":["RevisionActivated(address indexed collection, uint256 indexed tokenId, bool indexed tokenSpecific, uint64 revision)"]},{"cells":["RevisionPublished(address indexed collection, uint256 indexed tokenId, bool indexed tokenSpecific, uint64 revision, uint64 parentRevision, bytes32 manifestDigest, string manifestURI, uint8 policy, uint64 activationTime)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["ScopePermanentlyFrozen(address indexed collection, uint256 indexed tokenId, bool indexed tokenSpecific)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["CollectionAlreadyRegistered()"]},{"cells":["CollectionNotRegistered()"]},{"cells":["InvalidActivationTime()"]},{"cells":["InvalidCompatibility()"]},{"cells":["InvalidManifest()"]},{"cells":["InvalidParent()"]},{"cells":["InvalidPolicy()"]},{"cells":["PendingRevisionExists()"]},{"cells":["RevisionMissing()"]},{"cells":["RevisionNotReady()"]},{"cells":["ScopeFrozen()"]},{"cells":["Unauthorized()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelHold, KeelHoldOnchFS, KeelIndex","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-hold/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-hold/tezos"},{"label":"Compilation targets","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/script/tezos/keel-hold"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["cast_slug","entrypoint","keel_hold.py"]},{"cells":["haul_slug","onchain_view","keel_hold.py"]},{"cells":["write_chunk","entrypoint","keel_hold_onchfs.py"]},{"cells":["create_file","entrypoint","keel_hold_onchfs.py"]},{"cells":["create_directory","entrypoint","keel_hold_onchfs.py"]},{"cells":["weld_object","entrypoint","keel_hold_onchfs.py"]},{"cells":["configure_verifier","entrypoint","keel_hold_onchfs.py"]},{"cells":["forge_harness","entrypoint","keel_hold_onchfs.py"]},{"cells":["haul_slug","onchain_view","keel_hold_onchfs.py"]},{"cells":["read_chunk","onchain_view","keel_hold_onchfs.py"]},{"cells":["read_directory","onchain_view","keel_hold_onchfs.py"]},{"cells":["read_file","onchain_view","keel_hold_onchfs.py"]},{"cells":["get_inode_at","onchain_view","keel_hold_onchfs.py"]},{"cells":["get_object","onchain_view","keel_hold_onchfs.py"]},{"cells":["haul_object","onchain_view","keel_hold_onchfs.py"]},{"cells":["get_verifier","onchain_view","keel_hold_onchfs.py"]},{"cells":["predict_harness_id","onchain_view","keel_hold_onchfs.py"]},{"cells":["get_harness","onchain_view","keel_hold_onchfs.py"]},{"cells":["harness_part_count","onchain_view","keel_hold_onchfs.py"]},{"cells":["haul_harness_part","onchain_view","keel_hold_onchfs.py"]},{"cells":["harness_html","onchain_view","keel_hold_onchfs.py"]},{"cells":["set_registrar","entrypoint","keel_index.py"]},{"cells":["register_collection","entrypoint","keel_index.py"]},{"cells":["claim_collection","entrypoint","keel_index.py"]},{"cells":["set_collection_controller","entrypoint","keel_index.py"]},{"cells":["publish_collection_revision","entrypoint","keel_index.py"]},{"cells":["publish_token_revision","entrypoint","keel_index.py"]},{"cells":["activate_collection_revision","entrypoint","keel_index.py"]},{"cells":["activate_token_revision","entrypoint","keel_index.py"]},{"cells":["freeze_collection","entrypoint","keel_index.py"]},{"cells":["freeze_token","entrypoint","keel_index.py"]},{"cells":["collection_controller","onchain_view","keel_index.py"]},{"cells":["is_registrar","onchain_view","keel_index.py"]},{"cells":["revision_of","onchain_view","keel_index.py"]},{"cells":["active_revision","onchain_view","keel_index.py"]},{"cells":["active_presentation","onchain_view","keel_index.py"]},{"cells":["presentation_matches","onchain_view","keel_index.py"]},{"cells":["scope_status","onchain_view","keel_index.py"]}],"caption":"Native interface","collapsed":true}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-ip-control","navTitle":"IP control (keel-ip-control)","eyebrow":"Technical reference","title":"IP control (keel-ip-control)","summary":"On-chain IP rights control, wrapped-721 custody, and the executor that acts on granted rights.","thesis":"On-chain IP rights control, wrapped-721 custody, and the executor that acts on granted rights.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"On-chain IP rights control, wrapped-721 custody, and the executor that acts on granted rights.","cards":[{"title":"keel-ip-control","body":"On-chain IP rights control, wrapped-721 custody, and the executor that acts on granted rights.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-hold, keel-artifacts, keel-kernel"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-ip-control/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-ip-control"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-ip-control"}]}]},{"id":"keelipactionexecutor","title":"KeelIPActionExecutor","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelIPActionExecutor","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-ip-control/KeelIPActionExecutor.sol"},{"label":"Download ABI","href":"/docs/abi/keel-ip-control/KeelIPActionExecutor.json"},{"label":"Sepolia ip-v1 · 0x82548953d1a8baba9f4902844877FFA747ff243D","href":"https://sepolia.etherscan.io/address/0x82548953d1a8baba9f4902844877FFA747ff243D#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ACTION_DOWNLOAD()","uint8","view"]},{"cells":["ACTION_MINT_TO_BACKPACK()","uint8","view"]},{"cells":["ACTION_REMINT()","uint8","view"]},{"cells":["ACTION_VIEW()","uint8","view"]},{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["DOWNLOAD_RECEIPT_DOMAIN()","bytes32","view"]},{"cells":["control()","address","view"]},{"cells":["downloadReceiptId((bytes32,bytes32,address,uint8,uint256,uint256,bytes32) request)","bytes32","view"]},{"cells":["downloadReceipts(bytes32 receiptId)","bool consumed","view"]},{"cells":["executeDownload((bytes32,bytes32,address,uint8,uint256,uint256,bytes32) request, bytes signature)","bytes32 receiptId","nonpayable"]},{"cells":["executeMintToBackpack((bytes32,bytes32,address,uint8,uint256,uint256,bytes32) request, bytes signature, address hostCollection, uint256 hostTokenId, bytes data)","address backpack, uint256 tokenId","nonpayable"]},{"cells":["executeRemint((bytes32,bytes32,address,uint8,uint256,uint256,bytes32) request, bytes signature, bytes data)","uint256 tokenId","nonpayable"]},{"cells":["executionConfig(bytes32 policyId, bytes32 resourceObjectId)","(address,address,address,bytes32,bool) config_","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["setExecutionConfig(bytes32 policyId, bytes32 resourceObjectId, (address,address,address,bytes32,bool) config_)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["DownloadAuthorized(bytes32 indexed receiptId, bytes32 indexed policyId, bytes32 indexed resourceObjectId, address account, bytes32 contextHash)"]},{"cells":["ExecutionConfigUpdated(bytes32 indexed policyId, bytes32 indexed resourceObjectId, address remintTarget, address backpackRegistry, address backpackImplementation, bytes32 backpackSalt)"]},{"cells":["MintedToBackpack(bytes32 indexed policyId, bytes32 indexed resourceObjectId, address indexed account, address hostCollection, uint256 hostTokenId, address backpack, uint256 tokenId, bytes32 contextHash)"]},{"cells":["Reminted(bytes32 indexed policyId, bytes32 indexed resourceObjectId, address indexed account, address recipient, uint256 tokenId, bytes32 contextHash)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["ActionDenied()"]},{"cells":["BackpackUnavailable()"]},{"cells":["DownloadReceiptAlreadyUsed()"]},{"cells":["InvalidAction()"]},{"cells":["InvalidBackpackOwner()"]},{"cells":["InvalidConfig()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidSignature()"]},{"cells":["Unauthorized()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address administrator, address control_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelipcontrol","title":"KeelIPControl","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelIPControl","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-ip-control/KeelIPControl.sol"},{"label":"Download ABI","href":"/docs/abi/keel-ip-control/KeelIPControl.json"},{"label":"Sepolia ip-v1 · 0x9f62Aec9E1bd5117864C6A19a7FC8C4e51F39aD0","href":"https://sepolia.etherscan.io/address/0x9f62Aec9E1bd5117864C6A19a7FC8C4e51F39aD0#code"},{"label":"Sepolia showcase · 0x1b982718504aef51423f20856b79c62378cb62eb","href":"https://sepolia.etherscan.io/address/0x1b982718504aef51423f20856b79c62378cb62eb#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ACCESS_AUTHORIZATION_TYPEHASH()","bytes32","view"]},{"cells":["ACTION_ALL()","uint8","view"]},{"cells":["ACTION_DOWNLOAD()","uint8","view"]},{"cells":["ACTION_MINT_TO_BACKPACK()","uint8","view"]},{"cells":["ACTION_REMINT()","uint8","view"]},{"cells":["ACTION_VIEW()","uint8","view"]},{"cells":["CUSTOM_LICENSE_DOMAIN()","bytes32","view"]},{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["LICENSE_DOMAIN()","bytes32","view"]},{"cells":["MAX_TOKEN_REQUIREMENTS()","uint256","view"]},{"cells":["POLICY_DOMAIN()","bytes32","view"]},{"cells":["STANDARD_LICENSE_DOMAIN()","bytes32","view"]},{"cells":["allowlist(bytes32 policyId, bytes32 resourceObjectId, address account)","bool","view"]},{"cells":["artifactRegistry()","address","view"]},{"cells":["authorizationDigest((bytes32,bytes32,address,uint8,uint256,uint256,bytes32) authorization)","bytes32","view"]},{"cells":["authorizationStatus(bytes32 policyId, bytes32 resourceObjectId, address account, uint8 action)","bool allowed, uint8 mode, uint8 actionMask, uint64 grantExpiry, bytes32 effectiveRuleId, bytes32 licenseId, uint64 policyVersion","view"]},{"cells":["canonicalStandardLicenseId(uint8 index)","bytes32","pure"]},{"cells":["canonicalStandardLicenseIdentifier(uint8 index)","string","pure"]},{"cells":["checkSignedAccess((bytes32,bytes32,address,uint8,uint256,uint256,bytes32) authorization, bytes signature)","bool","view"]},{"cells":["consumeSignedAccess((bytes32,bytes32,address,uint8,uint256,uint256,bytes32) authorization, bytes signature)","bytes32 digest","nonpayable"]},{"cells":["createPolicy((bytes32,uint64,bytes32,uint8,uint8,uint8,address,bytes32,bool,(uint8,uint8,address,uint256,uint256)[]) config)","bytes32 policyId","nonpayable"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["freezePolicy(bytes32 policyId)","—","nonpayable"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grant(bytes32 policyId, bytes32 resourceObjectId, address account)","(uint64,uint8,bool)","view"]},{"cells":["grantAccess(bytes32 policyId, bytes32 resourceObjectId, address account, uint64 expiresAt, uint8 actionMask)","—","nonpayable"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["isAuthorized(bytes32 policyId, bytes32 resourceObjectId, address account, uint8 action)","bool","view"]},{"cells":["keelHold()","address","view"]},{"cells":["license(bytes32 licenseId)","(bytes32,bytes32,uint64,uint64,uint8,string,string,address,bool,bool)","view"]},{"cells":["licenseExists(bytes32 licenseId)","bool","view"]},{"cells":["nonces(address account)","uint256 nonce","view"]},{"cells":["policy(bytes32 policyId)","(bytes32,uint64,address,bytes32,uint64,bool,bool)","view"]},{"cells":["policyIdFor(bytes32 objectId, uint64 artifactRevision)","bytes32","pure"]},{"cells":["registerCustomLicense(string identifier, string name, bytes32 contentObjectId)","bytes32 licenseId","nonpayable"]},{"cells":["registerStandardLicense(bytes32 licenseId, string identifier, string name, bytes32 contentObjectId)","—","nonpayable"]},{"cells":["registerStandardLicenses((bytes32,string,string,bytes32)[] configs)","—","nonpayable"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["revokeAccess(bytes32 policyId, bytes32 resourceObjectId, address account)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["rule(bytes32 policyId, bytes32 resourceObjectId)","(uint8,uint8,uint8,address,bytes32,uint64,bool)","view"]},{"cells":["ruleIdFor(bytes32 policyId, bytes32 resourceObjectId)","bytes32","pure"]},{"cells":["setAllowlist(bytes32 policyId, bytes32 resourceObjectId, address account, bool allowed)","—","nonpayable"]},{"cells":["setRule(bytes32 policyId, bytes32 resourceObjectId, uint64 resourceRevision, uint8 mode, uint8 tokenLogic, uint8 actionMask, address externalRule, bytes32 externalRuleCodeHash, (uint8,uint8,address,uint256,uint256)[] requirements)","—","nonpayable"]},{"cells":["standardLicenseId(string identifier)","bytes32","pure"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["tokenRequirement(bytes32 policyId, bytes32 resourceObjectId, uint256 index)","(uint8,uint8,address,uint256,uint256)","view"]},{"cells":["tokenRequirementCount(bytes32 policyId, bytes32 resourceObjectId)","uint256","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AllowlistUpdated(bytes32 indexed policyId, bytes32 indexed resourceObjectId, address indexed account, bool allowed)"]},{"cells":["CustomLicenseRegistered(bytes32 indexed licenseId, address indexed publisher, string identifier, bytes32 indexed contentObjectId)"]},{"cells":["EIP712DomainChanged()"]},{"cells":["GrantUpdated(bytes32 indexed policyId, bytes32 indexed resourceObjectId, address indexed account, uint64 expiresAt, uint8 actionMask, bool active)"]},{"cells":["PolicyConfigFrozen(bytes32 indexed policyId, uint64 version)"]},{"cells":["PolicyCreated(bytes32 indexed policyId, bytes32 indexed objectId, uint64 indexed artifactRevision, address creator, bytes32 licenseId, uint8 mode, uint8 actionMask)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RuleSet(bytes32 indexed policyId, bytes32 indexed resourceObjectId, uint64 artifactRevision, uint8 mode, uint8 tokenLogic, uint8 actionMask)"]},{"cells":["SignedAccessConsumed(bytes32 indexed authorizationDigest, bytes32 indexed policyId, bytes32 indexed resourceObjectId, address account, uint8 action, uint256 nonce, bytes32 contextHash)"]},{"cells":["StandardLicenseRegistered(bytes32 indexed licenseId, string identifier, bytes32 indexed contentObjectId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["AccessDenied()"]},{"cells":["AuthorizationExpired()"]},{"cells":["ConfigFrozen()"]},{"cells":["InvalidAction()"]},{"cells":["InvalidAuthorizationNonce()"]},{"cells":["InvalidAuthorizationSignature()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidLicense()"]},{"cells":["InvalidObject()"]},{"cells":["InvalidRule()"]},{"cells":["InvalidShortString()"]},{"cells":["InvalidTokenRequirement()"]},{"cells":["LicenseAlreadyExists()"]},{"cells":["LicenseMissing()"]},{"cells":["PolicyAlreadyExists()"]},{"cells":["PolicyMissing()"]},{"cells":["RuleMissing()"]},{"cells":["StringTooLong(string str)"]},{"cells":["TokenRequirementMissing()"]},{"cells":["TooManyTokenRequirements()"]},{"cells":["Unauthorized()"]},{"cells":["UnsupportedToken()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address administrator, address artifactRegistry_, address keelHold_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelipwrapped721","title":"KeelIPWrapped721","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelIPWrapped721","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-ip-control/KeelIPWrapped721.sol"},{"label":"Download ABI","href":"/docs/abi/keel-ip-control/KeelIPWrapped721.json"},{"label":"Sepolia ip-v1 · 0xD6290b9777B1Be895719e32900552107aADD674c","href":"https://sepolia.etherscan.io/address/0xD6290b9777B1Be895719e32900552107aADD674c#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["approve(address to, uint256 tokenId)","—","nonpayable"]},{"cells":["balanceOf(address owner)","uint256","view"]},{"cells":["executor()","address","view"]},{"cells":["getApproved(uint256 tokenId)","address","view"]},{"cells":["isApprovedForAll(address owner, address operator)","bool","view"]},{"cells":["mintFromKeel(bytes32 policyId, bytes32 resourceObjectId, address recipient, bytes data)","uint256 tokenId","nonpayable"]},{"cells":["name()","string","view"]},{"cells":["nextTokenId()","uint256","view"]},{"cells":["ownerOf(uint256 tokenId)","address","view"]},{"cells":["provenance(uint256 tokenId)","(bytes32,bytes32,bytes32)","view"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId)","—","nonpayable"]},{"cells":["safeTransferFrom(address from, address to, uint256 tokenId, bytes data)","—","nonpayable"]},{"cells":["setApprovalForAll(address operator, bool approved)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["symbol()","string","view"]},{"cells":["tokenURI(uint256 tokenId)","string","view"]},{"cells":["transferFrom(address from, address to, uint256 tokenId)","—","nonpayable"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)"]},{"cells":["ApprovalForAll(address indexed owner, address indexed operator, bool approved)"]},{"cells":["Transfer(address indexed from, address indexed to, uint256 indexed tokenId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["ERC721IncorrectOwner(address sender, uint256 tokenId, address owner)"]},{"cells":["ERC721InsufficientApproval(address operator, uint256 tokenId)"]},{"cells":["ERC721InvalidApprover(address approver)"]},{"cells":["ERC721InvalidOperator(address operator)"]},{"cells":["ERC721InvalidOwner(address owner)"]},{"cells":["ERC721InvalidReceiver(address receiver)"]},{"cells":["ERC721InvalidSender(address sender)"]},{"cells":["ERC721NonexistentToken(uint256 tokenId)"]},{"cells":["InvalidExecutor()"]},{"cells":["StringsInsufficientHexLength(uint256 value, uint256 length)"]},{"cells":["Unauthorized()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(string name_, string symbol_, address executor_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelIPControl, KeelIPActionExecutor, KeelIPLicenseRegistry, KeelIPTokenGate, KeelIPWrappedFA2, KeelIPBackpackFA2","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-ip-control/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-ip-control/tezos"},{"label":"Compilation targets","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/script/tezos/keel-ip-control"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["create_policy","entrypoint","keel_ip_control.py"]},{"cells":["set_rule","entrypoint","keel_ip_control.py"]},{"cells":["set_allowlist","entrypoint","keel_ip_control.py"]},{"cells":["grant_access","entrypoint","keel_ip_control.py"]},{"cells":["revoke_access","entrypoint","keel_ip_control.py"]},{"cells":["authorization_status","onchain_view","keel_ip_control.py"]},{"cells":["set_execution_config","entrypoint","keel_ip_action_executor.py"]},{"cells":["execute_download","entrypoint","keel_ip_action_executor.py"]},{"cells":["execute_remint","entrypoint","keel_ip_action_executor.py"]},{"cells":["execute_mint_to_backpack","entrypoint","keel_ip_action_executor.py"]},{"cells":["download_receipt_id","onchain_view","keel_ip_action_executor.py"]},{"cells":["policy_control","onchain_view","keel_ip_action_executor.py"]},{"cells":["signature_payload","onchain_view","keel_ip_action_executor.py"]},{"cells":["nonce","onchain_view","keel_ip_action_executor.py"]},{"cells":["download_receipt","onchain_view","keel_ip_action_executor.py"]},{"cells":["execution_config","onchain_view","keel_ip_action_executor.py"]},{"cells":["register_standard_license","entrypoint","keel_ip_license.py"]},{"cells":["register_standard_licenses","entrypoint","keel_ip_license.py"]},{"cells":["register_custom_license","entrypoint","keel_ip_license.py"]},{"cells":["get_license","onchain_view","keel_ip_license.py"]},{"cells":["standard_license_id","onchain_view","keel_ip_license.py"]},{"cells":["canonical_license_identifier","onchain_view","keel_ip_license.py"]},{"cells":["canonical_standard_license_id","onchain_view","keel_ip_license.py"]},{"cells":["set_controller","entrypoint","keel_ip_token_gate.py"]},{"cells":["set_requirements","entrypoint","keel_ip_token_gate.py"]},{"cells":["is_authorized","onchain_view","keel_ip_token_gate.py"]},{"cells":["evaluate","onchain_view","keel_ip_token_gate.py"]},{"cells":["requirement_count","onchain_view","keel_ip_token_gate.py"]},{"cells":["token_requirement","onchain_view","keel_ip_token_gate.py"]},{"cells":["mint_from_keel","entrypoint","keel_ip_wrapped_fa2.py"]},{"cells":["get_balance","onchain_view","keel_ip_wrapped_fa2.py"]},{"cells":["token_provenance","onchain_view","keel_ip_wrapped_fa2.py"]},{"cells":["mint_to_backpack","entrypoint","keel_ip_wrapped_fa2.py"]},{"cells":["backpack_id","onchain_view","keel_ip_wrapped_fa2.py"]},{"cells":["get_balance","onchain_view","keel_ip_wrapped_fa2.py"]},{"cells":["token_provenance","onchain_view","keel_ip_wrapped_fa2.py"]}],"caption":"Native interface","collapsed":true}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-kernel","navTitle":"Kernel (keel-kernel)","eyebrow":"Technical reference","title":"Kernel (keel-kernel)","summary":"Admin/access primitives and encoding helpers every other module is allowed to import.","thesis":"Admin/access primitives and encoding helpers every other module is allowed to import.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Admin/access primitives and encoding helpers every other module is allowed to import.","cards":[{"title":"keel-kernel","body":"Admin/access primitives and encoding helpers every other module is allowed to import.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"None"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-kernel/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-kernel"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-kernel"}]}]},{"id":"keelfeetreasury","title":"KeelFeeTreasury","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelFeeTreasury","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-kernel/KeelFeeTreasury.sol"},{"label":"Download ABI","href":"/docs/abi/keel-kernel/KeelFeeTreasury.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["PAYOUT_DELAY()","uint64","view"]},{"cells":["accessGroups()","address","view"]},{"cells":["claim(address recipient, address[] tokens)","—","nonpayable"]},{"cells":["configureAccessGroups(address groups)","—","nonpayable"]},{"cells":["configureCustomPayoutLimit(address asset, uint256 maximum)","—","nonpayable"]},{"cells":["configurePayoutWallet(address wallet, uint64 expectedRevision)","—","nonpayable"]},{"cells":["customPayoutLimit(address)","uint256","view"]},{"cells":["manager()","address","view"]},{"cells":["nextCustomPayoutAt()","uint64","view"]},{"cells":["payout(bytes32 groupId, address asset, uint256 amount, address recipient, uint64 expectedRevision, uint64 deadline, (address,bytes)[] signatures)","—","nonpayable"]},{"cells":["payoutRevision()","uint64","view"]},{"cells":["payoutWallet()","address","view"]},{"cells":["withdrawalsUnlockAt()","uint64","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessGroupsConfigured(uint64 revision, address indexed groups)"]},{"cells":["CustomPayoutLimitConfigured(uint64 revision, address indexed asset, uint256 maximum)"]},{"cells":["FeesClaimed(address indexed asset, address indexed recipient, uint256 amount)"]},{"cells":["GroupPayout(bool custom, bytes32 indexed groupId, address indexed asset, address indexed recipient, uint256 amount)"]},{"cells":["PayoutWalletConfigured(uint64 revision, uint64 unlockAt, address indexed wallet)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CustomPayoutLimitExceeded()"]},{"cells":["CustomPayoutLocked()"]},{"cells":["FeeTransferFailed()"]},{"cells":["InvalidAssetOrder()"]},{"cells":["InvalidFeeRecipient()"]},{"cells":["InvalidManager()"]},{"cells":["InvalidPayoutAmount()"]},{"cells":["InvalidPayoutConfiguration()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["SafeERC20FailedOperation(address token)"]},{"cells":["StalePayoutRevision()"]},{"cells":["UnauthorizedGovernance()"]},{"cells":["UnsupportedFeeToken()"]},{"cells":["WithdrawalsLocked()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address manager_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelaccessgroups","title":"KeelAccessGroups","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelAccessGroups","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-kernel/KeelAccessGroups.sol"},{"label":"Download ABI","href":"/docs/abi/keel-kernel/KeelAccessGroups.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ACTION_TYPEHASH()","bytes32","view"]},{"cells":["MODERATION_GROUP()","bytes32","view"]},{"cells":["OPERATIONS_GROUP()","bytes32","view"]},{"cells":["TREASURY_GROUP()","bytes32","view"]},{"cells":["actionDigest(bytes32 groupId, address target, bytes4 selector, bytes32 actionHash, uint64 deadline)","bytes32","view"]},{"cells":["authorize(bytes32 groupId, bytes4 selector, bytes32 actionHash, uint64 deadline, (address,bytes)[] signatures)","—","nonpayable"]},{"cells":["capabilities(bytes32 groupId, uint32 epoch, address target, bytes4 selector)","bool","view"]},{"cells":["configureBackup(bytes32 groupId, bytes32 nextGroup, uint64 revision, uint64 deadline, (address,bytes)[] currentApprovals, (address,bytes)[] incomingApprovals)","—","nonpayable"]},{"cells":["configureCapability(bytes32 groupId, address target, bytes4 selector, bool enabled)","—","nonpayable"]},{"cells":["configureGroup(bytes32 groupId, address[] members, bool enabled, uint64 expectedRevision)","—","nonpayable"]},{"cells":["configureMemberPolicy(uint32 maximum, uint64 expectedRevision)","—","nonpayable"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["execute(bytes32 groupId, (address,uint256,bytes) call_, uint64 deadline, (address,bytes)[] signatures)","bytes","payable"]},{"cells":["group(bytes32 groupId)","address[] members, uint256 threshold, uint256 nonce, uint64 revision, bool quorumActive, bool enabled","view"]},{"cells":["hasCapability(bytes32 groupId, address target, bytes4 selector)","bool","view"]},{"cells":["manager()","address","view"]},{"cells":["memberPolicy()","uint32 maximum, uint64 revision","view"]},{"cells":["recoverGroup(bytes32 groupId, address[] members, (address,bytes4)[] grants, uint64 deadline, (address,bytes)[] approvals, (address,bytes)[] acceptances)","—","nonpayable"]},{"cells":["recoveryGroups()","address","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["EIP712DomainChanged()"]},{"cells":["GroupAuthorized(bytes32 indexed groupId, bytes32 indexed digest, address indexed target, uint256 nonce)"]},{"cells":["GroupCapabilityConfigured(bytes32 indexed groupId, address indexed target, bytes4 selector, bool enabled)"]},{"cells":["GroupConfigured(bytes32 indexed groupId, bytes32 metadata, address[] members)"]},{"cells":["GroupRecovered(bytes32 indexed groupId, uint32 capabilityEpoch)"]},{"cells":["MemberPolicyConfigured(uint32 maximum, uint64 revision)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["GroupAccessDenied()"]},{"cells":["InvalidCall()"]},{"cells":["InvalidGroup()"]},{"cells":["InvalidMemberPolicy()"]},{"cells":["InvalidMembers()"]},{"cells":["InvalidShortString()"]},{"cells":["InvalidSignatures()"]},{"cells":["QuorumCannotBeDisabled()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["SignatureExpired()"]},{"cells":["StaleGroupRevision()"]},{"cells":["StaleMemberPolicy()"]},{"cells":["StringTooLong(string str)"]},{"cells":["UnauthorizedGovernance()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address manager_, address bootstrapMember)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelrecoverygroups","title":"KeelRecoveryGroups","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelRecoveryGroups","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-kernel/KeelRecoveryGroups.sol"},{"label":"Download ABI","href":"/docs/abi/keel-kernel/KeelRecoveryGroups.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ACCEPTANCE_TYPEHASH()","bytes32","view"]},{"cells":["ACTION_TYPEHASH()","bytes32","view"]},{"cells":["BINDING_TAG()","bytes32","view"]},{"cells":["ROSTER_TAG()","bytes32","view"]},{"cells":["acceptanceDigest(bytes32 digest, address signer)","bytes32","view"]},{"cells":["actionDigest(bytes32 id, address resource, bytes32 scope, bytes32 actionHash, uint64 deadline)","bytes32","view"]},{"cells":["authorizeBound(bytes32 scope, bytes32 actionHash, uint64 deadline, (address,bytes)[] approvals)","bytes32 digest","nonpayable"]},{"cells":["bindingHash(bytes32 nextGroup, uint64 revision)","bytes32","pure"]},{"cells":["bindings(address resource, bytes32 scope)","bytes32 groupId, uint64 revision","view"]},{"cells":["boundDigest(address resource, bytes32 scope, bytes32 actionHash, uint64 deadline)","bytes32","view"]},{"cells":["configureBinding(bytes32 scope, bytes32 nextGroup, uint64 expectedRevision, uint64 deadline, (address,bytes)[] currentApprovals, (address,bytes)[] incomingApprovals)","—","nonpayable"]},{"cells":["createGroup(bytes32 salt, address[] members, bool verifyKeys, uint64 deadline, (address,bytes)[] acceptances)","bytes32 id","nonpayable"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["group(bytes32 id)","address[] members, uint256 threshold, uint128 nonce, uint64 revision, bool verifyKeys, bool quorumActive","view"]},{"cells":["rosterDigest(bytes32 id, address[] members, bool verifyKeys, uint64 deadline)","bytes32","view"]},{"cells":["rotateGroup(bytes32 id, address[] members, bool verifyKeys, uint64 deadline, (address,bytes)[] approvals, (address,bytes)[] acceptances)","—","nonpayable"]},{"cells":["verifyNewKeys(bytes32 digest, address[] members, (address,bytes)[] signatures)","—","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["EIP712DomainChanged()"]},{"cells":["RecoveryAuthorized(bytes32 indexed groupId, address indexed resource, bytes32 indexed scope, bytes32 digest, uint256 nonce)"]},{"cells":["RecoveryBindingConfigured(address indexed resource, bytes32 indexed scope, bytes32 indexed groupId, uint64 revision)"]},{"cells":["RecoveryGroupConfigured(bytes32 indexed groupId, uint64 revision, bool verifyKeys, address[] members)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidRecoveryGroup()"]},{"cells":["InvalidRecoveryRoster()"]},{"cells":["InvalidRecoverySignatures()"]},{"cells":["InvalidShortString()"]},{"cells":["RecoveryExpired()"]},{"cells":["RecoveryLocked()"]},{"cells":["RecoveryNotConfigured()"]},{"cells":["RecoveryRevisionMismatch()"]},{"cells":["StringTooLong(string str)"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor()","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-market","navTitle":"Market (keel-market)","eyebrow":"Technical reference","title":"Market (keel-market)","summary":"The Keel marketplace plugin contract.","thesis":"The Keel marketplace plugin contract.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"The Keel marketplace plugin contract.","cards":[{"title":"keel-market","body":"The Keel marketplace plugin contract.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-graph, keel-kernel"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-market/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-market"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-market"}]}]},{"id":"keelmarket","title":"KeelMarket","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelMarket","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-market/KeelMarket.sol"},{"label":"Download ABI","href":"/docs/abi/keel-market/KeelMarket.json"},{"label":"Sepolia showcase · 0x4f9c6ea07aed067c3f04d798bf22a1e6c5c524a8","href":"https://sepolia.etherscan.io/address/0x4f9c6ea07aed067c3f04d798bf22a1e6c5c524a8#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["INTERFACE_VERSION()","bytes4","view"]},{"cells":["LISTING_DATA_MAGIC()","bytes4","view"]},{"cells":["MAX_ORDER_DURATION()","uint64","view"]},{"cells":["MAX_PLATFORM_FEE_BPS()","uint96","view"]},{"cells":["PLUGIN_ID()","bytes32","view"]},{"cells":["PLUGIN_PROTOCOL()","bytes32","view"]},{"cells":["acceptBid(address collection, uint256 tokenId, address bidder, uint64 expectedBidVersion, uint256 expectedAmount, (address,uint256,address,uint256,uint256) expectedQuote)","—","nonpayable"]},{"cells":["acceptOwnership()","—","nonpayable"]},{"cells":["bid(address collection, uint256 tokenId, address bidder)","(uint128,uint64,uint64)","view"]},{"cells":["bidKey(address collection, uint256 tokenId, address bidder)","bytes32","pure"]},{"cells":["bidVersion(bytes32 bidKey)","uint64 version","view"]},{"cells":["buy(address collection, uint256 tokenId, uint64 expectedVersion, uint256 expectedPrice, (address,uint256,address,uint256,uint256) expectedQuote)","—","payable"]},{"cells":["cancelBid(address collection, uint256 tokenId, uint64 expectedVersion)","—","nonpayable"]},{"cells":["cancelListing(address collection, uint256 tokenId, uint64 expectedVersion)","—","nonpayable"]},{"cells":["cancelListingTo(address collection, uint256 tokenId, uint64 expectedVersion, address recipient)","—","nonpayable"]},{"cells":["credit(address account)","uint256 amount","view"]},{"cells":["liabilities()","uint256 credits, uint256 bids, uint256 total","view"]},{"cells":["list(address collection, uint256 tokenId, uint256 price, uint64 expiry, (address,uint256,address,uint256,uint256) expectedQuote)","uint64 version","nonpayable"]},{"cells":["listing(address collection, uint256 tokenId)","(address,address,uint96,uint96,uint96,uint96,uint64,uint64,bool)","view"]},{"cells":["listingKey(address collection, uint256 tokenId)","bytes32","pure"]},{"cells":["listingTransferData(uint256 price, uint64 expiry, (address,uint256,address,uint256,uint256) expectedQuote)","bytes","pure"]},{"cells":["listingVersion(bytes32 listingKey)","uint64 version","view"]},{"cells":["onERC721Received(address operator, address from, uint256 tokenId, bytes data)","bytes4","nonpayable"]},{"cells":["owner()","address","view"]},{"cells":["pendingOwner()","address","view"]},{"cells":["placeBid(address collection, uint256 tokenId, uint64 expiry)","uint64 version","payable"]},{"cells":["platformFeeBps()","uint96","view"]},{"cells":["platformRecipient()","address","view"]},{"cells":["pluginId()","bytes32","pure"]},{"cells":["pluginProtocol()","bytes32","pure"]},{"cells":["pluginVersion()","uint64","pure"]},{"cells":["reclaimExpiredBid(address collection, uint256 tokenId, address bidder, uint64 expectedVersion)","—","nonpayable"]},{"cells":["reclaimExpiredListing(address collection, uint256 tokenId, uint64 expectedVersion)","—","nonpayable"]},{"cells":["recoverUntrackedERC721(address collection, uint256 tokenId, address recipient)","—","nonpayable"]},{"cells":["renounceOwnership()","—","nonpayable"]},{"cells":["settlementQuote(address collection, uint256 tokenId, uint256 price)","(address,uint256,address,uint256,uint256)","view"]},{"cells":["settlementQuoteDigest((address,uint256,address,uint256,uint256) quote)","bytes32","pure"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","pure"]},{"cells":["totalBidEscrow()","uint256","view"]},{"cells":["totalCreditLiability()","uint256","view"]},{"cells":["transferOwnership(address newOwner)","—","nonpayable"]},{"cells":["updateListing(address collection, uint256 tokenId, uint64 expectedVersion, uint256 price, uint64 expiry, (address,uint256,address,uint256,uint256) expectedQuote)","uint64 version","nonpayable"]},{"cells":["withdraw(address recipient)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["BidCancelled(address indexed collection, uint256 indexed tokenId, address indexed bidder, uint64 version, uint256 amount)"]},{"cells":["BidPlaced(address indexed collection, uint256 indexed tokenId, address indexed bidder, uint64 version, uint256 amount, uint64 expiry)"]},{"cells":["CreditWithdrawn(address indexed account, address indexed recipient, uint256 amount)"]},{"cells":["ListingCancelled(address indexed collection, uint256 indexed tokenId, uint64 indexed version, address seller, address returnRecipient)"]},{"cells":["ListingCreated(address indexed collection, uint256 indexed tokenId, uint64 indexed version, address seller, uint256 price, uint64 expiry)"]},{"cells":["ListingUpdated(address indexed collection, uint256 indexed tokenId, uint64 indexed version, address seller, uint256 price, uint64 expiry)"]},{"cells":["OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)"]},{"cells":["OwnershipTransferred(address indexed previousOwner, address indexed newOwner)"]},{"cells":["Sale(address indexed collection, uint256 indexed tokenId, address indexed buyer, address seller, uint64 listingVersion, uint64 bidVersion, bool acceptedBid, uint256 price, address royaltyRecipient, uint256 royaltyAmount, address platformRecipient, uint256 platformFee, uint256 sellerProceeds)"]},{"cells":["UntrackedERC721Recovered(address indexed collection, uint256 indexed tokenId, address indexed recipient, address recoveryAuthority)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["BidExpired()"]},{"cells":["BidMissing()"]},{"cells":["EtherTransferFailed()"]},{"cells":["FeeTransferFailed()"]},{"cells":["IncorrectPayment()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidExpiry()"]},{"cells":["InvalidFee()"]},{"cells":["InvalidFeeRecipient()"]},{"cells":["InvalidListingData()"]},{"cells":["InvalidPrice()"]},{"cells":["InvalidRoyalty()"]},{"cells":["ListingExists()"]},{"cells":["ListingExpired()"]},{"cells":["ListingMissing()"]},{"cells":["NothingToWithdraw()"]},{"cells":["OwnableInvalidOwner(address owner)"]},{"cells":["OwnableUnauthorizedAccount(address account)"]},{"cells":["QuoteMismatch()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["SelfBid()"]},{"cells":["StaleVersion()"]},{"cells":["TrackedToken()"]},{"cells":["TransferInvariant()"]},{"cells":["Unauthorized()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address recoveryAuthority, address platformRecipient_, uint96 platformFeeBps_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelMarket","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-market/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-market/tezos"},{"label":"Native module configuration","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-market/keel.module.json"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["nominate_administrator","entrypoint","keel_market.py"]},{"cells":["accept_administrator","entrypoint","keel_market.py"]},{"cells":["plugin_protocol","onchain_view","keel_market.py"]},{"cells":["plugin_id","onchain_view","keel_market.py"]},{"cells":["plugin_version","onchain_view","keel_market.py"]},{"cells":["supports_interface","onchain_view","keel_market.py"]},{"cells":["listing_transfer_data","onchain_view","keel_market.py"]},{"cells":["list","entrypoint","keel_market.py"]},{"cells":["register_escrow_listing","entrypoint","keel_market.py"]},{"cells":["update_listing","entrypoint","keel_market.py"]},{"cells":["cancel_listing","entrypoint","keel_market.py"]},{"cells":["cancel_listing_to","entrypoint","keel_market.py"]},{"cells":["reclaim_expired_listing","entrypoint","keel_market.py"]},{"cells":["buy","entrypoint","keel_market.py"]},{"cells":["place_bid","entrypoint","keel_market.py"]},{"cells":["cancel_bid","entrypoint","keel_market.py"]},{"cells":["reclaim_expired_bid","entrypoint","keel_market.py"]},{"cells":["accept_bid","entrypoint","keel_market.py"]},{"cells":["withdraw","entrypoint","keel_market.py"]},{"cells":["recover_untracked_fa2","entrypoint","keel_market.py"]},{"cells":["listing","onchain_view","keel_market.py"]},{"cells":["bid","onchain_view","keel_market.py"]},{"cells":["listing_version","onchain_view","keel_market.py"]},{"cells":["bid_version","onchain_view","keel_market.py"]},{"cells":["credit_of","onchain_view","keel_market.py"]},{"cells":["settlement_quote","onchain_view","keel_market.py"]},{"cells":["settlement_quote_digest","onchain_view","keel_market.py"]},{"cells":["liabilities","onchain_view","keel_market.py"]},{"cells":["listing_key","onchain_view","keel_market.py"]},{"cells":["bid_key","onchain_view","keel_market.py"]},{"cells":["administrator","onchain_view","keel_market.py"]},{"cells":["pending_administrator","onchain_view","keel_market.py"]},{"cells":["platform_recipient","onchain_view","keel_market.py"]},{"cells":["platform_fee_bps","onchain_view","keel_market.py"]},{"cells":["total_credit_liability","onchain_view","keel_market.py"]},{"cells":["total_bid_escrow","onchain_view","keel_market.py"]}],"caption":"Native interface","collapsed":true}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-mint-access","navTitle":"Mint access (keel-mint-access)","eyebrow":"Technical reference","title":"Mint access (keel-mint-access)","summary":"Shared mint routes, OneMint admission queues, verifiable queue/reward entropy, and community or achievement reward claims.","thesis":"Shared mint routes, OneMint admission queues, verifiable queue/reward entropy, and community or achievement reward claims.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Shared mint routes, OneMint admission queues, verifiable queue/reward entropy, and community or achievement reward claims.","cards":[{"title":"keel-mint-access","body":"Shared mint routes, OneMint admission queues, verifiable queue/reward entropy, and community or achievement reward claims.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-kernel, keel-die, keel-creator-identity, keel-hold"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-mint-access/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-mint-access"}]}]},{"id":"frayauctionissuer","title":"FrayAuctionIssuer","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"FrayAuctionIssuer","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/FrayAuctionIssuer.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/FrayAuctionIssuer.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["allocationId(uint256 auctionId)","bytes32","view"]},{"cells":["auctionHouse()","address","view"]},{"cells":["auctionRoute(uint256 auctionId)","(address,address,address,uint256,uint256,uint32,uint32,uint64,uint256,uint256,uint8,bool)","view"]},{"cells":["bindCreatorFactory(address creatorFactory_)","—","nonpayable"]},{"cells":["bindPublicationHold(address hold)","—","nonpayable"]},{"cells":["cancelAuction(uint256 auctionId)","—","nonpayable"]},{"cells":["collectionMintSetup(bytes32 reservationId)","uint32 supply, bytes32 allocation","view"]},{"cells":["collectionOutcome(bytes32 reservationId)","bytes32","view"]},{"cells":["creatorFactory()","address","view"]},{"cells":["deferredSales(uint256 auctionId)","uint8 fundingMode, uint32 chunkCount, address executor, bytes32 objectId, bytes32 reservationId, bytes32 bidderCommitment, bytes32 patronCommitment","view"]},{"cells":["factoryController()","address","view"]},{"cells":["fundPublication(uint256 auctionId)","bytes32 intentId","payable"]},{"cells":["mintEdition(uint256 auctionId, address recipient)","uint256 tokenId","nonpayable"]},{"cells":["mintRouteRegistry()","address","view"]},{"cells":["mintUnique(uint256 auctionId, address recipient)","uint256 tokenId","nonpayable"]},{"cells":["prepareBidderOutcome(uint256 auctionId)","—","nonpayable"]},{"cells":["preparePatronOutcome(uint256 auctionId, uint32 finalSupply)","—","nonpayable"]},{"cells":["publicationHold()","address","view"]},{"cells":["quotePublication(uint256 auctionId)","bytes32 intentId, uint256 fee, uint256 proceeds, uint32 revision, bool needsIntent","view"]},{"cells":["registerAuction(uint256 auctionId, address artist, address uniqueCollection, address editions, uint256 editionTokenId, uint32 maximumEditionSize)","uint256 uniqueTokenId","nonpayable"]},{"cells":["registerDeferredSale(uint256 auctionId, address artist, uint32 patronSupply, bytes encodedPlan)","address bidderTarget, address patronTarget, uint128 publicationBudget","nonpayable"]},{"cells":["registerSale(uint256 auctionId, address artist, (uint32,uint256) bidder, (uint32,uint256) patrons)","uint256 bidderTokenId, uint256 patronTokenId","nonpayable"]},{"cells":["requireSystemsActive(uint192 mask)","—","view"]},{"cells":["salePolicy(uint256 auctionId)","uint256","view"]},{"cells":["saleTargets(uint256 auctionId)","address bidder, address patrons","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AuctionMintRoutesBound(uint256 indexed auctionId, uint256 uniqueRouteId, uint256 editionRouteId)"]},{"cells":["AuctionRegistered(uint256 indexed auctionId, address indexed artist, address indexed uniqueCollection, address editions, uint256 uniqueTokenId, uint256 editionTokenId, uint32 maximumEditionSize)"]},{"cells":["CreatorFactoryBound(address indexed creatorFactory)"]},{"cells":["DeferredSaleRegistered(uint8 fundingMode, uint128 publicationBudget, uint256 indexed auctionId, bytes32 indexed objectId, bytes32 indexed reservationId)"]},{"cells":["EditionIssued(uint256 indexed auctionId, address indexed recipient, uint256 indexed tokenId)"]},{"cells":["OutcomePrepared(uint256 indexed auctionId, uint8 indexed outcome, uint32 supply)"]},{"cells":["PublicationFunded(uint256 fee, uint256 indexed auctionId, uint256 proceedsUsed, bytes32 indexed intentId)"]},{"cells":["SalePolicyBound(uint256 indexed auctionId, uint256 policy)"]},{"cells":["UniqueIssued(uint256 indexed auctionId, address indexed recipient, uint256 indexed tokenId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AlreadyBound()"]},{"cells":["AlreadyMinted()"]},{"cells":["IncorrectPublicationPayment()"]},{"cells":["InvalidAuction()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidSupply()"]},{"cells":["InvalidTarget()"]},{"cells":["OutcomeSelected()"]},{"cells":["PublicationNotReady()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["ReleaseBindingRequired()"]},{"cells":["Unauthorized()"]},{"cells":["WrongOutcome()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address auctionHouse_, address factoryController_, address mintRouteRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelmintgate","title":"KeelMintGate","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelMintGate","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/KeelMintGate.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/KeelMintGate.json"},{"label":"Sepolia showcase · 0x9f21416da06edddb7f21a70bcbc91cd732803262","href":"https://sepolia.etherscan.io/address/0x9f21416da06edddb7f21a70bcbc91cd732803262#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ACCESS_CUSTOM_GATE()","uint8","view"]},{"cells":["ACCESS_MERKLE()","uint8","view"]},{"cells":["ACCESS_TOKEN_BALANCE()","uint8","view"]},{"cells":["CAMPAIGN_ADMIN_ROLE()","bytes32","view"]},{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["MAX_CUSTOM_GATE_DATA_BYTES()","uint256","view"]},{"cells":["MAX_PLATFORM_FEE_BPS()","uint16","view"]},{"cells":["MINT_AUTHORIZATION_TYPEHASH()","bytes32","view"]},{"cells":["activeAuthorizationDigest(bytes32 campaignId, address account)","bytes32 digest","view"]},{"cells":["authorizationDigest((bytes32,address,address,uint256,uint256,uint256,uint256,bytes32) authorization)","bytes32","view"]},{"cells":["authorizationUsed(bytes32 authorizationDigest)","uint256 quantity","view"]},{"cells":["campaignCapacityProtected(bytes32 campaignId)","bool protected","view"]},{"cells":["campaignCapacityStatus(bytes32 campaignId)","bool protected, bool closed, uint256 campaignRemaining, uint256 targetRemaining","view"]},{"cells":["campaignClosed(bytes32 campaignId)","bool closed","view"]},{"cells":["campaignReservedCapacity(bytes32 campaignId)","uint64 quantity","view"]},{"cells":["closeCampaign(bytes32 campaignId)","—","nonpayable"]},{"cells":["createCampaign((address,address,address,address,address,uint64,uint64,uint64,uint64,uint128,bytes32,address,uint256,uint256,uint8,address,bytes,uint8,uint8,uint8,bytes32) config)","bytes32 campaignId","nonpayable"]},{"cells":["creatorNonces(address creator)","uint256 nonce","view"]},{"cells":["creatorProfileRegistry()","address","view"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["getCampaign(bytes32 campaignId)","(address,address,address,address,address,address,address,address,uint64,uint64,uint64,uint64,uint64,uint128,uint16,bytes32,address,uint256,uint256,uint8,address,bytes,uint8,uint8,uint8,bool,bool,uint256,bytes32)","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["invalidateAuthorizationNonce(bytes32 campaignId)","—","nonpayable"]},{"cells":["mint(bytes32 campaignId, uint64 quantity, (uint256,bytes32[],(bytes32,address,address,uint256,uint256,uint256,uint256,bytes32),bytes,bytes,bytes) proof)","—","payable"]},{"cells":["mintRouteRegistry()","address","view"]},{"cells":["mintedBy(bytes32 campaignId, address account)","uint64 quantity","view"]},{"cells":["nonces(bytes32 campaignId, address account)","uint256 nonce","view"]},{"cells":["pause()","—","nonpayable"]},{"cells":["paused()","bool","view"]},{"cells":["pendingBalance(address asset, address recipient)","uint256 amount","view"]},{"cells":["platformFeeBps()","uint16","view"]},{"cells":["platformFeeRecipient()","address","view"]},{"cells":["platformSigner()","address","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["requireSystemsActive(uint192 mask)","—","view"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["setCampaignPaused(bytes32 campaignId, bool paused_)","—","nonpayable"]},{"cells":["setPlatformConfiguration(address signer, address feeRecipient, uint16 feeBps)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["targetReservedCapacity(address target)","uint256 quantity","view"]},{"cells":["unpause()","—","nonpayable"]},{"cells":["withdraw(address asset, address recipient)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AuthorizationNonceInvalidated(bytes32 indexed campaignId, address indexed account, uint256 newNonce)"]},{"cells":["CampaignCapacityConsumed(bytes32 indexed campaignId, address indexed target, uint256 quantity, uint256 targetRemaining, uint256 campaignRemaining)"]},{"cells":["CampaignCapacityReleased(bytes32 indexed campaignId, address indexed target, uint256 quantity, uint256 targetRemaining, uint256 campaignRemaining)"]},{"cells":["CampaignCapacityReserved(bytes32 indexed campaignId, address indexed target, uint256 quantity, uint256 targetRemaining, uint256 campaignRemaining)"]},{"cells":["CampaignClosedPermanently(bytes32 indexed campaignId, uint256 releasedCapacity)"]},{"cells":["CampaignCreated(uint8 accessFlags, uint8 signatureMode, uint64 maxSupply, uint64 maxPerWallet, bytes32 indexed campaignId, bytes32 metadataHash, address indexed target, address indexed creator, address adapter, uint128 unitPrice)"]},{"cells":["CampaignMintRouteBound(bytes32 indexed campaignId, uint256 indexed routeId)"]},{"cells":["CampaignPauseUpdated(bool paused, bytes32 indexed campaignId)"]},{"cells":["EIP712DomainChanged()"]},{"cells":["Minted(bool platformSigned, bytes32 indexed campaignId, address signer, address indexed account, uint256 paid, uint256 quantity)"]},{"cells":["Paused(address account)"]},{"cells":["PlatformConfigurationUpdated(uint16 feeBps, address indexed signer, address indexed feeRecipient)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["Unpaused(address account)"]},{"cells":["Withdrawal(address indexed asset, address indexed account, address indexed recipient, uint256 amount)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["AccessDenied()"]},{"cells":["AuthorizationExhausted()"]},{"cells":["AuthorizationExpired()"]},{"cells":["CampaignClosed()"]},{"cells":["CampaignEnded()"]},{"cells":["CampaignMissing()"]},{"cells":["CampaignNotStarted()"]},{"cells":["CampaignPaused()"]},{"cells":["CapacityReservationFailed()"]},{"cells":["CapacityTrackingMismatch()"]},{"cells":["CreatorProfileIncomplete(address creator)"]},{"cells":["EnforcedPause()"]},{"cells":["ExpectedPause()"]},{"cells":["FeeTransferFailed()"]},{"cells":["IncorrectPayment(uint256 expected, uint256 received)"]},{"cells":["InvalidAuthorization()"]},{"cells":["InvalidConfiguration()"]},{"cells":["InvalidFee()"]},{"cells":["InvalidFeeRecipient()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidShortString()"]},{"cells":["NothingToWithdraw()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["SafeERC20FailedOperation(address token)"]},{"cells":["StringTooLong(string str)"]},{"cells":["SupplyExceeded()"]},{"cells":["TransferFailed()"]},{"cells":["Unauthorized()"]},{"cells":["UnsupportedFeeToken()"]},{"cells":["UnsupportedPaymentToken()"]},{"cells":["WalletLimitExceeded()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin, address platformSigner_, address platformFeeRecipient_, uint16 platformFeeBps_, address creatorProfileRegistry_, address mintRouteRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelmintrouteregistry","title":"KeelMintRouteRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelMintRouteRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/KeelMintRouteRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/KeelMintRouteRegistry.json"},{"label":"Sepolia showcase · 0x4dcc1132decf43ce72bbfad6f3ae109e85196fde","href":"https://sepolia.etherscan.io/address/0x4dcc1132decf43ce72bbfad6f3ae109e85196fde#code"},{"label":"Sepolia creator-inline-20261005 · 0xB3CD12cEf903B889Bc6C500726411d4c04f62bC1","href":"https://sepolia.etherscan.io/address/0xB3CD12cEf903B889Bc6C500726411d4c04f62bC1#code"},{"label":"Sepolia studio-audience-checkout-20261006 · 0x96Cef44bDd8647F42c66d1B82e69334a9b4aDcB3","href":"https://sepolia.etherscan.io/address/0x96Cef44bDd8647F42c66d1B82e69334a9b4aDcB3#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DEFAULT_ADMIN_ROLE()","bytes32","view"]},{"cells":["MAX_RELEASE_SUPPLY()","uint64","view"]},{"cells":["PAUSE_ROLE()","bytes32","view"]},{"cells":["REGISTRY_VERSION()","bytes32","view"]},{"cells":["RESUME_ROLE()","bytes32","view"]},{"cells":["administratorCount()","uint256","view"]},{"cells":["bindReleaseAllocation(uint64 id, uint256 routeId, address controller, bytes32 allocationId)","—","nonpayable"]},{"cells":["controlledMinter(address controller)","bool approved","view"]},{"cells":["controllerRouteReserved(address controller, uint256 routeId)","uint256 quantity","view"]},{"cells":["createRelease(uint256 routeId, address factory, bytes32 name, uint64 limit, uint64 ceiling, uint8 mode)","uint64 id","nonpayable"]},{"cells":["creatorAdminMint(uint256 routeId, address recipient, uint256 quantity, bytes data)","bytes32 allocationId","nonpayable"]},{"cells":["creatorAdminMintNonce(uint256 routeId)","uint256 nonce","view"]},{"cells":["creatorAdminMintingEnabled(uint256 routeId)","bool enabled","view"]},{"cells":["creatorReleaseCount(address creator)","uint64","view"]},{"cells":["currentRouteId(bytes32 routeKey)","uint256 routeId","view"]},{"cells":["getRoleAdmin(bytes32 role)","bytes32","view"]},{"cells":["grantRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["hasRole(bytes32 role, address account)","bool","view"]},{"cells":["lastAdministratorProtectionEnabled()","bool","pure"]},{"cells":["localPauseState()","uint192 flags, uint64 revision","view"]},{"cells":["mintReserved(uint256 routeId, bytes32 allocationId, address recipient, uint256 quantity, bytes data)","—","nonpayable"]},{"cells":["mintReservedBatch(address recipient, (bytes,uint256,uint256,bytes32)[] mints)","—","nonpayable"]},{"cells":["mintUnreserved(uint256 routeId, bytes32 allocationId, address recipient, uint256 quantity, bytes data)","—","nonpayable"]},{"cells":["mintUnreservedBatch(address recipient, (bytes,uint256,uint256,bytes32)[] mints)","—","nonpayable"]},{"cells":["nameReleaseToken(uint64 id, uint64 local, bytes32 name)","—","nonpayable"]},{"cells":["nextRouteId()","uint256","view"]},{"cells":["pauseLocalSystems(uint192 mask)","—","nonpayable"]},{"cells":["registerDeferredRelease(address creator, address target, uint256 tokenId, address controller, bytes32 allocationId, uint32 supply)","uint256 routeId","nonpayable"]},{"cells":["registerERC1155Route(address target, uint256 tokenId, address hook)","uint256 routeId","nonpayable"]},{"cells":["registerERC721Route(address target, address hook)","uint256 routeId","nonpayable"]},{"cells":["releaseAllocation(address controller, uint256 routeId, bytes32 allocationId)","uint64","view"]},{"cells":["releaseByName(address creator, bytes32 name)","uint64","view"]},{"cells":["releaseByNumber(address creator, uint64 number)","uint64","view"]},{"cells":["releaseCapacity(uint256 routeId, bytes32 allocationId, uint256 quantity)","—","nonpayable"]},{"cells":["releaseFactoryApproved(address factory)","bool","view"]},{"cells":["releasePolicy(uint64 id)","uint256","view"]},{"cells":["releaseRequired(bytes32 key)","bool","view"]},{"cells":["releaseRoute(uint64 id)","uint256","view"]},{"cells":["releaseSnapshot(address target, uint256 tokenId)","uint64 id, uint64 local, uint256 policy, uint256 targetMaximum, address authority","view"]},{"cells":["releaseTokenByName(uint64 id, bytes32 name)","uint64","view"]},{"cells":["releaseTokenName(uint64 id, uint64 local)","bytes32","view"]},{"cells":["renounceRole(bytes32 role, address callerConfirmation)","—","nonpayable"]},{"cells":["requireSystemsActive(uint192 mask)","—","view"]},{"cells":["reserveCapacity(uint256 routeId, bytes32 allocationId, uint256 quantity)","—","nonpayable"]},{"cells":["reservedCapacity(address controller, uint256 routeId, bytes32 allocationId)","uint256","view"]},{"cells":["resolveCollectionToken(address target, uint256 tokenId)","uint64 id, uint64 local","view"]},{"cells":["resolveCurrentRoute(address controller, address creator, address target, uint256 tokenId, uint8 standard)","uint256 routeId, (address,address,address,bytes32,bytes32,uint256,uint8,bool) route_","view"]},{"cells":["resolveCurrentTargetRoute(address controller, address target, uint256 tokenId, uint8 standard)","uint256 routeId, (address,address,address,bytes32,bytes32,uint256,uint8,bool) route_","view"]},{"cells":["resolveNamedReleaseToken(address creator, bytes32 releaseName, bytes32 tokenName)","address target, uint256 tokenId","view"]},{"cells":["resolveReleaseToken(uint64 id, uint64 local)","address target, uint256 tokenId","view"]},{"cells":["resumeLocalSystems(uint192 mask, uint64 expectedRevision)","—","nonpayable"]},{"cells":["revokeRole(bytes32 role, address account)","—","nonpayable"]},{"cells":["route(uint256 routeId)","(address,address,address,bytes32,bytes32,uint256,uint8,bool)","view"]},{"cells":["routeKey(address target, uint256 tokenId, uint8 standard)","bytes32","pure"]},{"cells":["setControlledMinter(address controller, bool approved)","—","nonpayable"]},{"cells":["setCreatorAdminMintingEnabled(uint256 routeId, bool enabled)","—","nonpayable"]},{"cells":["setReleaseFactory(address factory, bool approved)","—","nonpayable"]},{"cells":["setReleaseLimit(uint64 id, uint64 limit, bool lock)","—","nonpayable"]},{"cells":["setRouteEnabled(uint256 routeId, bool enabled)","—","nonpayable"]},{"cells":["supportsInterface(bytes4 interfaceId)","bool","view"]},{"cells":["validateRoute(uint256 routeId, address controller)","(address,address,address,bytes32,bytes32,uint256,uint8,bool) route_","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["ControlledMinterUpdated(bool approved, address indexed controller)"]},{"cells":["CreatorAdminMinted(uint256 indexed routeId, uint256 quantity, bytes32 indexed allocationId, address indexed creator, address recipient)"]},{"cells":["CreatorAdminMintingUpdated(bool enabled, uint256 indexed routeId, address indexed authority)"]},{"cells":["LocalSystemsPaused(uint192 flags, uint64 revision, address indexed operator)"]},{"cells":["MintRouteRegistered(uint256 indexed routeId, uint256 tokenId, address hook, address indexed target, address indexed creator, bytes32 hookCodeHash, bytes32 targetCodeHash, uint8 standard)"]},{"cells":["MintRouteStatusUpdated(bool enabled, uint256 indexed routeId, address indexed authority)"]},{"cells":["ReleaseAllocationBound(bytes32 indexed allocationId, uint256 routeId, uint256 indexed releaseId, address indexed controller)"]},{"cells":["ReleaseCreated(uint64 number, bytes32 name, uint256 policy, uint256 routeId, uint256 indexed releaseId, address indexed creator)"]},{"cells":["ReleaseFactorySet(bool approved, address indexed factory)"]},{"cells":["ReleasePolicySet(uint256 policy, uint256 indexed releaseId)"]},{"cells":["ReleaseTokenNamed(uint64 localId, bytes32 indexed name, uint256 indexed releaseId)"]},{"cells":["RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)"]},{"cells":["RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)"]},{"cells":["RouteCapacityReleased(address indexed controller, uint256 indexed routeId, uint256 quantity, bytes32 indexed allocationId)"]},{"cells":["RouteCapacityReserved(address indexed controller, uint256 indexed routeId, uint256 quantity, bytes32 indexed allocationId)"]},{"cells":["RouteMinted(address recipient, address indexed controller, uint256 indexed routeId, uint256 quantity, bytes32 indexed allocationId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessControlBadConfirmation()"]},{"cells":["AccessControlUnauthorizedAccount(address account, bytes32 neededRole)"]},{"cells":["BatchMintUnsupported()"]},{"cells":["CapacityTrackingMismatch()"]},{"cells":["CodeHashChanged()"]},{"cells":["CreatorAdminMintingDisabled()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidLocalPauseMask()"]},{"cells":["InvalidMintBatch()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidReleasePolicy()"]},{"cells":["InvalidReservation()"]},{"cells":["InvalidRoute()"]},{"cells":["InvalidStandard()"]},{"cells":["LastAdministrator()"]},{"cells":["LocalSystemsUnavailable(uint192 flags)"]},{"cells":["MinterNotControlled()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["ReleaseAllocationAlreadyBound()"]},{"cells":["ReleaseAllocationRequired()"]},{"cells":["ReleaseCapacityExceeded()"]},{"cells":["ReleaseFactoryUnapproved()"]},{"cells":["ReleaseItemAlreadyIssued()"]},{"cells":["ReleaseLocked()"]},{"cells":["ReleaseMintMismatch()"]},{"cells":["ReleaseMissing()"]},{"cells":["ReleaseNameTaken()"]},{"cells":["ReleaseRangeOverflow()"]},{"cells":["ReleaseReservationsOutstanding()"]},{"cells":["ReleaseTargetMismatch()"]},{"cells":["ReleaseTargetUnsupported()"]},{"cells":["ReleaseTokenMissing()"]},{"cells":["ReleaseTokenNameTaken()"]},{"cells":["RouteDisabled()"]},{"cells":["RouteSuperseded()"]},{"cells":["StaleLocalPauseRevision()"]},{"cells":["Unauthorized()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelonemintbatch","title":"KeelOneMintBatch","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelOneMintBatch","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/KeelOneMintBatch.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/KeelOneMintBatch.json"},{"label":"Sepolia studio-audience-checkout-20261006 · 0xF3F919f9841eAcd166E49EBc42660e1F48491018","href":"https://sepolia.etherscan.io/address/0xF3F919f9841eAcd166E49EBc42660e1F48491018#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ALLOCATION_LED_END()","uint64","view"]},{"cells":["AUTHORIZATION_TYPEHASH()","bytes32","view"]},{"cells":["MAX_CLAIM_IDS()","uint16","view"]},{"cells":["MAX_STAGES()","uint16","view"]},{"cells":["OPEN_SUPPLY()","uint64","view"]},{"cells":["adminStrike(bytes32 dropId, uint16 stageIndex, address recipient, uint32 quantity, bytes mintData)","—","nonpayable"]},{"cells":["allowlistMint((bytes32,uint16,address,uint32,uint256,uint64,bytes32) authorization, bytes signature, bytes mintData)","—","payable"]},{"cells":["authorizationDigest((bytes32,uint16,address,uint32,uint256,uint64,bytes32) authorization)","bytes32","view"]},{"cells":["batchMint(address paymentAsset, uint256 maxTotal, (bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32))[] purchases)","—","payable"]},{"cells":["batchMintWithCoupons(address paymentAsset, uint256 maxTotal, (bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32))[] purchases, (bytes,uint64,uint64,uint64,bytes32)[] redemptions)","—","payable"]},{"cells":["batchMintWithNftCoupons(address paymentAsset, uint256 maxTotal, (bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32))[] purchases, (bytes,uint64,uint64,uint64,bytes32)[] redemptions, (uint256[],bytes32[][])[] proofs)","—","payable"]},{"cells":["capacityReservationSkipped(bytes32 dropId)","bool skipped","view"]},{"cells":["claimMint((bytes32,uint16,address,uint32,uint256,uint64,bytes32) authorization, bytes signature, uint256[] entitlementIds, bytes mintData)","—","payable"]},{"cells":["couponWalletWord(bytes32 dropId, bytes32 couponId, address buyer)","uint256 word","view"]},{"cells":["coupons(bytes32 dropId, bytes32 couponId)","uint256 terms, uint256 limits, uint256 authority","view"]},{"cells":["creatorNonces(address creator)","uint256 nonce","view"]},{"cells":["creatorProfileRegistry()","address","view"]},{"cells":["delegates(address target, address account)","bool","view"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["feeTreasury()","address","view"]},{"cells":["merkleLeaf(address account, uint32 allowance)","bytes32","pure"]},{"cells":["merkleMint(bytes32 dropId, uint16 stageIndex, uint32 quantity, uint32 allowance, bytes32[] merkleProof, bytes mintData)","—","payable"]},{"cells":["merkleMintedBy(bytes32 dropId, uint16 stageIndex, address account)","uint32 quantity","view"]},{"cells":["mintQueue(bytes32 dropId)","address queue","view"]},{"cells":["mintRouteRegistry()","address","view"]},{"cells":["mintWithCoupon((bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32)) purchase, (bytes,uint64,uint64,uint64,bytes32) coupon, uint256 maxTotal)","—","payable"]},{"cells":["mintWithNftCoupon((bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32)) purchase, (bytes,uint64,uint64,uint64,bytes32) coupon, (uint256[],bytes32[][]) proof, uint256 maxTotal)","—","payable"]},{"cells":["mintedBy(bytes32 dropId, address account)","uint64 quantity","view"]},{"cells":["nftCouponPolicies(bytes32 dropId, bytes32 couponId)","bytes32 root, uint256 word, uint256 firstTokenId, uint256 lastTokenId","view"]},{"cells":["nftCouponUsedWords(bytes32 domain, uint256 bucket)","uint256 word","view"]},{"cells":["nonces(bytes32 dropId, address account)","uint256 nonce","view"]},{"cells":["pendingBalance(address asset, address recipient)","uint256 amount","view"]},{"cells":["platformFeeBps()","uint16","view"]},{"cells":["publicMint(bytes32 dropId, uint16 stageIndex, uint32 quantity, bytes mintData)","—","payable"]},{"cells":["reservedByItem(address target, uint256 tokenId)","uint256 quantity","view"]},{"cells":["reservedByTarget(address target)","uint256 quantity","view"]},{"cells":["soldOutAt(bytes32 dropId)","uint64 soldOutAt","view"]},{"cells":["validateCouponTerms(uint256 terms)","—","pure"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CouponConfigured(bytes32 indexed dropId, bytes32 indexed couponId, uint256 terms, uint256 limits, uint256 authority)"]},{"cells":["CouponRedeemed(uint32 quantity, uint64 nonce, uint64 revision, bytes32 indexed dropId, bytes32 indexed couponId, address indexed buyer, uint256 discount)"]},{"cells":["CouponRevoked(bytes32 indexed dropId, bytes32 indexed couponId)"]},{"cells":["DelegateUpdated(address indexed target, address indexed delegate, address indexed authorizer, bool allowed)"]},{"cells":["DropAllocationExhausted(bytes32 indexed dropId, uint64 soldOutAt, uint64 minted)"]},{"cells":["DropAuthorizationNonceInvalidated(bytes32 indexed dropId, address indexed account, uint256 newNonce)"]},{"cells":["DropCapacityMode(bytes32 indexed dropId, address indexed target, bool reservationSkipped)"]},{"cells":["DropClosedPermanently(bytes32 indexed dropId, uint256 releasedCapacity)"]},{"cells":["DropCreated(bytes32 indexed dropId, address indexed creator, address indexed target, address payout, uint64 supply, uint32 defaultMaxPerTransaction, uint32 defaultMaxPerWallet, uint16 stageCount, bytes32 metadataDigest)"]},{"cells":["DropMintRouteBound(bytes32 indexed dropId, uint256 indexed routeId)"]},{"cells":["DropMinted(bytes32 indexed dropId, uint16 indexed stageIndex, address indexed account, uint32 quantity, uint256 paid, uint8 kind)"]},{"cells":["DropPauseUpdated(bytes32 indexed dropId, bool paused)"]},{"cells":["DropSupplyUpdated(bytes32 indexed dropId, uint64 previousSupply, uint64 supply, bool openSupply)"]},{"cells":["DropTargetBound(bytes32 indexed dropId, address indexed target, uint256 indexed tokenId, bool itemized)"]},{"cells":["DropTargetHookMode(bytes32 indexed dropId, address indexed target, bool skipped)"]},{"cells":["DropWithdrawal(address indexed asset, address indexed account, address indexed recipient, uint256 amount)"]},{"cells":["EIP712DomainChanged()"]},{"cells":["EntitlementClaimed(bytes32 indexed dropId, address indexed entitlementToken, uint256 indexed tokenId, address account)"]},{"cells":["MintFeePolicySet(uint16 bps, address indexed treasury)"]},{"cells":["MintPlatformFeePaid(address indexed asset, address indexed treasury, uint256 amount)"]},{"cells":["MintQueueSet(bytes32 indexed dropId, address indexed queue)"]},{"cells":["NftCouponConfigured(uint64 revision, bytes32 indexed dropId, bytes32 indexed couponId, bytes32 root, uint256 word, uint256 firstTokenId, uint256 lastTokenId)"]},{"cells":["NftCouponRedeemed(uint32 claims, uint64 revision, bytes32 indexed dropId, bytes32 indexed couponId, bytes32 tokenIdsDigest, address indexed buyer)"]},{"cells":["StageCreated(bytes32 indexed dropId, uint16 indexed stageIndex, uint8 kind, uint64 startTime, uint64 endTime, uint96 unitPrice, address paymentAsset, address signer, address entitlementToken, uint32 maxPerTransaction, uint32 maxPerWallet, bytes32 metadataDigest)"]},{"cells":["StageMerkleRootUpdated(bytes32 indexed dropId, uint16 indexed stageIndex, bytes32 merkleRoot)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AuthorizationExpired()"]},{"cells":["BatchDelegateOnly()"]},{"cells":["CheckoutPriceExceeded(uint256 maximum, uint256 total)"]},{"cells":["ClaimAlreadyUsed()"]},{"cells":["ClaimLengthMismatch()"]},{"cells":["ClaimNotOwned()"]},{"cells":["ContextMismatch()"]},{"cells":["CouponExhausted()"]},{"cells":["CouponExpired()"]},{"cells":["CouponReplay()"]},{"cells":["CouponSignatureInvalid()"]},{"cells":["CreatorProfileIncomplete(address creator)"]},{"cells":["DropClosed()"]},{"cells":["DropMissing()"]},{"cells":["DropPaused()"]},{"cells":["DropSoldOut()"]},{"cells":["FeeTransferFailed()"]},{"cells":["IncorrectPayment(uint256 expected, uint256 received)"]},{"cells":["InvalidCheckout()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidCoupon()"]},{"cells":["InvalidCouponTerms()"]},{"cells":["InvalidDropConfiguration()"]},{"cells":["InvalidFeeRecipient()"]},{"cells":["InvalidMerkleProof()"]},{"cells":["InvalidMintFeePolicy()"]},{"cells":["InvalidNftCoupon()"]},{"cells":["InvalidNonce()"]},{"cells":["InvalidPlatformFee()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidShortString()"]},{"cells":["InvalidSignature()"]},{"cells":["InvalidStage()"]},{"cells":["MerkleAllowanceExceeded()"]},{"cells":["MerkleRootMissing()"]},{"cells":["NftCouponIneligible()"]},{"cells":["NftCouponUsed()"]},{"cells":["NothingToWithdraw()"]},{"cells":["PreviousDropNotSoldOut()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["SafeERC20FailedOperation(address token)"]},{"cells":["StringTooLong(string str)"]},{"cells":["SuccessorStageMustBeScheduled()"]},{"cells":["TargetCapacityExceeded()"]},{"cells":["TargetCapacityUnsupported()"]},{"cells":["TransactionLimit()"]},{"cells":["TransferFailed()"]},{"cells":["Unauthorized()"]},{"cells":["UnsupportedFeeToken()"]},{"cells":["UnsupportedPaymentToken()"]},{"cells":["UnsupportedStage()"]},{"cells":["WalletLimit()"]},{"cells":["WrongStage()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address profile, address router)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"onemintcontroller","title":"OneMintController","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"OneMintController","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/OneMintController.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/OneMintController.json"},{"label":"Sepolia showcase · 0xc5a82b8320b6ad23cda749f079e3d7ad7b45cec9","href":"https://sepolia.etherscan.io/address/0xc5a82b8320b6ad23cda749f079e3d7ad7b45cec9#code"},{"label":"Sepolia studio-runtime-20261007 · 0x3b11713b690c50a8ce94ab89a02b904950f0432a","href":"https://sepolia.etherscan.io/address/0x3b11713b690c50a8ce94ab89a02b904950f0432a#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ALLOCATION_LED_END()","uint64","view"]},{"cells":["AUTHORIZATION_TYPEHASH()","bytes32","view"]},{"cells":["MAX_CLAIM_IDS()","uint16","view"]},{"cells":["MAX_STAGES()","uint16","view"]},{"cells":["OPEN_SUPPLY()","uint64","view"]},{"cells":["PROFILE_GATE_REQUIRED()","bool","pure"]},{"cells":["adminStrike(bytes32 dropId, uint16 stageIndex, address recipient, uint32 quantity, bytes mintData)","—","nonpayable"]},{"cells":["allowlistMint((bytes32,uint16,address,uint32,uint256,uint64,bytes32) authorization, bytes signature, bytes mintData)","—","payable"]},{"cells":["authorizationDigest((bytes32,uint16,address,uint32,uint256,uint64,bytes32) authorization)","bytes32","view"]},{"cells":["batchMint(address paymentAsset, uint256 maxTotal, (bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32))[] purchases)","—","payable"]},{"cells":["batchMintWithCoupons(address paymentAsset, uint256 maxTotal, (bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32))[] purchases, (bytes,uint64,uint64,uint64,bytes32)[] redemptions)","—","payable"]},{"cells":["batchMintWithNftCoupons(address paymentAsset, uint256 maxTotal, (bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32))[] purchases, (bytes,uint64,uint64,uint64,bytes32)[] redemptions, (uint256[],bytes32[][])[] proofs)","—","payable"]},{"cells":["batchModule()","address","view"]},{"cells":["capacityReservationSkipped(bytes32 dropId)","bool skipped","view"]},{"cells":["claimIdUsed(bytes32 dropId, address entitlementToken, uint256 tokenId)","bool used","view"]},{"cells":["claimMint((bytes32,uint16,address,uint32,uint256,uint64,bytes32) authorization, bytes signature, uint256[] entitlementIds, bytes mintData)","—","payable"]},{"cells":["claimWord(bytes32 dropId, address entitlementToken, uint256 wordIndex)","uint256","view"]},{"cells":["closeDrop(bytes32 dropId)","—","nonpayable"]},{"cells":["couponWalletWord(bytes32 dropId, bytes32 couponId, address buyer)","uint256 word","view"]},{"cells":["coupons(bytes32 dropId, bytes32 couponId)","uint256 terms, uint256 limits, uint256 authority","view"]},{"cells":["createDrop(address target, address payout, uint64 supply, uint32 maxPerTransaction, uint32 maxPerWallet, (uint8,uint64,uint64,uint96,address,address,address,uint32,uint32,bytes32)[] stages, bytes32 metadataDigest)","bytes32 dropId","nonpayable"]},{"cells":["createItemDrop(address target, uint256 targetTokenId, address payout, uint64 supply, uint32 maxPerTransaction, uint32 maxPerWallet, (uint8,uint64,uint64,uint96,address,address,address,uint32,uint32,bytes32)[] stages, bytes32 metadataDigest)","bytes32 dropId","nonpayable"]},{"cells":["creatorNonces(address creator)","uint256 nonce","view"]},{"cells":["creatorProfileRegistry()","address","view"]},{"cells":["currentStage(bytes32 dropId)","bool active, uint16 stageIndex, (uint8,uint64,uint64,uint96,address,address,address,uint32,uint32,bytes32) stage","view"]},{"cells":["delegates(address target, address account)","bool","view"]},{"cells":["effectiveStageLimits(bytes32 dropId, uint16 stageIndex)","uint32 maxPerTransaction, uint32 maxPerWallet","view"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["feeTreasury()","address","view"]},{"cells":["getDrop(bytes32 dropId)","(address,address,address,uint64,uint64,uint32,uint32,uint16,bool,bool,bool,bool,bytes32,uint256,bool,bool,uint256)","view"]},{"cells":["getStage(bytes32 dropId, uint16 stageIndex)","(uint8,uint64,uint64,uint96,address,address,address,uint32,uint32,bytes32)","view"]},{"cells":["invalidateNonce(bytes32 dropId, uint256 newNonce)","—","nonpayable"]},{"cells":["isDropSoldOut(bytes32 dropId)","bool","view"]},{"cells":["isOpenSupply(bytes32 dropId)","bool","view"]},{"cells":["latestDropForItem(address target, uint256 tokenId)","bytes32","view"]},{"cells":["latestDropForTarget(address target)","bytes32","view"]},{"cells":["merkleLeaf(address account, uint32 allowance)","bytes32","pure"]},{"cells":["merkleMint(bytes32 dropId, uint16 stageIndex, uint32 quantity, uint32 allowance, bytes32[] merkleProof, bytes mintData)","—","payable"]},{"cells":["merkleMintedBy(bytes32 dropId, uint16 stageIndex, address account)","uint32 quantity","view"]},{"cells":["mintQueue(bytes32 dropId)","address queue","view"]},{"cells":["mintRouteRegistry()","address","view"]},{"cells":["mintWithCoupon((bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32)) purchase, (bytes,uint64,uint64,uint64,bytes32) coupon, uint256 maxTotal)","—","payable"]},{"cells":["mintWithNftCoupon((bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32)) purchase, (bytes,uint64,uint64,uint64,bytes32) coupon, (uint256[],bytes32[][]) proof, uint256 maxTotal)","—","payable"]},{"cells":["mintedBy(bytes32 dropId, address account)","uint64 quantity","view"]},{"cells":["nftCouponPolicies(bytes32 dropId, bytes32 couponId)","bytes32 root, uint256 word, uint256 firstTokenId, uint256 lastTokenId","view"]},{"cells":["nftCouponUsedWords(bytes32 domain, uint256 bucket)","uint256 word","view"]},{"cells":["nonces(bytes32 dropId, address account)","uint256 nonce","view"]},{"cells":["pendingBalance(address asset, address recipient)","uint256 amount","view"]},{"cells":["platformFeeBps()","uint16","view"]},{"cells":["publicMint(bytes32 dropId, uint16 stageIndex, uint32 quantity, bytes mintData)","—","payable"]},{"cells":["queueSupply(bytes32 dropId)","uint256","view"]},{"cells":["requireSystemsActive(uint192 mask)","—","view"]},{"cells":["reservedByItem(address target, uint256 tokenId)","uint256 quantity","view"]},{"cells":["reservedByTarget(address target)","uint256 quantity","view"]},{"cells":["revokeCoupon(bytes32 dropId, bytes32 couponId)","—","nonpayable"]},{"cells":["setCoupon(bytes32 dropId, bytes32 couponId, (uint16,uint64,uint64,uint64,address,uint256) settings)","—","nonpayable"]},{"cells":["setDelegate(address target, address delegate, bool allowed)","—","nonpayable"]},{"cells":["setDropPaused(bytes32 dropId, bool paused)","—","nonpayable"]},{"cells":["setMintFeePolicy(address treasury, uint16 bps)","—","nonpayable"]},{"cells":["setMintQueue(bytes32 dropId, address queue)","—","nonpayable"]},{"cells":["setNftCoupon(bytes32 dropId, bytes32 couponId, (uint16,uint64,uint64,uint64,address,uint256) settings, (bool,uint24,uint32,bytes32,address,uint256,uint256) nft)","—","nonpayable"]},{"cells":["setStageMerkleRoot(bytes32 dropId, uint16 stageIndex, bytes32 merkleRoot)","—","nonpayable"]},{"cells":["soldOutAt(bytes32 dropId)","uint64 soldOutAt","view"]},{"cells":["stageMerkleRoot(bytes32 dropId, uint16 stageIndex)","bytes32","view"]},{"cells":["updateDropSupply(bytes32 dropId, uint64 nextSupply)","—","nonpayable"]},{"cells":["withdraw(address asset, address recipient)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CouponConfigured(bytes32 indexed dropId, bytes32 indexed couponId, uint256 terms, uint256 limits, uint256 authority)"]},{"cells":["CouponRedeemed(uint32 quantity, uint64 nonce, uint64 revision, bytes32 indexed dropId, bytes32 indexed couponId, address indexed buyer, uint256 discount)"]},{"cells":["CouponRevoked(bytes32 indexed dropId, bytes32 indexed couponId)"]},{"cells":["DelegateUpdated(address indexed target, address indexed delegate, address indexed authorizer, bool allowed)"]},{"cells":["DropAllocationExhausted(bytes32 indexed dropId, uint64 soldOutAt, uint64 minted)"]},{"cells":["DropAuthorizationNonceInvalidated(bytes32 indexed dropId, address indexed account, uint256 newNonce)"]},{"cells":["DropCapacityMode(bytes32 indexed dropId, address indexed target, bool reservationSkipped)"]},{"cells":["DropClosedPermanently(bytes32 indexed dropId, uint256 releasedCapacity)"]},{"cells":["DropCreated(bytes32 indexed dropId, address indexed creator, address indexed target, address payout, uint64 supply, uint32 defaultMaxPerTransaction, uint32 defaultMaxPerWallet, uint16 stageCount, bytes32 metadataDigest)"]},{"cells":["DropMintRouteBound(bytes32 indexed dropId, uint256 indexed routeId)"]},{"cells":["DropMinted(bytes32 indexed dropId, uint16 indexed stageIndex, address indexed account, uint32 quantity, uint256 paid, uint8 kind)"]},{"cells":["DropPauseUpdated(bytes32 indexed dropId, bool paused)"]},{"cells":["DropSupplyUpdated(bytes32 indexed dropId, uint64 previousSupply, uint64 supply, bool openSupply)"]},{"cells":["DropTargetBound(bytes32 indexed dropId, address indexed target, uint256 indexed tokenId, bool itemized)"]},{"cells":["DropTargetHookMode(bytes32 indexed dropId, address indexed target, bool skipped)"]},{"cells":["DropWithdrawal(address indexed asset, address indexed account, address indexed recipient, uint256 amount)"]},{"cells":["EIP712DomainChanged()"]},{"cells":["EntitlementClaimed(bytes32 indexed dropId, address indexed entitlementToken, uint256 indexed tokenId, address account)"]},{"cells":["MintFeePolicySet(uint16 bps, address indexed treasury)"]},{"cells":["MintPlatformFeePaid(address indexed asset, address indexed treasury, uint256 amount)"]},{"cells":["MintQueueSet(bytes32 indexed dropId, address indexed queue)"]},{"cells":["NftCouponConfigured(uint64 revision, bytes32 indexed dropId, bytes32 indexed couponId, bytes32 root, uint256 word, uint256 firstTokenId, uint256 lastTokenId)"]},{"cells":["NftCouponRedeemed(uint32 claims, uint64 revision, bytes32 indexed dropId, bytes32 indexed couponId, bytes32 tokenIdsDigest, address indexed buyer)"]},{"cells":["StageCreated(bytes32 indexed dropId, uint16 indexed stageIndex, uint8 kind, uint64 startTime, uint64 endTime, uint96 unitPrice, address paymentAsset, address signer, address entitlementToken, uint32 maxPerTransaction, uint32 maxPerWallet, bytes32 metadataDigest)"]},{"cells":["StageMerkleRootUpdated(bytes32 indexed dropId, uint16 indexed stageIndex, bytes32 merkleRoot)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AuthorizationExpired()"]},{"cells":["BatchDelegateOnly()"]},{"cells":["CheckoutPriceExceeded(uint256 maximum, uint256 total)"]},{"cells":["ClaimAlreadyUsed()"]},{"cells":["ClaimLengthMismatch()"]},{"cells":["ClaimNotOwned()"]},{"cells":["ContextMismatch()"]},{"cells":["CouponExhausted()"]},{"cells":["CouponExpired()"]},{"cells":["CouponReplay()"]},{"cells":["CouponSignatureInvalid()"]},{"cells":["CreatorProfileIncomplete(address creator)"]},{"cells":["DropClosed()"]},{"cells":["DropMissing()"]},{"cells":["DropPaused()"]},{"cells":["DropSoldOut()"]},{"cells":["FeeTransferFailed()"]},{"cells":["IncorrectPayment(uint256 expected, uint256 received)"]},{"cells":["InvalidCheckout()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidCoupon()"]},{"cells":["InvalidCouponTerms()"]},{"cells":["InvalidDropConfiguration()"]},{"cells":["InvalidFeeRecipient()"]},{"cells":["InvalidMerkleProof()"]},{"cells":["InvalidMintFeePolicy()"]},{"cells":["InvalidNftCoupon()"]},{"cells":["InvalidNonce()"]},{"cells":["InvalidPlatformFee()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidShortString()"]},{"cells":["InvalidSignature()"]},{"cells":["InvalidStage()"]},{"cells":["MerkleAllowanceExceeded()"]},{"cells":["MerkleRootMissing()"]},{"cells":["NftCouponIneligible()"]},{"cells":["NftCouponUsed()"]},{"cells":["NothingToWithdraw()"]},{"cells":["PreviousDropNotSoldOut()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["SafeERC20FailedOperation(address token)"]},{"cells":["StringTooLong(string str)"]},{"cells":["SuccessorStageMustBeScheduled()"]},{"cells":["TargetCapacityExceeded()"]},{"cells":["TargetCapacityUnsupported()"]},{"cells":["TransactionLimit()"]},{"cells":["TransferFailed()"]},{"cells":["Unauthorized()"]},{"cells":["UnsupportedFeeToken()"]},{"cells":["UnsupportedPaymentToken()"]},{"cells":["UnsupportedStage()"]},{"cells":["WalletLimit()"]},{"cells":["WrongStage()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address creatorProfileRegistry_, address mintRouteRegistry_, address batchModule_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"openonemintcontroller","title":"OpenOneMintController","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"OpenOneMintController","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/OpenOneMintController.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/OpenOneMintController.json"},{"label":"Sepolia studio-audience-checkout-20261006 · 0xEF3306378895a9B49ed16416A8fCb767E79b8595","href":"https://sepolia.etherscan.io/address/0xEF3306378895a9B49ed16416A8fCb767E79b8595#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ALLOCATION_LED_END()","uint64","view"]},{"cells":["AUTHORIZATION_TYPEHASH()","bytes32","view"]},{"cells":["MAX_CLAIM_IDS()","uint16","view"]},{"cells":["MAX_STAGES()","uint16","view"]},{"cells":["OPEN_SUPPLY()","uint64","view"]},{"cells":["PROFILE_GATE_REQUIRED()","bool","pure"]},{"cells":["adminStrike(bytes32 dropId, uint16 stageIndex, address recipient, uint32 quantity, bytes mintData)","—","nonpayable"]},{"cells":["allowlistMint((bytes32,uint16,address,uint32,uint256,uint64,bytes32) authorization, bytes signature, bytes mintData)","—","payable"]},{"cells":["authorizationDigest((bytes32,uint16,address,uint32,uint256,uint64,bytes32) authorization)","bytes32","view"]},{"cells":["batchMint(address paymentAsset, uint256 maxTotal, (bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32))[] purchases)","—","payable"]},{"cells":["batchMintWithCoupons(address paymentAsset, uint256 maxTotal, (bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32))[] purchases, (bytes,uint64,uint64,uint64,bytes32)[] redemptions)","—","payable"]},{"cells":["batchMintWithNftCoupons(address paymentAsset, uint256 maxTotal, (bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32))[] purchases, (bytes,uint64,uint64,uint64,bytes32)[] redemptions, (uint256[],bytes32[][])[] proofs)","—","payable"]},{"cells":["batchModule()","address","view"]},{"cells":["capacityReservationSkipped(bytes32 dropId)","bool skipped","view"]},{"cells":["claimIdUsed(bytes32 dropId, address entitlementToken, uint256 tokenId)","bool used","view"]},{"cells":["claimMint((bytes32,uint16,address,uint32,uint256,uint64,bytes32) authorization, bytes signature, uint256[] entitlementIds, bytes mintData)","—","payable"]},{"cells":["claimWord(bytes32 dropId, address entitlementToken, uint256 wordIndex)","uint256","view"]},{"cells":["closeDrop(bytes32 dropId)","—","nonpayable"]},{"cells":["couponWalletWord(bytes32 dropId, bytes32 couponId, address buyer)","uint256 word","view"]},{"cells":["coupons(bytes32 dropId, bytes32 couponId)","uint256 terms, uint256 limits, uint256 authority","view"]},{"cells":["createDrop(address target, address payout, uint64 supply, uint32 maxPerTransaction, uint32 maxPerWallet, (uint8,uint64,uint64,uint96,address,address,address,uint32,uint32,bytes32)[] stages, bytes32 metadataDigest)","bytes32 dropId","nonpayable"]},{"cells":["createItemDrop(address target, uint256 targetTokenId, address payout, uint64 supply, uint32 maxPerTransaction, uint32 maxPerWallet, (uint8,uint64,uint64,uint96,address,address,address,uint32,uint32,bytes32)[] stages, bytes32 metadataDigest)","bytes32 dropId","nonpayable"]},{"cells":["creatorNonces(address creator)","uint256 nonce","view"]},{"cells":["creatorProfileRegistry()","address","view"]},{"cells":["currentStage(bytes32 dropId)","bool active, uint16 stageIndex, (uint8,uint64,uint64,uint96,address,address,address,uint32,uint32,bytes32) stage","view"]},{"cells":["delegates(address target, address account)","bool","view"]},{"cells":["effectiveStageLimits(bytes32 dropId, uint16 stageIndex)","uint32 maxPerTransaction, uint32 maxPerWallet","view"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["feeTreasury()","address","view"]},{"cells":["getDrop(bytes32 dropId)","(address,address,address,uint64,uint64,uint32,uint32,uint16,bool,bool,bool,bool,bytes32,uint256,bool,bool,uint256)","view"]},{"cells":["getStage(bytes32 dropId, uint16 stageIndex)","(uint8,uint64,uint64,uint96,address,address,address,uint32,uint32,bytes32)","view"]},{"cells":["invalidateNonce(bytes32 dropId, uint256 newNonce)","—","nonpayable"]},{"cells":["isDropSoldOut(bytes32 dropId)","bool","view"]},{"cells":["isOpenSupply(bytes32 dropId)","bool","view"]},{"cells":["latestDropForItem(address target, uint256 tokenId)","bytes32","view"]},{"cells":["latestDropForTarget(address target)","bytes32","view"]},{"cells":["merkleLeaf(address account, uint32 allowance)","bytes32","pure"]},{"cells":["merkleMint(bytes32 dropId, uint16 stageIndex, uint32 quantity, uint32 allowance, bytes32[] merkleProof, bytes mintData)","—","payable"]},{"cells":["merkleMintedBy(bytes32 dropId, uint16 stageIndex, address account)","uint32 quantity","view"]},{"cells":["mintQueue(bytes32 dropId)","address queue","view"]},{"cells":["mintRouteRegistry()","address","view"]},{"cells":["mintWithCoupon((bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32)) purchase, (bytes,uint64,uint64,uint64,bytes32) coupon, uint256 maxTotal)","—","payable"]},{"cells":["mintWithNftCoupon((bytes,bytes,uint32,bytes32[],uint256[],(bytes32,uint16,address,uint32,uint256,uint64,bytes32)) purchase, (bytes,uint64,uint64,uint64,bytes32) coupon, (uint256[],bytes32[][]) proof, uint256 maxTotal)","—","payable"]},{"cells":["mintedBy(bytes32 dropId, address account)","uint64 quantity","view"]},{"cells":["nftCouponPolicies(bytes32 dropId, bytes32 couponId)","bytes32 root, uint256 word, uint256 firstTokenId, uint256 lastTokenId","view"]},{"cells":["nftCouponUsedWords(bytes32 domain, uint256 bucket)","uint256 word","view"]},{"cells":["nonces(bytes32 dropId, address account)","uint256 nonce","view"]},{"cells":["pendingBalance(address asset, address recipient)","uint256 amount","view"]},{"cells":["platformFeeBps()","uint16","view"]},{"cells":["publicMint(bytes32 dropId, uint16 stageIndex, uint32 quantity, bytes mintData)","—","payable"]},{"cells":["queueSupply(bytes32 dropId)","uint256","view"]},{"cells":["requireSystemsActive(uint192 mask)","—","view"]},{"cells":["reservedByItem(address target, uint256 tokenId)","uint256 quantity","view"]},{"cells":["reservedByTarget(address target)","uint256 quantity","view"]},{"cells":["revokeCoupon(bytes32 dropId, bytes32 couponId)","—","nonpayable"]},{"cells":["setCoupon(bytes32 dropId, bytes32 couponId, (uint16,uint64,uint64,uint64,address,uint256) settings)","—","nonpayable"]},{"cells":["setDelegate(address target, address delegate, bool allowed)","—","nonpayable"]},{"cells":["setDropPaused(bytes32 dropId, bool paused)","—","nonpayable"]},{"cells":["setMintFeePolicy(address treasury, uint16 bps)","—","nonpayable"]},{"cells":["setMintQueue(bytes32 dropId, address queue)","—","nonpayable"]},{"cells":["setNftCoupon(bytes32 dropId, bytes32 couponId, (uint16,uint64,uint64,uint64,address,uint256) settings, (bool,uint24,uint32,bytes32,address,uint256,uint256) nft)","—","nonpayable"]},{"cells":["setStageMerkleRoot(bytes32 dropId, uint16 stageIndex, bytes32 merkleRoot)","—","nonpayable"]},{"cells":["soldOutAt(bytes32 dropId)","uint64 soldOutAt","view"]},{"cells":["stageMerkleRoot(bytes32 dropId, uint16 stageIndex)","bytes32","view"]},{"cells":["updateDropSupply(bytes32 dropId, uint64 nextSupply)","—","nonpayable"]},{"cells":["withdraw(address asset, address recipient)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CouponConfigured(bytes32 indexed dropId, bytes32 indexed couponId, uint256 terms, uint256 limits, uint256 authority)"]},{"cells":["CouponRedeemed(uint32 quantity, uint64 nonce, uint64 revision, bytes32 indexed dropId, bytes32 indexed couponId, address indexed buyer, uint256 discount)"]},{"cells":["CouponRevoked(bytes32 indexed dropId, bytes32 indexed couponId)"]},{"cells":["DelegateUpdated(address indexed target, address indexed delegate, address indexed authorizer, bool allowed)"]},{"cells":["DropAllocationExhausted(bytes32 indexed dropId, uint64 soldOutAt, uint64 minted)"]},{"cells":["DropAuthorizationNonceInvalidated(bytes32 indexed dropId, address indexed account, uint256 newNonce)"]},{"cells":["DropCapacityMode(bytes32 indexed dropId, address indexed target, bool reservationSkipped)"]},{"cells":["DropClosedPermanently(bytes32 indexed dropId, uint256 releasedCapacity)"]},{"cells":["DropCreated(bytes32 indexed dropId, address indexed creator, address indexed target, address payout, uint64 supply, uint32 defaultMaxPerTransaction, uint32 defaultMaxPerWallet, uint16 stageCount, bytes32 metadataDigest)"]},{"cells":["DropMintRouteBound(bytes32 indexed dropId, uint256 indexed routeId)"]},{"cells":["DropMinted(bytes32 indexed dropId, uint16 indexed stageIndex, address indexed account, uint32 quantity, uint256 paid, uint8 kind)"]},{"cells":["DropPauseUpdated(bytes32 indexed dropId, bool paused)"]},{"cells":["DropSupplyUpdated(bytes32 indexed dropId, uint64 previousSupply, uint64 supply, bool openSupply)"]},{"cells":["DropTargetBound(bytes32 indexed dropId, address indexed target, uint256 indexed tokenId, bool itemized)"]},{"cells":["DropTargetHookMode(bytes32 indexed dropId, address indexed target, bool skipped)"]},{"cells":["DropWithdrawal(address indexed asset, address indexed account, address indexed recipient, uint256 amount)"]},{"cells":["EIP712DomainChanged()"]},{"cells":["EntitlementClaimed(bytes32 indexed dropId, address indexed entitlementToken, uint256 indexed tokenId, address account)"]},{"cells":["MintFeePolicySet(uint16 bps, address indexed treasury)"]},{"cells":["MintPlatformFeePaid(address indexed asset, address indexed treasury, uint256 amount)"]},{"cells":["MintQueueSet(bytes32 indexed dropId, address indexed queue)"]},{"cells":["NftCouponConfigured(uint64 revision, bytes32 indexed dropId, bytes32 indexed couponId, bytes32 root, uint256 word, uint256 firstTokenId, uint256 lastTokenId)"]},{"cells":["NftCouponRedeemed(uint32 claims, uint64 revision, bytes32 indexed dropId, bytes32 indexed couponId, bytes32 tokenIdsDigest, address indexed buyer)"]},{"cells":["StageCreated(bytes32 indexed dropId, uint16 indexed stageIndex, uint8 kind, uint64 startTime, uint64 endTime, uint96 unitPrice, address paymentAsset, address signer, address entitlementToken, uint32 maxPerTransaction, uint32 maxPerWallet, bytes32 metadataDigest)"]},{"cells":["StageMerkleRootUpdated(bytes32 indexed dropId, uint16 indexed stageIndex, bytes32 merkleRoot)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AuthorizationExpired()"]},{"cells":["BatchDelegateOnly()"]},{"cells":["CheckoutPriceExceeded(uint256 maximum, uint256 total)"]},{"cells":["ClaimAlreadyUsed()"]},{"cells":["ClaimLengthMismatch()"]},{"cells":["ClaimNotOwned()"]},{"cells":["ContextMismatch()"]},{"cells":["CouponExhausted()"]},{"cells":["CouponExpired()"]},{"cells":["CouponReplay()"]},{"cells":["CouponSignatureInvalid()"]},{"cells":["CreatorProfileIncomplete(address creator)"]},{"cells":["DropClosed()"]},{"cells":["DropMissing()"]},{"cells":["DropPaused()"]},{"cells":["DropSoldOut()"]},{"cells":["FeeTransferFailed()"]},{"cells":["IncorrectPayment(uint256 expected, uint256 received)"]},{"cells":["InvalidCheckout()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidCoupon()"]},{"cells":["InvalidCouponTerms()"]},{"cells":["InvalidDropConfiguration()"]},{"cells":["InvalidFeeRecipient()"]},{"cells":["InvalidMerkleProof()"]},{"cells":["InvalidMintFeePolicy()"]},{"cells":["InvalidNftCoupon()"]},{"cells":["InvalidNonce()"]},{"cells":["InvalidPlatformFee()"]},{"cells":["InvalidQuantity()"]},{"cells":["InvalidShortString()"]},{"cells":["InvalidSignature()"]},{"cells":["InvalidStage()"]},{"cells":["MerkleAllowanceExceeded()"]},{"cells":["MerkleRootMissing()"]},{"cells":["NftCouponIneligible()"]},{"cells":["NftCouponUsed()"]},{"cells":["NothingToWithdraw()"]},{"cells":["PreviousDropNotSoldOut()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["SafeERC20FailedOperation(address token)"]},{"cells":["StringTooLong(string str)"]},{"cells":["SuccessorStageMustBeScheduled()"]},{"cells":["TargetCapacityExceeded()"]},{"cells":["TargetCapacityUnsupported()"]},{"cells":["TransactionLimit()"]},{"cells":["TransferFailed()"]},{"cells":["Unauthorized()"]},{"cells":["UnsupportedFeeToken()"]},{"cells":["UnsupportedPaymentToken()"]},{"cells":["UnsupportedStage()"]},{"cells":["WalletLimit()"]},{"cells":["WrongStage()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address creatorProfileRegistry_, address mintRouteRegistry_, address batchModule_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelmintqueue","title":"KeelMintQueue","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelMintQueue","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/KeelMintQueue.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/KeelMintQueue.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ACTIVE_SLOTS()","uint8","view"]},{"cells":["accessPolicy()","address","view"]},{"cells":["accessSkipAllowance(address account)","uint32","view"]},{"cells":["activateAccess(uint32 policy, uint256 tokenId, uint16 weight, bytes32[] proof, bytes signature)","—","nonpayable"]},{"cells":["active(uint8 slot)","uint64","view"]},{"cells":["advance(uint8 steps)","—","nonpayable"]},{"cells":["afterMint()","—","nonpayable"]},{"cells":["allowance(address account)","uint32 result","view"]},{"cells":["bypass(address)","bool","view"]},{"cells":["bypassLeaf(address account, uint48 deadline)","bytes32","view"]},{"cells":["bypassRoot()","bytes32","view"]},{"cells":["bypassSigner()","address","view"]},{"cells":["bypassUntil(address)","uint48","view"]},{"cells":["bypassVersion()","uint64","view"]},{"cells":["cancel()","—","nonpayable"]},{"cells":["claimSeconds()","uint32","view"]},{"cells":["clearAccess()","—","nonpayable"]},{"cells":["cohortBase()","uint64","view"]},{"cells":["cohortSeconds()","uint32","view"]},{"cells":["cohorts(uint64 request)","uint64, uint64, uint64, bool, bool, bytes32","view"]},{"cells":["completed()","uint64","view"]},{"cells":["consume(address account, uint32 quantity)","—","nonpayable"]},{"cells":["controller()","address","view"]},{"cells":["currentCohort()","uint64","view"]},{"cells":["demand()","address","view"]},{"cells":["demandEnabled()","bool","view"]},{"cells":["demandScore()","uint64","view"]},{"cells":["demandThreshold()","uint64","view"]},{"cells":["demandWarmup()","uint32","view"]},{"cells":["enabled()","bool","view"]},{"cells":["entropySource()","address","view"]},{"cells":["expired()","uint64","view"]},{"cells":["firstTicket()","uint64","view"]},{"cells":["fulfillEntropy(uint64 request, bytes32 seed)","—","nonpayable"]},{"cells":["grant(address account, uint32 quantity)","—","nonpayable"]},{"cells":["isBypassed(address account)","bool","view"]},{"cells":["isWaitingForDraw(uint64 id)","bool","view"]},{"cells":["join(uint32 quantity)","uint64 id","nonpayable"]},{"cells":["lastMintAt()","uint48","view"]},{"cells":["lottery()","bool","view"]},{"cells":["lotteryDraw()","address","view"]},{"cells":["maxPerTurn()","uint32","view"]},{"cells":["meanServiceSeconds()","uint48","view"]},{"cells":["minted()","uint64","view"]},{"cells":["mintedBy(address account)","uint64","view"]},{"cells":["needsAdvance()","bool","view"]},{"cells":["nextTicket()","uint64","view"]},{"cells":["openedAt()","uint48","view"]},{"cells":["owner()","address","view"]},{"cells":["previewTurn(address account)","uint32 quantity, uint48 deadline, uint32 remaining, uint8 state, bool queueEnabled","nonpayable"]},{"cells":["priorityAdmission(uint64 id)","bool","view"]},{"cells":["priorityBps()","uint16","view"]},{"cells":["priorityClock()","uint128","view"]},{"cells":["priorityMember(uint64 id)","bool","view"]},{"cells":["priorityWaiting()","uint64","view"]},{"cells":["protectedShare()","uint16","view"]},{"cells":["protectedTurnsRemaining()","uint32","view"]},{"cells":["proveBypass(uint48 deadline, bytes32[] proof, bytes signature)","—","nonpayable"]},{"cells":["queuePeriod()","uint32","view"]},{"cells":["recoverEntropy()","—","nonpayable"]},{"cells":["registrationAllowed()","bool","view"]},{"cells":["registrationPaused()","bool","view"]},{"cells":["renounceOwnership()","—","nonpayable"]},{"cells":["requestEntropy(uint64 request)","—","nonpayable"]},{"cells":["retire()","—","nonpayable"]},{"cells":["roundOpenedAt()","uint48","view"]},{"cells":["scope()","bytes32","view"]},{"cells":["servingCohort()","uint64","view"]},{"cells":["setAccessPolicy(address policy)","—","nonpayable"]},{"cells":["setBypass(address[] accounts, bool value)","—","nonpayable"]},{"cells":["setBypassPolicy(bytes32 root, address signer)","—","nonpayable"]},{"cells":["setDemandConfig(bool automatic, uint64 threshold, uint64 decay)","—","nonpayable"]},{"cells":["setDemandCurve(uint16 bps, uint64 minimum, uint64 decay)","—","nonpayable"]},{"cells":["setDemandWarmup(uint32 seconds_)","—","nonpayable"]},{"cells":["setEnabled(bool value)","—","nonpayable"]},{"cells":["setEntropySource(address source)","—","nonpayable"]},{"cells":["setLimits(uint32 perTurn, uint32 perWallet, uint32 seconds_)","—","nonpayable"]},{"cells":["setPriorityShare(uint16 bps)","—","nonpayable"]},{"cells":["setProtectedShare(uint16 basisPoints)","—","nonpayable"]},{"cells":["setReadAdapter(address source)","—","nonpayable"]},{"cells":["setRegistrationPaused(bool value)","—","nonpayable"]},{"cells":["setSupplySource(address source)","—","nonpayable"]},{"cells":["slotCursor()","uint8","view"]},{"cells":["sync()","—","nonpayable"]},{"cells":["ticketOf(address account)","uint64","view"]},{"cells":["tickets(uint64 id)","address account, uint48 deadline, uint32 remaining, uint8 state","view"]},{"cells":["transferOwnership(address newOwner)","—","nonpayable"]},{"cells":["waiting()","uint64","view"]},{"cells":["walletLimit()","uint32","view"]},{"cells":["walletTicket(address account)","address owner, uint48 deadline, uint32 remaining, uint8 state","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AccessPolicyChanged(address indexed policy)"]},{"cells":["BypassChanged(address indexed account, bool allowed)"]},{"cells":["BypassPolicy(bytes32 root, address signer, uint64 version)"]},{"cells":["Consumed(address indexed account, uint64 indexed ticketId, uint32 quantity)"]},{"cells":["DemandConfigured(bool automatic)"]},{"cells":["DemandUpdated(uint64 score, uint64 threshold)"]},{"cells":["DemandWarmupChanged(uint32 seconds_)"]},{"cells":["Enabled(bool enabled)"]},{"cells":["EntropyFulfilled(uint64 indexed cohort, bytes32 seed)"]},{"cells":["EntropyRecovered(uint64 indexed expiredRequest, uint64 indexed newRequest)"]},{"cells":["EntropyRequested(uint64 indexed cohort, uint64 entrants)"]},{"cells":["EntropySourceSet(address source)"]},{"cells":["Joined(address indexed account, uint64 indexed ticketId, uint64 indexed cohort, uint32 quantity)"]},{"cells":["LimitsChanged(uint32 maxPerTurn, uint32 walletLimit, uint32 claimSeconds)"]},{"cells":["OwnershipTransferred(address indexed previousOwner, address indexed newOwner)"]},{"cells":["PriorityAdmitted(uint64 indexed ticketId)"]},{"cells":["PriorityJoined(address indexed account, uint64 indexed ticketId, uint16 weight, uint128 finish)"]},{"cells":["PriorityShareChanged(uint16 basisPoints)"]},{"cells":["ProtectedShareChanged(uint16 basisPoints)"]},{"cells":["QueueReset(uint64 firstTicket, bool soldOut)"]},{"cells":["RegistrationPaused(bool paused)"]},{"cells":["SupplyWave(uint256 supply, uint64 threshold)"]},{"cells":["TurnClosed(address indexed account, uint64 indexed ticketId, bool expired)"]},{"cells":["TurnReady(address indexed account, uint64 indexed ticketId, uint48 deadline, uint32 quantity)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Duplicate()"]},{"cells":["Invalid()"]},{"cells":["Limit()"]},{"cells":["LotteryNotConfigured()"]},{"cells":["MintInFlight()"]},{"cells":["NotReady()"]},{"cells":["OwnableInvalidOwner(address owner)"]},{"cells":["OwnableUnauthorizedAccount(address account)"]},{"cells":["OwnershipMismatch()"]},{"cells":["QueueRequired()"]},{"cells":["SupplyUnavailable()"]},{"cells":["Unauthorized()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin, address controller_, bytes32 scope_, uint32 period, bool random_, address entropy_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelrewardclaims","title":"KeelRewardClaims","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelRewardClaims","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/KeelRewardClaims.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/KeelRewardClaims.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["addBenefit((address,uint256,uint32) b)","uint32 id","nonpayable"]},{"cells":["benefitCount()","uint32","view"]},{"cells":["benefits(uint32 id)","address receiver, uint256 item, uint32 amount","view"]},{"cells":["campaignCount()","uint32","view"]},{"cells":["campaigns(uint32)","uint8 gate, address source, bytes32 root, uint48 start, uint48 end, uint32 achievement, uint32 walletClaims, uint32 supply, uint32 issued, bool random, bool noDuplicates, bool paused","view"]},{"cells":["claim(uint32 id, uint256 tokenId, bytes32[] proof)","uint64 request","nonpayable"]},{"cells":["claimedBy(uint32 id, address account)","uint32","view"]},{"cells":["collected(uint32 id, address account)","uint256","view"]},{"cells":["create((uint8,address,bytes32,uint48,uint48,uint32,uint32,uint32,uint32,bool,bool,bool) terms, uint32[] pool, uint32[] weight)","uint32 id","nonpayable"]},{"cells":["createAt(uint32 expectedId, (uint8,address,bytes32,uint48,uint48,uint32,uint32,uint32,uint32,bool,bool,bool) terms, uint32[] pool, uint32[] weight)","uint32 id","nonpayable"]},{"cells":["credits(address, uint32)","uint32","view"]},{"cells":["drawCount()","uint64","view"]},{"cells":["draws(uint64)","address account, uint32 campaign, bool pending","view"]},{"cells":["entropySource()","address","view"]},{"cells":["fulfill(uint64 request, bytes32 entropy)","—","nonpayable"]},{"cells":["leaf(uint32 campaign, address account)","bytes32","view"]},{"cells":["listWallets(uint32 id, address[] accounts)","—","nonpayable"]},{"cells":["owner()","address","view"]},{"cells":["pendingDraw(uint32 id, address account)","bool","view"]},{"cells":["poolOf(uint32 id)","uint32[], uint32[]","view"]},{"cells":["redeem(uint32 benefit, uint32 count, bytes context)","—","payable"]},{"cells":["renounceOwnership()","—","nonpayable"]},{"cells":["setPaused(uint32 id, bool value)","—","nonpayable"]},{"cells":["tokenUsed(uint32 campaign, uint256 id)","bool","view"]},{"cells":["transferOwnership(address newOwner)","—","nonpayable"]},{"cells":["walletList(uint32 id, address account)","bool","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["BenefitCreated(uint32 indexed id, uint32 amount, address receiver, uint256 item)"]},{"cells":["CampaignCreated(uint32 indexed id, uint32[] pool, uint32[] weights, (uint8,address,bytes32,uint48,uint48,uint32,uint32,uint32,uint32,bool,bool,bool) terms)"]},{"cells":["CampaignPaused(bool paused, uint32 indexed campaign)"]},{"cells":["Claimed(uint32 indexed campaign, address indexed account, uint256 entitlementTokenId)"]},{"cells":["CreditGranted(uint32 amount, uint32 indexed benefit, address indexed account)"]},{"cells":["DrawRequested(uint64 indexed request, uint32 indexed campaign, address indexed account)"]},{"cells":["OwnershipTransferred(address indexed previousOwner, address indexed newOwner)"]},{"cells":["RewardRedeemed(uint32 count, uint32 indexed benefit, address indexed account)"]},{"cells":["WalletListed(uint32 indexed campaign, address indexed account)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Exhausted()"]},{"cells":["Ineligible()"]},{"cells":["Invalid()"]},{"cells":["OwnableInvalidOwner(address owner)"]},{"cells":["OwnableUnauthorizedAccount(address account)"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["Unauthorized()"]},{"cells":["Used()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin, address entropy)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelmintrewardentropy","title":"KeelMintRewardEntropy","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelMintRewardEntropy","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/KeelMintRewardEntropy.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/KeelMintRewardEntropy.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["allowConsumer(address consumer, bool value)","—","nonpayable"]},{"cells":["allowed(address)","bool","view"]},{"cells":["blockArchive()","address","view"]},{"cells":["deliver(uint256 id)","—","nonpayable"]},{"cells":["deliveries(uint256 id)","address consumer, uint64 localId, bool reward, bool fulfilled, bool delivered, bytes32 seed","view"]},{"cells":["fulfill(uint256 id)","bytes32 word","nonpayable"]},{"cells":["fulfillSeedBatch(uint256 id, bytes32 word)","—","nonpayable"]},{"cells":["futureBlockDelay()","uint32","view"]},{"cells":["owner()","address","view"]},{"cells":["renounceOwnership()","—","nonpayable"]},{"cells":["request(address consumer, uint64 localId, bool reward)","uint256 id","nonpayable"]},{"cells":["requestCount()","uint32","view"]},{"cells":["requested(bytes32)","uint256","view"]},{"cells":["seedProvider()","address","view"]},{"cells":["seedVrfRequestable(uint256 id, address adapter)","bool","view"]},{"cells":["transferOwnership(address newOwner)","—","nonpayable"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["ConsumerAllowed(bool allowed, address indexed consumer)"]},{"cells":["Delivered(uint256 indexed request)"]},{"cells":["Fulfilled(uint256 indexed request)"]},{"cells":["OwnershipTransferred(address indexed previousOwner, address indexed newOwner)"]},{"cells":["Requested(bool reward, uint64 indexed localId, uint256 indexed request, address indexed consumer)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Invalid()"]},{"cells":["OwnableInvalidOwner(address owner)"]},{"cells":["OwnableUnauthorizedAccount(address account)"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["SeedHashUnavailable(uint256 targetBlock)"]},{"cells":["SeedRevealPending(uint256 targetBlock)"]},{"cells":["Unauthorized()"]},{"cells":["Used()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin, address provider, address archive, uint32 delay)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelqueueaccess","title":"KeelQueueAccess","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelQueueAccess","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/KeelQueueAccess.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/KeelQueueAccess.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ACCESS_TYPEHASH()","bytes32","view"]},{"cells":["activate(address account, uint32 id, uint256 tokenId, uint16 weight, bytes32[] proof, bytes signature)","—","nonpayable"]},{"cells":["benefit(address account)","uint16 weight, uint32 quantity, bool skip","view"]},{"cells":["clear(address account)","—","nonpayable"]},{"cells":["consume(address account, uint32 quantity)","—","nonpayable"]},{"cells":["count()","uint32","view"]},{"cells":["create((uint8,bool,uint16,uint32,uint32,uint32,uint48,uint48,address,bytes32,uint256,uint256) p)","uint32 id","nonpayable"]},{"cells":["createAt(uint32 expectedId, (uint8,bool,uint16,uint32,uint32,uint32,uint48,uint48,address,bytes32,uint256,uint256) p)","uint32 id","nonpayable"]},{"cells":["credentials(address)","uint32 policy, uint16 weight, uint256 tokenId","view"]},{"cells":["eip712Domain()","bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions","view"]},{"cells":["leaf(uint32 id, address account, uint16 weight, uint256 tokenId)","bytes32","view"]},{"cells":["owner()","address","view"]},{"cells":["paused(uint32)","bool","view"]},{"cells":["policies(uint32)","uint8 gate, bool skip, uint16 weight, uint32 maxQuantity, uint32 walletUses, uint32 tokenUses, uint48 start, uint48 end, address source, bytes32 root, uint256 minimumBalance, uint256 requiredTokenId","view"]},{"cells":["queue()","address","view"]},{"cells":["renounceOwnership()","—","nonpayable"]},{"cells":["setPaused(uint32 id, bool value)","—","nonpayable"]},{"cells":["setWallets(uint32 id, address[] accounts, uint16[] weights)","—","nonpayable"]},{"cells":["transferOwnership(address newOwner)","—","nonpayable"]},{"cells":["transferOwnershipFromQueue(address expectedOwner, address newOwner)","—","nonpayable"]},{"cells":["usedByToken(uint32, uint256)","uint32","view"]},{"cells":["usedByWallet(uint32 id, address account)","uint32","view"]},{"cells":["wallets(uint32 id, address account)","uint16","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Activated(address indexed account, uint32 indexed policy, uint256 indexed tokenId, uint16 weight)"]},{"cells":["EIP712DomainChanged()"]},{"cells":["OwnershipTransferred(address indexed previousOwner, address indexed newOwner)"]},{"cells":["PolicyCreated(uint32 indexed policy, (uint8,bool,uint16,uint32,uint32,uint32,uint48,uint48,address,bytes32,uint256,uint256) definition)"]},{"cells":["PolicyPaused(uint32 indexed policy, bool paused)"]},{"cells":["Used(address indexed account, uint32 indexed policy, uint256 indexed tokenId, uint32 quantity)"]},{"cells":["WalletWeight(uint32 indexed policy, address indexed account, uint16 weight)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Ineligible()"]},{"cells":["Invalid()"]},{"cells":["InvalidShortString()"]},{"cells":["OwnableInvalidOwner(address owner)"]},{"cells":["OwnableUnauthorizedAccount(address account)"]},{"cells":["OwnershipMismatch()"]},{"cells":["StringTooLong(string str)"]},{"cells":["Unauthorized()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address admin, address queue_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelqueuedemand","title":"KeelQueueDemand","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelQueueDemand","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/KeelQueueDemand.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/KeelQueueDemand.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["DRAIN_SECONDS()","uint64","view"]},{"cells":["bps()","uint16","view"]},{"cells":["configureCurve(uint16 bps_, uint64 minimum_, uint64 drain_)","—","nonpayable"]},{"cells":["configureFixed(uint64 threshold_, uint64 drain_)","—","nonpayable"]},{"cells":["coolsAt()","uint256","view"]},{"cells":["drainOverride()","uint64","view"]},{"cells":["drainSeconds()","uint64","view"]},{"cells":["enter()","—","nonpayable"]},{"cells":["fixedThreshold()","uint64","view"]},{"cells":["lastEntry()","uint48","view"]},{"cells":["lastSupply()","uint256","view"]},{"cells":["meanEntryGap()","uint32","view"]},{"cells":["minimum()","uint64","view"]},{"cells":["observe()","uint256 live, uint256 flags","nonpayable"]},{"cells":["queue()","address","view"]},{"cells":["record(uint32 quantity)","uint64 value, uint64 limit, bool triggered","nonpayable"]},{"cells":["registrationOpen()","bool","view"]},{"cells":["reset(bool resetWave)","—","nonpayable"]},{"cells":["scope()","bytes32","view"]},{"cells":["score()","uint64","view"]},{"cells":["setSource(address value)","—","nonpayable"]},{"cells":["source()","address","view"]},{"cells":["supply()","uint256 value","view"]},{"cells":["threshold()","uint64","view"]},{"cells":["verifyBypass(bytes32 root, address signer, address account, uint48 deadline, uint64 version, bytes32[] proof, bytes signature)","bool","view"]},{"cells":["wave()","uint256","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Configured(uint16 bps, uint64 minimum, uint64 drainOverride, uint64 fixedThreshold)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["Invalid()"]},{"cells":["SupplyUnavailable()"]},{"cells":["Unauthorized()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address queue_, address source_, bytes32 scope_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelqueuepriority","title":"KeelQueuePriority","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelQueuePriority","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/KeelQueuePriority.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/KeelQueuePriority.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["length()","uint256","view"]},{"cells":["pop()","(uint128,uint64)","nonpayable"]},{"cells":["push(uint128 finish, uint64 ticket)","—","nonpayable"]},{"cells":["queue()","address","view"]},{"cells":["remove(uint64 ticket)","—","nonpayable"]},{"cells":["reset()","—","nonpayable"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["Unauthorized()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor()","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelqueuereadadapter","title":"KeelQueueReadAdapter","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelQueueReadAdapter","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/KeelQueueReadAdapter.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/KeelQueueReadAdapter.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["MAX_BOUNDS()","uint256","view"]},{"cells":["MAX_GATES()","uint256","view"]},{"cells":["MAX_READS()","uint256","view"]},{"cells":["boundCount()","uint8 count","view"]},{"cells":["bounds(uint256 index)","uint8 limitIndex, uint8 usedIndex, uint8 restoredIndex","view"]},{"cells":["gateCount()","uint8 count","view"]},{"cells":["gates(uint256 index)","uint8 readIndex, bool allowedValue","view"]},{"cells":["queueRegistrationOpen(bytes32 requestedScope)","bool open","view"]},{"cells":["queueSupply(bytes32 requestedScope)","uint256","view"]},{"cells":["readCount()","uint8 count","view"]},{"cells":["reads(uint256 index)","address target, bytes data, uint256 fixedValue","view"]},{"cells":["scope()","bytes32","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidBoolean(uint256 index, uint256 value)"]},{"cells":["InvalidBound(uint256 index)"]},{"cells":["InvalidConfiguration()"]},{"cells":["InvalidGate(uint256 index)"]},{"cells":["InvalidRead(uint256 index)"]},{"cells":["InvalidScope()"]},{"cells":["ReadFailed(uint256 index)"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(bytes32 scope_, (address,bytes,uint256)[] reads_, (uint8,bool)[] gates_, (uint8,uint8,uint8)[] bounds_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelqueuelotteryengine","title":"KeelQueueLotteryEngine","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelQueueLotteryEngine","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/KeelQueueLotteryEngine.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/KeelQueueLotteryEngine.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["ADMISSIONS()","uint8","view"]},{"cells":["ATTEMPTS()","uint8","view"]},{"cells":["cohorts(uint64 id, uint256 context)","uint64 size, uint64 cursor, uint64 drawn, bool requested, bool fulfilled, bytes32 seed","view"]},{"cells":["commitment(uint64 id)","bytes32","view"]},{"cells":["configure(uint256 capacity, uint32 perTurn, uint16 share)","—","nonpayable"]},{"cells":["configured()","bool","view"]},{"cells":["current()","uint64","view"]},{"cells":["fulfill(uint64 id, bytes32 entropy)","bytes32 seed","nonpayable"]},{"cells":["generation()","uint64","view"]},{"cells":["pending()","bool","view"]},{"cells":["pick(uint256 context)","uint64 requestId, uint64 id, uint64 requestedCount, uint48 confirmedAt","nonpayable"]},{"cells":["queue()","address","view"]},{"cells":["recover(address source)","uint64 next, uint64 count","nonpayable"]},{"cells":["remaining()","uint32","view"]},{"cells":["request(uint64 id, uint256 context)","uint64 count","nonpayable"]},{"cells":["reset(uint64 nextGeneration)","—","nonpayable"]},{"cells":["snapshot(uint64 id)","uint256 word, bytes32 seed","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["Invalid()"]},{"cells":["Limit()"]},{"cells":["Unauthorized()"]}],"caption":"Custom errors","collapsed":true}]}]},{"id":"keelqueuelotterypool","title":"KeelQueueLotteryPool","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelQueueLotteryPool","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/KeelQueueLotteryPool.sol"},{"label":"Download ABI","href":"/docs/abi/keel-mint-access/KeelQueueLotteryPool.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["liveCount(uint64 first, uint64 through)","uint64","view"]},{"cells":["queue()","address","view"]},{"cells":["remove(uint64 id)","—","nonpayable"]},{"cells":["select(uint64 first, uint64 through, uint64 rank)","uint64 id","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["CountOverflow()"]},{"cells":["InvalidRange()"]},{"cells":["InvalidRank()"]},{"cells":["InvalidTicket()"]},{"cells":["Unauthorized()"]}],"caption":"Custom errors","collapsed":true}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelMintGate, OneMintController","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-mint-access/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-mint-access/tezos"},{"label":"Native module configuration","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-mint-access/keel.module.json"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["set_platform_configuration","entrypoint","keel_mint_gate.py"]},{"cells":["set_campaign_admin","entrypoint","keel_mint_gate.py"]},{"cells":["pause","entrypoint","keel_mint_gate.py"]},{"cells":["unpause","entrypoint","keel_mint_gate.py"]},{"cells":["create_campaign","entrypoint","keel_mint_gate.py"]},{"cells":["set_campaign_paused","entrypoint","keel_mint_gate.py"]},{"cells":["close_campaign","entrypoint","keel_mint_gate.py"]},{"cells":["invalidate_authorization_nonce","entrypoint","keel_mint_gate.py"]},{"cells":["mint","entrypoint","keel_mint_gate.py"]},{"cells":["withdraw","entrypoint","keel_mint_gate.py"]},{"cells":["get_campaign","onchain_view","keel_mint_gate.py"]},{"cells":["latest_campaign","onchain_view","keel_mint_gate.py"]},{"cells":["campaign_capacity_status","onchain_view","keel_mint_gate.py"]},{"cells":["authorization_digest","onchain_view","keel_mint_gate.py"]},{"cells":["merkle_leaf","onchain_view","keel_mint_gate.py"]},{"cells":["pending_balance_of","onchain_view","keel_mint_gate.py"]},{"cells":["is_campaign_admin","onchain_view","keel_mint_gate.py"]},{"cells":["set_delegate","entrypoint","keel_mint_gate.py"]},{"cells":["create_drop","entrypoint","keel_mint_gate.py"]},{"cells":["set_drop_paused","entrypoint","keel_mint_gate.py"]},{"cells":["set_stage_merkle_root","entrypoint","keel_mint_gate.py"]},{"cells":["update_drop_supply","entrypoint","keel_mint_gate.py"]},{"cells":["close_drop","entrypoint","keel_mint_gate.py"]},{"cells":["invalidate_nonce","entrypoint","keel_mint_gate.py"]},{"cells":["public_mint","entrypoint","keel_mint_gate.py"]},{"cells":["allowlist_mint","entrypoint","keel_mint_gate.py"]},{"cells":["merkle_mint","entrypoint","keel_mint_gate.py"]},{"cells":["claim_mint","entrypoint","keel_mint_gate.py"]},{"cells":["admin_strike","entrypoint","keel_mint_gate.py"]},{"cells":["withdraw","entrypoint","keel_mint_gate.py"]},{"cells":["get_drop","onchain_view","keel_mint_gate.py"]},{"cells":["latest_drop_for_target","onchain_view","keel_mint_gate.py"]},{"cells":["delegates","onchain_view","keel_mint_gate.py"]},{"cells":["stage_merkle_root","onchain_view","keel_mint_gate.py"]},{"cells":["merkle_leaf","onchain_view","keel_mint_gate.py"]},{"cells":["is_open_supply","onchain_view","keel_mint_gate.py"]},{"cells":["get_stage","onchain_view","keel_mint_gate.py"]},{"cells":["effective_stage_limits","onchain_view","keel_mint_gate.py"]},{"cells":["current_stage","onchain_view","keel_mint_gate.py"]},{"cells":["authorization_digest","onchain_view","keel_mint_gate.py"]},{"cells":["is_drop_sold_out","onchain_view","keel_mint_gate.py"]},{"cells":["pending_balance_of","onchain_view","keel_mint_gate.py"]}],"caption":"Native interface","collapsed":true}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-presentation","navTitle":"Presentation state (keel-presentation)","eyebrow":"Technical reference","title":"Presentation state (keel-presentation)","summary":"Presentation/visual state ledgers that record what a token currently renders as.","thesis":"Presentation/visual state ledgers that record what a token currently renders as.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Presentation/visual state ledgers that record what a token currently renders as.","cards":[{"title":"keel-presentation","body":"Presentation/visual state ledgers that record what a token currently renders as.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"None"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-presentation/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-presentation"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-presentation"}]}]},{"id":"keelpresentationstateregistry","title":"KeelPresentationStateRegistry","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelPresentationStateRegistry","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-presentation/KeelPresentationStateRegistry.sol"},{"label":"Download ABI","href":"/docs/abi/keel-presentation/KeelPresentationStateRegistry.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["POLICY_ID_DOMAIN()","bytes32","view"]},{"cells":["appendInlineRevision(bytes32 policyId, uint64 expectedParent, bytes canonicalValue, string mediaType, bytes32 sourceManifestDigest, uint64 sourceSequence)","uint64 revision","nonpayable"]},{"cells":["appendResourceRevision(bytes32 policyId, uint64 expectedParent, bytes32 valueDigest, uint64 byteLength, string mediaType)","uint64 revision","nonpayable"]},{"cells":["configureStakingRule(bytes32 policyId, address adapter, uint8 mode)","—","nonpayable"]},{"cells":["createPolicy(bytes32 salt, (address,uint256) binding, uint8 authority, uint8 updateKind, uint8 valueKind, bool executable, string mediaType, uint64 maxBytes, address oracle)","bytes32 policyId","nonpayable"]},{"cells":["currentPresentation(bytes32 policyId)","(bytes32,bytes32,bytes32,uint64,uint64,uint64,uint64,address,bool,bool) revision, bytes inlineValue","view"]},{"cells":["policyIsImmutable(bytes32 policyId)","bool","view"]},{"cells":["policyMaterialization(bytes32 policyId)","(address,address,bytes32,bytes32,uint64,uint64,uint64,bool)","view"]},{"cells":["predictPolicyId(address creator, bytes32 salt)","bytes32","pure"]},{"cells":["presentationMatches(bytes32 policyId, uint64 revision, bytes32 valueDigest, uint64 byteLength, bytes32 sourceManifestDigest, uint64 sourceSequence)","bool","view"]},{"cells":["presentationPolicy(bytes32 policyId)","(address,address,(address,uint256),bytes32,uint64,uint64,uint8,uint8,uint8,bool,bool)","view"]},{"cells":["presentationRevision(bytes32 policyId, uint64 revision)","(bytes32,bytes32,bytes32,uint64,uint64,uint64,uint64,address,bool,bool)","view"]},{"cells":["sealPolicyToOnchainObject(bytes32 policyId, uint64 expectedPolicyRevision, address artifactRegistry, bytes32 objectId, uint64 artifactRevision)","—","nonpayable"]},{"cells":["stakingStatus(bytes32 policyId)","bool configured, bool staked, address controller, uint8 mode","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["PolicyCreated(bytes32 indexed policyId, address indexed creator, address indexed collection, uint256 tokenId, uint8 authority, uint8 updateKind, uint8 valueKind, bool executable)"]},{"cells":["PolicyMaterializedAndSealed(bytes32 indexed policyId, uint64 indexed policyRevision, bytes32 indexed objectId, uint64 artifactRevision, address artifactRegistry, address keelHold, bytes32 contentObjectId)"]},{"cells":["PresentationRevisionAppended(bytes32 indexed policyId, uint64 indexed revision, uint64 indexed parentRevision, bytes32 valueDigest, uint64 byteLength, bytes32 mediaTypeDigest, bytes32 sourceManifestDigest, uint64 sourceSequence, address publisher, bool hasInlineValue)"]},{"cells":["StakingRuleConfigured(bytes32 indexed policyId, address indexed adapter, uint8 mode)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["ApiManifestMissing()"]},{"cells":["ApiSequenceStale()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidMediaType()"]},{"cells":["InvalidParent()"]},{"cells":["InvalidPolicy()"]},{"cells":["InvalidStakingRule()"]},{"cells":["InvalidValue()"]},{"cells":["MaterializationMismatch()"]},{"cells":["MaterializationMissing()"]},{"cells":["ObjectNotFrozen()"]},{"cells":["PolicyExists()"]},{"cells":["PolicyMissing()"]},{"cells":["PolicySealed()"]},{"cells":["RevisionMissing()"]},{"cells":["StakingAdapterFailed()"]},{"cells":["StakingRuleExists()"]},{"cells":["Unauthorized()"]},{"cells":["UpdatesLockedWhileStaked()"]},{"cells":["ValueTooLarge()"]},{"cells":["WrongUpdateKind()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true}]}]},{"id":"keelvisualstateledger","title":"KeelVisualStateLedger","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelVisualStateLedger","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-presentation/KeelVisualStateLedger.sol"},{"label":"Download ABI","href":"/docs/abi/keel-presentation/KeelVisualStateLedger.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["BURN_RECEIPT_DOMAIN()","bytes32","view"]},{"cells":["INITIAL_RECEIPT_DOMAIN()","bytes32","view"]},{"cells":["REVISION_RECEIPT_DOMAIN()","bytes32","view"]},{"cells":["activeVisualStateToken(bytes32 digest)","uint256 tokenIdPlusOne","view"]},{"cells":["canonicalRevision(uint256 tokenId, uint64 revision)","(bytes32,bytes32,bytes32,bytes32) receipt, (bytes32,bytes32,bool) record, bytes canonicalState, bytes reconstructionContext","view"]},{"cells":["claimInitial(uint256 tokenId, bytes32 digest, bytes32 contextDigest)","bytes32 receiptDigest","nonpayable"]},{"cells":["claimInitialCanonical(uint256 tokenId, bytes32 digest, bytes32 contextDigest, bytes canonicalState, bytes reconstructionContext)","bytes32 receiptDigest","nonpayable"]},{"cells":["clearActiveOnBurn(uint256 tokenId, bytes32 contextDigest)","bytes32 receiptDigest","nonpayable"]},{"cells":["coordinator()","address","view"]},{"cells":["currentDigest(uint256 tokenId)","bytes32 digest","view"]},{"cells":["currentRevision(uint256 tokenId)","uint64 revision","view"]},{"cells":["everUsedVisualState(bytes32 digest)","uint256 firstTokenIdPlusOne","view"]},{"cells":["replace(uint256 tokenId, uint64 expectedRevision, bytes32 nextDigest, bytes32 contextDigest)","uint64 revision, bytes32 receiptDigest","nonpayable"]},{"cells":["replaceCanonical(uint256 tokenId, uint64 expectedRevision, bytes32 nextDigest, bytes32 contextDigest, bytes canonicalState, bytes reconstructionContext)","uint64 revision, bytes32 receiptDigest","nonpayable"]},{"cells":["revisionReceipt(uint256 tokenId, uint64 revision)","(bytes32,bytes32,bytes32,bytes32)","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["ActiveVisualStateCleared(uint256 indexed tokenId, bytes32 indexed previousDigest, bytes32 indexed receiptDigest)"]},{"cells":["CanonicalVisualRevisionStored(uint256 indexed tokenId, uint64 indexed revision, bytes32 indexed visualStateDigest, bytes32 canonicalStateDigest, bytes32 reconstructionContextDigest)"]},{"cells":["InitialVisualStateClaimed(uint256 indexed tokenId, bytes32 indexed visualStateDigest, bytes32 indexed receiptDigest)"]},{"cells":["VisualStateReplaced(uint256 indexed tokenId, uint64 indexed revision, bytes32 indexed nextDigest, bytes32 previousDigest, bytes32 receiptDigest)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["ActiveIndexMismatch()"]},{"cells":["InvalidCanonicalRevision()"]},{"cells":["InvalidDigest()"]},{"cells":["OnlyCoordinator()"]},{"cells":["StaleRevision()"]},{"cells":["TokenAlreadyInitialized()"]},{"cells":["TokenMissing()"]},{"cells":["VisualStateAlreadyUsed(bytes32 digest, uint256 firstTokenIdPlusOne)"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address coordinator_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelPresentationStateRegistry","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-presentation/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-presentation/tezos"},{"label":"Native module configuration","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-presentation/keel.module.json"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["create_policy","entrypoint","keel_presentation_state.py"]},{"cells":["configure_staking_rule","entrypoint","keel_presentation_state.py"]},{"cells":["append_inline_revision","entrypoint","keel_presentation_state.py"]},{"cells":["append_resource_revision","entrypoint","keel_presentation_state.py"]},{"cells":["seal_policy_to_onchain_object","entrypoint","keel_presentation_state.py"]},{"cells":["current_presentation","onchain_view","keel_presentation_state.py"]},{"cells":["current_inline_value","onchain_view","keel_presentation_state.py"]},{"cells":["presentation_matches","onchain_view","keel_presentation_state.py"]},{"cells":["staking_status","onchain_view","keel_presentation_state.py"]},{"cells":["policy_is_immutable","onchain_view","keel_presentation_state.py"]},{"cells":["policy_materialization","onchain_view","keel_presentation_state.py"]}],"caption":"Native interface","collapsed":false}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-publication","navTitle":"Publication (keel-publication)","eyebrow":"Technical reference","title":"Publication (keel-publication)","summary":"Optional upload batching and resumable publication jobs, including the explicitly selected history-inscription mode.","thesis":"Optional upload batching and resumable publication jobs, including the explicitly selected history-inscription mode.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Optional upload batching and resumable publication jobs, including the explicitly selected history-inscription mode.","cards":[{"title":"keel-publication","body":"Optional upload batching and resumable publication jobs, including the explicitly selected history-inscription mode.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-hold"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-publication/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-publication"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-publication"}]}]},{"id":"keelcarrierbatcher","title":"KeelCarrierBatcher","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelCarrierBatcher","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-publication/KeelCarrierBatcher.sol"},{"label":"Download ABI","href":"/docs/abi/keel-publication/KeelCarrierBatcher.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["MAX_BATCH_CHUNKS()","uint256","view"]},{"cells":["MAX_CARRIER_BATCHES()","uint256","view"]},{"cells":["MAX_OBJECT_OPERATIONS()","uint256","view"]},{"cells":["execute(bytes[][] carrierBatches, bytes[] objectOperations)","bytes[] results","nonpayable"]},{"cells":["executeFor(bytes32 objectId, bytes[][] carrierBatches, bytes[] objectOperations, bool finish)","bytes[] results","nonpayable"]},{"cells":["keelHold()","address","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["CarrierBatchExecuted(address indexed caller, address indexed keelHold, uint256 carrierBatchCount, uint256 objectOperationCount)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CarrierBatchTooLarge(uint256 index, uint256 supplied, uint256 maximum)"]},{"cells":["EmptyBatch()"]},{"cells":["EmptyCarrierBatch(uint256 index)"]},{"cells":["InvalidContract()"]},{"cells":["InvalidIntent()"]},{"cells":["InvalidObjectOperation(uint256 index)"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["TargetCallFailed(uint256 index, bytes reason)"]},{"cells":["TooManyCarrierBatches(uint256 supplied, uint256 maximum)"]},{"cells":["TooManyObjectOperations(uint256 supplied, uint256 maximum)"]},{"cells":["UnexpectedEther()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address keelHold_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelhistorypublicationjob","title":"KeelHistoryPublicationJob","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelHistoryPublicationJob","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-publication/KeelHistoryPublicationJob.sol"},{"label":"Download ABI","href":"/docs/abi/keel-publication/KeelHistoryPublicationJob.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["MAX_BATCHES()","uint256","view"]},{"cells":["MAX_BATCH_CHUNKS()","uint256","view"]},{"cells":["MAX_CHUNKS()","uint256","view"]},{"cells":["MAX_CHUNK_BYTES()","uint256","view"]},{"cells":["STORAGE_MODE()","bytes32","view"]},{"cells":["TRANSACTION_GAS_CAP()","uint256","view"]},{"cells":["batchChunkCount(uint256 publicationId, uint256 index)","uint256","view"]},{"cells":["cancelPublication(uint256 publicationId)","—","nonpayable"]},{"cells":["chunkDigest(uint256 publicationId, uint256 index)","bytes32","view"]},{"cells":["claimCredit(address recipient)","—","nonpayable"]},{"cells":["computeCommitmentDigest(uint256 publicationId, address owner, address executor, bytes32 storageMode, bytes32 planDigest, bytes32 decodedDigest, bytes32 storedDigest, uint64 decodedByteLength, uint64 storedByteLength, uint8 compression, bytes32 mediaTypeHash, bytes32[] chunkDigests, uint8[] batchChunkCounts)","bytes32","view"]},{"cells":["creditOf(address account)","uint256","view"]},{"cells":["finalizePublication(uint256 publicationId, bytes32 storageMode, bytes32 planDigest)","—","nonpayable"]},{"cells":["fundExecutor(uint256 publicationId, uint256 amount)","—","nonpayable"]},{"cells":["getPublication(uint256 publicationId)","(bool,bool,bool,address,address,address,uint64,uint256,uint256,bytes32,bytes32,bytes32,bytes32,uint64,uint64,uint8,bytes32,uint32,uint32,uint32,uint32,uint64,uint64,uint64)","view"]},{"cells":["nextPublicationId()","uint256","view"]},{"cells":["openPublication(uint256 expectedPublicationId, bytes32 storageMode, address executor, uint64 deadline, bytes32 planDigest, bytes32 decodedDigest, bytes32 storedDigest, uint64 decodedByteLength, uint64 storedByteLength, uint8 compression, bytes32 mediaTypeHash, bytes32[] chunkDigests, uint8[] batchChunkCounts)","uint256 publicationId","payable"]},{"cells":["publishBatch(uint256 publicationId, bytes32 storageMode, bytes32 planDigest, uint256 batchIndex, uint256 firstChunkIndex, uint256 storedByteOffset, bytes[] payloads)","—","nonpayable"]},{"cells":["rotateExecutor(uint256 publicationId, address newExecutor, uint64 newDeadline)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["HistoryBatchPublished(uint256 indexed publicationId, bytes32 indexed planDigest, bytes32 indexed storageMode, uint256 batchIndex, uint256 firstChunkIndex, uint256 orderedChunkCount, uint256 storedByteOffset, uint256 storedByteLength, bytes32[] chunkDigests, bytes32 calldataDigest)"]},{"cells":["HistoryCreditAccrued(uint256 indexed publicationId, address indexed account, uint256 amount, uint256 creditBalance)"]},{"cells":["HistoryCreditClaimed(address indexed account, address indexed recipient, uint256 amount)"]},{"cells":["HistoryExecutorFunded(uint256 indexed publicationId, address indexed executor, uint256 amount, uint256 remainingEscrow, uint256 executorPaid)"]},{"cells":["HistoryPublicationCancelled(uint256 indexed publicationId, address indexed owner, bytes32 planDigest, bytes32 storageMode, uint256 cancellationBlock, uint256 refund)"]},{"cells":["HistoryPublicationCompleted(uint256 indexed publicationId, address indexed owner, address indexed executor, bytes32 planDigest, bytes32 storageMode, bytes32 storedDigest, bytes32 decodedDigest, uint256 storedByteLength, uint256 decodedByteLength, uint256 batchCount, uint256 chunkCount, uint256 finalPublicationBlock, uint256 executorPayment)"]},{"cells":["HistoryPublicationExecutorRotated(uint256 indexed publicationId, address indexed owner, address indexed previousExecutor, address newExecutor, uint64 newDeadline, uint256 nextBatch, uint256 nextChunk, uint256 nextStoredOffset, uint256 escrow, uint256 executorPaid)"]},{"cells":["HistoryPublicationOpened(uint256 indexed publicationId, address indexed owner, address indexed executor, uint64 deadline, bytes32 planDigest, bytes32 storageMode, bytes32 decodedDigest, bytes32 storedDigest, bytes32 commitmentDigest, uint64 decodedByteLength, uint64 storedByteLength, uint8 compression, bytes32 mediaTypeHash, uint256 batchCount, uint256 chunkCount, uint256 escrow)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["BatchChunkTotalMismatch(uint256 supplied, uint256 expected)"]},{"cells":["CannotCancelAfterProgress()"]},{"cells":["ChunkDigestMismatch(uint256 index, bytes32 expected, bytes32 actual)"]},{"cells":["ChunkTooLarge(uint256 index, uint256 supplied, uint256 maximum)"]},{"cells":["EmptyChunk(uint256 index)"]},{"cells":["EmptyPublication()"]},{"cells":["IncompletePublication(uint256 nextBatch, uint256 batchCount, uint256 nextChunk, uint256 chunkCount)"]},{"cells":["InsufficientEscrow(uint256 requested, uint256 available)"]},{"cells":["InvalidBatchChunkCount(uint256 index, uint256 supplied)"]},{"cells":["InvalidCompression(uint8 supplied)"]},{"cells":["InvalidDeadline()"]},{"cells":["InvalidDigest()"]},{"cells":["InvalidExecutor()"]},{"cells":["InvalidLength()"]},{"cells":["InvalidStorageMode(bytes32 supplied)"]},{"cells":["NoCredit()"]},{"cells":["PublicationCancelled()"]},{"cells":["PublicationCompleted()"]},{"cells":["PublicationExpired()"]},{"cells":["PublicationMissing()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["TooManyBatches(uint256 supplied)"]},{"cells":["TooManyChunks(uint256 supplied)"]},{"cells":["TransferFailed()"]},{"cells":["UnauthorizedExecutor()"]},{"cells":["UnauthorizedOwner()"]},{"cells":["UnexpectedEther()"]},{"cells":["WrongBatchIndex(uint256 supplied, uint256 expected)"]},{"cells":["WrongChunkCount(uint256 supplied, uint256 expected)"]},{"cells":["WrongFirstChunk(uint256 supplied, uint256 expected)"]},{"cells":["WrongMode(bytes32 supplied, bytes32 expected)"]},{"cells":["WrongPlan(bytes32 supplied, bytes32 expected)"]},{"cells":["WrongPublicationId(uint256 supplied, uint256 expected)"]},{"cells":["WrongStoredOffset(uint256 supplied, uint256 expected)"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true}]}]},{"id":"keelpublicationjob","title":"KeelPublicationJob","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelPublicationJob","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-publication/KeelPublicationJob.sol"},{"label":"Download ABI","href":"/docs/abi/keel-publication/KeelPublicationJob.json"},{"label":"Sepolia studio-runtime-20261007 · 0x93f8bb414f22d5df29db6d67b78224d69453a094","href":"https://sepolia.etherscan.io/address/0x93f8bb414f22d5df29db6d67b78224d69453a094#code"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["MAX_ALLOWED_TARGETS()","uint256","view"]},{"cells":["MAX_CARRIER_PAYLOADS()","uint256","view"]},{"cells":["MAX_CHUNKS()","uint256","view"]},{"cells":["MAX_OPERATIONS()","uint256","view"]},{"cells":["MAX_OPERATION_BATCH()","uint256","view"]},{"cells":["cancelJob(uint256 jobId)","—","nonpayable"]},{"cells":["completeJob(uint256 jobId)","—","nonpayable"]},{"cells":["executeCarrier(uint256 jobId, bytes[] payloads)","—","nonpayable"]},{"cells":["executeOperation(uint256 jobId, address target, uint256 value, bytes operation)","—","nonpayable"]},{"cells":["executeOperations(uint256 jobId, address[] targets, uint256[] values, bytes[] operationData)","—","nonpayable"]},{"cells":["expireJob(uint256 jobId)","—","nonpayable"]},{"cells":["fundExecutor(uint256 jobId, uint256 amount)","—","nonpayable"]},{"cells":["getJob(uint256 jobId)","(address,address,bytes32,uint64,uint32,uint32,uint32,uint32,uint256,uint256,bool)","view"]},{"cells":["jobIntent(uint256 jobId)","bytes32 intentId","view"]},{"cells":["keelHold()","address","view"]},{"cells":["nextJobId()","uint256","view"]},{"cells":["openJob(bytes32 planDigest, address executor, uint64 deadline, bytes32[] slugDigests, bytes32[] operationDigests, address[] allowedTargets)","uint256 jobId","payable"]},{"cells":["openJobWithIntent(bytes32 planDigest, address executor, uint64 deadline, bytes32[] slugDigests, bytes32[] operationDigests, address[] allowedTargets, bytes32 objectId)","uint256 jobId","payable"]},{"cells":["operationDigest(uint256 jobId, uint256 index)","bytes32","view"]},{"cells":["slugDigest(uint256 jobId, uint256 index)","bytes32","view"]},{"cells":["targetAllowed(uint256 jobId, address target)","bool","view"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["CarrierProgress(uint256 indexed jobId, uint256 indexed firstSlug, uint256 slugCount, uint256 nextSlug)"]},{"cells":["ExecutorFunded(uint256 indexed jobId, address indexed executor, uint256 amount)"]},{"cells":["JobCancelled(uint256 indexed jobId, address indexed owner, uint256 refund)"]},{"cells":["JobCompleted(uint256 indexed jobId, address indexed owner, address indexed executor, uint256 executorPayment)"]},{"cells":["JobOpened(uint256 indexed jobId, address indexed owner, address indexed executor, bytes32 planDigest, uint256 slugCount, uint256 operationCount, uint256 escrow, uint256 deadline)"]},{"cells":["OperationProgress(uint256 indexed jobId, uint256 indexed index, address indexed target, uint256 nextOperation)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["EmptyPlan()"]},{"cells":["InsufficientEscrow(uint256 required, uint256 available)"]},{"cells":["InvalidCarrierCount(uint256 supplied)"]},{"cells":["InvalidContract()"]},{"cells":["InvalidDeadline()"]},{"cells":["InvalidDigest()"]},{"cells":["InvalidOperationCount(uint256 supplied, uint256 maximum)"]},{"cells":["InvalidWeldIntent()"]},{"cells":["JobExpired()"]},{"cells":["JobIncomplete()"]},{"cells":["JobMissing()"]},{"cells":["NothingToRefund()"]},{"cells":["OperationDigestMismatch(uint256 index, bytes32 expected, bytes32 actual)"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["SlugDigestMismatch(uint256 index, bytes32 expected, bytes32 actual)"]},{"cells":["TargetCallFailed(bytes reason)"]},{"cells":["TargetNotAllowed(address target)"]},{"cells":["TooManyAllowedTargets(uint256 supplied, uint256 maximum)"]},{"cells":["TooManyOperations(uint256 supplied, uint256 maximum)"]},{"cells":["TooManySlugs(uint256 supplied, uint256 maximum)"]},{"cells":["TransferFailed()"]},{"cells":["UnauthorizedExecutor()"]},{"cells":["UnauthorizedOwner()"]},{"cells":["UnexpectedEther()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address keelHold_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-sleeve","navTitle":"Metadata resolver (keel-sleeve)","eyebrow":"Technical reference","title":"Metadata resolver (keel-sleeve)","summary":"Token JSON resolution for collections that delegate metadata assembly.","thesis":"Token JSON resolution for collections that delegate metadata assembly.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Token JSON resolution for collections that delegate metadata assembly.","cards":[{"title":"keel-sleeve","body":"Token JSON resolution for collections that delegate metadata assembly.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-hold, keel-kernel"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-sleeve/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-sleeve"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-sleeve"}]}]},{"id":"keelsleeve","title":"KeelSleeve","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelSleeve","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-sleeve/KeelSleeve.sol"},{"label":"Download ABI","href":"/docs/abi/keel-sleeve/KeelSleeve.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["erc4804URI(uint256 tokenId)","string","view"]},{"cells":["erc4804URIOnChain(address target, uint256 chainId, uint256 tokenId)","string","pure"]},{"cells":["source()","address","view"]},{"cells":["tokenJSON(uint256 tokenId)","string","view"]},{"cells":["tokenURI(uint256 tokenId)","string","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidChainId()"]},{"cells":["InvalidSource()"]},{"cells":["StringsInsufficientHexLength(uint256 value, uint256 length)"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address source_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelstoredtokenjson","title":"KeelStoredTokenJSON","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelStoredTokenJSON","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-sleeve/KeelStoredTokenJSON.sol"},{"label":"Download ABI","href":"/docs/abi/keel-sleeve/KeelStoredTokenJSON.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["acceptOwnership()","—","nonpayable"]},{"cells":["bindings(uint256)","bytes32 jsonObjectId, bytes32 metadataObjectId, bytes32 recipeObjectId","view"]},{"cells":["collection()","address","view"]},{"cells":["freezeToken(uint256 id)","—","nonpayable"]},{"cells":["frozen(uint256 id)","bool","view"]},{"cells":["keelHold()","address","view"]},{"cells":["metadataDependency(uint256 tokenId)","address target, bytes query, uint256 first, uint256 last","view"]},{"cells":["owner()","address","view"]},{"cells":["pendingOwner()","address","view"]},{"cells":["renounceOwnership()","—","nonpayable"]},{"cells":["setTokens(uint256[] ids, (bytes32,bytes32,bytes32)[] records)","—","nonpayable"]},{"cells":["tokenJSON(uint256 tokenId)","string","view"]},{"cells":["transferOwnership(address newOwner)","—","nonpayable"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)"]},{"cells":["OwnershipTransferred(address indexed previousOwner, address indexed newOwner)"]},{"cells":["TokenBindingFrozen(uint256 indexed tokenId)"]},{"cells":["TokenBound(uint256 indexed tokenId, bytes32 jsonObjectId, bytes32 metadataObjectId, bytes32 recipeObjectId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidBatch()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidObject()"]},{"cells":["InvalidRead()"]},{"cells":["OwnableInvalidOwner(address owner)"]},{"cells":["OwnableUnauthorizedAccount(address account)"]},{"cells":["TokenFrozen()"]},{"cells":["TokenUnmapped()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address hold_, address collection_, address owner_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keeltokenmatrix","title":"KeelTokenMatrix","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelTokenMatrix","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-sleeve/KeelTokenMatrix.sol"},{"label":"Download ABI","href":"/docs/abi/keel-sleeve/KeelTokenMatrix.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["acceptOwnership()","—","nonpayable"]},{"cells":["bindRowBlock(uint256 index, bytes32 slugId)","—","nonpayable"]},{"cells":["bindTable(uint16[] keys, bytes32[] ids)","—","nonpayable"]},{"cells":["bindTemplate(uint16 key, bytes commands)","—","nonpayable"]},{"cells":["collection()","address","view"]},{"cells":["freezeRows()","—","nonpayable"]},{"cells":["keelHold()","address","view"]},{"cells":["maxReadDepth()","uint32","view"]},{"cells":["metadataDependency(uint256 tokenId)","address target, bytes query, uint256 first, uint256 last","view"]},{"cells":["owner()","address","view"]},{"cells":["pendingOwner()","address","view"]},{"cells":["renounceOwnership()","—","nonpayable"]},{"cells":["rowBlocks(uint256)","bytes32","view"]},{"cells":["rowStride()","uint16","view"]},{"cells":["rowsFrozen()","bool","view"]},{"cells":["rowsPerBlock()","uint16","view"]},{"cells":["setMaxReadDepth(uint32 nextDepth)","—","nonpayable"]},{"cells":["table(uint16)","bytes32","view"]},{"cells":["template(uint16 key)","bytes","view"]},{"cells":["tokenCount()","uint256","view"]},{"cells":["tokenJSON(uint256 id)","string","view"]},{"cells":["tokenSelection(uint256 id)","uint16 templateId, uint16[] choices","view"]},{"cells":["transferOwnership(address newOwner)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["MatrixFrozen()"]},{"cells":["OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)"]},{"cells":["OwnershipTransferred(address indexed previousOwner, address indexed newOwner)"]},{"cells":["ReadDepthSet(uint32 maxReadDepth)"]},{"cells":["RowBlockBound(uint256 indexed blockIndex, bytes32 indexed slugId)"]},{"cells":["TableBound(uint16 indexed key, bytes32 indexed objectId)"]},{"cells":["TemplateBound(uint16 indexed key, bytes commands)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AlreadyBound()"]},{"cells":["DigestMismatch()"]},{"cells":["InvalidMatrix()"]},{"cells":["InvalidObject()"]},{"cells":["MissingToken()"]},{"cells":["OwnableInvalidOwner(address owner)"]},{"cells":["OwnableUnauthorizedAccount(address account)"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address hold_, address collection_, address owner_, uint256 count_, uint16 stride_, uint16 rowsPerBlock_, uint32 maxReadDepth_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"keelmetadatarelay","title":"KeelMetadataRelay","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelMetadataRelay","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-sleeve/KeelMetadataRelay.sol"},{"label":"Download ABI","href":"/docs/abi/keel-sleeve/KeelMetadataRelay.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["deliver(uint256 id, uint32 deliveryGas)","—","nonpayable"]},{"cells":["followerAt(bytes32 id, uint256 index)","uint256","view"]},{"cells":["followerCount(bytes32 id)","uint256","view"]},{"cells":["nextSubscriptionId()","uint256","view"]},{"cells":["subscribe(address source, bytes query, uint32 readGas, uint256 first, uint256 last)","uint256 id","nonpayable"]},{"cells":["subscriptionRange(uint256 id)","address collection, uint256 first, uint256 last","view"]},{"cells":["subscriptions(uint256)","address collection, uint64 generation, bool editions, bool active, bool complete, bytes32 watchId, uint256 first, uint256 last, uint256 cursor","view"]},{"cells":["sync(bytes32 watchId, uint256 cursor, uint256 count)","uint256 next","nonpayable"]},{"cells":["unsubscribe(uint256 id)","—","nonpayable"]},{"cells":["watch(bytes32 id)","(address,uint32,uint64,bytes32,bytes)","view"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["DependencyChanged(bytes32 indexed watchId, uint64 generation, bytes32 digest)"]},{"cells":["DependencyRegistered(bytes32 indexed watchId, address indexed source, bytes query, uint32 readGas)"]},{"cells":["NotificationDeferred(uint256 indexed subscriptionId, uint64 generation, uint256 first, uint256 last)"]},{"cells":["NotificationDelivered(uint256 indexed subscriptionId, uint64 generation, uint256 first, uint256 last)"]},{"cells":["SubscriptionCreated(uint256 indexed subscriptionId, bytes32 indexed watchId, address indexed collection, uint256 first, uint256 last)"]},{"cells":["SubscriptionRemoved(uint256 indexed subscriptionId)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidDependency()"]},{"cells":["InvalidPage()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["SourceReadFailed()"]},{"cells":["Unauthorized()"]}],"caption":"Custom errors","collapsed":true}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelSleeve","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-sleeve/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-sleeve/tezos"},{"label":"Native module configuration","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-sleeve/keel.module.json"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["token_json","onchain_view","keel_sleeve.py"]},{"cells":["token_uri","onchain_view","keel_sleeve.py"]},{"cells":["erc4804_uri","onchain_view","keel_sleeve.py"]},{"cells":["source","onchain_view","keel_sleeve.py"]}],"caption":"Native interface","collapsed":false}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-stake","navTitle":"Stake objects (keel-stake)","eyebrow":"Technical reference","title":"Stake objects (keel-stake)","summary":"Configurable ERC-721 staking custody, frozen terms, and optional token-bound accounts.","thesis":"Configurable ERC-721 staking custody, frozen terms, and optional token-bound accounts.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"Configurable ERC-721 staking custody, frozen terms, and optional token-bound accounts.","cards":[{"title":"keel-stake","body":"Configurable ERC-721 staking custody, frozen terms, and optional token-bound accounts.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-artifacts, keel-kernel"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-stake/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-stake"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-stake"}]}]},{"id":"keelstakeobjectmanager","title":"KeelStakeObjectManager","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelStakeObjectManager","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-stake/KeelStakeObjectManager.sol"},{"label":"Download ABI","href":"/docs/abi/keel-stake/KeelStakeObjectManager.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["STAKE_KEY_DOMAIN()","bytes32","view"]},{"cells":["STAKE_OBJECT_DOMAIN()","bytes32","view"]},{"cells":["artifactRegistry()","address","view"]},{"cells":["configureLockup(bytes32 stakeObjectId, uint8 mode, uint64 minimumSeconds)","—","nonpayable"]},{"cells":["configureRuntime(bytes32 stakeObjectId, bytes32 codeObjectId, uint64 codeObjectRevision, uint16 slot, bytes32 seed, bytes32 argumentsDigest, bytes32 variablesDigest, bytes32 runtimeDigest)","—","nonpayable"]},{"cells":["createStakeObject(bytes32 salt, address hostCollection, uint256 hostTokenId, address stakedCollection, bytes32 harnessId, (address,address,bytes32) backpack)","bytes32 stakeObjectId","nonpayable"]},{"cells":["ensureBackpack(bytes32 stakeObjectId)","address account","nonpayable"]},{"cells":["freezeStakeObject(bytes32 stakeObjectId)","—","nonpayable"]},{"cells":["globalStakeCounts()","uint256 lifetime, uint256 active","view"]},{"cells":["keelStakeState(address collection, uint256 tokenId)","bool active, address controller","view"]},{"cells":["onERC721Received(address operator, address from, uint256 tokenId, bytes)","bytes4","view"]},{"cells":["packedStakeCounts(bytes32 stakeObjectId, address stakedCollection, uint256 tokenId)","bytes32 packed","view"]},{"cells":["predictStakeObjectId(address creator, bytes32 salt)","bytes32","pure"]},{"cells":["setStakeObjectEnabled(bytes32 stakeObjectId, bool enabled)","—","nonpayable"]},{"cells":["stake(bytes32 stakeObjectId, uint256 tokenId)","—","nonpayable"]},{"cells":["stakeCountForToken(address stakedCollection, uint256 tokenId)","uint256 lifetime, uint256 active","view"]},{"cells":["stakeCounts(bytes32 stakeObjectId, address stakedCollection, uint256 tokenId)","uint256 objectTokenLifetime, uint256 objectLifetime, uint256 objectActive, uint256 tokenLifetime, uint256 tokenActive","view"]},{"cells":["stakeKey(bytes32 stakeObjectId, address stakedCollection, uint256 tokenId)","bytes32","pure"]},{"cells":["stakeObject(bytes32 stakeObjectId)","(address,address,uint256,address,bytes32,(address,address,bytes32),address,(uint8,uint64),bool,bool,bool)","view"]},{"cells":["stakeObjectActive(bytes32 stakeObjectId, uint256 tokenId)","bool","view"]},{"cells":["stakeObjectController(bytes32 stakeObjectId)","address hostOwner, address creator, address manager","view"]},{"cells":["stakeObjectRuntime(bytes32 stakeObjectId)","(bytes32,uint64,bytes32,bytes32,bytes32,uint16,bytes32,bool)","view"]},{"cells":["stakeObjectState(bytes32 stakeObjectId, uint256 tokenId)","(bool,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes32,address,bytes32,uint8,uint64,uint64) state","view"]},{"cells":["totalActiveStakes()","uint256","view"]},{"cells":["totalLifetimeStakes()","uint256","view"]},{"cells":["unstake(bytes32 stakeObjectId, uint256 tokenId)","—","nonpayable"]}],"caption":"Functions","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["StakeObjectBackpackCreated(bytes32 indexed stakeObjectId, address indexed account)"]},{"cells":["StakeObjectCreated(bytes32 harnessId, bytes32 indexed stakeObjectId, address creator, address indexed hostCollection, address stakedCollection, uint256 indexed hostTokenId)"]},{"cells":["StakeObjectEnabled(bool enabled, bytes32 indexed stakeObjectId)"]},{"cells":["StakeObjectFrozen(bytes32 indexed stakeObjectId)"]},{"cells":["StakeObjectLockupConfigured(uint8 mode, uint64 minimumSeconds, bytes32 indexed stakeObjectId)"]},{"cells":["StakeObjectRuntimeConfigured(uint64 codeObjectRevision, uint16 slot, bytes32 seed, bytes32 indexed codeObjectId, bytes32 indexed stakeObjectId, bytes32 runtimeDigest, bytes32 argumentsDigest, bytes32 variablesDigest)"]},{"cells":["StakeRecorded(bytes32 indexed stakeObjectId, bytes32 runtimeDigest, address staker, address hostCollection, address indexed stakedCollection, uint256 indexed tokenId, uint256 hostTokenId, uint256 tokenActive, uint256 objectActive, uint256 globalActive, uint256 tokenLifetime, uint256 objectLifetime, uint256 globalLifetime, uint256 objectTokenLifetime)"]},{"cells":["StakeReleased(bytes32 indexed stakeObjectId, bytes32 runtimeDigest, address staker, address hostCollection, address indexed stakedCollection, uint256 indexed tokenId, uint256 hostTokenId, uint256 tokenActive, uint256 objectActive, uint256 globalActive, uint256 tokenLifetime, uint256 objectLifetime, uint256 globalLifetime, uint256 objectTokenLifetime)"]}],"caption":"Events","collapsed":true},{"columns":["Signature / parameters"],"rows":[{"cells":["AlreadyStaked()"]},{"cells":["BackpackExists()"]},{"cells":["BackpackUnavailable()"]},{"cells":["ConfigurationFrozen()"]},{"cells":["CounterPackingOverflow()"]},{"cells":["InvalidContract()"]},{"cells":["InvalidLockup()"]},{"cells":["InvalidRuntime()"]},{"cells":["InvalidStakeObject()"]},{"cells":["InvalidTransfer()"]},{"cells":["LockupActive()"]},{"cells":["LockupImmutable()"]},{"cells":["NotStaked()"]},{"cells":["NotStaker()"]},{"cells":["ObjectActive()"]},{"cells":["ReentrancyGuardReentrantCall()"]},{"cells":["RuntimeMissing()"]},{"cells":["RuntimeObjectMissing()"]},{"cells":["StakeObjectExists()"]},{"cells":["StakeObjectMissing()"]},{"cells":["Unauthorized()"]},{"cells":["ZeroAddress()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address artifactRegistry_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]},{"id":"tezos","title":"Native Tezos implementation","intro":"SmartPy entrypoints and views come from native source, not an EVM ABI translation. This source inventory does not assert deployment or EVM behavioral parity.","cards":[{"title":"SmartPy contracts","body":"KeelStakeObjectManager","links":[{"label":"SmartPy source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-stake/tezos"},{"label":"Native tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-stake/tezos"},{"label":"Native module configuration","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-stake/keel.module.json"}]},{"title":"Entrypoints and views","body":"For exact parameter and storage types follow the SmartPy source; an originated target’s /entrypoints RPC is the authoritative deployed parameter schema.","tables":[{"columns":["Name","Kind","Source file"],"rows":[{"cells":["create_stake_object","entrypoint","keel_stake_object_manager.py"]},{"cells":["set_enabled","entrypoint","keel_stake_object_manager.py"]},{"cells":["configure_lockup","entrypoint","keel_stake_object_manager.py"]},{"cells":["configure_runtime","entrypoint","keel_stake_object_manager.py"]},{"cells":["stake","entrypoint","keel_stake_object_manager.py"]},{"cells":["verify_stake_escrow","entrypoint","keel_stake_object_manager.py"]},{"cells":["unstake","entrypoint","keel_stake_object_manager.py"]},{"cells":["stake_object_state","onchain_view","keel_stake_object_manager.py"]},{"cells":["stake_object_active","onchain_view","keel_stake_object_manager.py"]},{"cells":["stake_counts","onchain_view","keel_stake_object_manager.py"]},{"cells":["packed_stake_counts","onchain_view","keel_stake_object_manager.py"]},{"cells":["global_stake_counts","onchain_view","keel_stake_object_manager.py"]},{"cells":["stake_object_config","onchain_view","keel_stake_object_manager.py"]},{"cells":["stake_object_runtime","onchain_view","keel_stake_object_manager.py"]},{"cells":["keel_stake_state","onchain_view","keel_stake_object_manager.py"]}],"caption":"Native interface","collapsed":false}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"module-keel-web3-url","navTitle":"web3:// adapter (keel-web3-url)","eyebrow":"Technical reference","title":"web3:// adapter (keel-web3-url)","summary":"ERC-5219/7617 resource adapter exposing Keel content over web3:// URLs, plus its demos.","thesis":"ERC-5219/7617 resource adapter exposing Keel content over web3:// URLs, plus its demos.","audience":["Developers","Integrators"],"sections":[{"id":"module","title":"Module boundary","intro":"ERC-5219/7617 resource adapter exposing Keel content over web3:// URLs, plus its demos.","cards":[{"title":"keel-web3-url","body":"ERC-5219/7617 resource adapter exposing Keel content over web3:// URLs, plus its demos.","facts":[{"label":"Version","value":"0.3.0"},{"label":"Dependencies","value":"keel-hold"},{"label":"Source revision","value":"ace3fed7aff1765c7d2ee9bba4d0232246f86ffb"}],"links":[{"label":"Module manifest","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/modules/keel-web3-url/keel.module.json"},{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-web3-url"},{"label":"Tests","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/test/modules/keel-web3-url"}]}]},{"id":"keelweb3resourceadapter","title":"KeelWeb3ResourceAdapter","intro":"ABI reference at contracts revision ace3fed7aff1. Tuple fields are listed in declaration order. Overloads remain separate.","cards":[{"title":"KeelWeb3ResourceAdapter","body":"view / pure calls read state; nonpayable / payable calls require a transaction. Source ABI is a versioned interface reference; deployed addresses can be older versions. Compare the target’s implementation and ABI before a write.","links":[{"label":"Solidity source","href":"https://github.com/Ravonus/keel-contracts/blob/ace3fed7aff1765c7d2ee9bba4d0232246f86ffb/src/modules/keel-web3-url/KeelWeb3ResourceAdapter.sol"},{"label":"Download ABI","href":"/docs/abi/keel-web3-url/KeelWeb3ResourceAdapter.json"}],"tables":[{"columns":["Signature / parameters","Returns","Mutability"],"rows":[{"cells":["keelHold()","address","view"]},{"cells":["request(string[] resource, (string,string)[])","uint16 statusCode, string body, (string,string)[] headers","view"]},{"cells":["resolveMode()","bytes32","pure"]}],"caption":"Functions","collapsed":false},{"columns":["Signature / parameters"],"rows":[{"cells":["InvalidStore()"]}],"caption":"Custom errors","collapsed":true},{"columns":["Signature / parameters","Mutability"],"rows":[{"cells":["constructor(address store_)","nonpayable"]}],"caption":"Constructor","collapsed":false}]}]}],"related":["contracts","networks","native-chains"]},{"slug":"launchpad","navTitle":"Launchpad","eyebrow":"Make and release","title":"Launch work without hiding the machinery","summary":"Move from prepared work to a collector page, with the collection, sale rules, wallet request, and receipt kept attached to the release.","thesis":"Studio keeps artistic decisions in front. Contract preparation appears when it matters, and no draft action is presented as a wallet transaction or a live release.","audience":["Artists preparing a release","Collectors checking a drop","Operators configuring advanced sales"],"related":["access","fray","native-chains","proof-status"],"sections":[{"id":"choose-a-path","title":"Begin with the thing you want to make","intro":"Studio asks for intent before it asks for contract settings. Choosing a path selects a workspace; it does not send a wallet request.","cards":[{"eyebrow":"Creator entrance","title":"Studio routes the work","body":"Choose a module, NFT collection, FRAY work, or auction. Collection and auction intents continue into the release workspace. FRAY opens its own intent builder.","status":"Studio available","facts":[{"label":"Creator route","value":"/studio"},{"label":"Launch route","value":"/launch redirects to /studio"},{"label":"Native family","value":"Project intent can select Ethereum or Tezos; the Basic release compiler below is Ethereum-only"}],"bullets":["The chooser does not connect a wallet or prepare a transaction.","The selected native family stays explicit in the work that follows.","Selecting Tezos does not make the EVM OneMint publication path chain-neutral."],"source":"apps/studio/src/app/launch/page.tsx · apps/studio/src/app/studio/page.tsx · apps/studio/src/components/studio/studio-launch-chooser.tsx"},{"eyebrow":"Wallet boundary","title":"Draft first, approve only when needed","body":"Writing release copy, selecting work, setting supply, and arranging the page stay inside Studio. A wallet appears when the workspace needs creator authentication or an onchain write.","status":"Studio available","facts":[{"label":"Drafting","value":"No transaction"},{"label":"Workspace","value":"Protected by creator wallet authentication"},{"label":"Publication","value":"Ethereum: creator reviews and sends prepared calldata"}],"source":"apps/studio/src/components/launch/release-studio.tsx · apps/studio/src/server/services/release-service.ts"}]},{"id":"product-shape","title":"Know what each object controls","intro":"A project, collection, release, drop, and campaign are related, but they are not interchangeable names.","cards":[{"eyebrow":"Before distribution","title":"Project and collection","body":"The project holds prepared work, files, page material, and provenance. The collection is the ownership and mint-capacity shell that receives a launch policy.","status":"Studio available","facts":[{"label":"Project","value":"Work, revisions, presentation, and proof"},{"label":"Collection","value":"Ownership, token target, and mint capacity"},{"label":"Publish check","value":"The creator must control the target collection"}],"source":"apps/studio/src/components/studio/studio-project-view.tsx · apps/studio/src/server/services/release-service.ts · apps/studio/src/lib/studio-project-schema.ts"},{"eyebrow":"Creator release","title":"Release and drop","body":"A release is the saved artist and collector presentation. On Ethereum, Basic Studio publishes it as a OneMint drop with one ordered stage and a shared allocation.","status":"Studio available","facts":[{"label":"Release","value":"Story, work, price, supply, access, timing, and page"},{"label":"Drop","value":"OneMint allocation, wallet counts, and stage schedule"},{"label":"Basic compiler","value":"Public or Allowlist"}],"source":"apps/studio/src/lib/release-types.ts · apps/studio/src/server/services/release-service.ts · ../keel-sdk/packages/sdk/src/one-mint.ts"},{"eyebrow":"Independent sale policy","title":"Campaign","body":"A KeelMintGate campaign is a separate sale and access policy. Several campaigns can target one collection, each with its own cap, wallet accounting, timing, price, and gate composition.","status":"Operator available","facts":[{"label":"Controller","value":"KeelMintGate"},{"label":"Allocation","value":"Per campaign"},{"label":"Rules","value":"Merkle, token, custom gate, signature, or a composition"}],"source":"apps/studio/src/components/launch/mint-configurator.tsx · ../keel-sdk/packages/sdk/src/campaign.ts · ../keel-contracts/src/modules/keel-mint-access/KeelMintGate.sol"}]},{"id":"shape-the-release","title":"Shape the public promise before publishing","intro":"The release wizard keeps artistic choices in front and moves contract preparation to the review boundary.","cards":[{"eyebrow":"Release workspace","title":"Format, work, details, page, review","body":"Choose the release format, attach the work, write the details, arrange the collector page, and review the result. Saves happen through explicit actions and step transitions.","status":"Studio available","facts":[{"label":"Supply formats","value":"Open, limited, or 1/1"},{"label":"Work formats","value":"Generative, unique, interactive, game, asset, or custom"},{"label":"Saving","value":"Explicit save; no autosave promise"}],"source":"apps/studio/src/components/launch/release-studio.tsx · apps/studio/src/lib/release-schema.ts · apps/studio/src/app/api/releases/route.ts · apps/studio/src/app/api/releases/[releaseId]/route.ts"},{"eyebrow":"Publication","title":"Ethereum: prepare, send, confirm","body":"Studio saves the draft, authenticates the creator, prepares exact EVM createDrop calldata, lets the wallet send it, waits for the receipt, then confirms the correlated DropCreated event.","status":"Studio available","facts":[{"label":"Before wallet","value":"Project readiness, collection control, access, and release values are checked"},{"label":"Wallet operation","value":"One OneMint createDrop transaction"},{"label":"Confirmation","value":"Receipt target, creator, collection, and metadata digest are correlated"}],"source":"apps/studio/src/components/launch/release-studio.tsx · apps/studio/src/server/services/release-service.ts · apps/studio/src/app/api/releases/[releaseId]/prepare/route.ts · apps/studio/src/app/api/releases/[releaseId]/confirm/route.ts"},{"eyebrow":"Tezos boundary","title":"Prepare the native operation before claiming publication","body":"A Tezos project can carry Tezos intent and checkpoint/upload planning, but the current Basic release service does not turn that intent into the OneMint createDrop flow. A contract-specific SmartPy adapter, wallet operation, receipt, and public origination evidence are separate acceptance gates.","status":"Partial","facts":[{"label":"Available","value":"Tezos project intent and bounded preparation"},{"label":"Not interchangeable","value":"EVM OneMint calldata and DropCreated receipt"},{"label":"Required proof","value":"Native adapter, wallet operation, receipt, and deployed contract evidence"}],"source":"apps/studio/src/components/studio/studio-launch-chooser.tsx · ../keel-sdk/packages/sdk/src/fray-upload.ts · ../vault-of-the-fallen/packages/vault-tezos/README.md"},{"eyebrow":"Primary payout","title":"Read the prepared payout, not a draft label","body":"The current basic publication service prepares the connected creator as the payout address. A draft payout field is not proof that a different address reached createDrop.","status":"Partial","facts":[{"label":"Current prepared payout","value":"Connected creator"},{"label":"Draft field","value":"Not authoritative for the prepared transaction"},{"label":"Collector proof","value":"Inspect the exact prepared call and live drop"}],"source":"apps/studio/src/lib/release-types.ts · apps/studio/src/server/services/release-service.ts"}]},{"id":"discover-and-collect","title":"Collectors enter through a canonical release","intro":"Launchpad discovery can group sale records, but the saved release is the page that explains the work and the collector action.","cards":[{"eyebrow":"Browse","title":"Find work by collection and access","body":"The explorer groups campaign records into collection cards and filters public or gated opportunities before linking to the relevant action page.","status":"Studio available","facts":[{"label":"Grouping","value":"Collection"},{"label":"Filters","value":"All, public, or gated"},{"label":"Destination","value":"Canonical release or controller-backed action page"}],"source":"apps/studio/src/components/launch/launchpad-explorer.tsx · apps/studio/src/components/launch/published-release-shelf.tsx"},{"eyebrow":"Fail closed","title":"An address is not a release page","body":"The controller-address route can read live drop state. It does not invent creator copy, invite membership, or signed authorization when no canonical release exists.","status":"Studio available","facts":[{"label":"Live read","value":"Controller, drop, stages, collection, and capacity"},{"label":"Not inferred","value":"Story, private eligibility, or authorization"},{"label":"Public document","value":"keel.drop@1"}],"source":"apps/studio/src/app/drops/[chainId]/[controller]/[dropId]/page.tsx · apps/studio/src/app/api/drops/[chainId]/[controller]/[dropId]/route.ts · apps/studio/src/server/services/one-mint-service.ts · ../keel-sdk/packages/sdk/src/drop-api.ts"},{"eyebrow":"Basic collector","title":"Check first, ask the wallet once","body":"A collector connects, sees eligibility and remaining allocation, chooses a quantity, reviews the total, and sends either publicMint or allowlistMint.","status":"Studio available","facts":[{"label":"Checks","value":"Stage, supply, wallet cap, minted count, and eligibility"},{"label":"Before write","value":"The exact call is simulated"},{"label":"After write","value":"The wallet receipt must report success"}],"bullets":["The basic collector supports Public and signed Allowlist releases."],"source":"apps/studio/src/components/launch/release-collector.tsx · apps/studio/src/app/api/releases/slug/[slug]/eligibility/route.ts · apps/studio/src/app/api/releases/slug/[slug]/authorization/route.ts"}]},{"id":"advanced-launches","title":"Use the operator console when the creator compiler is too small","intro":"The operator surface attaches to a creator-controlled collection and exposes protocol settings that would clutter the normal release flow.","cards":[{"eyebrow":"OneMint","title":"Build an ordered stage schedule","body":"Configure Public, Allowlist, NFT Claim, Token Payment, Premint, Off, or End stages and inspect collection capacity before preparing the operation.","status":"Operator available","facts":[{"label":"Route","value":"/ops/launch"},{"label":"Collection","value":"Attach and inspect, or deploy a plain KEEL721 shell"},{"label":"Merkle","value":"Supported by OneMint source, not selectable in this editor"}],"source":"apps/studio/src/app/ops/launch/page.tsx · apps/studio/src/components/launch/mint-configurator.tsx · apps/studio/src/lib/mint-launch-schema.ts"},{"eyebrow":"KeelMintGate","title":"Compose a campaign","body":"Prepare a campaign with a Merkle root, token gate, signature policy, adapter, or custom gate data. The contract remains authoritative for the final composition.","status":"Operator available","facts":[{"label":"UI inputs","value":"Adapter, Merkle root, token gate, signature policy, and custom gate data"},{"label":"Current compiler default","value":"ERC-721 balance with All logic for the token-gate path"},{"label":"Contract surface","value":"Broader than the current editor"}],"source":"apps/studio/src/components/launch/mint-configurator.tsx · apps/studio/src/lib/mint-launch-schema.ts · ../keel-sdk/packages/sdk/src/campaign.ts"},{"eyebrow":"Advanced collector","title":"Bring the proof required by the stage","body":"The operator collector handles public minting, token payment, signed allowlist, and claims, including balances, approvals, entitlement IDs, and replay checks. Premint remains an administrator strike.","status":"Operator available","facts":[{"label":"Collector modes","value":"Public, Token Payment, Allowlist, Claim"},{"label":"Administrator mode","value":"Premint"},{"label":"Write boundary","value":"Simulate, send, check receipt"}],"source":"apps/studio/src/components/launch/collector-mint.tsx"}]},{"id":"launch-proof","title":"Say exactly what has been proven","intro":"A source path, deployment record, browser session, and confirmed wallet receipt answer different questions.","cards":[{"eyebrow":"Evidence","title":"Bind acceptance to the exact source","body":"Basic release code, collector code, APIs, controller reads, contracts, and deployment records are present. That does not prove a fresh database session, RPC read, wallet signature, or mint.","status":"Unproven","facts":[{"label":"Source shows","value":"Implemented paths, validation, calldata shape, and receipt checks"},{"label":"Deployment record shows","value":"A recorded address and transaction reference"},{"label":"Fresh acceptance shows","value":"Database, browser, RPC, wallet, event, and final collector state"}],"source":"docs/gauntlet/MANAGER_LEDGER.md · ../keel-contracts/modules/keel-mint-access/deployments/11155111.json"}]}]},{"slug":"access","navTitle":"Access","eyebrow":"Eligibility and whitelisting","title":"Access rules collectors can understand","summary":"See who qualifies, what they must prove, who authorizes the proof, and which Keel surface can use the rule today.","thesis":"Public, invite list, Merkle, token, claim, premint, payment, signature, and custom gate are different mechanics. The docs keep their proof and availability boundaries separate.","audience":["Artists choosing access","Collectors checking eligibility","Operators composing gates"],"related":["launchpad","proof-status","native-chains"],"sections":[{"id":"choose-a-rule","title":"Choose from the surface you are actually using","intro":"The creator flow is deliberately small. The operator flow is broader. The contracts support more combinations than either interface.","cards":[{"eyebrow":"Creator release","title":"Public or invite list","body":"The normal release wizard publishes one Public or Allowlist stage. Holder, Claim, and Custom values exist in draft types but basic publication preparation rejects them.","status":"Studio available","facts":[{"label":"Available","value":"Public, Allowlist"},{"label":"Not available here","value":"Holder, Claim, Custom, Merkle, Token Payment, Premint"},{"label":"Published shape","value":"One ordered OneMint stage"}],"source":"apps/studio/src/components/launch/release-studio.tsx · apps/studio/src/lib/release-schema.ts · apps/studio/src/server/services/release-service.ts"},{"eyebrow":"Technical launch","title":"OneMint operator stages","body":"The operator editor exposes Public, Allowlist, NFT Claim, Token Payment, Premint, Off, and End. It does not currently expose a Merkle selector.","status":"Operator available","facts":[{"label":"Collector stages","value":"Public, Allowlist, NFT Claim, Token Payment"},{"label":"Administrator stage","value":"Premint"},{"label":"Schedule controls","value":"Off, End"}],"source":"apps/studio/src/components/launch/mint-configurator.tsx · apps/studio/src/lib/mint-launch-schema.ts"},{"eyebrow":"Protocol","title":"OneMint and KeelMintGate","body":"OneMint source also supports Merkle. KeelMintGate can compose Merkle, token, custom-gate, and signed rules with All or Any logic.","status":"SDK / contract","facts":[{"label":"OneMint","value":"Off, Allowlist, Public, Token Payment, Claim, Premint, End, Merkle"},{"label":"KeelMintGate","value":"Merkle, token, custom gate, signature, and composed rules"},{"label":"Important","value":"Contract support is not basic Studio support"}],"source":"../keel-sdk/packages/sdk/src/one-mint.ts · ../keel-sdk/packages/sdk/src/campaign.ts · ../keel-contracts/src/modules/keel-mint-access/OneMintController.sol · ../keel-contracts/src/modules/keel-mint-access/KeelMintGate.sol"}]},{"id":"public-and-invites","title":"Open the door or invite exact wallets","intro":"These are the access choices available in the normal artist release flow.","cards":[{"eyebrow":"Public","title":"Anyone may attempt the active stage","body":"Public does not mean unconstrained. The controller still checks timing, supply, quantity, wallet limits, exact payment, and collection capacity.","status":"Studio available","facts":[{"label":"Collector proves","value":"Wallet and exact mint parameters"},{"label":"Membership proof","value":"None"},{"label":"Studio action","value":"publicMint"}],"source":"apps/studio/src/components/launch/release-collector.tsx · ../keel-contracts/src/modules/keel-mint-access/OneMintController.sol"},{"eyebrow":"Invite list","title":"Keep the list private; issue a short-lived proof","body":"The artist pastes wallet addresses into a private revision. At collection time the service rechecks the current list and live drop, then issues a typed authorization.","status":"Studio available","facts":[{"label":"Editor","value":"Addresses separated by lines or commas; 10,000-member limit"},{"label":"Collector sees","value":"Eligibility result, not the private list"},{"label":"Authorization","value":"Short-lived EIP-712 signature"}],"bullets":["Publication requires a non-empty list and configured authorization signer.","Authorization rechecks the active release, stage, nonce, wallet limits, minted count, and supply."],"source":"apps/studio/src/components/studio/release-access-editor.tsx · apps/studio/src/server/services/release-service.ts · apps/studio/src/app/api/releases/slug/[slug]/authorization/route.ts"}]},{"id":"portable-and-composed-proofs","title":"Carry a proof when the rule belongs onchain","intro":"Merkle, signed, token, and custom rules bind different evidence. They can be composed only where the controller supports that composition.","cards":[{"eyebrow":"Merkle","title":"Prove membership and allowance","body":"OneMint binds a wallet and allowance in a double-hashed leaf. A valid proof can narrow the effective wallet limit for that collector.","status":"SDK / contract","facts":[{"label":"Collector supplies","value":"Merkle proof and allowance"},{"label":"Onchain commitment","value":"Merkle root"},{"label":"Current UI","value":"Not exposed in the OneMint operator editor"}],"source":"../keel-sdk/packages/sdk/src/one-mint.ts · ../keel-contracts/src/modules/keel-mint-access/OneMintController.sol · ../keel-contracts/test/modules/keel-mint-access/OneMintController.t.sol"},{"eyebrow":"Signed authorization","title":"Bind the whole mint promise","body":"KeelMintGate authorization binds the campaign, collector, signer, quantity ceiling, unit price, nonce, deadline, and context. SignatureChecker supports EOAs and ERC-1271 wallets.","status":"SDK / contract","facts":[{"label":"Typed data","value":"EIP-712, Keel Mint Access v1"},{"label":"Signer policy","value":"Creator, platform, either, or none"},{"label":"Replay controls","value":"Nonce, deadline, context hash, digest lock"}],"source":"../keel-sdk/packages/sdk/src/campaign.ts · ../keel-contracts/src/modules/keel-mint-access/KeelMintGate.sol"},{"eyebrow":"Custom composition","title":"Explain every external gate","body":"KeelMintGate can call a configured custom gate with committed data and combine it with Merkle, token, and signature rules using All or Any logic.","status":"Operator available","facts":[{"label":"Operator prepares","value":"Gate address and custom data"},{"label":"Contract decides","value":"All gates or any passing gate"},{"label":"Basic Studio","value":"Not available"}],"source":"apps/studio/src/components/launch/mint-configurator.tsx · ../keel-sdk/packages/sdk/src/campaign.ts · ../keel-contracts/src/modules/keel-mint-access/KeelMintGate.sol"}]},{"id":"payment-ownership-and-admin","title":"Payment, ownership, claims, and administrator mints are different rules","intro":"The collector should see the exact thing being checked rather than one generic gated badge.","cards":[{"eyebrow":"Token Payment","title":"Pay the exact ERC-20 amount","body":"The advanced collector checks token balance and allowance. The controller rejects fee-on-transfer behavior because received payment would not match the committed amount.","status":"Operator available","facts":[{"label":"Collector needs","value":"Payment-token balance and controller allowance"},{"label":"Price","value":"Quantity multiplied by unit price"},{"label":"Basic Studio","value":"Not available"}],"source":"apps/studio/src/components/launch/collector-mint.tsx · ../keel-contracts/src/modules/keel-mint-access/OneMintController.sol"},{"eyebrow":"Token gate","title":"Use ownership or balance as eligibility","body":"KeelMintGate supports ERC-20 balance, ERC-721 balance, a specific ERC-721 token, or ERC-1155 balance. The current operator compiler exposes a narrower ERC-721-balance path.","status":"SDK / contract","facts":[{"label":"Purpose","value":"Eligibility, not payment"},{"label":"Standards","value":"ERC-20, ERC-721, ERC-1155"},{"label":"Composition","value":"Can join Merkle, custom, and signature rules"}],"source":"apps/studio/src/lib/mint-launch-schema.ts · ../keel-sdk/packages/sdk/src/campaign.ts · ../keel-contracts/src/modules/keel-mint-access/KeelMintGate.sol"},{"eyebrow":"Claim","title":"Consume exact entitlement IDs","body":"A claim binds a signed authorization to eligible ERC-721 token IDs. The controller checks ownership and records consumed IDs so an entitlement cannot be reused.","status":"Operator available","facts":[{"label":"Collector supplies","value":"Signature and entitlement token IDs"},{"label":"Checks","value":"Ownership, limits, signature, and prior consumption"},{"label":"Contract limit","value":"Up to 64 claim IDs per call"}],"source":"apps/studio/src/components/launch/collector-mint.tsx · ../keel-contracts/src/modules/keel-mint-access/OneMintController.sol"},{"eyebrow":"Premint","title":"Strike as an administrator","body":"Premint consumes the drop allocation through an administrator action. It is not an early collector checkout and does not belong on a public mint button.","status":"Operator available","facts":[{"label":"Actor","value":"Authorized administrator"},{"label":"Action","value":"adminStrike"},{"label":"Collector mint","value":"Not available"}],"source":"apps/studio/src/components/launch/collector-mint.tsx · ../keel-contracts/src/modules/keel-mint-access/OneMintController.sol"}]},{"id":"supply-and-money","title":"Eligibility still sits beneath supply, capacity, and payment","intro":"A valid proof cannot mint outside the active stage, beyond a wallet limit, above collection capacity, or without exact payment.","cards":[{"eyebrow":"OneMint allocation","title":"Stages share the drop","body":"Every stage in a OneMint drop shares one supply and one wallet-minted count. A stage may narrow the wallet limit, but it does not create a separate pool.","status":"SDK / contract","facts":[{"label":"Finite supply","value":"Reserves collection capacity"},{"label":"Open supply","value":"No finite reservation; the collection maximum remains authoritative"},{"label":"Permanent close","value":"Releases unused reserved capacity"}],"source":"apps/studio/src/server/services/one-mint-service.ts · ../keel-contracts/src/modules/keel-mint-access/OneMintController.sol"},{"eyebrow":"Campaign allocation","title":"A campaign has its own cap","body":"A direct finite KeelMintGate campaign reserves target capacity. Adapter campaigns cannot receive the same direct capacity protection and must make their limit safe elsewhere.","status":"SDK / contract","facts":[{"label":"Direct target","value":"Finite maximum can reserve capacity"},{"label":"Adapter target","value":"No direct reservation guarantee"},{"label":"Accounting","value":"Per-campaign supply and wallet counters"}],"source":"../keel-contracts/src/modules/keel-mint-access/KeelMintGate.sol"},{"eyebrow":"Payout","title":"Payment moves into pull balances","body":"KeelMintGate accepts exact native or ERC-20 payment and credits payout and eligible platform-fee balances for withdrawal. A platform fee applies only to platform-signed authorization.","status":"SDK / contract","facts":[{"label":"Payment","value":"Exact native value or exact ERC-20 receipt"},{"label":"Payout","value":"Pull balance"},{"label":"Platform fee","value":"Only for platform-signed authorization"}],"source":"../keel-contracts/src/modules/keel-mint-access/KeelMintGate.sol"}]},{"id":"hard-boundaries","title":"Named in code does not mean available","intro":"The guide fails closed when a stage is reserved, a signer is missing, or fresh live evidence has not been produced.","cards":[{"eyebrow":"Reserved stage names","title":"Do not offer rejected OneMint modes","body":"ProofOfWork, Auction, NeuralPayment, Airdrop, and CustomGate are enum values, but OneMint rejects them. FRAY auctions do not make the OneMint Auction stage available.","status":"Blocked / unsupported","facts":[{"label":"Rejected","value":"ProofOfWork, Auction, NeuralPayment, Airdrop, CustomGate"},{"label":"FRAY","value":"A separate auction system"},{"label":"Source of truth","value":"Controller behavior and supported-stage validation"}],"source":"../keel-sdk/packages/sdk/src/one-mint.ts · ../keel-contracts/src/modules/keel-mint-access/OneMintController.sol"},{"eyebrow":"Acceptance","title":"Prove the exact rule against the exact release","body":"Source shows validation and call shape. A recorded deployment names an address. Fresh acceptance must prove the release, stage, signer, wallet, RPC state, transaction, event, and resulting counters.","status":"Unproven","facts":[{"label":"Logical receipt","value":"Mode and surface match documented availability"},{"label":"Wallet receipt","value":"Expected controller, call, event, and final state"},{"label":"Binding","value":"Receipts attach to the exact source fingerprint"}],"source":"docs/gauntlet/MANAGER_LEDGER.md · ../keel-contracts/modules/keel-mint-access/deployments/11155111.json"}]}]},{"slug":"fray","navTitle":"FRAY","eyebrow":"Auctions and patron demand","title":"FRAY is a contest around the work","summary":"Shape how bidding, patron demand, supply, and settlement meet, while keeping preparation, live state, wallet actions, and market activity separate.","thesis":"A prepared FRAY intent is not a published auction. A live room reads configured contract state. Wallet actions and settlement require their own receipts.","audience":["Artists shaping a FRAY","Bidders and patrons","Collectors using the secondary market"],"related":["launchpad","sdk","native-chains","proof-status"],"sections":[{"id":"enter-fray","title":"Prepare an intent or enter a live room","intro":"The creator builder and the live FRAY room serve different moments. One shapes a reviewable promise; the other reads and acts on a configured contract.","cards":[{"eyebrow":"Artist","title":"Prepare a FRAY","body":"Choose Ethereum or Tezos, hash the source locally, select Quick, Standard, or Collector terms, and review the exact auction intent before any upload or wallet action.","status":"Specified","facts":[{"label":"Route","value":"/studio/fray/new"},{"label":"Output","value":"fray-auction-intent@1"},{"label":"Not performed","value":"Upload, wallet signature, or auction publication"}],"source":"apps/studio/src/app/studio/fray/new/page.tsx · apps/studio/src/components/studio/fray-intent-builder.tsx · ../keel-sdk/packages/sdk/src/fray-auction-intent.ts"},{"eyebrow":"Live room","title":"Read contract-backed FRAY state","body":"The FRAY pages read configured contract and indexer state. If the room is unavailable, the page reports that boundary instead of substituting local auction data.","status":"Implemented locally","facts":[{"label":"Routes","value":"/fray and /fray/[auctionId]"},{"label":"Current live family","value":"Ethereum"},{"label":"Fallback","value":"No invented auction state"}],"source":"apps/studio/src/app/fray/page.tsx · apps/studio/src/app/fray/[auctionId]/page.tsx · apps/studio/src/server/services/fray-contract-service.ts"}]},{"id":"shape-intent","title":"Bind the selected work and auction terms together","intro":"The intent lets another tool inspect the same source digest and versioned terms before anything is submitted.","cards":[{"eyebrow":"Source","title":"Hash the selected bytes locally","body":"The builder calculates a SHA-256 digest from the selected source and places it in the intent. This proves which bytes were reviewed, not that they were uploaded.","status":"Specified","facts":[{"label":"Digest","value":"SHA-256"},{"label":"Document","value":"fray-auction-intent@1"},{"label":"Availability proof","value":"None until publication is executed and checked"}],"source":"apps/studio/src/components/studio/fray-intent-builder.tsx · ../keel-sdk/packages/sdk/src/fray-auction-intent.ts"},{"eyebrow":"Terms","title":"Review exact values, not preset names","body":"The intent binds family, network, currency, outcome, duration, reserve, minimum bid increment, royalty, patron cap, edition price, and extension policy.","status":"SDK / contract","facts":[{"label":"Market","value":"Reserve, increment, duration, extension"},{"label":"Patron","value":"Cap and edition price"},{"label":"Artist","value":"Outcome, currency, and royalty"}],"source":"../keel-sdk/packages/sdk/src/fray-auction-intent.ts"}]},{"id":"auction-mechanics","title":"Bidder demand and patron demand meet at settlement","intro":"FRAY tracks two forms of participation without pretending they are the same purchase.","cards":[{"eyebrow":"Bidder side","title":"Compete for the leading position","body":"A bid follows the current reserve and increment rules. The live room reads the leading bid, bidder, timing, and settlement state from contract-backed data.","status":"Implemented locally","facts":[{"label":"Action","value":"placeBid"},{"label":"Terms","value":"Reserve, minimum increment, and extension window"},{"label":"Authority","value":"Contract state and correlated events"}],"source":"apps/studio/src/server/services/fray-contract-service.ts · apps/studio/src/components/fray/fray-auction-actions.tsx"},{"eyebrow":"Patron side","title":"State edition demand","body":"A patron can set a cap or exit while the contract allows it. Patron demand contributes to final supply and the clearing result; it is not displayed as a leading bid.","status":"Implemented locally","facts":[{"label":"Actions","value":"setPatronCap, exitPatron"},{"label":"State","value":"Patron cap, edition price, participation, and final supply"},{"label":"Meaning","value":"Patron demand remains separate from bidder rank"}],"source":"apps/studio/src/server/services/fray-contract-service.ts · apps/studio/src/components/fray/fray-auction-actions.tsx"}]},{"id":"live-state","title":"Use contract state and indexed history for their proper jobs","intro":"The service joins a current contract snapshot with indexed activity while keeping the source of each fact clear.","cards":[{"eyebrow":"Contract snapshot","title":"Read the current auction","body":"The service reads lifecycle, price terms, participants, caps, clearing, and final supply for the configured auction, along with metadata and viewer context.","status":"Implemented locally","facts":[{"label":"Current state","value":"Lifecycle, leading bid, patron terms, clearing, final supply"},{"label":"Work context","value":"Metadata and viewer data"},{"label":"Dependency","value":"Configured Ethereum RPC and contract"}],"source":"apps/studio/src/server/services/fray-contract-service.ts"},{"eyebrow":"Indexed activity","title":"Read the auction history","body":"The indexer supplies event history, auction detail, activity feeds, leaderboards, and marketplace records. It complements the contract read rather than replacing final state authority.","status":"Implemented locally","facts":[{"label":"Views","value":"Activity, auction detail, leaderboards, marketplace"},{"label":"Use","value":"Discovery and event history"},{"label":"Dependency","value":"Configured FRAY indexer"}],"source":"apps/studio/src/server/services/fray-contract-service.ts · apps/studio/src/app/api/fray/activity/route.ts · apps/studio/src/app/api/fray/leaderboards/route.ts · apps/studio/src/app/api/fray/marketplace/route.ts"}]},{"id":"wallet-and-market","title":"Read freely; simulate before every wallet write","intro":"Reading the room does not require a transaction. Bidding, changing patron participation, listing, and buying do.","cards":[{"eyebrow":"Auction actions","title":"Bid or change patron participation","body":"The connected wallet can place a bid, set a patron cap, or exit patron participation. Studio simulates the exact call and requires a successful receipt.","status":"Implemented locally","facts":[{"label":"Actions","value":"placeBid, setPatronCap, exitPatron"},{"label":"Before wallet","value":"Live state and exact call simulation"},{"label":"After wallet","value":"Receipt success and refreshed state"}],"source":"apps/studio/src/components/fray/fray-auction-actions.tsx"},{"eyebrow":"Marketplace","title":"Approve, list, or buy","body":"A seller approves the relevant ERC-721 or ERC-1155 token before listing. A buyer sends the purchase to the configured market contract. Receipt success precedes the completed state.","status":"Implemented locally","facts":[{"label":"Seller","value":"Approve token, then list"},{"label":"Buyer","value":"Buy through the market contract"},{"label":"Boundary","value":"Approval and listing can be separate wallet operations"}],"source":"apps/studio/src/components/fray/fray-marketplace-panel.tsx"}]},{"id":"chain-and-proof","title":"Keep family, publication, live state, and settlement proof separate","intro":"The creator intent can target Ethereum or Tezos. The current live-room service is an Ethereum integration. Each family needs its own acceptance evidence.","cards":[{"eyebrow":"Native family","title":"An intent can target Ethereum or Tezos","body":"Family, network, currency, and source digest remain explicit in the reviewed document. The intent does not prove deployment or a live auction on either family.","status":"Specified","facts":[{"label":"Families","value":"Ethereum, Tezos"},{"label":"Identity","value":"Family and network remain explicit"},{"label":"Proof","value":"Prepared intent only"}],"source":"apps/studio/src/components/studio/fray-intent-builder.tsx · ../keel-sdk/packages/sdk/src/fray-auction-intent.ts"},{"eyebrow":"Publication plan","title":"Prepare chunks without pretending to submit them","body":"The SDK creates an unsigned chunk and upload plan, including Tezos checkpoint operations. It does not sign, submit, or claim remote availability.","status":"SDK / contract","facts":[{"label":"Plan","value":"Chunks, operations, digests, and checkpoints"},{"label":"Tezos","value":"Checkpoint operations can be prepared"},{"label":"Not performed","value":"Wallet approval and network submission"}],"source":"../keel-sdk/packages/sdk/src/fray-upload.ts"},{"eyebrow":"Acceptance","title":"Attach the receipt that matches the claim","body":"The intent proves selected terms. A contract read proves observed state. A wallet receipt proves a submitted action. Settlement proof needs final contract state and correlated events.","status":"Unproven","facts":[{"label":"Prepared","value":"Versioned intent and source digest"},{"label":"Observed","value":"Configured RPC and indexer snapshot"},{"label":"Acted","value":"Exact wallet call and successful receipt"},{"label":"Settled","value":"Final contract state and correlated settlement events"}],"source":"apps/studio/src/components/studio/fray-intent-builder.tsx · apps/studio/src/server/services/fray-contract-service.ts · apps/studio/src/components/fray/fray-auction-actions.tsx · apps/studio/src/components/fray/fray-marketplace-panel.tsx · docs/gauntlet/MANAGER_LEDGER.md"}]}]},{"slug":"anchoring","navTitle":"Anchoring","eyebrow":"Portable identity and evidence","title":"Publish and verify an anchor revision.","summary":"Portable roots identify a canonical object or graph. An anchor binds one exact revision through a verifier whose trust class is native, optimistic, attested, or client; integrity, observation source, and availability remain separate claims.","thesis":"A locator tells a verifier where to look. An anchor binds a portable identity. Only the named verifier route determines what has actually been proven.","audience":["Protocol integrators","Preservation operators","Verifier authors","Chain engineers"],"sections":[{"id":"anchor-model","title":"Data and state model","intro":"The model stays address-neutral until a chain-specific anchor is appended.","cards":[{"title":"Portable object identity","body":"The canonical manifest, decoded-content tree, ordered paths, media/layout fields, decoded lengths and SHA-256 values, and address-neutral resource edges produce one portable root.","status":"Specified","bullets":["Changing one canonical field changes the root.","A portable root does not itself prove availability, ownership, or source-chain consensus."],"source":"keel-sdk/docs/KEEL_PORTABLE_ROOT.md"},{"title":"Anchor record","body":"An anchor adds chain family, network, registry, revision, anchor root, verifier route, verifier trust class, locator, and chain-specific evidence without changing the portable identity.","status":"Implemented locally","bullets":["Revisions append; they do not rewrite the portable object.","Ordinals IDs, CIDs, burn addresses, and operation hashes remain locators unless a verifier checks a stronger statement."],"source":"keel-contracts/src/modules/keel-anchors/KeelPortableAnchorRegistry.sol; keel-contracts/src/modules/keel-anchors/KeelAttestedAnchorRegistry.sol"},{"title":"Exact revision, lifetime history, and Grip","body":"isChainAnchored checks one exact object revision. objectChainAnchored reports whether any revision in the object's history was accepted. objectAnchorStamp reports native status/root, a foreign-family bitmask, and frozen state; it is not Grip.","status":"SDK / contract","facts":[{"label":"Grip","value":"Unique (family, network) coordinates ever accepted for the object across all revisions"},{"label":"Revision rule","value":"A changed revision requires a new proof; accepted history remains"},{"label":"Native stamp","value":"stampNative checks same-chain registry/store commitment linkage; it does not rehash every stored byte"}],"source":"keel-contracts/src/modules/keel-anchors/KeelAttestedAnchorRegistry.sol"},{"title":"Settlement and replication state","body":"L2/L3 anchors retain settlement source, hop depth, tier, topology, and data-availability classification. Replication records contributor, carrier, chunk/object binding, and proof result independently of the source anchor.","status":"Implemented locally","bullets":["Proof can make bytes checkable without making them cheaply readable.","Replication adds a matching carrier; it does not create authorship or stronger consensus proof."],"source":"keel-contracts/src/modules/keel-anchors/KeelSettlementRegistry.sol"}]},{"id":"anchor-operations","title":"Reads, writes, and authority","intro":"Every write is scoped to the family-specific evidence it supplies.","cards":[{"title":"Read path","body":"A verifier reads the portable root, exact anchor revision, family/verifier registration, proof payload or attested report, settlement topology, and any accepted replication binding before resolving bytes.","bullets":["Consumers pin the revision and verifier route.","Fresh topology or live contract facts require fresh chain reads."],"code":"portable root\nexact anchor revision\nverifier route + trust class\nproof payload or attested report\naccepted binding or explicit rejection"},{"title":"Write and governance path","body":"Publishers append anchors; proof backends verify family-specific evidence; registry governance adds families and verifier routes append-only; replication contributors submit matching carrier evidence.","bullets":["Governance cannot relabel an old attested record as native proof.","Backend key/version changes require explicit verifier identity and evidence."]}]},{"id":"anchor-security","title":"Failure and security boundaries","intro":"The dangerous error is not a rejected proof. It is a weak proof rendered with a strong label.","cards":[{"title":"Trust class and observation source stay distinct","body":"The verifier trust classes are native, optimistic, attested, and client. CRE, Functions, and threshold reports are attested routes. A pinned RPC response is an observation source, not a trust class; the catalog currently exposes optimistic extensibility without a concrete optimistic adapter.","status":"SDK / contract"},{"title":"IPFS proves addressing, not persistence","body":"CID decoding and DAG verification can prove content identity. They do not prove that a gateway or pin remains available tomorrow.","status":"SDK / contract"},{"title":"Cross-chain mint is separate","body":"A destination mint authorized by an attestor set is not automatically evidence that the destination contract verified the source chain's consensus.","status":"Partial"}]},{"id":"anchor-chains","title":"Current Ethereum and Tezos realizations","intro":"Both lanes consume portable identities, but their native state and current evidence differ.","cards":[{"title":"Ethereum / EVM","body":"The anchors module includes portable and attested registries, L2/state verifiers, settlement registry, Chainlink Functions and CRE routes, IPFS verifier, SP1 and zkVerify backends, Bitcoin-oriented ZK verification, node registry, and replication bridge.","status":"Implemented locally","facts":[{"label":"Evidence","value":"keel-contracts/test/modules/keel-anchors/*.t.sol; no module deployment JSON is present."}]},{"title":"Tezos / SmartPy","body":"The Tezos lane stores native network bytes, portable/object roots, immutable checkpoints, recursive graph certificates, Bitcoin header state, Ethereum state-proof inputs, and cross-mint attestations.","status":"Browser-proven locally","facts":[{"label":"Evidence","value":"vault-tezos/contracts/keel_artifact_registry.py; keel_immutable_checkpoint.py; keel_btc_header_chain.py; keel_eth_state_proof.py; matching tests and Octez mockup gate"}]}]},{"id":"anchor-surfaces","title":"SDK and Studio surfaces","intro":"Preparation and presentation expose evidence; they do not promote it.","cards":[{"title":"SDK","body":"@keel/protocol defines portable identities, attested anchors, replication records, integrity, and verification presentation. The builder and chain adapters prepare family-specific operations.","source":"keel-sdk/packages/protocol/src/portable.ts"},{"title":"Studio","body":"Studio exposes anchor reads, preservation source/chunk/carrier proofs, artifact replication state, and evidence labels. The index accelerates discovery; the viewer rechecks commitments.","source":"keel-site/apps/studio/src/app/api/anchors/[chainId]/[objectId]/route.ts"}]},{"id":"anchor-evidence","title":"Exact evidence","intro":"These paths support the claims above; none is a substitute for a fresh deployment audit.","cards":[{"title":"Protocol documents","body":"Portable roots, attested anchors, L2 settlement, IPFS encoding, and ZK Bitcoin anchors.","source":"keel-sdk/docs/KEEL_PORTABLE_ROOT.md; KEEL_ATTESTED_ANCHORS.md; KEEL_L2_ANCHORS.md; KEEL_IPFS_ANCHORS.md; KEEL_ZK_BITCOIN_ANCHORS.md"},{"title":"Contract tests","body":"Fourteen focused Foundry suites cover registry, revision, replication, Functions, CRE, IPFS, L2/state, settlement, SP1, ZK, zkVerify, portable anchor, and parity paths.","source":"keel-contracts/test/modules/keel-anchors/"},{"title":"Tezos tests","body":"Native object/graph, Bitcoin, Ethereum proof, cross-mint, and local browser gates are separately exercised.","source":"vault-tezos/tests/test_keel_artifact_registry.py; test_keel_btc_header_chain.py; test_keel_eth_state_proof.py; test_keel_tezos_cross_mint_attestor.py"}]}],"related":["proof-status","native-chains","viewer-storage"]},{"slug":"sdk","navTitle":"SDK + tools","eyebrow":"Portable developer surface","title":"Prepare a verified release with the SDK and tools.","summary":"Choose the narrow package for each step: define protocol data, build deterministic bytes, resolve and mount the work, prepare a wallet-neutral request, bind a chain adapter, or hand a reviewed operation to Studio.","thesis":"A package may prepare exact bytes or a review envelope. Only a family-specific adapter, current chain reads, and an explicitly approved wallet action can cross the mutation boundary.","audience":["Application developers","Module authors","Agent integrators","Wallet and host engineers"],"sections":[{"id":"sdk-model","title":"Data and state model","intro":"The portable toolchain passes canonical objects and receipts between bounded stages.","cards":[{"title":"Source and build identity","body":"A resolved source graph, exact toolchain/options, output bytes, canonical build recipe, verification receipt, catalog record, and optional deployment record form separate linked commitments."},{"title":"Review and wallet identity","body":"Publish plans, wallet requests, wallet-intent plans, wallet links, module-review requests, and FRAY intents carry canonical integrity plus explicit not-performed signing/submission state."},{"title":"Runtime identity","body":"Manifest, resource graph, presentation, module/plugin graph, capabilities, viewer ID, and exact context travel to the host verifier without giving the child application ambient authority."}]},{"id":"sdk-packages","title":"Choose the package for the task","intro":"Each package has one primary job and a named mutation boundary. The complete package reference stays here so developers can trace an exported surface to source and tests.","cards":[{"title":"@keel/protocol","body":"Framework-free protocol types and validators for manifests, canonical integrity, source verification, portable roots, caches, presentations, attribution, IP control, RPC policy, capabilities, module indexes, project stacks, and stake objects.","status":"SDK / contract","facts":[{"label":"Source","value":"keel-sdk/packages/protocol/src/"},{"label":"Tests","value":"keel-sdk/tests/protocol.test.mjs; portable-root.test.mjs; capability-policy.test.mjs; keel-presentation.test.mjs"},{"label":"Network/write boundary","value":"Pure data, validation, hashing, and policy algebra; no wallet or chain mutation."}],"bullets":["Consumers read normalized typed values and canonical commitments.","Callers construct protocol objects, but validation rejects unknown versions, malformed fields, unsafe sizes, and inconsistent bindings."],"source":"keel-sdk/packages/protocol/package.json"},{"title":"@keel/builder","body":"Deterministic audit, compression, wrapping, chunk planning, cost analysis, build recipes, and the complete author/register/review module pipeline.","status":"SDK / contract","facts":[{"label":"Source","value":"keel-sdk/packages/builder/src/"},{"label":"Tests","value":"keel-sdk/tests/builder*.test.mjs; keel-build-recipe.test.mjs; keel-module-assurance.test.mjs; keel-modules-reproduction.test.mjs"},{"label":"Network/write boundary","value":"Local files and generated plans/receipts; publication requires a separate adapter and wallet."}],"bullets":["Reads a bounded workspace and resolved import graph rather than trusting a directory listing.","Writes deterministic local outputs, plans, locks, and receipts; it does not make a chain deployment true.","Source drift, output drift, recipe drift, missing vectors, ambiguous modules, cycles, and dependency-boundary violations fail closed."],"source":"keel-sdk/packages/builder/package.json"},{"title":"@keel/viewer","body":"The audited recovery and execution boundary: readers, recursive resolver, chunk-store reconstruction, verified gateway, sandbox, mount, bridges, plugin/market policy, collection verification, IP actions, frozen datasets, and viewer bundles.","status":"SDK / contract","facts":[{"label":"Source","value":"keel-sdk/packages/viewer/src/"},{"label":"Tests","value":"keel-sdk/tests/viewer.test.mjs; readers.test.mjs; sandbox-browser.test.mjs; host-bridge*.test.mjs; presentation-bridge.test.mjs; adversarial-boundary.test.mjs"},{"label":"Authority","value":"Retrieves and verifies; it does not receive token, registry, or wallet mutation authority."}],"bullets":["Host code retrieves exact declared resources and verifies decoded bytes before creator code mounts.","Creator code receives verified local content and bounded context inside an opaque origin with no ambient wallet or raw network.","Bridge source/origin, message size, session, replay, capability, operation, and postcondition checks fail closed."],"source":"keel-sdk/packages/viewer/package.json"},{"title":"@keel/sdk","body":"Typed ABIs, module registry, campaign and OneMint builders, collection verification, FRAY intents, wallet requests/links/intents, publication plans, managed publication, Studio capability discovery, and module-review requests.","status":"SDK / contract","facts":[{"label":"Source","value":"keel-sdk/packages/sdk/src/"},{"label":"Tests","value":"keel-sdk/tests/sdk*.test.mjs; one-mint-sdk.test.mjs; collection-verification.test.mjs; fray-policy-source-conformance.test.mjs"},{"label":"Wallet boundary","value":"Creates and verifies review envelopes or typed data; it has no wallet stack and does not sign or submit."}],"bullets":["All money, quantities, nonces, IDs, and timestamps are bounded canonical integer values.","Callers must inject chain-specific encoding, RPC reads, simulation, and explicit wallet approval.","Chain/config mismatch, altered policy terms, stale nonce, unsupported transport, missing adapter validation, and tampered integrity fail closed."],"source":"keel-sdk/packages/sdk/package.json"},{"title":"@keel/studio-core","body":"Strict server-side preparation for media, manifests, delivery plans, estimates, Hold graphs, Tezos recursion, OnchFS carriers, OBJKT exports, module catalogs, stake objects, and verification receipts.","status":"SDK / contract","facts":[{"label":"Source","value":"keel-sdk/packages/studio-core/src/"},{"label":"Tests","value":"keel-sdk/tests/studio-core.test.mjs; keel-bench.test.mjs; source-verification.test.mjs"},{"label":"Authority","value":"Prepares server-side artifacts and plans; it is not the browser rendering trust root."}],"bullets":["Reads source media, declared module graphs, catalog metadata, and bounded carrier profiles.","Writes prepared files and plans; a deployment receipt and fresh viewer verification remain separate stages.","Remote imports, archive paths, decompression, media transforms, carrier limits, and source provenance are bounded and explicit."],"source":"keel-sdk/packages/studio-core/package.json"},{"title":"@keel/ethereum-adapter","body":"Ethereum-specific offline encoding and preflight for KeelHold operations plus exact account-signs/agent-submits factory execution with injected viem-compatible clients.","status":"SDK / contract","facts":[{"label":"Source","value":"keel-sdk/packages/ethereum-adapter/src/"},{"label":"Tests","value":"keel-sdk/tests/ethereum-adapter*.test.mjs"},{"label":"Chain boundary","value":"Ethereum only; generic and Tezos requests remain deferred until a family-specific adapter exists."}],"bullets":["Reads verified local plan bytes plus injected chain/code/config/nonce state.","The account signer authorizes exact collection config; the linked agent wallet may submit only that exact call.","Wrong chain, code, factory, agent, nonce, config digest, event fields, graph receipt, or changed wallet state stops execution."],"source":"keel-sdk/packages/ethereum-adapter/package.json"},{"title":"@keel/mcp","body":"An stdio agent bridge for bounded analysis, deterministic local preparation, module selection, review envelopes, FRAY intake, and Studio capability discovery.","status":"SDK / contract","facts":[{"label":"Source","value":"keel-sdk/packages/mcp/src/"},{"label":"Tests","value":"keel-sdk/tests/mcp.test.mjs; mcp-fray-auction-intent.test.mjs"},{"label":"Authority","value":"Local review and optional bounded Studio staging; never signs, submits, claims faucet funds, or mutates a wallet."}],"bullets":["Workspace reads reject traversal, unstable files, final symlinks, oversized files, and oversized protocol frames.","Remote carrier bytes are unavailable by default; metadata-only resolution is never reported as content verification.","The callable registry in tools.ts is authoritative; generated or remembered tool lists must not replace it."],"source":"keel-sdk/packages/mcp/package.json"},{"title":"@keel/sandbox-sdk","body":"Developer and agent tooling for project inspection, preparation, browser-facing sandbox documents, and portable command-line use.","status":"SDK / contract","facts":[{"label":"Source","value":"keel-sdk/packages/sandbox-sdk/src/"},{"label":"Tests","value":"keel-sdk/tests/sandbox-sdk.test.mjs"},{"label":"Authority","value":"Local project and output files only; no chain or wallet authority."}],"bullets":["It shares the production sandbox contract instead of inventing a weaker developer-only runtime.","Project inspection and emitted documents remain bounded by the same manifest, resource, and capability rules."],"source":"keel-sdk/packages/sandbox-sdk/package.json"},{"title":"@keel/sprite-codex","body":"Deterministic lossless WebP atlases, semantic masks, multi-bundle libraries, browser loading, integer selection, and material stems for reproducible visual systems.","status":"SDK / contract","facts":[{"label":"Source","value":"keel-sdk/packages/sprite-codex/src/"},{"label":"Tests","value":"keel-sdk/tests/sprite-codex.test.mjs; three-vault-seed.test.mjs"},{"label":"Authority","value":"Compiles and loads committed assets; it does not choose an uncommitted reroll or mutate collection state."}],"bullets":["Source manifests bind bundle, asset, material, revision, selection epoch, seed domain, and palette behavior.","Old selection modulus and dependency graphs remain stable; malformed atlases, masks, or identities fail validation."],"source":"keel-sdk/packages/sprite-codex/package.json"},{"title":"@keel/web3-boundary-tests","body":"Integration tests for reference-client web3:// compatibility, ERC-7617/7618 streaming, the dependency-free stream loader, arbitrary artifacts, and repository Forge guardrails.","status":"Implemented locally","facts":[{"label":"Source","value":"keel-sdk/packages/web3-boundary-tests/"},{"label":"Tests","value":"test/reference-client.test.mjs; stream-loader.test.mjs; arbitrary-artifact.test.mjs; forge-guardrail.test.mjs"},{"label":"Authority","value":"Test-only; it makes no deployment or production-browser claim."}],"bullets":["The package checks an external compatibility boundary rather than redefining Keel's native object identity.","Passing locally proves the exercised clients and fixtures, not every browser, gateway, chain, or deployment."],"source":"keel-sdk/packages/web3-boundary-tests/package.json"}]},{"id":"mcp-tools","title":"Choose an MCP operation","intro":"Start with the action the agent must prepare, then confirm its read, write, network, and wallet boundary. The source registry remains authoritative for the complete callable set.","cards":[{"title":"Studio website is the default","body":"The website provides the creator workflow and wallet review through the user's existing Studio account and connected wallet. KEEL Desktop is entirely optional; agents should not require it, another wallet setup, or a separate signing page for supported Studio work.","bullets":["Authorize the scoped agent connection at https://studio.onkeel.io/studio#agents; hosted MCP is https://studio.onkeel.io/api/mcp.","Hosted keel_workspace and keel_create_draft return a private release reviewUrl. Local keel-studio-stage-project returns handoffUrl; keel-studio-draft returns reviewUrl.","The creator opens the returned website link and approves the exact operation with the selected wallet. Draft creation never signs or broadcasts."],"source":"keel-sdk/docs/KEEL_STUDIO_WALLET_REVIEW.md"},{"title":"Local analysis and preparation","body":"Inspect, build, verify, estimate, and plan bounded local work.","bullets":["analyze","build","verify","cost","upload-plan","chain-plan","ethereum-encode","publish-plan"],"source":"keel-sdk/packages/mcp/src/tools.ts"},{"title":"Modules, wallets, FRAY, and Studio","body":"Resolve exact reusable modules, prepare non-custodial review requests, collect FRAY policy, stage bounded source, and inspect supported chains/capabilities.","bullets":["module-resolve","module-lock","wallet-request-prepare","wallet-link","module-review-prepare","fray-auction-intake","fray-stage-project","keel-chain-guide","keel-library-search","keel-studio-capabilities"],"source":"keel-sdk/packages/mcp/src/tools.ts"},{"title":"MCP security boundary","body":"The server never signs, submits, claims faucet funds, or moves wallet assets. Chain-plan and metadata-only catalog operations must not be rendered as chain-ready or byte-verified when their adapter/carrier evidence is missing.","status":"SDK / contract"}]},{"id":"script-modules","title":"Reuse a script creation module","intro":"These reusable JavaScript modules are content-addressed creation inputs, not smart contracts. Resolve the exact catalog identity and verification disposition before binding one into a project.","cards":[{"title":"Published creation-module examples","body":"Each module has readable source, deterministic output or behavioral vectors, catalog identity, and independent deployment status.","bullets":["palette","hotkeys","orbit-camera","noise2d","verified-assets","seeded-random","sprite-sheet","audio-envelope","shader-uniforms","thumbnail-capture","frame-clock"],"facts":[{"label":"Source","value":"keel-sdk/examples/library/*.js"},{"label":"Assurance","value":"keel-sdk/tests/keel-module-assurance.test.mjs; keel-modules-reproduction.test.mjs"}]},{"title":"Trust lifecycle","body":"Graph and library registries bind exact module bytes and metadata. Module review can sanction, deprecate, or revoke one exact spec while verified and deployed remain independent facts.","source":"keel-contracts/src/modules/keel-graph/KeelModuleReviewRegistry.sol"}]},{"id":"sdk-chains","title":"Ethereum and Tezos realizations","intro":"Portable packages are shared; encoding and submission are family-specific.","cards":[{"title":"Ethereum","body":"@keel/ethereum-adapter can encode verified Hold operations and enforce the exact factory account/agent handoff. The SDK exports EVM ABIs and EIP-712 helpers.","status":"Implemented locally"},{"title":"Tezos","body":"Wallet requests support bounded Micheline and Tezos transport hints, while generic chain-plan and factory-link paths fail closed until a contract-specific Tezos adapter exists.","status":"Partial"}]},{"id":"sdk-studio","title":"Studio surface and exact evidence","intro":"Studio consumes these packages but remains a coordinator, not a protocol oracle.","cards":[{"title":"Capability discovery","body":"Clients read /.well-known/keel-capabilities before upload or wallet work and reject unknown protocol versions and unsupported fields.","code":"const capabilities = await fetchStudioCapabilities(studioUrl);\nconst target = capabilities.chains.find((chain) => chain.network === \"sepolia\");\nif (target?.status !== \"ready\") throw new Error(target?.reason);","source":"keel-sdk/packages/sdk/src/studio-capabilities.ts; tests/sdk-studio-capabilities.test.mjs"},{"title":"Managed preparation","body":"Studio Core produces source-bound manifests, media derivatives, estimates, upload plans, carrier exports, and receipts used by Studio services.","source":"keel-sdk/packages/studio-core/src/; tests/studio-core.test.mjs"},{"title":"Evidence boundary","body":"Local package tests prove the exercised source and fixtures. They do not prove a public deployment, wallet connector, live RPC, or chain receipt unless that evidence is separately named.","status":"SDK / contract"}]}],"related":["contracts","studio","viewer-storage"]},{"slug":"studio","navTitle":"Studio + control plane","eyebrow":"Product coordination","title":"Operate the Studio release control plane.","summary":"Studio owns durable creator, project, release, access, operation, index, library, preservation, and projection state while exact chain and browser verification remain independent.","thesis":"The database may make a workflow durable and searchable. It may not silently replace creator authority, exact contract state, a wallet approval, or the viewer's commitment checks.","audience":["Creators","Product engineers","Operators","Indexer and API engineers"],"sections":[{"id":"studio-model","title":"Data and state model","intro":"Creator work and public release state are persisted separately from native contract state.","cards":[{"title":"Artifact state","body":"Artifacts bind source, canonical manifest, digest, deployment intent/receipt, active revision, chain binding, prepared files, and retrieval metadata.","source":"keel-site/apps/studio/src/server/services/artifact-service.ts"},{"title":"Release state","body":"Launch releases contain creator/project/artifact identity, public slug, lifecycle, sale/drop binding, ordered stages, access lists and members, public page sections, operations, eligibility results, and authorization issuances.","source":"keel-site/apps/studio/src/server/services/release-service.ts"},{"title":"Projection state","body":"Indexer tables cover blocks, collections, objects, presentations, creator profiles, markets, replication, anchors, Vault state, mint campaigns, OneMint drops/stages/mints, and library policy/use records.","source":"keel-site/apps/studio/src/server/db/schema.ts"}]},{"id":"studio-operations","title":"Reads, writes, and authority","intro":"Every transition identifies who is allowed to request it and what external proof completes it.","cards":[{"title":"Creator writes","body":"Authenticated creators create projects, attach work, edit public identity and release copy, choose supported access/stages, request review, and prepare publication. Profile completion and creator control are publish gates."},{"title":"Collector reads and writes","body":"Collectors read public release, live eligibility, current price/supply/timing, and exact authorization requirements. A mint or market action crosses to the wallet only after simulation/review and is confirmed from exact receipt fields.","code":"GET /api/releases/slug/:slug\nGET /api/releases/slug/:slug/eligibility?account=:address\nPOST /api/releases/slug/:slug/authorization\nPOST /api/releases/:releaseId/confirm"},{"title":"Operator writes","body":"Operators may run bounded launch, automation, and reconciliation actions. Operations are journaled so retries distinguish an included transaction from a request that never landed."},{"title":"Indexer reads","body":"Indexers accelerate search, feeds, history, and projections. The viewer and transaction preflight re-read current commitments instead of trusting the projection as authority."}]},{"id":"studio-security","title":"Failure and security boundaries","intro":"The product must display incomplete external state without inventing a successful substitute.","cards":[{"title":"Prepare is not publish","body":"A draft, compiled release, quote, upload plan, or prepared wallet request remains pre-publication state. Only exact chain receipt confirmation advances the release projection."},{"title":"Access fails closed","body":"Public and allowlist flows are implemented. Holder/custom rules that lack a complete automatic adapter remain blocked or manually reviewed rather than silently public."},{"title":"Identity remains creator-owned","body":"ENS, Tezos Domains, and wallet labels may enrich display. They do not replace the saved creator profile or attribution evidence."},{"title":"Server state is not render authority","body":"The database, indexer, listing feed, and server signature cannot authorize sandbox wallet calls or replace exact manifest/object/presentation verification."}]},{"id":"studio-chains","title":"Ethereum and Tezos realizations","intro":"The same product vocabulary can target both families while their readiness remains explicit.","cards":[{"title":"Ethereum","body":"Studio has KeelHold planning/reads, generated ABIs, factory/mint/market preflights, EVM wallet actions, FRAY contract/indexer reads, and exact receipt confirmation.","status":"Studio available"},{"title":"Tezos","body":"Studio can prepare portable manifests, Tezos wallet envelopes, recursive/OnchFS carriers, OBJKT exports, Tezos contract views, and chain context. Missing transaction adapters or unfunded/unapproved release lanes remain blocked.","status":"Partial"}]},{"id":"studio-surfaces","title":"SDK, APIs, and product surfaces","intro":"The control plane is split by audience rather than exposed as one technical console.","cards":[{"title":"Public product","body":"Drops, release pages, collections, artists/profiles, gallery, market, FRAY, activity, leaderboards, library, modules, trust, and preservation."},{"title":"Creator Studio","body":"Dashboard, projects, work, public page, release, access, review, preparation, and receipt confirmation."},{"title":"Operator surfaces","body":"Launch, automation, reconciliation, indexer operation, health, and system inspection."},{"title":"APIs","body":"Artifacts/import/content, manifests, upload plans/chunks, deployment plans, releases/access/eligibility/authorization, modules/library, anchors, presentations, IP downloads, preservation proofs, FRAY, search, and indexer endpoints.","source":"keel-site/apps/studio/src/app/api/"}]},{"id":"studio-evidence","title":"Exact evidence","intro":"Source and focused tests demonstrate the current durable product model.","cards":[{"title":"Release and identity tests","body":"Schema, eligibility, public identity, creator profile, project schema, mint evidence, and Postgres identity behavior have focused coverage.","source":"keel-site/apps/studio/tests/unit/release-schema.test.ts; release-access-eligibility.test.ts; public-identity-service.test.ts; creator-profile.test.ts; studio-project-schema.test.ts; one-mint-evidence.test.ts; integration/postgres-release-identity.test.ts"},{"title":"Browser product tests","body":"Studio, mint UI, customer platform, library, Keel viewer, and Keel market have separate browser suites whose environment requirements must be satisfied before claiming a loaded result.","source":"keel-site/apps/studio/tests/e2e/studio.spec.ts; keel-mint-ui.spec.ts; customer-platform.spec.ts; keel-library.spec.ts; keel.spec.ts; keel-market.spec.ts"},{"title":"Deployment boundary","body":"This content inventory does not establish that any particular Studio build is the currently public deployment.","status":"Unproven"}]}],"related":["sdk","apps","proof-status"]},{"slug":"viewer-storage","navTitle":"Viewer + storage","eyebrow":"Recover, verify, run","title":"Recover and mount a verified work.","summary":"Storage supplies exact bytes through one or more carriers. The viewer resolves the declared graph, enforces encoded and decoded limits, verifies commitments, and only then mounts the work inside an isolated runtime.","thesis":"Immutable storage is not enough, and a sandbox alone is not enough. The consumption boundary needs both exact recovery and bounded execution.","audience":["Viewer integrators","Storage engineers","Artists shipping interactive work","Security reviewers"],"sections":[{"id":"viewer-model","title":"Data and state model","intro":"One work is a committed graph, not a single trusted URL.","cards":[{"title":"Manifest","body":"keel-manifest@2 commits entrypoint, ordered resources, source fallbacks, decoded integrity, runtime engine/capabilities, determinism, viewer binding, revision, and conventional metadata."},{"title":"Resource graph","body":"The boot shell is small, uncompressed HTML. Its digest-bound resource graph contains scripts, reusable onchain modules, assets, WASM, and data; heavy child resources may be compressed and are exposed only after stored-byte, decompression, length, and decoded-digest checks."},{"title":"Shared codecs and runtimes","body":"Gzip and Deflate use the shell's capability-checked browser decoder. Brotli requires an exact declared KEEL decoder module. For small p5 works, KEEL recommends the once-per-chain Gzip p5 fragment: the creator root references the shared shell and p5 objects and publishes only the small creator entry slot."},{"title":"Presentation","body":"Collection/token and active presentation select the exact manifest, object/viewer revisions, seed, loadout, runtime context, and optional links used for this render."},{"title":"Runtime policy","body":"Effective capability is the intersection of app, manifest, module, and host allow-lists minus every deny. Wallet intents and host operations remain separate symbolic capability families."}]},{"id":"viewer-operations","title":"Reads, writes, and authority","intro":"The privileged host and untrusted child have deliberately different jobs.","cards":[{"title":"Host reads","body":"Resolve collection/presentation state, manifest, registries, object descriptors, carriers, chunks, graph children, links, seeds, equipment/stake context, module/plugin state, and declared external sources."},{"title":"Host verification","body":"Bound encoded bytes, decompress, bound decoded bytes, verify decoded length/digest, reassemble ordered composites, verify aliases/context, and expose only accepted local bytes."},{"title":"Child reads","body":"Creator code reads frozen __KEEL_CONTENT__, __KEEL_RUNTIME__, and bounded context in an opaque-origin sandbox. It has no cookies, raw RPC, ambient public network, or injected provider.","code":"const mounted = mountArtifact(container, artifact, {\n  deterministicViewport: \"scale\",\n});"},{"title":"Write handoff","body":"A child may request a declared symbolic operation. The host validates source/session/schema/capability, derives target/calldata/value from verified code and fresh state, simulates, asks the wallet, and verifies receipt/postcondition."}]},{"id":"viewer-security","title":"Failure and security boundaries","intro":"Correctly hashed HTML, JavaScript, SVG, WASM, fonts, models, audio, and video remain hostile input.","cards":[{"title":"No runtime network fallback","body":"The gateway exposes only exact verified aliases. A failed source may move to another declared byte-identical carrier, but the child cannot fetch an undeclared substitute."},{"title":"No ambient wallet","body":"The sandbox never receives the provider. Raw target, ABI, selector, calldata, value, navigation, and approval requests from creator code are rejected."},{"title":"Replay is bounded, not magical","body":"Replay mode pins seed, PRNG, viewport, DPR, clock, locale, timezone, viewer, block, and dynamic overlays where declared. It does not promise universal pixel identity across every engine."},{"title":"Bridge inputs are hostile","body":"Source window, origin policy, exact schema, message depth/size, dangerous keys, session registration, replay floor, capability, and operation are checked before dispatch."}]},{"id":"storage-carriers","title":"Storage and carrier realizations","intro":"Carriage affects cost and availability. Integrity remains the decoded commitment.","cards":[{"title":"Ethereum / KeelHold","body":"Ingot-backed chunks, leaf objects, and balanced recursive composites support immutable reconstruction. Those objects can feed token and presentation interfaces as well as committed harness outputs.","status":"Recorded testnet deployment","source":"keel-contracts/modules/keel-hold/deployments/11155111.json"},{"title":"Tezos / chunk store and OnchFS","body":"The native lane stores chunks once, exposes standard-compatible files/directories, and adds append-only Keel object bindings. Current release proof is local/mockup.","status":"Browser-proven locally","source":"vault-tezos/contracts/keel_chunk_store.py; keel_onchfs_store.py; scripts/test-local.sh"},{"title":"Canonical carriers and additional sources","body":"The current KeelCarrier kinds are keel, onchfs, ipfs, and https. IPNS and Arweave are additional viewer source or gateway schemes, not KeelCarrier variants. Every retrieved byte must still satisfy its committed digest; availability is measured separately."},{"title":"Inline, Hybrid, and IPFS are read paths","body":"Inline returns the complete onchain-assembled data:text/html animation_url with no gateway, IPFS, /content, or RPC fetch. Hybrid can still be fully native KEEL storage: its boot shell resolves exact objects through an RPC reader. IPFS is a separate explicit choice and is never inferred from Hybrid."},{"title":"Compress the graph, not the boot shell","body":"The Solidity builder reads the root HTML directly; it does not decompress Brotli. A committed browser/WASM decoder verifies and expands compressed child modules and assets. Inline is recommended only after the complete document passes the 2 MB reconstruction and 30M-gas public-RPC read gates."}]},{"id":"viewer-surfaces","title":"SDK and Studio surfaces","intro":"The same verification contract is used by libraries, Studio, and portable hosts.","cards":[{"title":"SDK","body":"@keel/sdk/presentation publishes the shared Boot shell, Resource graph, Browser decoder, Inline, Hybrid, and IPFS language plus the fail-closed Inline assessment. @keel/viewer supplies readers, resolver, sandbox, mount, bridges, capability policy, and verification state; @keel/protocol supplies manifest and integrity rules."},{"title":"Studio","body":"Content, on-chain, contract-call, manifest, presentation, Tezos view, and viewer context routes perform bounded host work. The index remains a discovery accelerator rather than a render root."}]},{"id":"viewer-evidence","title":"Exact evidence","intro":"Tests are split between pure resolution, adversarial boundaries, browser mounting, chain storage, and Tezos mockup reconstruction.","cards":[{"title":"Viewer and protocol","body":"Resolution, readers, sandbox, browser, capability, host bridge, presentation bridge, adversarial boundary, content cache, and frozen datasets have focused SDK suites.","source":"keel-sdk/tests/viewer.test.mjs; readers.test.mjs; sandbox-browser.test.mjs; capability-policy.test.mjs; host-bridge.test.mjs; presentation-bridge.test.mjs; adversarial-boundary.test.mjs"},{"title":"EVM storage","body":"Hold, flat reads, Index, harness gas, and tokenURI gas have focused Foundry suites plus a recorded Sepolia module deployment.","source":"keel-contracts/test/modules/keel-hold/; modules/keel-hold/deployments/11155111.json"},{"title":"Tezos browser","body":"The local gate compiles SmartPy, runs shared vectors and Octez mockup operations, builds the interactive ZIP, and requires Chromium verification. It explicitly labels the positive lane as mockup replay.","source":"vault-tezos/README.md; scripts/test-local.sh; scripts/test-interactive-browser.mjs"}]}],"related":["proof-status","anchoring","sdk"]},{"slug":"rights-parts","navTitle":"Rights + parts","eyebrow":"Composable work and bounded permission","title":"Compose rights, modules, equipment, and stake state.","summary":"Attribution, IP policy, graph/library/plugin trust, equipment, and stake objects compose reusable work while keeping each source, permission, runtime capability, and custody transition explicit.","thesis":"A person can be credited without owning, a token can be owned without licensing, a module can be verified without deployment, and a part can be equipped without becoming the host token.","audience":["Creators","Rights integrators","Module authors","Game and collection developers"],"sections":[{"id":"rights-model","title":"Data and state model","intro":"Five independent models meet at composition time.","cards":[{"title":"Attribution","body":"Object/viewer, creator, subject, role label, attestation state, active/deactivated state, and timestamp record contribution without granting another authority."},{"title":"Rights","body":"Policy/version, controller, rights object, license, access mode, action scope, token gate, recipient, nonce, deadline, and evidence bind what may be done."},{"title":"Graph and module trust","body":"Graph/version, manifest and resource digests, module/plugin/library identity, exact bytes, ABI/adapter, permissions, target/code hash, review status, reason, and replacement define reusable code."},{"title":"Equipment","body":"Definition, slot, source object/revision, descriptor commitment, backed token custody, loadout, reservation, capacity, consumed state, and visual digest define an equipped part."},{"title":"Stake object","body":"Host token, staked token, manager policy, runtime code/revision, seed, arguments, variables, lockup, counters, and active custody define a temporary runtime attachment."}]},{"id":"rights-operations","title":"Reads, writes, and authority","intro":"Each plane has its own controller and its own failure mode.","cards":[{"title":"Attribution writes","body":"Creators attest labels; contributors may self-claim visibly unverified labels; records deactivate rather than disappear. Neither path grants edit, ownership, runtime, or license authority."},{"title":"Rights writes","body":"Controllers publish policies and grants; users execute only an exact active action; wrapped custody and token gates are checked at execution time.","code":"policy + version\nrecipient + action scope\ntoken gate + nonce + deadline\ncurrent authorization check\nexact executor call or rejection"},{"title":"Module/plugin writes","body":"Publishers submit exact graph versions; reviewers sanction/deprecate/revoke; hosts re-derive current graph, permissions, code, target, ABI, adapter, and status before an operation."},{"title":"Equipment/stake writes","body":"Token owners approve custody and mutate loadouts or stake state. Collection controllers curate compatibility. Verified managers enforce reservation, lock, runtime, and return policy."}]},{"id":"rights-security","title":"Failure and security boundaries","intro":"Composition must never create authority by implication.","cards":[{"title":"Ownership is not a license","body":"Holding or wrapping a token does not automatically authorize download, remix, remint, commercial use, or delegation."},{"title":"Attribution is not edit authority","body":"A credited artist, engineer, partner, or contributor cannot revise the object unless the separate edit policy allows it."},{"title":"Review status is not enough","body":"A sanctioned plugin or module is usable only when every exact graph binding, code identity, permission, target, and expiry still matches."},{"title":"Custody remains backed","body":"Equipment and stake managers recheck owners across external calls, reserve actual supply, clear state before transfer, and fail atomically on mismatch or exhaustion."}]},{"id":"rights-chains","title":"Ethereum and Tezos realizations","intro":"The conceptual planes match; standards and current deployment evidence differ.","cards":[{"title":"Ethereum","body":"Creator identity, graph, equipment, and IP-control modules have recorded Sepolia deployment data. Stake-object source/tests exist without a module deployment record.","status":"Partial","source":"keel-contracts/modules/keel-creator-identity; keel-graph; keel-equipment; keel-ip-control; keel-stake"},{"title":"Tezos","body":"Creator profiles/attribution, graph/library/plugin review, IP policies/licenses/gates/wrapped FA2/actions, equipment/reservations, and stake objects have local SmartPy sources and scenarios.","status":"Implemented locally","source":"vault-tezos/contracts/keel_creator_profile.py; keel_graph.py; keel_ip_*.py; keel_equipment.py; stake_object.py"}]},{"id":"rights-surfaces","title":"SDK and Studio surfaces","intro":"Portable declarations travel through the builder; live authority is rechecked at use time.","cards":[{"title":"SDK","body":"@keel/protocol defines attribution, IP control, project-stack composition, capability policy, module indexes, and stake objects. @keel/sdk builds module review and wallet request envelopes."},{"title":"Studio","body":"Creator profiles, module/library catalogs, access-policy records, IP download actions, project composition, equipment/stake preparation, and viewer overlays expose these planes to users."}]},{"id":"rights-evidence","title":"Exact evidence","intro":"Contract and SDK lanes are separately testable.","cards":[{"title":"EVM","body":"Identity, graph, equipment, stake, and IP-control focused Foundry tests exercise the native state transitions.","source":"keel-contracts/test/modules/keel-creator-identity/; keel-graph/; keel-equipment/; keel-stake/; keel-ip-control/"},{"title":"Tezos","body":"Creator, graph, equipment, stake, IP-control, and IP-action SmartPy scenarios exercise native counterparts.","source":"vault-tezos/tests/test_keel_creator_profile.py; test_keel_graph.py; test_keel_equipment.py; test_stake_object.py; test_keel_ip_control.py; test_keel_ip_action_executor.py"},{"title":"Studio","body":"Creator-profile, library/catalog, module-catalog, and identity tests cover product projections rather than contract authority.","source":"keel-site/apps/studio/tests/unit/creator-profile.test.ts; library-catalogue.test.ts; library-presentation.test.ts; verified-module-catalog.test.ts; public-identity-service.test.ts"}]}],"related":["contracts","apps","viewer-storage"]},{"slug":"apps","navTitle":"Apps + FRAY","eyebrow":"Products built from modules","title":"Integrate an application profile or FRAY release.","summary":"The contract manifests declare CoolS, Canvas, LINE, Onchaininator, and Vault Runner application profiles with uneven source, test, and deployment evidence. FRAY is a separate source-bound contest service and release classification integrated into Keel.","thesis":"A product can prove one demanding slice without making every underlying module, chain, market, or release path complete.","audience":["Collectors","Creators","Application developers","Product reviewers"],"sections":[{"id":"app-model","title":"Shared data and state model","intro":"Applications bind product-specific state back to exact Keel identities.","cards":[{"title":"Collection applications","body":"Collection/token, permanent seed, artifact/viewer/presentation revisions, renderer/code identity, release/access policy, and conventional metadata form the collectible surface."},{"title":"Composable applications","body":"Source tokens, object revisions, graph edges, equipment/loadout, stake runtime, and visual context remain individually inspectable inside a composed result."},{"title":"Service applications","body":"FRAY binds source digest, chain/currency, unique/patron outcome, reserve, increment, timing, royalty, edition size, patron pricing, extension rules, participants, and settlement state."}]},{"id":"app-inventory","title":"Choose the application integration","intro":"Start with the product state your host must read or write. Each profile names its manifest, source/test boundary, deployment evidence, authority, and open constraints.","cards":[{"eyebrow":"Application manifest","title":"CoolS","body":"The app manifest and generated ABI describe a generative KEEL721 collection with a mint hook, target table, novelty ledger, visual registry, metadata renderer, release resolver, equipment provisioning, and freeze closure.","status":"Partial","facts":[{"label":"Source boundary","value":"The manifest declares keel-contracts/src/apps/cool-s, but that directory is absent in the inspected checkout."},{"label":"Manifest","value":"keel-contracts/apps/cool-s/keel.module.json"},{"label":"Tests","value":"The manifest declares keel-contracts/test/apps/cool-s; that path is absent in the inspected checkout. SDK ABI/readiness checks exist in keel-sdk/tests/cool-s-abi-conformance.test.mjs and keel-site/apps/studio/tests/unit/cool-s-sdk.test.ts."},{"label":"Deployment","value":"No app deployment JSON is present in the inspected checkout."}],"bullets":["The declared mint model binds seed, target-family selection, visual revision, renderer/viewer closure, and backed equipment provisioning.","The declared authority model keeps collection configuration, generator behavior, linked libraries, and freeze state separate.","Studio blocks release when viewer compatibility is false, and G0 entropy remains explicitly unproven."],"source":"keel-contracts/apps/cool-s/keel.module.json"},{"eyebrow":"Application manifest","title":"Keel Canvas","body":"The app manifest describes a shared canvas collection, renderer, splitter, composer, and mint controller for committed CoolS and LINE visual inputs.","status":"Specified","facts":[{"label":"Source boundary","value":"The manifest declares keel-contracts/src/apps/keel-canvas, but that directory is absent in the inspected checkout."},{"label":"Manifest","value":"keel-contracts/apps/keel-canvas/keel.module.json"},{"label":"Tests","value":"The manifest declares keel-contracts/test/apps/keel-canvas; that path is absent in the inspected checkout."},{"label":"Deployment","value":"No app deployment JSON is present in the inspected checkout."}],"bullets":["The declared read model includes source-token bindings, split/composition state, and rendered output.","The declared authority model gives the token/controller only the named source-input and mint-policy transitions.","Source, tests, and deployment proof are required before presenting these declared behaviors as implemented."],"source":"keel-contracts/apps/keel-canvas/keel.module.json"},{"eyebrow":"Application manifest","title":"LINE","body":"The app manifest describes a KEEL721-derived line collection with an on-chain thumbnail object and renderer designed to compose through Canvas interfaces.","status":"Specified","facts":[{"label":"Source boundary","value":"The manifest declares keel-contracts/src/apps/line, but that directory is absent in the inspected checkout."},{"label":"Manifest","value":"keel-contracts/apps/line/keel.module.json"},{"label":"Tests","value":"The manifest declares keel-contracts/test/apps/line; that path is absent in the inspected checkout."},{"label":"Deployment","value":"No app deployment JSON is present in the inspected checkout."}],"bullets":["The declared read model includes token ownership, thumbnail source, and renderer result.","The declared authority model keeps collection mint/renderer control separate from Canvas consumption.","A thumbnail remains a rendition, but source and tests are required before claiming exact implementation behavior."],"source":"keel-contracts/apps/line/keel.module.json"},{"eyebrow":"Application manifest","title":"Onchaininator","body":"The app manifest describes a preservation token, factory, and proof ledger for a source ERC-721. Its contract and deployable lists drift around PreservationBounty and OnchaininatorProofRenderer, so neither is treated as a current deployable fact.","status":"Specified","facts":[{"label":"Source boundary","value":"The manifest declares keel-contracts/src/apps/onchaininator, but that directory is absent in the inspected checkout."},{"label":"Manifest","value":"keel-contracts/apps/onchaininator/keel.module.json"},{"label":"Tests","value":"The manifest declares keel-contracts/test/apps/onchaininator; that path is absent in the inspected checkout."},{"label":"Deployment","value":"No app deployment JSON is present in the inspected checkout."}],"bullets":["The declared read model binds original collection/token identity, preserved artifact, and proof state.","Publishing a preservation token and proof still requires exact source, tests, deployment, and receipt evidence.","A wrapped token does not transfer authorship or IP rights, and URI/pixel evidence remains separately labelled."],"source":"keel-contracts/apps/onchaininator/keel.module.json"},{"eyebrow":"Application manifest","title":"Vault Runner","body":"The EVM app manifest and generated ABI describe characters, mint seeds, sprite catalogs, packs, items, equipment, game cards, maps, achievements, auctions, deterministic runs, loot, leaderboards, and custody. The Tezos package contains the inspected native source and tests.","status":"Recorded testnet deployment","facts":[{"label":"EVM source boundary","value":"The manifest declares keel-contracts/src/apps/vault-runner and test/apps/vault-runner, but both paths are absent in the inspected checkout."},{"label":"EVM manifest","value":"keel-contracts/apps/vault-runner/keel.module.json"},{"label":"EVM deployment","value":"keel-contracts/apps/vault-runner/deployments/11155111.json"},{"label":"Tezos source/tests","value":"vault-of-the-fallen/packages/vault-tezos/contracts/vault.py; tests/test_vault.py; tests/test_vault_hardcore.py; tests/test_stake_object.py"}],"bullets":["The declared EVM model and implemented Tezos model bind character seed, catalog revisions, loadout, map build/root, run commitments, score policy, and custody outcome.","The Tezos implementation separates player authorization, collection/map/game authority, and signature-reporting scopes.","The leaderboard and hardcore result remain signer-trusted, commit-reveal is not VRF, and Tezos positive browser evidence is Octez mockup replay rather than accepted Shadownet release proof."],"source":"keel-contracts/apps/vault-runner/keel.module.json; vault-of-the-fallen/packages/vault-tezos/README.md"},{"eyebrow":"Service relationship","title":"FRAY is a service relationship, not a contract app","body":"FRAY is a source-bound timed contest and release classification integrated through its own auction contracts and indexer. Keel prepares, displays, verifies, and hands off the full policy; it does not redefine FRAY as storage, OneMint, or KeelMarket.","status":"Partial","facts":[{"label":"Policy source","value":"keel-sdk/packages/sdk/src/fray-auction-intent.ts"},{"label":"Agent source","value":"keel-sdk/packages/mcp/src/fray-agent.ts; keel-sdk/skills/fray-keel-agent/SKILL.md"},{"label":"Studio source","value":"keel-site/apps/studio/src/server/services/fray-contract-service.ts; apps/studio/src/app/fray/; apps/studio/src/app/studio/fray/new/"},{"label":"Tests","value":"keel-sdk/tests/sdk-fray-auction-intent.test.mjs; mcp-fray-auction-intent.test.mjs; keel-site/apps/studio/tests/unit/fray-tabs-accessibility.test.ts"}],"bullets":["A FRAY binds the exact source digest and full chain/currency/reserve/increment/timing/royalty/patron/edition/pricing/extension policy.","Quick test is bidder-only; Standard and Collector add visible patron-edition economics. Preset labels are shorthand, never authority.","The current EVM contract/indexer room does not prove a live Tezos contest; a prepared intent is not a published auction; the agent never signs or spends."],"source":"keel-sdk/packages/sdk/src/fray-auction-intent.ts"}]},{"id":"app-operations","title":"Reads, writes, and authority","intro":"Product actions stay within the module that owns their state.","cards":[{"title":"Collection actions","body":"Mint, transfer, freeze, presentation revision, and equipment configuration use collection/factory/mint/presentation/equipment authority rather than application-server flags."},{"title":"Game actions","body":"Stake, enter, authorize session, report result, resolve custody, extract loot, and update leaderboard each have separate exact state and role requirements."},{"title":"FRAY actions","body":"Prepare source and full policy, inspect live contest state, choose bidder or patron side, simulate the exact contract call, approve in the wallet, and confirm the receipt. Preparation alone performs no spend.","code":"const intent = materializeFrayAuctionIntent({\n  source,\n  family: \"ethereum\",\n  network: \"sepolia\",\n  chainId: 11155111,\n  presetId: 2,\n});"}]},{"id":"app-security","title":"Failure and security boundaries","intro":"Applications inherit every proof boundary of their dependencies.","cards":[{"title":"No release by appearance","body":"A rendered preview, local collection, prepared FRAY, or deployment JSON is not a live independently verified release."},{"title":"No silent source substitution","body":"A thumbnail, preview, generated placeholder, indexer record, or stale carrier must not replace the exact committed work."},{"title":"No authority blending","body":"Artist profile, collection admin, game reporter, module reviewer, marketplace operator, FRAY indexer, and Studio operator remain separate actors."}]},{"id":"app-chains","title":"Ethereum and Tezos realizations","intro":"Vault is the deepest dual-family application; the other app manifests are currently EVM-centered.","cards":[{"title":"Ethereum","body":"All five app profiles have EVM manifests, but the manifests' declared src/apps and test/apps paths are absent in the inspected checkout. Vault Runner alone has a tracked Sepolia deployment JSON. The other four have no checked app deployment record here.","status":"Partial"},{"title":"Tezos","body":"Vault has a native FA2/SmartPy game lane and local browser package. FRAY policy supports Tezos terms, but accepted live Tezos contest execution is not established here.","status":"Partial"}]},{"id":"app-surfaces","title":"SDK and Studio surfaces","intro":"Apps reuse the same manifests, viewer, receipts, catalogs, and wallet boundaries.","cards":[{"title":"SDK","body":"Generated app ABIs, CoolS readiness checks, Sprite Codex, stake-object model, FRAY intent policy, wallet requests, and viewer adapters expose app-specific behavior without baking it into the core protocol."},{"title":"Studio","body":"Public app/gallery/collection/FRAY/market/leaderboard pages and creator preparation routes project exact product state while keeping unavailable sources and partial feeds visible."}]},{"id":"app-evidence","title":"Exact evidence boundary","intro":"Application status is intentionally uneven.","cards":[{"title":"Vault Runner","body":"A tracked EVM Sepolia deployment manifest plus Tezos source, SmartPy scenarios, and local/mockup browser evidence. The EVM app source/test paths are absent, and this does not establish accepted cross-chain release parity.","status":"Partial"},{"title":"CoolS","body":"Manifest, generated ABI/readiness tests, and an explicit Studio release blocker. The declared app source/test paths are absent; entropy/fairness and public deployment remain separate proof gates.","status":"Partial"},{"title":"Canvas, LINE, Onchaininator","body":"Manifests describe these apps, but their declared source/test directories and deployment records are absent in the inspected contract checkout. Onchaininator's contract/deployable lists also drift around bounty and proof-renderer names.","status":"Specified"},{"title":"FRAY","body":"Policy and MCP tests plus EVM contract/indexer product integration. A prepared/test room is not an independently published contest, and Tezos execution remains separate.","status":"Partial"}]}],"related":["rights-parts","studio","native-chains"]},{"slug":"proof-status","navTitle":"Proof + status","eyebrow":"Evidence discipline","title":"Record and present reproducible proof status.","summary":"Keel evidence is recorded on independent axes: retrieval and integrity, observation source, verifier trust class, and availability. Browser reproduction and deployment receipts are additional evidence records, not steps on one ladder.","thesis":"Evidence never promotes itself. Every badge names the exact claim, evidence source, environment, revision, and remaining limitation.","audience":["Everyone reading technical claims","Reviewers","Operators","Collectors checking a work"],"sections":[{"id":"proof-model","title":"Proof and status model","intro":"Status records should be structured enough to reproduce, not merely persuasive copy.","cards":[{"title":"Claim","body":"One precise proposition such as decoded bytes match, presentation is current, route is immutable, supply policy is bounded, module bytes reproduce, or a deployment exists at an address.","code":"{\n  \"claim\": \"decoded bytes match\",\n  \"status\": \"bytes-verified\",\n  \"environment\": \"local-browser\",\n  \"evidenceDigest\": \"sha256:…\",\n  \"limitation\": \"not a live deployment check\"\n}"},{"title":"Evidence","body":"Source path, test command/result, manifest/receipt digest, chain/network/block, contract/code identity, transaction, browser build, verifier route, timestamp, and critic verdict support that one claim."},{"title":"Limitation","body":"Unqueried chain families, trusted RPC, missing adapter, unavailable carrier, local-only browser, absent deployment record, pending critic, or unsupported operation stay beside the claim."}]},{"id":"evidence-axes","title":"Independent evidence axes","intro":"Each axis answers a different question. Passing one axis never promotes or fills in another.","cards":[{"title":"Retrieval and integrity","body":"Record whether a source is only declared, whether the decoded bytes match the exact length and digest, and whether those bytes are bound to the inspected object, registry, revision, viewer, collection, token, and active presentation.","bullets":["Declared means a manifest or registry names a source; it is not yet verified.","Bytes verified means the retrieved, decoded bytes match the committed length and digest.","Registry-bound means those exact bytes and identifiers match the exact state and revision inspected."]},{"title":"Observation source","body":"Name how state was observed: local scenario or mockup, a pinned trusted RPC response, or a chain receipt and re-read. An observation describes the source of the evidence; it does not choose the verifier trust class for an anchor.","status":"Partial"},{"title":"Verifier trust class","body":"An anchor route declares native, optimistic, attested, or client verification. Record the exact verifier route and version. Native checks same-chain state; attested depends on the named signer or service policy; client depends on the local verifier. The repositories define an optimistic extension point, but no concrete optimistic adapter is currently claimed here.","status":"SDK / contract"},{"title":"Availability","body":"Record whether a usable carrier was observed and when. A matching hash, CID, portable root, registry binding, or anchor proves no present availability by itself. Replication and monitoring improve availability without changing object identity.","status":"Partial"},{"title":"Browser reproduction","body":"A loaded browser can reproduce an exact named fixture, build, viewport, and assertion set. That proves the described local or mockup browser behavior; it does not prove a public deployment or an unqueried chain.","status":"Browser-proven locally"},{"title":"Deployment record and fresh read","body":"A repository record may name network, address, code identity, block, and transaction. Preserve that as a recorded deployment. Only a fresh independent chain re-read can establish current code, configuration, roles, and observable state.","status":"Recorded testnet deployment"}]},{"id":"proof-operations","title":"Reads, writes, and authority","intro":"Proof state is generated by several actors with bounded roles.","cards":[{"title":"Verifier reads","body":"Read the exact manifest, bytes, current registry/presentation, code identity, verifier route, proof payload, chain block, and status record needed for the claim."},{"title":"Evidence writers","body":"Builders write local receipts, publishers write objects/anchors, contracts emit events, indexers project events, attestors sign scoped reports, browser tests write screenshots/results, and independent critics judge promotion."},{"title":"Promotion authority","body":"No worker approves its own work. A stronger public status requires the independent role and evidence defined for that gate."}]},{"id":"proof-security","title":"Failure and security boundaries","intro":"Unknown and failed are useful results.","cards":[{"title":"Unknown stays unknown","body":"Absent supply, burn, cap, upgrade, or mint-authority evidence is not zero and is not automatically green or red."},{"title":"Availability is separate","body":"A matching hash, CID, or anchor can be correct while every carrier is unavailable. Replication contributes availability without changing authenticity."},{"title":"Integrity is separate from safety","body":"Exact hostile code can still attack the host if the sandbox, bridge, capabilities, and wallet boundary are wrong."},{"title":"Local is separate from live","body":"Source, unit tests, local chain, mockup, browser harness, testnet record, fresh testnet read, mainnet, and public deployment are separate evidence scopes."}]},{"id":"proof-chains","title":"Ethereum and Tezos evidence","intro":"Parity is a checklist, not a shared adjective.","cards":[{"title":"Ethereum","body":"Foundry suites, generated ABIs, module deployment JSON, SDK adapter tests, and Studio EVM browser paths are distinct evidence sources. A deployment JSON is not a fresh RPC verification."},{"title":"Tezos","body":"SmartPy scenarios, shared vectors, Octez mockup operations, interactive ZIP/browser checks, and any remote Shadownet operation are separate. Current package documentation withholds release approval."}]},{"id":"proof-surfaces","title":"SDK and Studio surfaces","intro":"Proof presentation derives labels from evidence instead of trusting arbitrary flags.","cards":[{"title":"SDK","body":"Verification shell, source verification, collection verification, module assurance, build receipts, wallet-plan verification, and proof presentation provide machine-checkable inputs."},{"title":"Studio","body":"Trust, collection, object, artifact, module, preservation, anchor, and system views should show claim, evidence, environment, status, limitation, and reproduction path without horizontal comparison tables."}]},{"id":"proof-evidence","title":"Exact evidence sources","intro":"These are the principal executable lanes named by the current repositories.","cards":[{"title":"Module assurance","body":"Source/output/recipe/receipt/catalog tamper drills and public reproduction.","source":"keel-sdk/docs/KEEL_MODULE_ASSURANCE.md; tests/keel-module-assurance.test.mjs; tests/keel-modules-reproduction.test.mjs"},{"title":"Trusted runtime","body":"Host bridge, capabilities, sandbox clamp, frozen datasets, module review, adversarial boundary, and browser behavior.","source":"keel-sdk/docs/KEEL_TRUSTED_RUNTIME_INVENTORY.md; tests/adversarial-boundary.test.mjs; sandbox-browser.test.mjs"},{"title":"Contracts and chains","body":"Focused Foundry modules, Tezos SmartPy scenarios, Octez mockup gate, and repository deployment records.","source":"keel-contracts/test/modules/; vault-tezos/tests/; vault-tezos/scripts/test-local.sh; keel-contracts/modules/*/deployments/"}]}],"related":["anchoring","native-chains","contracts"]}]}