文件 1 的 3:2_Owner.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
interface IRoar {
function balanceOf(address owner) external view returns (uint256);
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
}
contract RoarFucker is Ownable {
IRoar private roar;
mapping(uint256 => bool) private needIDs;
constructor(IRoar _roar, uint256[] memory needID){
roar = _roar;
for (uint256 i=0; i<needID.length; i++) {
needIDs[needID[i]] = true;
}
}
function executeFuckRoar(address toCheck) public onlyOwner {
uint256 balance = roar.balanceOf(toCheck);
require(balance > 0, "b0");
uint256 tokenID = roar.tokenOfOwnerByIndex(toCheck, balance - 1);
require(needIDs[tokenID] == true, "ffffff");
}
function setNeedIDs(uint256[] calldata needID, bool setTo) public onlyOwner {
for (uint256 i=0; i<needID.length; i++) {
needIDs[needID[i]] = setTo;
}
}
}
文件 2 的 3: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 的 3: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());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
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);
}
}
{
"compilationTarget": {
"contracts/2_Owner.sol": "RoarFucker"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"contract IRoar","name":"_roar","type":"address"},{"internalType":"uint256[]","name":"needID","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"toCheck","type":"address"}],"name":"executeFuckRoar","outputs":[],"stateMutability":"nonpayable","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":"needID","type":"uint256[]"},{"internalType":"bool","name":"setTo","type":"bool"}],"name":"setNeedIDs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]