Address Contract Partially Verified
Address
0x9768E642A7Dc053cda11e8F3362C5E276b64D288
Balance
0 ETH
Nonce
1
Code Size
4852 bytes
Creator
0xaE832734...F876 at tx 0xd65b6eb9...d4c419
Indexed Transactions
0
Contract Bytecode
4852 bytes
0x608060405234801561001057600080fd5b50600436106101585760003560e01c80638da5cb5b116100c3578063de1020f51161007c578063de1020f5146102e9578063ec5ffac2146102fc578063f2fde38b14610305578063f3f8f3fc14610318578063f852a1781461032b578063fbf2903e1461033e57600080fd5b80638da5cb5b1461026857806398bac6ad1461027b578063c428e1141461028e578063d9ceab13146102ae578063db74559b146102b6578063dc3ab866146102d657600080fd5b806353aaa63b1161011557806353aaa63b146101f05780635da96aa51461021057806366666aa91461022357806376aa4c341461022b578063817b1cd2146102565780638d9038521461025f57600080fd5b806302fb0c5e1461015d5780630f15d2b41461017f57806312f49cb71461019257806316934fc4146101a7578063233e9903146101d5578063463942da146101e8575b600080fd5b60075461016a9060ff1681565b60405190151581526020015b60405180910390f35b61016a61018d366004611162565b610347565b6101a56101a0366004611162565b6104c6565b005b6101c76101b536600461117b565b600a6020526000908152604090205481565b604051908152602001610176565b6101a56101e3366004611162565b6104e2565b6101a56104fe565b6101c76101fe36600461117b565b60096020526000908152604090205481565b6101a561021e366004611162565b61053b565b6101c7610557565b60015461023e906001600160a01b031681565b6040516001600160a01b039091168152602001610176565b6101c760065481565b6101c760035481565b60005461023e906001600160a01b031681565b6101a5610289366004611162565b6105c9565b6101c761029c36600461117b565b600b6020526000908152604090205481565b61016a6108af565b6101c76102c436600461117b565b60086020526000908152604090205481565b6101c76102e436600461117b565b610b78565b61016a6102f7366004611162565b610d2e565b6101c760055481565b6101a561031336600461117b565b610e3b565b60025461023e906001600160a01b031681565b6101a5610339366004611162565b610e9d565b6101c760045481565b600080546001600160a01b0316331461035f57600080fd5b6002546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa1580156103a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103cb91906111a4565b101561040e5760405162461bcd60e51b815260206004820152600d60248201526c04e6f7420656e6f756768204c5609c1b60448201526064015b60405180910390fd5b60025460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044015b6020604051808303816000875af1158015610460573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048491906111bd565b5060408051338152602081018490527fefbfe3c015941f3419cd0c7f713fd74c6874d0da2d765adc7f700370ccd5ba5c910160405180910390a1506001919050565b6000546001600160a01b031633146104dd57600080fd5b600455565b6000546001600160a01b031633146104f957600080fd5b600555565b6000546001600160a01b0316331461051557600080fd5b60075460ff161561052c576007805460ff19169055565b6007805460ff19166001179055565b6000546001600160a01b0316331461055257600080fd5b600355565b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156105a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c491906111a4565b905090565b6005548110156106115760405162461bcd60e51b8152602060048201526013602482015272436865636b206d696e696d756d207374616b6560681b6044820152606401610405565b6001546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610659573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067d91906111a4565b10156106cb5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420544f4f4c532042616c616e63650000000000006044820152606401610405565b6001546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610722573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074691906111bd565b6107835760405162461bcd60e51b815260206004820152600e60248201526d14dd185ada5b99c811985a5b195960921b6044820152606401610405565b60006107a66103e86107a08460045461106c90919063ffffffff16565b9061109e565b905060006107b483836110bd565b6006549091506107c490826110d6565b6006556107e96107d333610b78565b336000908152600b6020526040902054906110d6565b336000908152600b6020908152604080832093909355600c90529081205461082190620151809061081b9042906110bd565b906110f1565b905061082d42826110bd565b336000908152600c6020908152604080832093909355600a9052205461085390836110d6565b336000818152600a60209081526040918290209390935580519182529181018490529081018490527ffeb41de252fbc1de97d95a27ed44f6044e66e11df6ca319955eef830b598fdb4906060015b60405180910390a150505050565b6000806108e96108be33610b78565b336000908152600b60209081526040808320546009909252909120546108e3916110d6565b906110d6565b336000908152600c6020526040902054909150620151809061090b90426111f5565b10156109595760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d20636c61696d2074696d65206e6f74207265616368656400006044820152606401610405565b6000811161099f5760405162461bcd60e51b81526020600482015260136024820152724e6f207265776172647320746f20636c61696d60681b6044820152606401610405565b6002546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156109e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0b91906111a4565b1015610a595760405162461bcd60e51b815260206004820152601960248201527f4e6f7420656e6f75676820546f6b656e7320696e20506f6f6c000000000000006044820152606401610405565b336000908152600b602090815260408083208390556009825280832083905560088252808320839055600c909152812054610a9e90620151809061081b9042906110bd565b9050610aaa42826110bd565b336000818152600c60205260409081902092909255600254915163a9059cbb60e01b81526004810191909152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3591906111bd565b5060408051338152602081018490527fefbfe3c015941f3419cd0c7f713fd74c6874d0da2d765adc7f700370ccd5ba5c910160405180910390a160019250505090565b6001600160a01b0381166000908152600c60205260408120548190610ba79062015180906107a09042906110bd565b6002546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610bf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1991906111a4565b6001600160a01b0385166000908152600a6020526040812054919250908190610c4a90670de0b6b3a764000061109e565b90506104b08110610c7b57610c74620186a06107a06023610c6e888189600561106c565b9061106c565b9150610d25565b6102bd8110610c9d57610c74620186a06107a06019610c6e888189600561106c565b61015f8110610cbf57610c74620186a06107a06014610c6e888189600561106c565b60978110610ce057610c74620186a06107a0600a610c6e888189600561106c565b60338110610d0157610c74620186a06107a06007610c6e888189600561106c565b60018110610d2557610d22620186a06107a06003610c6e888189600561106c565b91505b50949350505050565b600080546001600160a01b03163314610d4657600080fd5b6006546001546040516370a0823160e01b81523060048201528492610dc39290916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbd91906111a4565b906110bd565b1015610e045760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820546f6f6c7360801b6044820152606401610405565b60015460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb90604401610441565b6000546001600160a01b03163314610e5257600080fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b336000908152600a60205260409020548111801590610ebc5750600081115b610efb5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f75676820544f4f4c5360801b6044820152606401610405565b6000610f186103e86107a08460035461106c90919063ffffffff16565b90506000610f2683836110bd565b9050610f346107d333610b78565b336000908152600b6020908152604080832093909355600a90522054610f5a90846110bd565b336000908152600a6020908152604080832093909355600c905290812054610f8c90620151809061081b9042906110bd565b9050610f9842826110bd565b336000908152600c6020526040902055600654610fb590856110bd565b60065560015460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d91906111bd565b5060408051338152602081018690529081018490527fefe5e683dfe58f596b38874c815bc9599676515f5e641a3305c40aba31c822a7906060016108a1565b60006110788284611208565b905082158061108f57508161108d8483611235565b145b61109857600080fd5b92915050565b60008082116110ac57600080fd5b6110b68284611235565b9392505050565b6000828211156110cc57600080fd5b6110b682846111f5565b60006110e28284611249565b90508281101561109857600080fd5b60006110b683836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506000818361114f5760405162461bcd60e51b8152600401610405919061125c565b5061115a83856112aa565b949350505050565b60006020828403121561117457600080fd5b5035919050565b60006020828403121561118d57600080fd5b81356001600160a01b03811681146110b657600080fd5b6000602082840312156111b657600080fd5b5051919050565b6000602082840312156111cf57600080fd5b815180151581146110b657600080fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115611098576110986111df565b8082028115828204841417611098576110986111df565b634e487b7160e01b600052601260045260246000fd5b6000826112445761124461121f565b500490565b80820180821115611098576110986111df565b600060208083528351808285015260005b818110156112895785810183015185820160400152820161126d565b506000604082860101526040601f19601f8301168501019250505092915050565b6000826112b9576112b961121f565b50069056fea2646970667358221220e3e6bf3f20b29df69d45b3a2358f1f66927d42efe7f28d16236a41c011c639bb64736f6c63430008120033
Verified Source Code Partial Match
Compiler: v0.8.18+commit.87f61d96
EVM: paris
Optimization: Yes (200 runs)
StakeTools.sol 224 lines
//SPDX-License-Identifier: MIT
// Decentralized LP Distribution Stake for Blocktools.org
// Please refer to Blockpaper.Blocktools.org
pragma solidity ^0.8.0;
interface IERC20 {
function transfer(address to, uint tokens) external returns (bool success);
function transferFrom(address from, address to, uint tokens) external returns (bool success);
function balanceOf(address tokenOwner) external view returns (uint balance);
function approve(address spender, uint tokens) external returns (bool success);
function allowance(address tokenOwner, address spender) external view returns (uint remaining);
function totalSupply() external view returns (uint);
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
library SafeMath {
function add(uint a, uint b) internal pure returns (uint c) {
c = a + b;
require(c >= a);
}
function sub(uint a, uint b) internal pure returns (uint c) {
require(b <= a);
c = a - b;
}
function mul(uint a, uint b) internal pure returns (uint c) {
c = a * b;
require(a == 0 || c / a == b);
}
function div(uint a, uint b) internal pure returns (uint c) {
require(b > 0);
c = a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
contract Owned {
address public owner;
event OwnershipTransferred(address indexed _from, address indexed _to);
constructor() {
owner = msg.sender;
}
modifier onlyOwner {
require(msg.sender == owner);
_;
}
function transferOwnership(address _newOwner) public onlyOwner {
owner = _newOwner;
emit OwnershipTransferred(owner, _newOwner);
}
}
contract StakeTools is Owned {
using SafeMath for uint;
address public BLOCKTOOLS;
address public TOOLS_LP;
uint public feeOnUnstake;
uint public feeOnStake;
uint public minimumStake;
uint public totalStaked;
bool public active = true;
mapping(address => uint) public referralCount;
mapping(address => uint) public referralRewards;
mapping(address => uint) public stakes;
mapping(address => uint) public stakeRewards;
mapping(address => uint) private lastClock;
event OnWithdrawal(address sender, uint amount);
event OnStake(address sender, uint amount, uint tax);
event OnUnstake(address sender, uint amount, uint tax);
constructor(
address _tools,
address _toolsLP,
uint _feeOnStake,
uint _feeOnUnstake,
uint _minimumStake) {
BLOCKTOOLS = _tools;
TOOLS_LP = _toolsLP;
feeOnStake = _feeOnStake;
feeOnUnstake = _feeOnUnstake;
minimumStake = _minimumStake;
}
modifier whenActive() {
require(active == true, "Staking yet to open");
_;
}
function checkEarnings(address _stakeholder) public view returns (uint) {
uint activeDays = (block.timestamp.sub(lastClock[_stakeholder])).div(86400);
uint toolsLPBalance = IERC20(TOOLS_LP).balanceOf(address(this));
uint rewards = 0;
uint stakeAmount = stakes[_stakeholder].div(10**18);
if (stakeAmount >= 1200) {
rewards = toolsLPBalance.mul(5).mul(activeDays).mul(35).div(100000);
} else if (stakeAmount >= 701) {
rewards = toolsLPBalance.mul(5).mul(activeDays).mul(25).div(100000);
} else if (stakeAmount >= 351) {
rewards = toolsLPBalance.mul(5).mul(activeDays).mul(20).div(100000);
} else if (stakeAmount >= 151) {
rewards = toolsLPBalance.mul(5).mul(activeDays).mul(10).div(100000);
} else if (stakeAmount >= 51) {
rewards = toolsLPBalance.mul(5).mul(activeDays).mul(7).div(100000);
} else if (stakeAmount >= 1) {
rewards = toolsLPBalance.mul(5).mul(activeDays).mul(3).div(100000);
}
return rewards;
}
function stakeTools(uint _amount) external {
require(_amount >= minimumStake, "Check minimum stake");
require(IERC20(BLOCKTOOLS).balanceOf(msg.sender) >= _amount, "Insufficient TOOLS Balance");
require(IERC20(BLOCKTOOLS).transferFrom(msg.sender, address(this), _amount), "Staking Failed");
uint stakingTax = (feeOnStake.mul(_amount)).div(1000);
uint afterTax = _amount.sub(stakingTax);
totalStaked = totalStaked.add(afterTax);
stakeRewards[msg.sender] = (stakeRewards[msg.sender]).add(checkEarnings(msg.sender));
uint remainder = (block.timestamp.sub(lastClock[msg.sender])).mod(86400);
lastClock[msg.sender] = block.timestamp.sub(remainder);
stakes[msg.sender] = (stakes[msg.sender]).add(afterTax);
emit OnStake(msg.sender, afterTax, stakingTax);
}
function unstakeTools(uint _amount) external {
require(_amount <= stakes[msg.sender] && _amount > 0, "Not enough TOOLS");
uint unstakingTax = (feeOnUnstake.mul(_amount)).div(1000);
uint afterTax = _amount.sub(unstakingTax);
stakeRewards[msg.sender] = (stakeRewards[msg.sender]).add(checkEarnings(msg.sender));
stakes[msg.sender] = (stakes[msg.sender]).sub(_amount);
uint remainder = (block.timestamp.sub(lastClock[msg.sender])).mod(86400);
lastClock[msg.sender] = block.timestamp.sub(remainder);
totalStaked = totalStaked.sub(_amount);
IERC20(BLOCKTOOLS).transfer(msg.sender, afterTax);
emit OnUnstake(msg.sender, _amount, unstakingTax);
}
function claimEarnings() external returns (bool success) {
uint totalReward = (referralRewards[msg.sender]).add(stakeRewards[msg.sender]).add(checkEarnings(msg.sender));
require((block.timestamp - lastClock[msg.sender]) >= 86400, "Minimum claim time not reached");
require(totalReward > 0, "No rewards to claim");
require(IERC20(TOOLS_LP).balanceOf(address(this)) >= totalReward, "Not enough Tokens in Pool");
stakeRewards[msg.sender] = 0;
referralRewards[msg.sender] = 0;
referralCount[msg.sender] = 0;
uint remainder = (block.timestamp.sub(lastClock[msg.sender])).mod(86400);
lastClock[msg.sender] = block.timestamp.sub(remainder);
IERC20(TOOLS_LP).transfer(msg.sender, totalReward);
emit OnWithdrawal(msg.sender, totalReward);
return true;
}
function rewardPool() external view returns (uint) {
return IERC20(TOOLS_LP).balanceOf(address(this));
}
function changePoolStatus() external onlyOwner() {
if(active) {
active = false;
} else {
active = true;
}
}
function setFeeOnStake(uint _feeOnStake) external onlyOwner() {
feeOnStake = _feeOnStake;
}
function setFeeOnUnstake(uint _feeOnUnstake) external onlyOwner() {
feeOnUnstake = _feeOnUnstake;
}
function setMinimumStake(uint _minimumStake) external onlyOwner() {
minimumStake = _minimumStake;
}
function rescueTools(uint _amount) external onlyOwner returns (bool success) {
require((IERC20(BLOCKTOOLS).balanceOf(address(this))).sub(totalStaked) >= _amount, "Not enough Tools");
IERC20(BLOCKTOOLS).transfer(msg.sender, _amount);
emit OnWithdrawal(msg.sender, _amount);
return true;
}
function rescueLP(uint _amount) external onlyOwner returns (bool success) {
require(IERC20(TOOLS_LP).balanceOf(address(this)) >= _amount, "Not enough LP");
IERC20(TOOLS_LP).transfer(msg.sender, _amount);
emit OnWithdrawal(msg.sender, _amount);
return true;
}
}
Read Contract
BLOCKTOOLS 0x76aa4c34 → address
TOOLS_LP 0xf3f8f3fc → address
active 0x02fb0c5e → bool
checkEarnings 0xdc3ab866 → uint256
feeOnStake 0xfbf2903e → uint256
feeOnUnstake 0x8d903852 → uint256
minimumStake 0xec5ffac2 → uint256
owner 0x8da5cb5b → address
referralCount 0xdb74559b → uint256
referralRewards 0x53aaa63b → uint256
rewardPool 0x66666aa9 → uint256
stakeRewards 0xc428e114 → uint256
stakes 0x16934fc4 → uint256
totalStaked 0x817b1cd2 → uint256
Write Contract 10 functions
These functions modify contract state and require a wallet transaction to execute.
changePoolStatus 0x463942da
No parameters
claimEarnings 0xd9ceab13
No parameters
returns: bool
rescueLP 0x0f15d2b4
uint256 _amount
returns: bool
rescueTools 0xde1020f5
uint256 _amount
returns: bool
setFeeOnStake 0x12f49cb7
uint256 _feeOnStake
setFeeOnUnstake 0x5da96aa5
uint256 _feeOnUnstake
setMinimumStake 0x233e9903
uint256 _minimumStake
stakeTools 0x98bac6ad
uint256 _amount
transferOwnership 0xf2fde38b
address _newOwner
unstakeTools 0xf852a178
uint256 _amount
Recent Transactions
No transactions found for this address