More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 288 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 19623214 | 98 days ago | IN | 0 ETH | 0.00242595 | ||||
Withdraw | 19580768 | 104 days ago | IN | 0 ETH | 0.00353916 | ||||
Deposit | 19580764 | 104 days ago | IN | 0 ETH | 0.00318256 | ||||
Withdraw | 19553902 | 108 days ago | IN | 0 ETH | 0.00379451 | ||||
Deposit | 19553899 | 108 days ago | IN | 0 ETH | 0.00330678 | ||||
Withdraw | 19510140 | 114 days ago | IN | 0 ETH | 0.00377077 | ||||
Deposit | 19510138 | 114 days ago | IN | 0 ETH | 0.00364525 | ||||
Deposit | 19510137 | 114 days ago | IN | 0 ETH | 0.00342191 | ||||
Withdraw | 19506735 | 114 days ago | IN | 0 ETH | 0.00432548 | ||||
Withdraw | 19499857 | 115 days ago | IN | 0 ETH | 0.00363786 | ||||
Withdraw | 19496449 | 116 days ago | IN | 0 ETH | 0.00297869 | ||||
Withdraw | 19492695 | 116 days ago | IN | 0 ETH | 0.00356569 | ||||
Withdraw | 19481010 | 118 days ago | IN | 0 ETH | 0.006485 | ||||
Deposit | 19471219 | 119 days ago | IN | 0 ETH | 0.00276667 | ||||
Withdraw | 19471216 | 119 days ago | IN | 0 ETH | 0.0076733 | ||||
Withdraw | 19460418 | 121 days ago | IN | 0 ETH | 0.00350195 | ||||
Withdraw | 19447100 | 123 days ago | IN | 0 ETH | 0.00620404 | ||||
Withdraw | 19444211 | 123 days ago | IN | 0 ETH | 0.00672129 | ||||
Withdraw | 19441779 | 123 days ago | IN | 0 ETH | 0.00842094 | ||||
Withdraw | 19431445 | 125 days ago | IN | 0 ETH | 0.0088842 | ||||
Withdraw | 19418293 | 127 days ago | IN | 0 ETH | 0.00955371 | ||||
Withdraw | 19408793 | 128 days ago | IN | 0 ETH | 0.00923031 | ||||
Deposit | 19404761 | 129 days ago | IN | 0 ETH | 0.00381858 | ||||
Withdraw | 19404759 | 129 days ago | IN | 0 ETH | 0.01015028 | ||||
Deposit | 19394975 | 130 days ago | IN | 0 ETH | 0.00318717 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MANESTAKE
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-31 */ //SPDX-License-Identifier: MIT pragma solidity 0.8.19; //import "@nomiclabs/buidler/console.sol"; /* * @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 GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() {} function _msgSender() internal view returns (address payable) { return payable(msg.sender); } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), 'Ownable: caller is not the owner'); _; } /** * @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() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), 'Ownable: new owner is the zero address'); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @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) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } /** * @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 sub(a, b, 'SafeMath: subtraction overflow'); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, 'SafeMath: multiplication overflow'); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) { return div(a, b, 'SafeMath: division by zero'); } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, 'SafeMath: modulo by zero'); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @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); } /** * @title SafeBEP20 * @dev Wrappers around BEP20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeBEP20 for IBEP20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeBEP20 { using SafeMath for uint256; using Address for address; function safeTransfer( IBEP20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IBEP20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IBEP20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IBEP20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), 'SafeBEP20: approve from non-zero to non-zero allowance' ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IBEP20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IBEP20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, 'SafeBEP20: decreased allowance below zero' ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IBEP20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, 'SafeBEP20: low-level call failed'); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), 'SafeBEP20: BEP20 operation did not succeed'); } } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Address: insufficient balance'); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(''); require(success, 'Address: unable to send value, recipient may have reverted'); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, 'Address: low-level call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, 'Address: insufficient balance for call'); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), 'Address: call to non-contract'); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } 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; constructor() { _status = _NOT_ENTERED; } /** * @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; } } contract MANESTAKE is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeBEP20 for IBEP20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IBEP20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Tokens to distribute per block. uint256 lastRewardTimestamp; // Last block number that Tokens distribution occurs. uint256 accTokensPerShare; // Accumulated Tokens per share, times 1e12. See below. } IBEP20 public immutable stakingToken; IBEP20 public immutable rewardToken; mapping (address => uint256) public holderUnlockTime; uint256 public totalStaked; uint256 public apy; uint256 public lockDuration; uint256 public exitPenaltyPerc; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping (address => UserInfo) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 private totalAllocPoint = 0; event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); constructor( ) { stakingToken = IBEP20(0x98Ce7f261E425AD0cA667e60675938dcffC1571A); rewardToken = stakingToken; apy = 30; lockDuration = 7 days; exitPenaltyPerc = 20; // staking pool poolInfo.push(PoolInfo({ lpToken: stakingToken, allocPoint: 1000, lastRewardTimestamp: 21499615, accTokensPerShare: 0 })); totalAllocPoint = 1000; } function stopReward() external onlyOwner { updatePool(0); apy = 0; } function startReward() external onlyOwner { require(poolInfo[0].lastRewardTimestamp == 21499615, "Can only start rewards once"); poolInfo[0].lastRewardTimestamp = block.timestamp; } // View function to see pending Reward on frontend. function pendingReward(address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[_user]; if(pool.lastRewardTimestamp == 21499615){ return 0; } uint256 accTokensPerShare = pool.accTokensPerShare; uint256 lpSupply = totalStaked; if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div(totalAllocPoint); accTokensPerShare = accTokensPerShare.add(tokenReward.mul(1e12).div(lpSupply)); } return user.amount.mul(accTokensPerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return; } uint256 lpSupply = totalStaked; if (lpSupply == 0) { pool.lastRewardTimestamp = block.timestamp; return; } uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div(totalAllocPoint); pool.accTokensPerShare = pool.accTokensPerShare.add(tokenReward.mul(1e12).div(lpSupply)); pool.lastRewardTimestamp = block.timestamp; } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public onlyOwner { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Stake primary tokens function deposit(uint256 _amount) public nonReentrant { if(holderUnlockTime[msg.sender] == 0){ holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; updatePool(0); if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin."); rewardToken.safeTransfer(address(msg.sender), pending); } } uint256 amountTransferred = 0; if(_amount > 0) { uint256 initialBalance = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); amountTransferred = pool.lpToken.balanceOf(address(this)) - initialBalance; user.amount = user.amount.add(amountTransferred); totalStaked += amountTransferred; } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); emit Deposit(msg.sender, _amount); } // Withdraw primary tokens from STAKING. function withdraw() public nonReentrant { require(holderUnlockTime[msg.sender] <= block.timestamp, "May not do normal withdraw early"); PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; updatePool(0); uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin."); rewardToken.safeTransfer(address(msg.sender), pending); } if(_amount > 0) { user.amount = 0; totalStaked -= _amount; pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); if(user.amount > 0){ holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } else { holderUnlockTime[msg.sender] = 0; } emit Withdraw(msg.sender, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external nonReentrant { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; totalStaked -= _amount; // exit penalty for early unstakers, penalty held on contract as rewards. if(holderUnlockTime[msg.sender] >= block.timestamp){ _amount -= _amount * exitPenaltyPerc / 100; } holderUnlockTime[msg.sender] = 0; pool.lpToken.safeTransfer(address(msg.sender), _amount); user.amount = 0; user.rewardDebt = 0; emit EmergencyWithdraw(msg.sender, _amount); } // Withdraw reward. EMERGENCY ONLY. This allows the owner to migrate rewards to a new staking pool since we are not minting new tokens. function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { require(_amount <= rewardToken.balanceOf(address(this)) - totalStaked, 'not enough tokens to take out'); rewardToken.safeTransfer(address(msg.sender), _amount); } function calculateNewRewards() public view returns (uint256) { PoolInfo storage pool = poolInfo[0]; if(pool.lastRewardTimestamp > block.timestamp){ return 0; } return (((block.timestamp - pool.lastRewardTimestamp) * totalStaked) * apy / 100 / 365 days); } function rewardsRemaining() public view returns (uint256){ return rewardToken.balanceOf(address(this)) - totalStaked; } function updateApy(uint256 newApy) external onlyOwner { require(newApy <= 10000, "APY must be below 10000%"); updatePool(0); apy = newApy; } function updatelockduration(uint256 newlockDuration) external onlyOwner { require(newlockDuration <= 2419200, "Duration must be below 2 weeks"); lockDuration = newlockDuration; } function updateExitPenalty(uint256 newPenaltyPerc) external onlyOwner { require(newPenaltyPerc <= 20, "May not set higher than 20%"); exitPenaltyPerc = newPenaltyPerc; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"apy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateNewRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exitPenaltyPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBEP20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accTokensPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","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":"newApy","type":"uint256"}],"name":"updateApy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPenaltyPerc","type":"uint256"}],"name":"updateExitPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newlockDuration","type":"uint256"}],"name":"updatelockduration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052600060095534801561001557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018080557398ce7f261e425ad0ca667e60675938dcffc1571a608081815260a0829052601e600490815562093a8060055560146006556040805192830181529282526103e8602083018181526301480edf94840194855260006060850181815260078054988901815590915293517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889690930295860180546001600160a01b0319166001600160a01b039094169390931790925590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68985015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a840155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b9092019190915560095560805160a0516119556101cc6000396000818161035101528181610415015281816104ee015281816106590152818161090d0152610c570152600061024801526119556000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806380dc0672116100de578063a913a5f711610097578063f2fde38b11610071578063f2fde38b14610326578063f40f0f5214610339578063f7c618c11461034c578063ff16ef391461037357600080fd5b8063a913a5f7146102eb578063b6b55f251461030b578063db2e21bc1461031e57600080fd5b806380dc06721461029b578063817b1cd2146102a35780638c09c135146102ac5780638da5cb5b146102bf5780638e0b0198146102d0578063999e2f75146102e357600080fd5b8063630b5ba111610130578063630b5ba114610233578063715018a61461023b57806372f702f314610243578063746c8ae11461028257806378c196f31461028a5780637b280def1461029257600080fd5b806304554443146101785780631526fe27146101945780631959a002146101d15780633279beab1461020d5780633bcfc4b8146102225780633ccfd60b1461022b575b600080fd5b61018160055481565b6040519081526020015b60405180910390f35b6101a76101a23660046116c1565b610386565b604080516001600160a01b039095168552602085019390935291830152606082015260800161018b565b6101f86101df3660046116da565b6008602052600090815260409020805460019091015482565b6040805192835260208301919091520161018b565b61022061021b3660046116c1565b6103ca565b005b61018160045481565b610220610518565b610220610752565b6102206107a7565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018b565b61022061081b565b6101816108e9565b61018160065481565b610220610987565b61018160035481565b6102206102ba3660046116c1565b6109c2565b6000546001600160a01b031661026a565b6102206102de3660046116c1565b610a44565b610181610ac4565b6101816102f93660046116da565b60026020526000908152604090205481565b6102206103193660046116c1565b610b4a565b610220610e02565b6102206103343660046116da565b610f2d565b6101816103473660046116da565b610f60565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b6102206103813660046116c1565b61104e565b6007818154811061039657600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146103fd5760405162461bcd60e51b81526004016103f490611703565b60405180910390fd5b6003546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104889190611738565b6104929190611767565b8111156104e15760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f757400000060448201526064016103f4565b6105156001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633836110d9565b50565b60026001540361053a5760405162461bcd60e51b81526004016103f49061177a565b6002600181905533600090815260209190915260409020544210156105a15760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c7960448201526064016103f4565b600060076000815481106105b7576105b76117b1565b60009182526020808320338452600890915260408320805460049093029091019350916105e390611141565b600061061d836001015461061764e8d4a51000610611886003015488600001546111d890919063ffffffff16565b90611263565b906112a5565b905080156106805761062d6108e9565b81111561064c5760405162461bcd60e51b81526004016103f4906117c7565b6106806001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633836110d9565b81156106b85760008084556003805484929061069d908490611767565b909155505083546106b8906001600160a01b031633846110d9565b600384015483546106d39164e8d4a5100091610611916111d8565b6001840155825415610701576005546106ec9042611825565b33600090815260026020526040902055610712565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b0316331461077c5760405162461bcd60e51b81526004016103f490611703565b60075460005b818110156107a35761079381611141565b61079c81611838565b9050610782565b5050565b6000546001600160a01b031633146107d15760405162461bcd60e51b81526004016103f490611703565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146108455760405162461bcd60e51b81526004016103f490611703565b6007600081548110610859576108596117b1565b9060005260206000209060040201600201546301480edf146108bd5760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e6365000000000060448201526064016103f4565b4260076000815481106108d2576108d26117b1565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109789190611738565b6109829190611767565b905090565b6000546001600160a01b031633146109b15760405162461bcd60e51b81526004016103f490611703565b6109bb6000611141565b6000600455565b6000546001600160a01b031633146109ec5760405162461bcd60e51b81526004016103f490611703565b6224ea00811115610a3f5760405162461bcd60e51b815260206004820152601e60248201527f4475726174696f6e206d7573742062652062656c6f772032207765656b73000060448201526064016103f4565b600555565b6000546001600160a01b03163314610a6e5760405162461bcd60e51b81526004016103f490611703565b6014811115610abf5760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e20323025000000000060448201526064016103f4565b600655565b6000806007600081548110610adb57610adb6117b1565b906000526020600020906004020190504281600201541115610aff57600091505090565b6301e133806064600454600354846002015442610b1c9190611767565b610b269190611851565b610b309190611851565b610b3a9190611868565b610b449190611868565b91505090565b600260015403610b6c5760405162461bcd60e51b81526004016103f49061177a565b6002600181905533600090815260209190915260408120549003610ba857600554610b979042611825565b336000908152600260205260409020555b60006007600081548110610bbe57610bbe6117b1565b60009182526020808320338452600890915260408320600490920201925090610be690611141565b805415610c80576000610c1b826001015461061764e8d4a51000610611876003015487600001546111d890919063ffffffff16565b90508015610c7e57610c2b6108e9565b811115610c4a5760405162461bcd60e51b81526004016103f4906117c7565b610c7e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633836110d9565b505b60008315610db05782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf49190611738565b8454909150610d0e906001600160a01b03163330886112e7565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d799190611738565b610d839190611767565b8354909250610d929083611325565b835560038054839190600090610da9908490611825565b9091555050505b60038301548254610dcb9164e8d4a5100091610611916111d8565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610740565b600260015403610e245760405162461bcd60e51b81526004016103f49061177a565b600260018190555060006007600081548110610e4257610e426117b1565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610e7b908490611767565b9091555050336000908152600260205260409020544211610ebd57606460065482610ea69190611851565b610eb09190611868565b610eba9082611767565b90505b336000818152600260205260408120558354610ee5916001600160a01b0390911690836110d9565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b03163314610f575760405162461bcd60e51b81526004016103f490611703565b61051581611384565b6000806007600081548110610f7757610f776117b1565b600091825260208083206001600160a01b03871684526008909152604090922060026004909202909201908101549092506301480edf03610fbc575060009392505050565b6003808301549054600284015442118015610fd657508015155b1561101c576000610ff96009546106118760010154610ff3610ac4565b906111d8565b9050611018611011836106118464e8d4a510006111d8565b8490611325565b9250505b611044836001015461061764e8d4a510006106118688600001546111d890919063ffffffff16565b9695505050505050565b6000546001600160a01b031633146110785760405162461bcd60e51b81526004016103f490611703565b6127108111156110ca5760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f7720313030303025000000000000000060448201526064016103f4565b6110d46000611141565b600455565b6040516001600160a01b03831660248201526044810182905261113c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611444565b505050565b600060078281548110611156576111566117b1565b9060005260206000209060040201905080600201544211611175575050565b600354600081900361118c57504260029091015550565b60006111a46009546106118560010154610ff3610ac4565b90506111c76111bc836106118464e8d4a510006111d8565b600385015490611325565b600384015550504260029091015550565b6000826000036111ea5750600061125d565b60006111f68385611851565b9050826112038583611868565b1461125a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016103f4565b90505b92915050565b600061125a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611516565b600061125a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061154d565b6040516001600160a01b038085166024830152831660448201526064810182905261131f9085906323b872dd60e01b90608401611105565b50505050565b6000806113328385611825565b90508381101561125a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103f4565b6001600160a01b0381166113e95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611499826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661157e9092919063ffffffff16565b80519091501561113c57808060200190518101906114b7919061188a565b61113c5760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f4565b600081836115375760405162461bcd60e51b81526004016103f491906118d0565b5060006115448486611868565b95945050505050565b600081848411156115715760405162461bcd60e51b81526004016103f491906118d0565b5060006115448486611767565b606061158d8484600085611595565b949350505050565b60606115a085611688565b6115ec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f4565b600080866001600160a01b031685876040516116089190611903565b60006040518083038185875af1925050503d8060008114611645576040519150601f19603f3d011682016040523d82523d6000602084013e61164a565b606091505b5091509150811561165e57915061158d9050565b80511561166e5780518082602001fd5b8360405162461bcd60e51b81526004016103f491906118d0565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061158d575050151592915050565b6000602082840312156116d357600080fd5b5035919050565b6000602082840312156116ec57600080fd5b81356001600160a01b038116811461125a57600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561174a57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561125d5761125d611751565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b8082018082111561125d5761125d611751565b60006001820161184a5761184a611751565b5060010190565b808202811582820484141761125d5761125d611751565b60008261188557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561189c57600080fd5b8151801515811461125a57600080fd5b60005b838110156118c75781810151838201526020016118af565b50506000910152565b60208152600082518060208401526118ef8160408501602087016118ac565b601f01601f19169190910160400192915050565b600082516119158184602087016118ac565b919091019291505056fea2646970667358221220f5b435f5ecbc79d4458a200437bc8beb1d1582b390985404f23ff2c901651ec164736f6c63430008130033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806380dc0672116100de578063a913a5f711610097578063f2fde38b11610071578063f2fde38b14610326578063f40f0f5214610339578063f7c618c11461034c578063ff16ef391461037357600080fd5b8063a913a5f7146102eb578063b6b55f251461030b578063db2e21bc1461031e57600080fd5b806380dc06721461029b578063817b1cd2146102a35780638c09c135146102ac5780638da5cb5b146102bf5780638e0b0198146102d0578063999e2f75146102e357600080fd5b8063630b5ba111610130578063630b5ba114610233578063715018a61461023b57806372f702f314610243578063746c8ae11461028257806378c196f31461028a5780637b280def1461029257600080fd5b806304554443146101785780631526fe27146101945780631959a002146101d15780633279beab1461020d5780633bcfc4b8146102225780633ccfd60b1461022b575b600080fd5b61018160055481565b6040519081526020015b60405180910390f35b6101a76101a23660046116c1565b610386565b604080516001600160a01b039095168552602085019390935291830152606082015260800161018b565b6101f86101df3660046116da565b6008602052600090815260409020805460019091015482565b6040805192835260208301919091520161018b565b61022061021b3660046116c1565b6103ca565b005b61018160045481565b610220610518565b610220610752565b6102206107a7565b61026a7f00000000000000000000000098ce7f261e425ad0ca667e60675938dcffc1571a81565b6040516001600160a01b03909116815260200161018b565b61022061081b565b6101816108e9565b61018160065481565b610220610987565b61018160035481565b6102206102ba3660046116c1565b6109c2565b6000546001600160a01b031661026a565b6102206102de3660046116c1565b610a44565b610181610ac4565b6101816102f93660046116da565b60026020526000908152604090205481565b6102206103193660046116c1565b610b4a565b610220610e02565b6102206103343660046116da565b610f2d565b6101816103473660046116da565b610f60565b61026a7f00000000000000000000000098ce7f261e425ad0ca667e60675938dcffc1571a81565b6102206103813660046116c1565b61104e565b6007818154811061039657600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146103fd5760405162461bcd60e51b81526004016103f490611703565b60405180910390fd5b6003546040516370a0823160e01b81523060048201527f00000000000000000000000098ce7f261e425ad0ca667e60675938dcffc1571a6001600160a01b0316906370a0823190602401602060405180830381865afa158015610464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104889190611738565b6104929190611767565b8111156104e15760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f757400000060448201526064016103f4565b6105156001600160a01b037f00000000000000000000000098ce7f261e425ad0ca667e60675938dcffc1571a1633836110d9565b50565b60026001540361053a5760405162461bcd60e51b81526004016103f49061177a565b6002600181905533600090815260209190915260409020544210156105a15760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c7960448201526064016103f4565b600060076000815481106105b7576105b76117b1565b60009182526020808320338452600890915260408320805460049093029091019350916105e390611141565b600061061d836001015461061764e8d4a51000610611886003015488600001546111d890919063ffffffff16565b90611263565b906112a5565b905080156106805761062d6108e9565b81111561064c5760405162461bcd60e51b81526004016103f4906117c7565b6106806001600160a01b037f00000000000000000000000098ce7f261e425ad0ca667e60675938dcffc1571a1633836110d9565b81156106b85760008084556003805484929061069d908490611767565b909155505083546106b8906001600160a01b031633846110d9565b600384015483546106d39164e8d4a5100091610611916111d8565b6001840155825415610701576005546106ec9042611825565b33600090815260026020526040902055610712565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b0316331461077c5760405162461bcd60e51b81526004016103f490611703565b60075460005b818110156107a35761079381611141565b61079c81611838565b9050610782565b5050565b6000546001600160a01b031633146107d15760405162461bcd60e51b81526004016103f490611703565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146108455760405162461bcd60e51b81526004016103f490611703565b6007600081548110610859576108596117b1565b9060005260206000209060040201600201546301480edf146108bd5760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e6365000000000060448201526064016103f4565b4260076000815481106108d2576108d26117b1565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f00000000000000000000000098ce7f261e425ad0ca667e60675938dcffc1571a16906370a0823190602401602060405180830381865afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109789190611738565b6109829190611767565b905090565b6000546001600160a01b031633146109b15760405162461bcd60e51b81526004016103f490611703565b6109bb6000611141565b6000600455565b6000546001600160a01b031633146109ec5760405162461bcd60e51b81526004016103f490611703565b6224ea00811115610a3f5760405162461bcd60e51b815260206004820152601e60248201527f4475726174696f6e206d7573742062652062656c6f772032207765656b73000060448201526064016103f4565b600555565b6000546001600160a01b03163314610a6e5760405162461bcd60e51b81526004016103f490611703565b6014811115610abf5760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e20323025000000000060448201526064016103f4565b600655565b6000806007600081548110610adb57610adb6117b1565b906000526020600020906004020190504281600201541115610aff57600091505090565b6301e133806064600454600354846002015442610b1c9190611767565b610b269190611851565b610b309190611851565b610b3a9190611868565b610b449190611868565b91505090565b600260015403610b6c5760405162461bcd60e51b81526004016103f49061177a565b6002600181905533600090815260209190915260408120549003610ba857600554610b979042611825565b336000908152600260205260409020555b60006007600081548110610bbe57610bbe6117b1565b60009182526020808320338452600890915260408320600490920201925090610be690611141565b805415610c80576000610c1b826001015461061764e8d4a51000610611876003015487600001546111d890919063ffffffff16565b90508015610c7e57610c2b6108e9565b811115610c4a5760405162461bcd60e51b81526004016103f4906117c7565b610c7e6001600160a01b037f00000000000000000000000098ce7f261e425ad0ca667e60675938dcffc1571a1633836110d9565b505b60008315610db05782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf49190611738565b8454909150610d0e906001600160a01b03163330886112e7565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d799190611738565b610d839190611767565b8354909250610d929083611325565b835560038054839190600090610da9908490611825565b9091555050505b60038301548254610dcb9164e8d4a5100091610611916111d8565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610740565b600260015403610e245760405162461bcd60e51b81526004016103f49061177a565b600260018190555060006007600081548110610e4257610e426117b1565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610e7b908490611767565b9091555050336000908152600260205260409020544211610ebd57606460065482610ea69190611851565b610eb09190611868565b610eba9082611767565b90505b336000818152600260205260408120558354610ee5916001600160a01b0390911690836110d9565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b03163314610f575760405162461bcd60e51b81526004016103f490611703565b61051581611384565b6000806007600081548110610f7757610f776117b1565b600091825260208083206001600160a01b03871684526008909152604090922060026004909202909201908101549092506301480edf03610fbc575060009392505050565b6003808301549054600284015442118015610fd657508015155b1561101c576000610ff96009546106118760010154610ff3610ac4565b906111d8565b9050611018611011836106118464e8d4a510006111d8565b8490611325565b9250505b611044836001015461061764e8d4a510006106118688600001546111d890919063ffffffff16565b9695505050505050565b6000546001600160a01b031633146110785760405162461bcd60e51b81526004016103f490611703565b6127108111156110ca5760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f7720313030303025000000000000000060448201526064016103f4565b6110d46000611141565b600455565b6040516001600160a01b03831660248201526044810182905261113c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611444565b505050565b600060078281548110611156576111566117b1565b9060005260206000209060040201905080600201544211611175575050565b600354600081900361118c57504260029091015550565b60006111a46009546106118560010154610ff3610ac4565b90506111c76111bc836106118464e8d4a510006111d8565b600385015490611325565b600384015550504260029091015550565b6000826000036111ea5750600061125d565b60006111f68385611851565b9050826112038583611868565b1461125a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016103f4565b90505b92915050565b600061125a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611516565b600061125a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061154d565b6040516001600160a01b038085166024830152831660448201526064810182905261131f9085906323b872dd60e01b90608401611105565b50505050565b6000806113328385611825565b90508381101561125a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103f4565b6001600160a01b0381166113e95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611499826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661157e9092919063ffffffff16565b80519091501561113c57808060200190518101906114b7919061188a565b61113c5760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f4565b600081836115375760405162461bcd60e51b81526004016103f491906118d0565b5060006115448486611868565b95945050505050565b600081848411156115715760405162461bcd60e51b81526004016103f491906118d0565b5060006115448486611767565b606061158d8484600085611595565b949350505050565b60606115a085611688565b6115ec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f4565b600080866001600160a01b031685876040516116089190611903565b60006040518083038185875af1925050503d8060008114611645576040519150601f19603f3d011682016040523d82523d6000602084013e61164a565b606091505b5091509150811561165e57915061158d9050565b80511561166e5780518082602001fd5b8360405162461bcd60e51b81526004016103f491906118d0565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061158d575050151592915050565b6000602082840312156116d357600080fd5b5035919050565b6000602082840312156116ec57600080fd5b81356001600160a01b038116811461125a57600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561174a57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561125d5761125d611751565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b8082018082111561125d5761125d611751565b60006001820161184a5761184a611751565b5060010190565b808202811582820484141761125d5761125d611751565b60008261188557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561189c57600080fd5b8151801515811461125a57600080fd5b60005b838110156118c75781810151838201526020016118af565b50506000910152565b60208152600082518060208401526118ef8160408501602087016118ac565b601f01601f19169190910160400192915050565b600082516119158184602087016118ac565b919091019291505056fea2646970667358221220f5b435f5ecbc79d4458a200437bc8beb1d1582b390985404f23ff2c901651ec164736f6c63430008130033
Deployed Bytecode Sourcemap
24687:8773:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25646:27;;;;;;;;;160:25:1;;;148:2;133:18;25646:27:0;;;;;;;;25746:26;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;644:32:1;;;626:51;;708:2;693:18;;686:34;;;;736:18;;;729:34;794:2;779:18;;772:34;613:3;598:19;25746:26:0;381:431:1;25828:45:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;1282:25:1;;;1338:2;1323:18;;1316:34;;;;1255:18;25828:45:0;1108:248:1;32146:256:0;;;;;;:::i;:::-;;:::i;:::-;;25621:18;;;;;;30108:1153;;;:::i;28544:190::-;;;:::i;2808:140::-;;;:::i;25442:36::-;;;;;;;;-1:-1:-1;;;;;1539:32:1;;;1521:51;;1509:2;1494:18;25442:36:0;1361:217:1;26792:204:0;;;:::i;32733:133::-;;;:::i;25680:30::-;;;;;;26693:91;;;:::i;25588:26::-;;;;;;33054:203;;;;;;:::i;:::-;;:::i;2166:79::-;2204:7;2231:6;-1:-1:-1;;;;;2231:6:0;2166:79;;33265:192;;;;;;:::i;:::-;;:::i;32416:309::-;;;:::i;25527:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;28771:1281;;;;;;:::i;:::-;;:::i;31332:665::-;;;:::i;3103:109::-;;;;;;:::i;:::-;;:::i;27061:724::-;;;;;;:::i;:::-;;:::i;25485:35::-;;;;;32874:172;;;;;;:::i;:::-;;:::i;25746:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25746:26:0;;;;-1:-1:-1;25746:26:0;;;:::o;32146:256::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;;;;;;;;;32284:11:::1;::::0;32245:36:::1;::::0;-1:-1:-1;;;32245:36:0;;32275:4:::1;32245:36;::::0;::::1;1521:51:1::0;32245:11:0::1;-1:-1:-1::0;;;;;32245:21:0::1;::::0;::::1;::::0;1494:18:1;;32245:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32234:7;:61;;32226:103;;;::::0;-1:-1:-1;;;32226:103:0;;2808:2:1;32226:103:0::1;::::0;::::1;2790:21:1::0;2847:2;2827:18;;;2820:30;2886:31;2866:18;;;2859:59;2935:18;;32226:103:0::1;2606:353:1::0;32226:103:0::1;32340:54;-1:-1:-1::0;;;;;32340:11:0::1;:24;32373:10;32386:7:::0;32340:24:::1;:54::i;:::-;32146:256:::0;:::o;30108:1153::-;23740:1;24338:7;;:19;24330:63;;;;-1:-1:-1;;;24330:63:0;;;;;;;:::i;:::-;23740:1;24471:7;:18;;;30186:10:::1;30169:28;::::0;;;::::1;::::0;;;;;;;;30201:15:::1;-1:-1:-1::0;30169:47:0::1;30161:92;;;::::0;-1:-1:-1;;;30161:92:0;;3526:2:1;30161:92:0::1;::::0;::::1;3508:21:1::0;;;3545:18;;;3538:30;3604:34;3584:18;;;3577:62;3656:18;;30161:92:0::1;3324:356:1::0;30161:92:0::1;30274:21;30298:8;30307:1;30298:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;30353:10:::1;30344:20:::0;;:8:::1;:20:::0;;;;;;30395:11;;30298::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;30344:20:0;30417:13:::1;::::0;:10:::1;:13::i;:::-;30441:15;30459:70;30513:4;:15;;;30459:49;30503:4;30459:39;30475:4;:22;;;30459:4;:11;;;:15;;:39;;;;:::i;:::-;:43:::0;::::1;:49::i;:::-;:53:::0;::::1;:70::i;:::-;30441:88:::0;-1:-1:-1;30543:11:0;;30540:218:::1;;30590:18;:16;:18::i;:::-;30579:7;:29;;30571:106;;;;-1:-1:-1::0;;;30571:106:0::1;;;;;;;:::i;:::-;30692:54;-1:-1:-1::0;;;;;30692:11:0::1;:24;30725:10;30738:7:::0;30692:24:::1;:54::i;:::-;30773:11:::0;;30770:165:::1;;30815:1;30801:15:::0;;;30831:11:::1;:22:::0;;30846:7;;30815:1;30831:22:::1;::::0;30846:7;;30831:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;30868:12:0;;:55:::1;::::0;-1:-1:-1;;;;;30868:12:0::1;30902:10;30915:7:::0;30868:25:::1;:55::i;:::-;30981:22;::::0;::::1;::::0;30965:11;;:49:::1;::::0;31009:4:::1;::::0;30965:39:::1;::::0;:15:::1;:39::i;:49::-;30947:15;::::0;::::1;:67:::0;31038:11;;:15;31035:172:::1;;31118:12;::::0;31100:30:::1;::::0;:15:::1;:30;:::i;:::-;31086:10;31069:28;::::0;;;:16:::1;:28;::::0;;;;:61;31035:172:::1;;;31180:10;31194:1;31163:28:::0;;;:16:::1;:28;::::0;;;;:32;31035:172:::1;31224:29;::::0;160:25:1;;;31233:10:0::1;::::0;31224:29:::1;::::0;148:2:1;133:18;31224:29:0::1;;;;;;;;-1:-1:-1::0;;23696:1:0;24650:22;;-1:-1:-1;;30108:1153:0:o;28544:190::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;28616:8:::1;:15:::0;28599:14:::1;28642:85;28670:6;28664:3;:12;28642:85;;;28700:15;28711:3;28700:10;:15::i;:::-;28678:5;::::0;::::1;:::i;:::-;;;28642:85;;;;28588:146;28544:190::o:0;2808:140::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;2907:1:::1;2891:6:::0;;2870:40:::1;::::0;-1:-1:-1;;;;;2891:6:0;;::::1;::::0;2870:40:::1;::::0;2907:1;;2870:40:::1;2938:1;2921:19:::0;;-1:-1:-1;;;;;;2921:19:0::1;::::0;;2808:140::o;26792:204::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;26853:8:::1;26862:1;26853:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;;26888:8;26853:43;26845:83;;;::::0;-1:-1:-1;;;26845:83:0;;4722:2:1;26845:83:0::1;::::0;::::1;4704:21:1::0;4761:2;4741:18;;;4734:30;4800:29;4780:18;;;4773:57;4847:18;;26845:83:0::1;4520:351:1::0;26845:83:0::1;26973:15;26939:8;26948:1;26939:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;:49;;;;26792:204::o:0;32733:133::-;32847:11;;32808:36;;-1:-1:-1;;;32808:36:0;;32838:4;32808:36;;;1521:51:1;32782:7:0;;32847:11;-1:-1:-1;;;;;32808:11:0;:21;;;;1494:18:1;;32808:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32801:57;;32733:133;:::o;26693:91::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;26745:13:::1;26756:1;26745:10;:13::i;:::-;26775:1;26769:3;:7:::0;26693:91::o;33054:203::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;33164:7:::1;33145:15;:26;;33137:69;;;::::0;-1:-1:-1;;;33137:69:0;;5078:2:1;33137:69:0::1;::::0;::::1;5060:21:1::0;5117:2;5097:18;;;5090:30;5156:32;5136:18;;;5129:60;5206:18;;33137:69:0::1;4876:354:1::0;33137:69:0::1;33217:12;:30:::0;33054:203::o;33265:192::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;33372:2:::1;33354:14;:20;;33346:60;;;::::0;-1:-1:-1;;;33346:60:0;;5437:2:1;33346:60:0::1;::::0;::::1;5419:21:1::0;5476:2;5456:18;;;5449:30;5515:29;5495:18;;;5488:57;5562:18;;33346:60:0::1;5235:351:1::0;33346:60:0::1;33417:15;:32:::0;33265:192::o;32416:309::-;32468:7;32488:21;32512:8;32521:1;32512:11;;;;;;;;:::i;:::-;;;;;;;;;;;32488:35;;32564:15;32537:4;:24;;;:42;32534:81;;;32602:1;32595:8;;;32416:309;:::o;32534:81::-;32708:8;32702:3;32696;;32681:11;;32653:4;:24;;;32635:15;:42;;;;:::i;:::-;32634:58;;;;:::i;:::-;32633:66;;;;:::i;:::-;:72;;;;:::i;:::-;:83;;;;:::i;:::-;32625:92;;;32416:309;:::o;28771:1281::-;23740:1;24338:7;;:19;24330:63;;;;-1:-1:-1;;;24330:63:0;;;;;;;:::i;:::-;23740:1;24471:7;:18;;;28856:10:::1;28839:28;::::0;;;::::1;::::0;;;;;;;;:33;;28836:125:::1;;28937:12;::::0;28919:30:::1;::::0;:15:::1;:30;:::i;:::-;28905:10;28888:28;::::0;;;:16:::1;:28;::::0;;;;:61;28836:125:::1;28971:21;28995:8;29004:1;28995:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;29050:10:::1;29041:20:::0;;:8:::1;:20:::0;;;;;;28995:11:::1;::::0;;::::1;;::::0;-1:-1:-1;29041:20:0;29074:13:::1;::::0;:10:::1;:13::i;:::-;29102:11:::0;;:15;29098:380:::1;;29134:15;29152:70;29206:4;:15;;;29152:49;29196:4;29152:39;29168:4;:22;;;29152:4;:11;;;:15;;:39;;;;:::i;:70::-;29134:88:::0;-1:-1:-1;29240:11:0;;29237:230:::1;;29291:18;:16;:18::i;:::-;29280:7;:29;;29272:106;;;;-1:-1:-1::0;;;29272:106:0::1;;;;;;;:::i;:::-;29397:54;-1:-1:-1::0;;;;;29397:11:0::1;:24;29430:10;29443:7:::0;29397:24:::1;:54::i;:::-;29119:359;29098:380;29488:25;29531:11:::0;;29528:393:::1;;29584:12:::0;;:37:::1;::::0;-1:-1:-1;;;29584:37:0;;29615:4:::1;29584:37;::::0;::::1;1521:51:1::0;29559:22:0::1;::::0;-1:-1:-1;;;;;29584:12:0::1;::::0;:22:::1;::::0;1494:18:1;;29584:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29636:12:::0;;29559:62;;-1:-1:-1;29636:74:0::1;::::0;-1:-1:-1;;;;;29636:12:0::1;29674:10;29695:4;29702:7:::0;29636:29:::1;:74::i;:::-;29745:12:::0;;:37:::1;::::0;-1:-1:-1;;;29745:37:0;;29776:4:::1;29745:37;::::0;::::1;1521:51:1::0;29785:14:0;;-1:-1:-1;;;;;29745:12:0::1;::::0;:22:::1;::::0;1494:18:1;;29745:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;29828:11:::0;;29725:74;;-1:-1:-1;29828:34:0::1;::::0;29725:74;29828:15:::1;:34::i;:::-;29814:48:::0;;29877:11:::1;:32:::0;;29892:17;;29877:11;29814::::1;::::0;29877:32:::1;::::0;29892:17;;29877:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;29528:393:0::1;29965:22;::::0;::::1;::::0;29949:11;;:49:::1;::::0;29993:4:::1;::::0;29949:39:::1;::::0;:15:::1;:39::i;:49::-;29931:15;::::0;::::1;:67:::0;30016:28:::1;::::0;160:25:1;;;30024:10:0::1;::::0;30016:28:::1;::::0;148:2:1;133:18;30016:28:0::1;14:177:1::0;31332:665:0;23740:1;24338:7;;:19;24330:63;;;;-1:-1:-1;;;24330:63:0;;;;;;;:::i;:::-;23740:1;24471:7;:18;;;;31394:21:::1;31418:8;31427:1;31418:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;31473:10:::1;31464:20:::0;;:8:::1;:20:::0;;;;;;31513:11;;31535::::1;:22:::0;;31418:11:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;31464:20:0;;31513:11;;;;31535;31418;31535:22:::1;::::0;31513:11;;31535:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;31671:10:0::1;31654:28;::::0;;;:16:::1;:28;::::0;;;;;31686:15:::1;-1:-1:-1::0;31651:120:0::1;;31756:3;31738:15;;31728:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;31717:42;::::0;;::::1;:::i;:::-;;;31651:120;31798:10;31812:1;31781:28:::0;;;:16:::1;:28;::::0;;;;:32;31824:12;;:55:::1;::::0;-1:-1:-1;;;;;31824:12:0;;::::1;::::0;31871:7;31824:25:::1;:55::i;:::-;31904:1;31890:15:::0;;;31916::::1;::::0;::::1;:19:::0;31951:38:::1;::::0;160:25:1;;;31969:10:0::1;::::0;31951:38:::1;::::0;148:2:1;133:18;31951:38:0::1;;;;;;;-1:-1:-1::0;;23696:1:0;24650:22;;-1:-1:-1;31332:665:0:o;3103:109::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;3176:28:::1;3195:8;3176:18;:28::i;27061:724::-:0;27122:7;27142:21;27166:8;27175:1;27166:11;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;27212:15:0;;;;:8;:15;;;;;;;27241:24;27166:11;;;;;;;27241:24;;;;27166:11;;-1:-1:-1;27269:8:0;27241:36;27238:75;;-1:-1:-1;27300:1:0;;27061:724;-1:-1:-1;;;27061:724:0:o;27238:75::-;27351:22;;;;;27403:11;;27447:24;;;;27429:15;:42;:59;;;;-1:-1:-1;27475:13:0;;;27429:59;27425:270;;;27505:19;27527:63;27574:15;;27527:42;27553:4;:15;;;27527:21;:19;:21::i;:::-;:25;;:42::i;:63::-;27505:85;-1:-1:-1;27625:58:0;27647:35;27673:8;27647:21;27505:85;27663:4;27647:15;:21::i;:35::-;27625:17;;:21;:58::i;:::-;27605:78;;27490:205;27425:270;27712:65;27761:4;:15;;;27712:44;27751:4;27712:34;27728:17;27712:4;:11;;;:15;;:34;;;;:::i;:65::-;27705:72;27061:724;-1:-1:-1;;;;;;27061:724:0:o;32874:172::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;32957:5:::1;32947:6;:15;;32939:52;;;::::0;-1:-1:-1;;;32939:52:0;;6188:2:1;32939:52:0::1;::::0;::::1;6170:21:1::0;6227:2;6207:18;;;6200:30;6266:26;6246:18;;;6239:54;6310:18;;32939:52:0::1;5986:348:1::0;32939:52:0::1;33002:13;33013:1;33002:10;:13::i;:::-;33026:3;:12:::0;32874:172::o;13207:211::-;13351:58;;-1:-1:-1;;;;;6531:32:1;;13351:58:0;;;6513:51:1;6580:18;;;6573:34;;;13324:86:0;;13344:5;;-1:-1:-1;;;13374:23:0;6486:18:1;;13351:58:0;;;;-1:-1:-1;;13351:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;13351:58:0;-1:-1:-1;;;;;;13351:58:0;;;;;;;;;;13324:19;:86::i;:::-;13207:211;;;:::o;27861:600::-;27915:21;27939:8;27948:4;27939:14;;;;;;;;:::i;:::-;;;;;;;;;;;27915:38;;27987:4;:24;;;27968:15;:43;27964:82;;28028:7;27861:600;:::o;27964:82::-;28075:11;;28056:16;28101:13;;;28097:109;;-1:-1:-1;28158:15:0;28131:24;;;;:42;-1:-1:-1;27861:600:0:o;28097:109::-;28216:19;28238:63;28285:15;;28238:42;28264:4;:15;;;28238:21;:19;:21::i;:63::-;28216:85;-1:-1:-1;28337:63:0;28364:35;28390:8;28364:21;28216:85;28380:4;28364:15;:21::i;:35::-;28337:22;;;;;:26;:63::i;:::-;28312:22;;;:88;-1:-1:-1;;28438:15:0;28411:24;;;;:42;-1:-1:-1;27861:600:0:o;5782:471::-;5840:7;6085:1;6090;6085:6;6081:47;;-1:-1:-1;6115:1:0;6108:8;;6081:47;6140:9;6152:5;6156:1;6152;:5;:::i;:::-;6140:17;-1:-1:-1;6185:1:0;6176:5;6180:1;6140:17;6176:5;:::i;:::-;:10;6168:56;;;;-1:-1:-1;;;6168:56:0;;6820:2:1;6168:56:0;;;6802:21:1;6859:2;6839:18;;;6832:30;6898:34;6878:18;;;6871:62;-1:-1:-1;;;6949:18:1;;;6942:31;6990:19;;6168:56:0;6618:397:1;6168:56:0;6244:1;-1:-1:-1;5782:471:0;;;;;:::o;6729:132::-;6787:7;6814:39;6818:1;6821;6814:39;;;;;;;;;;;;;;;;;:3;:39::i;4858:136::-;4916:7;4943:43;4947:1;4950;4943:43;;;;;;;;;;;;;;;;;:3;:43::i;13426:248::-;13597:68;;-1:-1:-1;;;;;7278:15:1;;;13597:68:0;;;7260:34:1;7330:15;;7310:18;;;7303:43;7362:18;;;7355:34;;;13570:96:0;;13590:5;;-1:-1:-1;;;13620:27:0;7195:18:1;;13597:68:0;7020:375:1;13570:96:0;13426:248;;;;:::o;4394:181::-;4452:7;;4484:5;4488:1;4484;:5;:::i;:::-;4472:17;;4513:1;4508;:6;;4500:46;;;;-1:-1:-1;;;4500:46:0;;7602:2:1;4500:46:0;;;7584:21:1;7641:2;7621:18;;;7614:30;7680:29;7660:18;;;7653:57;7727:18;;4500:46:0;7400:351:1;3318:229:0;-1:-1:-1;;;;;3392:22:0;;3384:73;;;;-1:-1:-1;;;3384:73:0;;7958:2:1;3384:73:0;;;7940:21:1;7997:2;7977:18;;;7970:30;8036:34;8016:18;;;8009:62;-1:-1:-1;;;8087:18:1;;;8080:36;8133:19;;3384:73:0;7756:402:1;3384:73:0;3494:6;;;3473:38;;-1:-1:-1;;;;;3473:38:0;;;;3494:6;;;3473:38;;;3522:6;:17;;-1:-1:-1;;;;;;3522:17:0;-1:-1:-1;;;;;3522:17:0;;;;;;;;;;3318:229::o;15742:774::-;16166:23;16192:69;16220:4;16192:69;;;;;;;;;;;;;;;;;16200:5;-1:-1:-1;;;;;16192:27:0;;;:69;;;;;:::i;:::-;16276:17;;16166:95;;-1:-1:-1;16276:21:0;16272:237;;16431:10;16420:30;;;;;;;;;;;;:::i;:::-;16412:85;;;;-1:-1:-1;;;16412:85:0;;8647:2:1;16412:85:0;;;8629:21:1;8686:2;8666:18;;;8659:30;8725:34;8705:18;;;8698:62;-1:-1:-1;;;8776:18:1;;;8769:40;8826:19;;16412:85:0;8445:406:1;7357:312:0;7477:7;7512:12;7505:5;7497:28;;;;-1:-1:-1;;;7497:28:0;;;;;;;;:::i;:::-;-1:-1:-1;7536:9:0;7548:5;7552:1;7548;:5;:::i;:::-;7536:17;7357:312;-1:-1:-1;;;;;7357:312:0:o;5297:226::-;5417:7;5453:12;5445:6;;;;5437:29;;;;-1:-1:-1;;;5437:29:0;;;;;;;;:::i;:::-;-1:-1:-1;5477:9:0;5489:5;5493:1;5489;:5;:::i;20341:230::-;20478:12;20510:53;20533:6;20541:4;20547:1;20550:12;20510:22;:53::i;:::-;20503:60;20341:230;-1:-1:-1;;;;20341:230:0:o;21829:1020::-;22002:12;22035:18;22046:6;22035:10;:18::i;:::-;22027:60;;;;-1:-1:-1;;;22027:60:0;;9714:2:1;22027:60:0;;;9696:21:1;9753:2;9733:18;;;9726:30;9792:31;9772:18;;;9765:59;9841:18;;22027:60:0;9512:353:1;22027:60:0;22161:12;22175:23;22202:6;-1:-1:-1;;;;;22202:11:0;22221:8;22231:4;22202:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22160:76;;;;22251:7;22247:595;;;22282:10;-1:-1:-1;22275:17:0;;-1:-1:-1;22275:17:0;22247:595;22396:17;;:21;22392:439;;22659:10;22653:17;22720:15;22707:10;22703:2;22699:19;22692:44;22392:439;22802:12;22795:20;;-1:-1:-1;;;22795:20:0;;;;;;;;:::i;17204:641::-;17264:4;17745:20;;17575:66;17794:23;;;;;;:42;;-1:-1:-1;;17821:15:0;;;17786:51;-1:-1:-1;;17204:641:0:o;196:180:1:-;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:1;;196:180;-1:-1:-1;196:180:1:o;817:286::-;876:6;929:2;917:9;908:7;904:23;900:32;897:52;;;945:1;942;935:12;897:52;971:23;;-1:-1:-1;;;;;1023:31:1;;1013:42;;1003:70;;1069:1;1066;1059:12;1791:356;1993:2;1975:21;;;2012:18;;;2005:30;2071:34;2066:2;2051:18;;2044:62;2138:2;2123:18;;1791:356::o;2152:184::-;2222:6;2275:2;2263:9;2254:7;2250:23;2246:32;2243:52;;;2291:1;2288;2281:12;2243:52;-1:-1:-1;2314:16:1;;2152:184;-1:-1:-1;2152:184:1:o;2341:127::-;2402:10;2397:3;2393:20;2390:1;2383:31;2433:4;2430:1;2423:15;2457:4;2454:1;2447:15;2473:128;2540:9;;;2561:11;;;2558:37;;;2575:18;;:::i;2964:355::-;3166:2;3148:21;;;3205:2;3185:18;;;3178:30;3244:33;3239:2;3224:18;;3217:61;3310:2;3295:18;;2964:355::o;3685:127::-;3746:10;3741:3;3737:20;3734:1;3727:31;3777:4;3774:1;3767:15;3801:4;3798:1;3791:15;3817:428;4019:2;4001:21;;;4058:2;4038:18;;;4031:30;;;4097:34;4077:18;;;4070:62;4168:34;4163:2;4148:18;;4141:62;4235:3;4220:19;;3817:428::o;4250:125::-;4315:9;;;4336:10;;;4333:36;;;4349:18;;:::i;4380:135::-;4419:3;4440:17;;;4437:43;;4460:18;;:::i;:::-;-1:-1:-1;4507:1:1;4496:13;;4380:135::o;5591:168::-;5664:9;;;5695;;5712:15;;;5706:22;;5692:37;5682:71;;5733:18;;:::i;5764:217::-;5804:1;5830;5820:132;;5874:10;5869:3;5865:20;5862:1;5855:31;5909:4;5906:1;5899:15;5937:4;5934:1;5927:15;5820:132;-1:-1:-1;5966:9:1;;5764:217::o;8163:277::-;8230:6;8283:2;8271:9;8262:7;8258:23;8254:32;8251:52;;;8299:1;8296;8289:12;8251:52;8331:9;8325:16;8384:5;8377:13;8370:21;8363:5;8360:32;8350:60;;8406:1;8403;8396:12;8856:250;8941:1;8951:113;8965:6;8962:1;8959:13;8951:113;;;9041:11;;;9035:18;9022:11;;;9015:39;8987:2;8980:10;8951:113;;;-1:-1:-1;;9098:1:1;9080:16;;9073:27;8856:250::o;9111:396::-;9260:2;9249:9;9242:21;9223:4;9292:6;9286:13;9335:6;9330:2;9319:9;9315:18;9308:34;9351:79;9423:6;9418:2;9407:9;9403:18;9398:2;9390:6;9386:15;9351:79;:::i;:::-;9491:2;9470:15;-1:-1:-1;;9466:29:1;9451:45;;;;9498:2;9447:54;;9111:396;-1:-1:-1;;9111:396:1:o;9870:287::-;9999:3;10037:6;10031:13;10053:66;10112:6;10107:3;10100:4;10092:6;10088:17;10053:66;:::i;:::-;10135:16;;;;;9870:287;-1:-1:-1;;9870:287:1:o
Swarm Source
ipfs://f5b435f5ecbc79d4458a200437bc8beb1d1582b390985404f23ff2c901651ec1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.010289 | 353,685.6257 | $3,639.15 |
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.