Artifacts
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
| METADATA | |
|---|---|
| Contract Address | 0x0000006d...32a9a8 (etherscan) |
| Network | Ethereum Mainnet |
| Analysis Date | 2026-08-09 |
| Snapshot Block | 25,714,806 |
Runtime Bytecode
Deployed runtime is 20,324 bytes, 4,252 bytes under the EIP-170 ceiling of 24,576. Too large to inline; reproduce locally with the commands below.
Source: Etherscan — Contract Code
Command:
export ETH_RPC_URL=https://eth.llamarpc.com
cast code 0x0000006d936BA3653b8854490E16e782cd32a9a8
cast codesize 0x0000006d936BA3653b8854490E16e782cd32a9a8
Artifact (first 91 bytes of the dispatcher):
0x608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c908162c7f3fb14613f595750806301ffc9a714613f0c5780630223449b14613cc957806303314efa14613c85578063046f7da214613c06...
The dispatcher opens with a calldatasize check that falls through to the empty receive() body — the 36 15 61001a sequence — before entering the selector jump table. The table then runs in ascending selector order starting at 0x00c7f3fb (treasuryEth), consistent with solc's binary-search dispatcher for a contract with this many selectors.
Creation Bytecode
Deployment did not send init code directly. The creator Externally Owned Account (EOA) called a CREATE2 factory at 0x00000000...4e6f2a (etherscan), which produced the leading-zeros vanity address. The transaction input is therefore a factory call carrying the salt and the init code, not raw init code.
Source: Etherscan — Creation TX
Command:
export ETH_RPC_URL=https://eth.llamarpc.com
cast tx 0x8848f7d7d1aa67261ad987cc8c217a403a6ef95595ef819cf022c5a912c82ec3 input
Artifact (factory call header):
0x94d6f6d4
0000000000000000000000000000000000000000000000000000000000000040 # offset to initCode
68a0acf9d2df369c7a5d7e154476b222d56f2d398cb342f74db3b03c7834164b # CREATE2 salt
... # initCode + constructor args
Constructor arguments (decoded from the trailing 8 words of the init code):
dao_ = 0x5e58ba0e06ed0f5558f83be732a4b899a674053e # Moloch DAO clone
shares_ = 0x00a6ba94bbb5474725515de88fe04f854f2dcb12 # ZORG
zorgz_ = 0x00000000008835cef3e0d2333695f288ee6b63a6 # zOrgz ERC-721
weiNames_ = 0x0000000000696760e15f265e828db644a0c242eb # Wei Name Service
tokenList_ = 0x0000006013df75a31678b786061c2b54bf531524 # TokenList registry
renderer_ = 0x000000115b1b95b9e04128a2bcd9ed9d24ab141c # SUPERSEDED 2026-08-07
receiptArt_ = 0x0000007f4342bddda2a951b9e181b42328dd1ed9 # still current
halfLife_ = 0x000000000000000000000000000000000003f480 # 259200 seconds = 3 days
The renderer_ argument is the one value from this list that no longer matches on-chain state. See Renderer Replacement below.
Verify the constructor arguments independently:
cast call 0x0000006d936BA3653b8854490E16e782cd32a9a8 "dao()(address)"
cast call 0x0000006d936BA3653b8854490E16e782cd32a9a8 "shares()(address)"
cast call 0x0000006d936BA3653b8854490E16e782cd32a9a8 "zorgz()(address)"
cast call 0x0000006d936BA3653b8854490E16e782cd32a9a8 "weiNames()(address)"
cast call 0x0000006d936BA3653b8854490E16e782cd32a9a8 "tokenList()(address)"
cast call 0x0000006d936BA3653b8854490E16e782cd32a9a8 "renderer()(address)"
cast call 0x0000006d936BA3653b8854490E16e782cd32a9a8 "receiptArt()(address)"
cast call 0x0000006d936BA3653b8854490E16e782cd32a9a8 "halfLife()(uint64)"
Verified Source Code
Source verified on Etherscan as an exact match, compiled with solc v0.8.36+commit.8a079791, optimizer enabled at 200 runs, EVM target prague. Six files, of which one is the contract under analysis and the rest are Solady dependencies and two interface stubs.
Source: Etherscan — Contract Source
| FILE | LINES | ROLE |
|---|---|---|
src/dao/ZorgConviction.sol |
873 | The contract under analysis |
lib/solady/src/tokens/ERC721.sol |
914 | ERC-721 base, non-sequential storage |
lib/solady/src/utils/FixedPointMathLib.sol |
1,313 | powWad, divWad, fullMulDiv |
lib/solady/src/utils/SafeTransferLib.sol |
684 | Token transfer and balance helpers |
src/dao/IZorgConvictionRenderer.sol |
8 | html(address,address) stub |
src/dao/IZorgReceiptArt.sol |
8 | tokenURI(address,uint256) stub |
Fetch the full source:
curl -s "https://api.etherscan.io/v2/api?chainid=1&module=contract&action=getsourcecode\
&address=0x0000006d936BA3653b8854490E16e782cd32a9a8&apikey=$ETHERSCAN_API_KEY" \
| jq -r '.result[0].SourceCode'
Artifact (the two declarations that define the whole relationship to TokenList):
interface ITokenListView {
function isListed(uint256 id) external view returns (bool);
}
// ...the sole call site, inside allocate():
if (amount > oldAmount) {
if (paused) revert Unauthorized();
if (!ITokenListView(tokenList).isListed(listingId)) revert UnknownListing();
}
Additional Artifacts
Contract State Snapshot
Read at block 25,714,806.
Command:
export ETH_RPC_URL=https://eth.llamarpc.com
ZC=0x0000006d936BA3653b8854490E16e782cd32a9a8
for f in "halfLife()(uint64)" "paused()(bool)" "domainClaimed()(bool)" \
"rolesInstalled()(bool)" "execRoleRevoked()(bool)" \
"totalLoyaltyWeight()(uint256)" "loyaltyRewardPerWeight()(uint256)" \
"loyaltyRewardReserve()(uint256)" "totalEthPrincipal()(uint256)" \
"treasuryEth()(uint256)" "totalEthCredits()(uint256)"; do
echo "$f -> $(cast call $ZC "$f")"
done
cast call $ZC "ethBondTerms()(uint256,uint64,uint16,uint16)"
cast balance $ZC
cast call 0x00a6bA94BBb5474725515De88fE04F854f2dCb12 "balanceOf(address)(uint256)" $ZC
Artifact:
halfLife 259200 # 3 days
paused false
domainClaimed true
rolesInstalled false # emergency exec role NOT installed
execRoleRevoked false
totalLoyaltyWeight 371470e18 ZORG
loyaltyRewardPerWeight 0 # no early exit has ever occurred
loyaltyRewardReserve 0
totalEthPrincipal 0.05 ETH
treasuryEth 0.02 ETH
totalEthCredits 0
ethBondTerms minimumBond 0.01 ETH
maturity 604800 (7 days)
earlyExitTaxBps 2000 (20%)
treasuryShareBps 5000 (50%)
contract ETH balance 0.07 ETH # == 0.05 + 0 + 0.02 + 0, exactly
contract ZORG balance 371470e18 # == totalLoyaltyWeight, exactly
Both invariants the contract asserts internally hold when checked from outside.
Lock Tier Menu
Command:
for t in 0 1 2 3; do
echo "tier $t: $(cast call 0x0000006d936BA3653b8854490E16e782cd32a9a8 \
"lockTiers(uint8)(uint64,uint16)" $t)"
done
Artifact:
| TIER | EXIT DELAY | BOOST | STATUS |
|---|---|---|---|
| 0 | none | 1.00× (synthesised, not stored) | Default; 5 of the 7 bonds opened here |
| 1 | 90 days | 1.10× (11,000 bps) | Constructor default, never used |
| 2 | 180 days | 1.25× (12,500 bps) | Constructor default, never used |
| 3 | 365 days | 1.50× (15,000 bps) | Constructor default; held by 3 receipts — 2 chosen at bond time, 1 via selectLockTier |
Tier 0 is not stored — lockTiers[0] reads back as zeros, and _bondZorgz synthesises LockTier({exitDelay: 0, boostBps: BPS}) for it. All three menu entries remain at their constructor values; setLockTier has never been called.
Bond Positions
Reconstructed from Bonded / BondIncreased / Eternalized logs and verified against the per-id getters.
Command:
ZC=0x0000006d936BA3653b8854490E16e782cd32a9a8
for r in 9953 4205 339 9241 4816 77 156; do
echo "receipt $r"
cast call $ZC "ownerOf(uint256)(address)" $r
cast call $ZC "bondedWeight(uint256)(uint256)" $r
cast call $ZC "allocatedByBond(uint256)(uint256)" $r
cast call $ZC "receiptLocks(uint256)(uint64,uint64,uint16,uint8)" $r
cast call $ZC "eternalBonds(uint256)(bool)" $r
done
Artifact:
| RECEIPT | HOLDER | BONDED ZORG | ALLOCATED | TIER | BOOST | UNLOCKS | ETERNAL | ETH |
|---|---|---|---|---|---|---|---|---|
| 9953 | 0x1C0Aa8cC...855A20 (etherscan) |
10,000 | 10,000 | 0 | 1.00× | — | ☑ | 0 |
| 4205 | 0x053E6294...7F388f (etherscan) |
10,001 | 0 | 3 | 1.50× | 2027-08-07 | ☑ | 0 |
| 339 | 0xFbd69f81...cADE8E (etherscan) |
10,009 | 10,000 | 0 | 1.00× | — | ☒ | 0.01 |
| 9241 | 0xFbd69f81...cADE8E (etherscan) |
10,028 | 10,000 | 0 | 1.00× | — | ☒ | 0.01 |
| 4816 | 0x1C0Aa8cC...855A20 (etherscan) |
100,000 | 100,000 | 3 | 1.50× | 2027-08-08 | ☒ | 0.01 |
| 77 | 0xFbd69f81...cADE8E (etherscan) |
221,432 | 221,432 | 0 | 1.00× | — | ☒ | 0.01 |
| 156 | 0x357836fF...61902B (etherscan) |
10,000 | 10,000 | 3 | 1.50× | 2027-08-09 | ☒ | 0.01 |
Total bonded: 371,470 ZORG across 7 receipts and 4 holders. Receipt 9953 was eternalized while still at tier 0 and reads a boostBps of 10,000; receipt 4205 is eternal with no allocation at all, so 10,001 ZORG sits permanently locked while directing nothing.
The unlockAt dates are more than a year out because topUpZorg renews the commitment from the moment of the top-up, and because tier 3 is a 365-day delay measured from selection rather than from the original bond.
Listing Support Snapshot
Listing ids for ordinary Ethereum tokens are uint256(uint160(token)); foreign listings carry a wider hashed id. See the TokenList analysis for the derivation.
Command:
ZC=0x0000006d936BA3653b8854490E16e782cd32a9a8
cast call $ZC "listingState(uint256)(uint256,uint256)" <LISTING_ID>
cast call $ZC "convictionOf(uint256)(uint256)" <LISTING_ID>
# CONFIRM THE ID IS ONE THE REGISTRY ACTUALLY CARRIES
cast call 0x0000006013dF75A31678B786061C2B54bf531524 "isListed(uint256)(bool)" <LISTING_ID>
Artifact:
The eight ids carrying support, in full decimal form for direct reuse in the commands above. Weight, conviction and score for each are tabulated in the Contract Analysis; they are omitted here because the accrued columns advance every block and two copies would drift apart.
| LISTING ID | SUBJECT |
|---|---|
0 |
ETH (native) |
104165018710067097353655755692819801489527232022561016148205125677286991358696 |
TAC (tacitscan) |
3718177199436581777268575498026466751093263122 |
ZORG (etherscan) |
707243736947857446325356514591335334 |
zOrgz (etherscan) |
1097077688018008265106216665536940668749033598146 |
WETH (etherscan) |
726330175714135941764069406682033110407748398240 |
wstETH (etherscan) |
996101235222674412020337938588541139382869425796 |
stETH (etherscan) |
996050538495118299096582895562516634314123010963 |
rETH (etherscan) |
Eight of the registry's seventeen listings carry any support at all. The nine with none — WBTC, USDC, USDT, DAI, BOLD, LUSD, ZAMM, WEI, FWA — return a score of zero, indistinguishable from an id that was never allocated to.
Effective weight is the raw allocation scaled by the allocating receipt's boost. Native ETH's 156,850 comes from receipt 4816's 100,000 at 1.50× plus receipt 9953's 6,850 at 1.00×.
Event History
Command:
curl -s "https://api.etherscan.io/v2/api?chainid=1&module=logs&action=getLogs\
&address=0x0000006d936BA3653b8854490E16e782cd32a9a8\
&fromBlock=25694754&toBlock=latest&apikey=$ETHERSCAN_API_KEY" | jq '.result | length'
Artifact: 57 logs total from deployment through block 25,714,806.
| EVENT | COUNT | NOTES |
|---|---|---|
Allocated |
18 | Across 8 distinct listings |
BondLockSelected |
8 | Emitted unconditionally by bondZorgz, so 7 at bond time, plus 1 from receipt 4205's later selectLockTier |
Transfer (mint) |
7 | All mints; no receipt has ever been transferred or burned |
Bonded |
7 | |
EthBonded |
7 | Every bond paid exactly the 0.01 ETH minimum |
CommitmentExtended |
4 | Tier selections and one top-up renewal |
Eternalized |
2 | Receipts 9953 and 4205 |
DomainClaimed |
1 | 0xedcfb44b...13166a (tx) |
BondIncreased |
1 | Receipt 4205, two blocks (24 seconds) before it was eternalized |
EthBondMaturityReset |
1 | Paired with the above |
RendererSet |
1 | 0xf90b79da...f8dd80 (tx) |
Events declared by this contract that have never fired: Unbonded, BondDecreased, EarlyExitTaxed, LoyaltyAccrued, EthCreditClaimed, TreasuryEthReleased, PauseSet, Executed, ExecRoleInstalled, ExecRoleBurned, HalfLifeSet, LockTierSet, EthBondTermsSet, ReceiptArtSet. The inherited ERC-721 Approval and ApprovalForAll have also never fired. No exit path and no admin parameter change has been exercised on mainnet.
Renderer Replacement
The renderer pointer was changed once, one day after deployment. Both the original and the replacement are verified, so the change can be diffed directly rather than inferred.
Command:
for a in 0x000000115b1b95b9e04128a2bcd9ed9d24ab141c \
0x0000006b980ae5e796B3eF484e767993d0E29979; do
curl -s "https://api.etherscan.io/v2/api?chainid=1&module=contract&action=getsourcecode\
&address=$a&apikey=$ETHERSCAN_API_KEY" \
| jq -r '.result[0].SourceCode' > "renderer-$a.json"
done
# extract src/dao/ZorgConvictionRenderer.sol from each, then diff
Artifact: 283 lines → 288 lines, 23 changed lines, all presentational.
| CHANGE | NATURE |
|---|---|
| Inline SVG favicon added to the page head | Cosmetic |
| Warning copy on the permanent-action panel rewritten | Documentation of the tier-0 eternalization trap |
height='8.8' quoting fixed in an inline SVG |
Cosmetic |
| Receipt status line now shows the boost rate explicitly | Display |
| Eternal receipts now read "principal given to treasury" instead of showing 0 ETH | Display |
| Score sub-label relabelled from "live / accrued" to "direct / conviction" | Terminology |
set button switched from an inline onclick to event delegation via data-set |
Frontend fix |
The substantive change is the second row. The original read:
The replacement reads:
Permanent · order matters — Hard lock FIRST. Eternalize freezes whatever rate the receipt
holds and no lock can be added afterwards, so eternalizing an open bond commits it at 1.00x
forever.
Receipt 9953 had already been eternalized at tier 0 by the time this copy was written.
Storage Slot Dump
Command:
for i in $(seq 0 20); do
echo "slot $i: $(cast storage 0x0000006d936BA3653b8854490E16e782cd32a9a8 $i)"
done
Artifact:
slot 0: 0x0000000000000000000000000000006b980ae5e796b3ef484e767993d0e29979
slot 1: 0x00000001000000000003f4800000007f4342bddda2a951b9e181b42328dd1ed9
slot 2: 0x0000000000000000000000000000000000000000000000000000000000000000
slot 3: 0x0000000000000000000000000000000000000000000000000000000000000000
slot 10: 0x000000000000000000000000000000000000000000000000002386f26fc10000
slot 11: 0x0000000000000000000000000000000000000000138807d00000000000093a80
slot 13: 0x000000000000000000000000000000000000000000004ea96dd64396f3780000
slot 16: 0x00000000000000000000000000000000000000000000000000b1a2bc2ec50000
slot 17: 0x00000000000000000000000000000000000000000000000000470de4df820000
Slots 4–9, 12, and 19–20 are mapping bases and read as zero, as expected. Slots 14, 15, and 18 are genuinely zero — no loyalty has ever been distributed and no ETH credit is outstanding.
Slot 1 decodes right to left: receiptArt in bytes 0–19, halfLife (0x3f480 = 259,200) in bytes 20–27, then domainClaimed = 0x01, rolesInstalled = 0x00, execRoleRevoked = 0x00, paused = 0x00. See Storage Layout for the full decode.
Governance Chain
The admin is neither an EOA nor a Safe. It is a 45-byte ERC-1167 minimal proxy delegating to 0x643a45b5...0673c1 (etherscan), a contract named Moloch. The ZORG share token is a clone of a separate implementation, 0x71e9b38d...acf600 (etherscan), named Shares.
Command:
cast code 0x5E58BA0e06ED0F5558f83bE732a4b899a674053E
cast code 0x00a6bA94BBb5474725515De88fE04F854f2dCb12
cast call 0x00a6bA94BBb5474725515De88fE04F854f2dCb12 "totalSupply()(uint256)"
cast call 0x00a6bA94BBb5474725515De88fE04F854f2dCb12 "transfersLocked()(bool)"
Artifact:
DAO 0x5E58BA0e...74053E -> ERC-1167 clone of 0x643a45b5...0673c1 ("Moloch")
ZORG 0x00a6bA94...2dCb12 -> ERC-1167 clone of 0x71e9b38d...acf600 ("Shares")
ZORG totalSupply 7,490,386
ZORG held by conviction 371,470 (~5.0% of supply)
ZORG held by 0x1C0Aa8cC...855A20 1,489,036 (~19.9% of supply)
transfersLocked() false # the constructor guard's assumption still holds
getProposalCount() 21
transfersLocked() is the value the constructor refuses to deploy against. It is false today; the source is explicit that the DAO setting it afterwards would make unbond impossible for existing bonds, and that a constructor cannot prevent this.
Deployer Funding Trace
Command:
curl -s "https://api.etherscan.io/v2/api?chainid=1&module=account&action=txlist\
&address=0xacfba7ce872c6ead99d535586f84b0d68ade4082&sort=asc&apikey=$ETHERSCAN_API_KEY" \
| jq -r '.result[0]'
# CONFIRM THE SAME EOA DEPLOYED THE REGISTRY THIS CONTRACT READS
curl -s "https://api.etherscan.io/v2/api?chainid=1&module=contract\
&action=getcontractcreation&contractaddresses=0x0000006013dF75A31678B786061C2B54bf531524\
&apikey=$ETHERSCAN_API_KEY" | jq -r '.result[0].contractCreator'
Artifact:
2026-08-03 15:39 UTC block 25675323
0x1C0Aa8cC...855A20 -> 0xacFbA7ce...de4082 0.02 ETH
(z0r0z canonical EOA) (first transaction this address ever received)
2026-08-03 15:43 UTC block 25675344
0xacFbA7ce...de4082 deploys TokenList 0x00000060...531524 (4 min after funding)
2026-08-06 08:37 UTC block 25694754
0xacFbA7ce...de4082 deploys ZorgConviction 0x0000006d...32a9a8
One funded deployer produced both halves of the system three days apart. The registry's own governance sits under a separate 2-of-3 multisig; this contract's sits under the Moloch clone.