Tally Integration for DAO: Governor Contract Setup and Voting

As DAOs grow, manual proposal and voting management becomes a bottleneck: votes get lost, quorum is not reached, and processes require trusted intermediaries. We set up Tally integration, from Governor contract configuration to launching on-chain voting. Our team delivers the project turnkey with ongoing support, ensuring transparent and reliable governance that scales with your community.

Blockchain Development Services

Frequently Asked Questions

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1335
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1293
  • B2B Advance company logo design
    B2B Advance company logo design
    738
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1031
  • AIDER company logo development
    AIDER company logo development
    978
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1087

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

  1. Go to Tally and click "Add DAO".
  2. Enter the Governor contract address and network.
  3. Tally verifies the ABI and starts indexing.
  4. 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.