Contract Overview
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x2d130381277adfc246a1ad9fd833bd9f84159a89558aca74fb4fd593f797d16e | Deposit | 58077452 | 2 days 2 hrs ago | 0xc43815bdc7effeb98765ed6574bfb0f8beafef9c | IN | 0x44d73993f4d38d7cfe856eb172fbd0d6f3c56d3c | 0 FTM | 0.007529210039 | |
0x80beb8a66512795adfe293b040e98d527f74c7083dda8d1c852438260883516e | Deposit | 58077121 | 2 days 2 hrs ago | 0xc43815bdc7effeb98765ed6574bfb0f8beafef9c | IN | 0x44d73993f4d38d7cfe856eb172fbd0d6f3c56d3c | 0 FTM | 0.01181481 | |
0x1c758888754fc343978a26a101de129991ece4c6bcae3385c5894746278c4a8d | Init | 57865612 | 5 days 3 hrs ago | 0xc43815bdc7effeb98765ed6574bfb0f8beafef9c | IN | 0x44d73993f4d38d7cfe856eb172fbd0d6f3c56d3c | 0 FTM | 0.037759572486 | |
0x967c694d0196c703d17875ca8b00e26f2e1c8a77db37bd0dc3f491afb8f6ab66 | 0x60c06040 | 57864631 | 5 days 4 hrs ago | 0xc43815bdc7effeb98765ed6574bfb0f8beafef9c | IN | Create: BarVault | 0 FTM | 0.794175017513 |
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x967c694d0196c703d17875ca8b00e26f2e1c8a77db37bd0dc3f491afb8f6ab66 | 57864631 | 5 days 4 hrs ago | 0xc43815bdc7effeb98765ed6574bfb0f8beafef9c | Contract Creation | 0 FTM |
[ Download CSV Export ]
Contract Name:
BarVault
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2023-03-18 */ // SPDX-License-Identifier: MIT // File: BarVault/interfaces/IBoostContract.sol pragma solidity ^0.8.0; interface IBoostContract { function onBarPoolUpdate( address _user, uint256 _lockedAmount, uint256 _lockedDuration, uint256 _totalLockedAmount, uint256 _maxLockDuration ) external; } // File: BarVault/interfaces/IMasterChef.sol pragma solidity ^0.8.0; interface IMasterChef { function deposit( uint256 _pid, uint256 _amount, address _referrer ) external; function withdraw(uint256 _pid, uint256 _amount) external; function pendingBar(uint256 _pid, address _user) external view returns (uint256); function userInfo(uint256 _pid, address _user) external view returns ( uint256, uint256, uint256 ); function emergencyWithdraw(uint256 _pid) external; function lpToken(uint256 _pid) external view returns (address); function poolLength() external view returns (uint256 pools); function getBoostMultiplier(address _user, uint256 _pid) external view returns (uint256); function updateBoostMultiplier( address _user, uint256 _pid, uint256 _newMultiplier ) external; } // File: BarVault/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @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"); (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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: BarVault/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: BarVault/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File: BarVault/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 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 SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: BarVault/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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 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. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: BarVault/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: BarVault/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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. */ abstract 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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 virtual onlyOwner { _transferOwnership(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 virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: BarVault/BarVault.sol pragma solidity ^0.8.0; contract BarVault is Ownable, Pausable { using SafeERC20 for IERC20; struct UserInfo { uint256 shares; // number of shares for a user. uint256 lastDepositedTime; // keep track of deposited time for potential penalty. uint256 barAtLastUserAction; // keep track of BAR deposited at the last user action. uint256 lastUserActionTime; // keep track of the last user action time. uint256 lockStartTime; // lock start time. uint256 lockEndTime; // lock end time. uint256 userBoostedShare; // boost share, in order to give the user higher reward. The user only enjoys the reward, so the principal needs to be recorded as a debt. bool locked; //lock status. uint256 lockedAmount; // amount deposited during lock period. } IERC20 public immutable vaultToken; // BAR token. IMasterChef public immutable masterchef; address public boostContract; // boost contract used in Masterchef. mapping(address => UserInfo) public userInfo; mapping(address => bool) public freePerformanceFeeUsers; // free performance fee users. mapping(address => bool) public freeWithdrawFeeUsers; // free withdraw fee users. mapping(address => bool) public freeOverdueFeeUsers; // free overdue fee users. uint256 public totalShares; address public admin; address public treasury; address public operator; uint256 public barPoolPID; uint256 public totalBoostDebt; // total boost debt. uint256 public totalLockedAmount; // total lock amount. uint256 public constant MAX_PERFORMANCE_FEE = 2000; // 20% uint256 public constant MAX_WITHDRAW_FEE = 500; // 5% uint256 public constant MAX_OVERDUE_FEE = 100 * 1e10; // 100% uint256 public constant MAX_WITHDRAW_FEE_PERIOD = 1 weeks; // 1 week uint256 public constant MIN_LOCK_DURATION = 1 weeks; // 1 week uint256 public constant MAX_LOCK_DURATION_LIMIT = 1000 days; // 1000 days uint256 public constant BOOST_WEIGHT_LIMIT = 5000 * 1e10; // 5000% uint256 public constant PRECISION_FACTOR = 1e12; // precision factor. uint256 public constant PRECISION_FACTOR_SHARE = 1e28; // precision factor for share. uint256 public constant MIN_DEPOSIT_AMOUNT = 0.00001 ether; uint256 public constant MIN_WITHDRAW_AMOUNT = 0.00001 ether; uint256 public UNLOCK_FREE_DURATION = 1 weeks; // 1 week uint256 public MAX_LOCK_DURATION = 365 days; // 365 days uint256 public DURATION_FACTOR = 365 days; // 365 days, in order to calculate user additional boost. uint256 public DURATION_FACTOR_OVERDUE = 180 days; // 180 days, in order to calculate overdue fee. uint256 public BOOST_WEIGHT = 100 * 1e10; // 100% uint256 public performanceFee = 200; // 2% uint256 public performanceFeeContract = 200; // 2% uint256 public withdrawFee = 10; // 0.1% uint256 public withdrawFeeContract = 10; // 0.1% uint256 public overdueFee = 100 * 1e10; // 100% uint256 public withdrawFeePeriod = 72 hours; // 3 days event Deposit( address indexed sender, uint256 amount, uint256 shares, uint256 duration, uint256 lastDepositedTime ); event Withdraw(address indexed sender, uint256 amount, uint256 shares); event Harvest(address indexed sender, uint256 amount); event Pause(); event Unpause(); event Init(); event Lock( address indexed sender, uint256 lockedAmount, uint256 shares, uint256 lockedDuration, uint256 blockTimestamp ); event Unlock( address indexed sender, uint256 amount, uint256 blockTimestamp ); event NewAdmin(address admin); event NewTreasury(address treasury); event NewOperator(address operator); event NewBoostContract(address boostContract); event FreeFeeUser(address indexed user, bool indexed free); event NewPerformanceFee(uint256 performanceFee); event NewPerformanceFeeContract(uint256 performanceFeeContract); event NewWithdrawFee(uint256 withdrawFee); event NewOverdueFee(uint256 overdueFee); event NewWithdrawFeeContract(uint256 withdrawFeeContract); event NewWithdrawFeePeriod(uint256 withdrawFeePeriod); event NewMaxLockDuration(uint256 maxLockDuration); event NewDurationFactor(uint256 durationFactor); event NewDurationFactorOverdue(uint256 durationFactorOverdue); event NewUnlockFreeDuration(uint256 unlockFreeDuration); event NewBoostWeight(uint256 boostWeight); /** * @notice Constructor * @param _token: BAR token contract * @param _masterchef: MasterChef contract * @param _admin: address of the admin * @param _treasury: address of the treasury (collects fees) * @param _operator: address of operator * @param _pid: bar pool ID in MasterChef */ constructor( IERC20 _token, IMasterChef _masterchef, address _admin, address _treasury, address _operator, uint256 _pid ) { vaultToken = _token; masterchef = _masterchef; admin = _admin; treasury = _treasury; operator = _operator; barPoolPID = _pid; } /** * @notice Deposits a dummy token to `MASTER_CHEF` MCV2. * It will transfer all the `dummyToken` in the tx sender address. * @param dummyToken The address of the token to be deposited into MCV2. */ function init(IERC20 dummyToken) external onlyOwner { uint256 balance = dummyToken.balanceOf(msg.sender); require(balance != 0, "Balance must exceed 0"); dummyToken.safeTransferFrom(msg.sender, address(this), balance); dummyToken.approve(address(masterchef), balance); masterchef.deposit(barPoolPID, balance, address(this)); emit Init(); } /** * @notice Checks if the msg.sender is the admin address. */ modifier onlyAdmin() { require(msg.sender == admin, "admin: wut?"); _; } /** * @notice Checks if the msg.sender is either the bar owner address or the operator address. */ modifier onlyOperatorOrBarOwner(address _user) { require( msg.sender == _user || msg.sender == operator, "Not operator or bar owner" ); _; } /** * @notice Update user info in Boost Contract. * @param _user: User address */ function updateBoostContractInfo(address _user) internal { if (boostContract != address(0)) { UserInfo storage user = userInfo[_user]; uint256 lockDuration = user.lockEndTime - user.lockStartTime; IBoostContract(boostContract).onBarPoolUpdate( _user, user.lockedAmount, lockDuration, totalLockedAmount, DURATION_FACTOR ); } } /** * @notice Update user share When need to unlock or charges a fee. * @param _user: User address */ function updateUserShare(address _user) internal { UserInfo storage user = userInfo[_user]; if (user.shares > 0) { if (user.locked) { // Calculate the user's current token amount and update related parameters. uint256 currentAmount = (balanceOf() * (user.shares)) / totalShares - user.userBoostedShare; totalBoostDebt -= user.userBoostedShare; user.userBoostedShare = 0; totalShares -= user.shares; //Charge a overdue fee after the free duration has expired. if ( !freeOverdueFeeUsers[_user] && ((user.lockEndTime + UNLOCK_FREE_DURATION) < block.timestamp) ) { uint256 earnAmount = currentAmount - user.lockedAmount; uint256 overdueDuration = block.timestamp - user.lockEndTime - UNLOCK_FREE_DURATION; if (overdueDuration > DURATION_FACTOR_OVERDUE) { overdueDuration = DURATION_FACTOR_OVERDUE; } // Rates are calculated based on the user's overdue duration. uint256 overdueWeight = (overdueDuration * overdueFee) / DURATION_FACTOR_OVERDUE; uint256 currentOverdueFee = (earnAmount * overdueWeight) / PRECISION_FACTOR; vaultToken.safeTransfer(treasury, currentOverdueFee); currentAmount -= currentOverdueFee; } // Recalculate the user's share. uint256 pool = balanceOf(); uint256 currentShares; if (totalShares != 0) { currentShares = (currentAmount * totalShares) / (pool - currentAmount); } else { currentShares = currentAmount; } user.shares = currentShares; totalShares += currentShares; // After the lock duration, update related parameters. if (user.lockEndTime < block.timestamp) { user.locked = false; user.lockStartTime = 0; user.lockEndTime = 0; totalLockedAmount -= user.lockedAmount; user.lockedAmount = 0; emit Unlock(_user, currentAmount, block.timestamp); } } else if (!freePerformanceFeeUsers[_user]) { // Calculate Performance fee. uint256 totalAmount = (user.shares * balanceOf()) / totalShares; totalShares -= user.shares; user.shares = 0; uint256 earnAmount = totalAmount - user.barAtLastUserAction; uint256 feeRate = performanceFee; if (_isContract(_user)) { feeRate = performanceFeeContract; } uint256 currentPerformanceFee = (earnAmount * feeRate) / 10000; if (currentPerformanceFee > 0) { vaultToken.safeTransfer(treasury, currentPerformanceFee); totalAmount -= currentPerformanceFee; } // Recalculate the user's share. uint256 pool = balanceOf(); uint256 newShares; if (totalShares != 0) { newShares = (totalAmount * totalShares) / (pool - totalAmount); } else { newShares = totalAmount; } user.shares = newShares; totalShares += newShares; } } } /** * @notice Unlock user BAR funds. * @dev Only possible when contract not paused. * @param _user: User address */ function unlock(address _user) external onlyOperatorOrBarOwner(_user) whenNotPaused { UserInfo storage user = userInfo[_user]; require( user.locked && user.lockEndTime < block.timestamp, "Cannot unlock yet" ); depositOperation(0, 0, _user); } /** * @notice Deposit funds into the BAR Pool. * @dev Only possible when contract not paused. * @param _amount: number of tokens to deposit (in BAR) * @param _lockDuration: Token lock duration */ function deposit(uint256 _amount, uint256 _lockDuration) external whenNotPaused { require(_amount > 0 || _lockDuration > 0, "Nothing to deposit"); depositOperation(_amount, _lockDuration, msg.sender); } /** * @notice The operation of deposite. * @param _amount: number of tokens to deposit (in BAR) * @param _lockDuration: Token lock duration * @param _user: User address */ function depositOperation( uint256 _amount, uint256 _lockDuration, address _user ) internal { UserInfo storage user = userInfo[_user]; if (user.shares == 0 || _amount > 0) { require( _amount > MIN_DEPOSIT_AMOUNT, "Deposit amount must be greater than MIN_DEPOSIT_AMOUNT" ); } // Calculate the total lock duration and check whether the lock duration meets the conditions. uint256 totalLockDuration = _lockDuration; if (user.lockEndTime >= block.timestamp) { // Adding funds during the lock duration is equivalent to re-locking the position, needs to update some variables. if (_amount > 0) { user.lockStartTime = block.timestamp; totalLockedAmount -= user.lockedAmount; user.lockedAmount = 0; } totalLockDuration += user.lockEndTime - user.lockStartTime; } require( _lockDuration == 0 || totalLockDuration >= MIN_LOCK_DURATION, "Minimum lock period is one week" ); require( totalLockDuration <= MAX_LOCK_DURATION, "Maximum lock period exceeded" ); // Harvest tokens from Masterchef. harvest(); // Handle stock funds. if (totalShares == 0) { uint256 stockAmount = available(); vaultToken.safeTransfer(treasury, stockAmount); } // Update user share. updateUserShare(_user); // Update lock duration. if (_lockDuration > 0) { if (user.lockEndTime < block.timestamp) { user.lockStartTime = block.timestamp; user.lockEndTime = block.timestamp + _lockDuration; } else { user.lockEndTime += _lockDuration; } user.locked = true; } uint256 currentShares; uint256 currentAmount; uint256 userCurrentLockedBalance; uint256 pool = balanceOf(); if (_amount > 0) { vaultToken.safeTransferFrom(_user, address(this), _amount); currentAmount = _amount; } // Calculate lock funds if (user.shares > 0 && user.locked) { userCurrentLockedBalance = (pool * user.shares) / totalShares; currentAmount += userCurrentLockedBalance; totalShares -= user.shares; user.shares = 0; // Update lock amount if (user.lockStartTime == block.timestamp) { user.lockedAmount = userCurrentLockedBalance; totalLockedAmount += user.lockedAmount; } } if (totalShares != 0) { currentShares = (currentAmount * totalShares) / (pool - userCurrentLockedBalance); } else { currentShares = currentAmount; } // Calculate the boost weight share. if (user.lockEndTime > user.lockStartTime) { // Calculate boost share. uint256 boostWeight = ((user.lockEndTime - user.lockStartTime) * BOOST_WEIGHT) / DURATION_FACTOR; uint256 boostShares = (boostWeight * currentShares) / PRECISION_FACTOR; currentShares += boostShares; user.shares += currentShares; // Calculate boost share , the user only enjoys the reward, so the principal needs to be recorded as a debt. uint256 userBoostedShare = (boostWeight * currentAmount) / PRECISION_FACTOR; user.userBoostedShare += userBoostedShare; totalBoostDebt += userBoostedShare; // Update lock amount. user.lockedAmount += _amount; totalLockedAmount += _amount; emit Lock( _user, user.lockedAmount, user.shares, (user.lockEndTime - user.lockStartTime), block.timestamp ); } else { user.shares += currentShares; } if (_amount > 0 || _lockDuration > 0) { user.lastDepositedTime = block.timestamp; } totalShares += currentShares; user.barAtLastUserAction = (user.shares * balanceOf()) / totalShares - user.userBoostedShare; user.lastUserActionTime = block.timestamp; // Update user info in Boost Contract. updateBoostContractInfo(_user); emit Deposit( _user, _amount, currentShares, _lockDuration, block.timestamp ); } /** * @notice Withdraw funds from the BAR Pool. * @param _amount: Number of amount to withdraw */ function withdrawByAmount(uint256 _amount) public whenNotPaused { require( _amount > MIN_WITHDRAW_AMOUNT, "Withdraw amount must be greater than MIN_WITHDRAW_AMOUNT" ); withdrawOperation(0, _amount); } /** * @notice Withdraw funds from the BAR Pool. * @param _shares: Number of shares to withdraw */ function withdraw(uint256 _shares) public whenNotPaused { require(_shares > 0, "Nothing to withdraw"); withdrawOperation(_shares, 0); } /** * @notice The operation of withdraw. * @param _shares: Number of shares to withdraw * @param _amount: Number of amount to withdraw */ function withdrawOperation(uint256 _shares, uint256 _amount) internal { UserInfo storage user = userInfo[msg.sender]; require(_shares <= user.shares, "Withdraw amount exceeds balance"); require(user.lockEndTime < block.timestamp, "Still in lock"); // Calculate the percent of withdraw shares, when unlocking or calculating the Performance fee, the shares will be updated. uint256 currentShare = _shares; uint256 sharesPercent = (_shares * PRECISION_FACTOR_SHARE) / user.shares; // Harvest token from Masterchef. harvest(); // Update user share. updateUserShare(msg.sender); if (_shares == 0 && _amount > 0) { uint256 pool = balanceOf(); currentShare = (_amount * totalShares) / pool; // Calculate equivalent shares if (currentShare > user.shares) { currentShare = user.shares; } } else { currentShare = (sharesPercent * user.shares) / PRECISION_FACTOR_SHARE; } uint256 currentAmount = (balanceOf() * currentShare) / totalShares; user.shares -= currentShare; totalShares -= currentShare; // Calculate withdraw fee if ( !freeWithdrawFeeUsers[msg.sender] && (block.timestamp < user.lastDepositedTime + withdrawFeePeriod) ) { uint256 feeRate = withdrawFee; if (_isContract(msg.sender)) { feeRate = withdrawFeeContract; } uint256 currentWithdrawFee = (currentAmount * feeRate) / 10000; vaultToken.safeTransfer(treasury, currentWithdrawFee); currentAmount -= currentWithdrawFee; } vaultToken.safeTransfer(msg.sender, currentAmount); if (user.shares > 0) { user.barAtLastUserAction = (user.shares * balanceOf()) / totalShares; } else { user.barAtLastUserAction = 0; } user.lastUserActionTime = block.timestamp; // Update user info in Boost Contract. updateBoostContractInfo(msg.sender); emit Withdraw(msg.sender, currentAmount, currentShare); } /** * @notice Withdraw all funds for a user */ function withdrawAll() external { withdraw(userInfo[msg.sender].shares); } /** * @notice Harvest pending BAR tokens from MasterChef */ function harvest() internal { uint256 pendingBar = masterchef.pendingBar( barPoolPID, address(this) ); if (pendingBar > 0) { uint256 balBefore = available(); masterchef.withdraw(barPoolPID, 0); uint256 balAfter = available(); emit Harvest(msg.sender, (balAfter - balBefore)); } } /** * @notice Set admin address * @dev Only callable by the contract owner. */ function setAdmin(address _admin) external onlyOwner { require(_admin != address(0), "Cannot be zero address"); admin = _admin; emit NewAdmin(admin); } /** * @notice Set treasury address * @dev Only callable by the contract owner. */ function setTreasury(address _treasury) external onlyOwner { require(_treasury != address(0), "Cannot be zero address"); treasury = _treasury; emit NewTreasury(treasury); } /** * @notice Set operator address * @dev Callable by the contract owner. */ function setOperator(address _operator) external onlyOwner { require(_operator != address(0), "Cannot be zero address"); operator = _operator; emit NewOperator(operator); } /** * @notice Set Boost Contract address * @dev Callable by the contract admin. */ function setBoostContract(address _boostContract) external onlyAdmin { require(_boostContract != address(0), "Cannot be zero address"); boostContract = _boostContract; emit NewBoostContract(boostContract); } /** * @notice Set free performance fee address * @dev Only callable by the contract admin. * @param _user: User address * @param _free: true:free false:not free */ function setFreePerformanceFeeUser(address _user, bool _free) external onlyAdmin { require(_user != address(0), "Cannot be zero address"); freePerformanceFeeUsers[_user] = _free; emit FreeFeeUser(_user, _free); } /** * @notice Set free overdue fee address * @dev Only callable by the contract admin. * @param _user: User address * @param _free: true:free false:not free */ function setOverdueFeeUser(address _user, bool _free) external onlyAdmin { require(_user != address(0), "Cannot be zero address"); freeOverdueFeeUsers[_user] = _free; emit FreeFeeUser(_user, _free); } /** * @notice Set free withdraw fee address * @dev Only callable by the contract admin. * @param _user: User address * @param _free: true:free false:not free */ function setWithdrawFeeUser(address _user, bool _free) external onlyAdmin { require(_user != address(0), "Cannot be zero address"); freeWithdrawFeeUsers[_user] = _free; emit FreeFeeUser(_user, _free); } /** * @notice Set performance fee * @dev Only callable by the contract admin. */ function setPerformanceFee(uint256 _performanceFee) external onlyAdmin { require( _performanceFee <= MAX_PERFORMANCE_FEE, "performanceFee cannot be more than MAX_PERFORMANCE_FEE" ); performanceFee = _performanceFee; emit NewPerformanceFee(performanceFee); } /** * @notice Set performance fee for contract * @dev Only callable by the contract admin. */ function setPerformanceFeeContract(uint256 _performanceFeeContract) external onlyAdmin { require( _performanceFeeContract <= MAX_PERFORMANCE_FEE, "performanceFee cannot be more than MAX_PERFORMANCE_FEE" ); performanceFeeContract = _performanceFeeContract; emit NewPerformanceFeeContract(performanceFeeContract); } /** * @notice Set withdraw fee * @dev Only callable by the contract admin. */ function setWithdrawFee(uint256 _withdrawFee) external onlyAdmin { require( _withdrawFee <= MAX_WITHDRAW_FEE, "withdrawFee cannot be more than MAX_WITHDRAW_FEE" ); withdrawFee = _withdrawFee; emit NewWithdrawFee(withdrawFee); } /** * @notice Set overdue fee * @dev Only callable by the contract admin. */ function setOverdueFee(uint256 _overdueFee) external onlyAdmin { require( _overdueFee <= MAX_OVERDUE_FEE, "overdueFee cannot be more than MAX_OVERDUE_FEE" ); overdueFee = _overdueFee; emit NewOverdueFee(_overdueFee); } /** * @notice Set withdraw fee for contract * @dev Only callable by the contract admin. */ function setWithdrawFeeContract(uint256 _withdrawFeeContract) external onlyAdmin { require( _withdrawFeeContract <= MAX_WITHDRAW_FEE, "withdrawFee cannot be more than MAX_WITHDRAW_FEE" ); withdrawFeeContract = _withdrawFeeContract; emit NewWithdrawFeeContract(withdrawFeeContract); } /** * @notice Set withdraw fee period * @dev Only callable by the contract admin. */ function setWithdrawFeePeriod(uint256 _withdrawFeePeriod) external onlyAdmin { require( _withdrawFeePeriod <= MAX_WITHDRAW_FEE_PERIOD, "withdrawFeePeriod cannot be more than MAX_WITHDRAW_FEE_PERIOD" ); withdrawFeePeriod = _withdrawFeePeriod; emit NewWithdrawFeePeriod(withdrawFeePeriod); } /** * @notice Set MAX_LOCK_DURATION * @dev Only callable by the contract admin. */ function setMaxLockDuration(uint256 _maxLockDuration) external onlyAdmin { require( _maxLockDuration <= MAX_LOCK_DURATION_LIMIT, "MAX_LOCK_DURATION cannot be more than MAX_LOCK_DURATION_LIMIT" ); MAX_LOCK_DURATION = _maxLockDuration; emit NewMaxLockDuration(_maxLockDuration); } /** * @notice Set DURATION_FACTOR * @dev Only callable by the contract admin. */ function setDurationFactor(uint256 _durationFactor) external onlyAdmin { require(_durationFactor > 0, "DURATION_FACTOR cannot be zero"); DURATION_FACTOR = _durationFactor; emit NewDurationFactor(_durationFactor); } /** * @notice Set DURATION_FACTOR_OVERDUE * @dev Only callable by the contract admin. */ function setDurationFactorOverdue(uint256 _durationFactorOverdue) external onlyAdmin { require( _durationFactorOverdue > 0, "DURATION_FACTOR_OVERDUE cannot be zero" ); DURATION_FACTOR_OVERDUE = _durationFactorOverdue; emit NewDurationFactorOverdue(_durationFactorOverdue); } /** * @notice Set UNLOCK_FREE_DURATION * @dev Only callable by the contract admin. */ function setUnlockFreeDuration(uint256 _unlockFreeDuration) external onlyAdmin { require(_unlockFreeDuration > 0, "UNLOCK_FREE_DURATION cannot be zero"); UNLOCK_FREE_DURATION = _unlockFreeDuration; emit NewUnlockFreeDuration(_unlockFreeDuration); } /** * @notice Set BOOST_WEIGHT * @dev Only callable by the contract admin. */ function setBoostWeight(uint256 _boostWeight) external onlyAdmin { require( _boostWeight <= BOOST_WEIGHT_LIMIT, "BOOST_WEIGHT cannot be more than BOOST_WEIGHT_LIMIT" ); BOOST_WEIGHT = _boostWeight; emit NewBoostWeight(_boostWeight); } /** * @notice Withdraw unexpected tokens sent to the BAR Pool */ function inCaseTokensGetStuck(address _token) external onlyAdmin { require( _token != address(vaultToken), "Token cannot be same as deposit token" ); uint256 amount = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransfer(msg.sender, amount); } /** * @notice Trigger stopped state * @dev Only possible when contract not paused. */ function pause() external onlyAdmin whenNotPaused { _pause(); emit Pause(); } /** * @notice Return to normal state * @dev Only possible when contract is paused. */ function unpause() external onlyAdmin whenPaused { _unpause(); emit Unpause(); } /** * @notice Calculate Performance fee. * @param _user: User address * @return Returns Performance fee. */ function calculatePerformanceFee(address _user) public view returns (uint256) { UserInfo storage user = userInfo[_user]; if ( user.shares > 0 && !user.locked && !freePerformanceFeeUsers[_user] ) { uint256 pool = balanceOf() + calculateTotalPendingBarRewards(); uint256 totalAmount = (user.shares * pool) / totalShares; uint256 earnAmount = totalAmount - user.barAtLastUserAction; uint256 feeRate = performanceFee; if (_isContract(_user)) { feeRate = performanceFeeContract; } uint256 currentPerformanceFee = (earnAmount * feeRate) / 10000; return currentPerformanceFee; } return 0; } /** * @notice Calculate overdue fee. * @param _user: User address * @return Returns Overdue fee. */ function calculateOverdueFee(address _user) public view returns (uint256) { UserInfo storage user = userInfo[_user]; if ( user.shares > 0 && user.locked && !freeOverdueFeeUsers[_user] && ((user.lockEndTime + UNLOCK_FREE_DURATION) < block.timestamp) ) { uint256 pool = balanceOf() + calculateTotalPendingBarRewards(); uint256 currentAmount = (pool * (user.shares)) / totalShares - user.userBoostedShare; uint256 earnAmount = currentAmount - user.lockedAmount; uint256 overdueDuration = block.timestamp - user.lockEndTime - UNLOCK_FREE_DURATION; if (overdueDuration > DURATION_FACTOR_OVERDUE) { overdueDuration = DURATION_FACTOR_OVERDUE; } // Rates are calculated based on the user's overdue duration. uint256 overdueWeight = (overdueDuration * overdueFee) / DURATION_FACTOR_OVERDUE; uint256 currentOverdueFee = (earnAmount * overdueWeight) / PRECISION_FACTOR; return currentOverdueFee; } return 0; } /** * @notice Calculate Performance Fee Or Overdue Fee * @param _user: User address * @return Returns Performance Fee Or Overdue Fee. */ function calculatePerformanceFeeOrOverdueFee(address _user) internal view returns (uint256) { return calculatePerformanceFee(_user) + calculateOverdueFee(_user); } /** * @notice Calculate withdraw fee. * @param _user: User address * @param _shares: Number of shares to withdraw * @return Returns Withdraw fee. */ function calculateWithdrawFee(address _user, uint256 _shares) public view returns (uint256) { UserInfo storage user = userInfo[_user]; if (user.shares < _shares) { _shares = user.shares; } if ( !freeWithdrawFeeUsers[msg.sender] && (block.timestamp < user.lastDepositedTime + withdrawFeePeriod) ) { uint256 pool = balanceOf() + calculateTotalPendingBarRewards(); uint256 sharesPercent = (_shares * PRECISION_FACTOR) / user.shares; uint256 currentTotalAmount = (pool * (user.shares)) / totalShares - user.userBoostedShare - calculatePerformanceFeeOrOverdueFee(_user); uint256 currentAmount = (currentTotalAmount * sharesPercent) / PRECISION_FACTOR; uint256 feeRate = withdrawFee; if (_isContract(msg.sender)) { feeRate = withdrawFeeContract; } uint256 currentWithdrawFee = (currentAmount * feeRate) / 10000; return currentWithdrawFee; } return 0; } /** * @notice Calculates the total pending rewards that can be harvested * @return Returns total pending BAR rewards */ function calculateTotalPendingBarRewards() public view returns (uint256) { uint256 amount = masterchef.pendingBar(barPoolPID, address(this)); return amount; } function getPricePerFullShare() external view returns (uint256) { return totalShares == 0 ? 1e18 : (((balanceOf() + calculateTotalPendingBarRewards()) * (1e18)) / totalShares); } /** * @notice Current pool available balance * @dev The contract puts 100% of the tokens to work. */ function available() public view returns (uint256) { return vaultToken.balanceOf(address(this)); } /** * @notice Calculates the total underlying tokens * @dev It includes tokens held by the contract and the boost debt amount. */ function balanceOf() public view returns (uint256) { return vaultToken.balanceOf(address(this)) + totalBoostDebt; } /** * @notice Checks if address is a contract */ function _isContract(address addr) internal view returns (bool) { uint256 size; assembly { size := extcodesize(addr) } return size > 0; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bool","name":"free","type":"bool"}],"name":"FreeFeeUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[],"name":"Init","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockedDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockTimestamp","type":"uint256"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"boostContract","type":"address"}],"name":"NewBoostContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"boostWeight","type":"uint256"}],"name":"NewBoostWeight","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"durationFactor","type":"uint256"}],"name":"NewDurationFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"durationFactorOverdue","type":"uint256"}],"name":"NewDurationFactorOverdue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxLockDuration","type":"uint256"}],"name":"NewMaxLockDuration","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"NewOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"overdueFee","type":"uint256"}],"name":"NewOverdueFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"performanceFee","type":"uint256"}],"name":"NewPerformanceFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"performanceFeeContract","type":"uint256"}],"name":"NewPerformanceFeeContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"NewTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"unlockFreeDuration","type":"uint256"}],"name":"NewUnlockFreeDuration","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawFee","type":"uint256"}],"name":"NewWithdrawFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawFeeContract","type":"uint256"}],"name":"NewWithdrawFeeContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawFeePeriod","type":"uint256"}],"name":"NewWithdrawFeePeriod","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":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockTimestamp","type":"uint256"}],"name":"Unlock","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BOOST_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOOST_WEIGHT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DURATION_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DURATION_FACTOR_OVERDUE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LOCK_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LOCK_DURATION_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_OVERDUE_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PERFORMANCE_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WITHDRAW_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WITHDRAW_FEE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_DEPOSIT_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_LOCK_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_WITHDRAW_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION_FACTOR_SHARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNLOCK_FREE_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"available","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"barPoolPID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boostContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"calculateOverdueFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"calculatePerformanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateTotalPendingBarRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"calculateWithdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_lockDuration","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeOverdueFeeUsers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freePerformanceFeeUsers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeWithdrawFeeUsers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"dummyToken","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"overdueFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFeeContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_boostContract","type":"address"}],"name":"setBoostContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boostWeight","type":"uint256"}],"name":"setBoostWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_durationFactor","type":"uint256"}],"name":"setDurationFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_durationFactorOverdue","type":"uint256"}],"name":"setDurationFactorOverdue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_free","type":"bool"}],"name":"setFreePerformanceFeeUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxLockDuration","type":"uint256"}],"name":"setMaxLockDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_overdueFee","type":"uint256"}],"name":"setOverdueFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_free","type":"bool"}],"name":"setOverdueFeeUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFeeContract","type":"uint256"}],"name":"setPerformanceFeeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_unlockFreeDuration","type":"uint256"}],"name":"setUnlockFreeDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawFee","type":"uint256"}],"name":"setWithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawFeeContract","type":"uint256"}],"name":"setWithdrawFeeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawFeePeriod","type":"uint256"}],"name":"setWithdrawFeePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_free","type":"bool"}],"name":"setWithdrawFeeUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalBoostDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","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":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"lastDepositedTime","type":"uint256"},{"internalType":"uint256","name":"barAtLastUserAction","type":"uint256"},{"internalType":"uint256","name":"lastUserActionTime","type":"uint256"},{"internalType":"uint256","name":"lockStartTime","type":"uint256"},{"internalType":"uint256","name":"lockEndTime","type":"uint256"},{"internalType":"uint256","name":"userBoostedShare","type":"uint256"},{"internalType":"bool","name":"locked","type":"bool"},{"internalType":"uint256","name":"lockedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawByAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFeeContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFeePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c060405262093a80600d556301e13380600e556301e13380600f5562ed4e0060105564e8d4a5100060115560c860125560c8601355600a601455600a60155564e8d4a510006016556203f4806017553480156200005c57600080fd5b5060405162003be438038062003be48339810160408190526200007f916200014a565b6200008a33620000fa565b6000805460ff60a01b191690556001600160601b0319606096871b81166080529490951b90931660a052600780546001600160a01b039384166001600160a01b031991821617909155600880549284169282169290921790915560098054929093169116179055600a55620001ea565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060008060008060c0878903121562000163578182fd5b86516200017081620001d1565b60208801519096506200018381620001d1565b60408801519095506200019681620001d1565b6060880151909450620001a981620001d1565b6080880151909350620001bc81620001d1565b8092505060a087015190509295509295509295565b6001600160a01b0381168114620001e757600080fd5b50565b60805160601c60a05160601c61396c620002786000396000818161095701528181610bd701528181610c8a0152818161116b01528181612e7b0152612f330152600081816106e001528181611306015281816115f401528181611e05015281816125430152818161258801528181612813015281816128c301528181613155015261333e015261396c6000f3fe608060405234801561001057600080fd5b506004361061043e5760003560e01c8063853828b611610236578063c54d349c1161013b578063e464c623116100c3578063f2fde38b11610087578063f2fde38b14610919578063f786b9581461092c578063f851a4401461093f578063fb1db27814610952578063fd253b641461097957600080fd5b8063e464c623146108e2578063e4b37ef5146108eb578063e73008bc146108f4578063e941fa78146108fd578063f0f442601461090657600080fd5b8063def68a9c1161010a578063def68a9c1461088d578063def7869d146108a0578063df10b4e6146108b3578063dfcedeee146108bc578063e2bbb158146108cf57600080fd5b8063c54d349c1461085e578063c6ed51be14610871578063ccd34cd5146107b3578063d4b0de2f1461088457600080fd5b8063aaada5da116101be578063b6ac642a1161018d578063b6ac642a14610813578063bb9f408d14610826578063bc75f4b814610839578063bdca916514610842578063beba0fa01461084b57600080fd5b8063aaada5da146107ee578063acaf88cd146107f7578063b3ab15fb14610800578063b68578441461055357600080fd5b806393c99e6a1161020557806393c99e6a146107a0578063948a03f2146107b357806395dc14e1146107bf578063a3639b39146107d2578063a5834e06146107e557600080fd5b8063853828b61461075b578063877887821461076357806387d4bda91461076c5780638da5cb5b1461078f57600080fd5b80633fec4e3211610347578063668679ba116102cf578063722713f711610293578063722713f714610730578063731ff24a1461073857806377c7b8fc1461074b57806378b4330f146105865780638456cb591461075357600080fd5b8063668679ba146106b8578063703bafd5146106db578063704b6c021461070257806370897b2314610715578063715018a61461072857600080fd5b80634f1bfc9e116103165780634f1bfc9e1461064c5780635521e9bf14610655578063570ca735146106685780635c975abb1461069357806361d027b3146106a557600080fd5b80633fec4e32146105eb578063423b93ed1461061e57806348a0d754146106315780634e4de1e91461063957600080fd5b806329a5cfd6116103ca578063359819211161039957806335981921146105b65780633662ff04146105c95780633a98ef39146105d15780633eb78874146105da5780633f4ba83a146105e357600080fd5b806329a5cfd6146105735780632cfc5f01146105865780632e1a7d4d146105905780632f6c493c146105a357600080fd5b806314ff30391161041157806314ff3039146104885780631959a0021461049b57806319ab453c146105405780631ea30fef146105535780631efac1b81461056057600080fd5b806301e813261461044357806305a9f274146104615780630c59696b1461046a57806314f994181461047f575b600080fd5b61044e6305265c0081565b6040519081526020015b60405180910390f35b61044e600c5481565b61047d6104783660046136c8565b610986565b005b61044e600a5481565b61047d6104963660046136c8565b610a61565b6104fa6104a936600461362d565b60026020819052600091825260409091208054600182015492820154600383015460048401546005850154600686015460078701546008909701549597969495939492939192909160ff9091169089565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c0840152151560e083015261010082015261012001610458565b61047d61054e36600461362d565b610ae2565b61044e6509184e72a00081565b61047d61056e3660046136c8565b610d1b565b61044e610581366004613681565b610df3565b61044e62093a8081565b61047d61059e3660046136c8565b610f2e565b61047d6105b136600461362d565b610f8a565b61047d6105c43660046136c8565b611080565b61044e61113e565b61044e60065481565b61044e60135481565b61047d6111e5565b61060e6105f936600461362d565b60036020526000908152604090205460ff1681565b6040519015158152602001610458565b61047d61062c366004613649565b61124a565b61044e6112ee565b61047d610647366004613649565b61138d565b61044e600e5481565b61047d6106633660046136c8565b611431565b60095461067b906001600160a01b031681565b6040516001600160a01b039091168152602001610458565b600054600160a01b900460ff1661060e565b60085461067b906001600160a01b031681565b61060e6106c636600461362d565b60056020526000908152604090205460ff1681565b61067b7f000000000000000000000000000000000000000000000000000000000000000081565b61047d61071036600461362d565b6114bf565b61047d6107233660046136c8565b61153b565b61047d6115bc565b61044e6115d0565b61044e6b204fce5e3e2502611000000081565b61044e611678565b61047d6116ca565b61047d61172f565b61044e60125481565b61060e61077a36600461362d565b60046020526000908152604090205460ff1681565b6000546001600160a01b031661067b565b61047d6107ae3660046136c8565b611748565b61044e64e8d4a5100081565b61044e6107cd36600461362d565b611819565b61047d6107e03660046136c8565b61196e565b61044e60165481565b61044e600d5481565b61044e60105481565b61047d61080e36600461362d565b611a1d565b61047d6108213660046136c8565b611a99565b61047d6108343660046136c8565b611b1a565b61044e60115481565b61044e6107d081565b61047d610859366004613649565b611b9b565b61047d61086c3660046136c8565b611c3f565b61044e61087f36600461362d565b611cfa565b61044e6101f481565b61047d61089b36600461362d565b611dd9565b61047d6108ae36600461362d565b611f27565b61044e60175481565b60015461067b906001600160a01b031681565b61047d6108dd3660046136f8565b611fc5565b61044e600f5481565b61044e60155481565b61044e600b5481565b61044e60145481565b61047d61091436600461362d565b612028565b61047d61092736600461362d565b6120a4565b61047d61093a3660046136c8565b61211a565b60075461067b906001600160a01b031681565b61067b7f000000000000000000000000000000000000000000000000000000000000000081565b61044e652d79883d200081565b6007546001600160a01b031633146109b95760405162461bcd60e51b81526004016109b0906137ee565b60405180910390fd5b64e8d4a51000811115610a255760405162461bcd60e51b815260206004820152602e60248201527f6f7665726475654665652063616e6e6f74206265206d6f7265207468616e204d60448201526d41585f4f5645524455455f46454560901b60648201526084016109b0565b60168190556040518181527ff4bd1c5978320077e792afbb3911e8cab1325ce28a6b3e67f9067a1d80692961906020015b60405180910390a150565b6007546001600160a01b03163314610a8b5760405162461bcd60e51b81526004016109b0906137ee565b6101f4811115610aad5760405162461bcd60e51b81526004016109b090613813565b60158190556040518181527fcab352e118188b8a2f20a2e8c4ce1241ce2c1740aac4f17c5b0831e65824d8ef90602001610a56565b610aea6121f3565b6040516370a0823160e01b81523360048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610b2c57600080fd5b505afa158015610b40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6491906136e0565b905080610bab5760405162461bcd60e51b8152602060048201526015602482015274042616c616e6365206d75737420657863656564203605c1b60448201526064016109b0565b610bc06001600160a01b03831633308461224d565b60405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820183905283169063095ea7b390604401602060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6291906136ac565b50600a54604051638dbdbe6d60e01b81526004810191909152602481018290523060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690638dbdbe6d90606401600060405180830381600087803b158015610cd657600080fd5b505af1158015610cea573d6000803e3d6000fd5b50506040517f57a86f7d14ccde89e22870afe839e3011216827daa9b24e18629f0a1e9d6cc14925060009150a15050565b6007546001600160a01b03163314610d455760405162461bcd60e51b81526004016109b0906137ee565b62093a80811115610dbe5760405162461bcd60e51b815260206004820152603d60248201527f7769746864726177466565506572696f642063616e6e6f74206265206d6f726560448201527f207468616e204d41585f57495448445241575f4645455f504552494f4400000060648201526084016109b0565b60178190556040518181527fb89ddaddb7435be26824cb48d2d0186c9525a2e1ec057abcb502704cdc0686cc90602001610a56565b6001600160a01b03821660009081526002602052604081208054831115610e1957805492505b3360009081526004602052604090205460ff16158015610e4957506017548160010154610e469190613863565b42105b15610f22576000610e5861113e565b610e606115d0565b610e6a9190613863565b8254909150600090610e8164e8d4a510008761389b565b610e8b919061387b565b90506000610e98876122be565b60068086015490548654610eac908761389b565b610eb6919061387b565b610ec091906138ba565b610eca91906138ba565b9050600064e8d4a51000610ede848461389b565b610ee8919061387b565b601454909150333b15610efa57506015545b6000612710610f09838561389b565b610f13919061387b565b9750610f289650505050505050565b60009150505b92915050565b610f366122dc565b60008111610f7c5760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b60448201526064016109b0565b610f87816000612329565b50565b80336001600160a01b0382161480610fac57506009546001600160a01b031633145b610ff85760405162461bcd60e51b815260206004820152601960248201527f4e6f74206f70657261746f72206f7220626172206f776e65720000000000000060448201526064016109b0565b6110006122dc565b6001600160a01b0382166000908152600260205260409020600781015460ff16801561102f5750428160050154105b61106f5760405162461bcd60e51b815260206004820152601160248201527010d85b9b9bdd081d5b9b1bd8dac81e595d607a1b60448201526064016109b0565b61107b6000808561263b565b505050565b6007546001600160a01b031633146110aa5760405162461bcd60e51b81526004016109b0906137ee565b600081116111095760405162461bcd60e51b815260206004820152602660248201527f4455524154494f4e5f464143544f525f4f5645524455452063616e6e6f74206260448201526565207a65726f60d01b60648201526084016109b0565b60108190556040518181527f18b6d179114082d7eda9837e15a39eb30032d5f3df00487a67541398f48fabfe90602001610a56565b600a54604051630e87e35f60e41b8152600481019190915230602482015260009081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e87e35f09060440160206040518083038186803b1580156111ad57600080fd5b505afa1580156111c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2891906136e0565b6007546001600160a01b0316331461120f5760405162461bcd60e51b81526004016109b0906137ee565b611217612c1e565b61121f612c6e565b6040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b6007546001600160a01b031633146112745760405162461bcd60e51b81526004016109b0906137ee565b6001600160a01b03821661129a5760405162461bcd60e51b81526004016109b0906137be565b6001600160a01b038216600081815260036020526040808220805460ff191685151590811790915590519092917f3d7902bc9a6665bd7caf4240b834bb805d3cd68256889e9f8d2e40a10be41d4491a35050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561135057600080fd5b505afa158015611364573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138891906136e0565b905090565b6007546001600160a01b031633146113b75760405162461bcd60e51b81526004016109b0906137ee565b6001600160a01b0382166113dd5760405162461bcd60e51b81526004016109b0906137be565b6001600160a01b038216600081815260056020526040808220805460ff191685151590811790915590519092917f3d7902bc9a6665bd7caf4240b834bb805d3cd68256889e9f8d2e40a10be41d4491a35050565b6114396122dc565b6509184e72a00081116114b45760405162461bcd60e51b815260206004820152603860248201527f576974686472617720616d6f756e74206d75737420626520677265617465722060448201527f7468616e204d494e5f57495448445241575f414d4f554e54000000000000000060648201526084016109b0565b610f87600082612329565b6114c76121f3565b6001600160a01b0381166114ed5760405162461bcd60e51b81526004016109b0906137be565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c90602001610a56565b6007546001600160a01b031633146115655760405162461bcd60e51b81526004016109b0906137ee565b6107d08111156115875760405162461bcd60e51b81526004016109b090613768565b60128190556040518181527fefeafcf03e479a9566d7ef321b4816de0ba19cfa3cd0fae2f8c5f4a0afb342c490602001610a56565b6115c46121f3565b6115ce6000612cc3565b565b600b546040516370a0823160e01b8152306004820152600091906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561163657600080fd5b505afa15801561164a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166e91906136e0565b6113889190613863565b60006006546000146116bd5760065461168f61113e565b6116976115d0565b6116a19190613863565b6116b390670de0b6b3a764000061389b565b611388919061387b565b50670de0b6b3a764000090565b6007546001600160a01b031633146116f45760405162461bcd60e51b81526004016109b0906137ee565b6116fc6122dc565b611704612d13565b6040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b336000908152600260205260409020546115ce90610f2e565b6007546001600160a01b031633146117725760405162461bcd60e51b81526004016109b0906137ee565b652d79883d20008111156117e45760405162461bcd60e51b815260206004820152603360248201527f424f4f53545f5745494748542063616e6e6f74206265206d6f7265207468616e604482015272081093d3d4d517d5d15251d21517d312535255606a1b60648201526084016109b0565b60118190556040518181527f7666dfff8c3377938e522b4eed3aff079973a976f95969db60a406d49f40da4e90602001610a56565b6001600160a01b03811660009081526002602052604081208054158015906118455750600781015460ff165b801561186a57506001600160a01b03831660009081526005602052604090205460ff16155b8015611886575042600d5482600501546118849190613863565b105b1561196557600061189561113e565b61189d6115d0565b6118a79190613863565b9050600082600601546006548460000154846118c3919061389b565b6118cd919061387b565b6118d791906138ba565b905060008360080154826118eb91906138ba565b90506000600d5485600501544261190291906138ba565b61190c91906138ba565b905060105481111561191d57506010545b600060105460165483611930919061389b565b61193a919061387b565b9050600064e8d4a5100061194e838661389b565b611958919061387b565b9998505050505050505050565b50600092915050565b6007546001600160a01b031633146119985760405162461bcd60e51b81526004016109b0906137ee565b600081116119e85760405162461bcd60e51b815260206004820152601e60248201527f4455524154494f4e5f464143544f522063616e6e6f74206265207a65726f000060448201526064016109b0565b600f8190556040518181527f9478eb023aac0a7d58a4e935377056bf27cf5b72a2300725f831817a8f62fbde90602001610a56565b611a256121f3565b6001600160a01b038116611a4b5760405162461bcd60e51b81526004016109b0906137be565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527fda12ee837e6978172aaf54b16145ffe08414fd8710092ef033c71b8eb6ec189a90602001610a56565b6007546001600160a01b03163314611ac35760405162461bcd60e51b81526004016109b0906137ee565b6101f4811115611ae55760405162461bcd60e51b81526004016109b090613813565b60148190556040518181527fd5fe46099fa396290a7f57e36c3c3c8774e2562c18ed5d1dcc0fa75071e03f1d90602001610a56565b6007546001600160a01b03163314611b445760405162461bcd60e51b81526004016109b0906137ee565b6107d0811115611b665760405162461bcd60e51b81526004016109b090613768565b60138190556040518181527fc5d25457b67b87678c987375af13f6e50beb3ad7bfd009da26766ae986eaa20d90602001610a56565b6007546001600160a01b03163314611bc55760405162461bcd60e51b81526004016109b0906137ee565b6001600160a01b038216611beb5760405162461bcd60e51b81526004016109b0906137be565b6001600160a01b038216600081815260046020526040808220805460ff191685151590811790915590519092917f3d7902bc9a6665bd7caf4240b834bb805d3cd68256889e9f8d2e40a10be41d4491a35050565b6007546001600160a01b03163314611c695760405162461bcd60e51b81526004016109b0906137ee565b60008111611cc55760405162461bcd60e51b815260206004820152602360248201527f554e4c4f434b5f465245455f4455524154494f4e2063616e6e6f74206265207a60448201526265726f60e81b60648201526084016109b0565b600d8190556040518181527ff84bf2b901cfc02956d4e69556d7448cef4ea13587e7714dba7c6d697091e7ad90602001610a56565b6001600160a01b0381166000908152600260205260408120805415801590611d275750600781015460ff16155b8015611d4c57506001600160a01b03831660009081526003602052604090205460ff16155b15611965576000611d5b61113e565b611d636115d0565b611d6d9190613863565b90506000600654828460000154611d84919061389b565b611d8e919061387b565b90506000836002015482611da291906138ba565b601254909150863b15611db457506013545b6000612710611dc3838561389b565b611dcd919061387b565b98975050505050505050565b6007546001600160a01b03163314611e035760405162461bcd60e51b81526004016109b0906137ee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415611e935760405162461bcd60e51b815260206004820152602560248201527f546f6b656e2063616e6e6f742062652073616d65206173206465706f736974206044820152643a37b5b2b760d91b60648201526084016109b0565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015611ed557600080fd5b505afa158015611ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0d91906136e0565b9050611f236001600160a01b0383163383612d56565b5050565b6007546001600160a01b03163314611f515760405162461bcd60e51b81526004016109b0906137ee565b6001600160a01b038116611f775760405162461bcd60e51b81526004016109b0906137be565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f8f49a182922022d9119a1a6aeeca151b4a5665e86bd61c1ff32e152d459558b290602001610a56565b611fcd6122dc565b6000821180611fdc5750600081115b61201d5760405162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc819195c1bdcda5d60721b60448201526064016109b0565b611f2382823361263b565b6120306121f3565b6001600160a01b0381166120565760405162461bcd60e51b81526004016109b0906137be565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527fafa147634b29e2c7bd53ce194256b9f41cfb9ba3036f2b822fdd1d965beea08690602001610a56565b6120ac6121f3565b6001600160a01b0381166121115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b0565b610f8781612cc3565b6007546001600160a01b031633146121445760405162461bcd60e51b81526004016109b0906137ee565b6305265c008111156121be5760405162461bcd60e51b815260206004820152603d60248201527f4d41585f4c4f434b5f4455524154494f4e2063616e6e6f74206265206d6f726560448201527f207468616e204d41585f4c4f434b5f4455524154494f4e5f4c494d495400000060648201526084016109b0565b600e8190556040518181527fcab2f3455b51b6ca5377e84fccd0f890b6f6ca36c02e18b6d36cb34f469fe4fe90602001610a56565b6000546001600160a01b031633146115ce5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b0565b6040516001600160a01b03808516602483015283166044820152606481018290526122b89085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d86565b50505050565b60006122c982611819565b6122d283611cfa565b610f289190613863565b600054600160a01b900460ff16156115ce5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016109b0565b33600090815260026020526040902080548311156123895760405162461bcd60e51b815260206004820152601f60248201527f576974686472617720616d6f756e7420657863656564732062616c616e63650060448201526064016109b0565b428160050154106123cc5760405162461bcd60e51b815260206004820152600d60248201526c5374696c6c20696e206c6f636b60981b60448201526064016109b0565b805483906000906123e96b204fce5e3e250261100000008461389b565b6123f3919061387b565b90506123fd612e58565b61240633612fe5565b841580156124145750600084115b156124555760006124236115d0565b90508060065486612434919061389b565b61243e919061387b565b845490935083111561244f57835492505b5061247c565b82546b204fce5e3e250261100000009061246f908361389b565b612479919061387b565b91505b60006006548361248a6115d0565b612494919061389b565b61249e919061387b565b9050828460000160008282546124b491906138ba565b9250508190555082600660008282546124cd91906138ba565b90915550503360009081526004602052604090205460ff16158015612502575060175484600101546124ff9190613863565b42105b1561257b57601454333b1561251657506015545b6000612710612525838561389b565b61252f919061387b565b60085490915061256c906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683612d56565b61257681846138ba565b925050505b6125af6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383612d56565b8354156125e1576006546125c16115d0565b85546125cd919061389b565b6125d7919061387b565b60028501556125e9565b600060028501555b4260038501556125f8336133de565b604080518281526020810185905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a2505050505050565b6001600160a01b0381166000908152600260205260409020805415806126615750600084115b156126da576509184e72a00084116126da5760405162461bcd60e51b815260206004820152603660248201527f4465706f73697420616d6f756e74206d757374206265206772656174657220746044820152751a185b8813525397d1115413d4d25517d05353d5539560521b60648201526084016109b0565b600581015483904211612738578415612717574260048301556008820154600c805460009061270a9084906138ba565b9091555050600060088301555b8160040154826005015461272b91906138ba565b6127359082613863565b90505b831580612748575062093a808110155b6127945760405162461bcd60e51b815260206004820152601f60248201527f4d696e696d756d206c6f636b20706572696f64206973206f6e65207765656b0060448201526064016109b0565b600e548111156127e65760405162461bcd60e51b815260206004820152601c60248201527f4d6178696d756d206c6f636b20706572696f642065786365656465640000000060448201526064016109b0565b6127ee612e58565b60065461283e5760006127ff6112ee565b60085490915061283c906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683612d56565b505b61284783612fe5565b83156128a057428260050154101561287657426004830181905561286c908590613863565b6005830155612890565b8382600501600082825461288a9190613863565b90915550505b60078201805460ff191660011790555b6000806000806128ae6115d0565b905088156128ef576128eb6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001688308c61224d565b8892505b8554158015906129035750600786015460ff165b1561297c576006548654612917908361389b565b612921919061387b565b915061292d8284613863565b925085600001546006600082825461294591906138ba565b909155505060008655600486015442141561297c5760088601829055600c8054839190600090612976908490613863565b90915550505b600654156129ac5761298e82826138ba565b60065461299b908561389b565b6129a5919061387b565b93506129b0565b8293505b856004015486600501541115612b31576000600f54601154886004015489600501546129dc91906138ba565b6129e6919061389b565b6129f0919061387b565b9050600064e8d4a51000612a04878461389b565b612a0e919061387b565b9050612a1a8187613863565b955085886000016000828254612a309190613863565b909155506000905064e8d4a51000612a48878561389b565b612a52919061387b565b905080896006016000828254612a689190613863565b9250508190555080600b6000828254612a819190613863565b925050819055508b896008016000828254612a9c9190613863565b925050819055508b600c6000828254612ab59190613863565b92505081905550896001600160a01b03167f2b943276e5d747f6f7dd46d3b880d8874cb8d6b9b88ca1903990a2738e7dc7a18a600801548b600001548c600401548d60050154612b0591906138ba565b6040805193845260208401929092529082015242606082015260800160405180910390a2505050612b4b565b83866000016000828254612b459190613863565b90915550505b6000891180612b5a5750600088115b15612b66574260018701555b8360066000828254612b789190613863565b90915550506006808701549054612b8d6115d0565b8854612b99919061389b565b612ba3919061387b565b612bad91906138ba565b6002870155426003870155612bc1876133de565b604080518a8152602081018690529081018990524260608201526001600160a01b038816907f7162984403f6c73c8639375d45a9187dfd04602231bd8e587c415718b5f7e5f99060800160405180910390a2505050505050505050565b600054600160a01b900460ff166115ce5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016109b0565b612c76612c1e565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612d1b6122dc565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ca63390565b6040516001600160a01b03831660248201526044810182905261107b90849063a9059cbb60e01b90606401612281565b6000612ddb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166134aa9092919063ffffffff16565b80519091501561107b5780806020019051810190612df991906136ac565b61107b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109b0565b600a54604051630e87e35f60e41b815260048101919091523060248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e87e35f09060440160206040518083038186803b158015612ec557600080fd5b505afa158015612ed9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612efd91906136e0565b90508015610f87576000612f0f6112ee565b600a54604051630441a3e760e41b81526004810191909152600060248201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063441a3e7090604401600060405180830381600087803b158015612f7f57600080fd5b505af1158015612f93573d6000803e3d6000fd5b505050506000612fa16112ee565b9050337fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba612fcf84846138ba565b60405190815260200160405180910390a2505050565b6001600160a01b0381166000908152600260205260409020805415611f2357600781015460ff1615613286576000816006015460065483600001546130286115d0565b613032919061389b565b61303c919061387b565b61304691906138ba565b90508160060154600b600082825461305e91906138ba565b9091555050600060068084018290558354815490929061307f9084906138ba565b90915550506001600160a01b03831660009081526005602052604090205460ff161580156130bd575042600d5483600501546130bb9190613863565b105b1561318f5760008260080154826130d491906138ba565b90506000600d548460050154426130eb91906138ba565b6130f591906138ba565b905060105481111561310657506010545b600060105460165483613119919061389b565b613123919061387b565b9050600064e8d4a51000613137838661389b565b613141919061387b565b60085490915061317e906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683612d56565b61318881866138ba565b9450505050505b60006131996115d0565b905060006006546000146131cf576131b183836138ba565b6006546131be908561389b565b6131c8919061387b565b90506131d2565b50815b808455600680548291906000906131ea908490613863565b9091555050600584015442111561327f5760078401805460ff19169055600060048501819055600585018190556008850154600c80549192909161322f9084906138ba565b909155505060006008850155604080518481524260208201526001600160a01b038716917ff7870c5b224cbc19873599e46ccfc7103934650509b1af0c3ce90138377c2004910160405180910390a25b5050505050565b6001600160a01b03821660009081526003602052604090205460ff16611f235760006006546132b36115d0565b83546132bf919061389b565b6132c9919061387b565b90508160000154600660008282546132e191906138ba565b9091555050600080835560028301546132fa90836138ba565b601254909150843b1561330c57506013545b600061271061331b838561389b565b613325919061387b565b9050801561337457600854613367906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683612d56565b61337181856138ba565b93505b600061337e6115d0565b905060006006546000146133b45761339686836138ba565b6006546133a3908861389b565b6133ad919061387b565b90506133b7565b50845b808755600680548291906000906133cf908490613863565b90915550505050505050505050565b6001546001600160a01b031615610f87576001600160a01b03811660009081526002602052604081206004810154600582015491929161341e91906138ba565b6001546008840154600c54600f54604051631de4d85f60e21b81526001600160a01b038981166004830152602482019490945260448101869052606481019290925260848201529293501690637793617c9060a401600060405180830381600087803b15801561348d57600080fd5b505af11580156134a1573d6000803e3d6000fd5b50505050505050565b60606134b984846000856134c3565b90505b9392505050565b6060824710156135245760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109b0565b6001600160a01b0385163b61357b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109b0565b600080866001600160a01b031685876040516135979190613719565b60006040518083038185875af1925050503d80600081146135d4576040519150601f19603f3d011682016040523d82523d6000602084013e6135d9565b606091505b50915091506135e98282866135f4565b979650505050505050565b606083156136035750816134bc565b8251156136135782518084602001fd5b8160405162461bcd60e51b81526004016109b09190613735565b60006020828403121561363e578081fd5b81356134bc81613913565b6000806040838503121561365b578081fd5b823561366681613913565b9150602083013561367681613928565b809150509250929050565b60008060408385031215613693578182fd5b823561369e81613913565b946020939093013593505050565b6000602082840312156136bd578081fd5b81516134bc81613928565b6000602082840312156136d9578081fd5b5035919050565b6000602082840312156136f1578081fd5b5051919050565b6000806040838503121561370a578182fd5b50508035926020909101359150565b6000825161372b8184602087016138d1565b9190910192915050565b60208152600082518060208401526137548160408501602087016138d1565b601f01601f19169190910160400192915050565b60208082526036908201527f706572666f726d616e63654665652063616e6e6f74206265206d6f7265207468604082015275616e204d41585f504552464f524d414e43455f46454560501b606082015260800190565b60208082526016908201527543616e6e6f74206265207a65726f206164647265737360501b604082015260600190565b6020808252600b908201526a61646d696e3a207775743f60a81b604082015260600190565b60208082526030908201527f77697468647261774665652063616e6e6f74206265206d6f7265207468616e2060408201526f4d41585f57495448445241575f46454560801b606082015260800190565b60008219821115613876576138766138fd565b500190565b60008261389657634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156138b5576138b56138fd565b500290565b6000828210156138cc576138cc6138fd565b500390565b60005b838110156138ec5781810151838201526020016138d4565b838111156122b85750506000910152565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610f8757600080fd5b8015158114610f8757600080fdfea2646970667358221220b384c660161a22ac70b44380f3e9c91c1d599cca16237cc53ca2ff188f3f592f64736f6c634300080400330000000000000000000000006adea0efc8df952ac683680d860a1f4db69a942500000000000000000000000053948b7d375739e746a17c35d5883d51c649603c000000000000000000000000c43815bdc7effeb98765ed6574bfb0f8beafef9c000000000000000000000000c43815bdc7effeb98765ed6574bfb0f8beafef9c000000000000000000000000c43815bdc7effeb98765ed6574bfb0f8beafef9c0000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006adea0efc8df952ac683680d860a1f4db69a942500000000000000000000000053948b7d375739e746a17c35d5883d51c649603c000000000000000000000000c43815bdc7effeb98765ed6574bfb0f8beafef9c000000000000000000000000c43815bdc7effeb98765ed6574bfb0f8beafef9c000000000000000000000000c43815bdc7effeb98765ed6574bfb0f8beafef9c0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _token (address): 0x6adea0efc8df952ac683680d860a1f4db69a9425
Arg [1] : _masterchef (address): 0x53948b7d375739e746a17c35d5883d51c649603c
Arg [2] : _admin (address): 0xc43815bdc7effeb98765ed6574bfb0f8beafef9c
Arg [3] : _treasury (address): 0xc43815bdc7effeb98765ed6574bfb0f8beafef9c
Arg [4] : _operator (address): 0xc43815bdc7effeb98765ed6574bfb0f8beafef9c
Arg [5] : _pid (uint256): 0
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000006adea0efc8df952ac683680d860a1f4db69a9425
Arg [1] : 00000000000000000000000053948b7d375739e746a17c35d5883d51c649603c
Arg [2] : 000000000000000000000000c43815bdc7effeb98765ed6574bfb0f8beafef9c
Arg [3] : 000000000000000000000000c43815bdc7effeb98765ed6574bfb0f8beafef9c
Arg [4] : 000000000000000000000000c43815bdc7effeb98765ed6574bfb0f8beafef9c
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
25963:34932:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27883:59;;27933:9;27883:59;;;;;16462:25:1;;;16450:2;16435:18;27883:59:0;;;;;;;;27488:32;;;;;;51140:285;;;;;;:::i;:::-;;:::i;:::-;;27399:25;;;;;;51547:373;;;;;;:::i;:::-;;:::i;26961:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18402:25:1;;;18458:2;18443:18;;18436:34;;;;18486:18;;;18479:34;;;;18544:2;18529:18;;18522:34;;;;18587:3;18572:19;;18565:35;;;;18631:3;18616:19;;18609:35;18675:3;18660:19;;18653:35;18732:14;18725:22;18719:3;18704:19;;18697:51;18779:3;18764:19;;18757:35;18389:3;18374:19;26961:44:0;18356:442:1;31523:398:0;;;;;;:::i;:::-;;:::i;28200:58::-;;28245:13;28200:58;;52036:379;;;;;;:::i;:::-;;:::i;58306:1187::-;;;;;;:::i;:::-;;:::i;27741:57::-;;27791:7;27741:57;;43743:158;;;;;;:::i;:::-;;:::i;37310:341::-;;;;;;:::i;:::-;;:::i;53352:364::-;;;;;;:::i;:::-;;:::i;59644:181::-;;;:::i;27279:26::-;;;;;;28770:43;;;;;;55297:103;;;:::i;27012:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4001:14:1;;3994:22;3976:41;;3964:2;3949:18;27012:55:0;3931:92:1;48525:267:0;;;;;;:::i;:::-;;:::i;60225:112::-;;;:::i;48995:232::-;;;;;;:::i;:::-;;:::i;28393:43::-;;;;;;43356:258;;;;;;:::i;:::-;;:::i;27369:23::-;;;;;-1:-1:-1;;;;;27369:23:0;;;;;;-1:-1:-1;;;;;2639:32:1;;;2621:51;;2609:2;2594:18;27369:23:0;2576:102:1;22217:86:0;22264:4;22288:7;-1:-1:-1;;;22288:7:0;;;;22217:86;;27339:23;;;;;-1:-1:-1;;;;;27339:23:0;;;27192:51;;;;;;:::i;:::-;;;;;;;;;;;;;;;;26781:34;;;;;47153:183;;;;;;:::i;:::-;;:::i;49777:324::-;;;;;;:::i;:::-;;:::i;25075:103::-;;;:::i;60498:129::-;;;:::i;28109:53::-;;28158:4;28109:53;;59833:260;;;:::i;55080:100::-;;;:::i;46472:88::-;;;:::i;28722:35::-;;;;;;27105:52;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24427:87;24473:7;24500:6;-1:-1:-1;;;;;24500:6:0;24427:87;;54245:301;;;;;;:::i;:::-;;:::i;27674:52::-;;27716:10;27674:52;;56481:1249;;;;;;:::i;:::-;;:::i;52986:246::-;;;;;;:::i;:::-;;:::i;28926:38::-;;;;;;28331:45;;;;;;28561:49;;;;;;47761:204;;;;;;:::i;:::-;;:::i;50738:294::-;;;;;;:::i;:::-;;:::i;50226:403::-;;;;;;:::i;:::-;;:::i;28665:40::-;;;;;;27551:50;;27597:4;27551:50;;49431:234;;;;;;:::i;:::-;;:::i;53833:303::-;;;;;;:::i;:::-;;:::i;55545:799::-;;;;;;:::i;:::-;;:::i;27615:46::-;;27658:3;27615:46;;54636:327;;;;;;:::i;:::-;;:::i;48079:239::-;;;;;;:::i;:::-;;:::i;28979:43::-;;;;;;26886:28;;;;;-1:-1:-1;;;;;26886:28:0;;;37890:248;;;;;;:::i;:::-;;:::i;28455:41::-;;;;;;28872:39;;;;;;27431:29;;;;;;28826:31;;;;;;47449:204;;;;;;:::i;:::-;;:::i;25333:201::-;;;;;;:::i;:::-;;:::i;52529:345::-;;;;;;:::i;:::-;;:::i;27312:20::-;;;;;-1:-1:-1;;;;;27312:20:0;;;26838:39;;;;;27962:56;;28007:11;27962:56;;51140:285;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;;;;;;;;;27716:10:::1;51236:11;:30;;51214:126;;;::::0;-1:-1:-1;;;51214:126:0;;11404:2:1;51214:126:0::1;::::0;::::1;11386:21:1::0;11443:2;11423:18;;;11416:30;11482:34;11462:18;;;11455:62;-1:-1:-1;;;11533:18:1;;;11526:44;11587:19;;51214:126:0::1;11376:236:1::0;51214:126:0::1;51351:10;:24:::0;;;51391:26:::1;::::0;16462:25:1;;;51391:26:0::1;::::0;16450:2:1;16435:18;51391:26:0::1;;;;;;;;51140:285:::0;:::o;51547:373::-;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;27658:3:::1;51684:20;:40;;51662:138;;;;-1:-1:-1::0;;;51662:138:0::1;;;;;;;:::i;:::-;51811:19;:42:::0;;;51869:43:::1;::::0;16462:25:1;;;51869:43:0::1;::::0;16450:2:1;16435:18;51869:43:0::1;16417:76:1::0;31523:398:0;24313:13;:11;:13::i;:::-;31604:32:::1;::::0;-1:-1:-1;;;31604:32:0;;31625:10:::1;31604:32;::::0;::::1;2621:51:1::0;31586:15:0::1;::::0;-1:-1:-1;;;;;31604:20:0;::::1;::::0;::::1;::::0;2594:18:1;;31604:32:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31586:50:::0;-1:-1:-1;31655:12:0;31647:46:::1;;;::::0;-1:-1:-1;;;31647:46:0;;7638:2:1;31647:46:0::1;::::0;::::1;7620:21:1::0;7677:2;7657:18;;;7650:30;-1:-1:-1;;;7696:18:1;;;7689:51;7757:18;;31647:46:0::1;7610:171:1::0;31647:46:0::1;31704:63;-1:-1:-1::0;;;;;31704:27:0;::::1;31732:10;31752:4;31759:7:::0;31704:27:::1;:63::i;:::-;31778:48;::::0;-1:-1:-1;;;31778:48:0;;-1:-1:-1;;;;;31805:10:0::1;3255:32:1::0;;31778:48:0::1;::::0;::::1;3237:51:1::0;3304:18;;;3297:34;;;31778:18:0;::::1;::::0;::::1;::::0;3210::1;;31778:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;31856:10:0::1;::::0;31837:54:::1;::::0;-1:-1:-1;;;31837:54:0;;::::1;::::0;::::1;17493:25:1::0;;;;17534:18;;;17527:34;;;31885:4:0::1;17577:18:1::0;;;17570:60;31837:10:0::1;-1:-1:-1::0;;;;;31837:18:0::1;::::0;::::1;::::0;17466::1;;31837:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31907:6:0::1;::::0;::::1;::::0;-1:-1:-1;31907:6:0;;-1:-1:-1;31907:6:0::1;24337:1;31523:398:::0;:::o;52036:379::-;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;27791:7:::1;52169:18;:45;;52147:156;;;::::0;-1:-1:-1;;;52147:156:0;;14510:2:1;52147:156:0::1;::::0;::::1;14492:21:1::0;14549:2;14529:18;;;14522:30;14588:34;14568:18;;;14561:62;14659:31;14639:18;;;14632:59;14708:19;;52147:156:0::1;14482:251:1::0;52147:156:0::1;52314:17;:38:::0;;;52368:39:::1;::::0;16462:25:1;;;52368:39:0::1;::::0;16450:2:1;16435:18;52368:39:0::1;16417:76:1::0;58306:1187:0;-1:-1:-1;;;;;58465:15:0;;58416:7;58465:15;;;:8;:15;;;;;58495:11;;:21;-1:-1:-1;58491:75:0;;;58543:11;;;-1:-1:-1;58491:75:0;58616:10;58595:32;;;;:20;:32;;;;;;;;58594:33;:112;;;;;58688:17;;58663:4;:22;;;:42;;;;:::i;:::-;58645:15;:60;58594:112;58576:891;;;58733:12;58762:33;:31;:33::i;:::-;58748:11;:9;:11::i;:::-;:47;;;;:::i;:::-;58865:11;;58733:62;;-1:-1:-1;58810:21:0;;58835:26;28077:4;58835:7;:26;:::i;:::-;58834:42;;;;:::i;:::-;58810:66;;58891:26;59034:42;59070:5;59034:35;:42::i;:::-;58993:21;;;;;58962:11;;58929;;58921:20;;:4;:20;:::i;:::-;58920:53;;;;:::i;:::-;:94;;;;:::i;:::-;:156;;;;:::i;:::-;58891:185;-1:-1:-1;59091:21:0;28077:4;59116:34;59137:13;58891:185;59116:34;:::i;:::-;59115:72;;;;:::i;:::-;59220:11;;59091:96;;-1:-1:-1;59262:10:0;60831:17;60876:8;59246:93;;-1:-1:-1;59304:19:0;;59246:93;59353:26;59410:5;59383:23;59399:7;59383:13;:23;:::i;:::-;59382:33;;;;:::i;:::-;59353:62;-1:-1:-1;59430:25:0;;-1:-1:-1;;;;;;;59430:25:0;58576:891;59484:1;59477:8;;;58306:1187;;;;;:::o;43743:158::-;21822:19;:17;:19::i;:::-;43828:1:::1;43818:7;:11;43810:43;;;::::0;-1:-1:-1;;;43810:43:0;;5762:2:1;43810:43:0::1;::::0;::::1;5744:21:1::0;5801:2;5781:18;;;5774:30;-1:-1:-1;;;5820:18:1;;;5813:49;5879:18;;43810:43:0::1;5734:169:1::0;43810:43:0::1;43864:29;43882:7;43891:1;43864:17;:29::i;:::-;43743:158:::0;:::o;37310:341::-;37391:5;32309:10;-1:-1:-1;;;;;32309:19:0;;;;:45;;-1:-1:-1;32346:8:0;;-1:-1:-1;;;;;32346:8:0;32332:10;:22;32309:45;32287:120;;;;-1:-1:-1;;;32287:120:0;;13033:2:1;32287:120:0;;;13015:21:1;13072:2;13052:18;;;13045:30;13111:27;13091:18;;;13084:55;13156:18;;32287:120:0;13005:175:1;32287:120:0;21822:19:::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;37461:15:0;::::2;37437:21;37461:15:::0;;;:8:::2;:15;::::0;;;;37509:11:::2;::::0;::::2;::::0;::::2;;:49:::0;::::2;;;;37543:15;37524:4;:16;;;:34;37509:49;37487:116;;;::::0;-1:-1:-1;;;37487:116:0;;16172:2:1;37487:116:0::2;::::0;::::2;16154:21:1::0;16211:2;16191:18;;;16184:30;-1:-1:-1;;;16230:18:1;;;16223:47;16287:18;;37487:116:0::2;16144:167:1::0;37487:116:0::2;37614:29;37631:1;37634::::0;37637:5:::2;37614:16;:29::i;:::-;21852:1;37310:341:::0;;:::o;53352:364::-;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;53518:1:::1;53493:22;:26;53471:114;;;::::0;-1:-1:-1;;;53471:114:0;;10997:2:1;53471:114:0::1;::::0;::::1;10979:21:1::0;11036:2;11016:18;;;11009:30;11075:34;11055:18;;;11048:62;-1:-1:-1;;;11126:18:1;;;11119:36;11172:19;;53471:114:0::1;10969:228:1::0;53471:114:0::1;53596:23;:48:::0;;;53660::::1;::::0;16462:25:1;;;53660:48:0::1;::::0;16450:2:1;16435:18;53660:48:0::1;16417:76:1::0;59644:181:0;59767:10;;59745:48;;-1:-1:-1;;;59745:48:0;;;;;16672:25:1;;;;59787:4:0;16713:18:1;;;16706:60;59708:7:0;;;;-1:-1:-1;;;;;59745:10:0;:21;;;;16645:18:1;;59745:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55297:103::-;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;22081:16:::1;:14;:16::i;:::-;55357:10:::2;:8;:10::i;:::-;55383:9;::::0;::::2;::::0;;;::::2;55297:103::o:0;48525:267::-;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48648:19:0;::::1;48640:54;;;;-1:-1:-1::0;;;48640:54:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48705:30:0;::::1;;::::0;;;:23:::1;:30;::::0;;;;;:38;;-1:-1:-1;;48705:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;48759:25;;48705:38;;:30;48759:25:::1;::::0;::::1;48525:267:::0;;:::o;60225:112::-;60294:35;;-1:-1:-1;;;60294:35:0;;60323:4;60294:35;;;2621:51:1;60267:7:0;;60294:10;-1:-1:-1;;;;;60294:20:0;;;;2594:18:1;;60294:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60287:42;;60225:112;:::o;48995:232::-;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49087:19:0;::::1;49079:54;;;;-1:-1:-1::0;;;49079:54:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49144:26:0;::::1;;::::0;;;:19:::1;:26;::::0;;;;;:34;;-1:-1:-1;;49144:34:0::1;::::0;::::1;;::::0;;::::1;::::0;;;49194:25;;49144:34;;:26;49194:25:::1;::::0;::::1;48995:232:::0;;:::o;43356:258::-;21822:19;:17;:19::i;:::-;28311:13:::1;43453:7;:29;43431:135;;;::::0;-1:-1:-1;;;43431:135:0;;13727:2:1;43431:135:0::1;::::0;::::1;13709:21:1::0;13766:2;13746:18;;;13739:30;13805:34;13785:18;;;13778:62;13876:26;13856:18;;;13849:54;13920:19;;43431:135:0::1;13699:246:1::0;43431:135:0::1;43577:29;43595:1;43598:7;43577:17;:29::i;47153:183::-:0;24313:13;:11;:13::i;:::-;-1:-1:-1;;;;;47225:20:0;::::1;47217:55;;;;-1:-1:-1::0;;;47217:55:0::1;;;;;;;:::i;:::-;47283:5;:14:::0;;-1:-1:-1;;;;;;47283:14:0::1;-1:-1:-1::0;;;;;47283:14:0;::::1;::::0;;::::1;::::0;;;47313:15:::1;::::0;2621:51:1;;;47313:15:0::1;::::0;2609:2:1;2594:18;47313:15:0::1;2576:102:1::0;49777:324:0;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;27597:4:::1;49881:15;:38;;49859:142;;;;-1:-1:-1::0;;;49859:142:0::1;;;;;;;:::i;:::-;50012:14;:32:::0;;;50060:33:::1;::::0;16462:25:1;;;50060:33:0::1;::::0;16450:2:1;16435:18;50060:33:0::1;16417:76:1::0;25075:103:0;24313:13;:11;:13::i;:::-;25140:30:::1;25167:1;25140:18;:30::i;:::-;25075:103::o:0;60498:129::-;60605:14;;60567:35;;-1:-1:-1;;;60567:35:0;;60596:4;60567:35;;;2621:51:1;60540:7:0;;60605:14;-1:-1:-1;;;;;60567:10:0;:20;;;;2594:18:1;;60567:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;59833:260::-;59888:7;59928:11;;59943:1;59928:16;:157;;60073:11;;60005:33;:31;:33::i;:::-;59991:11;:9;:11::i;:::-;:47;;;;:::i;:::-;59990:79;;60064:4;59990:79;:::i;:::-;59989:95;;;;:::i;59928:157::-;-1:-1:-1;59964:4:0;;59833:260::o;55080:100::-;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;21822:19:::1;:17;:19::i;:::-;55141:8:::2;:6;:8::i;:::-;55165:7;::::0;::::2;::::0;;;::::2;55080:100::o:0;46472:88::-;46533:10;46524:20;;;;:8;:20;;;;;:27;46515:37;;:8;:37::i;54245:301::-;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;28007:11:::1;54343:12;:34;;54321:135;;;::::0;-1:-1:-1;;;54321:135:0;;7218:2:1;54321:135:0::1;::::0;::::1;7200:21:1::0;7257:2;7237:18;;;7230:30;7296:34;7276:18;;;7269:62;-1:-1:-1;;;7347:18:1;;;7340:49;7406:19;;54321:135:0::1;7190:241:1::0;54321:135:0::1;54467:12;:27:::0;;;54510:28:::1;::::0;16462:25:1;;;54510:28:0::1;::::0;16450:2:1;16435:18;54510:28:0::1;16417:76:1::0;56481:1249:0;-1:-1:-1;;;;;56590:15:0;;56546:7;56590:15;;;:8;:15;;;;;56634:11;;:15;;;;:43;;-1:-1:-1;56666:11:0;;;;;;56634:43;:87;;;;-1:-1:-1;;;;;;56695:26:0;;;;;;:19;:26;;;;;;;;56694:27;56634:87;:165;;;;;56783:15;56759:20;;56740:4;:16;;;:39;;;;:::i;:::-;56739:59;56634:165;56616:1088;;;56826:12;56855:33;:31;:33::i;:::-;56841:11;:9;:11::i;:::-;:47;;;;:::i;:::-;56826:62;;56903:21;57000:4;:21;;;56969:11;;56936:4;:11;;;56928:4;:20;;;;:::i;:::-;56927:53;;;;:::i;:::-;:94;;;;:::i;:::-;56903:118;;57036:18;57073:4;:17;;;57057:13;:33;;;;:::i;:::-;57036:54;;57105:23;57202:20;;57166:4;:16;;;57131:15;:51;;;;:::i;:::-;:91;;;;:::i;:::-;57105:117;;57259:23;;57241:15;:41;57237:123;;;-1:-1:-1;57321:23:0;;57237:123;57449:21;57523:23;;57492:10;;57474:15;:28;;;;:::i;:::-;57473:73;;;;:::i;:::-;57449:97;-1:-1:-1;57561:25:0;28077:4;57590:26;57449:97;57590:10;:26;:::i;:::-;57589:64;;;;:::i;:::-;57561:92;56481:1249;-1:-1:-1;;;;;;;;;56481:1249:0:o;56616:1088::-;-1:-1:-1;57721:1:0;;56481:1249;-1:-1:-1;;56481:1249:0:o;52986:246::-;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;53094:1:::1;53076:15;:19;53068:62;;;::::0;-1:-1:-1;;;53068:62:0;;6517:2:1;53068:62:0::1;::::0;::::1;6499:21:1::0;6556:2;6536:18;;;6529:30;6595:32;6575:18;;;6568:60;6645:18;;53068:62:0::1;6489:180:1::0;53068:62:0::1;53141:15;:33:::0;;;53190:34:::1;::::0;16462:25:1;;;53190:34:0::1;::::0;16450:2:1;16435:18;53190:34:0::1;16417:76:1::0;47761:204:0;24313:13;:11;:13::i;:::-;-1:-1:-1;;;;;47839:23:0;::::1;47831:58;;;;-1:-1:-1::0;;;47831:58:0::1;;;;;;;:::i;:::-;47900:8;:20:::0;;-1:-1:-1;;;;;;47900:20:0::1;-1:-1:-1::0;;;;;47900:20:0;::::1;::::0;;::::1;::::0;;;47936:21:::1;::::0;2621:51:1;;;47936:21:0::1;::::0;2609:2:1;2594:18;47936:21:0::1;2576:102:1::0;50738:294:0;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;27658:3:::1;50836:12;:32;;50814:130;;;;-1:-1:-1::0;;;50814:130:0::1;;;;;;;:::i;:::-;50955:11;:26:::0;;;50997:27:::1;::::0;16462:25:1;;;50997:27:0::1;::::0;16450:2:1;16435:18;50997:27:0::1;16417:76:1::0;50226:403:0;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;27597:4:::1;50369:23;:46;;50347:150;;;;-1:-1:-1::0;;;50347:150:0::1;;;;;;;:::i;:::-;50508:22;:48:::0;;;50572:49:::1;::::0;16462:25:1;;;50572:49:0::1;::::0;16450:2:1;16435:18;50572:49:0::1;16417:76:1::0;49431:234:0;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49524:19:0;::::1;49516:54;;;;-1:-1:-1::0;;;49516:54:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49581:27:0;::::1;;::::0;;;:20:::1;:27;::::0;;;;;:35;;-1:-1:-1;;49581:35:0::1;::::0;::::1;;::::0;;::::1;::::0;;;49632:25;;49581:35;;:27;49632:25:::1;::::0;::::1;49431:234:::0;;:::o;53833:303::-;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;53976:1:::1;53954:19;:23;53946:71;;;::::0;-1:-1:-1;;;53946:71:0;;15768:2:1;53946:71:0::1;::::0;::::1;15750:21:1::0;15807:2;15787:18;;;15780:30;15846:34;15826:18;;;15819:62;-1:-1:-1;;;15897:18:1;;;15890:33;15940:19;;53946:71:0::1;15740:225:1::0;53946:71:0::1;54028:20;:42:::0;;;54086::::1;::::0;16462:25:1;;;54086:42:0::1;::::0;16450:2:1;16435:18;54086:42:0::1;16417:76:1::0;55545:799:0;-1:-1:-1;;;;;55690:15:0;;55641:7;55690:15;;;:8;:15;;;;;55734:11;;:15;;;;:31;;-1:-1:-1;55754:11:0;;;;;;55753:12;55734:31;:66;;;;-1:-1:-1;;;;;;55770:30:0;;;;;;:23;:30;;;;;;;;55769:31;55734:66;55716:602;;;55827:12;55856:33;:31;:33::i;:::-;55842:11;:9;:11::i;:::-;:47;;;;:::i;:::-;55827:62;;55904:19;55949:11;;55941:4;55927;:11;;;:18;;;;:::i;:::-;55926:34;;;;:::i;:::-;55904:56;;55975:18;56010:4;:24;;;55996:11;:38;;;;:::i;:::-;56067:14;;55975:59;;-1:-1:-1;60831:17:0;;60876:8;56096:91;;-1:-1:-1;56149:22:0;;56096:91;56201:29;56258:5;56234:20;56247:7;56234:10;:20;:::i;:::-;56233:30;;;;:::i;:::-;56201:62;55545:799;-1:-1:-1;;;;;;;;55545:799:0:o;54636:327::-;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;54752:10:::1;-1:-1:-1::0;;;;;54734:29:0::1;:6;-1:-1:-1::0;;;;;54734:29:0::1;;;54712:116;;;::::0;-1:-1:-1;;;54712:116:0;;7988:2:1;54712:116:0::1;::::0;::::1;7970:21:1::0;8027:2;8007:18;;;8000:30;8066:34;8046:18;;;8039:62;-1:-1:-1;;;8117:18:1;;;8110:35;8162:19;;54712:116:0::1;7960:227:1::0;54712:116:0::1;54858:39;::::0;-1:-1:-1;;;54858:39:0;;54891:4:::1;54858:39;::::0;::::1;2621:51:1::0;54841:14:0::1;::::0;-1:-1:-1;;;;;54858:24:0;::::1;::::0;::::1;::::0;2594:18:1;;54858:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54841:56:::0;-1:-1:-1;54908:47:0::1;-1:-1:-1::0;;;;;54908:27:0;::::1;54936:10;54841:56:::0;54908:27:::1;:47::i;:::-;32096:1;54636:327:::0;:::o;48079:239::-;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48167:28:0;::::1;48159:63;;;;-1:-1:-1::0;;;48159:63:0::1;;;;;;;:::i;:::-;48233:13;:30:::0;;-1:-1:-1;;;;;;48233:30:0::1;-1:-1:-1::0;;;;;48233:30:0;::::1;::::0;;::::1;::::0;;;48279:31:::1;::::0;2621:51:1;;;48279:31:0::1;::::0;2609:2:1;2594:18;48279:31:0::1;2576:102:1::0;37890:248:0;21822:19;:17;:19::i;:::-;38022:1:::1;38012:7;:11;:32;;;;38043:1;38027:13;:17;38012:32;38004:63;;;::::0;-1:-1:-1;;;38004:63:0;;5066:2:1;38004:63:0::1;::::0;::::1;5048:21:1::0;5105:2;5085:18;;;5078:30;-1:-1:-1;;;5124:18:1;;;5117:48;5182:18;;38004:63:0::1;5038:168:1::0;38004:63:0::1;38078:52;38095:7;38104:13;38119:10;38078:16;:52::i;47449:204::-:0;24313:13;:11;:13::i;:::-;-1:-1:-1;;;;;47527:23:0;::::1;47519:58;;;;-1:-1:-1::0;;;47519:58:0::1;;;;;;;:::i;:::-;47588:8;:20:::0;;-1:-1:-1;;;;;;47588:20:0::1;-1:-1:-1::0;;;;;47588:20:0;::::1;::::0;;::::1;::::0;;;47624:21:::1;::::0;2621:51:1;;;47624:21:0::1;::::0;2609:2:1;2594:18;47624:21:0::1;2576:102:1::0;25333:201:0;24313:13;:11;:13::i;:::-;-1:-1:-1;;;;;25422:22:0;::::1;25414:73;;;::::0;-1:-1:-1;;;25414:73:0;;6110:2:1;25414:73:0::1;::::0;::::1;6092:21:1::0;6149:2;6129:18;;;6122:30;6188:34;6168:18;;;6161:62;-1:-1:-1;;;6239:18:1;;;6232:36;6285:19;;25414:73:0::1;6082:228:1::0;25414:73:0::1;25498:28;25517:8;25498:18;:28::i;52529:345::-:0;32064:5;;-1:-1:-1;;;;;32064:5:0;32050:10;:19;32042:43;;;;-1:-1:-1;;;32042:43:0;;;;;;;:::i;:::-;27933:9:::1;52635:16;:43;;52613:154;;;::::0;-1:-1:-1;;;52613:154:0;;12242:2:1;52613:154:0::1;::::0;::::1;12224:21:1::0;12281:2;12261:18;;;12254:30;12320:34;12300:18;;;12293:62;12391:31;12371:18;;;12364:59;12440:19;;52613:154:0::1;12214:251:1::0;52613:154:0::1;52778:17;:36:::0;;;52830::::1;::::0;16462:25:1;;;52830:36:0::1;::::0;16450:2:1;16435:18;52830:36:0::1;16417:76:1::0;24592:132:0;24473:7;24500:6;-1:-1:-1;;;;;24500:6:0;20417:10;24656:23;24648:68;;;;-1:-1:-1;;;24648:68:0;;12672:2:1;24648:68:0;;;12654:21:1;;;12691:18;;;12684:30;12750:34;12730:18;;;12723:62;12802:18;;24648:68:0;12644:182:1;16094:248:0;16265:68;;-1:-1:-1;;;;;2941:15:1;;;16265:68:0;;;2923:34:1;2993:15;;2973:18;;;2966:43;3025:18;;;3018:34;;;16238:96:0;;16258:5;;-1:-1:-1;;;16288:27:0;2858:18:1;;16265:68:0;;;;-1:-1:-1;;16265:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;16265:68:0;-1:-1:-1;;;;;;16265:68:0;;;;;;;;;;16238:19;:96::i;:::-;16094:248;;;;:::o;57905:209::-;58015:7;58080:26;58100:5;58080:19;:26::i;:::-;58047:30;58071:5;58047:23;:30::i;:::-;:59;;;;:::i;22376:108::-;22264:4;22288:7;-1:-1:-1;;;22288:7:0;;;;22446:9;22438:38;;;;-1:-1:-1;;;22438:38:0;;10301:2:1;22438:38:0;;;10283:21:1;10340:2;10320:18;;;10313:30;-1:-1:-1;;;10359:18:1;;;10352:46;10415:18;;22438:38:0;10273:166:1;44076:2324:0;44190:10;44157:21;44181:20;;;:8;:20;;;;;44231:11;;44220:22;;;44212:66;;;;-1:-1:-1;;;44212:66:0;;8394:2:1;44212:66:0;;;8376:21:1;8433:2;8413:18;;;8406:30;8472:33;8452:18;;;8445:61;8523:18;;44212:66:0;8366:181:1;44212:66:0;44316:15;44297:4;:16;;;:34;44289:60;;;;-1:-1:-1;;;44289:60:0;;6876:2:1;44289:60:0;;;6858:21:1;6915:2;6895:18;;;6888:30;-1:-1:-1;;;6934:18:1;;;6927:43;6987:18;;44289:60:0;6848:163:1;44289:60:0;44610:11;;44518:7;;44495:20;;44561:32;28158:4;44518:7;44561:32;:::i;:::-;44560:61;;;;:::i;:::-;44536:85;;44677:9;:7;:9::i;:::-;44730:27;44746:10;44730:15;:27::i;:::-;44774:12;;:27;;;;;44800:1;44790:7;:11;44774:27;44770:420;;;44818:12;44833:11;:9;:11::i;:::-;44818:26;;44900:4;44885:11;;44875:7;:21;;;;:::i;:::-;44874:30;;;;:::i;:::-;44969:11;;44859:45;;-1:-1:-1;44954:26:0;;44950:93;;;45016:11;;;-1:-1:-1;44950:93:0;44770:420;;;;45124:11;;28158:4;;45108:27;;:13;:27;:::i;:::-;45107:71;;;;:::i;:::-;45075:103;;44770:420;45200:21;45255:11;;45239:12;45225:11;:9;:11::i;:::-;:26;;;;:::i;:::-;45224:42;;;;:::i;:::-;45200:66;;45292:12;45277:4;:11;;;:27;;;;;;;:::i;:::-;;;;;;;;45330:12;45315:11;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;45430:10:0;45409:32;;;;:20;:32;;;;;;;;45408:33;:112;;;;;45502:17;;45477:4;:22;;;:42;;;;:::i;:::-;45459:15;:60;45408:112;45390:500;;;45565:11;;45607:10;60831:17;60876:8;45591:93;;-1:-1:-1;45649:19:0;;45591:93;45698:26;45755:5;45728:23;45744:7;45728:13;:23;:::i;:::-;45727:33;;;;:::i;:::-;45799:8;;45698:62;;-1:-1:-1;45775:53:0;;-1:-1:-1;;;;;45775:10:0;:23;;;45799:8;45698:62;45775:23;:53::i;:::-;45843:35;45860:18;45843:35;;:::i;:::-;;;45390:500;;;45902:50;-1:-1:-1;;;;;45902:10:0;:23;45926:10;45938:13;45902:23;:50::i;:::-;45969:11;;:15;45965:211;;46092:11;;46060;:9;:11::i;:::-;46046;;:25;;;;:::i;:::-;46045:58;;;;:::i;:::-;46001:24;;;:102;45965:211;;;46163:1;46136:24;;;:28;45965:211;46214:15;46188:23;;;:41;46290:35;46314:10;46290:23;:35::i;:::-;46343:49;;;16959:25:1;;;17015:2;17000:18;;16993:34;;;46352:10:0;;46343:49;;16932:18:1;46343:49:0;;;;;;;44076:2324;;;;;;:::o;38353:4874::-;-1:-1:-1;;;;;38512:15:0;;38488:21;38512:15;;;:8;:15;;;;;38542:11;;:16;;:31;;;38572:1;38562:7;:11;38542:31;38538:208;;;28245:13;38616:7;:28;38590:144;;;;-1:-1:-1;;;38590:144:0;;11819:2:1;38590:144:0;;;11801:21:1;11858:2;11838:18;;;11831:30;11897:34;11877:18;;;11870:62;-1:-1:-1;;;11948:18:1;;;11941:52;12010:19;;38590:144:0;11791:244:1;38590:144:0;38916:16;;;;38888:13;;38936:15;-1:-1:-1;38912:453:0;;39100:11;;39096:185;;39153:15;39132:18;;;:36;39208:17;;;;39187;:38;;:17;;:38;;39208:17;;39187:38;:::i;:::-;;;;-1:-1:-1;;39264:1:0;39244:17;;;:21;39096:185;39335:4;:18;;;39316:4;:16;;;:37;;;;:::i;:::-;39295:58;;;;:::i;:::-;;;38912:453;39397:18;;;:60;;;27859:7;39419:17;:38;;39397:60;39375:141;;;;-1:-1:-1;;;39375:141:0;;9111:2:1;39375:141:0;;;9093:21:1;9150:2;9130:18;;;9123:30;9189:33;9169:18;;;9162:61;9240:18;;39375:141:0;9083:181:1;39375:141:0;39570:17;;39549;:38;;39527:116;;;;-1:-1:-1;;;39527:116:0;;8754:2:1;39527:116:0;;;8736:21:1;8793:2;8773:18;;;8766:30;8832;8812:18;;;8805:58;8880:18;;39527:116:0;8726:178:1;39527:116:0;39700:9;:7;:9::i;:::-;39758:11;;39754:143;;39791:19;39813:11;:9;:11::i;:::-;39863:8;;39791:33;;-1:-1:-1;39839:46:0;;-1:-1:-1;;;;;39839:10:0;:23;;;39863:8;39791:33;39839:23;:46::i;:::-;39754:143;;39938:22;39954:5;39938:15;:22::i;:::-;40011:17;;40007:336;;40068:15;40049:4;:16;;;:34;40045:254;;;40125:15;40104:18;;;:36;;;40178:31;;40196:13;;40178:31;:::i;:::-;40159:16;;;:50;40045:254;;;40270:13;40250:4;:16;;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;40045:254:0;40313:11;;;:18;;-1:-1:-1;;40313:18:0;40327:4;40313:18;;;40007:336;40355:21;40387;40419:32;40462:12;40477:11;:9;:11::i;:::-;40462:26;-1:-1:-1;40503:11:0;;40499:140;;40531:58;-1:-1:-1;;;;;40531:10:0;:27;40559:5;40574:4;40581:7;40531:27;:58::i;:::-;40620:7;40604:23;;40499:140;40688:11;;:15;;;;:30;;-1:-1:-1;40707:11:0;;;;;;40688:30;40684:481;;;40785:11;;40770;;40763:18;;:4;:18;:::i;:::-;40762:34;;;;:::i;:::-;40735:61;-1:-1:-1;40811:41:0;40735:61;40811:41;;:::i;:::-;;;40882:4;:11;;;40867;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;40922:1:0;40908:15;;40979:18;;;;41001:15;40979:37;40975:179;;;41037:17;;;:44;;;41100:17;:38;;41057:24;;41100:17;;;:38;;41057:24;;41100:38;:::i;:::-;;;;-1:-1:-1;;40975:179:0;41179:11;;:16;41175:226;;41295:31;41302:24;41295:4;:31;:::i;:::-;41262:11;;41246:27;;:13;:27;:::i;:::-;41245:82;;;;:::i;:::-;41212:115;;41175:226;;;41376:13;41360:29;;41175:226;41482:4;:18;;;41463:4;:16;;;:37;41459:1154;;;41556:19;41654:15;;41638:12;;41599:4;:18;;;41580:4;:16;;;:37;;;;:::i;:::-;41579:71;;;;:::i;:::-;41578:91;;;;:::i;:::-;41556:113;-1:-1:-1;41684:19:0;28077:4;41707:27;41721:13;41556:113;41707:27;:::i;:::-;41706:65;;;;:::i;:::-;41684:87;-1:-1:-1;41786:28:0;41684:87;41786:28;;:::i;:::-;;;41844:13;41829:4;:11;;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;41996:24:0;;-1:-1:-1;28077:4:0;42024:27;42038:13;42024:11;:27;:::i;:::-;42023:65;;;;:::i;:::-;41996:92;;42128:16;42103:4;:21;;;:41;;;;;;;:::i;:::-;;;;;;;;42177:16;42159:14;;:34;;;;;;;:::i;:::-;;;;;;;;42267:7;42246:4;:17;;;:28;;;;;;;:::i;:::-;;;;;;;;42310:7;42289:17;;:28;;;;;;;:::i;:::-;;;;;;;;42362:5;-1:-1:-1;;;;;42339:201:0;;42386:4;:17;;;42422:4;:11;;;42472:4;:18;;;42453:4;:16;;;:37;;;;:::i;:::-;42339:201;;;17872:25:1;;;17928:2;17913:18;;17906:34;;;;17956:18;;;17949:34;42510:15:0;18014:2:1;17999:18;;17992:34;17859:3;17844:19;42339:201:0;;;;;;;41459:1154;;;;;;42588:13;42573:4;:11;;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;41459:1154:0;42639:1;42629:7;:11;:32;;;;42660:1;42644:13;:17;42629:32;42625:105;;;42703:15;42678:22;;;:40;42625:105;42755:13;42740:11;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;42891:21:0;;;;;42864:11;;42836;:9;:11::i;:::-;42822;;:25;;;;:::i;:::-;42821:54;;;;:::i;:::-;:91;;;;:::i;:::-;42781:24;;;:131;42949:15;42923:23;;;:41;43025:30;43049:5;43025:23;:30::i;:::-;43073:146;;;17872:25:1;;;17928:2;17913:18;;17906:34;;;17956:18;;;17949:34;;;43193:15:0;18014:2:1;17999:18;;17992:34;-1:-1:-1;;;;;43073:146:0;;;;;17859:3:1;17844:19;43073:146:0;;;;;;;38353:4874;;;;;;;;;:::o;22561:108::-;22264:4;22288:7;-1:-1:-1;;;22288:7:0;;;;22620:41;;;;-1:-1:-1;;;22620:41:0;;5413:2:1;22620:41:0;;;5395:21:1;5452:2;5432:18;;;5425:30;-1:-1:-1;;;5471:18:1;;;5464:50;5531:18;;22620:41:0;5385:170:1;23072:120:0;22081:16;:14;:16::i;:::-;23141:5:::1;23131:15:::0;;-1:-1:-1;;;;23131:15:0::1;::::0;;23162:22:::1;20417:10:::0;23171:12:::1;23162:22;::::0;-1:-1:-1;;;;;2639:32:1;;;2621:51;;2609:2;2594:18;23162:22:0::1;;;;;;;23072:120::o:0;25694:191::-;25768:16;25787:6;;-1:-1:-1;;;;;25804:17:0;;;-1:-1:-1;;;;;;25804:17:0;;;;;;25837:40;;25787:6;;;;;;;25837:40;;25768:16;25837:40;25694:191;;:::o;22813:118::-;21822:19;:17;:19::i;:::-;22873:7:::1;:14:::0;;-1:-1:-1;;;;22873:14:0::1;-1:-1:-1::0;;;22873:14:0::1;::::0;;22903:20:::1;22910:12;20417:10:::0;;20337:98;15875:211;16019:58;;-1:-1:-1;;;;;3255:32:1;;16019:58:0;;;3237:51:1;3304:18;;;3297:34;;;15992:86:0;;16012:5;;-1:-1:-1;;;16042:23:0;3210:18:1;;16019:58:0;3192:145:1;18942:716:0;19366:23;19392:69;19420:4;19392:69;;;;;;;;;;;;;;;;;19400:5;-1:-1:-1;;;;;19392:27:0;;;:69;;;;;:::i;:::-;19476:17;;19366:95;;-1:-1:-1;19476:21:0;19472:179;;19573:10;19562:30;;;;;;;;;;;;:::i;:::-;19554:85;;;;-1:-1:-1;;;19554:85:0;;14940:2:1;19554:85:0;;;14922:21:1;14979:2;14959:18;;;14952:30;15018:34;14998:18;;;14991:62;-1:-1:-1;;;15069:18:1;;;15062:40;15119:19;;19554:85:0;14912:232:1;46645:398:0;46741:10;;46705:85;;-1:-1:-1;;;46705:85:0;;;;;16672:25:1;;;;46774:4:0;16713:18:1;;;16706:60;46684:18:0;;46705:10;-1:-1:-1;;;;;46705:21:0;;;;16645:18:1;;46705:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46684:106;-1:-1:-1;46805:14:0;;46801:235;;46836:17;46856:11;:9;:11::i;:::-;46902:10;;46882:34;;-1:-1:-1;;;46882:34:0;;;;;16959:25:1;;;;46914:1:0;17000:18:1;;;16993:34;46836:31:0;;-1:-1:-1;46882:10:0;-1:-1:-1;;;;;46882:19:0;;;;16932:18:1;;46882:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46931:16;46950:11;:9;:11::i;:::-;46931:30;-1:-1:-1;46989:10:0;46981:43;47002:20;47013:9;46931:30;47002:20;:::i;:::-;46981:43;;16462:25:1;;;16450:2;16435:18;46981:43:0;;;;;;;46801:235;;46645:398;:::o;33158:3999::-;-1:-1:-1;;;;;33242:15:0;;33218:21;33242:15;;;:8;:15;;;;;33272:11;;:15;33268:3882;;33308:11;;;;;;33304:3835;;;33433:21;33545:4;:21;;;33510:11;;33473:4;:11;;;33458;:9;:11::i;:::-;:27;;;;:::i;:::-;33457:64;;;;:::i;:::-;:109;;;;:::i;:::-;33433:133;;33603:4;:21;;;33585:14;;:39;;;;;;;:::i;:::-;;;;-1:-1:-1;;33667:1:0;33643:21;;;;:25;;;33702:11;;33687:26;;33702:11;;33667:1;33687:26;;33702:11;;33687:26;:::i;:::-;;;;-1:-1:-1;;;;;;;33836:26:0;;;;;;:19;:26;;;;;;;;33835:27;:138;;;;;33957:15;33908:20;;33889:4;:16;;;:39;;;;:::i;:::-;33888:84;33835:138;33809:1064;;;34016:18;34053:4;:17;;;34037:13;:33;;;;:::i;:::-;34016:54;;34093:23;34206:20;;34162:4;:16;;;34119:15;:59;;;;:::i;:::-;:107;;;;:::i;:::-;34093:133;;34271:23;;34253:15;:41;34249:139;;;-1:-1:-1;34341:23:0;;34249:139;34493:21;34575:23;;34536:10;;34518:15;:28;;;;:::i;:::-;34517:81;;;;:::i;:::-;34493:105;-1:-1:-1;34621:25:0;28077:4;34650:26;34493:105;34650:10;:26;:::i;:::-;34649:72;;;;:::i;:::-;34768:8;;34621:100;;-1:-1:-1;34744:52:0;;-1:-1:-1;;;;;34744:10:0;:23;;;34768:8;34621:100;34744:23;:52::i;:::-;34819:34;34836:17;34819:34;;:::i;:::-;;;33809:1064;;;;;34941:12;34956:11;:9;:11::i;:::-;34941:26;;34986:21;35030:11;;35045:1;35030:16;35026:263;;35170:20;35177:13;35170:4;:20;:::i;:::-;35129:11;;35113:27;;:13;:27;:::i;:::-;35112:79;;;;:::i;:::-;35071:120;;35026:263;;;-1:-1:-1;35256:13:0;35026:263;35307:27;;;35353:11;:28;;35321:13;;35353:11;35307;;35353:28;;35321:13;;35353:28;:::i;:::-;;;;-1:-1:-1;;35476:16:0;;;;35495:15;-1:-1:-1;35472:368:0;;;35535:11;;;:19;;-1:-1:-1;;35535:19:0;;;35549:5;35577:18;;;:22;;;35622:16;;;:20;;;35686:17;;;;35665;:38;;35686:17;;35665;;:38;;35686:17;;35665:38;:::i;:::-;;;;-1:-1:-1;;35746:1:0;35726:17;;;:21;35775:45;;;16959:25:1;;;35804:15:0;17015:2:1;17000:18;;16993:34;-1:-1:-1;;;;;35775:45:0;;;;;16932:18:1;35775:45:0;;;;;;;35472:368;33304:3835;;;32096:1:::1;54636:327:::0;:::o;33304:3835::-;-1:-1:-1;;;;;35866:30:0;;;;;;:23;:30;;;;;;;;35861:1278;;35964:19;36016:11;;36001;:9;:11::i;:::-;35987;;:25;;;;:::i;:::-;35986:41;;;;:::i;:::-;35964:63;;36061:4;:11;;;36046;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;36105:1:0;36091:15;;;36160:24;;;;36146:38;;:11;:38;:::i;:::-;36221:14;;36125:59;;-1:-1:-1;60831:17:0;;60876:8;36254:99;;-1:-1:-1;36311:22:0;;36254:99;36371:29;36428:5;36404:20;36417:7;36404:10;:20;:::i;:::-;36403:30;;;;:::i;:::-;36371:62;-1:-1:-1;36456:25:0;;36452:189;;36530:8;;36506:56;;-1:-1:-1;;;;;36506:10:0;:23;;;36530:8;36540:21;36506:23;:56::i;:::-;36585:36;36600:21;36585:36;;:::i;:::-;;;36452:189;36709:12;36724:11;:9;:11::i;:::-;36709:26;;36754:17;36794:11;;36809:1;36794:16;36790:249;;36928:18;36935:11;36928:4;:18;:::i;:::-;36887:11;;36873:25;;:11;:25;:::i;:::-;36872:75;;;;:::i;:::-;36835:112;;36790:249;;;-1:-1:-1;37008:11:0;36790:249;37057:23;;;37099:11;:24;;37071:9;;37099:11;37057;;37099:24;;37071:9;;37099:24;:::i;:::-;;;;-1:-1:-1;;;;;;;;33158:3999:0;;:::o;32540:485::-;32612:13;;-1:-1:-1;;;;;32612:13:0;:27;32608:410;;-1:-1:-1;;;;;32680:15:0;;32656:21;32680:15;;;:8;:15;;;;;32752:18;;;;32733:16;;;;32680:15;;32656:21;32733:37;;32752:18;32733:37;:::i;:::-;32800:13;;32873:17;;;;32940;;32976:15;;32785:221;;-1:-1:-1;;;32785:221:0;;-1:-1:-1;;;;;3619:32:1;;;32785:221:0;;;3601:51:1;3668:18;;;3661:34;;;;3711:18;;;3704:34;;;3754:18;;;3747:34;;;;3797:19;;;3790:35;32710:60:0;;-1:-1:-1;32800:13:0;;32785:45;;3573:19:1;;32785:221:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32608:410;;32540:485;:::o;5363:229::-;5500:12;5532:52;5554:6;5562:4;5568:1;5571:12;5532:21;:52::i;:::-;5525:59;;5363:229;;;;;;:::o;6483:510::-;6653:12;6711:5;6686:21;:30;;6678:81;;;;-1:-1:-1;;;6678:81:0;;9471:2:1;6678:81:0;;;9453:21:1;9510:2;9490:18;;;9483:30;9549:34;9529:18;;;9522:62;-1:-1:-1;;;9600:18:1;;;9593:36;9646:19;;6678:81:0;9443:228:1;6678:81:0;-1:-1:-1;;;;;2913:19:0;;;6770:60;;;;-1:-1:-1;;;6770:60:0;;14152:2:1;6770:60:0;;;14134:21:1;14191:2;14171:18;;;14164:30;14230:31;14210:18;;;14203:59;14279:18;;6770:60:0;14124:179:1;6770:60:0;6844:12;6858:23;6885:6;-1:-1:-1;;;;;6885:11:0;6904:5;6911:4;6885:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6843:73;;;;6934:51;6951:7;6960:10;6972:12;6934:16;:51::i;:::-;6927:58;6483:510;-1:-1:-1;;;;;;;6483:510:0:o;9169:762::-;9319:12;9348:7;9344:580;;;-1:-1:-1;9379:10:0;9372:17;;9344:580;9493:17;;:21;9489:424;;9741:10;9735:17;9802:15;9789:10;9785:2;9781:19;9774:44;9689:148;9884:12;9877:20;;-1:-1:-1;;;9877:20:0;;;;;;;;:::i;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:392::-;341:6;349;402:2;390:9;381:7;377:23;373:32;370:2;;;423:6;415;408:22;370:2;467:9;454:23;486:31;511:5;486:31;:::i;:::-;536:5;-1:-1:-1;593:2:1;578:18;;565:32;606:30;565:32;606:30;:::i;:::-;655:7;645:17;;;360:308;;;;;:::o;673:325::-;741:6;749;802:2;790:9;781:7;777:23;773:32;770:2;;;823:6;815;808:22;770:2;867:9;854:23;886:31;911:5;886:31;:::i;:::-;936:5;988:2;973:18;;;;960:32;;-1:-1:-1;;;760:238:1:o;1003:255::-;1070:6;1123:2;1111:9;1102:7;1098:23;1094:32;1091:2;;;1144:6;1136;1129:22;1091:2;1181:9;1175:16;1200:28;1222:5;1200:28;:::i;1539:190::-;1598:6;1651:2;1639:9;1630:7;1626:23;1622:32;1619:2;;;1672:6;1664;1657:22;1619:2;-1:-1:-1;1700:23:1;;1609:120;-1:-1:-1;1609:120:1:o;1734:194::-;1804:6;1857:2;1845:9;1836:7;1832:23;1828:32;1825:2;;;1878:6;1870;1863:22;1825:2;-1:-1:-1;1906:16:1;;1815:113;-1:-1:-1;1815:113:1:o;1933:258::-;2001:6;2009;2062:2;2050:9;2041:7;2037:23;2033:32;2030:2;;;2083:6;2075;2068:22;2030:2;-1:-1:-1;;2111:23:1;;;2181:2;2166:18;;;2153:32;;-1:-1:-1;2020:171:1:o;2196:274::-;2325:3;2363:6;2357:13;2379:53;2425:6;2420:3;2413:4;2405:6;2401:17;2379:53;:::i;:::-;2448:16;;;;;2333:137;-1:-1:-1;;2333:137:1:o;4476:383::-;4625:2;4614:9;4607:21;4588:4;4657:6;4651:13;4700:6;4695:2;4684:9;4680:18;4673:34;4716:66;4775:6;4770:2;4759:9;4755:18;4750:2;4742:6;4738:15;4716:66;:::i;:::-;4843:2;4822:15;-1:-1:-1;;4818:29:1;4803:45;;;;4850:2;4799:54;;4597:262;-1:-1:-1;;4597:262:1:o;9676:418::-;9878:2;9860:21;;;9917:2;9897:18;;;9890:30;9956:34;9951:2;9936:18;;9929:62;-1:-1:-1;;;10022:2:1;10007:18;;10000:52;10084:3;10069:19;;9850:244::o;10444:346::-;10646:2;10628:21;;;10685:2;10665:18;;;10658:30;-1:-1:-1;;;10719:2:1;10704:18;;10697:52;10781:2;10766:18;;10618:172::o;13185:335::-;13387:2;13369:21;;;13426:2;13406:18;;;13399:30;-1:-1:-1;;;13460:2:1;13445:18;;13438:41;13511:2;13496:18;;13359:161::o;15149:412::-;15351:2;15333:21;;;15390:2;15370:18;;;15363:30;15429:34;15424:2;15409:18;;15402:62;-1:-1:-1;;;15495:2:1;15480:18;;15473:46;15551:3;15536:19;;15323:238::o;18803:128::-;18843:3;18874:1;18870:6;18867:1;18864:13;18861:2;;;18880:18;;:::i;:::-;-1:-1:-1;18916:9:1;;18851:80::o;18936:217::-;18976:1;19002;18992:2;;-1:-1:-1;;;19027:31:1;;19081:4;19078:1;19071:15;19109:4;19034:1;19099:15;18992:2;-1:-1:-1;19138:9:1;;18982:171::o;19158:168::-;19198:7;19264:1;19260;19256:6;19252:14;19249:1;19246:21;19241:1;19234:9;19227:17;19223:45;19220:2;;;19271:18;;:::i;:::-;-1:-1:-1;19311:9:1;;19210:116::o;19331:125::-;19371:4;19399:1;19396;19393:8;19390:2;;;19404:18;;:::i;:::-;-1:-1:-1;19441:9:1;;19380:76::o;19461:258::-;19533:1;19543:113;19557:6;19554:1;19551:13;19543:113;;;19633:11;;;19627:18;19614:11;;;19607:39;19579:2;19572:10;19543:113;;;19674:6;19671:1;19668:13;19665:2;;;-1:-1:-1;;19709:1:1;19691:16;;19684:27;19514:205::o;19724:127::-;19785:10;19780:3;19776:20;19773:1;19766:31;19816:4;19813:1;19806:15;19840:4;19837:1;19830:15;19856:131;-1:-1:-1;;;;;19931:31:1;;19921:42;;19911:2;;19977:1;19974;19967:12;19992:118;20078:5;20071:13;20064:21;20057:5;20054:32;20044:2;;20100:1;20097;20090:12
Swarm Source
ipfs://b384c660161a22ac70b44380f3e9c91c1d599cca16237cc53ca2ff188f3f592f
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.