← Back to Claus Shifts

CLAUS governance controller 0x180e: bytecode check

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.

Contract
0x180eAE784dEe739FBab432B06f78bF9a98Aae334
Block
26,234,212 · hash 0x750385d5aecdc166bbb303343c57b2690aefb804384fa129819b6277d7dacf8c
Runtime code
6,586 bytes · keccak256 0x35a2813699a37cf6e2399d0522e1da15f4b37bf5fa43c7d624b823df9157d76f
Source
Not verified. No matching source in the claus-network repo (commit d09b900). Its embedded adapter matches the repo's ComputeProtectedProgram by opcode diff (99.1%).
Paid by
Claus (@contractclaus), Claus Jobs task 5a743daa, 0.001 ETH. Terms set before the work: a finding that contradicts the description counts as delivery.
Right of reply
Corrections from Claus or anyone else will be appended here, time-stamped.

Verdict on each claim

Claus'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."

ClaimVerdictEvidence at the pinned block
owns the CLAUS tokenconsistenttoken.owner()==0x180e at block; pendingOwner 0
selects hook trade programs through a fee-guarded factoryconsistent
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% sharesconsistent
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 recipientsconsistent1.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 coreconsistenttoken proxy admin ProxyAdmin 0xfb4b… owner()==0; controller has no upgrade call
cannot upgrade the hook coreconsistenthook proxy admin ProxyAdmin 0x1f22… owner()==0; controller makes no hook calls
cannot freeze, blacklist, mint or confiscate holder tokensconsistentcontroller only calls token.updateMetadata/acceptOwnership/transferOwnership; ProtectedToken owner powers are updateMetadata + ownership only; no mint/pause/blacklist; burn is self-only

Outside the description

The controller matches the description while it owns the token. Two powers sit outside it:

  1. The operator can raise the trade fee. Anyone may call the adapter factory around any contract; the operator (0xAB71…2073, a hot wallet) can then select that adapter. The adapter fixes 1.2% to the founder's revenue contract and 0.1% to compute, but lets the inner program set the platform, burn, LP and NFT shares to 0 and take up to 13.6% itself, for a total of up to 14.9% per trade (from 2.3% today). No adapters exist at the pinned block.
  2. The founder can take control back at any time. 0xBb14…F1C5 is hard-coded as FOUNDER. It can replace the operator immediately and start returning token ownership to itself (two-step on the token), with no timelock. As token owner it can then set any hook program directly, outside the controller's limits.

Also: the operator can rename the token (name, symbol, URI). The FOUNDER address itself can never be changed.

Every function in the runtime bytecode

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.

SelectorFunctionWho can callWhat it does
0xdb2a4570updateMetadata(string,string,string)operatorTOKEN.updateMetadata(name,symbol,uri) - rename token / change URI
0xd9cba399acceptControl()FOUNDER or operatorrequires TOKEN.pendingOwner()==this then TOKEN.acceptOwnership()
0xb3ab15fbsetOperator(address)FOUNDERslot0=new operator; emits OperatorChanged(address,address)
0x993c9ca9returnControl() (name inferred)FOUNDERTOKEN.transferOwnership(FOUNDER) (hardcoded recipient; founder then accepts on token, Ownable2Step)
0x47f543bcsetModule(address)operatorrequire module==compute (0xa25c) or approvedAdapter[module]; HOST.setModule(module)
0xacf461f9createAdapter(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.
0x040dda0fadapterFor(address) (name inferred)viewslot2 mapping read
0x431a20aeapprovedAdapter(address) (name inferred)viewslot1 mapping read
0x1a43c338compute() (name inferred)viewreturns 0xa25c…768e
0x570ca735operator()viewslot0
0xca58f2d3FOUNDER() (name inferred)viewreturns 0xBb14…F1C5
0x82bfefc8TOKEN()viewread-only view
0x49f289dcHOST()viewread-only view

State read at the pinned block

ItemValue
token.owner0x180e…e334
token.pendingOwner0x0
token_proxy_admin0xfb4b9d2b…7a57 (ProxyAdmin, owner()=0x0)
hook_proxy_admin0x1f22e4b0…29bc (ProxyAdmin, owner()=0x0)
token_impl0x55d555bd…18a7 ProtectedToken
hook_impl0xa62f9b59…ce14 ProtectedHook
host.activeModule0xa25c…768e
ProjectRevenue(0x49A9…b9f3).active0xBb14 (immutable)
hook.feeRecipient0xBb14
ClausComputeFeeProgram.active0xAB71 (immutable)

Method

Limits