Gates
Gates are small contracts with simple checks that can be used on contracts. Similar to OpenZeppelin’s Ownable with the modifier onlyOwner.
TokenGate
TokenGate lets us check the balance of ERC20 or ERC721 tokens.
modifier onlyToken(account, token, amount)Example
contract GatedPoolWithMerkleClaim is Pool, TokenGate, MerkleClaim {
address private alloToken;
address private guildNFT;
constructor(address _alloToken, address _guildNFT, string memory _name, string memory _schema, string memory _metadataURI)
Pool(_name, _schema, _metadataURI) {
alloToken = _alloToken;
guildNFT = _guildNFT;
}
// Only holders of 1 Guild NFT can register projects
function register(
address project,
string memory metadataURI, // Metadata contain Application Details
bytes memory data
) public override onlyToken(msg.sender, guildNFT, 1) {
_register(project, metadataURI, data);
}
// Only holders of 10 ALLO tokens can review projects
function review(
address project,
uint8 status,
string memory metadataURI, // Metadata contains Application Review
bytes memory data
) public override onlyToken(msg.sender, alloToken, 10 ** 18) {
_review(project, status, metadataURI, data);
}
// Only Owner can update Merkle
function setMerkle(bytes32 _root) public override onlyOwner {
_setMerkle(_root);
}
// This is the same function as in MerkleClaim added here for clarity
function claim(bytes32[] memory proof, address token, address recipient, uint256 amount) public override {
if (_verify(proof, token, recipient, amount)) {
IERC20(token).transfer(recipient, amount);
emit Claim(recipient, amount, token);
}
}
}EASGate
Check if an account has an attestation for a specific schemaUID and attester. Can be used for example for OP Badgeholders or only approved projects can register projects.
modifier onlyEAS(account, schemaUID, attester)contract OptimismRetroFunding is Pool, EASGate {
constructor(string memory _name, string memory _schema, string memory _metadataURI)
Pool(_name, _schema, _metadataURI) {}
// Only OP Badgeholders can allocate
function allocate(address[] memory recipients, uint256[] memory amounts, address token, bytes[] memory data)
public override onlyEAS(msg.sender, badgeholderSchemaUID, approvedAttester) {
_allocate(recipients, amounts, token, data);
}
// Only approved projects can register
function register(address project, string memory metadataURI, bytes memory data)
public override onlyEAS(project, approvedSchemaUID, approvedAttester) {
_register(project, metadataURI, data);
}
}Last updated on