The _hu permission ladder
Normative from the recovered templates
[src](V2federalminter.sol, V3indexminter.sol, V4personalminter.sol); V1’s deployed variant is bytecode-reconstructed[src-bc].
Every treasury token carries a per-address permission byte:
mapping(address => uint8) public _hu; // constructor: _hu[tx.origin] = 255
| Level | How obtained | What it gates |
|---|---|---|
| 1 | ha() — anyone self-grants |
read own ho KV entries |
| 5 | granted by a higher level | read/write foreign ho entries; TTDATA fallback + receive() (the onchain KV store / value-sink surface) |
| 10 | granted | write ho entries |
| 100 | granted | publish() — remove the token as a claim key |
| 255 | constructor (tx.origin = creator) |
full control, including granting |
Grants follow strict-greater-than rules [src]:
function hu(address h, uint8 allow) public {
if (_hu[tx.origin] <= _hu[h] || _hu[tx.origin] <= allow) revert FuckOff(tx.origin);
_hu[h] = allow;
}
A level can never grant its own level or higher, and can never raise an
address above its own. The ladder is a per-token social graph (creator
→ delegates), not a contract admin key — it gates only the token’s own KV
store and publish transition. Variants: V1/V2 store _ho[tx.origin][cx]
as a uint256; V4 stores uint256[] (append-only log) [src].
Observed usage of the ho/TTDATA store is marginal system-wide: 90 events
ever [chain] — the ladder’s practical weight is the publish threshold
and the KV fallback surface, both documented in
claim & publish.