Skip to Content

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