编译器
0.8.13+commit.abaa5c0e
文件 1 的 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;
}
}
文件 2 的 3:Deathrow.sol
pragma solidity ^0.8.13;
import "@openzeppelin/contracts/access/Ownable.sol";
interface ICelmates {
function ownerOf(uint256 tokenId) external view returns (address);
function tokenOfOwnerByIndex(address owner, uint256 index)
external
view
returns (uint256);
function balanceOf(address owner) external view returns (uint256);
}
struct Infos {
bool status;
address owner;
uint256 timestamp;
}
contract Deathrow is Ownable {
ICelmates private CELMATES;
mapping(uint256 => Infos) public deathRowInfos;
mapping(uint256 => uint256) public points;
mapping(uint256 => uint256) public celmateToType;
bool private opened;
function deathRow(uint256 _celId, bool _status) external {
require(opened, "Deathrow is closed.");
require(
CELMATES.ownerOf(_celId) == msg.sender,
"You don't own this Celmate"
);
Infos memory currDeathRow = deathRowInfos[_celId];
if (_status) {
Infos memory newDeathRow = Infos(true, msg.sender, block.timestamp);
deathRowInfos[_celId] = newDeathRow;
} else {
require(deathRowInfos[_celId].status, "Not on DeathRow");
currDeathRow.status = false;
deathRowInfos[_celId] = currDeathRow;
}
}
function getDeathrow(uint256 _celId)
public
view
returns (Infos memory infos)
{
return deathRowInfos[_celId];
}
function getPoints(address _owner)
public
view
returns (uint256 pointsToReturn)
{
uint256 totalPoints;
uint256 balance = CELMATES.balanceOf(_owner);
for (uint256 i = 0; i < balance; i++) {
uint256 tokenId = CELMATES.tokenOfOwnerByIndex(_owner, i);
Infos memory infos = deathRowInfos[tokenId];
if (infos.owner == _owner && infos.status) {
uint256 daysStaked = (block.timestamp - infos.timestamp) /
60 /
60 /
24;
totalPoints += points[celmateToType[tokenId]] * daysStaked;
}
}
return totalPoints;
}
function setPoints(uint256[] memory _points) external onlyOwner {
for (uint256 i = 0; i < _points.length; i++) {
points[i] = _points[i];
}
}
function setTypes(uint256[] memory _types) external onlyOwner {
for (uint256 i = 0; i < _types.length; i++) {
celmateToType[i] = _types[i];
}
}
function editStake(
uint256 _stakeId,
address _owner,
uint256 _timestamp,
bool _status
) external onlyOwner {
Infos memory infoToEdit = deathRowInfos[_stakeId];
infoToEdit.owner = _owner;
infoToEdit.timestamp = _timestamp;
infoToEdit.status = _status;
deathRowInfos[_stakeId] = infoToEdit;
}
function editTypes(uint256[] memory _ids, uint256[] memory _types)
external
onlyOwner
{
for (uint256 i = 0; i < _ids.length; i++) {
celmateToType[_ids[i]] = _types[i];
}
}
function setOpened(bool _flag) external onlyOwner {
opened = _flag;
}
function setCelmates(address _celmates) external onlyOwner {
CELMATES = ICelmates(_celmates);
}
}
文件 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());
}
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);
}
}
{
"compilationTarget": {
"contracts/Deathrow.sol": "Deathrow"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"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":"uint256","name":"","type":"uint256"}],"name":"celmateToType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_celId","type":"uint256"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"deathRow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deathRowInfos","outputs":[{"internalType":"bool","name":"status","type":"bool"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"editStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_types","type":"uint256[]"}],"name":"editTypes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_celId","type":"uint256"}],"name":"getDeathrow","outputs":[{"components":[{"internalType":"bool","name":"status","type":"bool"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Infos","name":"infos","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getPoints","outputs":[{"internalType":"uint256","name":"pointsToReturn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"points","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_celmates","type":"address"}],"name":"setCelmates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setOpened","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_points","type":"uint256[]"}],"name":"setPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_types","type":"uint256[]"}],"name":"setTypes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]