Writing a Custom Voting Strategy
- Tutorial that walks through writing a custom strategy
- Explain the 5 "components" of a strategy
- use one of the library/pre-built components
- implement at least one component in the strategy (not using a component)
- using the tests from allo-v2
Setting Up
- Fork the allo-protocol/contracts (opens in a new tab) repo.
- Follow the dev
steps (opens in a new tab) to
install pnpm and run the tests in your environment.
- When creating the .env file, you will need to fill in the following
values:
- INFURA_ID: Infura ID for deploying contract
- DEPLOYER_PRIVATE_KEY: address which deploys the contract
- ETHERSCAN_API_KEY: API key for etherscan verification
 
 
- When creating the .env file, you will need to fill in the following
values:
- Create a new voting strategy solidity file in contracts/votingStrategy and have it inherit from IVotingStrategy.
{% hint style="warning" %}
All voting strategy contracts must inherit from the IVotingStrategy interface
{% endhint %}
import "@allo/votingStrategy/IVotingStrategy.sol";
contract CustomVoting is IVotingStrategy {Writing the Contract
Adding the Vote Function
The IVotingStrategy provides a basic vote function: \
function vote(bytes[] calldata _encodedVotes, address _voterAddress) external virtual payable;
To implement it in your contract you will need to:
- add isRoundContract modifier
- decode votes
- add the vote logic
- emit a voted event
Emitting events
It is best practice to have your contract emit events when functions are called. Below is a sample voted event.
//// @notice Emitted when a new vote is sent
  event Voted(
    address token,                    // voting token
    uint256 amount,                   // voting amount
    address indexed voter,            // voter address
    address grantAddress,             // grant address
    bytes32 indexed projectId,        // project id
    uint256 applicationIndex,         // application index
    address indexed roundAddress      // round address
  );Deploying to a Chain
The Allo project has been configured to support the following chains:
- goerli
- optimism-mainnet
- fantom-mainnet
- fantom-testnet
- mainnet
One of these chains will need to be provided when running a deploy script.
Deployment Steps
- 
Create a deploy script. The scripts (opens in a new tab) for the Quadratic Funding contract can be used as a template. Be sure to replace all mentions of QuadraticFunding with your contract name. 
- 
Add the new script information to the package.json (opens in a new tab) so it can easily be run using pnpm. The voting scripts can be found under "// vote-deploy-scripts"\  
- 
Follow the Voting Strategy deploy steps (opens in a new tab) using the scripts you created and the chain you wish to deploy to.\ ex: pnpm run deploy-newVoting-factory goerli