编译器
0.8.17+commit.8df45f5f
文件 1 的 12:BoostWlIbo.sol
pragma solidity ^0.8.0;
import "../interfaces/IPresaleCvgWl.sol";
import "../interfaces/IboInterface.sol";
import "../interfaces/ICvg.sol";
import "@openzeppelin/contracts/access/Ownable2Step.sol";
contract BoostWlIbo is Ownable2Step {
enum State {
NOT_ACTIVE,
ACTIVE
}
State public state;
mapping(uint256 => uint256) public iboAlreadyClaimed;
mapping(uint256 => uint256) public wlAlreadyClaimed;
address public constant treasuryDao = 0x0af815364BD9e9E60f3d2D3bAc1320B77d3E35F7;
address public constant treasuryAirdrop = 0xCD6cfCE8c8D3b6Efad27390e87D6931d4078B36c;
IPresaleCvgWl public constant wlPresale = IPresaleCvgWl(0xc9740aa94A8A02a3373f5F1b493D7e10d99AE811);
IboInterface public constant iboPresale = IboInterface(0x5F02134C35449D9b6505723A56b02581356320fB);
ICvg public constant cvg = ICvg(0x97efFB790f2fbB701D88f89DB4521348A2B77be8);
uint256 public constant TOTAL_CVG_AMOUNT_BOOST = 165600000000000000000000;
uint256 private constant SIXTY_DAYS = 5_184_000;
uint256 private constant FIVE_PERCENT = 500_000;
uint256 private constant HUNDRED_PERCENT = 10_000_000;
uint256 private constant PRECISION_PADDING = 100_000;
uint256 public vestingStart;
uint256 public vestingEnd;
constructor() {
_transferOwnership(treasuryDao);
}
function getClaimableAmount(uint256 totalBoost, uint256 alreadyClaimed) public view returns (uint256) {
if (state == State.NOT_ACTIVE) {
return 0;
}
uint256 amountClaimable;
if (block.timestamp >= vestingEnd) {
amountClaimable = totalBoost - alreadyClaimed;
} else {
amountClaimable =
((totalBoost * (block.timestamp - vestingStart) * PRECISION_PADDING) /
(SIXTY_DAYS * PRECISION_PADDING)) -
alreadyClaimed;
}
return amountClaimable;
}
function claimBoostWl(uint256 tokenId) external {
require(state == State.ACTIVE, "CLAIM_NOT_ACTIVE");
require(wlPresale.ownerOf(tokenId) == msg.sender, "WL_POSITION_NOT_OWNED");
uint256 alreadyClaimed = wlAlreadyClaimed[tokenId];
uint256 totalBoost = (wlPresale.presaleInfos(tokenId).cvgAmount * FIVE_PERCENT) / HUNDRED_PERCENT;
uint256 amountClaimable = getClaimableAmount(totalBoost, alreadyClaimed);
require(amountClaimable != 0, "NOTHING_CLAIMABLE");
wlAlreadyClaimed[tokenId] = alreadyClaimed + amountClaimable;
cvg.transferFrom(treasuryAirdrop, msg.sender, amountClaimable);
}
function claimBoostIbo(uint256 tokenId) external {
require(state == State.ACTIVE, "CLAIM_NOT_ACTIVE");
require(iboPresale.ownerOf(tokenId) == msg.sender, "IBO_POSITION_NOT_OWNED");
uint256 alreadyClaimed = iboAlreadyClaimed[tokenId];
uint256 totalBoost = (iboPresale.totalCvgPerToken(tokenId) * FIVE_PERCENT) / HUNDRED_PERCENT;
uint256 amountClaimable = getClaimableAmount(totalBoost, alreadyClaimed);
require(amountClaimable != 0, "NOTHING_CLAIMABLE");
iboAlreadyClaimed[tokenId] = alreadyClaimed + amountClaimable;
cvg.transferFrom(treasuryAirdrop, msg.sender, amountClaimable);
}
function startAirdrop() external onlyOwner {
require(cvg.allowance(treasuryAirdrop, address(this)) >= TOTAL_CVG_AMOUNT_BOOST, "INSUFFICIENT_ALLOWANCE");
require(state == State.NOT_ACTIVE, "CLAIM_ALREADY_ACTIVE");
state = State.ACTIVE;
vestingStart = block.timestamp;
vestingEnd = block.timestamp + SIXTY_DAYS;
}
}
文件 2 的 12:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 3 的 12:ICvg.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/interfaces/IERC20Metadata.sol";
interface ICvg is IERC20Metadata {
function MAX_AIRDROP() external view returns (uint256);
function MAX_BOND() external view returns (uint256);
function MAX_STAKING() external view returns (uint256);
function MAX_VESTING() external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
function burn(uint256 amount) external;
function cvgControlTower() external view returns (address);
function decimals() external view returns (uint8);
function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
function mintBond(address account, uint256 amount) external;
function mintStaking(address account, uint256 amount) external;
function mintedBond() external view returns (uint256);
function mintedStaking() external view returns (uint256);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function totalSupply() external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 4 的 12:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 5 的 12: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);
}
文件 6 的 12:IERC20Metadata.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 7 的 12:IERC721.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool approved) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
文件 8 的 12:IERC721Enumerable.sol
pragma solidity ^0.8.0;
import "../IERC721.sol";
interface IERC721Enumerable is IERC721 {
function totalSupply() external view returns (uint256);
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
function tokenByIndex(uint256 index) external view returns (uint256);
}
文件 9 的 12:IPresaleCvgWl.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
interface IPresaleCvgWl is IERC721Enumerable {
enum SaleState {
NOT_ACTIVE,
WL,
OVER
}
struct PresaleInfo {
uint256 vestingType;
uint256 cvgAmount;
}
function setSaleState(SaleState _saleState) external;
function setMerkleRootWlS(bytes32 _newMerkleRootWlS) external;
function setMerkleRootWlM(bytes32 _newMerkleRootWlM) external;
function setMerkleRootWlL(bytes32 _newMerkleRootWlL) external;
function investMint(bytes32[] calldata _merkleProof, uint256 _amount) external;
function presaleInfos(uint256 _tokenId) external view returns (PresaleInfo memory);
function getAmountCvgForVesting() external view returns (uint256);
function getTotalCvg() external view returns (uint256);
function saleState() external view returns (SaleState);
function tokenOfOwnerByIndex(address owner, uint256 index) external view override returns (uint256);
function getTokenIdAndType(
address _wallet,
uint256 _index
) external view returns (uint256 tokenId, uint256 typeVesting);
function getTokenIdsForWallet(address _wallet) external view returns (uint256[] memory);
function MAX_SUPPLY_PRESALE() external view returns (uint256);
function withdrawFunds() external;
function withdrawToken(address _token) external;
}
文件 10 的 12:IboInterface.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
interface IboInterface is IERC721Enumerable {
function totalCvgPerToken(uint256 tokenId) external view returns (uint256);
function iboStartTimestamp() external view returns (uint256);
function getTokenIdsForWallet(address _wallet) external view returns (uint256[] memory);
function getTotalCvgDue() external view returns (uint256);
}
文件 11 的 12:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 12 的 12:Ownable2Step.sol
pragma solidity ^0.8.0;
import "./Ownable.sol";
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
function acceptOwnership() public virtual {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
}
{
"compilationTarget": {
"contracts/Airdrop/BoostWlIbo.sol": "BoostWlIbo"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 250
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"TOTAL_CVG_AMOUNT_BOOST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimBoostIbo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimBoostWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cvg","outputs":[{"internalType":"contract ICvg","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalBoost","type":"uint256"},{"internalType":"uint256","name":"alreadyClaimed","type":"uint256"}],"name":"getClaimableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"iboAlreadyClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"iboPresale","outputs":[{"internalType":"contract IboInterface","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum BoostWlIbo.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAirdrop","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryDao","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wlAlreadyClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlPresale","outputs":[{"internalType":"contract IPresaleCvgWl","name":"","type":"address"}],"stateMutability":"view","type":"function"}]