More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 321 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 19325376 | 315 days ago | IN | 0 ETH | 0.00568343 | ||||
Deposit | 18695065 | 403 days ago | IN | 0 ETH | 0.00187497 | ||||
Emergency Withdr... | 18498515 | 430 days ago | IN | 0 ETH | 0.00201656 | ||||
Withdraw | 18299873 | 458 days ago | IN | 0 ETH | 0.00077303 | ||||
Deposit | 18168469 | 477 days ago | IN | 0 ETH | 0.00214787 | ||||
Withdraw | 18013783 | 498 days ago | IN | 0 ETH | 0.00076457 | ||||
Withdraw | 18006071 | 499 days ago | IN | 0 ETH | 0.00106629 | ||||
Withdraw | 17949363 | 507 days ago | IN | 0 ETH | 0.00228924 | ||||
Withdraw | 17940923 | 509 days ago | IN | 0 ETH | 0.00239245 | ||||
Withdraw | 17936705 | 509 days ago | IN | 0 ETH | 0.00432307 | ||||
Withdraw | 17936310 | 509 days ago | IN | 0 ETH | 0.00313615 | ||||
Withdraw | 17936244 | 509 days ago | IN | 0 ETH | 0.00282253 | ||||
Withdraw | 17936111 | 509 days ago | IN | 0 ETH | 0.00210748 | ||||
Deposit | 17934703 | 509 days ago | IN | 0 ETH | 0.00172964 | ||||
Withdraw | 17931206 | 510 days ago | IN | 0 ETH | 0.00313615 | ||||
Deposit | 17931200 | 510 days ago | IN | 0 ETH | 0.00181895 | ||||
Deposit | 17931137 | 510 days ago | IN | 0 ETH | 0.00200253 | ||||
Withdraw | 17930962 | 510 days ago | IN | 0 ETH | 0.00159562 | ||||
Withdraw | 17930657 | 510 days ago | IN | 0 ETH | 0.00313615 | ||||
Deposit | 17930649 | 510 days ago | IN | 0 ETH | 0.00201441 | ||||
Withdraw | 17930648 | 510 days ago | IN | 0 ETH | 0.00197794 | ||||
Withdraw | 17930438 | 510 days ago | IN | 0 ETH | 0.0062723 | ||||
Withdraw | 17930438 | 510 days ago | IN | 0 ETH | 0.00311855 | ||||
Withdraw | 17930438 | 510 days ago | IN | 0 ETH | 0.00376338 | ||||
Withdraw | 17930438 | 510 days ago | IN | 0 ETH | 0.00250224 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ShilaStakingPool30Day
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-27 */ //SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.11; //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 ShilaStakingPool30Day 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 poitns. 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(0x20c3fa331A385b63EE39137e99d0cF2db142fCe1); rewardToken = stakingToken; apy = 250; lockDuration = 30 days; exitPenaltyPerc = 10; // staking pool poolInfo.push(PoolInfo({ lpToken: stakingToken, allocPoint: 1000, lastRewardTimestamp: 21616747, accTokensPerShare: 0 })); totalAllocPoint = 1000; } function stopReward() external onlyOwner { updatePool(0); apy = 0; } function startReward() external onlyOwner { require(poolInfo[0].lastRewardTimestamp == 21616747, "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 == 21616747){ 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 emergencyWithdrawR(uint256 _amount) external onlyOwner { require(_amount <= rewardToken.balanceOf(address(this)) - totalStaked, 'not enough tokens to take out'); rewardToken.safeTransfer(address(msg.sender), _amount); } function clearforeignToken(address tokenAddress, uint256 tokens) external onlyOwner returns (bool success) { require(tokenAddress != address (rewardToken),"Cannot withdraw reward token"); if(tokens == 0){ tokens = IBEP20(tokenAddress).balanceOf(address(this)); } return IBEP20(tokenAddress).transfer(msg.sender, tokens); } 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 <= 4838400, "Duration must be below 4 weeks"); lockDuration = newlockDuration; } function updateExitPenalty(uint256 newPenaltyPerc) external onlyOwner { require(newPenaltyPerc <= 30, "May not set higher than 30%"); 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":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"clearforeignToken","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyWithdrawR","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
60c0604052600060095534801561001557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018080557320c3fa331a385b63ee39137e99d0cf2db142fce1608081815260a082905260fa600490815562278d00600555600a6006556040805192830181529282526103e860208301818152630149d86b94840194855260006060850181815260078054988901815590915293517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889690930295860180546001600160a01b0319166001600160a01b039094169390931790925590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68985015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a840155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b9092019190915560095560805160a051611b6f6101d36000396000818161038f015281816105530152818161080701528181610b5001528181610d3d01528181610e1601526110bb015260006102500152611b6f6000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80638c09c135116100de578063ca99b1db11610097578063f40f0f5211610071578063f40f0f5214610354578063f543df4514610367578063f7c618c11461038a578063ff16ef39146103b157600080fd5b8063ca99b1db14610326578063db2e21bc14610339578063f2fde38b1461034157600080fd5b80638c09c135146102b45780638da5cb5b146102c75780638e0b0198146102d8578063999e2f75146102eb578063a913a5f7146102f3578063b6b55f251461031357600080fd5b8063715018a61161014b57806378c196f31161012557806378c196f3146102925780637b280def1461029a57806380dc0672146102a3578063817b1cd2146102ab57600080fd5b8063715018a61461024357806372f702f31461024b578063746c8ae11461028a57600080fd5b806304554443146101935780631526fe27146101af5780631959a002146101ec5780633bcfc4b8146102285780633ccfd60b14610231578063630b5ba11461023b575b600080fd5b61019c60055481565b6040519081526020015b60405180910390f35b6101c26101bd366004611888565b6103c4565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101a6565b6102136101fa3660046118bd565b6008602052600090815260409020805460019091015482565b604080519283526020830191909152016101a6565b61019c60045481565b610239610408565b005b61023961064c565b6102396106a1565b6102727f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101a6565b610239610715565b61019c6107e3565b61019c60065481565b610239610881565b61019c60035481565b6102396102c2366004611888565b6108bc565b6000546001600160a01b0316610272565b6102396102e6366004611888565b61093e565b61019c6109be565b61019c6103013660046118bd565b60026020526000908152604090205481565b610239610321366004611888565b610a44565b610239610334366004611888565b610cfb565b610239610e40565b61023961034f3660046118bd565b610f6c565b61019c6103623660046118bd565b610f9f565b61037a6103753660046118d8565b61108e565b60405190151581526020016101a6565b6102727f000000000000000000000000000000000000000000000000000000000000000081565b6102396103bf366004611888565b611225565b600781815481106103d457600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b600260015414156104345760405162461bcd60e51b815260040161042b90611902565b60405180910390fd5b60026001819055336000908152602091909152604090205442101561049b5760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79604482015260640161042b565b600060076000815481106104b1576104b1611939565b60009182526020808320338452600890915260408320805460049093029091019350916104dd906112b0565b6000610517836001015461051164e8d4a5100061050b8860030154886000015461134390919063ffffffff16565b906113c2565b90611404565b9050801561057a576105276107e3565b8111156105465760405162461bcd60e51b815260040161042b9061194f565b61057a6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383611446565b81156105b2576000808455600380548492906105979084906119c3565b909155505083546105b2906001600160a01b03163384611446565b600384015483546105cd9164e8d4a510009161050b91611343565b60018401558254156105fb576005546105e690426119da565b3360009081526002602052604090205561060c565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b031633146106765760405162461bcd60e51b815260040161042b906119f2565b60075460005b8181101561069d5761068d816112b0565b61069681611a27565b905061067c565b5050565b6000546001600160a01b031633146106cb5760405162461bcd60e51b815260040161042b906119f2565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461073f5760405162461bcd60e51b815260040161042b906119f2565b600760008154811061075357610753611939565b906000526020600020906004020160020154630149d86b146107b75760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e63650000000000604482015260640161042b565b4260076000815481106107cc576107cc611939565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108729190611a42565b61087c91906119c3565b905090565b6000546001600160a01b031633146108ab5760405162461bcd60e51b815260040161042b906119f2565b6108b560006112b0565b6000600455565b6000546001600160a01b031633146108e65760405162461bcd60e51b815260040161042b906119f2565b6249d4008111156109395760405162461bcd60e51b815260206004820152601e60248201527f4475726174696f6e206d7573742062652062656c6f772034207765656b730000604482015260640161042b565b600555565b6000546001600160a01b031633146109685760405162461bcd60e51b815260040161042b906119f2565b601e8111156109b95760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e203330250000000000604482015260640161042b565b600655565b60008060076000815481106109d5576109d5611939565b9060005260206000209060040201905042816002015411156109f957600091505090565b6301e133806064600454600354846002015442610a1691906119c3565b610a209190611a5b565b610a2a9190611a5b565b610a349190611a7a565b610a3e9190611a7a565b91505090565b60026001541415610a675760405162461bcd60e51b815260040161042b90611902565b600260018190553360009081526020919091526040902054610aa157600554610a9090426119da565b336000908152600260205260409020555b60006007600081548110610ab757610ab7611939565b60009182526020808320338452600890915260408320600490920201925090610adf906112b0565b805415610b79576000610b14826001015461051164e8d4a5100061050b8760030154876000015461134390919063ffffffff16565b90508015610b7757610b246107e3565b811115610b435760405162461bcd60e51b815260040161042b9061194f565b610b776001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383611446565b505b60008315610ca95782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed9190611a42565b8454909150610c07906001600160a01b03163330886114ae565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c729190611a42565b610c7c91906119c3565b8354909250610c8b90836114ec565b835560038054839190600090610ca29084906119da565b9091555050505b60038301548254610cc49164e8d4a510009161050b91611343565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200161063a565b6000546001600160a01b03163314610d255760405162461bcd60e51b815260040161042b906119f2565b6003546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db09190611a42565b610dba91906119c3565b811115610e095760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000604482015260640161042b565b610e3d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383611446565b50565b60026001541415610e635760405162461bcd60e51b815260040161042b90611902565b600260018190555060006007600081548110610e8157610e81611939565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610eba9084906119c3565b9091555050336000908152600260205260409020544211610efc57606460065482610ee59190611a5b565b610eef9190611a7a565b610ef990826119c3565b90505b336000818152600260205260408120558354610f24916001600160a01b039091169083611446565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b03163314610f965760405162461bcd60e51b815260040161042b906119f2565b610e3d8161154b565b6000806007600081548110610fb657610fb6611939565b600091825260208083206001600160a01b0387168452600890915260409092206002600490920290920190810154909250630149d86b1415610ffc575060009392505050565b600380830154905460028401544211801561101657508015155b1561105c57600061103960095461050b87600101546110336109be565b90611343565b90506110586110518361050b8464e8d4a51000611343565b84906114ec565b9250505b611084836001015461051164e8d4a5100061050b86886000015461134390919063ffffffff16565b9695505050505050565b600080546001600160a01b031633146110b95760405162461bcd60e51b815260040161042b906119f2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316141561113b5760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742077697468647261772072657761726420746f6b656e00000000604482015260640161042b565b816111ab576040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611184573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a89190611a42565b91505b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0384169063a9059cbb906044016020604051808303816000875af11580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121c9190611a9c565b90505b92915050565b6000546001600160a01b0316331461124f5760405162461bcd60e51b815260040161042b906119f2565b6127108111156112a15760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f77203130303030250000000000000000604482015260640161042b565b6112ab60006112b0565b600455565b6000600782815481106112c5576112c5611939565b90600052602060002090600402019050806002015442116112e4575050565b600354806112f757504260029091015550565b600061130f60095461050b85600101546110336109be565b90506113326113278361050b8464e8d4a51000611343565b6003850154906114ec565b600384015550504260029091015550565b6000826113525750600061121f565b600061135e8385611a5b565b90508261136b8583611a7a565b1461121c5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161042b565b600061121c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061160b565b600061121c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611642565b6040516001600160a01b0383166024820152604481018290526114a990849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611673565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526114e69085906323b872dd60e01b90608401611472565b50505050565b6000806114f983856119da565b90508381101561121c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161042b565b6001600160a01b0381166115b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818361162c5760405162461bcd60e51b815260040161042b9190611aea565b5060006116398486611a7a565b95945050505050565b600081848411156116665760405162461bcd60e51b815260040161042b9190611aea565b50600061163984866119c3565b60006116c8826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117459092919063ffffffff16565b8051909150156114a957808060200190518101906116e69190611a9c565b6114a95760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161042b565b6060611754848460008561175c565b949350505050565b60606117678561184f565b6117b35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161042b565b600080866001600160a01b031685876040516117cf9190611b1d565b60006040518083038185875af1925050503d806000811461180c576040519150601f19603f3d011682016040523d82523d6000602084013e611811565b606091505b509150915081156118255791506117549050565b8051156118355780518082602001fd5b8360405162461bcd60e51b815260040161042b9190611aea565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611754575050151592915050565b60006020828403121561189a57600080fd5b5035919050565b80356001600160a01b03811681146118b857600080fd5b919050565b6000602082840312156118cf57600080fd5b61121c826118a1565b600080604083850312156118eb57600080fd5b6118f4836118a1565b946020939093013593505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000828210156119d5576119d56119ad565b500390565b600082198211156119ed576119ed6119ad565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000600019821415611a3b57611a3b6119ad565b5060010190565b600060208284031215611a5457600080fd5b5051919050565b6000816000190483118215151615611a7557611a756119ad565b500290565b600082611a9757634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611aae57600080fd5b8151801515811461121c57600080fd5b60005b83811015611ad9578181015183820152602001611ac1565b838111156114e65750506000910152565b6020815260008251806020840152611b09816040850160208701611abe565b601f01601f19169190910160400192915050565b60008251611b2f818460208701611abe565b919091019291505056fea264697066735822122016f58917e7bae1e066989eccd44caca19fee170395bb116f55410a3a530b53e464736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80638c09c135116100de578063ca99b1db11610097578063f40f0f5211610071578063f40f0f5214610354578063f543df4514610367578063f7c618c11461038a578063ff16ef39146103b157600080fd5b8063ca99b1db14610326578063db2e21bc14610339578063f2fde38b1461034157600080fd5b80638c09c135146102b45780638da5cb5b146102c75780638e0b0198146102d8578063999e2f75146102eb578063a913a5f7146102f3578063b6b55f251461031357600080fd5b8063715018a61161014b57806378c196f31161012557806378c196f3146102925780637b280def1461029a57806380dc0672146102a3578063817b1cd2146102ab57600080fd5b8063715018a61461024357806372f702f31461024b578063746c8ae11461028a57600080fd5b806304554443146101935780631526fe27146101af5780631959a002146101ec5780633bcfc4b8146102285780633ccfd60b14610231578063630b5ba11461023b575b600080fd5b61019c60055481565b6040519081526020015b60405180910390f35b6101c26101bd366004611888565b6103c4565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101a6565b6102136101fa3660046118bd565b6008602052600090815260409020805460019091015482565b604080519283526020830191909152016101a6565b61019c60045481565b610239610408565b005b61023961064c565b6102396106a1565b6102727f00000000000000000000000020c3fa331a385b63ee39137e99d0cf2db142fce181565b6040516001600160a01b0390911681526020016101a6565b610239610715565b61019c6107e3565b61019c60065481565b610239610881565b61019c60035481565b6102396102c2366004611888565b6108bc565b6000546001600160a01b0316610272565b6102396102e6366004611888565b61093e565b61019c6109be565b61019c6103013660046118bd565b60026020526000908152604090205481565b610239610321366004611888565b610a44565b610239610334366004611888565b610cfb565b610239610e40565b61023961034f3660046118bd565b610f6c565b61019c6103623660046118bd565b610f9f565b61037a6103753660046118d8565b61108e565b60405190151581526020016101a6565b6102727f00000000000000000000000020c3fa331a385b63ee39137e99d0cf2db142fce181565b6102396103bf366004611888565b611225565b600781815481106103d457600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b600260015414156104345760405162461bcd60e51b815260040161042b90611902565b60405180910390fd5b60026001819055336000908152602091909152604090205442101561049b5760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79604482015260640161042b565b600060076000815481106104b1576104b1611939565b60009182526020808320338452600890915260408320805460049093029091019350916104dd906112b0565b6000610517836001015461051164e8d4a5100061050b8860030154886000015461134390919063ffffffff16565b906113c2565b90611404565b9050801561057a576105276107e3565b8111156105465760405162461bcd60e51b815260040161042b9061194f565b61057a6001600160a01b037f00000000000000000000000020c3fa331a385b63ee39137e99d0cf2db142fce1163383611446565b81156105b2576000808455600380548492906105979084906119c3565b909155505083546105b2906001600160a01b03163384611446565b600384015483546105cd9164e8d4a510009161050b91611343565b60018401558254156105fb576005546105e690426119da565b3360009081526002602052604090205561060c565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b031633146106765760405162461bcd60e51b815260040161042b906119f2565b60075460005b8181101561069d5761068d816112b0565b61069681611a27565b905061067c565b5050565b6000546001600160a01b031633146106cb5760405162461bcd60e51b815260040161042b906119f2565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461073f5760405162461bcd60e51b815260040161042b906119f2565b600760008154811061075357610753611939565b906000526020600020906004020160020154630149d86b146107b75760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e63650000000000604482015260640161042b565b4260076000815481106107cc576107cc611939565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f00000000000000000000000020c3fa331a385b63ee39137e99d0cf2db142fce116906370a0823190602401602060405180830381865afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108729190611a42565b61087c91906119c3565b905090565b6000546001600160a01b031633146108ab5760405162461bcd60e51b815260040161042b906119f2565b6108b560006112b0565b6000600455565b6000546001600160a01b031633146108e65760405162461bcd60e51b815260040161042b906119f2565b6249d4008111156109395760405162461bcd60e51b815260206004820152601e60248201527f4475726174696f6e206d7573742062652062656c6f772034207765656b730000604482015260640161042b565b600555565b6000546001600160a01b031633146109685760405162461bcd60e51b815260040161042b906119f2565b601e8111156109b95760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e203330250000000000604482015260640161042b565b600655565b60008060076000815481106109d5576109d5611939565b9060005260206000209060040201905042816002015411156109f957600091505090565b6301e133806064600454600354846002015442610a1691906119c3565b610a209190611a5b565b610a2a9190611a5b565b610a349190611a7a565b610a3e9190611a7a565b91505090565b60026001541415610a675760405162461bcd60e51b815260040161042b90611902565b600260018190553360009081526020919091526040902054610aa157600554610a9090426119da565b336000908152600260205260409020555b60006007600081548110610ab757610ab7611939565b60009182526020808320338452600890915260408320600490920201925090610adf906112b0565b805415610b79576000610b14826001015461051164e8d4a5100061050b8760030154876000015461134390919063ffffffff16565b90508015610b7757610b246107e3565b811115610b435760405162461bcd60e51b815260040161042b9061194f565b610b776001600160a01b037f00000000000000000000000020c3fa331a385b63ee39137e99d0cf2db142fce1163383611446565b505b60008315610ca95782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed9190611a42565b8454909150610c07906001600160a01b03163330886114ae565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c729190611a42565b610c7c91906119c3565b8354909250610c8b90836114ec565b835560038054839190600090610ca29084906119da565b9091555050505b60038301548254610cc49164e8d4a510009161050b91611343565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200161063a565b6000546001600160a01b03163314610d255760405162461bcd60e51b815260040161042b906119f2565b6003546040516370a0823160e01b81523060048201527f00000000000000000000000020c3fa331a385b63ee39137e99d0cf2db142fce16001600160a01b0316906370a0823190602401602060405180830381865afa158015610d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db09190611a42565b610dba91906119c3565b811115610e095760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000604482015260640161042b565b610e3d6001600160a01b037f00000000000000000000000020c3fa331a385b63ee39137e99d0cf2db142fce1163383611446565b50565b60026001541415610e635760405162461bcd60e51b815260040161042b90611902565b600260018190555060006007600081548110610e8157610e81611939565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610eba9084906119c3565b9091555050336000908152600260205260409020544211610efc57606460065482610ee59190611a5b565b610eef9190611a7a565b610ef990826119c3565b90505b336000818152600260205260408120558354610f24916001600160a01b039091169083611446565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b03163314610f965760405162461bcd60e51b815260040161042b906119f2565b610e3d8161154b565b6000806007600081548110610fb657610fb6611939565b600091825260208083206001600160a01b0387168452600890915260409092206002600490920290920190810154909250630149d86b1415610ffc575060009392505050565b600380830154905460028401544211801561101657508015155b1561105c57600061103960095461050b87600101546110336109be565b90611343565b90506110586110518361050b8464e8d4a51000611343565b84906114ec565b9250505b611084836001015461051164e8d4a5100061050b86886000015461134390919063ffffffff16565b9695505050505050565b600080546001600160a01b031633146110b95760405162461bcd60e51b815260040161042b906119f2565b7f00000000000000000000000020c3fa331a385b63ee39137e99d0cf2db142fce16001600160a01b0316836001600160a01b0316141561113b5760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742077697468647261772072657761726420746f6b656e00000000604482015260640161042b565b816111ab576040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611184573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a89190611a42565b91505b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0384169063a9059cbb906044016020604051808303816000875af11580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121c9190611a9c565b90505b92915050565b6000546001600160a01b0316331461124f5760405162461bcd60e51b815260040161042b906119f2565b6127108111156112a15760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f77203130303030250000000000000000604482015260640161042b565b6112ab60006112b0565b600455565b6000600782815481106112c5576112c5611939565b90600052602060002090600402019050806002015442116112e4575050565b600354806112f757504260029091015550565b600061130f60095461050b85600101546110336109be565b90506113326113278361050b8464e8d4a51000611343565b6003850154906114ec565b600384015550504260029091015550565b6000826113525750600061121f565b600061135e8385611a5b565b90508261136b8583611a7a565b1461121c5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161042b565b600061121c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061160b565b600061121c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611642565b6040516001600160a01b0383166024820152604481018290526114a990849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611673565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526114e69085906323b872dd60e01b90608401611472565b50505050565b6000806114f983856119da565b90508381101561121c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161042b565b6001600160a01b0381166115b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818361162c5760405162461bcd60e51b815260040161042b9190611aea565b5060006116398486611a7a565b95945050505050565b600081848411156116665760405162461bcd60e51b815260040161042b9190611aea565b50600061163984866119c3565b60006116c8826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117459092919063ffffffff16565b8051909150156114a957808060200190518101906116e69190611a9c565b6114a95760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161042b565b6060611754848460008561175c565b949350505050565b60606117678561184f565b6117b35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161042b565b600080866001600160a01b031685876040516117cf9190611b1d565b60006040518083038185875af1925050503d806000811461180c576040519150601f19603f3d011682016040523d82523d6000602084013e611811565b606091505b509150915081156118255791506117549050565b8051156118355780518082602001fd5b8360405162461bcd60e51b815260040161042b9190611aea565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611754575050151592915050565b60006020828403121561189a57600080fd5b5035919050565b80356001600160a01b03811681146118b857600080fd5b919050565b6000602082840312156118cf57600080fd5b61121c826118a1565b600080604083850312156118eb57600080fd5b6118f4836118a1565b946020939093013593505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000828210156119d5576119d56119ad565b500390565b600082198211156119ed576119ed6119ad565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000600019821415611a3b57611a3b6119ad565b5060010190565b600060208284031215611a5457600080fd5b5051919050565b6000816000190483118215151615611a7557611a756119ad565b500290565b600082611a9757634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611aae57600080fd5b8151801515811461121c57600080fd5b60005b83811015611ad9578181015183820152602001611ac1565b838111156114e65750506000910152565b6020815260008251806020840152611b09816040850160208701611abe565b601f01601f19169190910160400192915050565b60008251611b2f818460208701611abe565b919091019291505056fea264697066735822122016f58917e7bae1e066989eccd44caca19fee170395bb116f55410a3a530b53e464736f6c634300080b0033
Deployed Bytecode Sourcemap
24694:9162:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25665:27;;;;;;;;;160:25:1;;;148:2;133:18;25665:27:0;;;;;;;;25765: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;25765:26:0;381:431:1;25847:45:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;1360:25:1;;;1416:2;1401:18;;1394:34;;;;1333:18;25847:45:0;1186:248:1;25640:18:0;;;;;;30125:1153;;;:::i;:::-;;28561:190;;;:::i;2815:140::-;;;:::i;25461:36::-;;;;;;;;-1:-1:-1;;;;;1617:32:1;;;1599:51;;1587:2;1572:18;25461:36:0;1439:217:1;26809:204:0;;;:::i;33129:133::-;;;:::i;25699:30::-;;;;;;26710:91;;;:::i;25607:26::-;;;;;;33450:203;;;;;;:::i;:::-;;:::i;2173:79::-;2211:7;2238:6;-1:-1:-1;;;;;2238:6:0;2173:79;;33661:192;;;;;;:::i;:::-;;:::i;32812:309::-;;;:::i;25546:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;28788:1281;;;;;;:::i;:::-;;:::i;32163:251::-;;;;;;:::i;:::-;;:::i;31349:665::-;;;:::i;3110:109::-;;;;;;:::i;:::-;;:::i;27078:724::-;;;;;;:::i;:::-;;:::i;32422:376::-;;;;;;:::i;:::-;;:::i;:::-;;;2293:14:1;;2286:22;2268:41;;2256:2;2241:18;32422:376:0;2128:187:1;25504:35:0;;;;;33270:172;;;;;;:::i;:::-;;:::i;25765:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25765:26:0;;;;-1:-1:-1;25765:26:0;;;:::o;30125:1153::-;23747:1;24345:7;;:19;;24337:63;;;;-1:-1:-1;;;24337:63:0;;;;;;;:::i;:::-;;;;;;;;;23747:1;24478:7;:18;;;30203:10:::1;30186:28;::::0;;;::::1;::::0;;;;;;;;30218:15:::1;-1:-1:-1::0;30186:47:0::1;30178:92;;;::::0;-1:-1:-1;;;30178:92:0;;2882:2:1;30178:92:0::1;::::0;::::1;2864:21:1::0;;;2901:18;;;2894:30;2960:34;2940:18;;;2933:62;3012:18;;30178:92:0::1;2680:356:1::0;30178:92:0::1;30291:21;30315:8;30324:1;30315:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;30370:10:::1;30361:20:::0;;:8:::1;:20:::0;;;;;;30412:11;;30315::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;30361:20:0;30434:13:::1;::::0;:10:::1;:13::i;:::-;30458:15;30476:70;30530:4;:15;;;30476:49;30520:4;30476:39;30492:4;:22;;;30476:4;:11;;;:15;;:39;;;;:::i;:::-;:43:::0;::::1;:49::i;:::-;:53:::0;::::1;:70::i;:::-;30458:88:::0;-1:-1:-1;30560:11:0;;30557:218:::1;;30607:18;:16;:18::i;:::-;30596:7;:29;;30588:106;;;;-1:-1:-1::0;;;30588:106:0::1;;;;;;;:::i;:::-;30709:54;-1:-1:-1::0;;;;;30709:11:0::1;:24;30742:10;30755:7:::0;30709:24:::1;:54::i;:::-;30790:11:::0;;30787:165:::1;;30832:1;30818:15:::0;;;30848:11:::1;:22:::0;;30863:7;;30832:1;30848:22:::1;::::0;30863:7;;30848:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;30885:12:0;;:55:::1;::::0;-1:-1:-1;;;;;30885:12:0::1;30919:10;30932:7:::0;30885:25:::1;:55::i;:::-;30998:22;::::0;::::1;::::0;30982:11;;:49:::1;::::0;31026:4:::1;::::0;30982:39:::1;::::0;:15:::1;:39::i;:49::-;30964:15;::::0;::::1;:67:::0;31055:11;;:15;31052:172:::1;;31135:12;::::0;31117:30:::1;::::0;:15:::1;:30;:::i;:::-;31103:10;31086:28;::::0;;;:16:::1;:28;::::0;;;;:61;31052:172:::1;;;31197:10;31211:1;31180:28:::0;;;:16:::1;:28;::::0;;;;:32;31052:172:::1;31241:29;::::0;160:25:1;;;31250:10:0::1;::::0;31241:29:::1;::::0;148:2:1;133:18;31241:29:0::1;;;;;;;;-1:-1:-1::0;;23703:1:0;24657:22;;-1:-1:-1;;30125:1153:0:o;28561:190::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;28633:8:::1;:15:::0;28616:14:::1;28659:85;28687:6;28681:3;:12;28659:85;;;28717:15;28728:3;28717:10;:15::i;:::-;28695:5;::::0;::::1;:::i;:::-;;;28659:85;;;;28605:146;28561:190::o:0;2815:140::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;2914:1:::1;2898:6:::0;;2877:40:::1;::::0;-1:-1:-1;;;;;2898:6:0;;::::1;::::0;2877:40:::1;::::0;2914:1;;2877:40:::1;2945:1;2928:19:::0;;-1:-1:-1;;;;;;2928:19:0::1;::::0;;2815:140::o;26809:204::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;26870:8:::1;26879:1;26870:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;;26905:8;26870:43;26862:83;;;::::0;-1:-1:-1;;;26862:83:0;;4704:2:1;26862:83:0::1;::::0;::::1;4686:21:1::0;4743:2;4723:18;;;4716:30;4782:29;4762:18;;;4755:57;4829:18;;26862:83:0::1;4502:351:1::0;26862:83:0::1;26990:15;26956:8;26965:1;26956:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;:49;;;;26809:204::o:0;33129:133::-;33243:11;;33204:36;;-1:-1:-1;;;33204:36:0;;33234:4;33204:36;;;1599:51:1;33178:7:0;;33243:11;-1:-1:-1;;;;;33204:11:0;:21;;;;1572:18:1;;33204:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;33197:57;;33129:133;:::o;26710:91::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;26762:13:::1;26773:1;26762:10;:13::i;:::-;26792:1;26786:3;:7:::0;26710:91::o;33450:203::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;33560:7:::1;33541:15;:26;;33533:69;;;::::0;-1:-1:-1;;;33533:69:0;;5249:2:1;33533:69:0::1;::::0;::::1;5231:21:1::0;5288:2;5268:18;;;5261:30;5327:32;5307:18;;;5300:60;5377:18;;33533:69:0::1;5047:354:1::0;33533:69:0::1;33613:12;:30:::0;33450:203::o;33661:192::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;33768:2:::1;33750:14;:20;;33742:60;;;::::0;-1:-1:-1;;;33742:60:0;;5608:2:1;33742:60:0::1;::::0;::::1;5590:21:1::0;5647:2;5627:18;;;5620:30;5686:29;5666:18;;;5659:57;5733:18;;33742:60:0::1;5406:351:1::0;33742:60:0::1;33813:15;:32:::0;33661:192::o;32812:309::-;32864:7;32884:21;32908:8;32917:1;32908:11;;;;;;;;:::i;:::-;;;;;;;;;;;32884:35;;32960:15;32933:4;:24;;;:42;32930:81;;;32998:1;32991:8;;;32812:309;:::o;32930:81::-;33104:8;33098:3;33092;;33077:11;;33049:4;:24;;;33031:15;:42;;;;:::i;:::-;33030:58;;;;:::i;:::-;33029:66;;;;:::i;:::-;:72;;;;:::i;:::-;:83;;;;:::i;:::-;33021:92;;;32812:309;:::o;28788:1281::-;23747:1;24345:7;;:19;;24337:63;;;;-1:-1:-1;;;24337:63:0;;;;;;;:::i;:::-;23747:1;24478:7;:18;;;28873:10:::1;28856:28;::::0;;;::::1;::::0;;;;;;;;28853:125:::1;;28954:12;::::0;28936:30:::1;::::0;:15:::1;:30;:::i;:::-;28922:10;28905:28;::::0;;;:16:::1;:28;::::0;;;;:61;28853:125:::1;28988:21;29012:8;29021:1;29012:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;29067:10:::1;29058:20:::0;;:8:::1;:20:::0;;;;;;29012:11:::1;::::0;;::::1;;::::0;-1:-1:-1;29058:20:0;29091:13:::1;::::0;:10:::1;:13::i;:::-;29119:11:::0;;:15;29115:380:::1;;29151:15;29169:70;29223:4;:15;;;29169:49;29213:4;29169:39;29185:4;:22;;;29169:4;:11;;;:15;;:39;;;;:::i;:70::-;29151:88:::0;-1:-1:-1;29257:11:0;;29254:230:::1;;29308:18;:16;:18::i;:::-;29297:7;:29;;29289:106;;;;-1:-1:-1::0;;;29289:106:0::1;;;;;;;:::i;:::-;29414:54;-1:-1:-1::0;;;;;29414:11:0::1;:24;29447:10;29460:7:::0;29414:24:::1;:54::i;:::-;29136:359;29115:380;29505:25;29548:11:::0;;29545:393:::1;;29601:12:::0;;:37:::1;::::0;-1:-1:-1;;;29601:37:0;;29632:4:::1;29601:37;::::0;::::1;1599:51:1::0;29576:22:0::1;::::0;-1:-1:-1;;;;;29601:12:0::1;::::0;:22:::1;::::0;1572:18:1;;29601:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29653:12:::0;;29576:62;;-1:-1:-1;29653:74:0::1;::::0;-1:-1:-1;;;;;29653:12:0::1;29691:10;29712:4;29719:7:::0;29653:29:::1;:74::i;:::-;29762:12:::0;;:37:::1;::::0;-1:-1:-1;;;29762:37:0;;29793:4:::1;29762:37;::::0;::::1;1599:51:1::0;29802:14:0;;-1:-1:-1;;;;;29762:12:0::1;::::0;:22:::1;::::0;1572:18:1;;29762:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;29845:11:::0;;29742:74;;-1:-1:-1;29845:34:0::1;::::0;29742:74;29845:15:::1;:34::i;:::-;29831:48:::0;;29894:11:::1;:32:::0;;29909:17;;29894:11;29831::::1;::::0;29894:32:::1;::::0;29909:17;;29894:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;29545:393:0::1;29982:22;::::0;::::1;::::0;29966:11;;:49:::1;::::0;30010:4:::1;::::0;29966:39:::1;::::0;:15:::1;:39::i;:49::-;29948:15;::::0;::::1;:67:::0;30033:28:::1;::::0;160:25:1;;;30041:10:0::1;::::0;30033:28:::1;::::0;148:2:1;133:18;30033:28:0::1;14:177:1::0;32163:251:0;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;32296:11:::1;::::0;32257:36:::1;::::0;-1:-1:-1;;;32257:36:0;;32287:4:::1;32257:36;::::0;::::1;1599:51:1::0;32257:11:0::1;-1:-1:-1::0;;;;;32257:21:0::1;::::0;::::1;::::0;1572:18:1;;32257:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32246:7;:61;;32238:103;;;::::0;-1:-1:-1;;;32238:103:0;;6359:2:1;32238:103:0::1;::::0;::::1;6341:21:1::0;6398:2;6378:18;;;6371:30;6437:31;6417:18;;;6410:59;6486:18;;32238:103:0::1;6157:353:1::0;32238:103:0::1;32352:54;-1:-1:-1::0;;;;;32352:11:0::1;:24;32385:10;32398:7:::0;32352:24:::1;:54::i;:::-;32163:251:::0;:::o;31349:665::-;23747:1;24345:7;;:19;;24337:63;;;;-1:-1:-1;;;24337:63:0;;;;;;;:::i;:::-;23747:1;24478:7;:18;;;;31411:21:::1;31435:8;31444:1;31435:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;31490:10:::1;31481:20:::0;;:8:::1;:20:::0;;;;;;31530:11;;31552::::1;:22:::0;;31435:11:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;31481:20:0;;31530:11;;;;31552;31435;31552:22:::1;::::0;31530:11;;31552:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;31688:10:0::1;31671:28;::::0;;;:16:::1;:28;::::0;;;;;31703:15:::1;-1:-1:-1::0;31668:120:0::1;;31773:3;31755:15;;31745:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;31734:42;::::0;;::::1;:::i;:::-;;;31668:120;31815:10;31829:1;31798:28:::0;;;:16:::1;:28;::::0;;;;:32;31841:12;;:55:::1;::::0;-1:-1:-1;;;;;31841:12:0;;::::1;::::0;31888:7;31841:25:::1;:55::i;:::-;31921:1;31907:15:::0;;;31933::::1;::::0;::::1;:19:::0;31968:38:::1;::::0;160:25:1;;;31986:10:0::1;::::0;31968:38:::1;::::0;148:2:1;133:18;31968:38:0::1;;;;;;;-1:-1:-1::0;;23703:1:0;24657:22;;-1:-1:-1;31349:665:0:o;3110:109::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;3183:28:::1;3202:8;3183:18;:28::i;27078:724::-:0;27139:7;27159:21;27183:8;27192:1;27183:11;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;27229:15:0;;;;:8;:15;;;;;;;27258:24;27183:11;;;;;;;27258:24;;;;27183:11;;-1:-1:-1;27286:8:0;27258:36;27255:75;;;-1:-1:-1;27317:1:0;;27078:724;-1:-1:-1;;;27078:724:0:o;27255:75::-;27368:22;;;;;27420:11;;27464:24;;;;27446:15;:42;:59;;;;-1:-1:-1;27492:13:0;;;27446:59;27442:270;;;27522:19;27544:63;27591:15;;27544:42;27570:4;:15;;;27544:21;:19;:21::i;:::-;:25;;:42::i;:63::-;27522:85;-1:-1:-1;27642:58:0;27664:35;27690:8;27664:21;27522:85;27680:4;27664:15;:21::i;:35::-;27642:17;;:21;:58::i;:::-;27622:78;;27507:205;27442:270;27729:65;27778:4;:15;;;27729:44;27768:4;27729:34;27745:17;27729:4;:11;;;:15;;:34;;;;:::i;:65::-;27722:72;27078:724;-1:-1:-1;;;;;;27078:724:0:o;32422:376::-;32515:12;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;32573:11:::1;-1:-1:-1::0;;;;;32548:37:0::1;:12;-1:-1:-1::0;;;;;32548:37:0::1;;;32540:77;;;::::0;-1:-1:-1;;;32540:77:0;;6717:2:1;32540:77:0::1;::::0;::::1;6699:21:1::0;6756:2;6736:18;;;6729:30;6795;6775:18;;;6768:58;6843:18;;32540:77:0::1;6515:352:1::0;32540:77:0::1;32631:11:::0;32628:96:::1;;32667:45;::::0;-1:-1:-1;;;32667:45:0;;32706:4:::1;32667:45;::::0;::::1;1599:51:1::0;-1:-1:-1;;;;;32667:30:0;::::1;::::0;::::1;::::0;1572:18:1;;32667:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32658:54;;32628:96;32741:49;::::0;-1:-1:-1;;;32741:49:0;;32771:10:::1;32741:49;::::0;::::1;7046:51:1::0;7113:18;;;7106:34;;;-1:-1:-1;;;;;32741:29:0;::::1;::::0;::::1;::::0;7019:18:1;;32741:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32734:56;;2455:1;32422:376:::0;;;;:::o;33270:172::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;33353:5:::1;33343:6;:15;;33335:52;;;::::0;-1:-1:-1;;;33335:52:0;;7635:2:1;33335:52:0::1;::::0;::::1;7617:21:1::0;7674:2;7654:18;;;7647:30;7713:26;7693:18;;;7686:54;7757:18;;33335:52:0::1;7433:348:1::0;33335:52:0::1;33398:13;33409:1;33398:10;:13::i;:::-;33422:3;:12:::0;33270:172::o;27878:600::-;27932:21;27956:8;27965:4;27956:14;;;;;;;;:::i;:::-;;;;;;;;;;;27932:38;;28004:4;:24;;;27985:15;:43;27981:82;;28045:7;27878:600;:::o;27981:82::-;28092:11;;28118:13;28114:109;;-1:-1:-1;28175:15:0;28148:24;;;;:42;-1:-1:-1;27878:600:0:o;28114:109::-;28233:19;28255:63;28302:15;;28255:42;28281:4;:15;;;28255:21;:19;:21::i;:63::-;28233:85;-1:-1:-1;28354:63:0;28381:35;28407:8;28381:21;28233:85;28397:4;28381:15;:21::i;:35::-;28354:22;;;;;:26;:63::i;:::-;28329:22;;;:88;-1:-1:-1;;28455:15:0;28428:24;;;;:42;-1:-1:-1;27878:600:0:o;5789:471::-;5847:7;6092:6;6088:47;;-1:-1:-1;6122:1:0;6115:8;;6088:47;6147:9;6159:5;6163:1;6159;:5;:::i;:::-;6147:17;-1:-1:-1;6192:1:0;6183:5;6187:1;6147:17;6183:5;:::i;:::-;:10;6175:56;;;;-1:-1:-1;;;6175:56:0;;7988:2:1;6175:56:0;;;7970:21:1;8027:2;8007:18;;;8000:30;8066:34;8046:18;;;8039:62;-1:-1:-1;;;8117:18:1;;;8110:31;8158:19;;6175:56:0;7786:397:1;6736:132:0;6794:7;6821:39;6825:1;6828;6821:39;;;;;;;;;;;;;;;;;:3;:39::i;4865:136::-;4923:7;4950:43;4954:1;4957;4950:43;;;;;;;;;;;;;;;;;:3;:43::i;13214:211::-;13358:58;;-1:-1:-1;;;;;7064:32:1;;13358:58:0;;;7046:51:1;7113:18;;;7106:34;;;13331:86:0;;13351:5;;-1:-1:-1;;;13381:23:0;7019:18:1;;13358:58:0;;;;-1:-1:-1;;13358:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;13358:58:0;-1:-1:-1;;;;;;13358:58:0;;;;;;;;;;13331:19;:86::i;:::-;13214:211;;;:::o;13433:248::-;13604:68;;-1:-1:-1;;;;;8446:15:1;;;13604:68:0;;;8428:34:1;8498:15;;8478:18;;;8471:43;8530:18;;;8523:34;;;13577:96:0;;13597:5;;-1:-1:-1;;;13627:27:0;8363:18:1;;13604:68:0;8188:375:1;13577:96:0;13433:248;;;;:::o;4401:181::-;4459:7;;4491:5;4495:1;4491;:5;:::i;:::-;4479:17;;4520:1;4515;:6;;4507:46;;;;-1:-1:-1;;;4507:46:0;;8770:2:1;4507:46:0;;;8752:21:1;8809:2;8789:18;;;8782:30;8848:29;8828:18;;;8821:57;8895:18;;4507:46:0;8568:351:1;3325:229:0;-1:-1:-1;;;;;3399:22:0;;3391:73;;;;-1:-1:-1;;;3391:73:0;;9126:2:1;3391:73:0;;;9108:21:1;9165:2;9145:18;;;9138:30;9204:34;9184:18;;;9177:62;-1:-1:-1;;;9255:18:1;;;9248:36;9301:19;;3391:73:0;8924:402:1;3391:73:0;3501:6;;;3480:38;;-1:-1:-1;;;;;3480:38:0;;;;3501:6;;;3480:38;;;3529:6;:17;;-1:-1:-1;;;;;;3529:17:0;-1:-1:-1;;;;;3529:17:0;;;;;;;;;;3325:229::o;7364:312::-;7484:7;7519:12;7512:5;7504:28;;;;-1:-1:-1;;;7504:28:0;;;;;;;;:::i;:::-;-1:-1:-1;7543:9:0;7555:5;7559:1;7555;:5;:::i;:::-;7543:17;7364:312;-1:-1:-1;;;;;7364:312:0:o;5304:226::-;5424:7;5460:12;5452:6;;;;5444:29;;;;-1:-1:-1;;;5444:29:0;;;;;;;;:::i;:::-;-1:-1:-1;5484:9:0;5496:5;5500:1;5496;:5;:::i;15749:774::-;16173:23;16199:69;16227:4;16199:69;;;;;;;;;;;;;;;;;16207:5;-1:-1:-1;;;;;16199:27:0;;;:69;;;;;:::i;:::-;16283:17;;16173:95;;-1:-1:-1;16283:21:0;16279:237;;16438:10;16427:30;;;;;;;;;;;;:::i;:::-;16419:85;;;;-1:-1:-1;;;16419:85:0;;10184:2:1;16419:85:0;;;10166:21:1;10223:2;10203:18;;;10196:30;10262:34;10242:18;;;10235:62;-1:-1:-1;;;10313:18:1;;;10306:40;10363:19;;16419:85:0;9982:406:1;20348:230:0;20485:12;20517:53;20540:6;20548:4;20554:1;20557:12;20517:22;:53::i;:::-;20510:60;20348:230;-1:-1:-1;;;;20348:230:0:o;21836:1020::-;22009:12;22042:18;22053:6;22042:10;:18::i;:::-;22034:60;;;;-1:-1:-1;;;22034:60:0;;10595:2:1;22034:60:0;;;10577:21:1;10634:2;10614:18;;;10607:30;10673:31;10653:18;;;10646:59;10722:18;;22034:60:0;10393:353:1;22034:60:0;22168:12;22182:23;22209:6;-1:-1:-1;;;;;22209:11:0;22228:8;22238:4;22209:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22167:76;;;;22258:7;22254:595;;;22289:10;-1:-1:-1;22282:17:0;;-1:-1:-1;22282:17:0;22254:595;22403:17;;:21;22399:439;;22666:10;22660:17;22727:15;22714:10;22710:2;22706:19;22699:44;22399:439;22809:12;22802:20;;-1:-1:-1;;;22802:20:0;;;;;;;;:::i;17211:641::-;17271:4;17752:20;;17582:66;17801:23;;;;;;:42;;-1:-1:-1;;17828:15:0;;;17793:51;-1:-1:-1;;17211: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:173::-;885:20;;-1:-1:-1;;;;;934:31:1;;924:42;;914:70;;980:1;977;970:12;914:70;817:173;;;:::o;995:186::-;1054:6;1107:2;1095:9;1086:7;1082:23;1078:32;1075:52;;;1123:1;1120;1113:12;1075:52;1146:29;1165:9;1146:29;:::i;1869:254::-;1937:6;1945;1998:2;1986:9;1977:7;1973:23;1969:32;1966:52;;;2014:1;2011;2004:12;1966:52;2037:29;2056:9;2037:29;:::i;:::-;2027:39;2113:2;2098:18;;;;2085:32;;-1:-1:-1;;;1869:254:1:o;2320:355::-;2522:2;2504:21;;;2561:2;2541:18;;;2534:30;2600:33;2595:2;2580:18;;2573:61;2666:2;2651:18;;2320:355::o;3041:127::-;3102:10;3097:3;3093:20;3090:1;3083:31;3133:4;3130:1;3123:15;3157:4;3154:1;3147:15;3173:428;3375:2;3357:21;;;3414:2;3394:18;;;3387:30;;;3453:34;3433:18;;;3426:62;3524:34;3519:2;3504:18;;3497:62;3591:3;3576:19;;3173:428::o;3606:127::-;3667:10;3662:3;3658:20;3655:1;3648:31;3698:4;3695:1;3688:15;3722:4;3719:1;3712:15;3738:125;3778:4;3806:1;3803;3800:8;3797:34;;;3811:18;;:::i;:::-;-1:-1:-1;3848:9:1;;3738:125::o;3868:128::-;3908:3;3939:1;3935:6;3932:1;3929:13;3926:39;;;3945:18;;:::i;:::-;-1:-1:-1;3981:9:1;;3868:128::o;4001:356::-;4203:2;4185:21;;;4222:18;;;4215:30;4281:34;4276:2;4261:18;;4254:62;4348:2;4333:18;;4001:356::o;4362:135::-;4401:3;-1:-1:-1;;4422:17:1;;4419:43;;;4442:18;;:::i;:::-;-1:-1:-1;4489:1:1;4478:13;;4362:135::o;4858:184::-;4928:6;4981:2;4969:9;4960:7;4956:23;4952:32;4949:52;;;4997:1;4994;4987:12;4949:52;-1:-1:-1;5020:16:1;;4858:184;-1:-1:-1;4858:184:1:o;5762:168::-;5802:7;5868:1;5864;5860:6;5856:14;5853:1;5850:21;5845:1;5838:9;5831:17;5827:45;5824:71;;;5875:18;;:::i;:::-;-1:-1:-1;5915:9:1;;5762:168::o;5935:217::-;5975:1;6001;5991:132;;6045:10;6040:3;6036:20;6033:1;6026:31;6080:4;6077:1;6070:15;6108:4;6105:1;6098:15;5991:132;-1:-1:-1;6137:9:1;;5935:217::o;7151:277::-;7218:6;7271:2;7259:9;7250:7;7246:23;7242:32;7239:52;;;7287:1;7284;7277:12;7239:52;7319:9;7313:16;7372:5;7365:13;7358:21;7351:5;7348:32;7338:60;;7394:1;7391;7384:12;9331:258;9403:1;9413:113;9427:6;9424:1;9421:13;9413:113;;;9503:11;;;9497:18;9484:11;;;9477:39;9449:2;9442:10;9413:113;;;9544:6;9541:1;9538:13;9535:48;;;-1:-1:-1;;9579:1:1;9561:16;;9554:27;9331:258::o;9594:383::-;9743:2;9732:9;9725:21;9706:4;9775:6;9769:13;9818:6;9813:2;9802:9;9798:18;9791:34;9834:66;9893:6;9888:2;9877:9;9873:18;9868:2;9860:6;9856:15;9834:66;:::i;:::-;9961:2;9940:15;-1:-1:-1;;9936:29:1;9921:45;;;;9968:2;9917:54;;9594:383;-1:-1:-1;;9594:383:1:o;10751:274::-;10880:3;10918:6;10912:13;10934:53;10980:6;10975:3;10968:4;10960:6;10956:17;10934:53;:::i;:::-;11003:16;;;;;10751:274;-1:-1:-1;;10751:274:1:o
Swarm Source
ipfs://16f58917e7bae1e066989eccd44caca19fee170395bb116f55410a3a530b53e4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | <$0.000001 | 71,418,732,201.1564 | $10,679.17 |
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.