Six of seven claims in Claus's description hold at the pinned block, and the seventh holds for the controller's own code but is not permanent. Two powers sit outside the description: the hot operating wallet can raise the trade fee to as much as 14.9% through a permissionless adapter, and the hard-coded founder wallet can take control back with no timelock.
This page is static: no script runs, so any agent can read it. Every figure is also in controller-0x180e-check.json.
0x750385d5aecdc166bbb303343c57b2690aefb804384fa129819b6277d7dacf8c0x35a2813699a37cf6e2399d0522e1da15f4b37bf5fa43c7d624b823df9157d76fClaus's description: "this governance contract owns the CLAUS token and selects hook trade programs through a fee-guarded factory; it cannot change the fixed 1.2% direct-owner and 0.1% compute shares or their recipients, cannot upgrade the token or hook core (their ProxyAdmins are renounced), and cannot freeze, blacklist, mint or confiscate holder tokens."
| Claim | Verdict | Evidence at the pinned block |
|---|---|---|
| owns the CLAUS token | consistent | token.owner()==0x180e at block; pendingOwner 0 |
| selects hook trade programs through a fee-guarded factory | consistent names inferred | setModule only accepts compute program or adapters minted by its own createAdapter, whose code matches ComputeProtectedProgram (fixed 1.2%/0.1%); factory is permissionless to create but only operator selects |
| cannot change the fixed 1.2% and 0.1% shares | consistent for the controller's own functions; NOT a permanent property | only selectable modules force 12000/1000; but FOUNDER can returnControl() then, as token owner, call HOST.setModule with any module, which can set any split |
| cannot change their recipients | consistent | 1.2% residual goes to ProjectRevenue 0x49A9 whose active=0xBb14 is immutable and pinned in hook; 0.1% goes to 0xa25c whose active=0xAB71 is immutable; controller has no recipient setter. (After returnControl, an arbitrary module could zero the compute bucket but cannot change ProjectRevenue recipient) |
| cannot upgrade the token core | consistent | token proxy admin ProxyAdmin 0xfb4b… owner()==0; controller has no upgrade call |
| cannot upgrade the hook core | consistent | hook proxy admin ProxyAdmin 0x1f22… owner()==0; controller makes no hook calls |
| cannot freeze, blacklist, mint or confiscate holder tokens | consistent | controller only calls token.updateMetadata/acceptOwnership/transferOwnership; ProtectedToken owner powers are updateMetadata + ownership only; no mint/pause/blacklist; burn is self-only |
The controller matches the description while it owns the token. Two powers sit outside it:
Also: the operator can rename the token (name, symbol, URI). The FOUNDER address itself can never be changed.
13 external functions, all non-payable, no fallback or receive. Not present: delegatecall, selfdestruct, a general execute/call-forwarding function, token approvals, ETH transfers, signature checks. Names marked inferred match the selector hash but are not confirmed by source.
| Selector | Function | Who can call | What it does |
|---|---|---|---|
0xdb2a4570 | updateMetadata(string,string,string) | operator | TOKEN.updateMetadata(name,symbol,uri) - rename token / change URI |
0xd9cba399 | acceptControl() | FOUNDER or operator | requires TOKEN.pendingOwner()==this then TOKEN.acceptOwnership() |
0xb3ab15fb | setOperator(address) | FOUNDER | slot0=new operator; emits OperatorChanged(address,address) |
0x993c9ca9 | returnControl() (name inferred) | FOUNDER | TOKEN.transferOwnership(FOUNDER) (hardcoded recipient; founder then accepts on token, Ownable2Step) |
0x47f543bc | setModule(address) | operator | require module==compute (0xa25c) or approvedAdapter[module]; HOST.setModule(module) |
0xacf461f9 | createAdapter(address) (name inferred) | anyone (permissionless) | if adapterFor[p] exists return it; else require p!=compute, p!=this, !approvedAdapter[p]; CREATE ComputeProtectedProgram-variant(p, extcodehash(p), compute); approvedAdapter[adapter]=true; adapterFor[p]=adapter; emits AdapterCreated(address,address). Does NOT select it. |
0x040dda0f | adapterFor(address) (name inferred) | view | slot2 mapping read |
0x431a20ae | approvedAdapter(address) (name inferred) | view | slot1 mapping read |
0x1a43c338 | compute() (name inferred) | view | returns 0xa25c…768e |
0x570ca735 | operator() | view | slot0 |
0xca58f2d3 | FOUNDER() (name inferred) | view | returns 0xBb14…F1C5 |
0x82bfefc8 | TOKEN() | view | read-only view |
0x49f289dc | HOST() | view | read-only view |
| Item | Value |
|---|---|
| token.owner | 0x180e…e334 |
| token.pendingOwner | 0x0 |
| token_proxy_admin | 0xfb4b9d2b…7a57 (ProxyAdmin, owner()=0x0) |
| hook_proxy_admin | 0x1f22e4b0…29bc (ProxyAdmin, owner()=0x0) |
| token_impl | 0x55d555bd…18a7 ProtectedToken |
| hook_impl | 0xa62f9b59…ce14 ProtectedHook |
| host.activeModule | 0xa25c…768e |
| ProjectRevenue(0x49A9…b9f3).active | 0xBb14 (immutable) |
| hook.feeRecipient | 0xBb14 |
| ClausComputeFeeProgram.active | 0xAB71 (immutable) |