Deep simulation of DAO proposals using full governor and timelock context, with Tenderly support.
When a proposal is submitted on-chain, it’s critical to ensure that what’s being executed is safe, transparent, and does exactly what the proposer intends. That’s where Transaction Simulation & Verification comes in.
This feature simulates the entire proposal execution before it’s ever executed—using the exact context of the governor, timelock, and the caller. The simulation runs via Tenderly, assuming it’s supported by the target chain, and provides deep insight into the behavior of the proposal.
Blockchain governance comes with irreversible consequences. Once a proposal passes, there’s no undo button. That’s why simulation and verification are vital:
By integrating simulation into the governance process, DAOs increase safety and trust for all voters.
We run the same simulations when a proposal is in draft mode, giving the creator peace of mind before posting to the chain.
Below is a tiny screenshot of the feature.
When a simulation runs, we verify a comprehensive set of checks.
We capture and display every single event emitted during proposal execution. This allows reviewers to:
We log all changes to contract storage, including:
This helps confirm that the proposal impacts state exactly as intended—nothing more, nothing less.
All target calldata is:
This gives voters and reviewers confidence in the intent of each call and makes it easier to spot misconfigured or malicious data.
Each target address in the proposal is:
Even if the proposal doesn’t directly target them, we:
Because malicious contracts often use
delegatecall
or indirect hops to hide behavior—we catch those too.
selfdestruct
in TargetsWe analyze each target contract and verify that:
selfdestruct
opcodeProposals attempting to execute contracts with
selfdestruct
will trigger a warning or fail simulation, depending on context.
selfdestruct
in Touched ContractsEven contracts indirectly touched during execution are checked for selfdestruct
. A warning is raised if any are found.
We check whether:
This protects against silent ETH transfers or unintentional funding of contracts.
We analyze ETH inflows and outflows for:
This ensures ETH movement is deliberate and easy to audit.
If something passes but raises a concern (e.g. unverifiable contracts or decoded calldata with unknown selectors), we warn but do not block. These warnings are meant to guide further manual review.
Each simulation links to the full Tenderly trace, including:
execute()
function is being called by the timelock, simulating the final step in the lifecycle of a proposal.