编译器
0.8.24+commit.e11b9ed9
文件 1 的 4:EdoDistributor.sol
pragma solidity >=0.8.19;
import "./interfaces/IEdoDistributor.sol";
contract EdoDistributor is IEdoDistributor {
ICCLP public immutable cclp;
IERC20 public immutable ele;
uint256 public immutable totalBalance;
uint256 public totalAlloc;
mapping(address => bool) public claimed;
bool public notified;
constructor(address _cclp, IERC20 _ele) {
cclp = ICCLP(_cclp);
ele = _ele;
totalBalance = cclp.buyInAmt();
}
function notify() external {
if (notified) revert Notified();
notified = true;
totalAlloc = ele.balanceOf(address(this));
}
function claim() external {
address sender = msg.sender;
if (claimed[sender]) revert Claimed();
uint256 allocated = (totalAlloc * cclp.balanceOf(sender)) /
totalBalance;
claimed[sender] = true;
ele.transfer(sender, allocated);
emit Claim(sender, allocated);
}
}
文件 2 的 4:ICCLP.sol
pragma solidity >=0.8.19;
interface ICCLP {
function roleCaps(uint256) external view returns (uint256);
function roleSigners(uint256) external view returns (address);
function uids(bytes calldata) external view returns (address);
function accounts(address) external view returns (bytes memory);
function balanceOf(address) external view returns (uint256);
function totalCap() external view returns (uint256);
function buyInAmt() external view returns (uint256);
function treasury() external view returns (address);
error ExceedsTotalCap();
error NotSameLength();
error MisMatchUID();
error ExceedCap();
error InvalidSignature();
error CCLPEnded();
}
文件 3 的 4:IERC20.sol
pragma solidity ^0.8.20;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 4 的 4:IEdoDistributor.sol
pragma solidity >=0.8.19;
import "./ICCLP.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IEdoDistributor {
event Claim(address indexed sender, uint256 amount);
event Notify(uint256 amount);
error Claimed();
error Notified();
function cclp() external view returns (ICCLP);
function ele() external view returns (IERC20);
function totalBalance() external view returns (uint256);
function totalAlloc() external view returns (uint256);
function claimed(address account) external view returns (bool);
function notified() external view returns (bool);
function claim() external;
function notify() external;
}
{
"compilationTarget": {
"src/EdoDistributor.sol": "EdoDistributor"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/"
]
}
[{"inputs":[{"internalType":"address","name":"_cclp","type":"address"},{"internalType":"contract IERC20","name":"_ele","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Claimed","type":"error"},{"inputs":[],"name":"Notified","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Notify","type":"event"},{"inputs":[],"name":"cclp","outputs":[{"internalType":"contract ICCLP","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ele","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAlloc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]