More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 197 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 20178745 | 11 days ago | IN | 0 ETH | 0.00050111 | ||||
Deposit | 20178740 | 11 days ago | IN | 0 ETH | 0.00045481 | ||||
Withdraw | 20081448 | 25 days ago | IN | 0 ETH | 0.00104361 | ||||
Withdraw | 20039650 | 31 days ago | IN | 0 ETH | 0.00091477 | ||||
Deposit | 20039648 | 31 days ago | IN | 0 ETH | 0.000875 | ||||
Withdraw | 20039646 | 31 days ago | IN | 0 ETH | 0.00116494 | ||||
Deposit | 20039645 | 31 days ago | IN | 0 ETH | 0.00084926 | ||||
Withdraw | 20031362 | 32 days ago | IN | 0 ETH | 0.00114371 | ||||
Deposit | 20031359 | 32 days ago | IN | 0 ETH | 0.00117881 | ||||
Withdraw | 20028123 | 32 days ago | IN | 0 ETH | 0.00164796 | ||||
Withdraw | 20028107 | 32 days ago | IN | 0 ETH | 0.00192533 | ||||
Emergency Withdr... | 20028081 | 32 days ago | IN | 0 ETH | 0.00156716 | ||||
Withdraw | 20013166 | 34 days ago | IN | 0 ETH | 0.00112015 | ||||
Deposit | 19980615 | 39 days ago | IN | 0 ETH | 0.00081237 | ||||
Deposit | 19980611 | 39 days ago | IN | 0 ETH | 0.00073587 | ||||
Withdraw | 19973839 | 40 days ago | IN | 0 ETH | 0.00149014 | ||||
Deposit | 19973837 | 40 days ago | IN | 0 ETH | 0.00178465 | ||||
Deposit | 19961199 | 42 days ago | IN | 0 ETH | 0.00136142 | ||||
Deposit | 19961194 | 42 days ago | IN | 0 ETH | 0.001422 | ||||
Deposit | 19961187 | 42 days ago | IN | 0 ETH | 0.00108317 | ||||
Deposit | 19960786 | 42 days ago | IN | 0 ETH | 0.00208156 | ||||
Deposit | 19940503 | 45 days ago | IN | 0 ETH | 0.00129898 | ||||
Deposit | 19940499 | 45 days ago | IN | 0 ETH | 0.00088299 | ||||
Deposit | 19897473 | 51 days ago | IN | 0 ETH | 0.00039081 | ||||
Deposit | 19896911 | 51 days ago | IN | 0 ETH | 0.00031389 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
OlympiaaiStake3
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-21 */ //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 OlympiaaiStake3 is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeBEP20 for IBEP20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IBEP20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Tokens to distribute per block. uint256 lastRewardTimestamp; // Last block number that Tokens distribution occurs. uint256 accTokensPerShare; // Accumulated Tokens per share, times 1e12. See below. } IBEP20 public immutable stakingToken; IBEP20 public immutable rewardToken; mapping(address => uint256) public holderUnlockTime; uint256 public totalStaked; uint256 public apy; uint256 public lockDuration; uint256 public exitPenaltyPerc; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(address => UserInfo) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 private totalAllocPoint = 0; event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); constructor() { stakingToken = IBEP20(0x9AB51734FC5D5fDD8abB58941840a5Df1e3F3a99); rewardToken = stakingToken; apy = 125; lockDuration = 3 days; exitPenaltyPerc = 5; // staking pool poolInfo.push( PoolInfo({ lpToken: stakingToken, allocPoint: 1000, lastRewardTimestamp: 2199615, accTokensPerShare: 0 }) ); totalAllocPoint = 1000; } function stopReward() external onlyOwner { updatePool(0); apy = 0; } function startReward() external onlyOwner { require( poolInfo[0].lastRewardTimestamp == 21799615, "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 == 21799615) { 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 A." ); 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 B." ); rewardToken.safeTransfer(address(msg.sender), pending); } if (_amount > 0) { user.amount = 0; totalStaked -= _amount; pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); if (user.amount > 0) { holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } else { holderUnlockTime[msg.sender] = 0; } emit Withdraw(msg.sender, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external nonReentrant { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; totalStaked -= _amount; // exit penalty for early unstakers, penalty held on contract as rewards. if (holderUnlockTime[msg.sender] >= block.timestamp) { _amount -= (_amount * exitPenaltyPerc) / 100; } holderUnlockTime[msg.sender] = 0; pool.lpToken.safeTransfer(address(msg.sender), _amount); user.amount = 0; user.rewardDebt = 0; emit EmergencyWithdraw(msg.sender, _amount); } // Withdraw reward. EMERGENCY ONLY. This allows the owner to migrate rewards to a new staking pool since we are not minting new tokens. function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { require( _amount <= rewardToken.balanceOf(address(this)) - totalStaked, "not enough tokens to take out" ); rewardToken.safeTransfer(address(msg.sender), _amount); } function calculateNewRewards() public view returns (uint256) { PoolInfo storage pool = poolInfo[0]; if (pool.lastRewardTimestamp > block.timestamp) { return 0; } return ((((block.timestamp - pool.lastRewardTimestamp) * totalStaked) * apy) / 100 / 365 days); } function rewardsRemaining() public view returns (uint256) { return rewardToken.balanceOf(address(this)) - totalStaked; } function updateApy(uint256 newApy) external onlyOwner { require(newApy <= 10000, "APY must be below 10000%"); updatePool(0); apy = newApy; } function updatelockduration(uint256 newlockDuration) external onlyOwner { require(newlockDuration <= 2419200, "Duration must be below 2 weeks"); lockDuration = newlockDuration; } function updateExitPenalty(uint256 newPenaltyPerc) external onlyOwner { require(newPenaltyPerc <= 20, "May not set higher than 20%"); exitPenaltyPerc = newPenaltyPerc; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"apy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateNewRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exitPenaltyPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBEP20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accTokensPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newApy","type":"uint256"}],"name":"updateApy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPenaltyPerc","type":"uint256"}],"name":"updateExitPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newlockDuration","type":"uint256"}],"name":"updatelockduration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052600060095534801561001557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001808055739ab51734fc5d5fdd8abb58941840a5df1e3f3a99608081815260a0829052607d60049081556203f48060059081556006556040805192830181529282526103e8602083018181526221903f94840194855260006060850181815260078054988901815590915293517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889690930295860180546001600160a01b0319166001600160a01b039094169390931790925590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68985015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a840155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b9092019190915560095560805160a0516119cf6101cb6000396000818161035101528181610415015281816104ee015281816106bb0152818161096f0152610d190152600061024801526119cf6000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806380dc0672116100de578063a913a5f711610097578063f2fde38b11610071578063f2fde38b14610326578063f40f0f5214610339578063f7c618c11461034c578063ff16ef391461037357600080fd5b8063a913a5f7146102eb578063b6b55f251461030b578063db2e21bc1461031e57600080fd5b806380dc06721461029b578063817b1cd2146102a35780638c09c135146102ac5780638da5cb5b146102bf5780638e0b0198146102d0578063999e2f75146102e357600080fd5b8063630b5ba111610130578063630b5ba114610233578063715018a61461023b57806372f702f314610243578063746c8ae11461028257806378c196f31461028a5780637b280def1461029257600080fd5b806304554443146101785780631526fe27146101945780631959a002146101d15780633279beab1461020d5780633bcfc4b8146102225780633ccfd60b1461022b575b600080fd5b61018160055481565b6040519081526020015b60405180910390f35b6101a76101a236600461177e565b610386565b604080516001600160a01b039095168552602085019390935291830152606082015260800161018b565b6101f86101df366004611797565b6008602052600090815260409020805460019091015482565b6040805192835260208301919091520161018b565b61022061021b36600461177e565b6103ca565b005b61018160045481565b610220610518565b6102206107b4565b610220610809565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018b565b61022061087d565b61018161094b565b61018160065481565b6102206109e9565b61018160035481565b6102206102ba36600461177e565b610a24565b6000546001600160a01b031661026a565b6102206102de36600461177e565b610aa6565b610181610b26565b6101816102f9366004611797565b60026020526000908152604090205481565b61022061031936600461177e565b610bac565b610220610ec4565b610220610334366004611797565b610ff0565b610181610347366004611797565b611023565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b61022061038136600461177e565b611112565b6007818154811061039657600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146103fd5760405162461bcd60e51b81526004016103f4906117c0565b60405180910390fd5b6003546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610464573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048891906117f5565b6104929190611824565b8111156104e15760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f757400000060448201526064016103f4565b6105156001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338361119d565b50565b6002600154141561053b5760405162461bcd60e51b81526004016103f49061183b565b6002600181905533600090815260209190915260409020544210156105a25760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c7960448201526064016103f4565b600060076000815481106105b8576105b8611872565b60009182526020808320338452600890915260408320805460049093029091019350916105e490611205565b600061061e836001015461061864e8d4a510006106128860030154886000015461129890919063ffffffff16565b90611320565b90611362565b905080156106e25761062e61094b565b8111156106ae5760405162461bcd60e51b815260206004820152604260248201527f43616e6e6f74207769746864726177206f746865722070656f706c652773207360448201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e20606482015261211760f11b608482015260a4016103f4565b6106e26001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338361119d565b811561071a576000808455600380548492906106ff908490611824565b9091555050835461071a906001600160a01b0316338461119d565b600384015483546107359164e8d4a510009161061291611298565b60018401558254156107635760055461074e9042611888565b33600090815260026020526040902055610774565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b031633146107de5760405162461bcd60e51b81526004016103f4906117c0565b60075460005b81811015610805576107f581611205565b6107fe816118a0565b90506107e4565b5050565b6000546001600160a01b031633146108335760405162461bcd60e51b81526004016103f4906117c0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146108a75760405162461bcd60e51b81526004016103f4906117c0565b60076000815481106108bb576108bb611872565b90600052602060002090600402016002015463014ca2bf1461091f5760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e6365000000000060448201526064016103f4565b42600760008154811061093457610934611872565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156109b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109da91906117f5565b6109e49190611824565b905090565b6000546001600160a01b03163314610a135760405162461bcd60e51b81526004016103f4906117c0565b610a1d6000611205565b6000600455565b6000546001600160a01b03163314610a4e5760405162461bcd60e51b81526004016103f4906117c0565b6224ea00811115610aa15760405162461bcd60e51b815260206004820152601e60248201527f4475726174696f6e206d7573742062652062656c6f772032207765656b73000060448201526064016103f4565b600555565b6000546001600160a01b03163314610ad05760405162461bcd60e51b81526004016103f4906117c0565b6014811115610b215760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e20323025000000000060448201526064016103f4565b600655565b6000806007600081548110610b3d57610b3d611872565b906000526020600020906004020190504281600201541115610b6157600091505090565b6301e133806064600454600354846002015442610b7e9190611824565b610b8891906118bb565b610b9291906118bb565b610b9c91906118da565b610ba691906118da565b91505090565b60026001541415610bcf5760405162461bcd60e51b81526004016103f49061183b565b600260018190553360009081526020919091526040902054610c0957600554610bf89042611888565b336000908152600260205260409020555b60006007600081548110610c1f57610c1f611872565b60009182526020808320338452600890915260408320600490920201925090610c4790611205565b805415610d42576000610c7c826001015461061864e8d4a510006106128760030154876000015461129890919063ffffffff16565b90508015610d4057610c8c61094b565b811115610d0c5760405162461bcd60e51b815260206004820152604260248201527f43616e6e6f74207769746864726177206f746865722070656f706c652773207360448201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e20606482015261209760f11b608482015260a4016103f4565b610d406001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338361119d565b505b60008315610e725782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db691906117f5565b8454909150610dd0906001600160a01b03163330886113a4565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b91906117f5565b610e459190611824565b8354909250610e5490836113e2565b835560038054839190600090610e6b908490611888565b9091555050505b60038301548254610e8d9164e8d4a510009161061291611298565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020016107a2565b60026001541415610ee75760405162461bcd60e51b81526004016103f49061183b565b600260018190555060006007600081548110610f0557610f05611872565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610f3e908490611824565b9091555050336000908152600260205260409020544211610f8057606460065482610f6991906118bb565b610f7391906118da565b610f7d9082611824565b90505b336000818152600260205260408120558354610fa8916001600160a01b03909116908361119d565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b0316331461101a5760405162461bcd60e51b81526004016103f4906117c0565b61051581611441565b600080600760008154811061103a5761103a611872565b600091825260208083206001600160a01b038716845260089091526040909220600260049092029092019081015490925063014ca2bf1415611080575060009392505050565b600380830154905460028401544211801561109a57508015155b156110e05760006110bd60095461061287600101546110b7610b26565b90611298565b90506110dc6110d5836106128464e8d4a51000611298565b84906113e2565b9250505b611108836001015461061864e8d4a5100061061286886000015461129890919063ffffffff16565b9695505050505050565b6000546001600160a01b0316331461113c5760405162461bcd60e51b81526004016103f4906117c0565b61271081111561118e5760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f7720313030303025000000000000000060448201526064016103f4565b6111986000611205565b600455565b6040516001600160a01b03831660248201526044810182905261120090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611501565b505050565b60006007828154811061121a5761121a611872565b9060005260206000209060040201905080600201544211611239575050565b6003548061124c57504260029091015550565b600061126460095461061285600101546110b7610b26565b905061128761127c836106128464e8d4a51000611298565b6003850154906113e2565b600384015550504260029091015550565b6000826112a75750600061131a565b60006112b383856118bb565b9050826112c085836118da565b146113175760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016103f4565b90505b92915050565b600061131783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506115d3565b600061131783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061160a565b6040516001600160a01b03808516602483015283166044820152606481018290526113dc9085906323b872dd60e01b906084016111c9565b50505050565b6000806113ef8385611888565b9050838110156113175760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103f4565b6001600160a01b0381166114a65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611556826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661163b9092919063ffffffff16565b805190915015611200578080602001905181019061157491906118fc565b6112005760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f4565b600081836115f45760405162461bcd60e51b81526004016103f4919061194a565b50600061160184866118da565b95945050505050565b6000818484111561162e5760405162461bcd60e51b81526004016103f4919061194a565b5060006116018486611824565b606061164a8484600085611652565b949350505050565b606061165d85611745565b6116a95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f4565b600080866001600160a01b031685876040516116c5919061197d565b60006040518083038185875af1925050503d8060008114611702576040519150601f19603f3d011682016040523d82523d6000602084013e611707565b606091505b5091509150811561171b57915061164a9050565b80511561172b5780518082602001fd5b8360405162461bcd60e51b81526004016103f4919061194a565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061164a575050151592915050565b60006020828403121561179057600080fd5b5035919050565b6000602082840312156117a957600080fd5b81356001600160a01b038116811461131757600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561180757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156118365761183661180e565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000821982111561189b5761189b61180e565b500190565b60006000198214156118b4576118b461180e565b5060010190565b60008160001904831182151516156118d5576118d561180e565b500290565b6000826118f757634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561190e57600080fd5b8151801515811461131757600080fd5b60005b83811015611939578181015183820152602001611921565b838111156113dc5750506000910152565b602081526000825180602084015261196981604085016020870161191e565b601f01601f19169190910160400192915050565b6000825161198f81846020870161191e565b919091019291505056fea2646970667358221220199fbeb6cf820c20295a96b7e8fef74fc00f92b3455f05306cba93ec2ebcc74a64736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806380dc0672116100de578063a913a5f711610097578063f2fde38b11610071578063f2fde38b14610326578063f40f0f5214610339578063f7c618c11461034c578063ff16ef391461037357600080fd5b8063a913a5f7146102eb578063b6b55f251461030b578063db2e21bc1461031e57600080fd5b806380dc06721461029b578063817b1cd2146102a35780638c09c135146102ac5780638da5cb5b146102bf5780638e0b0198146102d0578063999e2f75146102e357600080fd5b8063630b5ba111610130578063630b5ba114610233578063715018a61461023b57806372f702f314610243578063746c8ae11461028257806378c196f31461028a5780637b280def1461029257600080fd5b806304554443146101785780631526fe27146101945780631959a002146101d15780633279beab1461020d5780633bcfc4b8146102225780633ccfd60b1461022b575b600080fd5b61018160055481565b6040519081526020015b60405180910390f35b6101a76101a236600461177e565b610386565b604080516001600160a01b039095168552602085019390935291830152606082015260800161018b565b6101f86101df366004611797565b6008602052600090815260409020805460019091015482565b6040805192835260208301919091520161018b565b61022061021b36600461177e565b6103ca565b005b61018160045481565b610220610518565b6102206107b4565b610220610809565b61026a7f0000000000000000000000009ab51734fc5d5fdd8abb58941840a5df1e3f3a9981565b6040516001600160a01b03909116815260200161018b565b61022061087d565b61018161094b565b61018160065481565b6102206109e9565b61018160035481565b6102206102ba36600461177e565b610a24565b6000546001600160a01b031661026a565b6102206102de36600461177e565b610aa6565b610181610b26565b6101816102f9366004611797565b60026020526000908152604090205481565b61022061031936600461177e565b610bac565b610220610ec4565b610220610334366004611797565b610ff0565b610181610347366004611797565b611023565b61026a7f0000000000000000000000009ab51734fc5d5fdd8abb58941840a5df1e3f3a9981565b61022061038136600461177e565b611112565b6007818154811061039657600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146103fd5760405162461bcd60e51b81526004016103f4906117c0565b60405180910390fd5b6003546040516370a0823160e01b81523060048201527f0000000000000000000000009ab51734fc5d5fdd8abb58941840a5df1e3f3a996001600160a01b0316906370a0823190602401602060405180830381865afa158015610464573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048891906117f5565b6104929190611824565b8111156104e15760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f757400000060448201526064016103f4565b6105156001600160a01b037f0000000000000000000000009ab51734fc5d5fdd8abb58941840a5df1e3f3a9916338361119d565b50565b6002600154141561053b5760405162461bcd60e51b81526004016103f49061183b565b6002600181905533600090815260209190915260409020544210156105a25760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c7960448201526064016103f4565b600060076000815481106105b8576105b8611872565b60009182526020808320338452600890915260408320805460049093029091019350916105e490611205565b600061061e836001015461061864e8d4a510006106128860030154886000015461129890919063ffffffff16565b90611320565b90611362565b905080156106e25761062e61094b565b8111156106ae5760405162461bcd60e51b815260206004820152604260248201527f43616e6e6f74207769746864726177206f746865722070656f706c652773207360448201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e20606482015261211760f11b608482015260a4016103f4565b6106e26001600160a01b037f0000000000000000000000009ab51734fc5d5fdd8abb58941840a5df1e3f3a9916338361119d565b811561071a576000808455600380548492906106ff908490611824565b9091555050835461071a906001600160a01b0316338461119d565b600384015483546107359164e8d4a510009161061291611298565b60018401558254156107635760055461074e9042611888565b33600090815260026020526040902055610774565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b031633146107de5760405162461bcd60e51b81526004016103f4906117c0565b60075460005b81811015610805576107f581611205565b6107fe816118a0565b90506107e4565b5050565b6000546001600160a01b031633146108335760405162461bcd60e51b81526004016103f4906117c0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146108a75760405162461bcd60e51b81526004016103f4906117c0565b60076000815481106108bb576108bb611872565b90600052602060002090600402016002015463014ca2bf1461091f5760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e6365000000000060448201526064016103f4565b42600760008154811061093457610934611872565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f0000000000000000000000009ab51734fc5d5fdd8abb58941840a5df1e3f3a9916906370a0823190602401602060405180830381865afa1580156109b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109da91906117f5565b6109e49190611824565b905090565b6000546001600160a01b03163314610a135760405162461bcd60e51b81526004016103f4906117c0565b610a1d6000611205565b6000600455565b6000546001600160a01b03163314610a4e5760405162461bcd60e51b81526004016103f4906117c0565b6224ea00811115610aa15760405162461bcd60e51b815260206004820152601e60248201527f4475726174696f6e206d7573742062652062656c6f772032207765656b73000060448201526064016103f4565b600555565b6000546001600160a01b03163314610ad05760405162461bcd60e51b81526004016103f4906117c0565b6014811115610b215760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e20323025000000000060448201526064016103f4565b600655565b6000806007600081548110610b3d57610b3d611872565b906000526020600020906004020190504281600201541115610b6157600091505090565b6301e133806064600454600354846002015442610b7e9190611824565b610b8891906118bb565b610b9291906118bb565b610b9c91906118da565b610ba691906118da565b91505090565b60026001541415610bcf5760405162461bcd60e51b81526004016103f49061183b565b600260018190553360009081526020919091526040902054610c0957600554610bf89042611888565b336000908152600260205260409020555b60006007600081548110610c1f57610c1f611872565b60009182526020808320338452600890915260408320600490920201925090610c4790611205565b805415610d42576000610c7c826001015461061864e8d4a510006106128760030154876000015461129890919063ffffffff16565b90508015610d4057610c8c61094b565b811115610d0c5760405162461bcd60e51b815260206004820152604260248201527f43616e6e6f74207769746864726177206f746865722070656f706c652773207360448201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e20606482015261209760f11b608482015260a4016103f4565b610d406001600160a01b037f0000000000000000000000009ab51734fc5d5fdd8abb58941840a5df1e3f3a9916338361119d565b505b60008315610e725782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db691906117f5565b8454909150610dd0906001600160a01b03163330886113a4565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b91906117f5565b610e459190611824565b8354909250610e5490836113e2565b835560038054839190600090610e6b908490611888565b9091555050505b60038301548254610e8d9164e8d4a510009161061291611298565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020016107a2565b60026001541415610ee75760405162461bcd60e51b81526004016103f49061183b565b600260018190555060006007600081548110610f0557610f05611872565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610f3e908490611824565b9091555050336000908152600260205260409020544211610f8057606460065482610f6991906118bb565b610f7391906118da565b610f7d9082611824565b90505b336000818152600260205260408120558354610fa8916001600160a01b03909116908361119d565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b0316331461101a5760405162461bcd60e51b81526004016103f4906117c0565b61051581611441565b600080600760008154811061103a5761103a611872565b600091825260208083206001600160a01b038716845260089091526040909220600260049092029092019081015490925063014ca2bf1415611080575060009392505050565b600380830154905460028401544211801561109a57508015155b156110e05760006110bd60095461061287600101546110b7610b26565b90611298565b90506110dc6110d5836106128464e8d4a51000611298565b84906113e2565b9250505b611108836001015461061864e8d4a5100061061286886000015461129890919063ffffffff16565b9695505050505050565b6000546001600160a01b0316331461113c5760405162461bcd60e51b81526004016103f4906117c0565b61271081111561118e5760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f7720313030303025000000000000000060448201526064016103f4565b6111986000611205565b600455565b6040516001600160a01b03831660248201526044810182905261120090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611501565b505050565b60006007828154811061121a5761121a611872565b9060005260206000209060040201905080600201544211611239575050565b6003548061124c57504260029091015550565b600061126460095461061285600101546110b7610b26565b905061128761127c836106128464e8d4a51000611298565b6003850154906113e2565b600384015550504260029091015550565b6000826112a75750600061131a565b60006112b383856118bb565b9050826112c085836118da565b146113175760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016103f4565b90505b92915050565b600061131783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506115d3565b600061131783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061160a565b6040516001600160a01b03808516602483015283166044820152606481018290526113dc9085906323b872dd60e01b906084016111c9565b50505050565b6000806113ef8385611888565b9050838110156113175760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103f4565b6001600160a01b0381166114a65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611556826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661163b9092919063ffffffff16565b805190915015611200578080602001905181019061157491906118fc565b6112005760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f4565b600081836115f45760405162461bcd60e51b81526004016103f4919061194a565b50600061160184866118da565b95945050505050565b6000818484111561162e5760405162461bcd60e51b81526004016103f4919061194a565b5060006116018486611824565b606061164a8484600085611652565b949350505050565b606061165d85611745565b6116a95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f4565b600080866001600160a01b031685876040516116c5919061197d565b60006040518083038185875af1925050503d8060008114611702576040519150601f19603f3d011682016040523d82523d6000602084013e611707565b606091505b5091509150811561171b57915061164a9050565b80511561172b5780518082602001fd5b8360405162461bcd60e51b81526004016103f4919061194a565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061164a575050151592915050565b60006020828403121561179057600080fd5b5035919050565b6000602082840312156117a957600080fd5b81356001600160a01b038116811461131757600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561180757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156118365761183661180e565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000821982111561189b5761189b61180e565b500190565b60006000198214156118b4576118b461180e565b5060010190565b60008160001904831182151516156118d5576118d561180e565b500290565b6000826118f757634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561190e57600080fd5b8151801515811461131757600080fd5b60005b83811015611939578181015183820152602001611921565b838111156113dc5750506000910152565b602081526000825180602084015261196981604085016020870161191e565b601f01601f19169190910160400192915050565b6000825161198f81846020870161191e565b919091019291505056fea2646970667358221220199fbeb6cf820c20295a96b7e8fef74fc00f92b3455f05306cba93ec2ebcc74a64736f6c634300080b0033
Deployed Bytecode Sourcemap
25489:9369:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26432:27;;;;;;;;;160:25:1;;;148:2;133:18;26432:27:0;;;;;;;;26532: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;26532:26:0;381:431:1;26614:44:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;1282:25:1;;;1338:2;1323:18;;1316:34;;;;1255:18;26614:44:0;1108:248:1;33471:293:0;;;;;;:::i;:::-;;:::i;:::-;;26407:18;;;;;;31331:1251;;;:::i;29528:190::-;;;:::i;2840:140::-;;;:::i;26229:36::-;;;;;;;;-1:-1:-1;;;;;1539:32:1;;;1521:51;;1509:2;1494:18;26229:36:0;1361:217:1;27608:241:0;;;:::i;34132:134::-;;;:::i;26466:30::-;;;;;;27509:91;;;:::i;26374:26::-;;;;;;34454:201;;;;;;:::i;:::-;;:::i;2198:79::-;2236:7;2263:6;-1:-1:-1;;;;;2263:6:0;2198:79;;34663:192;;;;;;:::i;:::-;;:::i;33772:352::-;;;:::i;26314:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;29755:1520;;;;;;:::i;:::-;;:::i;32653:669::-;;;:::i;3135:109::-;;;;;;:::i;:::-;;:::i;27914:807::-;;;;;;:::i;:::-;;:::i;26272:35::-;;;;;34274:172;;;;;;:::i;:::-;;:::i;26532:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26532:26:0;;;;-1:-1:-1;26532:26:0;;;:::o;33471:293::-;2410:6;;-1:-1:-1;;;;;2410:6:0;916:10;2410:22;2402:67;;;;-1:-1:-1;;;2402:67:0;;;;;;;:::i;:::-;;;;;;;;;33623:11:::1;::::0;33584:36:::1;::::0;-1:-1:-1;;;33584:36:0;;33614:4:::1;33584:36;::::0;::::1;1521:51:1::0;33584:11:0::1;-1:-1:-1::0;;;;;33584:21:0::1;::::0;::::1;::::0;1494:18:1;;33584:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;33573:7;:61;;33551:140;;;::::0;-1:-1:-1;;;33551:140:0;;2805:2:1;33551:140:0::1;::::0;::::1;2787:21:1::0;2844:2;2824:18;;;2817:30;2883:31;2863:18;;;2856:59;2932:18;;33551:140:0::1;2603:353:1::0;33551:140:0::1;33702:54;-1:-1:-1::0;;;;;33702:11:0::1;:24;33735:10;33748:7:::0;33702:24:::1;:54::i;:::-;33471:293:::0;:::o;31331:1251::-;24542:1;25140:7;;:19;;25132:63;;;;-1:-1:-1;;;25132:63:0;;;;;;;:::i;:::-;24542:1;25273:7;:18;;;31421:10:::1;31404:28;::::0;;;::::1;::::0;;;;;;;;31436:15:::1;-1:-1:-1::0;31404:47:0::1;31382:129;;;::::0;-1:-1:-1;;;31382:129:0;;3523:2:1;31382:129:0::1;::::0;::::1;3505:21:1::0;;;3542:18;;;3535:30;3601:34;3581:18;;;3574:62;3653:18;;31382:129:0::1;3321:356:1::0;31382:129:0::1;31524:21;31548:8;31557:1;31548:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;31603:10:::1;31594:20:::0;;:8:::1;:20:::0;;;;;;31645:11;;31548::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;31594:20:0;31667:13:::1;::::0;:10:::1;:13::i;:::-;31691:15;31709:94;31777:4;:15;;;31709:49;31753:4;31709:39;31725:4;:22;;;31709:4;:11;;;:15;;:39;;;;:::i;:::-;:43:::0;::::1;:49::i;:::-;:53:::0;::::1;:94::i;:::-;31691:112:::0;-1:-1:-1;31818:11:0;;31814:270:::1;;31883:18;:16;:18::i;:::-;31872:7;:29;;31846:157;;;::::0;-1:-1:-1;;;31846:157:0;;4016:2:1;31846:157:0::1;::::0;::::1;3998:21:1::0;4055:2;4035:18;;;4028:30;4094:34;4074:18;;;4067:62;4165:34;4145:18;;;4138:62;-1:-1:-1;;;4216:19:1;;;4209:33;4259:19;;31846:157:0::1;3814:470:1::0;31846:157:0::1;32018:54;-1:-1:-1::0;;;;;32018:11:0::1;:24;32051:10;32064:7:::0;32018:24:::1;:54::i;:::-;32100:11:::0;;32096:166:::1;;32142:1;32128:15:::0;;;32158:11:::1;:22:::0;;32173:7;;32142:1;32158:22:::1;::::0;32173:7;;32158:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;32195:12:0;;:55:::1;::::0;-1:-1:-1;;;;;32195:12:0::1;32229:10;32242:7:::0;32195:25:::1;:55::i;:::-;32308:22;::::0;::::1;::::0;32292:11;;:49:::1;::::0;32336:4:::1;::::0;32292:39:::1;::::0;:15:::1;:39::i;:49::-;32274:15;::::0;::::1;:67:::0;32358:11;;:15;32354:174:::1;;32439:12;::::0;32421:30:::1;::::0;:15:::1;:30;:::i;:::-;32407:10;32390:28;::::0;;;:16:::1;:28;::::0;;;;:61;32354:174:::1;;;32501:10;32515:1;32484:28:::0;;;:16:::1;:28;::::0;;;;:32;32354:174:::1;32545:29;::::0;160:25:1;;;32554:10:0::1;::::0;32545:29:::1;::::0;148:2:1;133:18;32545:29:0::1;;;;;;;;-1:-1:-1::0;;24498:1:0;25452:22;;-1:-1:-1;;31331:1251:0:o;29528:190::-;2410:6;;-1:-1:-1;;;;;2410:6:0;916:10;2410:22;2402:67;;;;-1:-1:-1;;;2402:67:0;;;;;;;:::i;:::-;29600:8:::1;:15:::0;29583:14:::1;29626:85;29654:6;29648:3;:12;29626:85;;;29684:15;29695:3;29684:10;:15::i;:::-;29662:5;::::0;::::1;:::i;:::-;;;29626:85;;;;29572:146;29528:190::o:0;2840:140::-;2410:6;;-1:-1:-1;;;;;2410:6:0;916:10;2410:22;2402:67;;;;-1:-1:-1;;;2402:67:0;;;;;;;:::i;:::-;2939:1:::1;2923:6:::0;;2902:40:::1;::::0;-1:-1:-1;;;;;2923:6:0;;::::1;::::0;2902:40:::1;::::0;2939:1;;2902:40:::1;2970:1;2953:19:::0;;-1:-1:-1;;;;;;2953:19:0::1;::::0;;2840:140::o;27608:241::-;2410:6;;-1:-1:-1;;;;;2410:6:0;916:10;2410:22;2402:67;;;;-1:-1:-1;;;2402:67:0;;;;;;;:::i;:::-;27683:8:::1;27692:1;27683:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;;27718:8;27683:43;27661:120;;;::::0;-1:-1:-1;;;27661:120:0;;4764:2:1;27661:120:0::1;::::0;::::1;4746:21:1::0;4803:2;4783:18;;;4776:30;4842:29;4822:18;;;4815:57;4889:18;;27661:120:0::1;4562:351:1::0;27661:120:0::1;27826:15;27792:8;27801:1;27792:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;:49;;;;27608:241::o:0;34132:134::-;34247:11;;34208:36;;-1:-1:-1;;;34208:36:0;;34238:4;34208:36;;;1521:51:1;34181:7:0;;34247:11;-1:-1:-1;;;;;34208:11:0;:21;;;;1494:18:1;;34208:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;34201:57;;34132:134;:::o;27509:91::-;2410:6;;-1:-1:-1;;;;;2410:6:0;916:10;2410:22;2402:67;;;;-1:-1:-1;;;2402:67:0;;;;;;;:::i;:::-;27561:13:::1;27572:1;27561:10;:13::i;:::-;27591:1;27585:3;:7:::0;27509:91::o;34454:201::-;2410:6;;-1:-1:-1;;;;;2410:6:0;916:10;2410:22;2402:67;;;;-1:-1:-1;;;2402:67:0;;;;;;;:::i;:::-;34564:7:::1;34545:15;:26;;34537:69;;;::::0;-1:-1:-1;;;34537:69:0;;5120:2:1;34537:69:0::1;::::0;::::1;5102:21:1::0;5159:2;5139:18;;;5132:30;5198:32;5178:18;;;5171:60;5248:18;;34537:69:0::1;4918:354:1::0;34537:69:0::1;34617:12;:30:::0;34454:201::o;34663:192::-;2410:6;;-1:-1:-1;;;;;2410:6:0;916:10;2410:22;2402:67;;;;-1:-1:-1;;;2402:67:0;;;;;;;:::i;:::-;34770:2:::1;34752:14;:20;;34744:60;;;::::0;-1:-1:-1;;;34744:60:0;;5479:2:1;34744:60:0::1;::::0;::::1;5461:21:1::0;5518:2;5498:18;;;5491:30;5557:29;5537:18;;;5530:57;5604:18;;34744:60:0::1;5277:351:1::0;34744:60:0::1;34815:15;:32:::0;34663:192::o;33772:352::-;33824:7;33844:21;33868:8;33877:1;33868:11;;;;;;;;:::i;:::-;;;;;;;;;;;33844:35;;33921:15;33894:4;:24;;;:42;33890:83;;;33960:1;33953:8;;;33772:352;:::o;33890:83::-;34107:8;34088:3;34068;;34040:11;;34012:4;:24;;;33994:15;:42;;;;:::i;:::-;33993:58;;;;:::i;:::-;33992:79;;;;:::i;:::-;33991:100;;;;:::i;:::-;:124;;;;:::i;:::-;33983:133;;;33772:352;:::o;29755:1520::-;24542:1;25140:7;;:19;;25132:63;;;;-1:-1:-1;;;25132:63:0;;;;;;;:::i;:::-;24542:1;25273:7;:18;;;29841:10:::1;29824:28;::::0;;;::::1;::::0;;;;;;;;29820:127:::1;;29923:12;::::0;29905:30:::1;::::0;:15:::1;:30;:::i;:::-;29891:10;29874:28;::::0;;;:16:::1;:28;::::0;;;;:61;29820:127:::1;29957:21;29981:8;29990:1;29981:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;30036:10:::1;30027:20:::0;;:8:::1;:20:::0;;;;;;29981:11:::1;::::0;;::::1;;::::0;-1:-1:-1;30027:20:0;30060:13:::1;::::0;:10:::1;:13::i;:::-;30088:11:::0;;:15;30084:516:::1;;30120:15;30138:142;30264:4;:15;;;30138:103;30236:4;30138:75;30190:4;:22;;;30138:4;:29;;;:51;;:75;;;;:::i;:142::-;30120:160:::0;-1:-1:-1;30299:11:0;;30295:294:::1;;30372:18;:16;:18::i;:::-;30361:7;:29;;30331:169;;;::::0;-1:-1:-1;;;30331:169:0;;6230:2:1;30331:169:0::1;::::0;::::1;6212:21:1::0;6269:2;6249:18;;;6242:30;6308:34;6288:18;;;6281:62;6379:34;6359:18;;;6352:62;-1:-1:-1;;;6430:19:1;;;6423:33;6473:19;;30331:169:0::1;6028:470:1::0;30331:169:0::1;30519:54;-1:-1:-1::0;;;;;30519:11:0::1;:24;30552:10;30565:7:::0;30519:24:::1;:54::i;:::-;30105:495;30084:516;30610:25;30654:11:::0;;30650:494:::1;;30707:12:::0;;:37:::1;::::0;-1:-1:-1;;;30707:37:0;;30738:4:::1;30707:37;::::0;::::1;1521:51:1::0;30682:22:0::1;::::0;-1:-1:-1;;;;;30707:12:0::1;::::0;:22:::1;::::0;1494:18:1;;30707:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30759:12:::0;;30682:62;;-1:-1:-1;30759:140:0::1;::::0;-1:-1:-1;;;;;30759:12:0::1;30815:10;30853:4;30877:7:::0;30759:29:::1;:140::i;:::-;30951:12:::0;;:37:::1;::::0;-1:-1:-1;;;30951:37:0;;30982:4:::1;30951:37;::::0;::::1;1521:51:1::0;31008:14:0;;-1:-1:-1;;;;;30951:12:0::1;::::0;:22:::1;::::0;1494:18:1;;30951:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;;;;:::i;:::-;31051:11:::0;;30914:108;;-1:-1:-1;31051:34:0::1;::::0;30914:108;31051:15:::1;:34::i;:::-;31037:48:::0;;31100:11:::1;:32:::0;;31115:17;;31100:11;31037::::1;::::0;31100:32:::1;::::0;31115:17;;31100:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;30650:494:0::1;31188:22;::::0;::::1;::::0;31172:11;;:49:::1;::::0;31216:4:::1;::::0;31172:39:::1;::::0;:15:::1;:39::i;:49::-;31154:15;::::0;::::1;:67:::0;31239:28:::1;::::0;160:25:1;;;31247:10:0::1;::::0;31239:28:::1;::::0;148:2:1;133:18;31239:28:0::1;14:177:1::0;32653:669:0;24542:1;25140:7;;:19;;25132:63;;;;-1:-1:-1;;;25132:63:0;;;;;;;:::i;:::-;24542:1;25273:7;:18;;;;32715:21:::1;32739:8;32748:1;32739:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;32794:10:::1;32785:20:::0;;:8:::1;:20:::0;;;;;;32834:11;;32856::::1;:22:::0;;32739:11:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;32785:20:0;;32834:11;;;;32856;32739;32856:22:::1;::::0;32834:11;;32856:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;32993:10:0::1;32976:28;::::0;;;:16:::1;:28;::::0;;;;;33008:15:::1;-1:-1:-1::0;32972:124:0::1;;33081:3;33062:15;;33052:7;:25;;;;:::i;:::-;33051:33;;;;:::i;:::-;33040:44;::::0;;::::1;:::i;:::-;;;32972:124;33123:10;33137:1;33106:28:::0;;;:16:::1;:28;::::0;;;;:32;33149:12;;:55:::1;::::0;-1:-1:-1;;;;;33149:12:0;;::::1;::::0;33196:7;33149:25:::1;:55::i;:::-;33229:1;33215:15:::0;;;33241::::1;::::0;::::1;:19:::0;33276:38:::1;::::0;160:25:1;;;33294:10:0::1;::::0;33276:38:::1;::::0;148:2:1;133:18;33276:38:0::1;;;;;;;-1:-1:-1::0;;24498:1:0;25452:22;;-1:-1:-1;32653:669:0:o;3135:109::-;2410:6;;-1:-1:-1;;;;;2410:6:0;916:10;2410:22;2402:67;;;;-1:-1:-1;;;2402:67:0;;;;;;;:::i;:::-;3208:28:::1;3227:8;3208:18;:28::i;27914:807::-:0;27975:7;27995:21;28019:8;28028:1;28019:11;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;28065:15:0;;;;:8;:15;;;;;;;28095:24;28019:11;;;;;;;28095:24;;;;28019:11;;-1:-1:-1;28123:8:0;28095:36;28091:77;;;-1:-1:-1;28155:1:0;;27914:807;-1:-1:-1;;;27914:807:0:o;28091:77::-;28206:22;;;;;28258:11;;28302:24;;;;28284:15;:42;:59;;;;-1:-1:-1;28330:13:0;;;28284:59;28280:338;;;28360:19;28382:99;28465:15;;28382:60;28426:4;:15;;;28382:21;:19;:21::i;:::-;:43;;:60::i;:99::-;28360:121;-1:-1:-1;28516:90:0;28556:35;28582:8;28556:21;28360:121;28572:4;28556:15;:21::i;:35::-;28516:17;;:21;:90::i;:::-;28496:110;;28345:273;28280:338;28648:65;28697:4;:15;;;28648:44;28687:4;28648:34;28664:17;28648:4;:11;;;:15;;:34;;;;:::i;:65::-;28628:85;27914:807;-1:-1:-1;;;;;;27914:807:0:o;34274:172::-;2410:6;;-1:-1:-1;;;;;2410:6:0;916:10;2410:22;2402:67;;;;-1:-1:-1;;;2402:67:0;;;;;;;:::i;:::-;34357:5:::1;34347:6;:15;;34339:52;;;::::0;-1:-1:-1;;;34339:52:0;;6705:2:1;34339:52:0::1;::::0;::::1;6687:21:1::0;6744:2;6724:18;;;6717:30;6783:26;6763:18;;;6756:54;6827:18;;34339:52:0::1;6503:348:1::0;34339:52:0::1;34402:13;34413:1;34402:10;:13::i;:::-;34426:3;:12:::0;34274:172::o;13360:214::-;13497:58;;-1:-1:-1;;;;;7048:32:1;;13497:58:0;;;7030:51:1;7097:18;;;7090:34;;;13443:123:0;;13477:5;;-1:-1:-1;;;13520:23:0;7003:18:1;;13497:58:0;;;;-1:-1:-1;;13497:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;13497:58:0;-1:-1:-1;;;;;;13497:58:0;;;;;;;;;;13443:19;:123::i;:::-;13360:214;;;:::o;28797:648::-;28851:21;28875:8;28884:4;28875:14;;;;;;;;:::i;:::-;;;;;;;;;;;28851:38;;28923:4;:24;;;28904:15;:43;28900:82;;28964:7;28797:648;:::o;28900:82::-;29011:11;;29037:13;29033:109;;-1:-1:-1;29094:15:0;29067:24;;;;:42;-1:-1:-1;28797:648:0:o;29033:109::-;29152:19;29174:87;29235:15;;29174:42;29200:4;:15;;;29174:21;:19;:21::i;:87::-;29152:109;-1:-1:-1;29297:87:0;29338:35;29364:8;29338:21;29152:109;29354:4;29338:15;:21::i;:35::-;29297:22;;;;;:26;:87::i;:::-;29272:22;;;:112;-1:-1:-1;;29422:15:0;29395:24;;;;:42;-1:-1:-1;28797:648:0:o;5851:471::-;5909:7;6154:6;6150:47;;-1:-1:-1;6184:1:0;6177:8;;6150:47;6209:9;6221:5;6225:1;6221;:5;:::i;:::-;6209:17;-1:-1:-1;6254:1:0;6245:5;6249:1;6209:17;6245:5;:::i;:::-;:10;6237:56;;;;-1:-1:-1;;;6237:56:0;;7337:2:1;6237:56:0;;;7319:21:1;7376:2;7356:18;;;7349:30;7415:34;7395:18;;;7388:62;-1:-1:-1;;;7466:18:1;;;7459:31;7507:19;;6237:56:0;7135:397:1;6237:56:0;6313:1;-1:-1:-1;5851:471:0;;;;;:::o;6798:132::-;6856:7;6883:39;6887:1;6890;6883:39;;;;;;;;;;;;;;;;;:3;:39::i;4927:136::-;4985:7;5012:43;5016:1;5019;5012:43;;;;;;;;;;;;;;;;;:3;:43::i;13582:285::-;13780:68;;-1:-1:-1;;;;;7795:15:1;;;13780:68:0;;;7777:34:1;7847:15;;7827:18;;;7820:43;7879:18;;;7872:34;;;13726:133:0;;13760:5;;-1:-1:-1;;;13803:27:0;7712:18:1;;13780:68:0;7537:375:1;13726:133:0;13582:285;;;;:::o;4463:181::-;4521:7;;4553:5;4557:1;4553;:5;:::i;:::-;4541:17;;4582:1;4577;:6;;4569:46;;;;-1:-1:-1;;;4569:46:0;;8119:2:1;4569:46:0;;;8101:21:1;8158:2;8138:18;;;8131:30;8197:29;8177:18;;;8170:57;8244:18;;4569:46:0;7917:351:1;3350:266:0;-1:-1:-1;;;;;3438:22:0;;3416:110;;;;-1:-1:-1;;;3416:110:0;;8475:2:1;3416:110:0;;;8457:21:1;8514:2;8494:18;;;8487:30;8553:34;8533:18;;;8526:62;-1:-1:-1;;;8604:18:1;;;8597:36;8650:19;;3416:110:0;8273:402:1;3416:110:0;3563:6;;;3542:38;;-1:-1:-1;;;;;3542:38:0;;;;3563:6;;;3542:38;;;3591:6;:17;;-1:-1:-1;;;;;;3591:17:0;-1:-1:-1;;;;;3591:17:0;;;;;;;;;;3350:266::o;16202:860::-;16626:23;16652:106;16694:4;16652:106;;;;;;;;;;;;;;;;;16660:5;-1:-1:-1;;;;;16652:27:0;;;:106;;;;;:::i;:::-;16773:17;;16626:132;;-1:-1:-1;16773:21:0;16769:286;;16946:10;16935:30;;;;;;;;;;;;:::i;:::-;16909:134;;;;-1:-1:-1;;;16909:134:0;;9164:2:1;16909:134:0;;;9146:21:1;9203:2;9183:18;;;9176:30;9242:34;9222:18;;;9215:62;-1:-1:-1;;;9293:18:1;;;9286:40;9343:19;;16909:134:0;8962:406:1;7426:312:0;7546:7;7581:12;7574:5;7566:28;;;;-1:-1:-1;;;7566:28:0;;;;;;;;:::i;:::-;-1:-1:-1;7605:9:0;7617:5;7621:1;7617;:5;:::i;:::-;7605:17;7426:312;-1:-1:-1;;;;;7426:312:0:o;5366:226::-;5486:7;5522:12;5514:6;;;;5506:29;;;;-1:-1:-1;;;5506:29:0;;;;;;;;:::i;:::-;-1:-1:-1;5546:9:0;5558:5;5562:1;5558;:5;:::i;20986:230::-;21123:12;21155:53;21178:6;21186:4;21192:1;21195:12;21155:22;:53::i;:::-;21148:60;20986:230;-1:-1:-1;;;;20986:230:0:o;22607:1044::-;22780:12;22813:18;22824:6;22813:10;:18::i;:::-;22805:60;;;;-1:-1:-1;;;22805:60:0;;10226:2:1;22805:60:0;;;10208:21:1;10265:2;10245:18;;;10238:30;10304:31;10284:18;;;10277:59;10353:18;;22805:60:0;10024:353:1;22805:60:0;22939:12;22953:23;22980:6;-1:-1:-1;;;;;22980:11:0;22999:8;23023:4;22980:58;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22938:100;;;;23053:7;23049:595;;;23084:10;-1:-1:-1;23077:17:0;;-1:-1:-1;23077:17:0;23049:595;23198:17;;:21;23194:439;;23461:10;23455:17;23522:15;23509:10;23505:2;23501:19;23494:44;23194:439;23604:12;23597:20;;-1:-1:-1;;;23597:20:0;;;;;;;;:::i;17750:641::-;17810:4;18291:20;;18121:66;18340:23;;;;;;:42;;-1:-1:-1;;18367:15:0;;;18332:51;-1:-1:-1;;17750: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;4289:128;4329:3;4360:1;4356:6;4353:1;4350:13;4347:39;;;4366:18;;:::i;:::-;-1:-1:-1;4402:9:1;;4289:128::o;4422:135::-;4461:3;-1:-1:-1;;4482:17:1;;4479:43;;;4502:18;;:::i;:::-;-1:-1:-1;4549:1:1;4538:13;;4422:135::o;5633:168::-;5673:7;5739:1;5735;5731:6;5727:14;5724:1;5721:21;5716:1;5709:9;5702:17;5698:45;5695:71;;;5746:18;;:::i;:::-;-1:-1:-1;5786:9:1;;5633:168::o;5806:217::-;5846:1;5872;5862:132;;5916:10;5911:3;5907:20;5904:1;5897:31;5951:4;5948:1;5941:15;5979:4;5976:1;5969:15;5862:132;-1:-1:-1;6008:9:1;;5806:217::o;8680:277::-;8747:6;8800:2;8788:9;8779:7;8775:23;8771:32;8768:52;;;8816:1;8813;8806:12;8768:52;8848:9;8842:16;8901:5;8894:13;8887:21;8880:5;8877:32;8867:60;;8923:1;8920;8913:12;9373:258;9445:1;9455:113;9469:6;9466:1;9463:13;9455:113;;;9545:11;;;9539:18;9526:11;;;9519:39;9491:2;9484:10;9455:113;;;9586:6;9583:1;9580:13;9577:48;;;-1:-1:-1;;9621:1:1;9603:16;;9596:27;9373:258::o;9636:383::-;9785:2;9774:9;9767:21;9748:4;9817:6;9811:13;9860:6;9855:2;9844:9;9840:18;9833:34;9876:66;9935:6;9930:2;9919:9;9915:18;9910:2;9902:6;9898:15;9876:66;:::i;:::-;10003:2;9982:15;-1:-1:-1;;9978:29:1;9963:45;;;;10010:2;9959:54;;9636:383;-1:-1:-1;;9636:383:1:o;10382:274::-;10511:3;10549:6;10543:13;10565:53;10611:6;10606:3;10599:4;10591:6;10587:17;10565:53;:::i;:::-;10634:16;;;;;10382:274;-1:-1:-1;;10382:274:1:o
Swarm Source
ipfs://199fbeb6cf820c20295a96b7e8fef74fc00f92b3455f05306cba93ec2ebcc74a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000211 | 555,802.8923 | $117.19 |
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.