Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14535146 | 963 days ago | IN | 0 ETH | 0.22955086 |
Loading...
Loading
Contract Name:
ETHPoolV3
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "./IERC20.sol"; import "./IETHPool.sol"; import "./IStrongPool.sol"; import "./PlatformFees.sol"; import "./ReentrancyGuard.sol"; import "./SafeMath.sol"; contract ETHPoolV3 is IETHPool, IStrongPool, ReentrancyGuard, PlatformFees { using SafeMath for uint256; bool public initialized; uint256 public epochId; uint256 public totalStaked; mapping(address => bool) public poolContracts; mapping(uint256 => address) public stakeOwner; mapping(uint256 => uint256) public stakeAmount; mapping(uint256 => uint256) public stakeTimestamp; mapping(uint256 => bool) public stakeStatus; uint256 private stakeId; IERC20 private strongTokenContract; mapping(address => mapping(uint256 => uint256)) private _ownerIdIndex; mapping(address => uint256[]) private _ownerIds; event FallBackLog(address sender, uint256 value); event PaymentProcessed(address receiver, uint256 amount); function init( address strongAddress_, uint256 stakeFeeNumerator_, uint256 stakeFeeDenominator_, uint256 unstakeFeeNumerator_, uint256 unstakeFeeDenominator_, uint256 minStakeAmount_, uint256 stakeTxLimit_, address payable feeWallet_, address serviceAdmin_ ) external { require(!initialized, "ETH2.0Pool: init done"); PlatformFees.init( stakeFeeNumerator_, stakeFeeDenominator_, unstakeFeeNumerator_, unstakeFeeDenominator_, minStakeAmount_, stakeTxLimit_, feeWallet_, serviceAdmin_ ); ReentrancyGuard.init(); epochId = 1; stakeId = 1; strongTokenContract = IERC20(strongAddress_); initialized = true; } function stake(uint256 amount_) external payable nonReentrant override { require(amount_.mul(stakeFeeNumerator).div(stakeFeeDenominator) == msg.value, "ETH2.0Pool: Value can not be greater or less than staking fee"); stake_(amount_, msg.sender); require(strongTokenContract.transferFrom(msg.sender, address(this), amount_), "ETH2.0Pool: Insufficient funds"); processPayment(feeWallet, msg.value); } function mineFor(address userAddress_, uint256 amount_) external override { require(poolContracts[msg.sender], "ETH2.0Pool: Caller not authorised to call this function"); stake_(amount_, userAddress_); require(strongTokenContract.transferFrom(msg.sender, address(this), amount_), "ETH2.0Pool: Insufficient funds"); } function unStake(uint256[] memory stakeIds_) external payable nonReentrant override { require(stakeIds_.length <= stakeTxLimit, "ETH2.0Pool: Input array length is greater than approved length"); uint256 userTokens = 0; for (uint256 i = 0; i < stakeIds_.length; i++) { require(stakeOwner[stakeIds_[i]] == msg.sender, "ETH2.0Pool: Only owner can unstake"); require(stakeStatus[stakeIds_[i]], "ETH2.0Pool: Transaction already unStaked"); stakeStatus[stakeIds_[i]] = false; userTokens = userTokens.add(stakeAmount[stakeIds_[i]]); if (_ownerIdExists(msg.sender, stakeIds_[i])) { _deleteOwnerId(msg.sender, stakeIds_[i]); } emit Unstaked(msg.sender, stakeIds_[i], stakeAmount[stakeIds_[i]], block.timestamp); } if (userTokens.mul(unstakeFeeNumerator).div(unstakeFeeDenominator) != msg.value) { revert("ETH2.0Pool: Value can not be greater or less than unstaking fee"); } totalStaked = totalStaked.sub(userTokens); require(strongTokenContract.transfer(msg.sender, userTokens), "ETH2.0Pool: Insufficient Strong tokens"); processPayment(feeWallet, userTokens.mul(unstakeFeeNumerator).div(unstakeFeeDenominator)); } function stake_(uint256 amount_, address userAddress_) internal { require(_ownerIds[userAddress_].length < stakeTxLimit, "ETH2.0Pool: User can not exceed stake tx limit"); require(amount_ >= minStakeAmount, "ETH2.0Pool: Amount can not be less than minimum staking amount"); require(userAddress_ != address(0), "ETH2.0Pool: Invalid user address"); stakeOwner[stakeId] = userAddress_; stakeAmount[stakeId] = amount_; stakeTimestamp[stakeId] = block.timestamp; stakeStatus[stakeId] = true; totalStaked = totalStaked.add(amount_); if (!_ownerIdExists(userAddress_, stakeId)) { _addOwnerId(userAddress_, stakeId); } emit Staked(userAddress_, stakeId, amount_, block.timestamp); incrementStakeId(); } function addVerifiedContract(address contractAddress_) external anyAdmin { require(contractAddress_ != address(0), "ETH2.0Pool: Invalid contract address"); poolContracts[contractAddress_] = true; } function removeVerifiedContract(address contractAddress_) external anyAdmin { require(poolContracts[contractAddress_], "ETH2.0Pool: Contract address not verified"); poolContracts[contractAddress_] = false; } function getUserIds(address user_) external view returns (uint256[] memory) { return _ownerIds[user_]; } function getUserIdIndex(address user_, uint256 id_) external view returns (uint256) { return _ownerIdIndex[user_][id_]; } function processPayment(address payable recipient_, uint256 amount_) private { (bool sent,) = recipient_.call{value : amount_}(""); require(sent, "ETH2.0Pool: Failed to send Ether"); emit PaymentProcessed(recipient_, amount_); } function incrementStakeId() private { stakeId = stakeId.add(1); } function _deleteOwnerId(address owner_, uint256 id_) internal { uint256 lastIndex = _ownerIds[owner_].length.sub(1); uint256 lastId = _ownerIds[owner_][lastIndex]; if (id_ == lastId) { _ownerIdIndex[owner_][id_] = 0; _ownerIds[owner_].pop(); } else { uint256 indexOfId = _ownerIdIndex[owner_][id_]; _ownerIdIndex[owner_][id_] = 0; _ownerIds[owner_][indexOfId] = lastId; _ownerIdIndex[owner_][lastId] = indexOfId; _ownerIds[owner_].pop(); } } function _addOwnerId(address owner, uint256 id) internal { uint256 len = _ownerIds[owner].length; _ownerIdIndex[owner][id] = len; _ownerIds[owner].push(id); } function _ownerIdExists(address owner, uint256 id) internal view returns (bool) { if (_ownerIds[owner].length == 0) return false; uint256 index = _ownerIdIndex[owner][id]; return id == _ownerIds[owner][index]; } function setTokenContract(IERC20 tokenAddress) external { require(owner() == _msgSender(), "not owner"); strongTokenContract = tokenAddress; } function withdrawToken(IERC20 token, address recipient, uint256 amount) external { require(owner() == _msgSender(), "not owner"); require(token.transfer(recipient, amount)); } function getStrongTokenContract() external view returns (address) { return address(strongTokenContract); } fallback() external payable { emit FallBackLog(msg.sender, msg.value); } receive() external payable { emit FallBackLog(msg.sender, msg.value); processPayment(feeWallet, msg.value); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IETHPool { event Staked(address user, uint256 stakeId, uint256 amount, uint256 timestamp); event Unstaked(address user, uint256 stakeId, uint256 amount, uint256 timestamp); function stake(uint256 amount) external payable; function unStake(uint256[] memory stakeIds) external payable; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IStrongPool { function mineFor(address miner, uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^ 0.8.0; import "./Ownable.sol"; import "./IPlatformFees.sol"; contract PlatformFees is Ownable, IPlatformFees { uint256 public stakeFeeNumerator; uint256 public stakeFeeDenominator; uint256 public unstakeFeeNumerator; uint256 public unstakeFeeDenominator; uint256 public minStakeAmount; uint256 public stakeTxLimit; address payable public feeWallet; bool private initDone; function init( uint256 stakeFeeNumerator_, uint256 stakeFeeDenominator_, uint256 unstakeFeeNumerator_, uint256 unstakeFeeDenominator_, uint256 minStakeAmount_, uint256 stakeTxLimit_, address payable feeWallet_, address serviceAdmin ) internal { require(!initDone, "PlatformFee: init done"); stakeFeeNumerator = stakeFeeNumerator_; stakeFeeDenominator = stakeFeeDenominator_; unstakeFeeNumerator = unstakeFeeNumerator_; unstakeFeeDenominator = unstakeFeeDenominator_; minStakeAmount = minStakeAmount_; stakeTxLimit = stakeTxLimit_; feeWallet = feeWallet_; Ownable.init(serviceAdmin); initDone = true; } function setStakeFeeNumerator(uint256 numerator_) external override anyAdmin { stakeFeeNumerator = numerator_; } function setStakeFeeDenominator(uint256 denominator_) external override anyAdmin { require(denominator_ > 0, "PlatformFee: denominator can not be zero"); stakeFeeDenominator = denominator_; } function setUnstakeFeeNumerator(uint256 numerator_) external override anyAdmin { unstakeFeeNumerator = numerator_; } function setUnstakeFeeDenominator(uint256 denominator_) external override anyAdmin { require(denominator_ > 0, "PlatformFee: denominator can not be zero"); unstakeFeeDenominator = denominator_; } function setMinStakeAmount(uint256 amount_) external override anyAdmin { require(amount_ > 0, "PlatformFee: amount can not be zero"); minStakeAmount = amount_; } function setStakeTxLimit(uint256 limit_) external override anyAdmin { require(limit_ > 0, "PlatformFee: limit can not zero"); stakeTxLimit = limit_; } function setFeeWallet(address payable feeWallet_) external override anyAdmin { require(feeWallet_ != address(0), "PlatformFee: address can not be zero address"); feeWallet = feeWallet_; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; bool private init_; function init()internal{ require(!init_, "ReentrancyGuard: init done"); _status = _NOT_ENTERED; init_ = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; address private _serviceAdmin; bool private initialized; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event NewServiceAdmin(address indexed previousServiceAdmin, address indexed newServiceAdmin); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function init(address serviceAdmin_) internal { require(!initialized, "Ownable: init done"); _setOwner(_msgSender()); _setServiceAdmin(serviceAdmin_); initialized = true; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Returns the address of the current service admin. */ function serviceAdmin() public view virtual returns (address) { return _serviceAdmin; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Throws if called by any account other than the service Admin. */ modifier onlyServiceAdmin() { require(serviceAdmin() == _msgSender(), "Ownable: caller is not the serviceAdmin"); _; } modifier anyAdmin(){ require(serviceAdmin() == _msgSender() || owner() == _msgSender(), "Ownable: Caller is not authorized"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() external virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) external virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function _setServiceAdmin(address newServiceAdmin) private { address oldServiceAdmin = _serviceAdmin; _serviceAdmin = newServiceAdmin; emit NewServiceAdmin(oldServiceAdmin, newServiceAdmin); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IPlatformFees { function setStakeFeeNumerator(uint256 numerator_) external; function setStakeFeeDenominator(uint256 denominator_) external; function setUnstakeFeeNumerator(uint256 numerator_) external; function setUnstakeFeeDenominator(uint256 denominator_) external; function setMinStakeAmount(uint256 _amount) external; function setStakeTxLimit(uint256 limit_) external; function setFeeWallet(address payable feeWallet_) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"FallBackLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousServiceAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newServiceAdmin","type":"address"}],"name":"NewServiceAdmin","type":"event"},{"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":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Unstaked","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"}],"name":"addVerifiedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epochId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStrongTokenContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"getUserIdIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"getUserIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"strongAddress_","type":"address"},{"internalType":"uint256","name":"stakeFeeNumerator_","type":"uint256"},{"internalType":"uint256","name":"stakeFeeDenominator_","type":"uint256"},{"internalType":"uint256","name":"unstakeFeeNumerator_","type":"uint256"},{"internalType":"uint256","name":"unstakeFeeDenominator_","type":"uint256"},{"internalType":"uint256","name":"minStakeAmount_","type":"uint256"},{"internalType":"uint256","name":"stakeTxLimit_","type":"uint256"},{"internalType":"address payable","name":"feeWallet_","type":"address"},{"internalType":"address","name":"serviceAdmin_","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mineFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolContracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"}],"name":"removeVerifiedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"serviceAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"feeWallet_","type":"address"}],"name":"setFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setMinStakeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"denominator_","type":"uint256"}],"name":"setStakeFeeDenominator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numerator_","type":"uint256"}],"name":"setStakeFeeNumerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit_","type":"uint256"}],"name":"setStakeTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"}],"name":"setTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"denominator_","type":"uint256"}],"name":"setUnstakeFeeDenominator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numerator_","type":"uint256"}],"name":"setUnstakeFeeNumerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeFeeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeFeeNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeTxLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","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":[{"internalType":"uint256[]","name":"stakeIds_","type":"uint256[]"}],"name":"unStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unstakeFeeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unstakeFeeNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b506124c9806100206000396000f3fe60806040526004361061021e5760003560e01c806385f90e7911610123578063bbcd5bbe116100ab578063eb4af0451161006f578063eb4af045146106e4578063eb7a75d714610704578063f18876841461071a578063f25f4b5614610730578063f2fde38b1461075057610273565b8063bbcd5bbe14610652578063bcb3d28314610672578063ca85a8eb14610692578063da998dca146106b0578063ea6c9d73146106ce57610273565b8063a694fc3a116100f2578063a694fc3a146105d6578063aa9bbc0c146105e9578063ac1a7301146105ff578063b10dcc931461061f578063b6dfbd241461063257610273565b806385f90e791461054d5780638cf37da91461057d5780638da5cb5b1461059357806390d49b9d146105b657610273565b80633dbd46bd116101a65780636c2d90c7116101755780636c2d90c7146104a55780636c57f602146104c5578063715018a6146104f25780637bd168ee14610507578063817b1cd21461053757610273565b80633dbd46bd146103f45780633e10e49f146104425780634b4005cd146104585780634c313fc21461047857610273565b806323ac1896116101ed57806323ac18961461035e57806330d6a9751461037e578063358826c51461039e57806339f096ec146103be5780633bbc1e88146103d457610273565b806301e33667146102ad57806304a938e4146102cd5780630ca615e61461030d578063158ef93e1461032d57610273565b3661027357604080513381523460208201527fa9e666da7b35889f07032cafd026a2521cf03ac5296c024c18db1e2c3b788f9d910160405180910390a1600954610271906001600160a01b031634610770565b005b604080513381523460208201527fa9e666da7b35889f07032cafd026a2521cf03ac5296c024c18db1e2c3b788f9d910160405180910390a1005b3480156102b957600080fd5b506102716102c83660046120da565b61085f565b3480156102d957600080fd5b506102fa6102e836600461211b565b600f6020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561031957600080fd5b50610271610328366004612134565b61093b565b34801561033957600080fd5b5060095461034e90600160a81b900460ff1681565b6040519015158152602001610304565b34801561036a57600080fd5b5061027161037936600461211b565b6109ee565b34801561038a57600080fd5b506102716103993660046121ba565b610a58565b3480156103aa57600080fd5b506102716103b93660046121e6565b610bc1565b3480156103ca57600080fd5b506102fa60085481565b3480156103e057600080fd5b506102716103ef36600461211b565b610c8c565b34801561040057600080fd5b5061042a61040f36600461211b565b600d602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610304565b34801561044e57600080fd5b506102fa60065481565b34801561046457600080fd5b506102716104733660046121e6565b610cf6565b34801561048457600080fd5b506104986104933660046121e6565b610dd6565b6040516103049190612203565b3480156104b157600080fd5b506102fa6104c03660046121ba565b610e42565b3480156104d157600080fd5b506102fa6104e036600461211b565b600e6020526000908152604090205481565b3480156104fe57600080fd5b50610271610e6d565b34801561051357600080fd5b5061034e6105223660046121e6565b600c6020526000908152604090205460ff1681565b34801561054357600080fd5b506102fa600b5481565b34801561055957600080fd5b5061034e61056836600461211b565b60106020526000908152604090205460ff1681565b34801561058957600080fd5b506102fa60055481565b34801561059f57600080fd5b5060015461010090046001600160a01b031661042a565b3480156105c257600080fd5b506102716105d13660046121e6565b610ed9565b6102716105e436600461211b565b610fab565b3480156105f557600080fd5b506102fa600a5481565b34801561060b57600080fd5b5061027161061a36600461211b565b611191565b61027161062d36600461225d565b61122b565b34801561063e57600080fd5b5061027161064d36600461211b565b61176f565b34801561065e57600080fd5b5061027161066d3660046121e6565b6117b9565b34801561067e57600080fd5b5061027161068d36600461211b565b611827565b34801561069e57600080fd5b506012546001600160a01b031661042a565b3480156106bc57600080fd5b506002546001600160a01b031661042a565b3480156106da57600080fd5b506102fa60035481565b3480156106f057600080fd5b506102716106ff36600461211b565b611871565b34801561071057600080fd5b506102fa60045481565b34801561072657600080fd5b506102fa60075481565b34801561073c57600080fd5b5060095461042a906001600160a01b031681565b34801561075c57600080fd5b5061027161076b3660046121e6565b611917565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146107bd576040519150601f19603f3d011682016040523d82523d6000602084013e6107c2565b606091505b50509050806108185760405162461bcd60e51b815260206004820181905260248201527f455448322e30506f6f6c3a204661696c656420746f2073656e6420457468657260448201526064015b60405180910390fd5b604080516001600160a01b0385168152602081018490527fa5957fefb5b0f981554450d4d8dde003083cd202e3d5a2992e09c88ad1f0d791910160405180910390a1505050565b6001546001600160a01b036101009091041633146108ab5760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015260640161080f565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b1580156108f557600080fd5b505af1158015610909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092d919061231b565b61093657600080fd5b505050565b600954600160a81b900460ff161561098d5760405162461bcd60e51b8152602060048201526015602482015274455448322e30506f6f6c3a20696e697420646f6e6560581b604482015260640161080f565b61099d88888888888888886119e8565b6109a5611a9a565b50506001600a8190556011555050601280546001600160a01b039096166001600160a01b03199096169590951790945550506009805460ff60a81b1916600160a81b1790555050565b6002546001600160a01b0316331480610a1757506001546001600160a01b036101009091041633145b610a335760405162461bcd60e51b815260040161080f9061233d565b60008111610a535760405162461bcd60e51b815260040161080f9061237e565b600455565b336000908152600c602052604090205460ff16610add5760405162461bcd60e51b815260206004820152603760248201527f455448322e30506f6f6c3a2043616c6c6572206e6f7420617574686f7269736560448201527f6420746f2063616c6c20746869732066756e6374696f6e000000000000000000606482015260840161080f565b610ae78183611b00565b6012546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610b3957600080fd5b505af1158015610b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b71919061231b565b610bbd5760405162461bcd60e51b815260206004820152601e60248201527f455448322e30506f6f6c3a20496e73756666696369656e742066756e64730000604482015260640161080f565b5050565b6002546001600160a01b0316331480610bea57506001546001600160a01b036101009091041633145b610c065760405162461bcd60e51b815260040161080f9061233d565b6001600160a01b038116610c685760405162461bcd60e51b8152602060048201526024808201527f455448322e30506f6f6c3a20496e76616c696420636f6e7472616374206164646044820152637265737360e01b606482015260840161080f565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b6002546001600160a01b0316331480610cb557506001546001600160a01b036101009091041633145b610cd15760405162461bcd60e51b815260040161080f9061233d565b60008111610cf15760405162461bcd60e51b815260040161080f9061237e565b600655565b6002546001600160a01b0316331480610d1f57506001546001600160a01b036101009091041633145b610d3b5760405162461bcd60e51b815260040161080f9061233d565b6001600160a01b0381166000908152600c602052604090205460ff16610db55760405162461bcd60e51b815260206004820152602960248201527f455448322e30506f6f6c3a20436f6e74726163742061646472657373206e6f74604482015268081d995c9a599a595960ba1b606482015260840161080f565b6001600160a01b03166000908152600c60205260409020805460ff19169055565b6001600160a01b038116600090815260146020908152604091829020805483518184028101840190945280845260609392830182828015610e3657602002820191906000526020600020905b815481526020019060010190808311610e22575b50505050509050919050565b6001600160a01b03821660009081526013602090815260408083208484529091529020545b92915050565b6001546001600160a01b03610100909104163314610ecd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080f565b610ed76000611d6d565b565b6002546001600160a01b0316331480610f0257506001546001600160a01b036101009091041633145b610f1e5760405162461bcd60e51b815260040161080f9061233d565b6001600160a01b038116610f895760405162461bcd60e51b815260206004820152602c60248201527f506c6174666f726d4665653a20616464726573732063616e206e6f742062652060448201526b7a65726f206164647265737360a01b606482015260840161080f565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415610ffe5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161080f565b600260005560045460035434916110209161101a908590611dc7565b90611dda565b146110935760405162461bcd60e51b815260206004820152603d60248201527f455448322e30506f6f6c3a2056616c75652063616e206e6f742062652067726560448201527f61746572206f72206c657373207468616e207374616b696e6720666565000000606482015260840161080f565b61109d8133611b00565b6012546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b1580156110ef57600080fd5b505af1158015611103573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611127919061231b565b6111735760405162461bcd60e51b815260206004820152601e60248201527f455448322e30506f6f6c3a20496e73756666696369656e742066756e64730000604482015260640161080f565b600954611189906001600160a01b031634610770565b506001600055565b6002546001600160a01b03163314806111ba57506001546001600160a01b036101009091041633145b6111d65760405162461bcd60e51b815260040161080f9061233d565b600081116112265760405162461bcd60e51b815260206004820152601f60248201527f506c6174666f726d4665653a206c696d69742063616e206e6f74207a65726f00604482015260640161080f565b600855565b6002600054141561127e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161080f565b6002600055600854815111156112fc5760405162461bcd60e51b815260206004820152603e60248201527f455448322e30506f6f6c3a20496e707574206172726179206c656e677468206960448201527f732067726561746572207468616e20617070726f766564206c656e6774680000606482015260840161080f565b6000805b82518110156115bc57336001600160a01b0316600d6000858481518110611329576113296123c6565b6020908102919091018101518252810191909152604001600020546001600160a01b0316146113a55760405162461bcd60e51b815260206004820152602260248201527f455448322e30506f6f6c3a204f6e6c79206f776e65722063616e20756e7374616044820152616b6560f01b606482015260840161080f565b601060008483815181106113bb576113bb6123c6565b60209081029190910181015182528101919091526040016000205460ff166114365760405162461bcd60e51b815260206004820152602860248201527f455448322e30506f6f6c3a205472616e73616374696f6e20616c7265616479206044820152671d5b94dd185ad95960c21b606482015260840161080f565b60006010600085848151811061144e5761144e6123c6565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055506114ba600e6000858481518110611494576114946123c6565b602002602001015181526020019081526020016000205483611de690919063ffffffff16565b91506114df338483815181106114d2576114d26123c6565b6020026020010151611df2565b1561150757611507338483815181106114fa576114fa6123c6565b6020026020010151611e6d565b7f204fccf0d92ed8d48f204adb39b2e81e92bad0dedb93f5716ca9478cfb57de003384838151811061153b5761153b6123c6565b6020026020010151600e6000878681518110611559576115596123c6565b6020026020010151815260200190815260200160002054426040516115a294939291906001600160a01b0394909416845260208401929092526040830152606082015260800190565b60405180910390a1806115b4816123f2565b915050611300565b50346115d960065461101a60055485611dc790919063ffffffff16565b1461164c5760405162461bcd60e51b815260206004820152603f60248201527f455448322e30506f6f6c3a2056616c75652063616e206e6f742062652067726560448201527f61746572206f72206c657373207468616e20756e7374616b696e672066656500606482015260840161080f565b600b546116599082611fdd565b600b5560125460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156116a857600080fd5b505af11580156116bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e0919061231b565b61173b5760405162461bcd60e51b815260206004820152602660248201527f455448322e30506f6f6c3a20496e73756666696369656e74205374726f6e6720604482015265746f6b656e7360d01b606482015260840161080f565b600954600654600554611766926001600160a01b0316916117619161101a908690611dc7565b610770565b50506001600055565b6002546001600160a01b031633148061179857506001546001600160a01b036101009091041633145b6117b45760405162461bcd60e51b815260040161080f9061233d565b600355565b6001546001600160a01b036101009091041633146118055760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015260640161080f565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633148061185057506001546001600160a01b036101009091041633145b61186c5760405162461bcd60e51b815260040161080f9061233d565b600555565b6002546001600160a01b031633148061189a57506001546001600160a01b036101009091041633145b6118b65760405162461bcd60e51b815260040161080f9061233d565b600081116119125760405162461bcd60e51b815260206004820152602360248201527f506c6174666f726d4665653a20616d6f756e742063616e206e6f74206265207a60448201526265726f60e81b606482015260840161080f565b600755565b6001546001600160a01b036101009091041633146119775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080f565b6001600160a01b0381166119dc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080f565b6119e581611d6d565b50565b600954600160a01b900460ff1615611a3b5760405162461bcd60e51b8152602060048201526016602482015275506c6174666f726d4665653a20696e697420646f6e6560501b604482015260640161080f565b600388905560048790556005869055600685905560078490556008839055600980546001600160a01b0319166001600160a01b038416179055611a7d81611fe9565b50506009805460ff60a01b1916600160a01b179055505050505050565b60015460ff1615611aed5760405162461bcd60e51b815260206004820152601a60248201527f5265656e7472616e637947756172643a20696e697420646f6e65000000000000604482015260640161080f565b60016000819055805460ff191681179055565b6008546001600160a01b03821660009081526014602052604090205410611b805760405162461bcd60e51b815260206004820152602e60248201527f455448322e30506f6f6c3a20557365722063616e206e6f74206578636565642060448201526d1cdd185ad9481d1e081b1a5b5a5d60921b606482015260840161080f565b600754821015611bf85760405162461bcd60e51b815260206004820152603e60248201527f455448322e30506f6f6c3a20416d6f756e742063616e206e6f74206265206c6560448201527f7373207468616e206d696e696d756d207374616b696e6720616d6f756e740000606482015260840161080f565b6001600160a01b038116611c4e5760405162461bcd60e51b815260206004820181905260248201527f455448322e30506f6f6c3a20496e76616c696420757365722061646472657373604482015260640161080f565b601180546000908152600d6020908152604080832080546001600160a01b0319166001600160a01b03871617905583548352600e825280832086905583548352600f8252808320429055925482526010905220805460ff19166001179055600b54611cb99083611de6565b600b55601154611cca908290611df2565b611d12576011546001600160a01b0382166000908152601460208181526040808420805460138452828620878752845291852082905592825260018101835591835290912001555b601154604080516001600160a01b0384168152602081019290925281018390524260608201527fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed9060800160405180910390a1610bbd612060565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611dd3828461240d565b9392505050565b6000611dd3828461242c565b6000611dd3828461244e565b6001600160a01b038216600090815260146020526040812054611e1757506000610e67565b6001600160a01b038316600081815260136020908152604080832086845282528083205493835260149091529020805482908110611e5757611e576123c6565b9060005260206000200154831491505092915050565b6001600160a01b038216600090815260146020526040812054611e91906001611fdd565b6001600160a01b03841660009081526014602052604081208054929350909183908110611ec057611ec06123c6565b9060005260206000200154905080831415611f2d576001600160a01b038416600081815260136020908152604080832087845282528083208390559282526014905220805480611f1257611f12612466565b60019003818190600052602060002001600090559055611fd7565b6001600160a01b0384166000818152601360209081526040808320878452825280832080549084905593835260149091529020805483919083908110611f7557611f756123c6565b60009182526020808320909101929092556001600160a01b0387168082526013835260408083208684528452808320859055908252601490925220805480611fbf57611fbf612466565b60019003818190600052602060002001600090559055505b50505050565b6000611dd3828461247c565b600254600160a01b900460ff16156120385760405162461bcd60e51b81526020600482015260126024820152714f776e61626c653a20696e697420646f6e6560701b604482015260640161080f565b61204133611d6d565b61204a81612073565b506002805460ff60a01b1916600160a01b179055565b60115461206e906001611de6565b601155565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f9dfd842f298fc1353677dd28d7991f3c0effcf42d2c8e5e139dd56cf2fd6632390600090a35050565b6001600160a01b03811681146119e557600080fd5b6000806000606084860312156120ef57600080fd5b83356120fa816120c5565b9250602084013561210a816120c5565b929592945050506040919091013590565b60006020828403121561212d57600080fd5b5035919050565b60008060008060008060008060006101208a8c03121561215357600080fd5b893561215e816120c5565b985060208a0135975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135612198816120c5565b91506101008a01356121a9816120c5565b809150509295985092959850929598565b600080604083850312156121cd57600080fd5b82356121d8816120c5565b946020939093013593505050565b6000602082840312156121f857600080fd5b8135611dd3816120c5565b6020808252825182820181905260009190848201906040850190845b8181101561223b5783518352928401929184019160010161221f565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561227057600080fd5b823567ffffffffffffffff8082111561228857600080fd5b818501915085601f83011261229c57600080fd5b8135818111156122ae576122ae612247565b8060051b604051601f19603f830116810181811085821117156122d3576122d3612247565b6040529182528482019250838101850191888311156122f157600080fd5b938501935b8285101561230f578435845293850193928501926122f6565b98975050505050505050565b60006020828403121561232d57600080fd5b81518015158114611dd357600080fd5b60208082526021908201527f4f776e61626c653a2043616c6c6572206973206e6f7420617574686f72697a656040820152601960fa1b606082015260800190565b60208082526028908201527f506c6174666f726d4665653a2064656e6f6d696e61746f722063616e206e6f74604082015267206265207a65726f60c01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612406576124066123dc565b5060010190565b6000816000190483118215151615612427576124276123dc565b500290565b60008261244957634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612461576124616123dc565b500190565b634e487b7160e01b600052603160045260246000fd5b60008282101561248e5761248e6123dc565b50039056fea2646970667358221220e278189146b205ac9b71f5cc62506da46721c4b7dd80e957588857802ac6824e64736f6c63430008090033
Deployed Bytecode
0x60806040526004361061021e5760003560e01c806385f90e7911610123578063bbcd5bbe116100ab578063eb4af0451161006f578063eb4af045146106e4578063eb7a75d714610704578063f18876841461071a578063f25f4b5614610730578063f2fde38b1461075057610273565b8063bbcd5bbe14610652578063bcb3d28314610672578063ca85a8eb14610692578063da998dca146106b0578063ea6c9d73146106ce57610273565b8063a694fc3a116100f2578063a694fc3a146105d6578063aa9bbc0c146105e9578063ac1a7301146105ff578063b10dcc931461061f578063b6dfbd241461063257610273565b806385f90e791461054d5780638cf37da91461057d5780638da5cb5b1461059357806390d49b9d146105b657610273565b80633dbd46bd116101a65780636c2d90c7116101755780636c2d90c7146104a55780636c57f602146104c5578063715018a6146104f25780637bd168ee14610507578063817b1cd21461053757610273565b80633dbd46bd146103f45780633e10e49f146104425780634b4005cd146104585780634c313fc21461047857610273565b806323ac1896116101ed57806323ac18961461035e57806330d6a9751461037e578063358826c51461039e57806339f096ec146103be5780633bbc1e88146103d457610273565b806301e33667146102ad57806304a938e4146102cd5780630ca615e61461030d578063158ef93e1461032d57610273565b3661027357604080513381523460208201527fa9e666da7b35889f07032cafd026a2521cf03ac5296c024c18db1e2c3b788f9d910160405180910390a1600954610271906001600160a01b031634610770565b005b604080513381523460208201527fa9e666da7b35889f07032cafd026a2521cf03ac5296c024c18db1e2c3b788f9d910160405180910390a1005b3480156102b957600080fd5b506102716102c83660046120da565b61085f565b3480156102d957600080fd5b506102fa6102e836600461211b565b600f6020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561031957600080fd5b50610271610328366004612134565b61093b565b34801561033957600080fd5b5060095461034e90600160a81b900460ff1681565b6040519015158152602001610304565b34801561036a57600080fd5b5061027161037936600461211b565b6109ee565b34801561038a57600080fd5b506102716103993660046121ba565b610a58565b3480156103aa57600080fd5b506102716103b93660046121e6565b610bc1565b3480156103ca57600080fd5b506102fa60085481565b3480156103e057600080fd5b506102716103ef36600461211b565b610c8c565b34801561040057600080fd5b5061042a61040f36600461211b565b600d602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610304565b34801561044e57600080fd5b506102fa60065481565b34801561046457600080fd5b506102716104733660046121e6565b610cf6565b34801561048457600080fd5b506104986104933660046121e6565b610dd6565b6040516103049190612203565b3480156104b157600080fd5b506102fa6104c03660046121ba565b610e42565b3480156104d157600080fd5b506102fa6104e036600461211b565b600e6020526000908152604090205481565b3480156104fe57600080fd5b50610271610e6d565b34801561051357600080fd5b5061034e6105223660046121e6565b600c6020526000908152604090205460ff1681565b34801561054357600080fd5b506102fa600b5481565b34801561055957600080fd5b5061034e61056836600461211b565b60106020526000908152604090205460ff1681565b34801561058957600080fd5b506102fa60055481565b34801561059f57600080fd5b5060015461010090046001600160a01b031661042a565b3480156105c257600080fd5b506102716105d13660046121e6565b610ed9565b6102716105e436600461211b565b610fab565b3480156105f557600080fd5b506102fa600a5481565b34801561060b57600080fd5b5061027161061a36600461211b565b611191565b61027161062d36600461225d565b61122b565b34801561063e57600080fd5b5061027161064d36600461211b565b61176f565b34801561065e57600080fd5b5061027161066d3660046121e6565b6117b9565b34801561067e57600080fd5b5061027161068d36600461211b565b611827565b34801561069e57600080fd5b506012546001600160a01b031661042a565b3480156106bc57600080fd5b506002546001600160a01b031661042a565b3480156106da57600080fd5b506102fa60035481565b3480156106f057600080fd5b506102716106ff36600461211b565b611871565b34801561071057600080fd5b506102fa60045481565b34801561072657600080fd5b506102fa60075481565b34801561073c57600080fd5b5060095461042a906001600160a01b031681565b34801561075c57600080fd5b5061027161076b3660046121e6565b611917565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146107bd576040519150601f19603f3d011682016040523d82523d6000602084013e6107c2565b606091505b50509050806108185760405162461bcd60e51b815260206004820181905260248201527f455448322e30506f6f6c3a204661696c656420746f2073656e6420457468657260448201526064015b60405180910390fd5b604080516001600160a01b0385168152602081018490527fa5957fefb5b0f981554450d4d8dde003083cd202e3d5a2992e09c88ad1f0d791910160405180910390a1505050565b6001546001600160a01b036101009091041633146108ab5760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015260640161080f565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b1580156108f557600080fd5b505af1158015610909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092d919061231b565b61093657600080fd5b505050565b600954600160a81b900460ff161561098d5760405162461bcd60e51b8152602060048201526015602482015274455448322e30506f6f6c3a20696e697420646f6e6560581b604482015260640161080f565b61099d88888888888888886119e8565b6109a5611a9a565b50506001600a8190556011555050601280546001600160a01b039096166001600160a01b03199096169590951790945550506009805460ff60a81b1916600160a81b1790555050565b6002546001600160a01b0316331480610a1757506001546001600160a01b036101009091041633145b610a335760405162461bcd60e51b815260040161080f9061233d565b60008111610a535760405162461bcd60e51b815260040161080f9061237e565b600455565b336000908152600c602052604090205460ff16610add5760405162461bcd60e51b815260206004820152603760248201527f455448322e30506f6f6c3a2043616c6c6572206e6f7420617574686f7269736560448201527f6420746f2063616c6c20746869732066756e6374696f6e000000000000000000606482015260840161080f565b610ae78183611b00565b6012546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610b3957600080fd5b505af1158015610b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b71919061231b565b610bbd5760405162461bcd60e51b815260206004820152601e60248201527f455448322e30506f6f6c3a20496e73756666696369656e742066756e64730000604482015260640161080f565b5050565b6002546001600160a01b0316331480610bea57506001546001600160a01b036101009091041633145b610c065760405162461bcd60e51b815260040161080f9061233d565b6001600160a01b038116610c685760405162461bcd60e51b8152602060048201526024808201527f455448322e30506f6f6c3a20496e76616c696420636f6e7472616374206164646044820152637265737360e01b606482015260840161080f565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b6002546001600160a01b0316331480610cb557506001546001600160a01b036101009091041633145b610cd15760405162461bcd60e51b815260040161080f9061233d565b60008111610cf15760405162461bcd60e51b815260040161080f9061237e565b600655565b6002546001600160a01b0316331480610d1f57506001546001600160a01b036101009091041633145b610d3b5760405162461bcd60e51b815260040161080f9061233d565b6001600160a01b0381166000908152600c602052604090205460ff16610db55760405162461bcd60e51b815260206004820152602960248201527f455448322e30506f6f6c3a20436f6e74726163742061646472657373206e6f74604482015268081d995c9a599a595960ba1b606482015260840161080f565b6001600160a01b03166000908152600c60205260409020805460ff19169055565b6001600160a01b038116600090815260146020908152604091829020805483518184028101840190945280845260609392830182828015610e3657602002820191906000526020600020905b815481526020019060010190808311610e22575b50505050509050919050565b6001600160a01b03821660009081526013602090815260408083208484529091529020545b92915050565b6001546001600160a01b03610100909104163314610ecd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080f565b610ed76000611d6d565b565b6002546001600160a01b0316331480610f0257506001546001600160a01b036101009091041633145b610f1e5760405162461bcd60e51b815260040161080f9061233d565b6001600160a01b038116610f895760405162461bcd60e51b815260206004820152602c60248201527f506c6174666f726d4665653a20616464726573732063616e206e6f742062652060448201526b7a65726f206164647265737360a01b606482015260840161080f565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415610ffe5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161080f565b600260005560045460035434916110209161101a908590611dc7565b90611dda565b146110935760405162461bcd60e51b815260206004820152603d60248201527f455448322e30506f6f6c3a2056616c75652063616e206e6f742062652067726560448201527f61746572206f72206c657373207468616e207374616b696e6720666565000000606482015260840161080f565b61109d8133611b00565b6012546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b1580156110ef57600080fd5b505af1158015611103573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611127919061231b565b6111735760405162461bcd60e51b815260206004820152601e60248201527f455448322e30506f6f6c3a20496e73756666696369656e742066756e64730000604482015260640161080f565b600954611189906001600160a01b031634610770565b506001600055565b6002546001600160a01b03163314806111ba57506001546001600160a01b036101009091041633145b6111d65760405162461bcd60e51b815260040161080f9061233d565b600081116112265760405162461bcd60e51b815260206004820152601f60248201527f506c6174666f726d4665653a206c696d69742063616e206e6f74207a65726f00604482015260640161080f565b600855565b6002600054141561127e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161080f565b6002600055600854815111156112fc5760405162461bcd60e51b815260206004820152603e60248201527f455448322e30506f6f6c3a20496e707574206172726179206c656e677468206960448201527f732067726561746572207468616e20617070726f766564206c656e6774680000606482015260840161080f565b6000805b82518110156115bc57336001600160a01b0316600d6000858481518110611329576113296123c6565b6020908102919091018101518252810191909152604001600020546001600160a01b0316146113a55760405162461bcd60e51b815260206004820152602260248201527f455448322e30506f6f6c3a204f6e6c79206f776e65722063616e20756e7374616044820152616b6560f01b606482015260840161080f565b601060008483815181106113bb576113bb6123c6565b60209081029190910181015182528101919091526040016000205460ff166114365760405162461bcd60e51b815260206004820152602860248201527f455448322e30506f6f6c3a205472616e73616374696f6e20616c7265616479206044820152671d5b94dd185ad95960c21b606482015260840161080f565b60006010600085848151811061144e5761144e6123c6565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055506114ba600e6000858481518110611494576114946123c6565b602002602001015181526020019081526020016000205483611de690919063ffffffff16565b91506114df338483815181106114d2576114d26123c6565b6020026020010151611df2565b1561150757611507338483815181106114fa576114fa6123c6565b6020026020010151611e6d565b7f204fccf0d92ed8d48f204adb39b2e81e92bad0dedb93f5716ca9478cfb57de003384838151811061153b5761153b6123c6565b6020026020010151600e6000878681518110611559576115596123c6565b6020026020010151815260200190815260200160002054426040516115a294939291906001600160a01b0394909416845260208401929092526040830152606082015260800190565b60405180910390a1806115b4816123f2565b915050611300565b50346115d960065461101a60055485611dc790919063ffffffff16565b1461164c5760405162461bcd60e51b815260206004820152603f60248201527f455448322e30506f6f6c3a2056616c75652063616e206e6f742062652067726560448201527f61746572206f72206c657373207468616e20756e7374616b696e672066656500606482015260840161080f565b600b546116599082611fdd565b600b5560125460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156116a857600080fd5b505af11580156116bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e0919061231b565b61173b5760405162461bcd60e51b815260206004820152602660248201527f455448322e30506f6f6c3a20496e73756666696369656e74205374726f6e6720604482015265746f6b656e7360d01b606482015260840161080f565b600954600654600554611766926001600160a01b0316916117619161101a908690611dc7565b610770565b50506001600055565b6002546001600160a01b031633148061179857506001546001600160a01b036101009091041633145b6117b45760405162461bcd60e51b815260040161080f9061233d565b600355565b6001546001600160a01b036101009091041633146118055760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015260640161080f565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633148061185057506001546001600160a01b036101009091041633145b61186c5760405162461bcd60e51b815260040161080f9061233d565b600555565b6002546001600160a01b031633148061189a57506001546001600160a01b036101009091041633145b6118b65760405162461bcd60e51b815260040161080f9061233d565b600081116119125760405162461bcd60e51b815260206004820152602360248201527f506c6174666f726d4665653a20616d6f756e742063616e206e6f74206265207a60448201526265726f60e81b606482015260840161080f565b600755565b6001546001600160a01b036101009091041633146119775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080f565b6001600160a01b0381166119dc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080f565b6119e581611d6d565b50565b600954600160a01b900460ff1615611a3b5760405162461bcd60e51b8152602060048201526016602482015275506c6174666f726d4665653a20696e697420646f6e6560501b604482015260640161080f565b600388905560048790556005869055600685905560078490556008839055600980546001600160a01b0319166001600160a01b038416179055611a7d81611fe9565b50506009805460ff60a01b1916600160a01b179055505050505050565b60015460ff1615611aed5760405162461bcd60e51b815260206004820152601a60248201527f5265656e7472616e637947756172643a20696e697420646f6e65000000000000604482015260640161080f565b60016000819055805460ff191681179055565b6008546001600160a01b03821660009081526014602052604090205410611b805760405162461bcd60e51b815260206004820152602e60248201527f455448322e30506f6f6c3a20557365722063616e206e6f74206578636565642060448201526d1cdd185ad9481d1e081b1a5b5a5d60921b606482015260840161080f565b600754821015611bf85760405162461bcd60e51b815260206004820152603e60248201527f455448322e30506f6f6c3a20416d6f756e742063616e206e6f74206265206c6560448201527f7373207468616e206d696e696d756d207374616b696e6720616d6f756e740000606482015260840161080f565b6001600160a01b038116611c4e5760405162461bcd60e51b815260206004820181905260248201527f455448322e30506f6f6c3a20496e76616c696420757365722061646472657373604482015260640161080f565b601180546000908152600d6020908152604080832080546001600160a01b0319166001600160a01b03871617905583548352600e825280832086905583548352600f8252808320429055925482526010905220805460ff19166001179055600b54611cb99083611de6565b600b55601154611cca908290611df2565b611d12576011546001600160a01b0382166000908152601460208181526040808420805460138452828620878752845291852082905592825260018101835591835290912001555b601154604080516001600160a01b0384168152602081019290925281018390524260608201527fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed9060800160405180910390a1610bbd612060565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611dd3828461240d565b9392505050565b6000611dd3828461242c565b6000611dd3828461244e565b6001600160a01b038216600090815260146020526040812054611e1757506000610e67565b6001600160a01b038316600081815260136020908152604080832086845282528083205493835260149091529020805482908110611e5757611e576123c6565b9060005260206000200154831491505092915050565b6001600160a01b038216600090815260146020526040812054611e91906001611fdd565b6001600160a01b03841660009081526014602052604081208054929350909183908110611ec057611ec06123c6565b9060005260206000200154905080831415611f2d576001600160a01b038416600081815260136020908152604080832087845282528083208390559282526014905220805480611f1257611f12612466565b60019003818190600052602060002001600090559055611fd7565b6001600160a01b0384166000818152601360209081526040808320878452825280832080549084905593835260149091529020805483919083908110611f7557611f756123c6565b60009182526020808320909101929092556001600160a01b0387168082526013835260408083208684528452808320859055908252601490925220805480611fbf57611fbf612466565b60019003818190600052602060002001600090559055505b50505050565b6000611dd3828461247c565b600254600160a01b900460ff16156120385760405162461bcd60e51b81526020600482015260126024820152714f776e61626c653a20696e697420646f6e6560701b604482015260640161080f565b61204133611d6d565b61204a81612073565b506002805460ff60a01b1916600160a01b179055565b60115461206e906001611de6565b601155565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f9dfd842f298fc1353677dd28d7991f3c0effcf42d2c8e5e139dd56cf2fd6632390600090a35050565b6001600160a01b03811681146119e557600080fd5b6000806000606084860312156120ef57600080fd5b83356120fa816120c5565b9250602084013561210a816120c5565b929592945050506040919091013590565b60006020828403121561212d57600080fd5b5035919050565b60008060008060008060008060006101208a8c03121561215357600080fd5b893561215e816120c5565b985060208a0135975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135612198816120c5565b91506101008a01356121a9816120c5565b809150509295985092959850929598565b600080604083850312156121cd57600080fd5b82356121d8816120c5565b946020939093013593505050565b6000602082840312156121f857600080fd5b8135611dd3816120c5565b6020808252825182820181905260009190848201906040850190845b8181101561223b5783518352928401929184019160010161221f565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561227057600080fd5b823567ffffffffffffffff8082111561228857600080fd5b818501915085601f83011261229c57600080fd5b8135818111156122ae576122ae612247565b8060051b604051601f19603f830116810181811085821117156122d3576122d3612247565b6040529182528482019250838101850191888311156122f157600080fd5b938501935b8285101561230f578435845293850193928501926122f6565b98975050505050505050565b60006020828403121561232d57600080fd5b81518015158114611dd357600080fd5b60208082526021908201527f4f776e61626c653a2043616c6c6572206973206e6f7420617574686f72697a656040820152601960fa1b606082015260800190565b60208082526028908201527f506c6174666f726d4665653a2064656e6f6d696e61746f722063616e206e6f74604082015267206265207a65726f60c01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612406576124066123dc565b5060010190565b6000816000190483118215151615612427576124276123dc565b500290565b60008261244957634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612461576124616123dc565b500190565b634e487b7160e01b600052603160045260246000fd5b60008282101561248e5761248e6123dc565b50039056fea2646970667358221220e278189146b205ac9b71f5cc62506da46721c4b7dd80e957588857802ac6824e64736f6c63430008090033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.