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 contractDEPLOYER_PRIVATE_KEY
: address which deploys the contractETHERSCAN_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