文件 1 的 8: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 的 8:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 3 的 8:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, 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 sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 4 的 8: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
) external;
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function setApprovalForAll(address operator, bool _approved) external;
function isApprovedForAll(address owner, address operator) external view returns (bool);
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
文件 5 的 8:IERC721Receiver.sol
pragma solidity ^0.8.0;
interface IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
文件 6 的 8: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);
}
}
文件 7 的 8:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
文件 8 的 8:stakeing.sol
pragma solidity ^0.8.7;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
contract stakeing is Ownable , IERC721Receiver,ReentrancyGuard{
address nftAddress = 0x3F916867A9f38aa68aD7583C7360f83387d06dAf;
address erc20Address = 0xf4d2888d29D722226FafA5d9B24F9164c092421E;
uint8 public singlehashrate = 2 ;
uint8 public doublehashrate = 5 ;
uint8 public pairhashrate = 10 ;
mapping(address => uint256[] ) public stakedEyeStarIds30;
mapping(address => uint256[] ) public stakedEyeStarIds60;
mapping(address => uint256) public hashrate30;
mapping(address => uint256) public hashrate60;
uint256 public totalhashrate30;
uint256 public totalhashrate60;
uint256 public amonut30;
uint256 public amonut60;
uint256 public stakeStartdate;
bool public claimLive30;
bool public claimLive60;
bool public stakeLive;
bool public depositLive = true;
constructor() {
stakeStartdate = block.timestamp;
}
function toggleClaimLive30() external onlyOwner {
claimLive30 = !claimLive30;
}
function toggleClaimLive60() external onlyOwner {
claimLive60 = !claimLive60;
}
function toggleDepositLivee() external onlyOwner {
depositLive = !depositLive;
}
function setAmount30(uint256 amonut) external onlyOwner {
amonut30 = amonut;
}
function setAmount60(uint256 amonut) external onlyOwner {
amonut60 = amonut;
}
function set20Address(address erc20) external onlyOwner {
erc20Address = erc20;
}
function confirmHashrate(uint256 amount) public onlyOwner {
amonut30 = ( totalhashrate30 * 100 / ( totalhashrate30 + totalhashrate60 ) ) * amount / 100;
amonut60 = amount - amonut30;
stakeLive = !stakeLive;
stakeStartdate = block.timestamp;
}
function deposit(uint256[] memory single,uint256[2][] memory double,uint256 lockMod) external {
require(lockMod==1 || lockMod ==2, "lockMod abnormal");
require(depositLive, "deposit end");
if(single.length>0) {
_deposit(single,lockMod);
}
if(double.length>0) {
_depositDouble(double,lockMod);
}
}
function _deposit(uint256[] memory eyeStarIds,uint256 lockMod) private {
uint256 hashrate;
for(uint256 i = 0; i < eyeStarIds.length ; i++){
uint256 eyeStarId = eyeStarIds[i];
IERC721(nftAddress).safeTransferFrom(msg.sender,address(this),eyeStarId);
hashrate +=singlehashrate;
if(lockMod == 1){
stakedEyeStarIds30[msg.sender].push(eyeStarId);
}else{
stakedEyeStarIds60[msg.sender].push(eyeStarId);
}
}
if(lockMod == 1){
hashrate30[msg.sender] += hashrate;
totalhashrate30 += hashrate;
}else{
hashrate60[msg.sender] += hashrate;
totalhashrate60 += hashrate;
}
}
function _depositDouble(uint256[2][] memory eyeStarIds,uint256 lockMod) private {
for(uint256 i = 0; i < eyeStarIds.length ; i++){
uint256 leftId = eyeStarIds[i][0];
uint256 rightId = eyeStarIds[i][1];
require(leftId!=0 && rightId!=0, "direction error1");
require(leftId<=3605, "direction error2");
require(rightId>3605, "direction error3");
}
uint256 stakeType;
uint256 hashrate;
for(uint256 i = 0; i < eyeStarIds.length ; i++){
uint256 leftId = eyeStarIds[i][0];
uint256 rightId = eyeStarIds[i][1];
IERC721(nftAddress).safeTransferFrom(msg.sender,address(this),leftId);
IERC721(nftAddress).safeTransferFrom(msg.sender,address(this),rightId);
if(leftId+rightId == 7212){
hashrate += pairhashrate;
stakeType = 3;
}else{
hashrate += doublehashrate;
stakeType = 2;
}
if(lockMod == 1){
stakedEyeStarIds30[msg.sender].push(leftId);
stakedEyeStarIds30[msg.sender].push(rightId);
}else{
stakedEyeStarIds60[msg.sender].push(leftId);
stakedEyeStarIds60[msg.sender].push(rightId);
}
}
if(lockMod == 1){
hashrate30[msg.sender] += hashrate;
totalhashrate30 += hashrate;
}else{
hashrate60[msg.sender] += hashrate;
totalhashrate60 += hashrate;
}
}
function unstake30() public nonReentrant() {
for (uint256 i; i < stakedEyeStarIds30[msg.sender].length; i++) {
uint256 tokenId = stakedEyeStarIds30[msg.sender][i];
IERC721(nftAddress).safeTransferFrom(address(this), msg.sender,tokenId);
}
delete stakedEyeStarIds30[msg.sender];
if(!stakeLive){
totalhashrate30 -= hashrate30[msg.sender];
}
hashrate30[msg.sender] = 0;
}
function unstake60() public nonReentrant() {
for (uint256 i; i < stakedEyeStarIds60[msg.sender].length; i++) {
uint256 tokenId = stakedEyeStarIds60[msg.sender][i];
IERC721(nftAddress).safeTransferFrom(address(this), msg.sender,tokenId);
}
delete stakedEyeStarIds60[msg.sender];
if(!stakeLive){
totalhashrate60 -= hashrate60[msg.sender];
}
hashrate60[msg.sender] = 0;
}
function _claimToken(uint256 lockMod) private {
uint256 reward ;
if(lockMod==1 ){
reward = amonut30 / totalhashrate30 * hashrate30[msg.sender];
unstake30();
}else{
reward = amonut60 / totalhashrate60 * hashrate60[msg.sender];
unstake60();
}
IERC20(erc20Address).transfer(msg.sender, reward);
}
function expirationDate30 () external view returns (bool){
return stakeStartdate + 30 days <= block.timestamp || claimLive30;
}
function expirationDate60 () external view returns (bool){
return stakeStartdate + 60 days <= block.timestamp || claimLive60;
}
function claimAndWithdraw30() external {
require( stakeStartdate + 30 days <= block.timestamp || claimLive30, "claim_closed");
require(hashrate30[msg.sender] > 0, "not hashrate");
_claimToken(1);
}
function claimAndWithdraw60() external {
require( stakeStartdate + 60 days <= block.timestamp || claimLive60, "claim_closed");
require(hashrate60[msg.sender] > 0, "not hashrate");
_claimToken(2);
}
function numberOfStaked(address user, uint256 lockMod) external view returns (uint256) {
if(lockMod==1 ){
return (stakedEyeStarIds30[user].length);
}else{
return (stakedEyeStarIds60[user].length);
}
}
function withdrawTokens() external onlyOwner {
uint256 tokenSupply = IERC20(erc20Address).balanceOf(address(this));
IERC20(erc20Address).transfer(msg.sender, tokenSupply);
}
function onERC721Received(address,address,uint256,bytes calldata) external pure override returns (bytes4) {
return IERC721Receiver.onERC721Received.selector;
}
}
{
"compilationTarget": {
"stakeing.sol": "stakeing"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"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":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"amonut30","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amonut60","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAndWithdraw30","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAndWithdraw60","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimLive30","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLive60","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"confirmHashrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"single","type":"uint256[]"},{"internalType":"uint256[2][]","name":"double","type":"uint256[2][]"},{"internalType":"uint256","name":"lockMod","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doublehashrate","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expirationDate30","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expirationDate60","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hashrate30","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hashrate60","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"lockMod","type":"uint256"}],"name":"numberOfStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairhashrate","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20","type":"address"}],"name":"set20Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amonut","type":"uint256"}],"name":"setAmount30","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amonut","type":"uint256"}],"name":"setAmount60","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"singlehashrate","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeStartdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakedEyeStarIds30","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakedEyeStarIds60","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleClaimLive30","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleClaimLive60","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleDepositLivee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalhashrate30","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalhashrate60","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstake30","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstake60","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]