编译器
0.8.16+commit.07a7930e
文件 1 的 5:IERC20.sol
pragma solidity ^0.8.0;
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 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
文件 2 的 5:IGenericRewardDistributor.sol
pragma solidity >=0.5.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { IbSect, IveSect } from "./ITokens.sol";
interface IRewardDistributorEvents {
event Claimed(address indexed account, uint256 amount, bool indexed historic);
event RootUpdated(bytes32 oldRoot, bytes32 indexed newRoot);
event TokenAllocated(address indexed account, uint8 indexed campaignId, uint256 amount);
}
interface IGenericRewardDistributor is IRewardDistributorEvents {
function token() external view returns (IERC20);
function merkleRoot() external view returns (bytes32);
function claimed(address user) external view returns (uint256);
function claim(
address account,
uint256 totalAmount,
bytes32[] calldata merkleProof
) external;
}
文件 3 的 5:ITokens.sol
pragma solidity ^0.8.16;
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IbSect is IERC20 {
function setPrice(uint256 price_) external;
function mintTo(address to, uint256 amount) external;
function convert(uint256 amount) external;
function claimUnderlying(address to) external;
}
interface IveSect is IERC20 {
function setVeToken(address veToken_) external;
function mintTo(address to, uint256 amount) external;
function convertToLock(uint256 amount) external;
function addValueToLock(uint256 amount) external;
}
文件 4 的 5:MerkleClaimer.sol
pragma solidity 0.8.16;
import { IGenericRewardDistributor } from "./interfaces/IGenericRewardDistributor.sol";
import { OwnableWithTransfer } from "./utils/OwnableWithTransfer.sol";
struct RewardClaim {
address distributor;
uint256 amount;
bytes32[] proof;
}
contract MerkleClaimer is OwnableWithTransfer {
mapping(address => bool) public whitelist;
constructor(address[] memory merkleDistributors) OwnableWithTransfer(msg.sender) {
for (uint256 i = 0; i < merkleDistributors.length; ++i) {
whitelist[merkleDistributors[i]] = true;
}
}
function updateWhitelist(address _address, bool status) external onlyOwner {
whitelist[_address] = status;
emit UpdateWhitelist(_address, status);
}
function claim(address account, RewardClaim[] calldata claims) external {
for (uint256 i = 0; i < claims.length; ++i) {
if (!whitelist[claims[i].distributor]) revert NotWhitelisted();
IGenericRewardDistributor(claims[i].distributor).claim(
account,
claims[i].amount,
claims[i].proof
);
}
}
error NotWhitelisted();
event UpdateWhitelist(address indexed _address, bool status);
}
文件 5 的 5:OwnableWithTransfer.sol
pragma solidity 0.8.16;
abstract contract OwnableWithTransfer {
address public owner;
address public pendingOwner;
modifier onlyOwner() {
if (msg.sender != owner) revert NotOwner();
_;
}
constructor(address _owner) {
if (_owner == address(0)) revert OwnerCannotBeZero();
owner = _owner;
emit OwnershipTransferred(address(0), _owner);
}
function transferOwnership(address _pendingOwner) external onlyOwner {
pendingOwner = _pendingOwner;
emit OwnershipTransferInitiated(owner, _pendingOwner);
}
function acceptOwnership() external {
if (msg.sender != pendingOwner) revert OnlyPendingOwner();
pendingOwner = address(0);
owner = pendingOwner;
emit OwnershipTransferred(owner, pendingOwner);
}
event OwnershipTransferInitiated(address owner, address pendingOwner);
event OwnershipTransferred(address oldOwner, address newOwner);
error OwnerCannotBeZero();
error OnlyPendingOwner();
error NotOwner();
}
{
"compilationTarget": {
"src/sector-token/src/MerkleClaimer.sol": "MerkleClaimer"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 1
},
"remappings": []
}
[{"inputs":[{"internalType":"address[]","name":"merkleDistributors","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"NotWhitelisted","type":"error"},{"inputs":[],"name":"OnlyPendingOwner","type":"error"},{"inputs":[],"name":"OwnerCannotBeZero","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipTransferInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"UpdateWhitelist","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"components":[{"internalType":"address","name":"distributor","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"internalType":"struct RewardClaim[]","name":"claims","type":"tuple[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pendingOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]