More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,140 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 21793237 | 26 mins ago | IN | 0 ETH | 0.0003232 | ||||
Deposit | 21793224 | 28 mins ago | IN | 0 ETH | 0.00022507 | ||||
Deposit | 21777407 | 2 days ago | IN | 0 ETH | 0.00047118 | ||||
Withdraw | 21754468 | 5 days ago | IN | 0 ETH | 0.00045854 | ||||
Deposit | 21754464 | 5 days ago | IN | 0 ETH | 0.00040667 | ||||
Withdraw | 21749535 | 6 days ago | IN | 0 ETH | 0.00035371 | ||||
Deposit | 21746007 | 6 days ago | IN | 0 ETH | 0.00118075 | ||||
Deposit | 21746003 | 6 days ago | IN | 0 ETH | 0.00088237 | ||||
Deposit | 21740351 | 7 days ago | IN | 0 ETH | 0.00033152 | ||||
Withdraw | 21740349 | 7 days ago | IN | 0 ETH | 0.00059169 | ||||
Withdraw | 21738478 | 7 days ago | IN | 0 ETH | 0.00092703 | ||||
Deposit | 21738475 | 7 days ago | IN | 0 ETH | 0.00084905 | ||||
Emergency Withdr... | 21737991 | 7 days ago | IN | 0 ETH | 0.00058531 | ||||
Withdraw | 21695913 | 13 days ago | IN | 0 ETH | 0.00181808 | ||||
Deposit | 21695910 | 13 days ago | IN | 0 ETH | 0.00334196 | ||||
Withdraw | 21670474 | 17 days ago | IN | 0 ETH | 0.00104477 | ||||
Deposit | 21670462 | 17 days ago | IN | 0 ETH | 0.00105494 | ||||
Withdraw | 21651443 | 19 days ago | IN | 0 ETH | 0.00157557 | ||||
Deposit | 21639868 | 21 days ago | IN | 0 ETH | 0.00092638 | ||||
Deposit | 21639866 | 21 days ago | IN | 0 ETH | 0.00125063 | ||||
Deposit | 21621553 | 23 days ago | IN | 0 ETH | 0.0007198 | ||||
Deposit | 21621549 | 23 days ago | IN | 0 ETH | 0.00054453 | ||||
Withdraw | 21608563 | 25 days ago | IN | 0 ETH | 0.00042896 | ||||
Deposit | 21608561 | 25 days ago | IN | 0 ETH | 0.00039494 | ||||
Deposit | 21602704 | 26 days ago | IN | 0 ETH | 0.00049555 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CODEXSTAKE
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-22 */ //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 CODEXSTAKE 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(0xFD26e39807772251c3BB90fb1fCD9CE5b80c5C24); rewardToken = stakingToken; apy = 150; 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
60c0604052600060095534801561001557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180805573fd26e39807772251c3bb90fb1fcd9ce5b80c5c24608081815260a08290526096600490815562093a8060055560146006556040805192830181529282526103e8602083018181526301480edf94840194855260006060850181815260078054988901815590915293517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889690930295860180546001600160a01b0319166001600160a01b039094169390931790925590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68985015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a840155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b9092019190915560095560805160a0516119556101cc6000396000818161035101528181610415015281816104ee015281816106590152818161090d0152610c570152600061024801526119556000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806380dc0672116100de578063a913a5f711610097578063f2fde38b11610071578063f2fde38b14610326578063f40f0f5214610339578063f7c618c11461034c578063ff16ef391461037357600080fd5b8063a913a5f7146102eb578063b6b55f251461030b578063db2e21bc1461031e57600080fd5b806380dc06721461029b578063817b1cd2146102a35780638c09c135146102ac5780638da5cb5b146102bf5780638e0b0198146102d0578063999e2f75146102e357600080fd5b8063630b5ba111610130578063630b5ba114610233578063715018a61461023b57806372f702f314610243578063746c8ae11461028257806378c196f31461028a5780637b280def1461029257600080fd5b806304554443146101785780631526fe27146101945780631959a002146101d15780633279beab1461020d5780633bcfc4b8146102225780633ccfd60b1461022b575b600080fd5b61018160055481565b6040519081526020015b60405180910390f35b6101a76101a23660046116c1565b610386565b604080516001600160a01b039095168552602085019390935291830152606082015260800161018b565b6101f86101df3660046116da565b6008602052600090815260409020805460019091015482565b6040805192835260208301919091520161018b565b61022061021b3660046116c1565b6103ca565b005b61018160045481565b610220610518565b610220610752565b6102206107a7565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018b565b61022061081b565b6101816108e9565b61018160065481565b610220610987565b61018160035481565b6102206102ba3660046116c1565b6109c2565b6000546001600160a01b031661026a565b6102206102de3660046116c1565b610a44565b610181610ac4565b6101816102f93660046116da565b60026020526000908152604090205481565b6102206103193660046116c1565b610b4a565b610220610e02565b6102206103343660046116da565b610f2d565b6101816103473660046116da565b610f60565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b6102206103813660046116c1565b61104e565b6007818154811061039657600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146103fd5760405162461bcd60e51b81526004016103f490611703565b60405180910390fd5b6003546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104889190611738565b6104929190611767565b8111156104e15760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f757400000060448201526064016103f4565b6105156001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633836110d9565b50565b60026001540361053a5760405162461bcd60e51b81526004016103f49061177a565b6002600181905533600090815260209190915260409020544210156105a15760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c7960448201526064016103f4565b600060076000815481106105b7576105b76117b1565b60009182526020808320338452600890915260408320805460049093029091019350916105e390611141565b600061061d836001015461061764e8d4a51000610611886003015488600001546111d890919063ffffffff16565b90611263565b906112a5565b905080156106805761062d6108e9565b81111561064c5760405162461bcd60e51b81526004016103f4906117c7565b6106806001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633836110d9565b81156106b85760008084556003805484929061069d908490611767565b909155505083546106b8906001600160a01b031633846110d9565b600384015483546106d39164e8d4a5100091610611916111d8565b6001840155825415610701576005546106ec9042611825565b33600090815260026020526040902055610712565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b0316331461077c5760405162461bcd60e51b81526004016103f490611703565b60075460005b818110156107a35761079381611141565b61079c81611838565b9050610782565b5050565b6000546001600160a01b031633146107d15760405162461bcd60e51b81526004016103f490611703565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146108455760405162461bcd60e51b81526004016103f490611703565b6007600081548110610859576108596117b1565b9060005260206000209060040201600201546301480edf146108bd5760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e6365000000000060448201526064016103f4565b4260076000815481106108d2576108d26117b1565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109789190611738565b6109829190611767565b905090565b6000546001600160a01b031633146109b15760405162461bcd60e51b81526004016103f490611703565b6109bb6000611141565b6000600455565b6000546001600160a01b031633146109ec5760405162461bcd60e51b81526004016103f490611703565b6224ea00811115610a3f5760405162461bcd60e51b815260206004820152601e60248201527f4475726174696f6e206d7573742062652062656c6f772032207765656b73000060448201526064016103f4565b600555565b6000546001600160a01b03163314610a6e5760405162461bcd60e51b81526004016103f490611703565b6014811115610abf5760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e20323025000000000060448201526064016103f4565b600655565b6000806007600081548110610adb57610adb6117b1565b906000526020600020906004020190504281600201541115610aff57600091505090565b6301e133806064600454600354846002015442610b1c9190611767565b610b269190611851565b610b309190611851565b610b3a9190611868565b610b449190611868565b91505090565b600260015403610b6c5760405162461bcd60e51b81526004016103f49061177a565b6002600181905533600090815260209190915260408120549003610ba857600554610b979042611825565b336000908152600260205260409020555b60006007600081548110610bbe57610bbe6117b1565b60009182526020808320338452600890915260408320600490920201925090610be690611141565b805415610c80576000610c1b826001015461061764e8d4a51000610611876003015487600001546111d890919063ffffffff16565b90508015610c7e57610c2b6108e9565b811115610c4a5760405162461bcd60e51b81526004016103f4906117c7565b610c7e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633836110d9565b505b60008315610db05782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf49190611738565b8454909150610d0e906001600160a01b03163330886112e7565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d799190611738565b610d839190611767565b8354909250610d929083611325565b835560038054839190600090610da9908490611825565b9091555050505b60038301548254610dcb9164e8d4a5100091610611916111d8565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610740565b600260015403610e245760405162461bcd60e51b81526004016103f49061177a565b600260018190555060006007600081548110610e4257610e426117b1565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610e7b908490611767565b9091555050336000908152600260205260409020544211610ebd57606460065482610ea69190611851565b610eb09190611868565b610eba9082611767565b90505b336000818152600260205260408120558354610ee5916001600160a01b0390911690836110d9565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b03163314610f575760405162461bcd60e51b81526004016103f490611703565b61051581611384565b6000806007600081548110610f7757610f776117b1565b600091825260208083206001600160a01b03871684526008909152604090922060026004909202909201908101549092506301480edf03610fbc575060009392505050565b6003808301549054600284015442118015610fd657508015155b1561101c576000610ff96009546106118760010154610ff3610ac4565b906111d8565b9050611018611011836106118464e8d4a510006111d8565b8490611325565b9250505b611044836001015461061764e8d4a510006106118688600001546111d890919063ffffffff16565b9695505050505050565b6000546001600160a01b031633146110785760405162461bcd60e51b81526004016103f490611703565b6127108111156110ca5760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f7720313030303025000000000000000060448201526064016103f4565b6110d46000611141565b600455565b6040516001600160a01b03831660248201526044810182905261113c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611444565b505050565b600060078281548110611156576111566117b1565b9060005260206000209060040201905080600201544211611175575050565b600354600081900361118c57504260029091015550565b60006111a46009546106118560010154610ff3610ac4565b90506111c76111bc836106118464e8d4a510006111d8565b600385015490611325565b600384015550504260029091015550565b6000826000036111ea5750600061125d565b60006111f68385611851565b9050826112038583611868565b1461125a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016103f4565b90505b92915050565b600061125a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611516565b600061125a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061154d565b6040516001600160a01b038085166024830152831660448201526064810182905261131f9085906323b872dd60e01b90608401611105565b50505050565b6000806113328385611825565b90508381101561125a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103f4565b6001600160a01b0381166113e95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611499826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661157e9092919063ffffffff16565b80519091501561113c57808060200190518101906114b7919061188a565b61113c5760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f4565b600081836115375760405162461bcd60e51b81526004016103f491906118d0565b5060006115448486611868565b95945050505050565b600081848411156115715760405162461bcd60e51b81526004016103f491906118d0565b5060006115448486611767565b606061158d8484600085611595565b949350505050565b60606115a085611688565b6115ec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f4565b600080866001600160a01b031685876040516116089190611903565b60006040518083038185875af1925050503d8060008114611645576040519150601f19603f3d011682016040523d82523d6000602084013e61164a565b606091505b5091509150811561165e57915061158d9050565b80511561166e5780518082602001fd5b8360405162461bcd60e51b81526004016103f491906118d0565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061158d575050151592915050565b6000602082840312156116d357600080fd5b5035919050565b6000602082840312156116ec57600080fd5b81356001600160a01b038116811461125a57600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561174a57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561125d5761125d611751565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b8082018082111561125d5761125d611751565b60006001820161184a5761184a611751565b5060010190565b808202811582820484141761125d5761125d611751565b60008261188557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561189c57600080fd5b8151801515811461125a57600080fd5b60005b838110156118c75781810151838201526020016118af565b50506000910152565b60208152600082518060208401526118ef8160408501602087016118ac565b601f01601f19169190910160400192915050565b600082516119158184602087016118ac565b919091019291505056fea2646970667358221220b66da09e0309674d468c14d4e0a824f0669c52ab2587f954883833880703cb8c64736f6c63430008130033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806380dc0672116100de578063a913a5f711610097578063f2fde38b11610071578063f2fde38b14610326578063f40f0f5214610339578063f7c618c11461034c578063ff16ef391461037357600080fd5b8063a913a5f7146102eb578063b6b55f251461030b578063db2e21bc1461031e57600080fd5b806380dc06721461029b578063817b1cd2146102a35780638c09c135146102ac5780638da5cb5b146102bf5780638e0b0198146102d0578063999e2f75146102e357600080fd5b8063630b5ba111610130578063630b5ba114610233578063715018a61461023b57806372f702f314610243578063746c8ae11461028257806378c196f31461028a5780637b280def1461029257600080fd5b806304554443146101785780631526fe27146101945780631959a002146101d15780633279beab1461020d5780633bcfc4b8146102225780633ccfd60b1461022b575b600080fd5b61018160055481565b6040519081526020015b60405180910390f35b6101a76101a23660046116c1565b610386565b604080516001600160a01b039095168552602085019390935291830152606082015260800161018b565b6101f86101df3660046116da565b6008602052600090815260409020805460019091015482565b6040805192835260208301919091520161018b565b61022061021b3660046116c1565b6103ca565b005b61018160045481565b610220610518565b610220610752565b6102206107a7565b61026a7f000000000000000000000000fd26e39807772251c3bb90fb1fcd9ce5b80c5c2481565b6040516001600160a01b03909116815260200161018b565b61022061081b565b6101816108e9565b61018160065481565b610220610987565b61018160035481565b6102206102ba3660046116c1565b6109c2565b6000546001600160a01b031661026a565b6102206102de3660046116c1565b610a44565b610181610ac4565b6101816102f93660046116da565b60026020526000908152604090205481565b6102206103193660046116c1565b610b4a565b610220610e02565b6102206103343660046116da565b610f2d565b6101816103473660046116da565b610f60565b61026a7f000000000000000000000000fd26e39807772251c3bb90fb1fcd9ce5b80c5c2481565b6102206103813660046116c1565b61104e565b6007818154811061039657600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146103fd5760405162461bcd60e51b81526004016103f490611703565b60405180910390fd5b6003546040516370a0823160e01b81523060048201527f000000000000000000000000fd26e39807772251c3bb90fb1fcd9ce5b80c5c246001600160a01b0316906370a0823190602401602060405180830381865afa158015610464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104889190611738565b6104929190611767565b8111156104e15760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f757400000060448201526064016103f4565b6105156001600160a01b037f000000000000000000000000fd26e39807772251c3bb90fb1fcd9ce5b80c5c241633836110d9565b50565b60026001540361053a5760405162461bcd60e51b81526004016103f49061177a565b6002600181905533600090815260209190915260409020544210156105a15760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c7960448201526064016103f4565b600060076000815481106105b7576105b76117b1565b60009182526020808320338452600890915260408320805460049093029091019350916105e390611141565b600061061d836001015461061764e8d4a51000610611886003015488600001546111d890919063ffffffff16565b90611263565b906112a5565b905080156106805761062d6108e9565b81111561064c5760405162461bcd60e51b81526004016103f4906117c7565b6106806001600160a01b037f000000000000000000000000fd26e39807772251c3bb90fb1fcd9ce5b80c5c241633836110d9565b81156106b85760008084556003805484929061069d908490611767565b909155505083546106b8906001600160a01b031633846110d9565b600384015483546106d39164e8d4a5100091610611916111d8565b6001840155825415610701576005546106ec9042611825565b33600090815260026020526040902055610712565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b0316331461077c5760405162461bcd60e51b81526004016103f490611703565b60075460005b818110156107a35761079381611141565b61079c81611838565b9050610782565b5050565b6000546001600160a01b031633146107d15760405162461bcd60e51b81526004016103f490611703565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146108455760405162461bcd60e51b81526004016103f490611703565b6007600081548110610859576108596117b1565b9060005260206000209060040201600201546301480edf146108bd5760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e6365000000000060448201526064016103f4565b4260076000815481106108d2576108d26117b1565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000fd26e39807772251c3bb90fb1fcd9ce5b80c5c2416906370a0823190602401602060405180830381865afa158015610954573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109789190611738565b6109829190611767565b905090565b6000546001600160a01b031633146109b15760405162461bcd60e51b81526004016103f490611703565b6109bb6000611141565b6000600455565b6000546001600160a01b031633146109ec5760405162461bcd60e51b81526004016103f490611703565b6224ea00811115610a3f5760405162461bcd60e51b815260206004820152601e60248201527f4475726174696f6e206d7573742062652062656c6f772032207765656b73000060448201526064016103f4565b600555565b6000546001600160a01b03163314610a6e5760405162461bcd60e51b81526004016103f490611703565b6014811115610abf5760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e20323025000000000060448201526064016103f4565b600655565b6000806007600081548110610adb57610adb6117b1565b906000526020600020906004020190504281600201541115610aff57600091505090565b6301e133806064600454600354846002015442610b1c9190611767565b610b269190611851565b610b309190611851565b610b3a9190611868565b610b449190611868565b91505090565b600260015403610b6c5760405162461bcd60e51b81526004016103f49061177a565b6002600181905533600090815260209190915260408120549003610ba857600554610b979042611825565b336000908152600260205260409020555b60006007600081548110610bbe57610bbe6117b1565b60009182526020808320338452600890915260408320600490920201925090610be690611141565b805415610c80576000610c1b826001015461061764e8d4a51000610611876003015487600001546111d890919063ffffffff16565b90508015610c7e57610c2b6108e9565b811115610c4a5760405162461bcd60e51b81526004016103f4906117c7565b610c7e6001600160a01b037f000000000000000000000000fd26e39807772251c3bb90fb1fcd9ce5b80c5c241633836110d9565b505b60008315610db05782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf49190611738565b8454909150610d0e906001600160a01b03163330886112e7565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d799190611738565b610d839190611767565b8354909250610d929083611325565b835560038054839190600090610da9908490611825565b9091555050505b60038301548254610dcb9164e8d4a5100091610611916111d8565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610740565b600260015403610e245760405162461bcd60e51b81526004016103f49061177a565b600260018190555060006007600081548110610e4257610e426117b1565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610e7b908490611767565b9091555050336000908152600260205260409020544211610ebd57606460065482610ea69190611851565b610eb09190611868565b610eba9082611767565b90505b336000818152600260205260408120558354610ee5916001600160a01b0390911690836110d9565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b03163314610f575760405162461bcd60e51b81526004016103f490611703565b61051581611384565b6000806007600081548110610f7757610f776117b1565b600091825260208083206001600160a01b03871684526008909152604090922060026004909202909201908101549092506301480edf03610fbc575060009392505050565b6003808301549054600284015442118015610fd657508015155b1561101c576000610ff96009546106118760010154610ff3610ac4565b906111d8565b9050611018611011836106118464e8d4a510006111d8565b8490611325565b9250505b611044836001015461061764e8d4a510006106118688600001546111d890919063ffffffff16565b9695505050505050565b6000546001600160a01b031633146110785760405162461bcd60e51b81526004016103f490611703565b6127108111156110ca5760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f7720313030303025000000000000000060448201526064016103f4565b6110d46000611141565b600455565b6040516001600160a01b03831660248201526044810182905261113c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611444565b505050565b600060078281548110611156576111566117b1565b9060005260206000209060040201905080600201544211611175575050565b600354600081900361118c57504260029091015550565b60006111a46009546106118560010154610ff3610ac4565b90506111c76111bc836106118464e8d4a510006111d8565b600385015490611325565b600384015550504260029091015550565b6000826000036111ea5750600061125d565b60006111f68385611851565b9050826112038583611868565b1461125a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016103f4565b90505b92915050565b600061125a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611516565b600061125a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061154d565b6040516001600160a01b038085166024830152831660448201526064810182905261131f9085906323b872dd60e01b90608401611105565b50505050565b6000806113328385611825565b90508381101561125a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103f4565b6001600160a01b0381166113e95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611499826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661157e9092919063ffffffff16565b80519091501561113c57808060200190518101906114b7919061188a565b61113c5760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f4565b600081836115375760405162461bcd60e51b81526004016103f491906118d0565b5060006115448486611868565b95945050505050565b600081848411156115715760405162461bcd60e51b81526004016103f491906118d0565b5060006115448486611767565b606061158d8484600085611595565b949350505050565b60606115a085611688565b6115ec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f4565b600080866001600160a01b031685876040516116089190611903565b60006040518083038185875af1925050503d8060008114611645576040519150601f19603f3d011682016040523d82523d6000602084013e61164a565b606091505b5091509150811561165e57915061158d9050565b80511561166e5780518082602001fd5b8360405162461bcd60e51b81526004016103f491906118d0565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061158d575050151592915050565b6000602082840312156116d357600080fd5b5035919050565b6000602082840312156116ec57600080fd5b81356001600160a01b038116811461125a57600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561174a57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561125d5761125d611751565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b8082018082111561125d5761125d611751565b60006001820161184a5761184a611751565b5060010190565b808202811582820484141761125d5761125d611751565b60008261188557634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561189c57600080fd5b8151801515811461125a57600080fd5b60005b838110156118c75781810151838201526020016118af565b50506000910152565b60208152600082518060208401526118ef8160408501602087016118ac565b601f01601f19169190910160400192915050565b600082516119158184602087016118ac565b919091019291505056fea2646970667358221220b66da09e0309674d468c14d4e0a824f0669c52ab2587f954883833880703cb8c64736f6c63430008130033
Deployed Bytecode Sourcemap
24687:8775:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25647:27;;;;;;;;;160:25:1;;;148:2;133:18;25647:27:0;;;;;;;;25747: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;25747:26:0;381:431:1;25829:45:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;1282:25:1;;;1338:2;1323:18;;1316:34;;;;1255:18;25829:45:0;1108:248:1;32148:256:0;;;;;;:::i;:::-;;:::i;:::-;;25622:18;;;;;;30110:1153;;;:::i;28546:190::-;;;:::i;2808:140::-;;;:::i;25443:36::-;;;;;;;;-1:-1:-1;;;;;1539:32:1;;;1521:51;;1509:2;1494:18;25443:36:0;1361:217:1;26794:204:0;;;:::i;32735:133::-;;;:::i;25681:30::-;;;;;;26695:91;;;:::i;25589:26::-;;;;;;33056:203;;;;;;:::i;:::-;;:::i;2166:79::-;2204:7;2231:6;-1:-1:-1;;;;;2231:6:0;2166:79;;33267:192;;;;;;:::i;:::-;;:::i;32418:309::-;;;:::i;25528:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;28773:1281;;;;;;:::i;:::-;;:::i;31334:665::-;;;:::i;3103:109::-;;;;;;:::i;:::-;;:::i;27063:724::-;;;;;;:::i;:::-;;:::i;25486:35::-;;;;;32876:172;;;;;;:::i;:::-;;:::i;25747:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25747:26:0;;;;-1:-1:-1;25747:26:0;;;:::o;32148:256::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;;;;;;;;;32286:11:::1;::::0;32247:36:::1;::::0;-1:-1:-1;;;32247:36:0;;32277:4:::1;32247:36;::::0;::::1;1521:51:1::0;32247:11:0::1;-1:-1:-1::0;;;;;32247:21:0::1;::::0;::::1;::::0;1494:18:1;;32247:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32236:7;:61;;32228:103;;;::::0;-1:-1:-1;;;32228:103:0;;2808:2:1;32228:103:0::1;::::0;::::1;2790:21:1::0;2847:2;2827:18;;;2820:30;2886:31;2866:18;;;2859:59;2935:18;;32228:103:0::1;2606:353:1::0;32228:103:0::1;32342:54;-1:-1:-1::0;;;;;32342:11:0::1;:24;32375:10;32388:7:::0;32342:24:::1;:54::i;:::-;32148:256:::0;:::o;30110:1153::-;23740:1;24338:7;;:19;24330:63;;;;-1:-1:-1;;;24330:63:0;;;;;;;:::i;:::-;23740:1;24471:7;:18;;;30188:10:::1;30171:28;::::0;;;::::1;::::0;;;;;;;;30203:15:::1;-1:-1:-1::0;30171:47:0::1;30163:92;;;::::0;-1:-1:-1;;;30163:92:0;;3526:2:1;30163:92:0::1;::::0;::::1;3508:21:1::0;;;3545:18;;;3538:30;3604:34;3584:18;;;3577:62;3656:18;;30163:92:0::1;3324:356:1::0;30163:92:0::1;30276:21;30300:8;30309:1;30300:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;30355:10:::1;30346:20:::0;;:8:::1;:20:::0;;;;;;30397:11;;30300::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;30346:20:0;30419:13:::1;::::0;:10:::1;:13::i;:::-;30443:15;30461:70;30515:4;:15;;;30461:49;30505:4;30461:39;30477:4;:22;;;30461:4;:11;;;:15;;:39;;;;:::i;:::-;:43:::0;::::1;:49::i;:::-;:53:::0;::::1;:70::i;:::-;30443:88:::0;-1:-1:-1;30545:11:0;;30542:218:::1;;30592:18;:16;:18::i;:::-;30581:7;:29;;30573:106;;;;-1:-1:-1::0;;;30573:106:0::1;;;;;;;:::i;:::-;30694:54;-1:-1:-1::0;;;;;30694:11:0::1;:24;30727:10;30740:7:::0;30694:24:::1;:54::i;:::-;30775:11:::0;;30772:165:::1;;30817:1;30803:15:::0;;;30833:11:::1;:22:::0;;30848:7;;30817:1;30833:22:::1;::::0;30848:7;;30833:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;30870:12:0;;:55:::1;::::0;-1:-1:-1;;;;;30870:12:0::1;30904:10;30917:7:::0;30870:25:::1;:55::i;:::-;30983:22;::::0;::::1;::::0;30967:11;;:49:::1;::::0;31011:4:::1;::::0;30967:39:::1;::::0;:15:::1;:39::i;:49::-;30949:15;::::0;::::1;:67:::0;31040:11;;:15;31037:172:::1;;31120:12;::::0;31102:30:::1;::::0;:15:::1;:30;:::i;:::-;31088:10;31071:28;::::0;;;:16:::1;:28;::::0;;;;:61;31037:172:::1;;;31182:10;31196:1;31165:28:::0;;;:16:::1;:28;::::0;;;;:32;31037:172:::1;31226:29;::::0;160:25:1;;;31235:10:0::1;::::0;31226:29:::1;::::0;148:2:1;133:18;31226:29:0::1;;;;;;;;-1:-1:-1::0;;23696:1:0;24650:22;;-1:-1:-1;;30110:1153:0:o;28546:190::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;28618:8:::1;:15:::0;28601:14:::1;28644:85;28672:6;28666:3;:12;28644:85;;;28702:15;28713:3;28702:10;:15::i;:::-;28680:5;::::0;::::1;:::i;:::-;;;28644:85;;;;28590:146;28546: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;26794:204::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;26855:8:::1;26864:1;26855:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;;26890:8;26855:43;26847:83;;;::::0;-1:-1:-1;;;26847:83:0;;4722:2:1;26847:83:0::1;::::0;::::1;4704:21:1::0;4761:2;4741:18;;;4734:30;4800:29;4780:18;;;4773:57;4847:18;;26847:83:0::1;4520:351:1::0;26847:83:0::1;26975:15;26941:8;26950:1;26941:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;:49;;;;26794:204::o:0;32735:133::-;32849:11;;32810:36;;-1:-1:-1;;;32810:36:0;;32840:4;32810:36;;;1521:51:1;32784:7:0;;32849:11;-1:-1:-1;;;;;32810:11:0;:21;;;;1494:18:1;;32810:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32803:57;;32735:133;:::o;26695:91::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;26747:13:::1;26758:1;26747:10;:13::i;:::-;26777:1;26771:3;:7:::0;26695:91::o;33056:203::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;33166:7:::1;33147:15;:26;;33139:69;;;::::0;-1:-1:-1;;;33139:69:0;;5078:2:1;33139:69:0::1;::::0;::::1;5060:21:1::0;5117:2;5097:18;;;5090:30;5156:32;5136:18;;;5129:60;5206:18;;33139:69:0::1;4876:354:1::0;33139:69:0::1;33219:12;:30:::0;33056:203::o;33267:192::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;33374:2:::1;33356:14;:20;;33348:60;;;::::0;-1:-1:-1;;;33348:60:0;;5437:2:1;33348:60:0::1;::::0;::::1;5419:21:1::0;5476:2;5456:18;;;5449:30;5515:29;5495:18;;;5488:57;5562:18;;33348:60:0::1;5235:351:1::0;33348:60:0::1;33419:15;:32:::0;33267:192::o;32418:309::-;32470:7;32490:21;32514:8;32523:1;32514:11;;;;;;;;:::i;:::-;;;;;;;;;;;32490:35;;32566:15;32539:4;:24;;;:42;32536:81;;;32604:1;32597:8;;;32418:309;:::o;32536:81::-;32710:8;32704:3;32698;;32683:11;;32655:4;:24;;;32637:15;:42;;;;:::i;:::-;32636:58;;;;:::i;:::-;32635:66;;;;:::i;:::-;:72;;;;:::i;:::-;:83;;;;:::i;:::-;32627:92;;;32418:309;:::o;28773:1281::-;23740:1;24338:7;;:19;24330:63;;;;-1:-1:-1;;;24330:63:0;;;;;;;:::i;:::-;23740:1;24471:7;:18;;;28858:10:::1;28841:28;::::0;;;::::1;::::0;;;;;;;;:33;;28838:125:::1;;28939:12;::::0;28921:30:::1;::::0;:15:::1;:30;:::i;:::-;28907:10;28890:28;::::0;;;:16:::1;:28;::::0;;;;:61;28838:125:::1;28973:21;28997:8;29006:1;28997:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;29052:10:::1;29043:20:::0;;:8:::1;:20:::0;;;;;;28997:11:::1;::::0;;::::1;;::::0;-1:-1:-1;29043:20:0;29076:13:::1;::::0;:10:::1;:13::i;:::-;29104:11:::0;;:15;29100:380:::1;;29136:15;29154:70;29208:4;:15;;;29154:49;29198:4;29154:39;29170:4;:22;;;29154:4;:11;;;:15;;:39;;;;:::i;:70::-;29136:88:::0;-1:-1:-1;29242:11:0;;29239:230:::1;;29293:18;:16;:18::i;:::-;29282:7;:29;;29274:106;;;;-1:-1:-1::0;;;29274:106:0::1;;;;;;;:::i;:::-;29399:54;-1:-1:-1::0;;;;;29399:11:0::1;:24;29432:10;29445:7:::0;29399:24:::1;:54::i;:::-;29121:359;29100:380;29490:25;29533:11:::0;;29530:393:::1;;29586:12:::0;;:37:::1;::::0;-1:-1:-1;;;29586:37:0;;29617:4:::1;29586:37;::::0;::::1;1521:51:1::0;29561:22:0::1;::::0;-1:-1:-1;;;;;29586:12:0::1;::::0;:22:::1;::::0;1494:18:1;;29586:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29638:12:::0;;29561:62;;-1:-1:-1;29638:74:0::1;::::0;-1:-1:-1;;;;;29638:12:0::1;29676:10;29697:4;29704:7:::0;29638:29:::1;:74::i;:::-;29747:12:::0;;:37:::1;::::0;-1:-1:-1;;;29747:37:0;;29778:4:::1;29747:37;::::0;::::1;1521:51:1::0;29787:14:0;;-1:-1:-1;;;;;29747:12:0::1;::::0;:22:::1;::::0;1494:18:1;;29747:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;29830:11:::0;;29727:74;;-1:-1:-1;29830:34:0::1;::::0;29727:74;29830:15:::1;:34::i;:::-;29816:48:::0;;29879:11:::1;:32:::0;;29894:17;;29879:11;29816::::1;::::0;29879:32:::1;::::0;29894:17;;29879:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;29530:393:0::1;29967:22;::::0;::::1;::::0;29951:11;;:49:::1;::::0;29995:4:::1;::::0;29951:39:::1;::::0;:15:::1;:39::i;:49::-;29933:15;::::0;::::1;:67:::0;30018:28:::1;::::0;160:25:1;;;30026:10:0::1;::::0;30018:28:::1;::::0;148:2:1;133:18;30018:28:0::1;14:177:1::0;31334:665:0;23740:1;24338:7;;:19;24330:63;;;;-1:-1:-1;;;24330:63:0;;;;;;;:::i;:::-;23740:1;24471:7;:18;;;;31396:21:::1;31420:8;31429:1;31420:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;31475:10:::1;31466:20:::0;;:8:::1;:20:::0;;;;;;31515:11;;31537::::1;:22:::0;;31420:11:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;31466:20:0;;31515:11;;;;31537;31420;31537:22:::1;::::0;31515:11;;31537:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;31673:10:0::1;31656:28;::::0;;;:16:::1;:28;::::0;;;;;31688:15:::1;-1:-1:-1::0;31653:120:0::1;;31758:3;31740:15;;31730:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;31719:42;::::0;;::::1;:::i;:::-;;;31653:120;31800:10;31814:1;31783:28:::0;;;:16:::1;:28;::::0;;;;:32;31826:12;;:55:::1;::::0;-1:-1:-1;;;;;31826:12:0;;::::1;::::0;31873:7;31826:25:::1;:55::i;:::-;31906:1;31892:15:::0;;;31918::::1;::::0;::::1;:19:::0;31953:38:::1;::::0;160:25:1;;;31971:10:0::1;::::0;31953:38:::1;::::0;148:2:1;133:18;31953:38:0::1;;;;;;;-1:-1:-1::0;;23696:1:0;24650:22;;-1:-1:-1;31334: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;27063:724::-:0;27124:7;27144:21;27168:8;27177:1;27168:11;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;27214:15:0;;;;:8;:15;;;;;;;27243:24;27168:11;;;;;;;27243:24;;;;27168:11;;-1:-1:-1;27271:8:0;27243:36;27240:75;;-1:-1:-1;27302:1:0;;27063:724;-1:-1:-1;;;27063:724:0:o;27240:75::-;27353:22;;;;;27405:11;;27449:24;;;;27431:15;:42;:59;;;;-1:-1:-1;27477:13:0;;;27431:59;27427:270;;;27507:19;27529:63;27576:15;;27529:42;27555:4;:15;;;27529:21;:19;:21::i;:::-;:25;;:42::i;:63::-;27507:85;-1:-1:-1;27627:58:0;27649:35;27675:8;27649:21;27507:85;27665:4;27649:15;:21::i;:35::-;27627:17;;:21;:58::i;:::-;27607:78;;27492:205;27427:270;27714:65;27763:4;:15;;;27714:44;27753:4;27714:34;27730:17;27714:4;:11;;;:15;;:34;;;;:::i;:65::-;27707:72;27063:724;-1:-1:-1;;;;;;27063:724:0:o;32876:172::-;2378:6;;-1:-1:-1;;;;;2378:6:0;909:10;2378:22;2370:67;;;;-1:-1:-1;;;2370:67:0;;;;;;;:::i;:::-;32959:5:::1;32949:6;:15;;32941:52;;;::::0;-1:-1:-1;;;32941:52:0;;6188:2:1;32941:52:0::1;::::0;::::1;6170:21:1::0;6227:2;6207:18;;;6200:30;6266:26;6246:18;;;6239:54;6310:18;;32941:52:0::1;5986:348:1::0;32941:52:0::1;33004:13;33015:1;33004:10;:13::i;:::-;33028:3;:12:::0;32876: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;27863:600::-;27917:21;27941:8;27950:4;27941:14;;;;;;;;:::i;:::-;;;;;;;;;;;27917:38;;27989:4;:24;;;27970:15;:43;27966:82;;28030:7;27863:600;:::o;27966:82::-;28077:11;;28058:16;28103:13;;;28099:109;;-1:-1:-1;28160:15:0;28133:24;;;;:42;-1:-1:-1;27863:600:0:o;28099:109::-;28218:19;28240:63;28287:15;;28240:42;28266:4;:15;;;28240:21;:19;:21::i;:63::-;28218:85;-1:-1:-1;28339:63:0;28366:35;28392:8;28366:21;28218:85;28382:4;28366:15;:21::i;:35::-;28339:22;;;;;:26;:63::i;:::-;28314:22;;;:88;-1:-1:-1;;28440:15:0;28413:24;;;;:42;-1:-1:-1;27863: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://b66da09e0309674d468c14d4e0a824f0669c52ab2587f954883833880703cb8c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.003418 | 15,168,129.4295 | $51,838.6 |
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.