More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 17515600 | 564 days ago | IN | 0 ETH | 0.00437656 | ||||
Deposit | 17515304 | 564 days ago | IN | 0 ETH | 0.00393704 | ||||
Deposit | 17515032 | 564 days ago | IN | 0 ETH | 0.00694817 | ||||
Withdraw | 17515006 | 564 days ago | IN | 0 ETH | 0.00454146 | ||||
Deposit | 17514987 | 564 days ago | IN | 0 ETH | 0.00639636 | ||||
Start Reward | 17514969 | 564 days ago | IN | 0 ETH | 0.00096641 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
InflationStaking
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-19 */ //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 InflationStaking 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 1e9. 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(0x7abB69aD9d1E4DfFAc04c0f71f0BD38Db51dA13B); rewardToken = stakingToken; apy = 300; lockDuration = 0 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(1e9).div(lpSupply)); } return user.amount.mul(accTokensPerShare).div(1e9).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(1e9).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(1e9).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(1e9); 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(1e9).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(1e9); 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
60c0604052600060095534801561001557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001808055737abb69ad9d1e4dffac04c0f71f0bd38db51da13b608081815260a082905261012c600490815560006005819055600a6006556040805193840181529383526103e860208401818152630149d86b9585019586526060850183815260078054988901815590935293517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889690930295860180546001600160a01b0319166001600160a01b039094169390931790925591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68985015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a840155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b9092019190915560095560805160a051611b686101d26000396000818161038f015281816105520152818161080501528181610b4d01528181610d3901528181610e1201526110b5015260006102500152611b686000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80638c09c135116100de578063ca99b1db11610097578063f40f0f5211610071578063f40f0f5214610354578063f543df4514610367578063f7c618c11461038a578063ff16ef39146103b157600080fd5b8063ca99b1db14610326578063db2e21bc14610339578063f2fde38b1461034157600080fd5b80638c09c135146102b45780638da5cb5b146102c75780638e0b0198146102d8578063999e2f75146102eb578063a913a5f7146102f3578063b6b55f251461031357600080fd5b8063715018a61161014b57806378c196f31161012557806378c196f3146102925780637b280def1461029a57806380dc0672146102a3578063817b1cd2146102ab57600080fd5b8063715018a61461024357806372f702f31461024b578063746c8ae11461028a57600080fd5b806304554443146101935780631526fe27146101af5780631959a002146101ec5780633bcfc4b8146102285780633ccfd60b14610231578063630b5ba11461023b575b600080fd5b61019c60055481565b6040519081526020015b60405180910390f35b6101c26101bd366004611881565b6103c4565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101a6565b6102136101fa3660046118b6565b6008602052600090815260409020805460019091015482565b604080519283526020830191909152016101a6565b61019c60045481565b610239610408565b005b61023961064a565b61023961069f565b6102727f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101a6565b610239610713565b61019c6107e1565b61019c60065481565b61023961087f565b61019c60035481565b6102396102c2366004611881565b6108ba565b6000546001600160a01b0316610272565b6102396102e6366004611881565b61093c565b61019c6109bc565b61019c6103013660046118b6565b60026020526000908152604090205481565b610239610321366004611881565b610a42565b610239610334366004611881565b610cf7565b610239610e3c565b61023961034f3660046118b6565b610f68565b61019c6103623660046118b6565b610f9b565b61037a6103753660046118d1565b611088565b60405190151581526020016101a6565b6102727f000000000000000000000000000000000000000000000000000000000000000081565b6102396103bf366004611881565b61121f565b600781815481106103d457600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b600260015414156104345760405162461bcd60e51b815260040161042b906118fb565b60405180910390fd5b60026001819055336000908152602091909152604090205442101561049b5760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79604482015260640161042b565b600060076000815481106104b1576104b1611932565b60009182526020808320338452600890915260408320805460049093029091019350916104dd906112aa565b60006105168360010154610510633b9aca0061050a8860030154886000015461133c90919063ffffffff16565b906113bb565b906113fd565b90508015610579576105266107e1565b8111156105455760405162461bcd60e51b815260040161042b90611948565b6105796001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338361143f565b81156105b1576000808455600380548492906105969084906119bc565b909155505083546105b1906001600160a01b0316338461143f565b600384015483546105cb91633b9aca009161050a9161133c565b60018401558254156105f9576005546105e490426119d3565b3360009081526002602052604090205561060a565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b031633146106745760405162461bcd60e51b815260040161042b906119eb565b60075460005b8181101561069b5761068b816112aa565b61069481611a20565b905061067a565b5050565b6000546001600160a01b031633146106c95760405162461bcd60e51b815260040161042b906119eb565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461073d5760405162461bcd60e51b815260040161042b906119eb565b600760008154811061075157610751611932565b906000526020600020906004020160020154630149d86b146107b55760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e63650000000000604482015260640161042b565b4260076000815481106107ca576107ca611932565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190611a3b565b61087a91906119bc565b905090565b6000546001600160a01b031633146108a95760405162461bcd60e51b815260040161042b906119eb565b6108b360006112aa565b6000600455565b6000546001600160a01b031633146108e45760405162461bcd60e51b815260040161042b906119eb565b6249d4008111156109375760405162461bcd60e51b815260206004820152601e60248201527f4475726174696f6e206d7573742062652062656c6f772034207765656b730000604482015260640161042b565b600555565b6000546001600160a01b031633146109665760405162461bcd60e51b815260040161042b906119eb565b601e8111156109b75760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e203330250000000000604482015260640161042b565b600655565b60008060076000815481106109d3576109d3611932565b9060005260206000209060040201905042816002015411156109f757600091505090565b6301e133806064600454600354846002015442610a1491906119bc565b610a1e9190611a54565b610a289190611a54565b610a329190611a73565b610a3c9190611a73565b91505090565b60026001541415610a655760405162461bcd60e51b815260040161042b906118fb565b600260018190553360009081526020919091526040902054610a9f57600554610a8e90426119d3565b336000908152600260205260409020555b60006007600081548110610ab557610ab5611932565b60009182526020808320338452600890915260408320600490920201925090610add906112aa565b805415610b76576000610b118260010154610510633b9aca0061050a8760030154876000015461133c90919063ffffffff16565b90508015610b7457610b216107e1565b811115610b405760405162461bcd60e51b815260040161042b90611948565b610b746001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338361143f565b505b60008315610ca65782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bea9190611a3b565b8454909150610c04906001600160a01b03163330886114a7565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6f9190611a3b565b610c7991906119bc565b8354909250610c8890836114e5565b835560038054839190600090610c9f9084906119d3565b9091555050505b60038301548254610cc091633b9aca009161050a9161133c565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610638565b6000546001600160a01b03163314610d215760405162461bcd60e51b815260040161042b906119eb565b6003546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dac9190611a3b565b610db691906119bc565b811115610e055760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000604482015260640161042b565b610e396001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338361143f565b50565b60026001541415610e5f5760405162461bcd60e51b815260040161042b906118fb565b600260018190555060006007600081548110610e7d57610e7d611932565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610eb69084906119bc565b9091555050336000908152600260205260409020544211610ef857606460065482610ee19190611a54565b610eeb9190611a73565b610ef590826119bc565b90505b336000818152600260205260408120558354610f20916001600160a01b03909116908361143f565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b03163314610f925760405162461bcd60e51b815260040161042b906119eb565b610e3981611544565b6000806007600081548110610fb257610fb2611932565b600091825260208083206001600160a01b0387168452600890915260409092206002600490920290920190810154909250630149d86b1415610ff8575060009392505050565b600380830154905460028401544211801561101257508015155b1561105757600061103560095461050a876001015461102f6109bc565b9061133c565b905061105361104c8361050a84633b9aca0061133c565b84906114e5565b9250505b61107e8360010154610510633b9aca0061050a86886000015461133c90919063ffffffff16565b9695505050505050565b600080546001600160a01b031633146110b35760405162461bcd60e51b815260040161042b906119eb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614156111355760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742077697468647261772072657761726420746f6b656e00000000604482015260640161042b565b816111a5576040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa15801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a29190611a3b565b91505b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0384169063a9059cbb906044016020604051808303816000875af11580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190611a95565b90505b92915050565b6000546001600160a01b031633146112495760405162461bcd60e51b815260040161042b906119eb565b61271081111561129b5760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f77203130303030250000000000000000604482015260640161042b565b6112a560006112aa565b600455565b6000600782815481106112bf576112bf611932565b90600052602060002090600402019050806002015442116112de575050565b600354806112f157504260029091015550565b600061130960095461050a856001015461102f6109bc565b905061132b6113208361050a84633b9aca0061133c565b6003850154906114e5565b600384015550504260029091015550565b60008261134b57506000611219565b60006113578385611a54565b9050826113648583611a73565b146112165760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161042b565b600061121683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611604565b600061121683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061163b565b6040516001600160a01b0383166024820152604481018290526114a290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261166c565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526114df9085906323b872dd60e01b9060840161146b565b50505050565b6000806114f283856119d3565b9050838110156112165760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161042b565b6001600160a01b0381166115a95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081836116255760405162461bcd60e51b815260040161042b9190611ae3565b5060006116328486611a73565b95945050505050565b6000818484111561165f5760405162461bcd60e51b815260040161042b9190611ae3565b50600061163284866119bc565b60006116c1826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661173e9092919063ffffffff16565b8051909150156114a257808060200190518101906116df9190611a95565b6114a25760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161042b565b606061174d8484600085611755565b949350505050565b606061176085611848565b6117ac5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161042b565b600080866001600160a01b031685876040516117c89190611b16565b60006040518083038185875af1925050503d8060008114611805576040519150601f19603f3d011682016040523d82523d6000602084013e61180a565b606091505b5091509150811561181e57915061174d9050565b80511561182e5780518082602001fd5b8360405162461bcd60e51b815260040161042b9190611ae3565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061174d575050151592915050565b60006020828403121561189357600080fd5b5035919050565b80356001600160a01b03811681146118b157600080fd5b919050565b6000602082840312156118c857600080fd5b6112168261189a565b600080604083850312156118e457600080fd5b6118ed8361189a565b946020939093013593505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000828210156119ce576119ce6119a6565b500390565b600082198211156119e6576119e66119a6565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000600019821415611a3457611a346119a6565b5060010190565b600060208284031215611a4d57600080fd5b5051919050565b6000816000190483118215151615611a6e57611a6e6119a6565b500290565b600082611a9057634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611aa757600080fd5b8151801515811461121657600080fd5b60005b83811015611ad2578181015183820152602001611aba565b838111156114df5750506000910152565b6020815260008251806020840152611b02816040850160208701611ab7565b601f01601f19169190910160400192915050565b60008251611b28818460208701611ab7565b919091019291505056fea2646970667358221220cbc7e2d630789fbcae02e02d13c87655f3729b89aad52a655c5089212602a00364736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80638c09c135116100de578063ca99b1db11610097578063f40f0f5211610071578063f40f0f5214610354578063f543df4514610367578063f7c618c11461038a578063ff16ef39146103b157600080fd5b8063ca99b1db14610326578063db2e21bc14610339578063f2fde38b1461034157600080fd5b80638c09c135146102b45780638da5cb5b146102c75780638e0b0198146102d8578063999e2f75146102eb578063a913a5f7146102f3578063b6b55f251461031357600080fd5b8063715018a61161014b57806378c196f31161012557806378c196f3146102925780637b280def1461029a57806380dc0672146102a3578063817b1cd2146102ab57600080fd5b8063715018a61461024357806372f702f31461024b578063746c8ae11461028a57600080fd5b806304554443146101935780631526fe27146101af5780631959a002146101ec5780633bcfc4b8146102285780633ccfd60b14610231578063630b5ba11461023b575b600080fd5b61019c60055481565b6040519081526020015b60405180910390f35b6101c26101bd366004611881565b6103c4565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101a6565b6102136101fa3660046118b6565b6008602052600090815260409020805460019091015482565b604080519283526020830191909152016101a6565b61019c60045481565b610239610408565b005b61023961064a565b61023961069f565b6102727f0000000000000000000000007abb69ad9d1e4dffac04c0f71f0bd38db51da13b81565b6040516001600160a01b0390911681526020016101a6565b610239610713565b61019c6107e1565b61019c60065481565b61023961087f565b61019c60035481565b6102396102c2366004611881565b6108ba565b6000546001600160a01b0316610272565b6102396102e6366004611881565b61093c565b61019c6109bc565b61019c6103013660046118b6565b60026020526000908152604090205481565b610239610321366004611881565b610a42565b610239610334366004611881565b610cf7565b610239610e3c565b61023961034f3660046118b6565b610f68565b61019c6103623660046118b6565b610f9b565b61037a6103753660046118d1565b611088565b60405190151581526020016101a6565b6102727f0000000000000000000000007abb69ad9d1e4dffac04c0f71f0bd38db51da13b81565b6102396103bf366004611881565b61121f565b600781815481106103d457600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b600260015414156104345760405162461bcd60e51b815260040161042b906118fb565b60405180910390fd5b60026001819055336000908152602091909152604090205442101561049b5760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79604482015260640161042b565b600060076000815481106104b1576104b1611932565b60009182526020808320338452600890915260408320805460049093029091019350916104dd906112aa565b60006105168360010154610510633b9aca0061050a8860030154886000015461133c90919063ffffffff16565b906113bb565b906113fd565b90508015610579576105266107e1565b8111156105455760405162461bcd60e51b815260040161042b90611948565b6105796001600160a01b037f0000000000000000000000007abb69ad9d1e4dffac04c0f71f0bd38db51da13b16338361143f565b81156105b1576000808455600380548492906105969084906119bc565b909155505083546105b1906001600160a01b0316338461143f565b600384015483546105cb91633b9aca009161050a9161133c565b60018401558254156105f9576005546105e490426119d3565b3360009081526002602052604090205561060a565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b031633146106745760405162461bcd60e51b815260040161042b906119eb565b60075460005b8181101561069b5761068b816112aa565b61069481611a20565b905061067a565b5050565b6000546001600160a01b031633146106c95760405162461bcd60e51b815260040161042b906119eb565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461073d5760405162461bcd60e51b815260040161042b906119eb565b600760008154811061075157610751611932565b906000526020600020906004020160020154630149d86b146107b55760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e63650000000000604482015260640161042b565b4260076000815481106107ca576107ca611932565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f0000000000000000000000007abb69ad9d1e4dffac04c0f71f0bd38db51da13b16906370a0823190602401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190611a3b565b61087a91906119bc565b905090565b6000546001600160a01b031633146108a95760405162461bcd60e51b815260040161042b906119eb565b6108b360006112aa565b6000600455565b6000546001600160a01b031633146108e45760405162461bcd60e51b815260040161042b906119eb565b6249d4008111156109375760405162461bcd60e51b815260206004820152601e60248201527f4475726174696f6e206d7573742062652062656c6f772034207765656b730000604482015260640161042b565b600555565b6000546001600160a01b031633146109665760405162461bcd60e51b815260040161042b906119eb565b601e8111156109b75760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e203330250000000000604482015260640161042b565b600655565b60008060076000815481106109d3576109d3611932565b9060005260206000209060040201905042816002015411156109f757600091505090565b6301e133806064600454600354846002015442610a1491906119bc565b610a1e9190611a54565b610a289190611a54565b610a329190611a73565b610a3c9190611a73565b91505090565b60026001541415610a655760405162461bcd60e51b815260040161042b906118fb565b600260018190553360009081526020919091526040902054610a9f57600554610a8e90426119d3565b336000908152600260205260409020555b60006007600081548110610ab557610ab5611932565b60009182526020808320338452600890915260408320600490920201925090610add906112aa565b805415610b76576000610b118260010154610510633b9aca0061050a8760030154876000015461133c90919063ffffffff16565b90508015610b7457610b216107e1565b811115610b405760405162461bcd60e51b815260040161042b90611948565b610b746001600160a01b037f0000000000000000000000007abb69ad9d1e4dffac04c0f71f0bd38db51da13b16338361143f565b505b60008315610ca65782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bea9190611a3b565b8454909150610c04906001600160a01b03163330886114a7565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6f9190611a3b565b610c7991906119bc565b8354909250610c8890836114e5565b835560038054839190600090610c9f9084906119d3565b9091555050505b60038301548254610cc091633b9aca009161050a9161133c565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610638565b6000546001600160a01b03163314610d215760405162461bcd60e51b815260040161042b906119eb565b6003546040516370a0823160e01b81523060048201527f0000000000000000000000007abb69ad9d1e4dffac04c0f71f0bd38db51da13b6001600160a01b0316906370a0823190602401602060405180830381865afa158015610d88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dac9190611a3b565b610db691906119bc565b811115610e055760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000604482015260640161042b565b610e396001600160a01b037f0000000000000000000000007abb69ad9d1e4dffac04c0f71f0bd38db51da13b16338361143f565b50565b60026001541415610e5f5760405162461bcd60e51b815260040161042b906118fb565b600260018190555060006007600081548110610e7d57610e7d611932565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610eb69084906119bc565b9091555050336000908152600260205260409020544211610ef857606460065482610ee19190611a54565b610eeb9190611a73565b610ef590826119bc565b90505b336000818152600260205260408120558354610f20916001600160a01b03909116908361143f565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b03163314610f925760405162461bcd60e51b815260040161042b906119eb565b610e3981611544565b6000806007600081548110610fb257610fb2611932565b600091825260208083206001600160a01b0387168452600890915260409092206002600490920290920190810154909250630149d86b1415610ff8575060009392505050565b600380830154905460028401544211801561101257508015155b1561105757600061103560095461050a876001015461102f6109bc565b9061133c565b905061105361104c8361050a84633b9aca0061133c565b84906114e5565b9250505b61107e8360010154610510633b9aca0061050a86886000015461133c90919063ffffffff16565b9695505050505050565b600080546001600160a01b031633146110b35760405162461bcd60e51b815260040161042b906119eb565b7f0000000000000000000000007abb69ad9d1e4dffac04c0f71f0bd38db51da13b6001600160a01b0316836001600160a01b031614156111355760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742077697468647261772072657761726420746f6b656e00000000604482015260640161042b565b816111a5576040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa15801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a29190611a3b565b91505b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0384169063a9059cbb906044016020604051808303816000875af11580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190611a95565b90505b92915050565b6000546001600160a01b031633146112495760405162461bcd60e51b815260040161042b906119eb565b61271081111561129b5760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f77203130303030250000000000000000604482015260640161042b565b6112a560006112aa565b600455565b6000600782815481106112bf576112bf611932565b90600052602060002090600402019050806002015442116112de575050565b600354806112f157504260029091015550565b600061130960095461050a856001015461102f6109bc565b905061132b6113208361050a84633b9aca0061133c565b6003850154906114e5565b600384015550504260029091015550565b60008261134b57506000611219565b60006113578385611a54565b9050826113648583611a73565b146112165760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161042b565b600061121683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611604565b600061121683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061163b565b6040516001600160a01b0383166024820152604481018290526114a290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261166c565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526114df9085906323b872dd60e01b9060840161146b565b50505050565b6000806114f283856119d3565b9050838110156112165760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161042b565b6001600160a01b0381166115a95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081836116255760405162461bcd60e51b815260040161042b9190611ae3565b5060006116328486611a73565b95945050505050565b6000818484111561165f5760405162461bcd60e51b815260040161042b9190611ae3565b50600061163284866119bc565b60006116c1826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661173e9092919063ffffffff16565b8051909150156114a257808060200190518101906116df9190611a95565b6114a25760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161042b565b606061174d8484600085611755565b949350505050565b606061176085611848565b6117ac5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161042b565b600080866001600160a01b031685876040516117c89190611b16565b60006040518083038185875af1925050503d8060008114611805576040519150601f19603f3d011682016040523d82523d6000602084013e61180a565b606091505b5091509150811561181e57915061174d9050565b80511561182e5780518082602001fd5b8360405162461bcd60e51b815260040161042b9190611ae3565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061174d575050151592915050565b60006020828403121561189357600080fd5b5035919050565b80356001600160a01b03811681146118b157600080fd5b919050565b6000602082840312156118c857600080fd5b6112168261189a565b600080604083850312156118e457600080fd5b6118ed8361189a565b946020939093013593505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000828210156119ce576119ce6119a6565b500390565b600082198211156119e6576119e66119a6565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000600019821415611a3457611a346119a6565b5060010190565b600060208284031215611a4d57600080fd5b5051919050565b6000816000190483118215151615611a6e57611a6e6119a6565b500290565b600082611a9057634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611aa757600080fd5b8151801515811461121657600080fd5b60005b83811015611ad2578181015183820152602001611aba565b838111156114df5750506000910152565b6020815260008251806020840152611b02816040850160208701611ab7565b601f01601f19169190910160400192915050565b60008251611b28818460208701611ab7565b919091019291505056fea2646970667358221220cbc7e2d630789fbcae02e02d13c87655f3729b89aad52a655c5089212602a00364736f6c634300080b0033
Deployed Bytecode Sourcemap
24694:9148:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25659:27;;;;;;;;;160:25:1;;;148:2;133:18;25659:27:0;;;;;;;;25759: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;25759:26:0;381:431:1;25841:45:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;1360:25:1;;;1416:2;1401:18;;1394:34;;;;1333:18;25841:45:0;1186:248:1;25634:18:0;;;;;;30113:1151;;;:::i;:::-;;28551:190;;;:::i;2815:140::-;;;:::i;25455:36::-;;;;;;;;-1:-1:-1;;;;;1617:32:1;;;1599:51;;1587:2;1572:18;25455:36:0;1439:217:1;26802:204:0;;;:::i;33115:133::-;;;:::i;25693:30::-;;;;;;26703:91;;;:::i;25601:26::-;;;;;;33436:203;;;;;;:::i;:::-;;:::i;2173:79::-;2211:7;2238:6;-1:-1:-1;;;;;2238:6:0;2173:79;;33647:192;;;;;;:::i;:::-;;:::i;32798:309::-;;;:::i;25540:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;28778:1279;;;;;;:::i;:::-;;:::i;32149:251::-;;;;;;:::i;:::-;;:::i;31335:665::-;;;:::i;3110:109::-;;;;;;:::i;:::-;;:::i;27071:722::-;;;;;;:::i;:::-;;:::i;32408:376::-;;;;;;:::i;:::-;;:::i;:::-;;;2293:14:1;;2286:22;2268:41;;2256:2;2241:18;32408:376:0;2128:187:1;25498:35:0;;;;;33256:172;;;;;;:::i;:::-;;:::i;25759:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25759:26:0;;;;-1:-1:-1;25759:26:0;;;:::o;30113:1151::-;23747:1;24345:7;;:19;;24337:63;;;;-1:-1:-1;;;24337:63:0;;;;;;;:::i;:::-;;;;;;;;;23747:1;24478:7;:18;;;30191:10:::1;30174:28;::::0;;;::::1;::::0;;;;;;;;30206:15:::1;-1:-1:-1::0;30174:47:0::1;30166:92;;;::::0;-1:-1:-1;;;30166:92:0;;2882:2:1;30166:92:0::1;::::0;::::1;2864:21:1::0;;;2901:18;;;2894:30;2960:34;2940:18;;;2933:62;3012:18;;30166:92:0::1;2680:356:1::0;30166:92:0::1;30279:21;30303:8;30312:1;30303:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;30358:10:::1;30349:20:::0;;:8:::1;:20:::0;;;;;;30400:11;;30303::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;30349:20:0;30422:13:::1;::::0;:10:::1;:13::i;:::-;30446:15;30464:69;30517:4;:15;;;30464:48;30508:3;30464:39;30480:4;:22;;;30464:4;:11;;;:15;;:39;;;;:::i;:::-;:43:::0;::::1;:48::i;:::-;:52:::0;::::1;:69::i;:::-;30446:87:::0;-1:-1:-1;30547:11:0;;30544:218:::1;;30594:18;:16;:18::i;:::-;30583:7;:29;;30575:106;;;;-1:-1:-1::0;;;30575:106:0::1;;;;;;;:::i;:::-;30696:54;-1:-1:-1::0;;;;;30696:11:0::1;:24;30729:10;30742:7:::0;30696:24:::1;:54::i;:::-;30777:11:::0;;30774:165:::1;;30819:1;30805:15:::0;;;30835:11:::1;:22:::0;;30850:7;;30819:1;30835:22:::1;::::0;30850:7;;30835:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;30872:12:0;;:55:::1;::::0;-1:-1:-1;;;;;30872:12:0::1;30906:10;30919:7:::0;30872:25:::1;:55::i;:::-;30985:22;::::0;::::1;::::0;30969:11;;:48:::1;::::0;31013:3:::1;::::0;30969:39:::1;::::0;:15:::1;:39::i;:48::-;30951:15;::::0;::::1;:66:::0;31041:11;;:15;31038:172:::1;;31121:12;::::0;31103:30:::1;::::0;:15:::1;:30;:::i;:::-;31089:10;31072:28;::::0;;;:16:::1;:28;::::0;;;;:61;31038:172:::1;;;31183:10;31197:1;31166:28:::0;;;:16:::1;:28;::::0;;;;:32;31038:172:::1;31227:29;::::0;160:25:1;;;31236:10:0::1;::::0;31227:29:::1;::::0;148:2:1;133:18;31227:29:0::1;;;;;;;;-1:-1:-1::0;;23703:1:0;24657:22;;-1:-1:-1;;30113:1151:0:o;28551:190::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;28623:8:::1;:15:::0;28606:14:::1;28649:85;28677:6;28671:3;:12;28649:85;;;28707:15;28718:3;28707:10;:15::i;:::-;28685:5;::::0;::::1;:::i;:::-;;;28649:85;;;;28595:146;28551: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;26802:204::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;26863:8:::1;26872:1;26863:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;;26898:8;26863:43;26855:83;;;::::0;-1:-1:-1;;;26855:83:0;;4704:2:1;26855:83:0::1;::::0;::::1;4686:21:1::0;4743:2;4723:18;;;4716:30;4782:29;4762:18;;;4755:57;4829:18;;26855:83:0::1;4502:351:1::0;26855:83:0::1;26983:15;26949:8;26958:1;26949:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;:49;;;;26802:204::o:0;33115:133::-;33229:11;;33190:36;;-1:-1:-1;;;33190:36:0;;33220:4;33190:36;;;1599:51:1;33164:7:0;;33229:11;-1:-1:-1;;;;;33190:11:0;:21;;;;1572:18:1;;33190:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;33183:57;;33115:133;:::o;26703:91::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;26755:13:::1;26766:1;26755:10;:13::i;:::-;26785:1;26779:3;:7:::0;26703:91::o;33436:203::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;33546:7:::1;33527:15;:26;;33519:69;;;::::0;-1:-1:-1;;;33519:69:0;;5249:2:1;33519:69:0::1;::::0;::::1;5231:21:1::0;5288:2;5268:18;;;5261:30;5327:32;5307:18;;;5300:60;5377:18;;33519:69:0::1;5047:354:1::0;33519:69:0::1;33599:12;:30:::0;33436:203::o;33647:192::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;33754:2:::1;33736:14;:20;;33728:60;;;::::0;-1:-1:-1;;;33728:60:0;;5608:2:1;33728:60:0::1;::::0;::::1;5590:21:1::0;5647:2;5627:18;;;5620:30;5686:29;5666:18;;;5659:57;5733:18;;33728:60:0::1;5406:351:1::0;33728:60:0::1;33799:15;:32:::0;33647:192::o;32798:309::-;32850:7;32870:21;32894:8;32903:1;32894:11;;;;;;;;:::i;:::-;;;;;;;;;;;32870:35;;32946:15;32919:4;:24;;;:42;32916:81;;;32984:1;32977:8;;;32798:309;:::o;32916:81::-;33090:8;33084:3;33078;;33063:11;;33035:4;:24;;;33017:15;:42;;;;:::i;:::-;33016:58;;;;:::i;:::-;33015:66;;;;:::i;:::-;:72;;;;:::i;:::-;:83;;;;:::i;:::-;33007:92;;;32798:309;:::o;28778:1279::-;23747:1;24345:7;;:19;;24337:63;;;;-1:-1:-1;;;24337:63:0;;;;;;;:::i;:::-;23747:1;24478:7;:18;;;28863:10:::1;28846:28;::::0;;;::::1;::::0;;;;;;;;28843:125:::1;;28944:12;::::0;28926:30:::1;::::0;:15:::1;:30;:::i;:::-;28912:10;28895:28;::::0;;;:16:::1;:28;::::0;;;;:61;28843:125:::1;28978:21;29002:8;29011:1;29002:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;29057:10:::1;29048:20:::0;;:8:::1;:20:::0;;;;;;29002:11:::1;::::0;;::::1;;::::0;-1:-1:-1;29048:20:0;29081:13:::1;::::0;:10:::1;:13::i;:::-;29109:11:::0;;:15;29105:379:::1;;29141:15;29159:69;29212:4;:15;;;29159:48;29203:3;29159:39;29175:4;:22;;;29159:4;:11;;;:15;;:39;;;;:::i;:69::-;29141:87:::0;-1:-1:-1;29246:11:0;;29243:230:::1;;29297:18;:16;:18::i;:::-;29286:7;:29;;29278:106;;;;-1:-1:-1::0;;;29278:106:0::1;;;;;;;:::i;:::-;29403:54;-1:-1:-1::0;;;;;29403:11:0::1;:24;29436:10;29449:7:::0;29403:24:::1;:54::i;:::-;29126:358;29105:379;29494:25;29537:11:::0;;29534:393:::1;;29590:12:::0;;:37:::1;::::0;-1:-1:-1;;;29590:37:0;;29621:4:::1;29590:37;::::0;::::1;1599:51:1::0;29565:22:0::1;::::0;-1:-1:-1;;;;;29590:12:0::1;::::0;:22:::1;::::0;1572:18:1;;29590:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29642:12:::0;;29565:62;;-1:-1:-1;29642:74:0::1;::::0;-1:-1:-1;;;;;29642:12:0::1;29680:10;29701:4;29708:7:::0;29642:29:::1;:74::i;:::-;29751:12:::0;;:37:::1;::::0;-1:-1:-1;;;29751:37:0;;29782:4:::1;29751:37;::::0;::::1;1599:51:1::0;29791:14:0;;-1:-1:-1;;;;;29751:12:0::1;::::0;:22:::1;::::0;1572:18:1;;29751:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;29834:11:::0;;29731:74;;-1:-1:-1;29834:34:0::1;::::0;29731:74;29834:15:::1;:34::i;:::-;29820:48:::0;;29883:11:::1;:32:::0;;29898:17;;29883:11;29820::::1;::::0;29883:32:::1;::::0;29898:17;;29883:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;29534:393:0::1;29971:22;::::0;::::1;::::0;29955:11;;:48:::1;::::0;29999:3:::1;::::0;29955:39:::1;::::0;:15:::1;:39::i;:48::-;29937:15;::::0;::::1;:66:::0;30021:28:::1;::::0;160:25:1;;;30029:10:0::1;::::0;30021:28:::1;::::0;148:2:1;133:18;30021:28:0::1;14:177:1::0;32149:251:0;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;32282:11:::1;::::0;32243:36:::1;::::0;-1:-1:-1;;;32243:36:0;;32273:4:::1;32243:36;::::0;::::1;1599:51:1::0;32243:11:0::1;-1:-1:-1::0;;;;;32243:21:0::1;::::0;::::1;::::0;1572:18:1;;32243:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32232:7;:61;;32224:103;;;::::0;-1:-1:-1;;;32224:103:0;;6359:2:1;32224:103:0::1;::::0;::::1;6341:21:1::0;6398:2;6378:18;;;6371:30;6437:31;6417:18;;;6410:59;6486:18;;32224:103:0::1;6157:353:1::0;32224:103:0::1;32338:54;-1:-1:-1::0;;;;;32338:11:0::1;:24;32371:10;32384:7:::0;32338:24:::1;:54::i;:::-;32149:251:::0;:::o;31335:665::-;23747:1;24345:7;;:19;;24337:63;;;;-1:-1:-1;;;24337:63:0;;;;;;;:::i;:::-;23747:1;24478:7;:18;;;;31397:21:::1;31421:8;31430:1;31421:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;31476:10:::1;31467:20:::0;;:8:::1;:20:::0;;;;;;31516:11;;31538::::1;:22:::0;;31421:11:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;31467:20:0;;31516:11;;;;31538;31421;31538:22:::1;::::0;31516:11;;31538:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;31674:10:0::1;31657:28;::::0;;;:16:::1;:28;::::0;;;;;31689:15:::1;-1:-1:-1::0;31654:120:0::1;;31759:3;31741:15;;31731:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;31720:42;::::0;;::::1;:::i;:::-;;;31654:120;31801:10;31815:1;31784:28:::0;;;:16:::1;:28;::::0;;;;:32;31827:12;;:55:::1;::::0;-1:-1:-1;;;;;31827:12:0;;::::1;::::0;31874:7;31827:25:::1;:55::i;:::-;31907:1;31893:15:::0;;;31919::::1;::::0;::::1;:19:::0;31954:38:::1;::::0;160:25:1;;;31972:10:0::1;::::0;31954:38:::1;::::0;148:2:1;133:18;31954:38:0::1;;;;;;;-1:-1:-1::0;;23703:1:0;24657:22;;-1:-1:-1;31335: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;27071:722::-:0;27132:7;27152:21;27176:8;27185:1;27176:11;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;27222:15:0;;;;:8;:15;;;;;;;27251:24;27176:11;;;;;;;27251:24;;;;27176:11;;-1:-1:-1;27279:8:0;27251:36;27248:75;;;-1:-1:-1;27310:1:0;;27071:722;-1:-1:-1;;;27071:722:0:o;27248:75::-;27361:22;;;;;27413:11;;27457:24;;;;27439:15;:42;:59;;;;-1:-1:-1;27485:13:0;;;27439:59;27435:269;;;27515:19;27537:63;27584:15;;27537:42;27563:4;:15;;;27537:21;:19;:21::i;:::-;:25;;:42::i;:63::-;27515:85;-1:-1:-1;27635:57:0;27657:34;27682:8;27657:20;27515:85;27673:3;27657:15;:20::i;:34::-;27635:17;;:21;:57::i;:::-;27615:77;;27500:204;27435:269;27721:64;27769:4;:15;;;27721:43;27760:3;27721:34;27737:17;27721:4;:11;;;:15;;:34;;;;:::i;:64::-;27714:71;27071:722;-1:-1:-1;;;;;;27071:722:0:o;32408:376::-;32501:12;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;32559:11:::1;-1:-1:-1::0;;;;;32534:37:0::1;:12;-1:-1:-1::0;;;;;32534:37:0::1;;;32526:77;;;::::0;-1:-1:-1;;;32526:77:0;;6717:2:1;32526:77:0::1;::::0;::::1;6699:21:1::0;6756:2;6736:18;;;6729:30;6795;6775:18;;;6768:58;6843:18;;32526:77:0::1;6515:352:1::0;32526:77:0::1;32617:11:::0;32614:96:::1;;32653:45;::::0;-1:-1:-1;;;32653:45:0;;32692:4:::1;32653:45;::::0;::::1;1599:51:1::0;-1:-1:-1;;;;;32653:30:0;::::1;::::0;::::1;::::0;1572:18:1;;32653:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32644:54;;32614:96;32727:49;::::0;-1:-1:-1;;;32727:49:0;;32757:10:::1;32727:49;::::0;::::1;7046:51:1::0;7113:18;;;7106:34;;;-1:-1:-1;;;;;32727:29:0;::::1;::::0;::::1;::::0;7019:18:1;;32727:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32720:56;;2455:1;32408:376:::0;;;;:::o;33256:172::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;33339:5:::1;33329:6;:15;;33321:52;;;::::0;-1:-1:-1;;;33321:52:0;;7635:2:1;33321:52:0::1;::::0;::::1;7617:21:1::0;7674:2;7654:18;;;7647:30;7713:26;7693:18;;;7686:54;7757:18;;33321:52:0::1;7433:348:1::0;33321:52:0::1;33384:13;33395:1;33384:10;:13::i;:::-;33408:3;:12:::0;33256:172::o;27869:599::-;27923:21;27947:8;27956:4;27947:14;;;;;;;;:::i;:::-;;;;;;;;;;;27923:38;;27995:4;:24;;;27976:15;:43;27972:82;;28036:7;27869:599;:::o;27972:82::-;28083:11;;28109:13;28105:109;;-1:-1:-1;28166:15:0;28139:24;;;;:42;-1:-1:-1;27869:599:0:o;28105:109::-;28224:19;28246:63;28293:15;;28246:42;28272:4;:15;;;28246:21;:19;:21::i;:63::-;28224:85;-1:-1:-1;28345:62:0;28372:34;28397:8;28372:20;28224:85;28388:3;28372:15;:20::i;:34::-;28345:22;;;;;:26;:62::i;:::-;28320:22;;;:87;-1:-1:-1;;28445:15:0;28418:24;;;;:42;-1:-1:-1;27869:599: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://cbc7e2d630789fbcae02e02d13c87655f3729b89aad52a655c5089212602a003
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.