Contract Analysis
DISCLAIMER // NFA // DYOR
This analysis is based on observations of the contract behavior. We are not smart contract security experts. This document aims to explain what the contract appears to do based on the code. It should not be considered a comprehensive security audit or financial advice. Always verify critical information independently and consult with blockchain security professionals for important decisions.
⊙ generated by robots | curated by humans
Analysis Date: 2026-08-09
Metadata
Primary Contract
| PROPERTY | VALUE |
|---|---|
| Contract Address | 0x0000006d...32a9a8 (etherscan) |
| Network | Ethereum Mainnet |
| Contract Type | Standalone ERC721 (Solady base) |
| Deployment Date | 2026-08-06 08:37:11 UTC |
| Deployment Block | 25,694,754 |
| Contract Creator | 0xacFbA7ce...de4082 (etherscan) |
| Creation TX | 0x8848f7d7...c82ec3 (tx) |
| Compiler Version | Solidity v0.8.36, optimizer on (200 runs), EVM target prague |
| Total Functions | 81 Application Binary Interface (ABI) entries, of which 35 are declared in this contract's own source |
| External Contract Dependencies | 7 |
| Upgrade Mechanism | ☒ None — the governor itself is not upgradable; two rendering dependencies are replaceable |
| Verification Status | ☑ Verified on Etherscan (exact match) |
| Audit Status | ☒ No audit report located |
Related Addresses
| TYPE | ADDRESS | NOTES |
|---|---|---|
Admin (dao) |
0x5E58BA0e...74053E (etherscan) |
Immutable. A 45-byte ERC-1167 clone of a Moloch implementation. Sole holder of onlyDAO |
Bond token (shares) |
0x00a6bA94...2dCb12 (etherscan) |
ZORG, "zOrg Shares". Also an ERC-1167 clone. Escrowed as bond weight |
Custody NFT (zorgz) |
0x00000000...6b63A6 (etherscan) |
zOrgz. One zOrgz is escrowed per bond; the receipt reuses its token id |
Registry (tokenList) |
0x00000060...531524 (etherscan) |
Read-only. Only isListed(uint256) is ever called. See the TokenList analysis |
Naming (weiNames) |
0x00000000...c242EB (etherscan) |
Wei Name Service. Holds zorg.wei; the emergency role is the exec.zorg.wei subdomain |
| Renderer | 0x0000006b...E29979 (etherscan) |
DAO-replaceable. Serves html(). Already swapped once, 2026-08-07 |
| Receipt art | 0x0000007f...DD1eD9 (etherscan) |
DAO-replaceable. Serves tokenURI(). Original deployment value, not yet changed |
| Deployer funder | 0x1C0Aa8cC...855A20 (etherscan) |
z0r0z's canonical Externally Owned Account (EOA). Sent 0.02 ETH to the deployer on 2026-08-03 |
Executive Summary
ZorgConviction applies Conviction Voting to the zFi TokenList registry. A holder locks one zOrgz NFT, an explicit amount of ZORG governance shares, and at least 0.01 ETH into the contract; in return the contract mints a transferable ERC721 receipt that reuses the escrowed zOrgz token id. The receipt is the only thing that can direct that bond's weight at a listing, so selling the receipt sells the position along with its withdrawal right.
The weight a receipt directs does not sit still. Each listing carries an accumulator that moves toward its live support by closing half the remaining gap every Conviction Half-Life — currently three days. The score a client reads (supportOf) is live direct support plus that accrued component, so a listing supported for a week outranks one that received the same allocation an hour ago, and support withdrawn decays away rather than vanishing.
The relationship to the registry is one-directional and narrow. ZorgConviction declares a single-method interface against TokenList and calls isListed(uint256) in exactly one place, to reject allocations to ids the registry does not carry. It never writes to the registry. TokenList's own ordering field, rank, remains onlyOwner under a separate 2-of-3 multisig. Two independent orderings therefore exist for the same set of listings: a curator-set weight stored in the registry, and a stake-weighted score stored here. Nothing on-chain reconciles them. A consumer that sorts "by conviction" is reading this contract and ignoring the registry's own field.
The Moloch DAO is an immutable, unbounded admin: it can execute arbitrary calls through the governor, subject to two invariants that protect escrowed ZORG and user ETH but leave everything else reachable. It can also install an emergency operator whose credential is a transferable name — whoever holds exec.zorg.wei can pause the system and, once paused, execute arbitrary calls under the same invariants. That role is not installed as of the snapshot. The escrow additionally depends on ZORG remaining transferable; the constructor refuses to deploy against a share token that is locked at deploy time, and the source states that the DAO locking it afterwards would make unbond impossible for bonds that already exist.
At the snapshot block there are 7 bonds across 4 addresses holding 371,470 ZORG (about 5.0% of supply), 0.07 ETH held against 0.07 ETH of recorded liabilities, and 8 listings carrying allocated weight. Two bonds have been made permanent through eternalize, which forfeits the zOrgz and ZORG and hands the ETH principal to the DAO. One of those — receipt 9953, held by 0x1C0Aa8cC...855A20 (etherscan) — was eternalized while still at lock tier 0, which pins its rate at 1.00× permanently. The contract is three days old, unaudited, and holds no upgrade path of its own.
Architecture
graph TB
subgraph Actors
H["Receipt Holder<br/>(4 addresses)"]
DAO["zOrg Moloch DAO<br/>0x5E58BA0e...74053E"]
EX["exec.zorg.wei holder<br/>NOT INSTALLED"]
end
subgraph Governor["ZorgConviction — 0x0000006d...32a9a8"]
RCPT["Receipt ERC-721<br/>id = escrowed zOrgz id"]
ESC["Escrow<br/>zOrgz + ZORG + ETH principal"]
CONV["Conviction ledger<br/>listingId to weight + accumulator"]
LOY["Loyalty accounting<br/>reward index + ETH credits"]
end
subgraph Deps["External Contracts"]
TL["TokenList<br/>0x00000060...531524"]
ZZ["zOrgz ERC-721<br/>0x00000000...6b63A6"]
SH["ZORG Shares<br/>0x00a6bA94...2dCb12"]
WNS["Wei Name Service<br/>0x00000000...c242EB"]
RN["Renderer (replaceable)"]
RA["ReceiptArt (replaceable)"]
end
H -->|"bondZorgz / topUpZorg"| ESC
H -->|"allocate"| CONV
H -->|"unbond / decreaseBond / claimLoyalty"| ESC
H -->|"eternalize — irreversible"| ESC
DAO -->|"execute, setHalfLife, setLockTier,<br/>setEthBondTerms, setRenderer,<br/>releaseTreasuryEth, resume"| Governor
DAO -.->|"installExecRoleName"| EX
EX -.->|"emergencyPause then emergencyExecute"| Governor
CONV -->|"isListed only"| TL
ESC --> ZZ
ESC --> SH
Governor --> WNS
Governor --> RN
Governor --> RA
TL -.->|"no write path"| TL
style CONV fill:#e1f0ff
style ESC fill:#ffe1e1
style EX fill:#fff4d6
System Overview
A bond is created by bondZorgz(receiptId, weight[, tier]). The caller must own the zOrgz with that id, must have approved both the zOrgz and the ZORG amount to the governor, and must send at least ethBondTerms.minimumBond (0.01 ETH) with the call. The contract pulls the ZORG, records the ETH as refundable principal with a 7-day maturity, pulls the zOrgz through a gated onERC721Received, and mints the receipt to the caller.
allocate(receiptId, listingId, amount) then points some or all of that bond at a listing. The sum of a receipt's allocations may never exceed its bonded weight, so each unit of weight has exactly one destination at a time. The amount recorded against the listing is the raw allocation scaled by the receipt's lock-tier boost, capped at 1.5×.
- Escrows three assets and enforces a one-source-per-unit accounting invariant on allocations.
- Lets holders exit:
decreaseBondreturns part of a bond,unbondburns the receipt and returns everything, and both remain callable while the contract is paused. - Does not write to TokenList — no path exists to change a listing's
rank. - Exposes no enumeration of receipts or listings. Iterating the set that carries support requires replaying
Allocatedlogs. - Verifies nothing about a listing beyond its presence in the registry. Conviction behind a token records who staked, not whether the token is sound.
Design Patterns Used
- Escrow receipt as authority: the receipt NFT, not the depositing address, holds the allocation right and the withdrawal right. Transferring it moves the whole position, so an address that has sold its stake retains no ability to direct that weight.
- Vote Escrow with a transferable position: longer lock tiers earn a larger multiplier on the same deposit, capped at 1.5×. Unlike veCRV the escrow receipt is an ordinary transferable NFT, so the locked voting position is itself a tradable asset.
- Terms snapshotting: lock tiers and ETH bond terms are DAO-configurable menus, but each receipt copies the terms it selected at mint. A later DAO change cannot rewrite a live holder's exit right, boost, or early-exit quote.
- Exponential decay with exact composition:
_advancecloses half the gap perhalfLifeusingpowWad(0.5e18, elapsed/halfLife). Because halving composes exactly, advancing once over a long interval equals advancing repeatedly over short ones, so repeatedallocatecalls against a listing change nothing. - Pull payments: ETH owed to a user is credited to
ethCreditsand withdrawn separately, so a recipient that rejects ETH cannot trap a zOrgz or its shares inside the governor. - Invariant assertion over denylist: the DAO's
executere-checks the governor's ZORG balance and total ETH liability after the call rather than relying only on forbidden targets. Moloch's public Ragequit burns the caller's shares, which would reduce escrow without either denylisted address appearing in the call. - Rendering split out of the core:
tokenURIandhtml()forward to separate contracts, which keeps the governor inside EIP-170. Runtime bytecode is 20,324 bytes, leaving 4,252 bytes of headroom.
Access Control
Roles & Permissions
| ROLE | ASSIGNED BY | REVOKABLE | CALL COUNT |
|---|---|---|---|
dao |
Constructor (immutable) | No — immutable, with no transfer or renounce path | Unlimited |
| Emergency operator | installExecRoleName by dao, one-shot; identity is whoever holds the exec.zorg.wei name |
Yes — burnExecRole() by dao, one-way |
Unlimited while installed and not revoked |
| Receipt holder | bondZorgz (mint), or receiving the receipt by transfer |
Yes — by transferring or burning the receipt | Unlimited, scoped to owned receipts |
| Anyone | — | N/A | View functions, plus claimZorgWei (already consumed) |
Permission Matrix
| FUNCTION | DAO | EMERGENCY OPERATOR | RECEIPT HOLDER | ANYONE |
|---|---|---|---|---|
bondZorgz |
☒ | ☒ | ☒ | ☑ (any zOrgz owner) |
allocate |
☒ | ☒ | ☑ | ☒ |
topUpZorg / increaseBond |
☒ | ☒ | ☑ | ☒ |
decreaseBond / unbond |
☒ | ☒ | ☑ | ☒ |
selectLockTier |
☒ | ☒ | ☑ | ☒ |
eternalize |
☒ | ☒ | ☑ | ☒ |
claimLoyalty |
☒ | ☒ | ☑ | ☒ |
withdrawEthCredit |
☒ | ☒ | ☒ | ☑ (own credit only) |
setHalfLife / setLockTier / setEthBondTerms |
☑ | ☒ | ☒ | ☒ |
setRenderer / setReceiptArt |
☑ | ☒ | ☒ | ☒ |
installExecRoleName / burnExecRole / resume |
☑ | ☒ | ☒ | ☒ |
releaseTreasuryEth |
☑ | ☒ | ☒ | ☒ |
execute |
☑ | ☒ | ☒ | ☒ |
emergencyPause |
☒ | ☑ | ☒ | ☒ |
emergencyExecute |
☒ | ☑ (only while paused) | ☒ | ☒ |
Time Locks & Delays
| ACTION | TIME LOCK | CAN CANCEL | PURPOSE |
|---|---|---|---|
DAO parameter changes (setHalfLife, setLockTier, setEthBondTerms, renderers) |
None at this contract; whatever delay the Moloch DAO imposes upstream | N/A | ☒ Immediate from the governor's perspective |
execute / emergencyExecute |
None | N/A | ☒ Immediate, bounded only by the two post-call invariants |
unbond on a tier-0 receipt |
None — callable immediately | N/A | ◇ Redeeming before the 7-day ETH maturity costs the 20% early-exit tax rather than being blocked |
unbond on a tier 1/2/3 receipt |
90 / 180 / 365 days from bond or last top-up | No | ☑ Hard commitment selected by the holder, snapshotted at bond time |
decreaseBond |
Later of the lock unlock time and the ETH maturity | No | ☑ The maturity gate blocks a top-up-and-exit harvest of pending early-exit taxes |
eternalize |
Permanent | No | ☒ Irreversible by design; no recovery path exists |
Economic Model
Funding Sources & Sinks
Three assets enter the contract and are accounted separately.
| ASSET | ENTERS VIA | LEAVES VIA | ACCOUNTING |
|---|---|---|---|
| ZORG shares | bondZorgz, topUpZorg / increaseBond |
decreaseBond, unbond |
bondedWeight[receiptId], summed in totalLoyaltyWeight |
| zOrgz NFT | bondZorgz (one per receipt) |
unbond only |
Implicit — custody is the escrow |
| ETH | bondZorgz (msg.value), bare receive() |
withdrawEthCredit, releaseTreasuryEth, DAO execute surplus |
totalEthPrincipal + loyaltyRewardReserve + treasuryEth + totalEthCredits |
Fee Structure
| FEE | AMOUNT | TRIGGER | RECIPIENT |
|---|---|---|---|
| Minimum ETH bond | 0.01 ETH (ethBondTerms.minimumBond) |
Every bondZorgz |
Held as refundable principal, returned in full at maturity |
| Early-exit tax | 20% of principal (earlyExitTaxBps = 2,000) |
unbond before maturityAt |
Split 50/50 (treasuryShareBps = 5,000) between treasuryEth and the loyalty pool |
| Eternalization forfeit | 100% of principal, plus the zOrgz and all bonded ZORG | eternalize |
ETH to treasuryEth; zOrgz and ZORG are permanently immobilised in the contract |
The DAO may rewrite all four ETH-bond parameters for future bonds. setEthBondTerms bounds maturity at 365 days and both bps figures at 10,000, but places no upper bound on minimumBond — only that it be non-zero. An earlyExitTaxBps of 10,000 (a 100% tax) is within range.
Economic Invariants
sum(allocationOf[receiptId][*]) == allocatedByBond[receiptId] <= bondedWeight[receiptId]. Enforced on everyallocateand re-checked ondecreaseBond.sum(bondedWeight) == totalLoyaltyWeight == ZORG balance of the contract. Verified at the snapshot: 371,470 ZORG on all three.address(this).balance >= totalEthPrincipal + loyaltyRewardReserve + treasuryEth + totalEthCredits. Asserted after everyexecuteandemergencyExecute. Verified at the snapshot: 0.07 ETH held against 0.05 + 0 + 0.02 + 0.- The ZORG balance may not decrease across a DAO
execute. Asserted directly. - A bond cannot be emptied by
decreaseBond—total == 0reverts, so a zero-weight receipt thatbondZorgzwould still read as unbonded cannot exist.
Live Position Snapshot
Block 25,714,806. Effective weight is the raw allocation scaled by the receipt's boost.
Listing ids for ordinary Ethereum tokens are the token address read as a number, so the id column below is the subject's own address. The Tacit entry is a foreign listing and carries a wider hashed id instead.
| LISTING ID | SUBJECT | EFFECTIVE WEIGHT | ACCRUED CONVICTION | SCORE |
|---|---|---|---|---|
0 |
ETH (native) | 156,850 | 11,031 | 167,881 |
0xe64b4fb0...086ae8 |
TAC — Tacit Coin, Bitcoin-rooted (tacitscan) | 127,500 | 17,053 | 144,553 |
0x00a6bA94...2dCb12 |
ZORG (etherscan) | 127,500 | 17,043 | 144,543 |
0x00000000...6b63A6 |
zOrgz (etherscan) | 1,432 | 200 | 1,632 |
0xC02aaA39...756Cc2 |
WETH (etherscan) | 900 | 372 | 1,272 |
0x7f39C581...5E2cA0 |
wstETH (etherscan) | 800 | 319 | 1,119 |
0xae7ab965...d7fE84 |
stETH (etherscan) | 750 | 188 | 938 |
0xae78736C...fc6393 |
rETH (etherscan) | 700 | 200 | 900 |
The second-largest concentration of conviction sits behind an asset with no Ethereum contract at all. TAC is the Tacit Coin listing, a Bitcoin-rooted asset the registry stores as a foreign listing with synced = false — its name, symbol and decimals were typed in by the curator rather than read from a token. Conviction weight does not change that.
Summary of Observations
The contract's scope is narrow. It escrows three assets, tracks who staked what behind which registry id, decays that support toward a target on a fixed half-life, and exposes the result as a read-only score. It does not touch the registry it reads from, and it custodies nothing it cannot return — with one deliberate exception. The accounting we could check holds exactly: bonded weight matches the ZORG balance, and the ETH balance matches recorded liabilities to the wei.
Three behaviours are worth isolating. Only allocation increases are gated on paused and on isListed, so a holder can always withdraw support from a listing that has been delisted or from a system that has been paused — which keeps a curator delisting or an emergency pause from becoming permanent confiscation of every bond pointed at that listing. The DAO's escape hatch asserts a balance invariant rather than relying on a denylist alone. The decay function uses exact halving rather than a rational approximation, and because halving composes exactly, repeated allocate calls against a listing change nothing.
The Moloch DAO is an immutable admin with an arbitrary-call function. The two invariants protect escrowed ZORG and user ETH but nothing else, and the escrowed zOrgz are protected by a target denylist rather than the same kind of assertion. The emergency operator role is a transferable name — whoever holds exec.zorg.wei can pause the contract and then execute arbitrary calls under those same invariants. That role is not installed at the snapshot, so the emergency path is currently unreachable; installing it is a single DAO call.
eternalize permanently forfeits the zOrgz and every bonded ZORG share, and it does not check the receipt's lock tier. selectLockTier refuses to run on an eternal bond, so a receipt eternalized at tier 0 is fixed at a 1.00× rate with no way to raise it. Receipt 9953, held by the address that funded the deployment, is in exactly that state with 10,000 ZORG behind it. A warning was added to the renderer's interface copy the next day, but the renderer is replaceable and the governor is not, so a later renderer can drop that warning while the behaviour underneath stays fixed.
Conviction here is advisory. supportOf is a number in this contract's storage; TokenList's rank is set by a 2-of-3 multisig and is unaffected by it. Whether a bonded position moves a token up a wallet or swap interface depends on that interface reading this contract rather than the registry's field, and the reference interface html() is served by a DAO-replaceable renderer that has already been swapped once. The stake is escrowed and time-locked; the effect it purchases is a convention, not an on-chain guarantee.
This analysis was performed for educational purposes. It is not a security audit and not financial advice. The contract is three days old at the time of writing, has no located audit, and has seen 7 bonds across 4 addresses — too little history to support any claim about how it behaves under adversarial conditions.
References
| RESOURCE | NOTES |
|---|---|
| ZorgConviction on Etherscan | Verified source, ABI, and event log |
| TokenList Contract Analysis | The registry this contract reads; explains listing ids, rank, and the multisig owner |
| zOrg Moloch DAO | The sole onlyDAO holder; ERC-1167 clone with 21 proposals at snapshot |
| Solady ERC721 | Base implementation; explains the non-sequential storage layout |
| Solady FixedPointMathLib | powWad, divWad, fullMulDiv — the decay and boost arithmetic |
| z0r0z Entity Profile | Deployment attribution and the wider zFi stack |
| EIP-1167: Minimum Proxy Contract | The clone pattern used by both the DAO and the ZORG share token |
| EIP-4906: Metadata Update Extension | The events this contract does not emit when setReceiptArt changes every receipt |
Change Log
| DATE | AUTHOR | NOTES |
|---|---|---|
| 2026-08-09 | Artificial. | Generated by robots. Gas: 385 tok |
| 2026-08-09 | Denizen. | Reviewed, edited, and curated by humans. |