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.
The contract wraps the MajeurSummoner, the factory for Moloch-style Decentralized Autonomous Organizations (DAOs). Struct parameters are shown by name. In the selector computation each expands to its tuple of member types, in declaration order — SafeConfig has 21 members, SaleModule 7, TapModule 5, SeedModule 8, and Call is (address,uint256,bytes).
Every user function is payable and permissionless. The validation rules in _validate and _validateModules are tabulated in Validation Rules; the calls _buildCalls encodes are listed in Init Calls Generated.
Init Calls Generated
_buildCalls emits calls in a fixed order; a call is present only when its trigger is non-zero. All targets are the DAO unless noted. Loot mints from _buildLootMints, then module calls from _buildModuleCalls, then caller extraCalls are appended after these.
Call 10 is a Delegatecall permit (op = 1): when the ShareBurner spends it, the DAO executes ShareBurner code in its own context. Calls 12 and 13 are ordinary call permits.
The general entry point. Validates a caller-built SafeConfig, prepends initial loot mints, encodes the config into init calls, appends extraCalls, and summons through Summoner.
extraCalls execute after every validated call and are not inspected. A trailing setProposalThreshold(0) or setProposalTTL(0) in extraCalls undoes the corresponding check
◇
initShares and initHolders are not checked for length equality here; Moloch.init enforces it (LengthMismatch)
◇
Loot mints are placed before extraCalls but after the config calls, in the order config → loot mints → extraCalls
◇
Never called directly on mainnet; all custom configurations went through safeSummonDAICO
safeSummon plus the three module structs that make up a Decentralized Autonomous Initial Coin Offering (DAICO) setup. Each module whose singleton is non-zero is wired to the DAO through allowances and a configure call executed by the DAO during init.
ATTRIBUTE
VALUE
Selector
0x4e1e3b11
Parameters
As safeSummon, plus sale, tap, seed
Access
Anyone, payable
Returns
The new DAO address
On-chain calls
9 of 121
FLAG
OBSERVATION
△
Module singleton addresses are caller-supplied and unchecked. The DAO grants each an allowance and calls its configure as itself
△
The SeedModule share sentinel mints new shares to the DAO, increasing the supply that quorumBps is measured against while those shares sit with the DAO or in a pool
◇
Call order is config → loot mints → modules → extraCalls
◇
All nine on-chain calls used ShareSale 0x00000000...EA60f9 (etherscan) and/or TapVest 0x00000000...7bF56D (etherscan); none used a seed module
Preset: 7 days proposal time-to-live (TTL), 2 days timelock, quorumBps 1000, ragequit on, the hardcoded RENDERER, and a proposal threshold of 1% of the initial share total (floor 1).
Preset: 3 days proposal TTL, 1 day timelock, quorumBps 500, ragequit on, the hardcoded RENDERER, and a proposal threshold of 1% of the initial share total (floor 1).
Preset for a single founder: msg.sender receives 10,000,000 shares, the threshold is 100,000 shares, TTL is one day, there is no timelock, quorumBps is 1000 and ragequit is on.
ATTRIBUTE
VALUE
Selector
0xc7d43a7d
Parameters
Name, symbol, URI, salt
Access
Anyone, payable
Returns
The new DAO address
On-chain calls
3 of 121
FLAG
OBSERVATION
△
Produces a single-key DAO. The founder alone meets quorum and majority, and with no timelock a passing proposal executes immediately
◇
Skips _validate; the hardcoded values satisfy every rule
◇
Duplicates the _predictDAO arithmetic inline because the holder arrays are built in memory rather than received as calldata
The Standard preset combined with the module structs of safeSummonDAICO. Routes through the internal _summonDAICOPreset, which validates config and modules, builds module calls, and summons with the hardcoded RENDERER.
ATTRIBUTE
VALUE
Selector
0x94c2d76d
Parameters
As the preset, plus sale, tap, seed
Access
Anyone, payable
Returns
The new DAO address
On-chain calls
0 of 121
FLAG
OBSERVATION
△
A minting sale module reverts here with MintingSaleWithDynamicQuorum: the preset sets quorumBps but leaves quorumAbsolute at 0, and there is no parameter to supply one. Only non-minting sales are usable through these two presets
The Fast preset combined with the module structs of safeSummonDAICO. Routes through the internal _summonDAICOPreset, which validates config and modules, builds module calls, and summons with the hardcoded RENDERER.
ATTRIBUTE
VALUE
Selector
0x07f1831f
Parameters
As the preset, plus sale, tap, seed
Access
Anyone, payable
Returns
The new DAO address
On-chain calls
0 of 121
FLAG
OBSERVATION
△
A minting sale module reverts here with MintingSaleWithDynamicQuorum: the preset sets quorumBps but leaves quorumAbsolute at 0, and there is no parameter to supply one. Only non-minting sales are usable through these two presets
Deploys arbitrary creation bytecode with CREATE2 from SafeSummoner's address, forwarding msg.value to the new contract. Unrelated to DAO summoning; the most-called function (91 of 121 transactions).
ATTRIBUTE
VALUE
Selector
0x94d6f6d4
Parameters
creationCode (with constructor arguments appended), salt
Access
Anyone, payable
Returns
The deployed address
On-chain calls
91 of 121 (90 succeeded)
FLAG
OBSERVATION
△
The salt is not bound to the caller. Anyone can deploy the same creationCode and salt first; the result is the same contract at the same address, and the original call then reverts
◇
The deployed contract's constructor sees msg.sender == SafeSummoner. A constructor that made msg.sender its owner would leave ownership with a contract that cannot exercise it. A scan of the 79 verified deployments found no constructor doing so
◇
Deterministic per (bytecode, salt). Leading-zero vanity addresses such as TokenList's 0x00000060...531524 (etherscan) are found off-chain by grinding the salt
STEP
ACTION
1
Copy creationCode to memory
2
create2(callvalue(), ptr, len, salt)
CONDITION
REVERT MESSAGE
Address already has code, constructor reverted, or insufficient balance for callvalue
Executes each entry as a delegatecall into SafeSummoner itself and returns the results. Intended for sequences such as deploying a module with create2Deploy and summoning a DAO that uses it, in one transaction.
ATTRIBUTE
VALUE
Selector
0xac9650d8
Parameters
data — an array of encoded SafeSummoner calls
Access
Anyone, payable
Returns
bytes[] results
On-chain calls
0 of 121
FLAG
OBSERVATION
△
msg.value is visible to every sub-call and each payable sub-call forwards it in full. With two payable sub-calls the contract sends 2 × msg.value; the difference comes from SafeSummoner's own balance. Confirmed by simulation
◇
Non-payable helpers (predictDAO, previewCalls and the rest) revert inside a multicall sent with value, because delegatecall preserves msg.value and the callee's value check fires
◇
SafeSummoner has no storage, so self-delegatecall cannot corrupt state
Returns the address Summoner will deploy a DAO to for the given salt, holders and shares.
ATTRIBUTE
VALUE
Selector
0x7d64e7d8
Parameters
salt, initHolders, initShares
Access
Anyone, pure
Returns
Predicted DAO address
FLAG
OBSERVATION
△
The prediction does not depend on the caller or the init calls. Any party can summon at this address with different init calls; confirmed by simulation
☑
Held for all 30 DAOs summoned through SafeSummoner: each stores the threshold and TTL its init calls wrote to the predicted address
Returns the init calls _buildCalls would generate for a config, with address(0) standing in for the DAO.
ATTRIBUTE
VALUE
Selector
0x03666cdd
Parameters
config
Access
Anyone, pure
Returns
Call[]
FLAG
OBSERVATION
△
Every address derived from the DAO is wrong in the preview — the targets are address(0), and the ShareBurner's burnUnsold argument is the Shares or Loot address predicted from address(0). The output shows structure, not the calldata that will execute