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