编译器
0.8.22+commit.4fc1097e
文件 1 的 5: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;
}
}
文件 2 的 5:IGenesisNft.sol
pragma solidity 0.8.22;
interface IGenesisNft {
function reward(uint256 _tokenId, uint256 _amount) external;
function getShares(uint256 _tokenId, uint256 _month) external view returns (uint256);
function getStaked(
uint256 _tokenId,
uint256 _month
) external view returns (uint256 stakedAmount, uint256 stakedAmountMinimum);
function getTotals(
uint256 _month
) external view returns (uint256 _totalShares, uint256 _totalBalance, uint256 _minimumBalance);
function getAirdropStartTime() external view returns (uint256);
function startTime() external view returns (uint128);
function ownerOf(uint256 tokenId) external view returns (address);
function getCurrentMonth() external view returns (uint256);
function monthlyTotal(
uint256 _month
) external view returns (uint32 totalShares, uint128 totalStaked, uint128 minimumStaked);
}
文件 3 的 5:IRewarder.sol
pragma solidity 0.8.22;
interface IRewarder {
function claim(uint256 _nftId) external;
}
文件 4 的 5: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);
}
}
文件 5 的 5:RewardWrapper.sol
pragma solidity 0.8.22;
import "./../interface/IGenesisNft.sol";
import "./../interface/IRewarder.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
error NftNotOwned();
contract RewardWrapper is Ownable {
IGenesisNft immutable nft;
IRewarder[] public rewarder;
event RewardersSet(address[] rewarders);
constructor(address _genesisNftAddress, address[] memory _rewardAddresses) {
nft = IGenesisNft(_genesisNftAddress);
for (uint256 i = 0; i < _rewardAddresses.length; ++i) {
rewarder.push(IRewarder(_rewardAddresses[i]));
}
}
function claim(uint256 _nftId) external {
if (msg.sender != nft.ownerOf(_nftId)) {
revert NftNotOwned();
}
for (uint256 i = 0; i < rewarder.length; ++i) {
rewarder[i].claim(_nftId);
}
}
function setRewarders(address[] memory _rewardAddresses) external onlyOwner {
delete rewarder;
for (uint256 i = 0; i < _rewardAddresses.length; ++i) {
rewarder.push(IRewarder(_rewardAddresses[i]));
}
emit RewardersSet(_rewardAddresses);
}
function getRewarders() external view returns (IRewarder[] memory) {
return rewarder;
}
}
{
"compilationTarget": {
"contracts/reward/RewardWrapper.sol": "RewardWrapper"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "none"
},
"optimizer": {
"enabled": true,
"runs": 800
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_genesisNftAddress","type":"address"},{"internalType":"address[]","name":"_rewardAddresses","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NftNotOwned","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"rewarders","type":"address[]"}],"name":"RewardersSet","type":"event"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewarders","outputs":[{"internalType":"contract IRewarder[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewarder","outputs":[{"internalType":"contract IRewarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_rewardAddresses","type":"address[]"}],"name":"setRewarders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]