Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
LABS
Guides

How to Implement a Liquid Democracy System for Delegation

A technical guide to building a liquid democracy smart contract system that allows voters to delegate their votes on specific proposals or vote directly, with code examples and design patterns.
Chainscore © 2026
introduction
ON-CHAIN GOVERNANCE

How to Implement a Liquid Democracy System for Delegation

A technical guide to building a smart contract system that enables voters to delegate and transfer their voting power dynamically.

Liquid democracy is a hybrid governance model that combines direct and representative democracy. In this system, every participant holds a voting power token (often an ERC-20 or ERC-1155) and can choose to vote directly on proposals or delegate their voting power to a trusted delegate. The key innovation is that this delegation is fluid and non-binding; a voter can delegate to one person for technical proposals and another for treasury decisions, or revoke and reclaim their voting power at any time. This creates a flexible and efficient decision-making layer for DAOs, protocol governance, and decentralized communities.

The core smart contract architecture requires several key components. First, a Vote Token contract manages the distribution of voting power, typically by minting tokens to eligible addresses (e.g., token holders or NFT owners). Second, a Delegation Registry contract tracks delegation relationships. This registry maps each voter's address to their chosen delegate's address for a specific domain or category. A critical design choice is whether to implement a global, single delegate model or a categorized system where users can delegate differently for TREASURY, TECHNICAL, and GRANTS proposals. Using a categorized system prevents over-concentration of power.

Here is a simplified Solidity example of a delegation registry's core function:

solidity
function delegateVotes(address delegatee, bytes32 domain) external {
    require(voteToken.balanceOf(msg.sender) > 0, "No voting power");
    delegations[msg.sender][domain] = delegatee;
    emit DelegationSet(msg.sender, delegatee, domain);
}

When a vote is cast, the contract must calculate the voter's effective voting power. This is the sum of their own tokens plus all tokens delegated to them for that proposal's domain, minus any tokens they have delegated away. This calculation must be performed on-chain in a gas-efficient manner, often using snapshot mechanisms to avoid loops over all delegators during live voting.

Implementing a robust system requires managing several edge cases and security considerations. You must prevent delegation loops (A delegates to B, B delegates to A), which can be solved by disallowing delegation to addresses that have already delegated in the same domain. The system should also handle the state changes mid-vote; a common pattern is to take a snapshot of delegation balances and relationships at the start of a proposal's voting period. Voters should be able to change their delegation freely, but those changes should only affect future proposals, not active ones. Using OpenZeppelin's Votes and Checkpoints libraries can simplify this logic.

To make the system usable, integrate it with a front-end and indexing service. The UI should allow users to easily delegate, see their current delegates, and browse potential delegates (often with profiles on platforms like Snapshot or Tally). Since querying on-chain delegation data for many users is inefficient, you will need to index events like DelegationSet using a subgraph (The Graph) or a custom indexer. This off-chain index provides fast queries for displaying delegation networks and calculating real-time voting power without excessive gas costs for the end-user.

Successful implementations, such as those used by Gitcoin DAO and Element Finance, show that liquid democracy can increase participation while maintaining expertise-driven decisions. Start by deploying and testing your contracts on a testnet, using frameworks like Foundry or Hardhat. Begin with a single delegation domain before adding complexity. The final system creates a transparent, adaptable, and resilient foundation for community governance, moving beyond simple token-weighted voting to a more nuanced and representative model.

prerequisites
IMPLEMENTATION GUIDE

Prerequisites and Setup

This guide details the technical requirements and initial setup for building a liquid democracy system, focusing on smart contract architecture and delegation logic.

A liquid democracy system requires a foundational smart contract that manages a registry of participants, their voting power, and delegation relationships. The core data structures typically include a mapping from user addresses to a Delegate struct, which stores the delegatee's address and a timestamp. You'll need a secure method to assign initial voting power, often via token ownership or a whitelist. Development environments like Hardhat or Foundry are essential for testing delegation logic and vote tallying off-chain before deployment. Start by initializing a project with npm init and installing the necessary dependencies, including OpenZeppelin's contracts for secure ownership and access control patterns.

The delegation mechanism is the system's heart. Implement functions for delegate(address to) and undelegate(). Critical logic includes preventing self-delegation, circular delegation (where A delegates to B and B delegates to A), and ensuring delegated voting power flows correctly through transitive chains (where A delegates to B, and B delegates to C). Use a graph-like data structure or recursive function to resolve the final delegatee for any voter. For gas efficiency and to prevent loops, consider imposing a maximum delegation depth. Testing must cover edge cases like delegation changes during an active proposal period; a common pattern is to snapshot delegation states at the proposal's creation block.

Integrating with a governance framework is the next step. Your liquid democracy contract should interface with a proposal and voting contract, such as a fork of Compound's Governor or OpenZeppelin Governor. The voting contract will call a getVotes(address account, uint256 blockNumber) function on your delegation contract to query the voting power of an account at a historical block. Ensure your delegation contract implements this interface correctly, returning the sum of an account's own power and all power delegated to it. Use Tenderly or a similar tool to simulate complex delegation scenarios and gas usage on a testnet like Sepolia before considering a mainnet deployment.

core-architecture
CORE SYSTEM ARCHITECTURE

How to Implement a Liquid Democracy System for Delegation

A technical guide to building a liquid democracy system on-chain, enabling voters to delegate their voting power dynamically and transparently.

Liquid democracy, or delegative democracy, is a hybrid governance model that combines direct and representative voting. In this system, token holders can either vote directly on proposals or delegate their voting power to a trusted representative, known as a delegate. Crucially, this delegation is not static; voters can change their delegate or vote directly at any time. This creates a flexible and adaptive governance layer, often implemented using smart contracts on blockchains like Ethereum, Arbitrum, or Optimism. The core architecture revolves around a delegation registry that maps voter addresses to delegate addresses, with the total voting weight for any proposal calculated as the sum of a delegate's own tokens plus all tokens delegated to them.

The system's state is managed by a primary smart contract, often following standards like OpenZeppelin's governance libraries. Key data structures include a mapping from address voter to address delegate and a record of proposals with their status. When a user delegates, they call a function like delegate(address to), which updates the mapping and emits an event. Voting power is calculated on-demand using a getVotes(address account, uint256 blockNumber) pattern, which sums the balance of the account and recursively checks for nested delegations (though most implementations use a single, non-transferable delegation to avoid complexity and gas costs). Security considerations are paramount, as the contract must prevent self-delegation loops and ensure votes cannot be double-counted.

A basic delegation function in Solidity might look like this:

solidity
mapping(address => address) public delegates;
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
function delegate(address delegatee) external {
    require(delegatee != msg.sender, "Cannot delegate to self");
    address currentDelegate = delegates[msg.sender];
    delegates[msg.sender] = delegatee;
    emit DelegateChanged(msg.sender, currentDelegate, delegatee);
}

The corresponding vote-getting function would iterate through token balances, respecting the delegation map. For production systems, integrating with a token contract using the ERC20Votes or ERC721Votes extension is recommended, as it provides built-in snapshotting of historical balances to prevent manipulation.

Integrating this delegation mechanism into a full governance system requires additional components: a proposal factory for creating proposals, a timelock controller for executing passed proposals, and a vote-tallying mechanism. When a vote is cast, the contract must query the delegate mapping at the snapshot block to determine the voter's effective weight. Projects like Compound's Governor Bravo and OpenZeppelin Governor provide battle-tested frameworks that abstract much of this logic. When designing your system, key parameters to define include the proposal threshold, quorum requirement, voting delay, and voting period, all of which influence the system's security and agility.

Real-world implementations show the trade-offs. In Compound Governance, delegation is permanent until changed, and delegated votes are used for all proposals. In more advanced models, like those explored by DAOstack, delegation can be proposal-specific or time-bound. A critical challenge is voter apathy; even with delegation, participation often remains low. Mitigations include delegate incentive programs, reputation-based weighting, and intuitive interfaces like Snapshot for gasless off-chain signaling that can be linked to on-chain execution. The choice between an optimistic model (votes are assumed until challenged) and a pessimistic one (all votes must be cast) also impacts gas efficiency and security.

To implement a robust system, start with a secure foundation like OpenZeppelin's Governor contract and the ERC20Votes token standard. Thoroughly test delegation changes across snapshot boundaries and ensure the vote-tallying logic is gas-efficient for large electorates. Finally, consider complementing the on-chain system with off-chain tools for discussion and signaling, creating a hybrid workflow that balances decentralization, security, and user experience. The complete code and further details are available in the OpenZeppelin Governance documentation.

key-concepts
LIQUID DEMOCRACY

Key Smart Contract Concepts

Liquid democracy blends direct and representative governance. This guide covers the core smart contract patterns needed to build a secure, on-chain delegation system.

03

Transitive Delegation

Supports delegation chains where A delegates to B, and B delegates to C. The system must correctly resolve these chains so C receives the voting power from both A and B.

Implementation requires a graph traversal algorithm in the smart contract. Use an iterative approach with a loop limit to prevent gas exhaustion from infinite delegation cycles. The final delegate is the 'leaf' node in the delegation chain.

04

Vote Execution & Override

Allows a delegator to override their delegate's vote on a specific proposal. This is a key feature of liquid democracy.

Mechanism:

  1. Delegate votes on Proposal #5.
  2. Delegator later submits their own, different vote for Proposal #5.
  3. The contract overwrites the delegate's vote with the delegator's direct vote for that proposal only, without breaking the ongoing delegation relationship for future votes.
05

Delegation Metadata

Stores context for delegation decisions to inform voters. This can be implemented as an on-chain struct or referenced via IPFS hash.

Common fields:

  • policyURI: Link to the delegate's voting philosophy or platform.
  • tags: Categories the delegate specializes in (e.g., Treasury, Protocol Upgrades).
  • lastActive: Timestamp of the delegate's last voted proposal.

This data helps voters make informed delegation choices beyond simple token weight.

delegation-logic
LIQUID DEMOCRACY

Implementing Dynamic Delegation Logic

A technical guide to building a liquid democracy system for on-chain governance, enabling dynamic delegation of voting power.

Liquid democracy is a hybrid governance model that combines direct and representative democracy. In this system, token holders can either vote directly on proposals or delegate their voting power to a trusted representative, known as a delegate. Crucially, this delegation is dynamic—it can be changed or revoked at any time, and delegates can further delegate the voting power they have received. This creates a flexible and responsive delegation graph, allowing expertise to flow efficiently through the community. It is a core mechanism in protocols like MakerDAO and is increasingly used in DAO tooling.

The core smart contract logic must track a delegation graph. Each user has a delegate address. When a user votes, the contract must traverse this graph to calculate their effective voting power, which includes the balance of all accounts that delegate to them, directly or transitively. This requires careful state management to avoid gas-intensive operations. A common optimization is to store a user's voting weight as a cached, self-updating value that changes when delegations are made or revoked, similar to the ERC-20Votes standard used by OpenZeppelin.

Implementing the delegation function requires handling several states. The basic delegate(address to) function should: check for self-delegation and loops in the delegation chain, update the delegation history for the previous and new delegates, and adjust the cached voting weights. Here is a simplified logic outline:

solidity
function delegate(address delegatee) public {
    address currentDelegate = delegates[msg.sender];
    require(delegatee != msg.sender, "Self-delegation disallowed");
    // Check for delegation loops (simplified)
    address check = delegates[delegatee];
    while(check != address(0)) {
        require(check != msg.sender, "Found delegation loop");
        check = delegates[check];
    }
    // Update sender's delegate
    delegates[msg.sender] = delegatee;
    // Move voting power from old delegate to new delegate
    _moveDelegateVotes(currentDelegate, delegatee, balanceOf(msg.sender));
}

A critical challenge is efficiently calculating a user's total voting power for on-chain proposals without exceeding block gas limits. The naive approach of recursively summing balances on each vote is prohibitively expensive. The solution is to maintain a checkpointed history of voting power for each delegate. When a user's token balance changes or their delegation updates, you write a new checkpoint for the affected delegates. Voting then involves reading the latest checkpoint value before a proposal's snapshot block. This is the pattern used by Compound's Governor Bravo and the aforementioned ERC-20Votes.

When integrating this system with a governance module like OpenZeppelin Governor, the delegation contract must implement the IVotes interface. The governor contract will call getVotes(account, blockNumber) to fetch the historical voting power of a delegate at the time of a proposal snapshot. Your implementation must return the correct value from the checkpoint history. This decouples the complex delegation logic from the proposal lifecycle, ensuring gas-efficient voting. Always audit the interaction between token transfers, delegation updates, and checkpoint creation to prevent vote manipulation.

For production systems, consider additional features: partial delegation (splitting voting power among multiple delegates), topic-based delegation (delegating power only for specific proposal categories), and delegate expiration (delegations that auto-revoke after a set time). Security is paramount; thoroughly test for edge cases like delegation loops, gas griefing attacks during graph traversal, and the integrity of historical checkpoints. Reference implementations can be found in the OpenZeppelin Contracts library and the Compound protocol's source code.

vote-casting-resolution
GOVERNANCE

How to Implement a Liquid Democracy System for Delegation

Liquid democracy, or delegative democracy, is a hybrid governance model that allows participants to either vote directly on proposals or delegate their voting power to a trusted representative. This guide explains the core logic for implementing its vote casting and resolution mechanisms on-chain.

At its core, a liquid democracy smart contract must manage two primary states: direct votes and delegation links. Each participant (represented by a wallet address) holds a voting power balance, often derived from a token. They can choose to cast a direct vote (e.g., voteFor or voteAgainst) on a specific proposal, which locks that power for the proposal's duration. Alternatively, they can delegate their voting power to another address using a function like delegateTo(delegatee). This delegation is transitive by default—if Alice delegates to Bob, and Bob delegates to Carol, then Carol ultimately wields the combined voting power of all three, unless a delegation chain is explicitly restricted.

The resolution logic must correctly aggregate these complex delegation graphs. When a proposal concludes, the contract cannot simply count direct votes. It must perform a state resolution that traverses the delegation tree. A common approach is to maintain a snapshot of delegations at the time a proposal is created. The resolution function then recursively resolves each voter's final voting power destination, ensuring no double-counting and handling circular delegations (which must be detected and invalidated). Efficient on-chain implementation often uses a pull-over-push model, where delegates "pull" voting power from their delegators only when they cast a vote, rather than maintaining a continuously updated total.

Here is a simplified conceptual structure for a proposal and vote resolution in Solidity:

solidity
struct Proposal {
  uint256 id;
  uint256 snapshotBlock;
  uint256 forVotes;
  uint256 againstVotes;
  bool executed;
}
mapping(address => address) public delegations; // voter -> delegate
mapping(uint256 => mapping(address => bool)) public hasVoted;

A critical function is resolveVote, which, for a given voter, checks if they voted directly. If not, it follows their delegation chain until it finds an address that voted directly or reaches an undelegated address (whose power is not counted).

Key design considerations include delegation flexibility (should users be able to delegate on a per-proposal basis?), revocation mechanics (can a delegation be changed before a vote is cast?), and gas optimization. For example, platforms like Element Finance and Gitcoin use variants of this model. To prevent gas-intensive on-chain graph traversal, many implementations rely on off-chain indexers (like The Graph) to calculate voting power, with on-chain contracts verifying these results via merkle proofs or a similar verification step.

Security is paramount. Contracts must guard against flash loan attacks on voting power snapshots, ensure delegation state cannot be altered during an active vote, and implement timelocks for critical governance actions. Furthermore, the system should allow "liquid" participants to override their delegate's vote by casting a direct vote themselves at any time before the poll closes, which is a defining feature of the model. This requires the resolution logic to prioritize a direct vote over a delegated link in the chain.

Implementing liquid democracy creates a more adaptable and representative governance system than pure direct or representative models. By combining on-chain state management with efficient off-chain computation for complex resolution, developers can build scalable governance modules for DAOs, protocol upgrades, and community treasuries. The final system should be transparent, with clear functions for users to delegate, vote, and audit the provenance of all voting power in a resolution.

ARCHITECTURAL PATTERNS

Delegation Pattern Comparison

Comparison of smart contract delegation models for liquid democracy, focusing on gas efficiency, security, and governance flexibility.

Feature / MetricDirect DelegationProxy DelegationDelegation Registry

Smart Contract Complexity

Low

Medium

High

Gas Cost (Delegation TX)

< 50k gas

~120k gas

~80k gas

Gas Cost (Vote with Power)

User pays

Delegate pays

User pays

Revocation Flexibility

Immediate

Time-locked

Immediate

Supports Vote Delegation

Supports Token Delegation

On-Chain Trust Assumptions

Low

High (Proxy)

Medium (Registry)

Implementation Example

Compound Governor

Safe Snapshot Module

ENS Delegation Registry

testing-strategies
LIQUID DEMOCRACY IMPLEMENTATION

Testing Strategies and Edge Cases

This guide outlines a systematic approach to testing a liquid democracy smart contract system, focusing on delegation logic, edge cases, and security vulnerabilities.

A robust testing strategy for a liquid democracy system must validate the core delegation mechanism. Start by unit testing the delegate and undelegate functions in isolation. Key scenarios include: a user delegating to another user, a user delegating to themselves (which should revert), and a user delegating to an address that has delegated elsewhere, creating a delegation chain. Use a testing framework like Foundry or Hardhat to simulate these interactions. Each test should assert the correct update of the delegation mapping and the delegatedVotingPower for all participants in the chain. Verify that the getVotingPower function correctly traverses chains of arbitrary length without exceeding gas limits or entering infinite loops.

Edge case testing is critical for security and correctness. You must simulate complex delegation graphs. Test scenarios where delegation creates a cycle (e.g., A→B→C→A); your contract must detect and prevent this to avoid locking funds and breaking vote tallying. Another crucial edge case is transitive delegation weight calculation: if Alice has 10 tokens and delegates to Bob, and Bob has 5 tokens and delegates to Carol, Carol's total voting power should be 15. Test the behavior when a delegator in the middle of a chain undelegates or changes their delegate, ensuring the downstream votes are recalculated correctly. Also, test interactions with token transfers—if a user transfers away their tokens, their delegate's voting power should decrease proportionally.

Incorporate property-based testing (fuzzing) to uncover unexpected states. Tools like Foundry's fuzzer can generate random addresses and delegation patterns, automatically testing invariants such as "the sum of all base voting power equals the total token supply" or "no address can be its own delegate." This is especially effective for finding flaws in complex state transitions. Furthermore, write integration tests that combine delegation with the actual voting process. Simulate a full proposal lifecycle: users delegate, a proposal is created, delegated votes are cast, and the proposal is executed. This end-to-end test ensures the delegation logic integrates seamlessly with the broader governance module and that vote counts are accurate in a live scenario.

Finally, implement and audit upgrade paths and emergency controls. Liquid democracy contracts often require upgrades to fix bugs or add features. Test the upgrade mechanism using a UUPS or Transparent Proxy pattern to ensure delegation state is preserved across upgrades. Write tests for pause functions or emergency undelegateAll mechanisms that a governance guardian can trigger in case of a discovered vulnerability. These tests should verify that privileged functions are correctly permissioned (e.g., only a DEFAULT_ADMIN_ROLE can pause) and that they do not corrupt the delegation state. A comprehensive test suite covering unit, edge, fuzz, integration, and security scenarios is essential for deploying a trustworthy liquid democracy system.

LIQUID DEMOCRACY IMPLEMENTATION

Frequently Asked Questions

Common technical questions and solutions for developers building on-chain liquid democracy and delegation systems.

A simple token-weighted vote is a direct democracy where each token equals one vote. Liquid democracy introduces a delegation layer, allowing token holders to either vote directly or delegate their voting power to a representative (a delegate). This creates a dynamic, fluid system where:

  • Delegation is transitive: Delegates can further delegate, forming delegation chains.
  • Power is revocable: Delegators can reclaim or re-delegate their voting power at any time, not just at election cycles.
  • Vote dilution is prevented: The system must ensure a delegate's voting power is the sum of their own tokens plus received delegations, but without double-counting if those delegators also vote directly.

The key technical challenge is maintaining an accurate, real-time tally of this fluid voting power, often requiring a delegation graph data structure.

security-considerations
SECURITY AND GAS CONSIDERATIONS

How to Implement a Liquid Democracy System for Delegation

Building a secure and gas-efficient liquid democracy system on-chain requires careful design to mitigate delegation attacks and manage transaction costs.

Liquid democracy, or delegative democracy, allows token holders to vote directly on proposals or delegate their voting power to trusted representatives. On-chain implementations face unique challenges: the system must be resistant to manipulation while remaining affordable to use. Key security risks include delegation loops, where A delegates to B and B delegates back to A, creating infinite voting weight; and Sybil attacks, where an attacker creates many identities to concentrate delegated power. Gas costs are critical, as naive implementations that traverse delegation chains on every vote can become prohibitively expensive.

To prevent delegation loops and manage gas, implement a directed acyclic graph (DAG) structure for delegations. Store delegations as a mapping from delegate to delegator, not the other way around. When a user delegates, update a single storage slot. Use a checkpointing system to snapshot a user's voting power (their own balance plus delegated balances) at specific block numbers, rather than calculating it dynamically for each vote. This approach, used by protocols like Compound Governance, transforms O(n) traversal costs into O(1) lookups during voting.

Mitigate Sybil attacks by incorporating a minimum token threshold for receiving delegations or by implementing a reputation system based on past voting participation. To handle the revocation of delegation, implement a time-lock or an undelegate function that prevents users from immediately re-delegating the same tokens, thwarting flash loan attacks. Always use the checks-effects-interactions pattern and reentrancy guards when updating delegation state, as these mappings are high-value targets.

For complex delegation logic, consider using an off-chain computation layer with on-chain verification. A relayer can compute the final voting power for a proposal by traversing the delegation graph off-chain, generating a Merkle proof of the result, and submitting it on-chain. This pattern, similar to optimistic rollups, drastically reduces gas fees for voters. Ensure the off-chain service is decentralized or verifiable to maintain trustlessness.

Audit all delegation logic thoroughly. Key test cases should include: concurrent delegation and voting, delegation transfers during an active proposal, and edge cases with zero balances. Use tools like Slither or Foundry's fuzzing to automatically detect invariant violations. Document the exact gas cost of key functions (delegate, vote, undelegate) for users, as these will be their primary concerns when interacting with your system.

conclusion-next-steps
IMPLEMENTATION SUMMARY

Conclusion and Next Steps

This guide has outlined the core architecture for a liquid democracy system, from smart contract design to delegation mechanics. The next step is to integrate these components into a functional application.

You now have the foundational components for a liquid democracy system: a VotingToken for delegation weight, a LiquidDelegation contract for managing delegation graphs, and a ProposalManager for executing votes. The key innovation is the use of a directed acyclic graph (DAG) to track delegation flows, preventing cycles and ensuring vote weight is calculated correctly. Remember to thoroughly test the delegation logic, especially edge cases like self-delegation, delegation chains, and the revocation of delegated power.

To build a complete dApp, you must implement a frontend interface. This should allow users to connect their wallet (e.g., using WalletConnect or MetaMask), view proposals, and manage their delegations interactively. A critical feature is visualizing the delegation graph, which can be done with libraries like D3.js or Cytoscape.js. The UI must clearly show who a user's vote is delegated to and the total voting power they currently wield, including power delegated to them.

For production deployment, security and gas optimization are paramount. Consider conducting an audit with a firm like OpenZeppelin or CertiK. Implement upgradeability patterns (e.g., Transparent Proxy) carefully to allow for future improvements without sacrificing decentralization. Gas costs for complex delegation lookups can be high; explore using state channels or Layer 2 solutions like Arbitrum or Optimism for the voting process to make it accessible.

The system can be extended with advanced features. Implement quadratic voting to mitigate whale dominance by making vote cost increase quadratically with voting power. Add time-locked delegations that automatically expire, or topic-based delegation where a user delegates their vote on finance to one expert and their vote on governance to another. These features make the system more robust and adaptable to different community needs.

Finally, consider the governance lifecycle. A successful system needs clear processes for proposal submission, discussion (perhaps integrated with forums like Commonwealth or Discourse), and execution. The smart contracts should include a timelock on executed proposals to give the community a final window to react if a malicious proposal somehow passes. Start with a test deployment on a testnet with a small community to gather feedback before a mainnet launch.

How to Implement a Liquid Democracy System for Delegation | ChainScore Guides