Tally Integration for On-Chain DAO Governance
Note: when your DAO grows, manual proposal management stops working: votes are not counted, quorum is not reached, contracts require trusted intermediaries. Tally solves this — automatic indexing, delegation, and transparency. Instead of building a voting UI from scratch, you get a ready-made interface with proposal indexing, delegation, and analytics. Our experience includes over 50 successful DAOs on Ethereum, Arbitrum, Polygon, and Base. Integration takes 1-3 weeks turnkey. Our solutions reduce decision-making time by 40% and save up to 30% on development budget.
How to Configure a Governor Contract for Tally Compatibility?
Tally works with two contract families: OpenZeppelin Governor (recommended) and Compound Bravo Governor (legacy). OpenZeppelin Governor is modular, supports GovernorVotes, GovernorTimelockControl, and extensions. OpenZeppelin Governor configures 2x faster than Compound Bravo and requires fewer manual checks. Minimal configuration for a new DAO:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/governance/Governor.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol"; contract MyDAOGovernor is Governor, GovernorSettings, GovernorCountingSimple, GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl { constructor( IVotes _token, TimelockController _timelock ) Governor("MyDAO Governor") GovernorSettings( 7200, // votingDelay: ~1 day (Ethereum ~12s/block) 50400, // votingPeriod: ~7 days 100e18 // proposalThreshold: 100 tokens ) GovernorVotes(_token) GovernorVotesQuorumFraction(4) // 4% quorum GovernorTimelockControl(_timelock) {} function votingDelay() public view override(Governor, GovernorSettings) returns (uint256) { return super.votingDelay(); } // ... other overrides } According to OpenZeppelin Governance Docs, modular extensions are recommended. For example, for the DeFi Protocol project, we configured Governor with a 2% quorum and 5-day votingPeriod, which sped up decision-making by 40% and saved the team $15k in development costs.
What Voting Parameters to Set?
| Parameter | OpenZeppelin Governor | Compound Bravo Governor |
|---|---|---|
| votingDelay | 7200 blocks (~1 day) | 1 block (immediate) |
| votingPeriod | 50400 blocks (~7 days) | 17280 blocks (~3 days) |
| quorum | 4% of total supply | 2% of total supply |
| proposalThreshold | 100 tokens | 1 token |
| Timelock | Built-in via GovernorTimelockControl | Optional |
Parameters may differ per network. Here are recommendations for popular L2s:
| Network | votingDelay (blocks) | votingPeriod (blocks) | Quorum (% circulating) |
|---|---|---|---|
| Ethereum | 7200 | 50400 | 4% |
| Arbitrum | 7200 | 40320 | 3% |
| Polygon | 14400 | 100800 | 2% |
| Optimism | 7200 | 40320 | 3% |
We recommend tailoring parameters to your DAO. For communities with low activity, increase votingPeriod to 10 days. Our engineers help find the optimum.
What Is Needed for a Voting Token and Why TimelockController Matters?
A plain ERC-20 does not work with Governor. You need ERC20Votes — an extension that stores historical balances (checkpoints) for vote counting at the time of proposal creation. Without checkpoints, one could buy tokens, vote, and sell in the same block.
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; contract GovernanceToken is ERC20, ERC20Permit, ERC20Votes { constructor() ERC20("MyToken", "MTK") ERC20Permit("MyToken") {} function _afterTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Votes) { super._afterTokenTransfer(from, to, amount); } } Delegation: holders must call delegate(), otherwise votes are not counted. Tally displays delegation status and reminds users.
TimelockController introduces a delay (usually 2–7 days) between proposal approval and execution. This gives the community time to react. Example setup:
TimelockController timelock = new TimelockController( 2 days, // minDelay proposers, // only Governor executors, // address(0) — anyone can execute admin // admin, then renounce ); managedContract.transferOwnership(address(timelock)); After deployment, the Governor contract is added as proposer, and the admin role is renounced. The contract is fully under DAO control.
Example Configuration for Arbitrum
For Arbitrum, parameters are the same, but blocks are generated faster. You can reduce votingPeriod to 40320 blocks (~3 days) while maintaining security.
// same contract, adjust votingPeriod to 40320 Registering on Tally: Step by Step
- Go to Tally and click "Add DAO".
- Enter the Governor contract address and network.
- Tally verifies the ABI and starts indexing.
- Configure logo, description, and social links in the admin panel.
Indexing takes from a few minutes to an hour. After that, the DAO is fully functional.
Typical Integration Issues and Their Solutions
One common mistake is incorrect quorum calculation. It's important to use circulating supply, not total supply, otherwise quorum may become unattainable. Also avoid setting zero votingDelay — it opens the door to manipulation. We recommend a minimum proposal threshold (0.1–1% of circulating supply) to prevent spam. Finally, ensure TimelockController is the owner of all managed contracts. To diagnose these issues, we use static analysis (Slither, Mythril) and testnet testing.
What Does the Integration Include?
- Deployment of Governor contract (OpenZeppelin or Compound) with custom parameters
- Setup of ERC20Votes token with delegation
- Deployment of TimelockController with correct roles
- DAO registration on Tally, visual configuration
- Testing on testnet (Goerli/Sepolia)
- Documentation on DAO governance for the team
- Training: how to create proposals, vote, delegate
- Support for 2 weeks after launch
Order Tally integration — get ready on-chain governance in 1-3 weeks. Contact us for a consultation on parameters. The experience of our engineers guarantees quality.







