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 170 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Reward... | 19124501 | 191 days ago | IN | 0 ETH | 0.00181727 | ||||
Withdraw | 18817168 | 235 days ago | IN | 0 ETH | 0.00282798 | ||||
Deposit | 18756832 | 243 days ago | IN | 0 ETH | 0.0021985 | ||||
Emergency Withdr... | 18756831 | 243 days ago | IN | 0 ETH | 0.00698163 | ||||
Emergency Withdr... | 18611874 | 263 days ago | IN | 0 ETH | 0.00371514 | ||||
Deposit | 18611872 | 263 days ago | IN | 0 ETH | 0.01050605 | ||||
Emergency Withdr... | 18593771 | 266 days ago | IN | 0 ETH | 0.00796407 | ||||
Deposit | 18590813 | 266 days ago | IN | 0 ETH | 0.00708245 | ||||
Emergency Withdr... | 18576642 | 268 days ago | IN | 0 ETH | 0.00585597 | ||||
Emergency Withdr... | 18576622 | 268 days ago | IN | 0 ETH | 0.00267214 | ||||
Deposit | 18576619 | 268 days ago | IN | 0 ETH | 0.00344516 | ||||
Emergency Withdr... | 18575554 | 268 days ago | IN | 0 ETH | 0.00241403 | ||||
Deposit | 18570251 | 269 days ago | IN | 0 ETH | 0.0065067 | ||||
Emergency Withdr... | 18567539 | 270 days ago | IN | 0 ETH | 0.00271492 | ||||
Deposit | 18567538 | 270 days ago | IN | 0 ETH | 0.00691371 | ||||
Emergency Withdr... | 18557919 | 271 days ago | IN | 0 ETH | 0.00308017 | ||||
Deposit | 18557917 | 271 days ago | IN | 0 ETH | 0.00379099 | ||||
Emergency Withdr... | 18549205 | 272 days ago | IN | 0 ETH | 0.00236163 | ||||
Deposit | 18549021 | 272 days ago | IN | 0 ETH | 0.00421155 | ||||
Deposit | 18542754 | 273 days ago | IN | 0 ETH | 0.01493448 | ||||
Emergency Withdr... | 18539954 | 273 days ago | IN | 0 ETH | 0.00326495 | ||||
Deposit | 18539951 | 273 days ago | IN | 0 ETH | 0.00777645 | ||||
Emergency Withdr... | 18535962 | 274 days ago | IN | 0 ETH | 0.00626868 | ||||
Deposit | 18535927 | 274 days ago | IN | 0 ETH | 0.02000577 | ||||
Emergency Withdr... | 18520844 | 276 days ago | IN | 0 ETH | 0.00911253 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
HydraStaking
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-10-06 */ //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 HydraStaking 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(0xDB6fa6431641B3a2333a0107c1De05626a45Dcf5); rewardToken = stakingToken; apy = 100; lockDuration = 7 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."); rewardToken.safeTransfer(address(msg.sender), pending); } } uint256 amountTransferred = 0; if(_amount > 0) { uint256 initialBalance = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); amountTransferred = pool.lpToken.balanceOf(address(this)) - initialBalance; user.amount = user.amount.add(amountTransferred); totalStaked += amountTransferred; } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); emit Deposit(msg.sender, _amount); } // Withdraw primary tokens from STAKING. function withdraw() public nonReentrant { require(holderUnlockTime[msg.sender] <= block.timestamp, "May not do normal withdraw early"); PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; updatePool(0); uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { require(pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin."); rewardToken.safeTransfer(address(msg.sender), pending); } if(_amount > 0) { user.amount = 0; totalStaked -= _amount; pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); if(user.amount > 0){ holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } else { holderUnlockTime[msg.sender] = 0; } emit Withdraw(msg.sender, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external nonReentrant { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; totalStaked -= _amount; // exit penalty for early unstakers, penalty held on contract as rewards. if(holderUnlockTime[msg.sender] >= block.timestamp){ _amount -= _amount * exitPenaltyPerc / 100; } holderUnlockTime[msg.sender] = 0; pool.lpToken.safeTransfer(address(msg.sender), _amount); user.amount = 0; user.rewardDebt = 0; emit EmergencyWithdraw(msg.sender, _amount); } // Withdraw reward. EMERGENCY ONLY. This allows the owner to migrate rewards to a new staking pool since we are not minting new tokens. function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { require(_amount <= rewardToken.balanceOf(address(this)) - totalStaked, 'not enough tokens to take out'); rewardToken.safeTransfer(address(msg.sender), _amount); } function calculateNewRewards() public view returns (uint256) { PoolInfo storage pool = poolInfo[0]; if(pool.lastRewardTimestamp > block.timestamp){ return 0; } return (((block.timestamp - pool.lastRewardTimestamp) * totalStaked) * apy / 100 / 365 days); } function rewardsRemaining() public view returns (uint256){ return rewardToken.balanceOf(address(this)) - totalStaked; } function updateApy(uint256 newApy) external onlyOwner { require(newApy <= 10000, "APY must be below 10000%"); updatePool(0); apy = newApy; } function updatelockduration(uint256 newlockDuration) external onlyOwner { require(newlockDuration <= 2419200, "Duration must be below 2 weeks"); lockDuration = newlockDuration; } function updateExitPenalty(uint256 newPenaltyPerc) external onlyOwner { require(newPenaltyPerc <= 20, "May not set higher than 20%"); exitPenaltyPerc = newPenaltyPerc; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"apy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateNewRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exitPenaltyPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBEP20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accTokensPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newApy","type":"uint256"}],"name":"updateApy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPenaltyPerc","type":"uint256"}],"name":"updateExitPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newlockDuration","type":"uint256"}],"name":"updatelockduration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052600060095534801561001557600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180805573db6fa6431641b3a2333a0107c1de05626a45dcf5608081815260a08290526064600490815562093a8060059081556006556040805192830181529282526103e8602083018181526221903f94840194855260006060850181815260078054988901815590915293517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889690930295860180546001600160a01b0319166001600160a01b039094169390931790925590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68985015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a840155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b9092019190915560095560805160a05161196b6101cb6000396000818161035101528181610415015281816104ee0152818161065a0152818161090e0152610c5701526000610248015261196b6000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806380dc0672116100de578063a913a5f711610097578063f2fde38b11610071578063f2fde38b14610326578063f40f0f5214610339578063f7c618c11461034c578063ff16ef391461037357600080fd5b8063a913a5f7146102eb578063b6b55f251461030b578063db2e21bc1461031e57600080fd5b806380dc06721461029b578063817b1cd2146102a35780638c09c135146102ac5780638da5cb5b146102bf5780638e0b0198146102d0578063999e2f75146102e357600080fd5b8063630b5ba111610130578063630b5ba114610233578063715018a61461023b57806372f702f314610243578063746c8ae11461028257806378c196f31461028a5780637b280def1461029257600080fd5b806304554443146101785780631526fe27146101945780631959a002146101d15780633279beab1461020d5780633bcfc4b8146102225780633ccfd60b1461022b575b600080fd5b61018160055481565b6040519081526020015b60405180910390f35b6101a76101a23660046116bc565b610386565b604080516001600160a01b039095168552602085019390935291830152606082015260800161018b565b6101f86101df3660046116d5565b6008602052600090815260409020805460019091015482565b6040805192835260208301919091520161018b565b61022061021b3660046116bc565b6103ca565b005b61018160045481565b610220610518565b610220610753565b6102206107a8565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161018b565b61022061081c565b6101816108ea565b61018160065481565b610220610988565b61018160035481565b6102206102ba3660046116bc565b6109c3565b6000546001600160a01b031661026a565b6102206102de3660046116bc565b610a45565b610181610ac5565b6101816102f93660046116d5565b60026020526000908152604090205481565b6102206103193660046116bc565b610b4b565b610220610e02565b6102206103343660046116d5565b610f2e565b6101816103473660046116d5565b610f61565b61026a7f000000000000000000000000000000000000000000000000000000000000000081565b6102206103813660046116bc565b611050565b6007818154811061039657600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146103fd5760405162461bcd60e51b81526004016103f4906116fe565b60405180910390fd5b6003546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104889190611733565b6104929190611762565b8111156104e15760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f757400000060448201526064016103f4565b6105156001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633836110db565b50565b6002600154141561053b5760405162461bcd60e51b81526004016103f490611779565b6002600181905533600090815260209190915260409020544210156105a25760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c7960448201526064016103f4565b600060076000815481106105b8576105b86117b0565b60009182526020808320338452600890915260408320805460049093029091019350916105e490611143565b600061061e836001015461061864e8d4a51000610612886003015488600001546111d690919063ffffffff16565b9061125e565b906112a0565b905080156106815761062e6108ea565b81111561064d5760405162461bcd60e51b81526004016103f4906117c6565b6106816001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633836110db565b81156106b95760008084556003805484929061069e908490611762565b909155505083546106b9906001600160a01b031633846110db565b600384015483546106d49164e8d4a5100091610612916111d6565b6001840155825415610702576005546106ed9042611824565b33600090815260026020526040902055610713565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b0316331461077d5760405162461bcd60e51b81526004016103f4906116fe565b60075460005b818110156107a45761079481611143565b61079d8161183c565b9050610783565b5050565b6000546001600160a01b031633146107d25760405162461bcd60e51b81526004016103f4906116fe565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146108465760405162461bcd60e51b81526004016103f4906116fe565b600760008154811061085a5761085a6117b0565b90600052602060002090600402016002015463014ca2bf146108be5760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e6365000000000060448201526064016103f4565b4260076000815481106108d3576108d36117b0565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109799190611733565b6109839190611762565b905090565b6000546001600160a01b031633146109b25760405162461bcd60e51b81526004016103f4906116fe565b6109bc6000611143565b6000600455565b6000546001600160a01b031633146109ed5760405162461bcd60e51b81526004016103f4906116fe565b6224ea00811115610a405760405162461bcd60e51b815260206004820152601e60248201527f4475726174696f6e206d7573742062652062656c6f772032207765656b73000060448201526064016103f4565b600555565b6000546001600160a01b03163314610a6f5760405162461bcd60e51b81526004016103f4906116fe565b6014811115610ac05760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e20323025000000000060448201526064016103f4565b600655565b6000806007600081548110610adc57610adc6117b0565b906000526020600020906004020190504281600201541115610b0057600091505090565b6301e133806064600454600354846002015442610b1d9190611762565b610b279190611857565b610b319190611857565b610b3b9190611876565b610b459190611876565b91505090565b60026001541415610b6e5760405162461bcd60e51b81526004016103f490611779565b600260018190553360009081526020919091526040902054610ba857600554610b979042611824565b336000908152600260205260409020555b60006007600081548110610bbe57610bbe6117b0565b60009182526020808320338452600890915260408320600490920201925090610be690611143565b805415610c80576000610c1b826001015461061864e8d4a51000610612876003015487600001546111d690919063ffffffff16565b90508015610c7e57610c2b6108ea565b811115610c4a5760405162461bcd60e51b81526004016103f4906117c6565b610c7e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633836110db565b505b60008315610db05782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf49190611733565b8454909150610d0e906001600160a01b03163330886112e2565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d799190611733565b610d839190611762565b8354909250610d929083611320565b835560038054839190600090610da9908490611824565b9091555050505b60038301548254610dcb9164e8d4a5100091610612916111d6565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610741565b60026001541415610e255760405162461bcd60e51b81526004016103f490611779565b600260018190555060006007600081548110610e4357610e436117b0565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610e7c908490611762565b9091555050336000908152600260205260409020544211610ebe57606460065482610ea79190611857565b610eb19190611876565b610ebb9082611762565b90505b336000818152600260205260408120558354610ee6916001600160a01b0390911690836110db565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b03163314610f585760405162461bcd60e51b81526004016103f4906116fe565b6105158161137f565b6000806007600081548110610f7857610f786117b0565b600091825260208083206001600160a01b038716845260089091526040909220600260049092029092019081015490925063014ca2bf1415610fbe575060009392505050565b6003808301549054600284015442118015610fd857508015155b1561101e576000610ffb6009546106128760010154610ff5610ac5565b906111d6565b905061101a611013836106128464e8d4a510006111d6565b8490611320565b9250505b611046836001015461061864e8d4a510006106128688600001546111d690919063ffffffff16565b9695505050505050565b6000546001600160a01b0316331461107a5760405162461bcd60e51b81526004016103f4906116fe565b6127108111156110cc5760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f7720313030303025000000000000000060448201526064016103f4565b6110d66000611143565b600455565b6040516001600160a01b03831660248201526044810182905261113e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261143f565b505050565b600060078281548110611158576111586117b0565b9060005260206000209060040201905080600201544211611177575050565b6003548061118a57504260029091015550565b60006111a26009546106128560010154610ff5610ac5565b90506111c56111ba836106128464e8d4a510006111d6565b600385015490611320565b600384015550504260029091015550565b6000826111e557506000611258565b60006111f18385611857565b9050826111fe8583611876565b146112555760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016103f4565b90505b92915050565b600061125583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611511565b600061125583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611548565b6040516001600160a01b038085166024830152831660448201526064810182905261131a9085906323b872dd60e01b90608401611107565b50505050565b60008061132d8385611824565b9050838110156112555760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103f4565b6001600160a01b0381166113e45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611494826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115799092919063ffffffff16565b80519091501561113e57808060200190518101906114b29190611898565b61113e5760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f4565b600081836115325760405162461bcd60e51b81526004016103f491906118e6565b50600061153f8486611876565b95945050505050565b6000818484111561156c5760405162461bcd60e51b81526004016103f491906118e6565b50600061153f8486611762565b60606115888484600085611590565b949350505050565b606061159b85611683565b6115e75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f4565b600080866001600160a01b031685876040516116039190611919565b60006040518083038185875af1925050503d8060008114611640576040519150601f19603f3d011682016040523d82523d6000602084013e611645565b606091505b509150915081156116595791506115889050565b8051156116695780518082602001fd5b8360405162461bcd60e51b81526004016103f491906118e6565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611588575050151592915050565b6000602082840312156116ce57600080fd5b5035919050565b6000602082840312156116e757600080fd5b81356001600160a01b038116811461125557600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561174557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156117745761177461174c565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b600082198211156118375761183761174c565b500190565b60006000198214156118505761185061174c565b5060010190565b60008160001904831182151516156118715761187161174c565b500290565b60008261189357634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156118aa57600080fd5b8151801515811461125557600080fd5b60005b838110156118d55781810151838201526020016118bd565b8381111561131a5750506000910152565b60208152600082518060208401526119058160408501602087016118ba565b601f01601f19169190910160400192915050565b6000825161192b8184602087016118ba565b919091019291505056fea2646970667358221220d66dd5392cf1ca1d9aa153a20ff31b3bac3741464e4b8a55d434334a01e1c48664736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806380dc0672116100de578063a913a5f711610097578063f2fde38b11610071578063f2fde38b14610326578063f40f0f5214610339578063f7c618c11461034c578063ff16ef391461037357600080fd5b8063a913a5f7146102eb578063b6b55f251461030b578063db2e21bc1461031e57600080fd5b806380dc06721461029b578063817b1cd2146102a35780638c09c135146102ac5780638da5cb5b146102bf5780638e0b0198146102d0578063999e2f75146102e357600080fd5b8063630b5ba111610130578063630b5ba114610233578063715018a61461023b57806372f702f314610243578063746c8ae11461028257806378c196f31461028a5780637b280def1461029257600080fd5b806304554443146101785780631526fe27146101945780631959a002146101d15780633279beab1461020d5780633bcfc4b8146102225780633ccfd60b1461022b575b600080fd5b61018160055481565b6040519081526020015b60405180910390f35b6101a76101a23660046116bc565b610386565b604080516001600160a01b039095168552602085019390935291830152606082015260800161018b565b6101f86101df3660046116d5565b6008602052600090815260409020805460019091015482565b6040805192835260208301919091520161018b565b61022061021b3660046116bc565b6103ca565b005b61018160045481565b610220610518565b610220610753565b6102206107a8565b61026a7f000000000000000000000000db6fa6431641b3a2333a0107c1de05626a45dcf581565b6040516001600160a01b03909116815260200161018b565b61022061081c565b6101816108ea565b61018160065481565b610220610988565b61018160035481565b6102206102ba3660046116bc565b6109c3565b6000546001600160a01b031661026a565b6102206102de3660046116bc565b610a45565b610181610ac5565b6101816102f93660046116d5565b60026020526000908152604090205481565b6102206103193660046116bc565b610b4b565b610220610e02565b6102206103343660046116d5565b610f2e565b6101816103473660046116d5565b610f61565b61026a7f000000000000000000000000db6fa6431641b3a2333a0107c1de05626a45dcf581565b6102206103813660046116bc565b611050565b6007818154811061039657600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b6000546001600160a01b031633146103fd5760405162461bcd60e51b81526004016103f4906116fe565b60405180910390fd5b6003546040516370a0823160e01b81523060048201527f000000000000000000000000db6fa6431641b3a2333a0107c1de05626a45dcf56001600160a01b0316906370a0823190602401602060405180830381865afa158015610464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104889190611733565b6104929190611762565b8111156104e15760405162461bcd60e51b815260206004820152601d60248201527f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f757400000060448201526064016103f4565b6105156001600160a01b037f000000000000000000000000db6fa6431641b3a2333a0107c1de05626a45dcf51633836110db565b50565b6002600154141561053b5760405162461bcd60e51b81526004016103f490611779565b6002600181905533600090815260209190915260409020544210156105a25760405162461bcd60e51b815260206004820181905260248201527f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c7960448201526064016103f4565b600060076000815481106105b8576105b86117b0565b60009182526020808320338452600890915260408320805460049093029091019350916105e490611143565b600061061e836001015461061864e8d4a51000610612886003015488600001546111d690919063ffffffff16565b9061125e565b906112a0565b905080156106815761062e6108ea565b81111561064d5760405162461bcd60e51b81526004016103f4906117c6565b6106816001600160a01b037f000000000000000000000000db6fa6431641b3a2333a0107c1de05626a45dcf51633836110db565b81156106b95760008084556003805484929061069e908490611762565b909155505083546106b9906001600160a01b031633846110db565b600384015483546106d49164e8d4a5100091610612916111d6565b6001840155825415610702576005546106ed9042611824565b33600090815260026020526040902055610713565b336000908152600260205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050600180555050565b6000546001600160a01b0316331461077d5760405162461bcd60e51b81526004016103f4906116fe565b60075460005b818110156107a45761079481611143565b61079d8161183c565b9050610783565b5050565b6000546001600160a01b031633146107d25760405162461bcd60e51b81526004016103f4906116fe565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146108465760405162461bcd60e51b81526004016103f4906116fe565b600760008154811061085a5761085a6117b0565b90600052602060002090600402016002015463014ca2bf146108be5760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c792073746172742072657761726473206f6e6365000000000060448201526064016103f4565b4260076000815481106108d3576108d36117b0565b906000526020600020906004020160020181905550565b6003546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000db6fa6431641b3a2333a0107c1de05626a45dcf516906370a0823190602401602060405180830381865afa158015610955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109799190611733565b6109839190611762565b905090565b6000546001600160a01b031633146109b25760405162461bcd60e51b81526004016103f4906116fe565b6109bc6000611143565b6000600455565b6000546001600160a01b031633146109ed5760405162461bcd60e51b81526004016103f4906116fe565b6224ea00811115610a405760405162461bcd60e51b815260206004820152601e60248201527f4475726174696f6e206d7573742062652062656c6f772032207765656b73000060448201526064016103f4565b600555565b6000546001600160a01b03163314610a6f5760405162461bcd60e51b81526004016103f4906116fe565b6014811115610ac05760405162461bcd60e51b815260206004820152601b60248201527f4d6179206e6f742073657420686967686572207468616e20323025000000000060448201526064016103f4565b600655565b6000806007600081548110610adc57610adc6117b0565b906000526020600020906004020190504281600201541115610b0057600091505090565b6301e133806064600454600354846002015442610b1d9190611762565b610b279190611857565b610b319190611857565b610b3b9190611876565b610b459190611876565b91505090565b60026001541415610b6e5760405162461bcd60e51b81526004016103f490611779565b600260018190553360009081526020919091526040902054610ba857600554610b979042611824565b336000908152600260205260409020555b60006007600081548110610bbe57610bbe6117b0565b60009182526020808320338452600890915260408320600490920201925090610be690611143565b805415610c80576000610c1b826001015461061864e8d4a51000610612876003015487600001546111d690919063ffffffff16565b90508015610c7e57610c2b6108ea565b811115610c4a5760405162461bcd60e51b81526004016103f4906117c6565b610c7e6001600160a01b037f000000000000000000000000db6fa6431641b3a2333a0107c1de05626a45dcf51633836110db565b505b60008315610db05782546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf49190611733565b8454909150610d0e906001600160a01b03163330886112e2565b83546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d799190611733565b610d839190611762565b8354909250610d929083611320565b835560038054839190600090610da9908490611824565b9091555050505b60038301548254610dcb9164e8d4a5100091610612916111d6565b600183015560405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610741565b60026001541415610e255760405162461bcd60e51b81526004016103f490611779565b600260018190555060006007600081548110610e4357610e436117b0565b60009182526020808320338452600890915260408320805460038054600490950290930195509093909283929190610e7c908490611762565b9091555050336000908152600260205260409020544211610ebe57606460065482610ea79190611857565b610eb19190611876565b610ebb9082611762565b90505b336000818152600260205260408120558354610ee6916001600160a01b0390911690836110db565b6000808355600183015560405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506001805550565b6000546001600160a01b03163314610f585760405162461bcd60e51b81526004016103f4906116fe565b6105158161137f565b6000806007600081548110610f7857610f786117b0565b600091825260208083206001600160a01b038716845260089091526040909220600260049092029092019081015490925063014ca2bf1415610fbe575060009392505050565b6003808301549054600284015442118015610fd857508015155b1561101e576000610ffb6009546106128760010154610ff5610ac5565b906111d6565b905061101a611013836106128464e8d4a510006111d6565b8490611320565b9250505b611046836001015461061864e8d4a510006106128688600001546111d690919063ffffffff16565b9695505050505050565b6000546001600160a01b0316331461107a5760405162461bcd60e51b81526004016103f4906116fe565b6127108111156110cc5760405162461bcd60e51b815260206004820152601860248201527f415059206d7573742062652062656c6f7720313030303025000000000000000060448201526064016103f4565b6110d66000611143565b600455565b6040516001600160a01b03831660248201526044810182905261113e90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261143f565b505050565b600060078281548110611158576111586117b0565b9060005260206000209060040201905080600201544211611177575050565b6003548061118a57504260029091015550565b60006111a26009546106128560010154610ff5610ac5565b90506111c56111ba836106128464e8d4a510006111d6565b600385015490611320565b600384015550504260029091015550565b6000826111e557506000611258565b60006111f18385611857565b9050826111fe8583611876565b146112555760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016103f4565b90505b92915050565b600061125583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611511565b600061125583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611548565b6040516001600160a01b038085166024830152831660448201526064810182905261131a9085906323b872dd60e01b90608401611107565b50505050565b60008061132d8385611824565b9050838110156112555760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016103f4565b6001600160a01b0381166113e45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f4565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611494826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115799092919063ffffffff16565b80519091501561113e57808060200190518101906114b29190611898565b61113e5760405162461bcd60e51b815260206004820152602a60248201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f4565b600081836115325760405162461bcd60e51b81526004016103f491906118e6565b50600061153f8486611876565b95945050505050565b6000818484111561156c5760405162461bcd60e51b81526004016103f491906118e6565b50600061153f8486611762565b60606115888484600085611590565b949350505050565b606061159b85611683565b6115e75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f4565b600080866001600160a01b031685876040516116039190611919565b60006040518083038185875af1925050503d8060008114611640576040519150601f19603f3d011682016040523d82523d6000602084013e611645565b606091505b509150915081156116595791506115889050565b8051156116695780518082602001fd5b8360405162461bcd60e51b81526004016103f491906118e6565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611588575050151592915050565b6000602082840312156116ce57600080fd5b5035919050565b6000602082840312156116e757600080fd5b81356001600160a01b038116811461125557600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561174557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156117745761177461174c565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260409082018190527f43616e6e6f74207769746864726177206f746865722070656f706c6527732073908201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2e606082015260800190565b600082198211156118375761183761174c565b500190565b60006000198214156118505761185061174c565b5060010190565b60008160001904831182151516156118715761187161174c565b500290565b60008261189357634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156118aa57600080fd5b8151801515811461125557600080fd5b60005b838110156118d55781810151838201526020016118bd565b8381111561131a5750506000910152565b60208152600082518060208401526119058160408501602087016118ba565b601f01601f19169190910160400192915050565b6000825161192b8184602087016118ba565b919091019291505056fea2646970667358221220d66dd5392cf1ca1d9aa153a20ff31b3bac3741464e4b8a55d434334a01e1c48664736f6c634300080b0033
Deployed Bytecode Sourcemap
24694:8771:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25656:27;;;;;;;;;160:25:1;;;148:2;133:18;25656:27:0;;;;;;;;25756: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;25756:26:0;381:431:1;25838:45:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;1282:25:1;;;1338:2;1323:18;;1316:34;;;;1255:18;25838:45:0;1108:248:1;32151:256:0;;;;;;:::i;:::-;;:::i;:::-;;25631:18;;;;;;30113:1153;;;:::i;28549:190::-;;;:::i;2815:140::-;;;:::i;25452:36::-;;;;;;;;-1:-1:-1;;;;;1539:32:1;;;1521:51;;1509:2;1494:18;25452:36:0;1361:217:1;26797:204:0;;;:::i;32738:133::-;;;:::i;25690:30::-;;;;;;26698:91;;;:::i;25598:26::-;;;;;;33059:203;;;;;;:::i;:::-;;:::i;2173:79::-;2211:7;2238:6;-1:-1:-1;;;;;2238:6:0;2173:79;;33270:192;;;;;;:::i;:::-;;:::i;32421:309::-;;;:::i;25537:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;28776:1281;;;;;;:::i;:::-;;:::i;31337:665::-;;;:::i;3110:109::-;;;;;;:::i;:::-;;:::i;27066:724::-;;;;;;:::i;:::-;;:::i;25495:35::-;;;;;32879:172;;;;;;:::i;:::-;;:::i;25756:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25756:26:0;;;;-1:-1:-1;25756:26:0;;;:::o;32151:256::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;;;;;;;;;32289:11:::1;::::0;32250:36:::1;::::0;-1:-1:-1;;;32250:36:0;;32280:4:::1;32250:36;::::0;::::1;1521:51:1::0;32250:11:0::1;-1:-1:-1::0;;;;;32250:21:0::1;::::0;::::1;::::0;1494:18:1;;32250:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32239:7;:61;;32231:103;;;::::0;-1:-1:-1;;;32231:103:0;;2805:2:1;32231:103:0::1;::::0;::::1;2787:21:1::0;2844:2;2824:18;;;2817:30;2883:31;2863:18;;;2856:59;2932:18;;32231:103:0::1;2603:353:1::0;32231:103:0::1;32345:54;-1:-1:-1::0;;;;;32345:11:0::1;:24;32378:10;32391:7:::0;32345:24:::1;:54::i;:::-;32151:256:::0;:::o;30113:1153::-;23747:1;24345:7;;:19;;24337:63;;;;-1:-1:-1;;;24337:63:0;;;;;;;:::i;:::-;23747:1;24478:7;:18;;;30191:10:::1;30174:28;::::0;;;::::1;::::0;;;;;;;;30206:15:::1;-1:-1:-1::0;30174:47:0::1;30166:92;;;::::0;-1:-1:-1;;;30166:92:0;;3523:2:1;30166:92:0::1;::::0;::::1;3505:21:1::0;;;3542:18;;;3535:30;3601:34;3581:18;;;3574:62;3653:18;;30166:92:0::1;3321:356:1::0;30166:92:0::1;30279:21;30303:8;30312:1;30303:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;30358:10:::1;30349:20:::0;;:8:::1;:20:::0;;;;;;30400:11;;30303::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;30349:20:0;30422:13:::1;::::0;:10:::1;:13::i;:::-;30446:15;30464:70;30518:4;:15;;;30464:49;30508:4;30464:39;30480:4;:22;;;30464:4;:11;;;:15;;:39;;;;:::i;:::-;:43:::0;::::1;:49::i;:::-;:53:::0;::::1;:70::i;:::-;30446:88:::0;-1:-1:-1;30548:11:0;;30545:218:::1;;30595:18;:16;:18::i;:::-;30584:7;:29;;30576:106;;;;-1:-1:-1::0;;;30576:106:0::1;;;;;;;:::i;:::-;30697:54;-1:-1:-1::0;;;;;30697:11:0::1;:24;30730:10;30743:7:::0;30697:24:::1;:54::i;:::-;30778:11:::0;;30775:165:::1;;30820:1;30806:15:::0;;;30836:11:::1;:22:::0;;30851:7;;30820:1;30836:22:::1;::::0;30851:7;;30836:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;30873:12:0;;:55:::1;::::0;-1:-1:-1;;;;;30873:12:0::1;30907:10;30920:7:::0;30873:25:::1;:55::i;:::-;30986:22;::::0;::::1;::::0;30970:11;;:49:::1;::::0;31014:4:::1;::::0;30970:39:::1;::::0;:15:::1;:39::i;:49::-;30952:15;::::0;::::1;:67:::0;31043:11;;:15;31040:172:::1;;31123:12;::::0;31105:30:::1;::::0;:15:::1;:30;:::i;:::-;31091:10;31074:28;::::0;;;:16:::1;:28;::::0;;;;:61;31040:172:::1;;;31185:10;31199:1;31168:28:::0;;;:16:::1;:28;::::0;;;;:32;31040:172:::1;31229:29;::::0;160:25:1;;;31238:10:0::1;::::0;31229:29:::1;::::0;148:2:1;133:18;31229:29:0::1;;;;;;;;-1:-1:-1::0;;23703:1:0;24657:22;;-1:-1:-1;;30113:1153:0:o;28549:190::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;28621:8:::1;:15:::0;28604:14:::1;28647:85;28675:6;28669:3;:12;28647:85;;;28705:15;28716:3;28705:10;:15::i;:::-;28683:5;::::0;::::1;:::i;:::-;;;28647:85;;;;28593:146;28549:190::o:0;2815:140::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;2914:1:::1;2898:6:::0;;2877:40:::1;::::0;-1:-1:-1;;;;;2898:6:0;;::::1;::::0;2877:40:::1;::::0;2914:1;;2877:40:::1;2945:1;2928:19:::0;;-1:-1:-1;;;;;;2928:19:0::1;::::0;;2815:140::o;26797:204::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;26858:8:::1;26867:1;26858:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;;26893:8;26858:43;26850:83;;;::::0;-1:-1:-1;;;26850:83:0;;4722:2:1;26850:83:0::1;::::0;::::1;4704:21:1::0;4761:2;4741:18;;;4734:30;4800:29;4780:18;;;4773:57;4847:18;;26850:83:0::1;4520:351:1::0;26850:83:0::1;26978:15;26944:8;26953:1;26944:11;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;:49;;;;26797:204::o:0;32738:133::-;32852:11;;32813:36;;-1:-1:-1;;;32813:36:0;;32843:4;32813:36;;;1521:51:1;32787:7:0;;32852:11;-1:-1:-1;;;;;32813:11:0;:21;;;;1494:18:1;;32813:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;32806:57;;32738:133;:::o;26698:91::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;26750:13:::1;26761:1;26750:10;:13::i;:::-;26780:1;26774:3;:7:::0;26698:91::o;33059:203::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;33169:7:::1;33150:15;:26;;33142:69;;;::::0;-1:-1:-1;;;33142:69:0;;5078:2:1;33142:69:0::1;::::0;::::1;5060:21:1::0;5117:2;5097:18;;;5090:30;5156:32;5136:18;;;5129:60;5206:18;;33142:69:0::1;4876:354:1::0;33142:69:0::1;33222:12;:30:::0;33059:203::o;33270:192::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;33377:2:::1;33359:14;:20;;33351:60;;;::::0;-1:-1:-1;;;33351:60:0;;5437:2:1;33351:60:0::1;::::0;::::1;5419:21:1::0;5476:2;5456:18;;;5449:30;5515:29;5495:18;;;5488:57;5562:18;;33351:60:0::1;5235:351:1::0;33351:60:0::1;33422:15;:32:::0;33270:192::o;32421:309::-;32473:7;32493:21;32517:8;32526:1;32517:11;;;;;;;;:::i;:::-;;;;;;;;;;;32493:35;;32569:15;32542:4;:24;;;:42;32539:81;;;32607:1;32600:8;;;32421:309;:::o;32539:81::-;32713:8;32707:3;32701;;32686:11;;32658:4;:24;;;32640:15;:42;;;;:::i;:::-;32639:58;;;;:::i;:::-;32638:66;;;;:::i;:::-;:72;;;;:::i;:::-;:83;;;;:::i;:::-;32630:92;;;32421:309;:::o;28776:1281::-;23747:1;24345:7;;:19;;24337:63;;;;-1:-1:-1;;;24337:63:0;;;;;;;:::i;:::-;23747:1;24478:7;:18;;;28861:10:::1;28844:28;::::0;;;::::1;::::0;;;;;;;;28841:125:::1;;28942:12;::::0;28924:30:::1;::::0;:15:::1;:30;:::i;:::-;28910:10;28893:28;::::0;;;:16:::1;:28;::::0;;;;:61;28841:125:::1;28976:21;29000:8;29009:1;29000:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;29055:10:::1;29046:20:::0;;:8:::1;:20:::0;;;;;;29000:11:::1;::::0;;::::1;;::::0;-1:-1:-1;29046:20:0;29079:13:::1;::::0;:10:::1;:13::i;:::-;29107:11:::0;;:15;29103:380:::1;;29139:15;29157:70;29211:4;:15;;;29157:49;29201:4;29157:39;29173:4;:22;;;29157:4;:11;;;:15;;:39;;;;:::i;:70::-;29139:88:::0;-1:-1:-1;29245:11:0;;29242:230:::1;;29296:18;:16;:18::i;:::-;29285:7;:29;;29277:106;;;;-1:-1:-1::0;;;29277:106:0::1;;;;;;;:::i;:::-;29402:54;-1:-1:-1::0;;;;;29402:11:0::1;:24;29435:10;29448:7:::0;29402:24:::1;:54::i;:::-;29124:359;29103:380;29493:25;29536:11:::0;;29533:393:::1;;29589:12:::0;;:37:::1;::::0;-1:-1:-1;;;29589:37:0;;29620:4:::1;29589:37;::::0;::::1;1521:51:1::0;29564:22:0::1;::::0;-1:-1:-1;;;;;29589:12:0::1;::::0;:22:::1;::::0;1494:18:1;;29589:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29641:12:::0;;29564:62;;-1:-1:-1;29641:74:0::1;::::0;-1:-1:-1;;;;;29641:12:0::1;29679:10;29700:4;29707:7:::0;29641:29:::1;:74::i;:::-;29750:12:::0;;:37:::1;::::0;-1:-1:-1;;;29750:37:0;;29781:4:::1;29750:37;::::0;::::1;1521:51:1::0;29790:14:0;;-1:-1:-1;;;;;29750:12:0::1;::::0;:22:::1;::::0;1494:18:1;;29750:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;29833:11:::0;;29730:74;;-1:-1:-1;29833:34:0::1;::::0;29730:74;29833:15:::1;:34::i;:::-;29819:48:::0;;29882:11:::1;:32:::0;;29897:17;;29882:11;29819::::1;::::0;29882:32:::1;::::0;29897:17;;29882:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;29533:393:0::1;29970:22;::::0;::::1;::::0;29954:11;;:49:::1;::::0;29998:4:::1;::::0;29954:39:::1;::::0;:15:::1;:39::i;:49::-;29936:15;::::0;::::1;:67:::0;30021:28:::1;::::0;160:25:1;;;30029:10:0::1;::::0;30021:28:::1;::::0;148:2:1;133:18;30021:28:0::1;14:177:1::0;31337:665:0;23747:1;24345:7;;:19;;24337:63;;;;-1:-1:-1;;;24337:63:0;;;;;;;:::i;:::-;23747:1;24478:7;:18;;;;31399:21:::1;31423:8;31432:1;31423:11;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;31478:10:::1;31469:20:::0;;:8:::1;:20:::0;;;;;;31518:11;;31540::::1;:22:::0;;31423:11:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;31469:20:0;;31518:11;;;;31540;31423;31540:22:::1;::::0;31518:11;;31540:22:::1;:::i;:::-;::::0;;;-1:-1:-1;;31676:10:0::1;31659:28;::::0;;;:16:::1;:28;::::0;;;;;31691:15:::1;-1:-1:-1::0;31656:120:0::1;;31761:3;31743:15;;31733:7;:25;;;;:::i;:::-;:31;;;;:::i;:::-;31722:42;::::0;;::::1;:::i;:::-;;;31656:120;31803:10;31817:1;31786:28:::0;;;:16:::1;:28;::::0;;;;:32;31829:12;;:55:::1;::::0;-1:-1:-1;;;;;31829:12:0;;::::1;::::0;31876:7;31829:25:::1;:55::i;:::-;31909:1;31895:15:::0;;;31921::::1;::::0;::::1;:19:::0;31956:38:::1;::::0;160:25:1;;;31974:10:0::1;::::0;31956:38:::1;::::0;148:2:1;133:18;31956:38:0::1;;;;;;;-1:-1:-1::0;;23703:1:0;24657:22;;-1:-1:-1;31337:665:0:o;3110:109::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;3183:28:::1;3202:8;3183:18;:28::i;27066:724::-:0;27127:7;27147:21;27171:8;27180:1;27171:11;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;27217:15:0;;;;:8;:15;;;;;;;27246:24;27171:11;;;;;;;27246:24;;;;27171:11;;-1:-1:-1;27274:8:0;27246:36;27243:75;;;-1:-1:-1;27305:1:0;;27066:724;-1:-1:-1;;;27066:724:0:o;27243:75::-;27356:22;;;;;27408:11;;27452:24;;;;27434:15;:42;:59;;;;-1:-1:-1;27480:13:0;;;27434:59;27430:270;;;27510:19;27532:63;27579:15;;27532:42;27558:4;:15;;;27532:21;:19;:21::i;:::-;:25;;:42::i;:63::-;27510:85;-1:-1:-1;27630:58:0;27652:35;27678:8;27652:21;27510:85;27668:4;27652:15;:21::i;:35::-;27630:17;;:21;:58::i;:::-;27610:78;;27495:205;27430:270;27717:65;27766:4;:15;;;27717:44;27756:4;27717:34;27733:17;27717:4;:11;;;:15;;:34;;;;:::i;:65::-;27710:72;27066:724;-1:-1:-1;;;;;;27066:724:0:o;32879:172::-;2385:6;;-1:-1:-1;;;;;2385:6:0;916:10;2385:22;2377:67;;;;-1:-1:-1;;;2377:67:0;;;;;;;:::i;:::-;32962:5:::1;32952:6;:15;;32944:52;;;::::0;-1:-1:-1;;;32944:52:0;;6188:2:1;32944:52:0::1;::::0;::::1;6170:21:1::0;6227:2;6207:18;;;6200:30;6266:26;6246:18;;;6239:54;6310:18;;32944:52:0::1;5986:348:1::0;32944:52:0::1;33007:13;33018:1;33007:10;:13::i;:::-;33031:3;:12:::0;32879:172::o;13214:211::-;13358:58;;-1:-1:-1;;;;;6531:32:1;;13358:58:0;;;6513:51:1;6580:18;;;6573:34;;;13331:86:0;;13351:5;;-1:-1:-1;;;13381:23:0;6486:18:1;;13358:58:0;;;;-1:-1:-1;;13358:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;13358:58:0;-1:-1:-1;;;;;;13358:58:0;;;;;;;;;;13331:19;:86::i;:::-;13214:211;;;:::o;27866:600::-;27920:21;27944:8;27953:4;27944:14;;;;;;;;:::i;:::-;;;;;;;;;;;27920:38;;27992:4;:24;;;27973:15;:43;27969:82;;28033:7;27866:600;:::o;27969:82::-;28080:11;;28106:13;28102:109;;-1:-1:-1;28163:15:0;28136:24;;;;:42;-1:-1:-1;27866:600:0:o;28102:109::-;28221:19;28243:63;28290:15;;28243:42;28269:4;:15;;;28243:21;:19;:21::i;:63::-;28221:85;-1:-1:-1;28342:63:0;28369:35;28395:8;28369:21;28221:85;28385:4;28369:15;:21::i;:35::-;28342:22;;;;;:26;:63::i;:::-;28317:22;;;:88;-1:-1:-1;;28443:15:0;28416:24;;;;:42;-1:-1:-1;27866:600:0:o;5789:471::-;5847:7;6092:6;6088:47;;-1:-1:-1;6122:1:0;6115:8;;6088:47;6147:9;6159:5;6163:1;6159;:5;:::i;:::-;6147:17;-1:-1:-1;6192:1:0;6183:5;6187:1;6147:17;6183:5;:::i;:::-;:10;6175:56;;;;-1:-1:-1;;;6175:56:0;;6820:2:1;6175:56:0;;;6802:21:1;6859:2;6839:18;;;6832:30;6898:34;6878:18;;;6871:62;-1:-1:-1;;;6949:18:1;;;6942:31;6990:19;;6175:56:0;6618:397:1;6175:56:0;6251:1;-1:-1:-1;5789:471:0;;;;;:::o;6736:132::-;6794:7;6821:39;6825:1;6828;6821:39;;;;;;;;;;;;;;;;;:3;:39::i;4865:136::-;4923:7;4950:43;4954:1;4957;4950:43;;;;;;;;;;;;;;;;;:3;:43::i;13433:248::-;13604:68;;-1:-1:-1;;;;;7278:15:1;;;13604:68:0;;;7260:34:1;7330:15;;7310:18;;;7303:43;7362:18;;;7355:34;;;13577:96:0;;13597:5;;-1:-1:-1;;;13627:27:0;7195:18:1;;13604:68:0;7020:375:1;13577:96:0;13433:248;;;;:::o;4401:181::-;4459:7;;4491:5;4495:1;4491;:5;:::i;:::-;4479:17;;4520:1;4515;:6;;4507:46;;;;-1:-1:-1;;;4507:46:0;;7602:2:1;4507:46:0;;;7584:21:1;7641:2;7621:18;;;7614:30;7680:29;7660:18;;;7653:57;7727:18;;4507:46:0;7400:351:1;3325:229:0;-1:-1:-1;;;;;3399:22:0;;3391:73;;;;-1:-1:-1;;;3391:73:0;;7958:2:1;3391:73:0;;;7940:21:1;7997:2;7977:18;;;7970:30;8036:34;8016:18;;;8009:62;-1:-1:-1;;;8087:18:1;;;8080:36;8133:19;;3391:73:0;7756:402:1;3391:73:0;3501:6;;;3480:38;;-1:-1:-1;;;;;3480:38:0;;;;3501:6;;;3480:38;;;3529:6;:17;;-1:-1:-1;;;;;;3529:17:0;-1:-1:-1;;;;;3529:17:0;;;;;;;;;;3325:229::o;15749:774::-;16173:23;16199:69;16227:4;16199:69;;;;;;;;;;;;;;;;;16207:5;-1:-1:-1;;;;;16199:27:0;;;:69;;;;;:::i;:::-;16283:17;;16173:95;;-1:-1:-1;16283:21:0;16279:237;;16438:10;16427:30;;;;;;;;;;;;:::i;:::-;16419:85;;;;-1:-1:-1;;;16419:85:0;;8647:2:1;16419:85:0;;;8629:21:1;8686:2;8666:18;;;8659:30;8725:34;8705:18;;;8698:62;-1:-1:-1;;;8776:18:1;;;8769:40;8826:19;;16419:85:0;8445:406:1;7364:312:0;7484:7;7519:12;7512:5;7504:28;;;;-1:-1:-1;;;7504:28:0;;;;;;;;:::i;:::-;-1:-1:-1;7543:9:0;7555:5;7559:1;7555;:5;:::i;:::-;7543:17;7364:312;-1:-1:-1;;;;;7364:312:0:o;5304:226::-;5424:7;5460:12;5452:6;;;;5444:29;;;;-1:-1:-1;;;5444:29:0;;;;;;;;:::i;:::-;-1:-1:-1;5484:9:0;5496:5;5500:1;5496;:5;:::i;20348:230::-;20485:12;20517:53;20540:6;20548:4;20554:1;20557:12;20517:22;:53::i;:::-;20510:60;20348:230;-1:-1:-1;;;;20348:230:0:o;21836:1020::-;22009:12;22042:18;22053:6;22042:10;:18::i;:::-;22034:60;;;;-1:-1:-1;;;22034:60:0;;9709:2:1;22034:60:0;;;9691:21:1;9748:2;9728:18;;;9721:30;9787:31;9767:18;;;9760:59;9836:18;;22034:60:0;9507:353:1;22034:60:0;22168:12;22182:23;22209:6;-1:-1:-1;;;;;22209:11:0;22228:8;22238:4;22209:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22167:76;;;;22258:7;22254:595;;;22289:10;-1:-1:-1;22282:17:0;;-1:-1:-1;22282:17:0;22254:595;22403:17;;:21;22399:439;;22666:10;22660:17;22727:15;22714:10;22710:2;22706:19;22699:44;22399:439;22809:12;22802:20;;-1:-1:-1;;;22802:20:0;;;;;;;;:::i;17211:641::-;17271:4;17752:20;;17582:66;17801:23;;;;;;:42;;-1:-1:-1;;17828:15:0;;;17793:51;-1:-1:-1;;17211:641:0:o;196:180:1:-;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:1;;196:180;-1:-1:-1;196:180:1:o;817: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;5591:168::-;5631:7;5697:1;5693;5689:6;5685:14;5682:1;5679:21;5674:1;5667:9;5660:17;5656:45;5653:71;;;5704:18;;:::i;:::-;-1:-1:-1;5744:9:1;;5591:168::o;5764:217::-;5804:1;5830;5820:132;;5874:10;5869:3;5865:20;5862:1;5855:31;5909:4;5906:1;5899:15;5937:4;5934:1;5927:15;5820:132;-1:-1:-1;5966:9:1;;5764:217::o;8163:277::-;8230:6;8283:2;8271:9;8262:7;8258:23;8254:32;8251:52;;;8299:1;8296;8289:12;8251:52;8331:9;8325:16;8384:5;8377:13;8370:21;8363:5;8360:32;8350:60;;8406:1;8403;8396:12;8856:258;8928:1;8938:113;8952:6;8949:1;8946:13;8938:113;;;9028:11;;;9022:18;9009:11;;;9002:39;8974:2;8967:10;8938:113;;;9069:6;9066:1;9063:13;9060:48;;;-1:-1:-1;;9104:1:1;9086:16;;9079:27;8856:258::o;9119:383::-;9268:2;9257:9;9250:21;9231:4;9300:6;9294:13;9343:6;9338:2;9327:9;9323:18;9316:34;9359:66;9418:6;9413:2;9402:9;9398:18;9393:2;9385:6;9381:15;9359:66;:::i;:::-;9486:2;9465:15;-1:-1:-1;;9461:29:1;9446:45;;;;9493:2;9442:54;;9119:383;-1:-1:-1;;9119:383:1:o;9865:274::-;9994:3;10032:6;10026:13;10048:53;10094:6;10089:3;10082:4;10074:6;10070:17;10048:53;:::i;:::-;10117:16;;;;;9865:274;-1:-1:-1;;9865:274:1:o
Swarm Source
ipfs://d66dd5392cf1ca1d9aa153a20ff31b3bac3741464e4b8a55d434334a01e1c486
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.