Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 46 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Reward... | 17905636 | 402 days ago | IN | 0 ETH | 0.00083221 | ||||
Emergency Withdr... | 17711677 | 429 days ago | IN | 0 ETH | 0.00103051 | ||||
Emergency Withdr... | 17561598 | 450 days ago | IN | 0 ETH | 0.00091335 | ||||
Emergency Withdr... | 17561591 | 450 days ago | IN | 0 ETH | 0.00076048 | ||||
Emergency Withdr... | 17554177 | 451 days ago | IN | 0 ETH | 0.00074429 | ||||
Emergency Withdr... | 17550253 | 452 days ago | IN | 0 ETH | 0.00136062 | ||||
Emergency Withdr... | 17537080 | 453 days ago | IN | 0 ETH | 0.00093671 | ||||
Emergency Withdr... | 17523855 | 455 days ago | IN | 0 ETH | 0.00089442 | ||||
Emergency Withdr... | 17523080 | 455 days ago | IN | 0 ETH | 0.00091463 | ||||
Emergency Withdr... | 17522792 | 455 days ago | IN | 0 ETH | 0.00140208 | ||||
Emergency Withdr... | 17522316 | 455 days ago | IN | 0 ETH | 0.00171982 | ||||
Emergency Withdr... | 17521333 | 456 days ago | IN | 0 ETH | 0.0075167 | ||||
Emergency Withdr... | 17520721 | 456 days ago | IN | 0 ETH | 0.00070535 | ||||
Withdraw | 17520717 | 456 days ago | IN | 0 ETH | 0.00068477 | ||||
Withdraw | 17520685 | 456 days ago | IN | 0 ETH | 0.00071335 | ||||
Emergency Withdr... | 17520683 | 456 days ago | IN | 0 ETH | 0.00072262 | ||||
Emergency Withdr... | 17516270 | 456 days ago | IN | 0 ETH | 0.00096248 | ||||
Emergency Withdr... | 17516194 | 456 days ago | IN | 0 ETH | 0.00638585 | ||||
Update Apy | 17514260 | 457 days ago | IN | 0 ETH | 0.0011293 | ||||
Update Exit Pena... | 17514114 | 457 days ago | IN | 0 ETH | 0.00047901 | ||||
Stop Reward | 17514113 | 457 days ago | IN | 0 ETH | 0.00088874 | ||||
Deposit | 17385165 | 475 days ago | IN | 0 ETH | 0.00292435 | ||||
Emergency Withdr... | 17344879 | 480 days ago | IN | 0 ETH | 0.01372983 | ||||
Deposit | 17307536 | 486 days ago | IN | 0 ETH | 0.01178844 | ||||
Deposit | 17266759 | 491 days ago | IN | 0 ETH | 0.00701931 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TwelveWeekStake
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-16 */ /** *Staking for Defiapps.ai */ //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 IERC20 { /** * @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 IERC20;` 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( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 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 * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 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( IERC20 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( IERC20 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(IERC20 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 TwelveWeekStake is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeBEP20 for IERC20; // 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 { IERC20 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. } IERC20 public immutable stakingToken; IERC20 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 = IERC20(0xEC196e38DbBBCB1E03BC0742908A385938555443); rewardToken = IERC20(0xEC196e38DbBBCB1E03BC0742908A385938555443); apy = 225; lockDuration = 12 weeks; 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 emergencyRewardWithdraw(uint256 _amount) external onlyOwner { require(_amount <= rewardToken.balanceOf(address(this)) - totalStaked, 'not enough tokens to take out'); rewardToken.safeTransfer(address(msg.sender), _amount); } function calculateNewRewards() public view returns (uint256) { PoolInfo storage pool = poolInfo[0]; if(pool.lastRewardTimestamp > block.timestamp){ return 0; } return (((block.timestamp - pool.lastRewardTimestamp) * totalStaked) * apy / 100 / 365 days); } function rewardsRemaining() public view returns (uint256){ return rewardToken.balanceOf(address(this)) - totalStaked; } function updateApy(uint256 newApy) external onlyOwner { require(newApy <= 10000, "APY must be below 10000%"); updatePool(0); apy = newApy; } function 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":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exitPenaltyPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","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 IERC20","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 IERC20","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":"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
60c0604052600060095534801561001557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180805573ec196e38dbbbcb1e03bc0742908a385938555443608081815260a082905260e16004908155626ebe00600555600a6006556040805192830181529282526103e860208301818152630149d86b94840194855260006060850181815260078054988901815590915293517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889690930295860180546001600160a01b0319166001600160a01b039094169390931790925590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68985015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a840155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b9092019190915560095560805160a0516118bb6101cc60003960008181610323015281816103e7015281816104c00152818161062c015281816108e00152610ba70152600061022d01526118bb6000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806380dc0672116100c3578063b6b55f251161007c578063b6b55f25146102dd578063db2e21bc146102f0578063f2fde38b146102f8578063f40f0f521461030b578063f7c618c11461031e578063ff16ef391461034557600080fd5b806380dc067214610280578063817b1cd2146102885780638da5cb5b146102915780638e0b0198146102a2578063999e2f75146102b5578063a913a5f7146102bd57600080fd5b8063630b5ba111610115578063630b5ba114610218578063715018a61461022057806372f702f314610228578063746c8ae11461026757806378c196f31461026f5780637b280def1461027757600080fd5b8063045544431461015d5780631526fe27146101795780631959a002146101b65780633279beab146101f25780633bcfc4b8146102075780633ccfd60b14610210575b600080fd5b61016660055481565b6040519081526020015b60405180910390f35b61018c61018736600461160c565b610358565b604080516001600160a01b0390951685526020850193909352918301526060820152608001610170565b6101dd6101c4366004611625565b6008602052600090815260409020805460019091015482565b60408051928352602083019190915201610170565b61020561020036600461160c565b61039c565b005b61016660045481565b6102056104ea565b610205610725565b61020561077a565b61024f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610170565b6102056107ee565b6101666108bc565b61016660065481565b61020561095a565b61016660035481565b6000546001600160a01b031661024f565b6102056102b036600461160c565b610995565b610166610a15565b6101666102cb366004611625565b60026020526000908152604090205481565b6102056102eb36600461160c565b610a9b565b610205610d52565b610205610306366004611625565b610e7e565b610166610319366004611625565b610eb1565b61024f7f000000000000000000000000000000000000000000000000000000000000000081565b61020561035336600461160c565b610fa0565b6007818154811061036857600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146103cf5760405162461bcd60e51b81526004016103c69061164e565b60405180910390fd5b6003546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610436573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045a9190611683565b61046491906116b2565b8111156104b35760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f757400000060448201526064016103c6565b6104e76001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338361102b565b50565b6002600154141561050d5760405162461bcd60e51b81526004016103c6906116c9565b6002600181905533600090815260209190915260409020544210156105745760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c7960448201526064016103c6565b6000600760008154811061058a5761058a611700565b60009182526020808320338452600890915260408320805460049093029091019350916105b690611093565b60006105f083600101546105ea64e8d4a510006105e48860030154886000015461112690919063ffffffff16565b906111ae565b906111f0565b90508015610653576106006108bc565b81111561061f5760405162461bcd60e51b81526004016103c690611716565b6106536001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338361102b565b811561068b576000808455600380548492906106709084906116b2565b9091555050835461068b906001600160a01b0316338461102b565b600384015483546106a69164e8d4a51000916105e491611126565b60018401558254156106d4576005546106bf9042611774565b336000908152600260205260409020556106e5565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b0316331461074f5760405162461bcd60e51b81526004016103c69061164e565b60075460005b818110156107765761076681611093565b61076f8161178c565b9050610755565b5050565b6000546001600160a01b031633146107a45760405162461bcd60e51b81526004016103c69061164e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146108185760405162461bcd60e51b81526004016103c69061164e565b600760008154811061082c5761082c611700565b906000526020600020906004020160020154630149d86b146108905760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e6365000000000060448201526064016103c6565b4260076000815481106108a5576108a5611700565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b9190611683565b61095591906116b2565b905090565b6000546001600160a01b031633146109845760405162461bcd60e51b81526004016103c69061164e565b61098e6000611093565b6000600455565b6000546001600160a01b031633146109bf5760405162461bcd60e51b81526004016103c69061164e565b601e811115610a105760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e20333025000000000060448201526064016103c6565b600655565b6000806007600081548110610a2c57610a2c611700565b906000526020600020906004020190504281600201541115610a5057600091505090565b6301e133806064600454600354846002015442610a6d91906116b2565b610a7791906117a7565b610a8191906117a7565b610a8b91906117c6565b610a9591906117c6565b91505090565b60026001541415610abe5760405162461bcd60e51b81526004016103c6906116c9565b600260018190553360009081526020919091526040902054610af857600554610ae79042611774565b336000908152600260205260409020555b60006007600081548110610b0e57610b0e611700565b60009182526020808320338452600890915260408320600490920201925090610b3690611093565b805415610bd0576000610b6b82600101546105ea64e8d4a510006105e48760030154876000015461112690919063ffffffff16565b90508015610bce57610b7b6108bc565b811115610b9a5760405162461bcd60e51b81526004016103c690611716565b610bce6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338361102b565b505b60008315610d005782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c449190611683565b8454909150610c5e906001600160a01b0316333088611232565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ca5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc99190611683565b610cd391906116b2565b8354909250610ce29083611270565b835560038054839190600090610cf9908490611774565b9091555050505b60038301548254610d1b9164e8d4a51000916105e491611126565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610713565b60026001541415610d755760405162461bcd60e51b81526004016103c6906116c9565b600260018190555060006007600081548110610d9357610d93611700565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610dcc9084906116b2565b9091555050336000908152600260205260409020544211610e0e57606460065482610df791906117a7565b610e0191906117c6565b610e0b90826116b2565b90505b336000818152600260205260408120558354610e36916001600160a01b03909116908361102b565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b03163314610ea85760405162461bcd60e51b81526004016103c69061164e565b6104e7816112cf565b6000806007600081548110610ec857610ec8611700565b600091825260208083206001600160a01b0387168452600890915260409092206002600490920290920190810154909250630149d86b1415610f0e575060009392505050565b6003808301549054600284015442118015610f2857508015155b15610f6e576000610f4b6009546105e48760010154610f45610a15565b90611126565b9050610f6a610f63836105e48464e8d4a51000611126565b8490611270565b9250505b610f9683600101546105ea64e8d4a510006105e486886000015461112690919063ffffffff16565b9695505050505050565b6000546001600160a01b03163314610fca5760405162461bcd60e51b81526004016103c69061164e565b61271081111561101c5760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f7720313030303025000000000000000060448201526064016103c6565b6110266000611093565b600455565b6040516001600160a01b03831660248201526044810182905261108e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261138f565b505050565b6000600782815481106110a8576110a8611700565b90600052602060002090600402019050806002015442116110c7575050565b600354806110da57504260029091015550565b60006110f26009546105e48560010154610f45610a15565b905061111561110a836105e48464e8d4a51000611126565b600385015490611270565b600384015550504260029091015550565b600082611135575060006111a8565b600061114183856117a7565b90508261114e85836117c6565b146111a55760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016103c6565b90505b92915050565b60006111a583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611461565b60006111a583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611498565b6040516001600160a01b038085166024830152831660448201526064810182905261126a9085906323b872dd60e01b90608401611057565b50505050565b60008061127d8385611774565b9050838110156111a55760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103c6565b6001600160a01b0381166113345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103c6565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006113e4826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114c99092919063ffffffff16565b80519091501561108e578080602001905181019061140291906117e8565b61108e5760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103c6565b600081836114825760405162461bcd60e51b81526004016103c69190611836565b50600061148f84866117c6565b95945050505050565b600081848411156114bc5760405162461bcd60e51b81526004016103c69190611836565b50600061148f84866116b2565b60606114d884846000856114e0565b949350505050565b60606114eb856115d3565b6115375760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103c6565b600080866001600160a01b031685876040516115539190611869565b60006040518083038185875af1925050503d8060008114611590576040519150601f19603f3d011682016040523d82523d6000602084013e611595565b606091505b509150915081156115a95791506114d89050565b8051156115b95780518082602001fd5b8360405162461bcd60e51b81526004016103c69190611836565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906114d8575050151592915050565b60006020828403121561161e57600080fd5b5035919050565b60006020828403121561163757600080fd5b81356001600160a01b03811681146111a557600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561169557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156116c4576116c461169c565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b600082198211156117875761178761169c565b500190565b60006000198214156117a0576117a061169c565b5060010190565b60008160001904831182151516156117c1576117c161169c565b500290565b6000826117e357634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156117fa57600080fd5b815180151581146111a557600080fd5b60005b8381101561182557818101518382015260200161180d565b8381111561126a5750506000910152565b602081526000825180602084015261185581604085016020870161180a565b601f01601f19169190910160400192915050565b6000825161187b81846020870161180a565b919091019291505056fea2646970667358221220450548fefce8f4e29babc0edc69436ead306a012adc8641597da37df4e6d5ead64736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c806380dc0672116100c3578063b6b55f251161007c578063b6b55f25146102dd578063db2e21bc146102f0578063f2fde38b146102f8578063f40f0f521461030b578063f7c618c11461031e578063ff16ef391461034557600080fd5b806380dc067214610280578063817b1cd2146102885780638da5cb5b146102915780638e0b0198146102a2578063999e2f75146102b5578063a913a5f7146102bd57600080fd5b8063630b5ba111610115578063630b5ba114610218578063715018a61461022057806372f702f314610228578063746c8ae11461026757806378c196f31461026f5780637b280def1461027757600080fd5b8063045544431461015d5780631526fe27146101795780631959a002146101b65780633279beab146101f25780633bcfc4b8146102075780633ccfd60b14610210575b600080fd5b61016660055481565b6040519081526020015b60405180910390f35b61018c61018736600461160c565b610358565b604080516001600160a01b0390951685526020850193909352918301526060820152608001610170565b6101dd6101c4366004611625565b6008602052600090815260409020805460019091015482565b60408051928352602083019190915201610170565b61020561020036600461160c565b61039c565b005b61016660045481565b6102056104ea565b610205610725565b61020561077a565b61024f7f000000000000000000000000ec196e38dbbbcb1e03bc0742908a38593855544381565b6040516001600160a01b039091168152602001610170565b6102056107ee565b6101666108bc565b61016660065481565b61020561095a565b61016660035481565b6000546001600160a01b031661024f565b6102056102b036600461160c565b610995565b610166610a15565b6101666102cb366004611625565b60026020526000908152604090205481565b6102056102eb36600461160c565b610a9b565b610205610d52565b610205610306366004611625565b610e7e565b610166610319366004611625565b610eb1565b61024f7f000000000000000000000000ec196e38dbbbcb1e03bc0742908a38593855544381565b61020561035336600461160c565b610fa0565b6007818154811061036857600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146103cf5760405162461bcd60e51b81526004016103c69061164e565b60405180910390fd5b6003546040516370a0823160e01b81523060048201527f000000000000000000000000ec196e38dbbbcb1e03bc0742908a3859385554436001600160a01b0316906370a0823190602401602060405180830381865afa158015610436573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045a9190611683565b61046491906116b2565b8111156104b35760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f757400000060448201526064016103c6565b6104e76001600160a01b037f000000000000000000000000ec196e38dbbbcb1e03bc0742908a38593855544316338361102b565b50565b6002600154141561050d5760405162461bcd60e51b81526004016103c6906116c9565b6002600181905533600090815260209190915260409020544210156105745760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c7960448201526064016103c6565b6000600760008154811061058a5761058a611700565b60009182526020808320338452600890915260408320805460049093029091019350916105b690611093565b60006105f083600101546105ea64e8d4a510006105e48860030154886000015461112690919063ffffffff16565b906111ae565b906111f0565b90508015610653576106006108bc565b81111561061f5760405162461bcd60e51b81526004016103c690611716565b6106536001600160a01b037f000000000000000000000000ec196e38dbbbcb1e03bc0742908a38593855544316338361102b565b811561068b576000808455600380548492906106709084906116b2565b9091555050835461068b906001600160a01b0316338461102b565b600384015483546106a69164e8d4a51000916105e491611126565b60018401558254156106d4576005546106bf9042611774565b336000908152600260205260409020556106e5565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b0316331461074f5760405162461bcd60e51b81526004016103c69061164e565b60075460005b818110156107765761076681611093565b61076f8161178c565b9050610755565b5050565b6000546001600160a01b031633146107a45760405162461bcd60e51b81526004016103c69061164e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146108185760405162461bcd60e51b81526004016103c69061164e565b600760008154811061082c5761082c611700565b906000526020600020906004020160020154630149d86b146108905760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e6365000000000060448201526064016103c6565b4260076000815481106108a5576108a5611700565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000ec196e38dbbbcb1e03bc0742908a38593855544316906370a0823190602401602060405180830381865afa158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b9190611683565b61095591906116b2565b905090565b6000546001600160a01b031633146109845760405162461bcd60e51b81526004016103c69061164e565b61098e6000611093565b6000600455565b6000546001600160a01b031633146109bf5760405162461bcd60e51b81526004016103c69061164e565b601e811115610a105760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e20333025000000000060448201526064016103c6565b600655565b6000806007600081548110610a2c57610a2c611700565b906000526020600020906004020190504281600201541115610a5057600091505090565b6301e133806064600454600354846002015442610a6d91906116b2565b610a7791906117a7565b610a8191906117a7565b610a8b91906117c6565b610a9591906117c6565b91505090565b60026001541415610abe5760405162461bcd60e51b81526004016103c6906116c9565b600260018190553360009081526020919091526040902054610af857600554610ae79042611774565b336000908152600260205260409020555b60006007600081548110610b0e57610b0e611700565b60009182526020808320338452600890915260408320600490920201925090610b3690611093565b805415610bd0576000610b6b82600101546105ea64e8d4a510006105e48760030154876000015461112690919063ffffffff16565b90508015610bce57610b7b6108bc565b811115610b9a5760405162461bcd60e51b81526004016103c690611716565b610bce6001600160a01b037f000000000000000000000000ec196e38dbbbcb1e03bc0742908a38593855544316338361102b565b505b60008315610d005782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c449190611683565b8454909150610c5e906001600160a01b0316333088611232565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ca5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc99190611683565b610cd391906116b2565b8354909250610ce29083611270565b835560038054839190600090610cf9908490611774565b9091555050505b60038301548254610d1b9164e8d4a51000916105e491611126565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610713565b60026001541415610d755760405162461bcd60e51b81526004016103c6906116c9565b600260018190555060006007600081548110610d9357610d93611700565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610dcc9084906116b2565b9091555050336000908152600260205260409020544211610e0e57606460065482610df791906117a7565b610e0191906117c6565b610e0b90826116b2565b90505b336000818152600260205260408120558354610e36916001600160a01b03909116908361102b565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b03163314610ea85760405162461bcd60e51b81526004016103c69061164e565b6104e7816112cf565b6000806007600081548110610ec857610ec8611700565b600091825260208083206001600160a01b0387168452600890915260409092206002600490920290920190810154909250630149d86b1415610f0e575060009392505050565b6003808301549054600284015442118015610f2857508015155b15610f6e576000610f4b6009546105e48760010154610f45610a15565b90611126565b9050610f6a610f63836105e48464e8d4a51000611126565b8490611270565b9250505b610f9683600101546105ea64e8d4a510006105e486886000015461112690919063ffffffff16565b9695505050505050565b6000546001600160a01b03163314610fca5760405162461bcd60e51b81526004016103c69061164e565b61271081111561101c5760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f7720313030303025000000000000000060448201526064016103c6565b6110266000611093565b600455565b6040516001600160a01b03831660248201526044810182905261108e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261138f565b505050565b6000600782815481106110a8576110a8611700565b90600052602060002090600402019050806002015442116110c7575050565b600354806110da57504260029091015550565b60006110f26009546105e48560010154610f45610a15565b905061111561110a836105e48464e8d4a51000611126565b600385015490611270565b600384015550504260029091015550565b600082611135575060006111a8565b600061114183856117a7565b90508261114e85836117c6565b146111a55760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016103c6565b90505b92915050565b60006111a583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611461565b60006111a583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611498565b6040516001600160a01b038085166024830152831660448201526064810182905261126a9085906323b872dd60e01b90608401611057565b50505050565b60008061127d8385611774565b9050838110156111a55760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103c6565b6001600160a01b0381166113345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103c6565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006113e4826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114c99092919063ffffffff16565b80519091501561108e578080602001905181019061140291906117e8565b61108e5760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103c6565b600081836114825760405162461bcd60e51b81526004016103c69190611836565b50600061148f84866117c6565b95945050505050565b600081848411156114bc5760405162461bcd60e51b81526004016103c69190611836565b50600061148f84866116b2565b60606114d884846000856114e0565b949350505050565b60606114eb856115d3565b6115375760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103c6565b600080866001600160a01b031685876040516115539190611869565b60006040518083038185875af1925050503d8060008114611590576040519150601f19603f3d011682016040523d82523d6000602084013e611595565b606091505b509150915081156115a95791506114d89050565b8051156115b95780518082602001fd5b8360405162461bcd60e51b81526004016103c69190611836565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906114d8575050151592915050565b60006020828403121561161e57600080fd5b5035919050565b60006020828403121561163757600080fd5b81356001600160a01b03811681146111a557600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561169557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156116c4576116c461169c565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b600082198211156117875761178761169c565b500190565b60006000198214156117a0576117a061169c565b5060010190565b60008160001904831182151516156117c1576117c161169c565b500290565b6000826117e357634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156117fa57600080fd5b815180151581146111a557600080fd5b60005b8381101561182557818101518382015260200161180d565b8381111561126a5750506000910152565b602081526000825180602084015261185581604085016020870161180a565b601f01601f19169190910160400192915050565b6000825161187b81846020870161180a565b919091019291505056fea2646970667358221220450548fefce8f4e29babc0edc69436ead306a012adc8641597da37df4e6d5ead64736f6c634300080b0033
Deployed Bytecode Sourcemap
24733:8597:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25698:27;;;;;;;;;160:25:1;;;148:2;133:18;25698:27:0;;;;;;;;25798: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;25798:26:0;381:431:1;25880:45:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;1282:25:1;;;1338:2;1323:18;;1316:34;;;;1255:18;25880:45:0;1108:248:1;32233:256:0;;;;;;:::i;:::-;;:::i;:::-;;25673:18;;;;;;30197:1151;;;:::i;28633:190::-;;;:::i;2854:140::-;;;:::i;25494:36::-;;;;;;;;-1:-1:-1;;;;;1539:32:1;;;1521:51;;1509:2;1494:18;25494:36:0;1361:217:1;26881:204:0;;;:::i;32814:133::-;;;:::i;25732:30::-;;;;;;26782:91;;;:::i;25640:26::-;;;;;;2212:79;2250:7;2277:6;-1:-1:-1;;;;;2277:6:0;2212:79;;33135:192;;;;;;:::i;:::-;;:::i;32497:309::-;;;:::i;25579:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;28860:1281;;;;;;:::i;:::-;;:::i;31419:665::-;;;:::i;3149:109::-;;;;;;:::i;:::-;;:::i;27150:724::-;;;;;;:::i;:::-;;:::i;25537:35::-;;;;;32955:172;;;;;;:::i;:::-;;:::i;25798:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25798:26:0;;;;-1:-1:-1;25798:26:0;;;:::o;32233:256::-;2424:6;;-1:-1:-1;;;;;2424:6:0;955:10;2424:22;2416:67;;;;-1:-1:-1;;;2416:67:0;;;;;;;:::i;:::-;;;;;;;;;32371:11:::1;::::0;32332:36:::1;::::0;-1:-1:-1;;;32332:36:0;;32362:4:::1;32332:36;::::0;::::1;1521:51:1::0;32332:11:0::1;-1:-1:-1::0;;;;;32332:21:0::1;::::0;::::1;::::0;1494:18:1;;32332:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32321:7;:61;;32313:103;;;::::0;-1:-1:-1;;;32313:103:0;;2805:2:1;32313:103:0::1;::::0;::::1;2787:21:1::0;2844:2;2824:18;;;2817:30;2883:31;2863:18;;;2856:59;2932:18;;32313:103:0::1;2603:353:1::0;32313:103:0::1;32427:54;-1:-1:-1::0;;;;;32427:11:0::1;:24;32460:10;32473:7:::0;32427:24:::1;:54::i;:::-;32233:256:::0;:::o;30197:1151::-;23786:1;24384:7;;:19;;24376:63;;;;-1:-1:-1;;;24376:63:0;;;;;;;:::i;:::-;23786:1;24517:7;:18;;;30273:10:::1;30256:28;::::0;;;::::1;::::0;;;;;;;;30288:15:::1;-1:-1:-1::0;30256:47:0::1;30248:92;;;::::0;-1:-1:-1;;;30248:92:0;;3523:2:1;30248:92:0::1;::::0;::::1;3505:21:1::0;;;3542:18;;;3535:30;3601:34;3581:18;;;3574:62;3653:18;;30248:92:0::1;3321:356:1::0;30248:92:0::1;30361:21;30385:8;30394:1;30385:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;30440:10:::1;30431:20:::0;;:8:::1;:20:::0;;;;;;30482:11;;30385::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;30431:20:0;30504:13:::1;::::0;:10:::1;:13::i;:::-;30528:15;30546:70;30600:4;:15;;;30546:49;30590:4;30546:39;30562:4;:22;;;30546:4;:11;;;:15;;:39;;;;:::i;:::-;:43:::0;::::1;:49::i;:::-;:53:::0;::::1;:70::i;:::-;30528:88:::0;-1:-1:-1;30630:11:0;;30627:218:::1;;30677:18;:16;:18::i;:::-;30666:7;:29;;30658:106;;;;-1:-1:-1::0;;;30658:106:0::1;;;;;;;:::i;:::-;30779:54;-1:-1:-1::0;;;;;30779:11:0::1;:24;30812:10;30825:7:::0;30779:24:::1;:54::i;:::-;30860:11:::0;;30857:165:::1;;30902:1;30888:15:::0;;;30918:11:::1;:22:::0;;30933:7;;30902:1;30918:22:::1;::::0;30933:7;;30918:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;30955:12:0;;:55:::1;::::0;-1:-1:-1;;;;;30955:12:0::1;30989:10;31002:7:::0;30955:25:::1;:55::i;:::-;31068:22;::::0;::::1;::::0;31052:11;;:49:::1;::::0;31096:4:::1;::::0;31052:39:::1;::::0;:15:::1;:39::i;:49::-;31034:15;::::0;::::1;:67:::0;31125:11;;:15;31122:172:::1;;31205:12;::::0;31187:30:::1;::::0;:15:::1;:30;:::i;:::-;31173:10;31156:28;::::0;;;:16:::1;:28;::::0;;;;:61;31122:172:::1;;;31267:10;31281:1;31250:28:::0;;;:16:::1;:28;::::0;;;;:32;31122:172:::1;31311:29;::::0;160:25:1;;;31320:10:0::1;::::0;31311:29:::1;::::0;148:2:1;133:18;31311:29:0::1;;;;;;;;-1:-1:-1::0;;23742:1:0;24696:22;;-1:-1:-1;;30197:1151:0:o;28633:190::-;2424:6;;-1:-1:-1;;;;;2424:6:0;955:10;2424:22;2416:67;;;;-1:-1:-1;;;2416:67:0;;;;;;;:::i;:::-;28705:8:::1;:15:::0;28688:14:::1;28731:85;28759:6;28753:3;:12;28731:85;;;28789:15;28800:3;28789:10;:15::i;:::-;28767:5;::::0;::::1;:::i;:::-;;;28731:85;;;;28677:146;28633:190::o:0;2854:140::-;2424:6;;-1:-1:-1;;;;;2424:6:0;955:10;2424:22;2416:67;;;;-1:-1:-1;;;2416:67:0;;;;;;;:::i;:::-;2953:1:::1;2937:6:::0;;2916:40:::1;::::0;-1:-1:-1;;;;;2937:6:0;;::::1;::::0;2916:40:::1;::::0;2953:1;;2916:40:::1;2984:1;2967:19:::0;;-1:-1:-1;;;;;;2967:19:0::1;::::0;;2854:140::o;26881:204::-;2424:6;;-1:-1:-1;;;;;2424:6:0;955:10;2424:22;2416:67;;;;-1:-1:-1;;;2416:67:0;;;;;;;:::i;:::-;26942:8:::1;26951:1;26942:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;;26977:8;26942:43;26934:83;;;::::0;-1:-1:-1;;;26934:83:0;;4722:2:1;26934:83:0::1;::::0;::::1;4704:21:1::0;4761:2;4741:18;;;4734:30;4800:29;4780:18;;;4773:57;4847:18;;26934:83:0::1;4520:351:1::0;26934:83:0::1;27062:15;27028:8;27037:1;27028:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;:49;;;;26881:204::o:0;32814:133::-;32928:11;;32889:36;;-1:-1:-1;;;32889:36:0;;32919:4;32889:36;;;1521:51:1;32863:7:0;;32928:11;-1:-1:-1;;;;;32889:11:0;:21;;;;1494:18:1;;32889:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32882:57;;32814:133;:::o;26782:91::-;2424:6;;-1:-1:-1;;;;;2424:6:0;955:10;2424:22;2416:67;;;;-1:-1:-1;;;2416:67:0;;;;;;;:::i;:::-;26834:13:::1;26845:1;26834:10;:13::i;:::-;26864:1;26858:3;:7:::0;26782:91::o;33135:192::-;2424:6;;-1:-1:-1;;;;;2424:6:0;955:10;2424:22;2416:67;;;;-1:-1:-1;;;2416:67:0;;;;;;;:::i;:::-;33242:2:::1;33224:14;:20;;33216:60;;;::::0;-1:-1:-1;;;33216:60:0;;5078:2:1;33216:60:0::1;::::0;::::1;5060:21:1::0;5117:2;5097:18;;;5090:30;5156:29;5136:18;;;5129:57;5203:18;;33216:60:0::1;4876:351:1::0;33216:60:0::1;33287:15;:32:::0;33135:192::o;32497:309::-;32549:7;32569:21;32593:8;32602:1;32593:11;;;;;;;;:::i;:::-;;;;;;;;;;;32569:35;;32645:15;32618:4;:24;;;:42;32615:81;;;32683:1;32676:8;;;32497:309;:::o;32615:81::-;32789:8;32783:3;32777;;32762:11;;32734:4;:24;;;32716:15;:42;;;;:::i;:::-;32715:58;;;;:::i;:::-;32714:66;;;;:::i;:::-;:72;;;;:::i;:::-;:83;;;;:::i;:::-;32706:92;;;32497:309;:::o;28860:1281::-;23786:1;24384:7;;:19;;24376:63;;;;-1:-1:-1;;;24376:63:0;;;;;;;:::i;:::-;23786:1;24517:7;:18;;;28945:10:::1;28928:28;::::0;;;::::1;::::0;;;;;;;;28925:125:::1;;29026:12;::::0;29008:30:::1;::::0;:15:::1;:30;:::i;:::-;28994:10;28977:28;::::0;;;:16:::1;:28;::::0;;;;:61;28925:125:::1;29060:21;29084:8;29093:1;29084:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;29139:10:::1;29130:20:::0;;:8:::1;:20:::0;;;;;;29084:11:::1;::::0;;::::1;;::::0;-1:-1:-1;29130:20:0;29163:13:::1;::::0;:10:::1;:13::i;:::-;29191:11:::0;;:15;29187:380:::1;;29223:15;29241:70;29295:4;:15;;;29241:49;29285:4;29241:39;29257:4;:22;;;29241:4;:11;;;:15;;:39;;;;:::i;:70::-;29223:88:::0;-1:-1:-1;29329:11:0;;29326:230:::1;;29380:18;:16;:18::i;:::-;29369:7;:29;;29361:106;;;;-1:-1:-1::0;;;29361:106:0::1;;;;;;;:::i;:::-;29486:54;-1:-1:-1::0;;;;;29486:11:0::1;:24;29519:10;29532:7:::0;29486:24:::1;:54::i;:::-;29208:359;29187:380;29577:25;29620:11:::0;;29617:393:::1;;29673:12:::0;;:37:::1;::::0;-1:-1:-1;;;29673:37:0;;29704:4:::1;29673:37;::::0;::::1;1521:51:1::0;29648:22:0::1;::::0;-1:-1:-1;;;;;29673:12:0::1;::::0;:22:::1;::::0;1494:18:1;;29673:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29725:12:::0;;29648:62;;-1:-1:-1;29725:74:0::1;::::0;-1:-1:-1;;;;;29725:12:0::1;29763:10;29784:4;29791:7:::0;29725:29:::1;:74::i;:::-;29834:12:::0;;:37:::1;::::0;-1:-1:-1;;;29834:37:0;;29865:4:::1;29834:37;::::0;::::1;1521:51:1::0;29874:14:0;;-1:-1:-1;;;;;29834:12:0::1;::::0;:22:::1;::::0;1494:18:1;;29834:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;29917:11:::0;;29814:74;;-1:-1:-1;29917:34:0::1;::::0;29814:74;29917:15:::1;:34::i;:::-;29903:48:::0;;29966:11:::1;:32:::0;;29981:17;;29966:11;29903::::1;::::0;29966:32:::1;::::0;29981:17;;29966:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;29617:393:0::1;30054:22;::::0;::::1;::::0;30038:11;;:49:::1;::::0;30082:4:::1;::::0;30038:39:::1;::::0;:15:::1;:39::i;:49::-;30020:15;::::0;::::1;:67:::0;30105:28:::1;::::0;160:25:1;;;30113:10:0::1;::::0;30105:28:::1;::::0;148:2:1;133:18;30105:28:0::1;14:177:1::0;31419:665:0;23786:1;24384:7;;:19;;24376:63;;;;-1:-1:-1;;;24376:63:0;;;;;;;:::i;:::-;23786:1;24517:7;:18;;;;31481:21:::1;31505:8;31514:1;31505:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;31560:10:::1;31551:20:::0;;:8:::1;:20:::0;;;;;;31600:11;;31622::::1;:22:::0;;31505:11:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;31551:20:0;;31600:11;;;;31622;31505;31622:22:::1;::::0;31600:11;;31622:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;31758:10:0::1;31741:28;::::0;;;:16:::1;:28;::::0;;;;;31773:15:::1;-1:-1:-1::0;31738:120:0::1;;31843:3;31825:15;;31815:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;31804:42;::::0;;::::1;:::i;:::-;;;31738:120;31885:10;31899:1;31868:28:::0;;;:16:::1;:28;::::0;;;;:32;31911:12;;:55:::1;::::0;-1:-1:-1;;;;;31911:12:0;;::::1;::::0;31958:7;31911:25:::1;:55::i;:::-;31991:1;31977:15:::0;;;32003::::1;::::0;::::1;:19:::0;32038:38:::1;::::0;160:25:1;;;32056:10:0::1;::::0;32038:38:::1;::::0;148:2:1;133:18;32038:38:0::1;;;;;;;-1:-1:-1::0;;23742:1:0;24696:22;;-1:-1:-1;31419:665:0:o;3149:109::-;2424:6;;-1:-1:-1;;;;;2424:6:0;955:10;2424:22;2416:67;;;;-1:-1:-1;;;2416:67:0;;;;;;;:::i;:::-;3222:28:::1;3241:8;3222:18;:28::i;27150:724::-:0;27211:7;27231:21;27255:8;27264:1;27255:11;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;27301:15:0;;;;:8;:15;;;;;;;27330:24;27255:11;;;;;;;27330:24;;;;27255:11;;-1:-1:-1;27358:8:0;27330:36;27327:75;;;-1:-1:-1;27389:1:0;;27150:724;-1:-1:-1;;;27150:724:0:o;27327:75::-;27440:22;;;;;27492:11;;27536:24;;;;27518:15;:42;:59;;;;-1:-1:-1;27564:13:0;;;27518:59;27514:270;;;27594:19;27616:63;27663:15;;27616:42;27642:4;:15;;;27616:21;:19;:21::i;:::-;:25;;:42::i;:63::-;27594:85;-1:-1:-1;27714:58:0;27736:35;27762:8;27736:21;27594:85;27752:4;27736:15;:21::i;:35::-;27714:17;;:21;:58::i;:::-;27694:78;;27579:205;27514:270;27801:65;27850:4;:15;;;27801:44;27840:4;27801:34;27817:17;27801:4;:11;;;:15;;:34;;;;:::i;:65::-;27794:72;27150:724;-1:-1:-1;;;;;;27150:724:0:o;32955:172::-;2424:6;;-1:-1:-1;;;;;2424:6:0;955:10;2424:22;2416:67;;;;-1:-1:-1;;;2416:67:0;;;;;;;:::i;:::-;33038:5:::1;33028:6;:15;;33020:52;;;::::0;-1:-1:-1;;;33020:52:0;;5829:2:1;33020:52:0::1;::::0;::::1;5811:21:1::0;5868:2;5848:18;;;5841:30;5907:26;5887:18;;;5880:54;5951:18;;33020:52:0::1;5627:348:1::0;33020:52:0::1;33083:13;33094:1;33083:10;:13::i;:::-;33107:3;:12:::0;32955:172::o;13253:211::-;13397:58;;-1:-1:-1;;;;;6172:32:1;;13397:58:0;;;6154:51:1;6221:18;;;6214:34;;;13370:86:0;;13390:5;;-1:-1:-1;;;13420:23:0;6127:18:1;;13397:58:0;;;;-1:-1:-1;;13397:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;13397:58:0;-1:-1:-1;;;;;;13397:58:0;;;;;;;;;;13370:19;:86::i;:::-;13253:211;;;:::o;27950:600::-;28004:21;28028:8;28037:4;28028:14;;;;;;;;:::i;:::-;;;;;;;;;;;28004:38;;28076:4;:24;;;28057:15;:43;28053:82;;28117:7;27950:600;:::o;28053:82::-;28164:11;;28190:13;28186:109;;-1:-1:-1;28247:15:0;28220:24;;;;:42;-1:-1:-1;27950:600:0:o;28186:109::-;28305:19;28327:63;28374:15;;28327:42;28353:4;:15;;;28327:21;:19;:21::i;:63::-;28305:85;-1:-1:-1;28426:63:0;28453:35;28479:8;28453:21;28305:85;28469:4;28453:15;:21::i;:35::-;28426:22;;;;;:26;:63::i;:::-;28401:22;;;:88;-1:-1:-1;;28527:15:0;28500:24;;;;:42;-1:-1:-1;27950:600:0:o;5828:471::-;5886:7;6131:6;6127:47;;-1:-1:-1;6161:1:0;6154:8;;6127:47;6186:9;6198:5;6202:1;6198;:5;:::i;:::-;6186:17;-1:-1:-1;6231:1:0;6222:5;6226:1;6186:17;6222:5;:::i;:::-;:10;6214:56;;;;-1:-1:-1;;;6214:56:0;;6461:2:1;6214:56:0;;;6443:21:1;6500:2;6480:18;;;6473:30;6539:34;6519:18;;;6512:62;-1:-1:-1;;;6590:18:1;;;6583:31;6631:19;;6214:56:0;6259:397:1;6214:56:0;6290:1;-1:-1:-1;5828:471:0;;;;;:::o;6775:132::-;6833:7;6860:39;6864:1;6867;6860:39;;;;;;;;;;;;;;;;;:3;:39::i;4904:136::-;4962:7;4989:43;4993:1;4996;4989:43;;;;;;;;;;;;;;;;;:3;:43::i;13472:248::-;13643:68;;-1:-1:-1;;;;;6919:15:1;;;13643:68:0;;;6901:34:1;6971:15;;6951:18;;;6944:43;7003:18;;;6996:34;;;13616:96:0;;13636:5;;-1:-1:-1;;;13666:27:0;6836:18:1;;13643:68:0;6661:375:1;13616:96:0;13472:248;;;;:::o;4440:181::-;4498:7;;4530:5;4534:1;4530;:5;:::i;:::-;4518:17;;4559:1;4554;:6;;4546:46;;;;-1:-1:-1;;;4546:46:0;;7243:2:1;4546:46:0;;;7225:21:1;7282:2;7262:18;;;7255:30;7321:29;7301:18;;;7294:57;7368:18;;4546:46:0;7041:351:1;3364:229:0;-1:-1:-1;;;;;3438:22:0;;3430:73;;;;-1:-1:-1;;;3430:73:0;;7599:2:1;3430:73:0;;;7581:21:1;7638:2;7618:18;;;7611:30;7677:34;7657:18;;;7650:62;-1:-1:-1;;;7728:18:1;;;7721:36;7774:19;;3430:73:0;7397:402:1;3430:73:0;3540:6;;;3519:38;;-1:-1:-1;;;;;3519:38:0;;;;3540:6;;;3519:38;;;3568:6;:17;;-1:-1:-1;;;;;;3568:17:0;-1:-1:-1;;;;;3568:17:0;;;;;;;;;;3364:229::o;15788:774::-;16212:23;16238:69;16266:4;16238:69;;;;;;;;;;;;;;;;;16246:5;-1:-1:-1;;;;;16238:27:0;;;:69;;;;;:::i;:::-;16322:17;;16212:95;;-1:-1:-1;16322:21:0;16318:237;;16477:10;16466:30;;;;;;;;;;;;:::i;:::-;16458:85;;;;-1:-1:-1;;;16458:85:0;;8288:2:1;16458:85:0;;;8270:21:1;8327:2;8307:18;;;8300:30;8366:34;8346:18;;;8339:62;-1:-1:-1;;;8417:18:1;;;8410:40;8467:19;;16458:85:0;8086:406:1;7403:312:0;7523:7;7558:12;7551:5;7543:28;;;;-1:-1:-1;;;7543:28:0;;;;;;;;:::i;:::-;-1:-1:-1;7582:9:0;7594:5;7598:1;7594;:5;:::i;:::-;7582:17;7403:312;-1:-1:-1;;;;;7403:312:0:o;5343:226::-;5463:7;5499:12;5491:6;;;;5483:29;;;;-1:-1:-1;;;5483:29:0;;;;;;;;:::i;:::-;-1:-1:-1;5523:9:0;5535:5;5539:1;5535;:5;:::i;20387:230::-;20524:12;20556:53;20579:6;20587:4;20593:1;20596:12;20556:22;:53::i;:::-;20549:60;20387:230;-1:-1:-1;;;;20387:230:0:o;21875:1020::-;22048:12;22081:18;22092:6;22081:10;:18::i;:::-;22073:60;;;;-1:-1:-1;;;22073:60:0;;9350:2:1;22073:60:0;;;9332:21:1;9389:2;9369:18;;;9362:30;9428:31;9408:18;;;9401:59;9477:18;;22073:60:0;9148:353:1;22073:60:0;22207:12;22221:23;22248:6;-1:-1:-1;;;;;22248:11:0;22267:8;22277:4;22248:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22206:76;;;;22297:7;22293:595;;;22328:10;-1:-1:-1;22321:17:0;;-1:-1:-1;22321:17:0;22293:595;22442:17;;:21;22438:439;;22705:10;22699:17;22766:15;22753:10;22749:2;22745:19;22738:44;22438:439;22848:12;22841:20;;-1:-1:-1;;;22841:20:0;;;;;;;;:::i;17250:641::-;17310:4;17791:20;;17621:66;17840:23;;;;;;:42;;-1:-1:-1;;17867:15:0;;;17832:51;-1:-1:-1;;17250:641:0:o;196:180:1:-;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:1;;196:180;-1:-1:-1;196:180:1:o;817:286::-;876:6;929:2;917:9;908:7;904:23;900:32;897:52;;;945:1;942;935:12;897:52;971:23;;-1:-1:-1;;;;;1023:31:1;;1013:42;;1003:70;;1069:1;1066;1059:12;1791:356;1993:2;1975:21;;;2012:18;;;2005:30;2071:34;2066:2;2051:18;;2044:62;2138:2;2123:18;;1791:356::o;2152:184::-;2222:6;2275:2;2263:9;2254:7;2250:23;2246:32;2243:52;;;2291:1;2288;2281:12;2243:52;-1:-1:-1;2314:16:1;;2152:184;-1:-1:-1;2152:184:1:o;2341:127::-;2402:10;2397:3;2393:20;2390:1;2383:31;2433:4;2430:1;2423:15;2457:4;2454:1;2447:15;2473:125;2513:4;2541:1;2538;2535:8;2532:34;;;2546:18;;:::i;:::-;-1:-1:-1;2583:9:1;;2473:125::o;2961:355::-;3163:2;3145:21;;;3202:2;3182:18;;;3175:30;3241:33;3236:2;3221:18;;3214:61;3307:2;3292:18;;2961:355::o;3682:127::-;3743:10;3738:3;3734:20;3731:1;3724:31;3774:4;3771:1;3764:15;3798:4;3795:1;3788:15;3814:428;4016:2;3998:21;;;4055:2;4035:18;;;4028:30;;;4094:34;4074:18;;;4067:62;4165:34;4160:2;4145:18;;4138:62;4232:3;4217:19;;3814:428::o;4247:128::-;4287:3;4318:1;4314:6;4311:1;4308:13;4305:39;;;4324:18;;:::i;:::-;-1:-1:-1;4360:9:1;;4247:128::o;4380:135::-;4419:3;-1:-1:-1;;4440:17:1;;4437:43;;;4460:18;;:::i;:::-;-1:-1:-1;4507:1:1;4496:13;;4380:135::o;5232:168::-;5272:7;5338:1;5334;5330:6;5326:14;5323:1;5320:21;5315:1;5308:9;5301:17;5297:45;5294:71;;;5345:18;;:::i;:::-;-1:-1:-1;5385:9:1;;5232:168::o;5405:217::-;5445:1;5471;5461:132;;5515:10;5510:3;5506:20;5503:1;5496:31;5550:4;5547:1;5540:15;5578:4;5575:1;5568:15;5461:132;-1:-1:-1;5607:9:1;;5405:217::o;7804:277::-;7871:6;7924:2;7912:9;7903:7;7899:23;7895:32;7892:52;;;7940:1;7937;7930:12;7892:52;7972:9;7966:16;8025:5;8018:13;8011:21;8004:5;8001:32;7991:60;;8047:1;8044;8037:12;8497:258;8569:1;8579:113;8593:6;8590:1;8587:13;8579:113;;;8669:11;;;8663:18;8650:11;;;8643:39;8615:2;8608:10;8579:113;;;8710:6;8707:1;8704:13;8701:48;;;-1:-1:-1;;8745:1:1;8727:16;;8720:27;8497:258::o;8760:383::-;8909:2;8898:9;8891:21;8872:4;8941:6;8935:13;8984:6;8979:2;8968:9;8964:18;8957:34;9000:66;9059:6;9054:2;9043:9;9039:18;9034:2;9026:6;9022:15;9000:66;:::i;:::-;9127:2;9106:15;-1:-1:-1;;9102:29:1;9087:45;;;;9134:2;9083:54;;8760:383;-1:-1:-1;;8760:383:1:o;9506:274::-;9635:3;9673:6;9667:13;9689:53;9735:6;9730:3;9723:4;9715:6;9711:17;9689:53;:::i;:::-;9758:16;;;;;9506:274;-1:-1:-1;;9506:274:1:o
Swarm Source
ipfs://450548fefce8f4e29babc0edc69436ead306a012adc8641597da37df4e6d5ead
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 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.