Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 5,355 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 18052623 | 303 days ago | IN | 0 ETH | 0.00165317 | ||||
Deposit | 17626348 | 363 days ago | IN | 0 ETH | 0.00914554 | ||||
Deposit | 17626335 | 363 days ago | IN | 0 ETH | 0.00879045 | ||||
Withdraw | 17244823 | 417 days ago | IN | 0 ETH | 0.01497345 | ||||
Withdraw | 17133690 | 432 days ago | IN | 0 ETH | 0.00614412 | ||||
Withdraw | 17064874 | 442 days ago | IN | 0 ETH | 0.00606469 | ||||
Deposit | 16655065 | 500 days ago | IN | 0 ETH | 0.00423429 | ||||
Deposit | 16655059 | 500 days ago | IN | 0 ETH | 0.00373965 | ||||
Deposit | 16571659 | 511 days ago | IN | 0 ETH | 0.00549528 | ||||
Deposit | 16498815 | 522 days ago | IN | 0 ETH | 0.00444118 | ||||
Deposit | 16498806 | 522 days ago | IN | 0 ETH | 0.00412931 | ||||
Withdraw | 16397359 | 536 days ago | IN | 0 ETH | 0.00313156 | ||||
Deposit | 16397355 | 536 days ago | IN | 0 ETH | 0.00338566 | ||||
Withdraw | 16381405 | 538 days ago | IN | 0 ETH | 0.0027793 | ||||
Deposit | 16087369 | 579 days ago | IN | 0 ETH | 0.00057127 | ||||
Withdraw | 16087369 | 579 days ago | IN | 0 ETH | 0.00262507 | ||||
Withdraw | 16059610 | 583 days ago | IN | 0 ETH | 0.00197903 | ||||
Deposit | 16059608 | 583 days ago | IN | 0 ETH | 0.00217992 | ||||
Withdraw | 15955391 | 597 days ago | IN | 0 ETH | 0.00252576 | ||||
Withdraw | 15955388 | 597 days ago | IN | 0 ETH | 0.00116392 | ||||
Deposit | 15955385 | 597 days ago | IN | 0 ETH | 0.00261565 | ||||
Withdraw | 15955380 | 597 days ago | IN | 0 ETH | 0.00259212 | ||||
Deposit | 15955375 | 597 days ago | IN | 0 ETH | 0.00260562 | ||||
Deposit | 15922276 | 602 days ago | IN | 0 ETH | 0.00257065 | ||||
Deposit | 15893124 | 606 days ago | IN | 0 ETH | 0.0030291 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MasterChefBrain
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-06 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; pragma experimental ABIEncoderV2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } /** * @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; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @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)); } } /** * @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"); } } } /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } library BoringERC20 { bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol() bytes4 private constant SIG_NAME = 0x06fdde03; // name() bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals() bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256) bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256) function returnDataToString(bytes memory data) internal pure returns (string memory) { if (data.length >= 64) { return abi.decode(data, (string)); } else if (data.length == 32) { uint8 i = 0; while (i < 32 && data[i] != 0) { i++; } bytes memory bytesArray = new bytes(i); for (i = 0; i < 32 && data[i] != 0; i++) { bytesArray[i] = data[i]; } return string(bytesArray); } else { return "???"; } } /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token symbol. function safeSymbol(IERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_SYMBOL) ); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.name version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token name. function safeName(IERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_NAME) ); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. /// @param token The address of the ERC-20 token contract. /// @return (uint8) Token decimals. function safeDecimals(IERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall( abi.encodeWithSelector(SIG_DECIMALS) ); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransfer( IERC20 token, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed" ); } /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param from Transfer tokens from. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransferFrom( IERC20 token, address from, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed" ); } } interface BRAINToken { function excludeFromFees(address) external; function includeInFees(address) external; function changeMarketing(address payable) external; function changeTreasury(address payable) external; function setMaxTx(uint256) external; function toggleMaxTx() external; function setTax(uint256) external; function toggleTax() external; function addBots(address[] memory) external; function removeBot(address) external; function addMinter(address) external; function removeMinter(address) external; function mint(address, uint256) external; function burn() external; function burn(uint256) external; } interface FARM { function stake(address, uint256) external returns(bool); function viewJoePerSec() external returns(uint256); } // MasterChefJoe is a boss. He says "go f your blocks lego boy, I'm gonna use timestamp instead". // And to top it off, it takes no risks. Because the biggest risk is operator error. // So we make it virtually impossible for the operator of this contract to cause a bug with people's harvests. // // Note that it's ownable and the owner wields tremendous power. The ownership // will be transferred to a governance smart contract once JOE is sufficiently // distributed and the community can show to govern itself. // // With thanks to the Lydia Finance team. // // Godspeed and may the 10x be with you. contract MasterChefBrain is Ownable, FARM { using SafeMath for uint256; using BoringERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of JOEs // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accJoePerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accJoePerShare` (and `lastRewardTimestamp`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. JOEs to distribute per second. uint256 lastRewardTimestamp; // Last timestamp that JOEs distribution occurs. uint256 accJoePerShare; // Accumulated JOEs per share, times 1e12. See below. } // The JOE TOKEN! BRAINToken public joe; //JOE TOKEN ADDRESS address public joeAddress; // Dev address. address public devAddr; // JOE tokens created per second. uint256 public joePerSec; // Percentage of pool rewards that goto the devs. uint256 public devPercent; //Reserves amunt uint256 private availableReserves; // Scalable TVL APR uint256[] public TvlAPR; // Scalable TVL TvlThresholds uint256[] public TvlThresholds; // Staked JOE uint256 public stakedJoe; // JOE ERC20 IERC20 public joeERC20; //Important constants //bsc = 0x10ED43C718714eb63d5aA57B78B54704E256024E //Uni = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D //Matic = 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff address private constant UniswapRouter=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; IUniswapV2Router02 private _uniswapRouter = IUniswapV2Router02(UniswapRouter); address private constant WETHUSD = 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852; IERC20 constant USD = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7); address private creator=0xddC004407e26659C0c22bC23934C07B06fcEc202; address[] public pathForTVL; // Info of each pool. PoolInfo[] public poolInfo; // Set of all LP tokens that have been added as pools EnumerableSet.AddressSet private lpTokens; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; // The timestamp when JOE mining starts. uint256 public startTimestamp; constructor( BRAINToken _joe, address _joeAddress, address _devAddr, uint256 _startTimestamp, uint256 _devPercent, uint256 _reserves ) { require( 0 <= _devPercent && _devPercent <= 980, "constructor: invalid dev percent value" ); joe = _joe; joeAddress = _joeAddress; joeERC20 = IERC20(joeAddress); devAddr = _devAddr; startTimestamp = _startTimestamp; devPercent = _devPercent; totalAllocPoint = 0; availableReserves=_reserves; pathForTVL = new address[](3); pathForTVL[0] = joeAddress; pathForTVL[1] = _uniswapRouter.WETH(); pathForTVL[2] = address(USD); } function viewJoePerSec() external view override returns(uint256) { return joePerSec; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. function add( uint256 _allocPoint, IERC20 _lpToken ) public onlyOwner { require( Address.isContract(address(_lpToken)), "add: LP token must be a valid contract" ); require(!lpTokens.contains(address(_lpToken)), "add: LP already added"); massUpdatePools(); uint256 lastRewardTimestamp = block.timestamp > startTimestamp ? block.timestamp : startTimestamp; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardTimestamp: lastRewardTimestamp, accJoePerShare: 0 }) ); lpTokens.add(address(_lpToken)); } // Update the given pool's JOE allocation point. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint ) public onlyOwner { massUpdatePools(); totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; } // View function to see pending JOEs on frontend. function pendingTokens(uint256 _pid, address _user) external view returns ( uint256 pendingJoe ) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accJoePerShare = pool.accJoePerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 multiplier = block.timestamp.sub(pool.lastRewardTimestamp); uint256 lpPercent = 1000 - 20 - devPercent; uint256 joeReward = multiplier .mul(joePerSec) .mul(pool.allocPoint) .div(totalAllocPoint) .mul(lpPercent) .div(1000); accJoePerShare = accJoePerShare.add( joeReward.mul(1e12).div(lpSupply) ); } pendingJoe = user.amount.mul(accJoePerShare).div(1e12).sub( user.rewardDebt ); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0) { pool.lastRewardTimestamp = block.timestamp; return; } joePerSec = getjoePerSec(); uint256 joeReward = (block.timestamp.sub(pool.lastRewardTimestamp)).mul(joePerSec).mul(pool.allocPoint).div( totalAllocPoint ); uint256 lpPercent = 1000 - 20 - devPercent; joe.mint(devAddr, joeReward.mul(devPercent).div(1000)); joe.mint(creator, joeReward.mul(20).div(1000)); joe.mint(address(this), joeReward.mul(lpPercent).div(1000)); pool.accJoePerShare = pool.accJoePerShare.add( joeReward.mul(1e12).div(lpSupply).mul(lpPercent).div(1000) ); pool.lastRewardTimestamp = block.timestamp; } // Deposit LP tokens to MasterChef for JOE allocation. function deposit(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { // Harvest JOE safeJoeTransfer(msg.sender, user .amount .mul(pool.accJoePerShare) .div(1e12) .sub(user.rewardDebt) ); } user.amount = user.amount.add(_amount); user.rewardDebt = user.amount.mul(pool.accJoePerShare).div(1e12); pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); if (_pid == 1) { stakedJoe = stakedJoe + _amount; } } function compound(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount > 0, "NO TOKENS"); UserInfo storage compUser = userInfo[1][msg.sender]; updatePool(_pid); uint256 rewardAmount = user .amount .mul(pool.accJoePerShare) .div(1e12) .sub(user.rewardDebt); compUser.amount = compUser.amount.add(rewardAmount); user.rewardDebt = user.amount.mul(pool.accJoePerShare).div(1e12); stakedJoe = stakedJoe.add(rewardAmount); } function stake(address _user, uint256 _amount) external override returns(bool){ PoolInfo storage pool = poolInfo[1]; UserInfo storage user = userInfo[1][_user]; updatePool(1); if (user.amount > 0) { // Harvest JOE safeJoeTransfer(_user, user .amount .mul(pool.accJoePerShare) .div(1e12) .sub(user.rewardDebt) ); } user.amount = user.amount.add(_amount); user.rewardDebt = user.amount.mul(pool.accJoePerShare).div(1e12); pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); stakedJoe = stakedJoe + _amount; return true; } // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); // Harvest JOE safeJoeTransfer(msg.sender, user.amount.mul(pool.accJoePerShare).div(1e12).sub( user.rewardDebt)); user.amount = user.amount.sub(_amount); user.rewardDebt = user.amount.mul(pool.accJoePerShare).div(1e12); pool.lpToken.safeTransfer(address(msg.sender), _amount.mul(95).div(100)); pool.lpToken.safeTransfer(devAddr, _amount.mul(5).div(100)); if (_pid == 1) { stakedJoe = stakedJoe - _amount; } } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; pool.lpToken.safeTransfer(address(msg.sender), user.amount); user.amount = 0; user.rewardDebt = 0; } // Safe joe transfer function, just in case if rounding error causes pool to not have enough JOEs. function safeJoeTransfer(address _to, uint256 _amount) internal { uint256 joeBal = joeERC20.balanceOf(address(this)); if (_amount > joeBal) { joeERC20.transfer(_to, joeBal.sub(stakedJoe)); } else { joeERC20.transfer(_to, _amount); } } // Update dev address by the previous dev. function dev(address _devAddr) public { require(msg.sender == devAddr, "dev: wut?"); devAddr = _devAddr; } function setDevPercent(uint256 _newDevPercent) public onlyOwner { require( 0 <= _newDevPercent && _newDevPercent <= 980, "setDevPercent: invalid percent value" ); devPercent = _newDevPercent; } function setTvlApr(uint256[] memory _tvlArray) external onlyOwner { TvlAPR = _tvlArray; } function setTvlThresholds(uint256[] memory _tvlThresholdArray) external onlyOwner { TvlThresholds = _tvlThresholdArray; } function getjoePerSec() public view returns(uint256 amount ) { uint256 joeUsdValue = ((_uniswapRouter.getAmountsOut(1e18, pathForTVL))[2]).mul(1e12); uint256 lpInJoe = (((joeERC20.balanceOf(address(poolInfo[0].lpToken))).mul(2)).mul((poolInfo[0].lpToken.balanceOf(address(this))))).div(poolInfo[0].lpToken.totalSupply()); uint256 tvl = (joeUsdValue.mul(lpInJoe.add(stakedJoe))).div(1e18); for (uint256 i; i<TvlThresholds.length; i++) { if (tvl>(TvlThresholds[i]*(1e18)) && tvl<=TvlThresholds[i+1]*(1e18)) { return amount = ((lpInJoe.add(stakedJoe)).mul(TvlAPR[i])).div(3153600000); } } } function mintReserves(uint256 _amount) external onlyOwner { require(_amount <= availableReserves, "amount too high"); availableReserves = availableReserves - _amount; joe.mint(msg.sender, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract BRAINToken","name":"_joe","type":"address"},{"internalType":"address","name":"_joeAddress","type":"address"},{"internalType":"address","name":"_devAddr","type":"address"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_devPercent","type":"uint256"},{"internalType":"uint256","name":"_reserves","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TvlAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TvlThresholds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddr","type":"address"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getjoePerSec","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"joe","outputs":[{"internalType":"contract BRAINToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"joeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"joeERC20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"joePerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pathForTVL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTokens","outputs":[{"internalType":"uint256","name":"pendingJoe","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accJoePerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDevPercent","type":"uint256"}],"name":"setDevPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tvlArray","type":"uint256[]"}],"name":"setTvlApr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tvlThresholdArray","type":"uint256[]"}],"name":"setTvlThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedJoe","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewJoePerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600b80546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d17909155600c805490911673ddc004407e26659c0c22bc23934c07b06fcec2021790553480156200005957600080fd5b5060405162002fde38038062002fde8339810160408190526200007c91620003e0565b6200008733620002e8565b6103d4821115620000ed5760405162461bcd60e51b815260206004820152602660248201527f636f6e7374727563746f723a20696e76616c6964206465762070657263656e746044820152652076616c756560d01b606482015260840160405180910390fd5b600180546001600160a01b038881166001600160a01b031992831617909255600280548884169083168117909155600a8054831690911790556003805492871692909116919091178155601384905560058390556000601255600682905560408051828152608081019091529060208201606080368337505081516200017b92600d92506020019062000338565b50600254600d80546001600160a01b0390921691600090620001a157620001a162000450565b60009182526020918290200180546001600160a01b0319166001600160a01b03938416179055600b54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156200020257600080fd5b505afa15801562000217573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023d9190620003b9565b600d60018154811062000254576200025462000450565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555073dac17f958d2ee523a2206206994597c13d831ec7600d600281548110620002ae57620002ae62000450565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505050506200047f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821562000390579160200282015b828111156200039057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000359565b506200039e929150620003a2565b5090565b5b808211156200039e5760008155600101620003a3565b600060208284031215620003cc57600080fd5b8151620003d98162000466565b9392505050565b60008060008060008060c08789031215620003fa57600080fd5b8651620004078162000466565b60208801519096506200041a8162000466565b60408801519095506200042d8162000466565b80945050606087015192506080870151915060a087015190509295509295509295565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146200047c57600080fd5b50565b612b4f806200048f6000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c80638da5cb5b11610145578063ca418d23116100bd578063e2bbb1581161008c578063f2fde38b11610071578063f2fde38b14610537578063fc3c28af1461054a578063ffcd42631461055357600080fd5b8063e2bbb1581461051b578063e6fd48bc1461052e57600080fd5b8063ca418d23146104bf578063ca57dfdd146104c8578063cb15d8e2146104db578063da09c72c146104fb57600080fd5b8063ac9bb97611610114578063b985a3a0116100f9578063b985a3a014610484578063bb4cd748146104a4578063bb9ceb32146104ac57600080fd5b8063ac9bb9761461044e578063adc9772e1461046157600080fd5b80638da5cb5b146103cd5780639345d2d0146103eb57806393f1a40b146103f4578063aa5f7e261461043b57600080fd5b80634de3c361116101d857806360e8a61f116101a75780636eaddad21161018c5780636eaddad21461039f578063715018a6146103b25780638d88a90e146103ba57600080fd5b806360e8a61f14610384578063630b5ba11461039757600080fd5b80634de3c3611461033657806351eb05a61461033e5780635312ea8e14610351578063599677731461036457600080fd5b80631cb53eb5116102145780631cb53eb5146102c55780632b8bbbe8146102fd57806332f137f614610310578063441a3e701461032357600080fd5b8063081e3eda146102465780631526fe271461025d57806317caf6f1146102a75780631ab06ee5146102b0575b600080fd5b600e545b6040519081526020015b60405180910390f35b61027061026b3660046127ef565b610566565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526020850193909352918301526060820152608001610254565b61024a60125481565b6102c36102be366004612851565b6105b7565b005b6102d86102d33660046127ef565b6106bb565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610254565b6102c361030b366004612821565b6106f2565b6102c361031e3660046126a4565b6109c3565b6102c3610331366004612851565b610a5b565b60045461024a565b6102c361034c3660046127ef565b610bfb565b6102c361035f3660046127ef565b610fb3565b600a546102d89073ffffffffffffffffffffffffffffffffffffffff1681565b6102c36103923660046126a4565b611029565b6102c36110bd565b6102c36103ad3660046127ef565b6110e4565b6102c36111fb565b6102c36103c836600461265b565b611288565b60005473ffffffffffffffffffffffffffffffffffffffff166102d8565b61024a60095481565b610426610402366004612821565b60116020908152600092835260408084209091529082529020805460019091015482565b60408051928352602083019190915201610254565b6102c36104493660046127ef565b611350565b61024a61045c3660046127ef565b6114a2565b61047461046f366004612678565b6114c3565b6040519015158152602001610254565b6001546102d89073ffffffffffffffffffffffffffffffffffffffff1681565b61024a6115e1565b61024a6104ba3660046127ef565b611a81565b61024a60045481565b6102c36104d63660046127ef565b611a91565b6002546102d89073ffffffffffffffffffffffffffffffffffffffff1681565b6003546102d89073ffffffffffffffffffffffffffffffffffffffff1681565b6102c3610529366004612851565b611c1c565b61024a60135481565b6102c361054536600461265b565b611d02565b61024a60055481565b61024a610561366004612821565b611e32565b600e818154811061057657600080fd5b6000918252602090912060049091020180546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff9092169350919084565b60005473ffffffffffffffffffffffffffffffffffffffff16331461063d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6106456110bd565b61068881610682600e858154811061065f5761065f612a99565b906000526020600020906004020160010154601254611fec90919063ffffffff16565b90611fff565b60128190555080600e83815481106106a2576106a2612a99565b9060005260206000209060040201600101819055505050565b600d81815481106106cb57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60005473ffffffffffffffffffffffffffffffffffffffff163314610773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b803b610801576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610634565b61080c600f8261200b565b15610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6164643a204c5020616c726561647920616464656400000000000000000000006044820152606401610634565b61087b6110bd565b6000601354421161088e57601354610890565b425b6012549091506108a09084611fff565b6012556040805160808101825273ffffffffffffffffffffffffffffffffffffffff848116825260208201868152928201848152600060608401818152600e8054600181018255925293517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd600490920291820180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919094161790925592517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe82015591517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff830155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c400909101556109bd600f8361203a565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b8051610a579060079060208401906125fb565b5050565b6000600e8381548110610a7057610a70612a99565b600091825260208083208684526011825260408085203386529092529220805460049092029092019250831115610b03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f77697468647261773a206e6f7420676f6f6400000000000000000000000000006044820152606401610634565b610b0c84610bfb565b610b4d33610b488360010154610b4264e8d4a51000610b3c8860030154886000015461205c90919063ffffffff16565b90612068565b90611fec565b612074565b8054610b599084611fec565b8082556003830154610b769164e8d4a5100091610b3c919061205c565b6001820155610bae33610b8f6064610b3c87605f61205c565b845473ffffffffffffffffffffffffffffffffffffffff169190612255565b600354610bdb9073ffffffffffffffffffffffffffffffffffffffff16610b8f6064610b3c87600561205c565b83600114156109bd5782600954610bf29190612a1a565b60095550505050565b6000600e8281548110610c1057610c10612a99565b9060005260206000209060040201905080600201544211610c2f575050565b80546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015610c9857600080fd5b505afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190612808565b905080610ce257504260029091015550565b610cea6115e1565b6004819055506000610d23601254610b3c8560010154610d1d600454610d1d896002015442611fec90919063ffffffff16565b9061205c565b905060006005546103d4610d379190612a1a565b60015460035460055492935073ffffffffffffffffffffffffffffffffffffffff918216926340c10f199290911690610d79906103e890610b3c90889061205c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015610de457600080fd5b505af1158015610df8573d6000803e3d6000fd5b5050600154600c5473ffffffffffffffffffffffffffffffffffffffff91821693506340c10f19925016610e336103e8610b3c87601461205c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015610e9e57600080fd5b505af1158015610eb2573d6000803e3d6000fd5b505060015473ffffffffffffffffffffffffffffffffffffffff1691506340c10f19905030610ee76103e8610b3c878761205c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015610f5257600080fd5b505af1158015610f66573d6000803e3d6000fd5b50505050610f9e610f936103e8610b3c84610d1d88610b3c64e8d4a510008a61205c90919063ffffffff16565b600386015490611fff565b60038501555050426002909201919091555050565b6000600e8281548110610fc857610fc8612a99565b6000918252602080832085845260118252604080852033808752935290932080546004909302909301805490945061101a9273ffffffffffffffffffffffffffffffffffffffff919091169190612255565b60008082556001909101555050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b8051610a579060089060208401906125fb565b600e5460005b81811015610a57576110d481610bfb565b6110dd81612a31565b90506110c3565b60005473ffffffffffffffffffffffffffffffffffffffff163314611165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b6103d48111156111f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f73657444657650657263656e743a20696e76616c69642070657263656e74207660448201527f616c7565000000000000000000000000000000000000000000000000000000006064820152608401610634565b600555565b60005473ffffffffffffffffffffffffffffffffffffffff16331461127c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b61128660006123be565b565b60035473ffffffffffffffffffffffffffffffffffffffff163314611309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f6465763a207775743f00000000000000000000000000000000000000000000006044820152606401610634565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000600e828154811061136557611365612a99565b6000918252602080832085845260118252604080852033865290925292208054600490920290920192506113f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e4f20544f4b454e5300000000000000000000000000000000000000000000006044820152606401610634565b3360009081527f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b5526020526040902061142c84610bfb565b600061145a8360010154610b4264e8d4a51000610b3c8860030154886000015461205c90919063ffffffff16565b82549091506114699082611fff565b8255600384015483546114869164e8d4a5100091610b3c9161205c565b60018401556009546114989082611fff565b6009555050505050565b600781815481106114b257600080fd5b600091825260209091200154905081565b600080600e6001815481106114da576114da612a99565b6000918252602080832073ffffffffffffffffffffffffffffffffffffffff881684527f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b55290915260409092206004909102909101915061153a6001610bfb565b8054156115715761157185610b488360010154610b4264e8d4a51000610b3c8860030154886000015461205c90919063ffffffff16565b805461157d9085611fff565b808255600383015461159a9164e8d4a5100091610b3c919061205c565b600182015581546115c39073ffffffffffffffffffffffffffffffffffffffff16333087612433565b836009546115d1919061298a565b6009555060019150505b92915050565b600b546040517fd06ca61f00000000000000000000000000000000000000000000000000000000815260009182916116ec9164e8d4a510009173ffffffffffffffffffffffffffffffffffffffff9091169063d06ca61f9061165290670de0b6b3a764000090600d906004016128ae565b60006040518083038186803b15801561166a57600080fd5b505afa15801561167e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526116c49190810190612741565b6002815181106116d6576116d6612a99565b602002602001015161205c90919063ffffffff16565b90506000611965600e60008154811061170757611707612a99565b600091825260209182902060049182020154604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216936318160ddd93828101939192829003018186803b15801561177b57600080fd5b505afa15801561178f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b39190612808565b610b3c600e6000815481106117ca576117ca612a99565b60009182526020909120600491820201546040517f70a08231000000000000000000000000000000000000000000000000000000008152309281019290925273ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561184157600080fd5b505afa158015611855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118799190612808565b600a54600e8054610d1d9260029273ffffffffffffffffffffffffffffffffffffffff909116916370a0823191906000906118b6576118b6612a99565b600091825260209091206004918202015460405160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9091169181019190915260240160206040518083038186803b15801561192d57600080fd5b505afa158015611941573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1d9190612808565b90506000611994670de0b6b3a7640000610b3c61198d60095486611fff90919063ffffffff16565b869061205c565b905060005b600854811015611a7a57600881815481106119b6576119b6612a99565b9060005260206000200154670de0b6b3a76400006119d491906129dd565b82118015611a1c575060086119ea82600161298a565b815481106119fa576119fa612a99565b9060005260206000200154670de0b6b3a7640000611a1891906129dd565b8211155b15611a6857611a5f63bbf81e00610b3c60078481548110611a3f57611a3f612a99565b9060005260206000200154610d1d60095488611fff90919063ffffffff16565b94505050505090565b80611a7281612a31565b915050611999565b5050505090565b600881815481106114b257600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611b12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b600654811115611b7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f616d6f756e7420746f6f206869676800000000000000000000000000000000006044820152606401610634565b80600654611b8c9190612a1a565b6006556001546040517f40c10f190000000000000000000000000000000000000000000000000000000081523360048201526024810183905273ffffffffffffffffffffffffffffffffffffffff909116906340c10f1990604401600060405180830381600087803b158015611c0157600080fd5b505af1158015611c15573d6000803e3d6000fd5b5050505050565b6000600e8381548110611c3157611c31612a99565b60009182526020808320868452601182526040808520338652909252922060049091029091019150611c6284610bfb565b805415611c9957611c9933610b488360010154610b4264e8d4a51000610b3c8860030154886000015461205c90919063ffffffff16565b8054611ca59084611fff565b8082556003830154611cc29164e8d4a5100091610b3c919061205c565b60018201558154611ceb9073ffffffffffffffffffffffffffffffffffffffff16333086612433565b83600114156109bd5782600954610bf2919061298a565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b73ffffffffffffffffffffffffffffffffffffffff8116611e26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610634565b611e2f816123be565b50565b600080600e8481548110611e4857611e48612a99565b6000918252602080832087845260118252604080852073ffffffffffffffffffffffffffffffffffffffff8981168752935280852060049485029092016003810154815492517f70a08231000000000000000000000000000000000000000000000000000000008152309681019690965290965091949193919216906370a082319060240160206040518083038186803b158015611ee557600080fd5b505afa158015611ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1d9190612808565b9050836002015442118015611f3157508015155b15611fb9576000611f4f856002015442611fec90919063ffffffff16565b905060006005546103d4611f639190612a1a565b90506000611f946103e8610b3c84610d1d601254610b3c8d60010154610d1d6004548c61205c90919063ffffffff16565b9050611fb3611fac85610b3c8464e8d4a5100061205c565b8690611fff565b94505050505b611fe18360010154610b4264e8d4a51000610b3c86886000015461205c90919063ffffffff16565b979650505050505050565b6000611ff88284612a1a565b9392505050565b6000611ff8828461298a565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515611ff8565b6000611ff88373ffffffffffffffffffffffffffffffffffffffff84166125ac565b6000611ff882846129dd565b6000611ff882846129a2565b600a546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156120de57600080fd5b505afa1580156120f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121169190612808565b9050808211156121f657600a5460095473ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb908590612152908590611fec565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015b602060405180830381600087803b1580156121be57600080fd5b505af11580156121d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bd91906127cd565b600a546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529091169063a9059cbb906044016121a4565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916122ec9190612873565b6000604051808303816000865af19150503d8060008114612329576040519150601f19603f3d011682016040523d82523d6000602084013e61232e565b606091505b509150915081801561235857508051158061235857508080602001905181019061235891906127cd565b611c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c6564000000006044820152606401610634565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916124d29190612873565b6000604051808303816000865af19150503d806000811461250f576040519150601f19603f3d011682016040523d82523d6000602084013e612514565b606091505b509150915081801561253e57508051158061253e57508080602001905181019061253e91906127cd565b6125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646044820152606401610634565b505050505050565b60008181526001830160205260408120546125f3575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556115db565b5060006115db565b828054828255906000526020600020908101928215612636579160200282015b8281111561263657825182559160200191906001019061261b565b50612642929150612646565b5090565b5b808211156126425760008155600101612647565b60006020828403121561266d57600080fd5b8135611ff881612af7565b6000806040838503121561268b57600080fd5b823561269681612af7565b946020939093013593505050565b600060208083850312156126b757600080fd5b823567ffffffffffffffff8111156126ce57600080fd5b8301601f810185136126df57600080fd5b80356126f26126ed82612966565b612917565b80828252848201915084840188868560051b870101111561271257600080fd5b600094505b83851015612735578035835260019490940193918501918501612717565b50979650505050505050565b6000602080838503121561275457600080fd5b825167ffffffffffffffff81111561276b57600080fd5b8301601f8101851361277c57600080fd5b805161278a6126ed82612966565b80828252848201915084840188868560051b87010111156127aa57600080fd5b600094505b838510156127355780518352600194909401939185019185016127af565b6000602082840312156127df57600080fd5b81518015158114611ff857600080fd5b60006020828403121561280157600080fd5b5035919050565b60006020828403121561281a57600080fd5b5051919050565b6000806040838503121561283457600080fd5b82359150602083013561284681612af7565b809150509250929050565b6000806040838503121561286457600080fd5b50508035926020909101359150565b6000825160005b81811015612894576020818601810151858301520161287a565b818111156128a3576000828501525b509190910192915050565b60006040820184835260206040818501528185548084526060860191508660005282600020935060005b8181101561290a57845473ffffffffffffffffffffffffffffffffffffffff16835260019485019492840192016128d8565b5090979650505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561295e5761295e612ac8565b604052919050565b600067ffffffffffffffff82111561298057612980612ac8565b5060051b60200190565b6000821982111561299d5761299d612a6a565b500190565b6000826129d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a1557612a15612a6a565b500290565b600082821015612a2c57612a2c612a6a565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a6357612a63612a6a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611e2f57600080fdfea2646970667358221220e421cac999dfcdbbe34053bcf2edfe7d29eda71b923839fdc31c294eac57b7df64736f6c6343000807003300000000000000000000000039317b8a1ae06c30bb615d88cdc5522781499f1c00000000000000000000000039317b8a1ae06c30bb615d88cdc5522781499f1c000000000000000000000000faef8ce36672b934010f043f9e81e3aba3a8cba70000000000000000000000000000000000000000000000000000000061ae6a6800000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102415760003560e01c80638da5cb5b11610145578063ca418d23116100bd578063e2bbb1581161008c578063f2fde38b11610071578063f2fde38b14610537578063fc3c28af1461054a578063ffcd42631461055357600080fd5b8063e2bbb1581461051b578063e6fd48bc1461052e57600080fd5b8063ca418d23146104bf578063ca57dfdd146104c8578063cb15d8e2146104db578063da09c72c146104fb57600080fd5b8063ac9bb97611610114578063b985a3a0116100f9578063b985a3a014610484578063bb4cd748146104a4578063bb9ceb32146104ac57600080fd5b8063ac9bb9761461044e578063adc9772e1461046157600080fd5b80638da5cb5b146103cd5780639345d2d0146103eb57806393f1a40b146103f4578063aa5f7e261461043b57600080fd5b80634de3c361116101d857806360e8a61f116101a75780636eaddad21161018c5780636eaddad21461039f578063715018a6146103b25780638d88a90e146103ba57600080fd5b806360e8a61f14610384578063630b5ba11461039757600080fd5b80634de3c3611461033657806351eb05a61461033e5780635312ea8e14610351578063599677731461036457600080fd5b80631cb53eb5116102145780631cb53eb5146102c55780632b8bbbe8146102fd57806332f137f614610310578063441a3e701461032357600080fd5b8063081e3eda146102465780631526fe271461025d57806317caf6f1146102a75780631ab06ee5146102b0575b600080fd5b600e545b6040519081526020015b60405180910390f35b61027061026b3660046127ef565b610566565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526020850193909352918301526060820152608001610254565b61024a60125481565b6102c36102be366004612851565b6105b7565b005b6102d86102d33660046127ef565b6106bb565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610254565b6102c361030b366004612821565b6106f2565b6102c361031e3660046126a4565b6109c3565b6102c3610331366004612851565b610a5b565b60045461024a565b6102c361034c3660046127ef565b610bfb565b6102c361035f3660046127ef565b610fb3565b600a546102d89073ffffffffffffffffffffffffffffffffffffffff1681565b6102c36103923660046126a4565b611029565b6102c36110bd565b6102c36103ad3660046127ef565b6110e4565b6102c36111fb565b6102c36103c836600461265b565b611288565b60005473ffffffffffffffffffffffffffffffffffffffff166102d8565b61024a60095481565b610426610402366004612821565b60116020908152600092835260408084209091529082529020805460019091015482565b60408051928352602083019190915201610254565b6102c36104493660046127ef565b611350565b61024a61045c3660046127ef565b6114a2565b61047461046f366004612678565b6114c3565b6040519015158152602001610254565b6001546102d89073ffffffffffffffffffffffffffffffffffffffff1681565b61024a6115e1565b61024a6104ba3660046127ef565b611a81565b61024a60045481565b6102c36104d63660046127ef565b611a91565b6002546102d89073ffffffffffffffffffffffffffffffffffffffff1681565b6003546102d89073ffffffffffffffffffffffffffffffffffffffff1681565b6102c3610529366004612851565b611c1c565b61024a60135481565b6102c361054536600461265b565b611d02565b61024a60055481565b61024a610561366004612821565b611e32565b600e818154811061057657600080fd5b6000918252602090912060049091020180546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff9092169350919084565b60005473ffffffffffffffffffffffffffffffffffffffff16331461063d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6106456110bd565b61068881610682600e858154811061065f5761065f612a99565b906000526020600020906004020160010154601254611fec90919063ffffffff16565b90611fff565b60128190555080600e83815481106106a2576106a2612a99565b9060005260206000209060040201600101819055505050565b600d81815481106106cb57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60005473ffffffffffffffffffffffffffffffffffffffff163314610773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b803b610801576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610634565b61080c600f8261200b565b15610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6164643a204c5020616c726561647920616464656400000000000000000000006044820152606401610634565b61087b6110bd565b6000601354421161088e57601354610890565b425b6012549091506108a09084611fff565b6012556040805160808101825273ffffffffffffffffffffffffffffffffffffffff848116825260208201868152928201848152600060608401818152600e8054600181018255925293517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd600490920291820180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919094161790925592517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe82015591517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff830155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c400909101556109bd600f8361203a565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b8051610a579060079060208401906125fb565b5050565b6000600e8381548110610a7057610a70612a99565b600091825260208083208684526011825260408085203386529092529220805460049092029092019250831115610b03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f77697468647261773a206e6f7420676f6f6400000000000000000000000000006044820152606401610634565b610b0c84610bfb565b610b4d33610b488360010154610b4264e8d4a51000610b3c8860030154886000015461205c90919063ffffffff16565b90612068565b90611fec565b612074565b8054610b599084611fec565b8082556003830154610b769164e8d4a5100091610b3c919061205c565b6001820155610bae33610b8f6064610b3c87605f61205c565b845473ffffffffffffffffffffffffffffffffffffffff169190612255565b600354610bdb9073ffffffffffffffffffffffffffffffffffffffff16610b8f6064610b3c87600561205c565b83600114156109bd5782600954610bf29190612a1a565b60095550505050565b6000600e8281548110610c1057610c10612a99565b9060005260206000209060040201905080600201544211610c2f575050565b80546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015610c9857600080fd5b505afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190612808565b905080610ce257504260029091015550565b610cea6115e1565b6004819055506000610d23601254610b3c8560010154610d1d600454610d1d896002015442611fec90919063ffffffff16565b9061205c565b905060006005546103d4610d379190612a1a565b60015460035460055492935073ffffffffffffffffffffffffffffffffffffffff918216926340c10f199290911690610d79906103e890610b3c90889061205c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015610de457600080fd5b505af1158015610df8573d6000803e3d6000fd5b5050600154600c5473ffffffffffffffffffffffffffffffffffffffff91821693506340c10f19925016610e336103e8610b3c87601461205c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015610e9e57600080fd5b505af1158015610eb2573d6000803e3d6000fd5b505060015473ffffffffffffffffffffffffffffffffffffffff1691506340c10f19905030610ee76103e8610b3c878761205c565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015610f5257600080fd5b505af1158015610f66573d6000803e3d6000fd5b50505050610f9e610f936103e8610b3c84610d1d88610b3c64e8d4a510008a61205c90919063ffffffff16565b600386015490611fff565b60038501555050426002909201919091555050565b6000600e8281548110610fc857610fc8612a99565b6000918252602080832085845260118252604080852033808752935290932080546004909302909301805490945061101a9273ffffffffffffffffffffffffffffffffffffffff919091169190612255565b60008082556001909101555050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146110aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b8051610a579060089060208401906125fb565b600e5460005b81811015610a57576110d481610bfb565b6110dd81612a31565b90506110c3565b60005473ffffffffffffffffffffffffffffffffffffffff163314611165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b6103d48111156111f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f73657444657650657263656e743a20696e76616c69642070657263656e74207660448201527f616c7565000000000000000000000000000000000000000000000000000000006064820152608401610634565b600555565b60005473ffffffffffffffffffffffffffffffffffffffff16331461127c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b61128660006123be565b565b60035473ffffffffffffffffffffffffffffffffffffffff163314611309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f6465763a207775743f00000000000000000000000000000000000000000000006044820152606401610634565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000600e828154811061136557611365612a99565b6000918252602080832085845260118252604080852033865290925292208054600490920290920192506113f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e4f20544f4b454e5300000000000000000000000000000000000000000000006044820152606401610634565b3360009081527f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b5526020526040902061142c84610bfb565b600061145a8360010154610b4264e8d4a51000610b3c8860030154886000015461205c90919063ffffffff16565b82549091506114699082611fff565b8255600384015483546114869164e8d4a5100091610b3c9161205c565b60018401556009546114989082611fff565b6009555050505050565b600781815481106114b257600080fd5b600091825260209091200154905081565b600080600e6001815481106114da576114da612a99565b6000918252602080832073ffffffffffffffffffffffffffffffffffffffff881684527f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b55290915260409092206004909102909101915061153a6001610bfb565b8054156115715761157185610b488360010154610b4264e8d4a51000610b3c8860030154886000015461205c90919063ffffffff16565b805461157d9085611fff565b808255600383015461159a9164e8d4a5100091610b3c919061205c565b600182015581546115c39073ffffffffffffffffffffffffffffffffffffffff16333087612433565b836009546115d1919061298a565b6009555060019150505b92915050565b600b546040517fd06ca61f00000000000000000000000000000000000000000000000000000000815260009182916116ec9164e8d4a510009173ffffffffffffffffffffffffffffffffffffffff9091169063d06ca61f9061165290670de0b6b3a764000090600d906004016128ae565b60006040518083038186803b15801561166a57600080fd5b505afa15801561167e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526116c49190810190612741565b6002815181106116d6576116d6612a99565b602002602001015161205c90919063ffffffff16565b90506000611965600e60008154811061170757611707612a99565b600091825260209182902060049182020154604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216936318160ddd93828101939192829003018186803b15801561177b57600080fd5b505afa15801561178f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b39190612808565b610b3c600e6000815481106117ca576117ca612a99565b60009182526020909120600491820201546040517f70a08231000000000000000000000000000000000000000000000000000000008152309281019290925273ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561184157600080fd5b505afa158015611855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118799190612808565b600a54600e8054610d1d9260029273ffffffffffffffffffffffffffffffffffffffff909116916370a0823191906000906118b6576118b6612a99565b600091825260209091206004918202015460405160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9091169181019190915260240160206040518083038186803b15801561192d57600080fd5b505afa158015611941573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1d9190612808565b90506000611994670de0b6b3a7640000610b3c61198d60095486611fff90919063ffffffff16565b869061205c565b905060005b600854811015611a7a57600881815481106119b6576119b6612a99565b9060005260206000200154670de0b6b3a76400006119d491906129dd565b82118015611a1c575060086119ea82600161298a565b815481106119fa576119fa612a99565b9060005260206000200154670de0b6b3a7640000611a1891906129dd565b8211155b15611a6857611a5f63bbf81e00610b3c60078481548110611a3f57611a3f612a99565b9060005260206000200154610d1d60095488611fff90919063ffffffff16565b94505050505090565b80611a7281612a31565b915050611999565b5050505090565b600881815481106114b257600080fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611b12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b600654811115611b7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f616d6f756e7420746f6f206869676800000000000000000000000000000000006044820152606401610634565b80600654611b8c9190612a1a565b6006556001546040517f40c10f190000000000000000000000000000000000000000000000000000000081523360048201526024810183905273ffffffffffffffffffffffffffffffffffffffff909116906340c10f1990604401600060405180830381600087803b158015611c0157600080fd5b505af1158015611c15573d6000803e3d6000fd5b5050505050565b6000600e8381548110611c3157611c31612a99565b60009182526020808320868452601182526040808520338652909252922060049091029091019150611c6284610bfb565b805415611c9957611c9933610b488360010154610b4264e8d4a51000610b3c8860030154886000015461205c90919063ffffffff16565b8054611ca59084611fff565b8082556003830154611cc29164e8d4a5100091610b3c919061205c565b60018201558154611ceb9073ffffffffffffffffffffffffffffffffffffffff16333086612433565b83600114156109bd5782600954610bf2919061298a565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610634565b73ffffffffffffffffffffffffffffffffffffffff8116611e26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610634565b611e2f816123be565b50565b600080600e8481548110611e4857611e48612a99565b6000918252602080832087845260118252604080852073ffffffffffffffffffffffffffffffffffffffff8981168752935280852060049485029092016003810154815492517f70a08231000000000000000000000000000000000000000000000000000000008152309681019690965290965091949193919216906370a082319060240160206040518083038186803b158015611ee557600080fd5b505afa158015611ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1d9190612808565b9050836002015442118015611f3157508015155b15611fb9576000611f4f856002015442611fec90919063ffffffff16565b905060006005546103d4611f639190612a1a565b90506000611f946103e8610b3c84610d1d601254610b3c8d60010154610d1d6004548c61205c90919063ffffffff16565b9050611fb3611fac85610b3c8464e8d4a5100061205c565b8690611fff565b94505050505b611fe18360010154610b4264e8d4a51000610b3c86886000015461205c90919063ffffffff16565b979650505050505050565b6000611ff88284612a1a565b9392505050565b6000611ff8828461298a565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515611ff8565b6000611ff88373ffffffffffffffffffffffffffffffffffffffff84166125ac565b6000611ff882846129dd565b6000611ff882846129a2565b600a546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156120de57600080fd5b505afa1580156120f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121169190612808565b9050808211156121f657600a5460095473ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb908590612152908590611fec565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015b602060405180830381600087803b1580156121be57600080fd5b505af11580156121d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bd91906127cd565b600a546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529091169063a9059cbb906044016121a4565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916122ec9190612873565b6000604051808303816000865af19150503d8060008114612329576040519150601f19603f3d011682016040523d82523d6000602084013e61232e565b606091505b509150915081801561235857508051158061235857508080602001905181019061235891906127cd565b611c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c6564000000006044820152606401610634565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916124d29190612873565b6000604051808303816000865af19150503d806000811461250f576040519150601f19603f3d011682016040523d82523d6000602084013e612514565b606091505b509150915081801561253e57508051158061253e57508080602001905181019061253e91906127cd565b6125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646044820152606401610634565b505050505050565b60008181526001830160205260408120546125f3575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556115db565b5060006115db565b828054828255906000526020600020908101928215612636579160200282015b8281111561263657825182559160200191906001019061261b565b50612642929150612646565b5090565b5b808211156126425760008155600101612647565b60006020828403121561266d57600080fd5b8135611ff881612af7565b6000806040838503121561268b57600080fd5b823561269681612af7565b946020939093013593505050565b600060208083850312156126b757600080fd5b823567ffffffffffffffff8111156126ce57600080fd5b8301601f810185136126df57600080fd5b80356126f26126ed82612966565b612917565b80828252848201915084840188868560051b870101111561271257600080fd5b600094505b83851015612735578035835260019490940193918501918501612717565b50979650505050505050565b6000602080838503121561275457600080fd5b825167ffffffffffffffff81111561276b57600080fd5b8301601f8101851361277c57600080fd5b805161278a6126ed82612966565b80828252848201915084840188868560051b87010111156127aa57600080fd5b600094505b838510156127355780518352600194909401939185019185016127af565b6000602082840312156127df57600080fd5b81518015158114611ff857600080fd5b60006020828403121561280157600080fd5b5035919050565b60006020828403121561281a57600080fd5b5051919050565b6000806040838503121561283457600080fd5b82359150602083013561284681612af7565b809150509250929050565b6000806040838503121561286457600080fd5b50508035926020909101359150565b6000825160005b81811015612894576020818601810151858301520161287a565b818111156128a3576000828501525b509190910192915050565b60006040820184835260206040818501528185548084526060860191508660005282600020935060005b8181101561290a57845473ffffffffffffffffffffffffffffffffffffffff16835260019485019492840192016128d8565b5090979650505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561295e5761295e612ac8565b604052919050565b600067ffffffffffffffff82111561298057612980612ac8565b5060051b60200190565b6000821982111561299d5761299d612a6a565b500190565b6000826129d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a1557612a15612a6a565b500290565b600082821015612a2c57612a2c612a6a565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a6357612a63612a6a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611e2f57600080fdfea2646970667358221220e421cac999dfcdbbe34053bcf2edfe7d29eda71b923839fdc31c294eac57b7df64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000039317b8a1ae06c30bb615d88cdc5522781499f1c00000000000000000000000039317b8a1ae06c30bb615d88cdc5522781499f1c000000000000000000000000faef8ce36672b934010f043f9e81e3aba3a8cba70000000000000000000000000000000000000000000000000000000061ae6a6800000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
-----Decoded View---------------
Arg [0] : _joe (address): 0x39317B8A1aE06C30bb615d88CDC5522781499f1c
Arg [1] : _joeAddress (address): 0x39317B8A1aE06C30bb615d88CDC5522781499f1c
Arg [2] : _devAddr (address): 0xFAEF8Ce36672B934010F043f9E81E3abA3A8CbA7
Arg [3] : _startTimestamp (uint256): 1638820456
Arg [4] : _devPercent (uint256): 180
Arg [5] : _reserves (uint256): 100000000000000000000000000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000039317b8a1ae06c30bb615d88cdc5522781499f1c
Arg [1] : 00000000000000000000000039317b8a1ae06c30bb615d88cdc5522781499f1c
Arg [2] : 000000000000000000000000faef8ce36672b934010f043f9e81e3aba3a8cba7
Arg [3] : 0000000000000000000000000000000000000000000000000000000061ae6a68
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000b4
Arg [5] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Deployed Bytecode Sourcemap
59632:13824:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63737:95;63809:8;:15;63737:95;;;11434:25:1;;;11422:2;11407:18;63737:95:0;;;;;;;;62344:26;;;;;;:::i;:::-;;:::i;:::-;;;;6285:42:1;6273:55;;;6255:74;;6360:2;6345:18;;6338:34;;;;6388:18;;;6381:34;6446:2;6431:18;;6424:34;6242:3;6227:19;62344:26:0;6009:455:1;62692:30:0;;;;;;64928:296;;;;;;:::i;:::-;;:::i;:::-;;62281:27;;;;;;:::i;:::-;;:::i;:::-;;;4561:42:1;4549:55;;;4531:74;;4519:2;4504:18;62281:27:0;4385:226:1;64001:832:0;;;;;;:::i;:::-;;:::i;72192:123::-;;;;;;:::i;:::-;;:::i;70170:788::-;;;;;;:::i;:::-;;:::i;63623:100::-;63706:9;;63623:100;;66698:1073;;;;;;:::i;:::-;;:::i;71029:292::-;;;;;;:::i;:::-;;:::i;61613:22::-;;;;;;;;;72327:145;;;;;;:::i;:::-;;:::i;66442:180::-;;;:::i;71927:251::-;;;;;;:::i;:::-;;:::i;30442:94::-;;;:::i;71790:129::-;;;;;;:::i;:::-;;:::i;29791:87::-;29837:7;29864:6;;;29791:87;;61564:24;;;;;;62533:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11644:25:1;;;11700:2;11685:18;;11678:34;;;;11617:18;62533:64:0;11470:248:1;68655:662:0;;;;;;:::i;:::-;;:::i;61441:23::-;;;;;;:::i;:::-;;:::i;69325:793::-;;;;;;:::i;:::-;;:::i;:::-;;;5486:14:1;;5479:22;5461:41;;5449:2;5434:18;69325:793:0;5321:187:1;61060:21:0;;;;;;;;;72486:712;;;:::i;61507:30::-;;;;;;:::i;:::-;;:::i;61234:24::-;;;;;;73210:235;;;;;;:::i;:::-;;:::i;61113:25::-;;;;;;;;;61166:22;;;;;;;;;67839:808;;;;;;:::i;:::-;;:::i;62775:29::-;;;;;;30691:192;;;;;;:::i;:::-;;:::i;61320:25::-;;;;;;65287:1072;;;;;;:::i;:::-;;:::i;62344:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62344:26:0;;;:::o;64928:296::-;29837:7;29864:6;30011:23;29864:6;5580:10;30011:23;30003:68;;;;;;;9265:2:1;30003:68:0;;;9247:21:1;;;9284:18;;;9277:30;9343:34;9323:18;;;9316:62;9395:18;;30003:68:0;;;;;;;;;65031:17:::1;:15;:17::i;:::-;65077:87;65142:11;65077:46;65097:8;65106:4;65097:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;65077:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:87::i;:::-;65059:15;:105;;;;65203:11;65175:8;65184:4;65175:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;64928:296:::0;;:::o;62281:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62281:27:0;:::o;64001:832::-;29837:7;29864:6;30011:23;29864:6;5580:10;30011:23;30003:68;;;;;;;9265:2:1;30003:68:0;;;9247:21:1;;;9284:18;;;9277:30;9343:34;9323:18;;;9316:62;9395:18;;30003:68:0;9063:356:1;30003:68:0;6716:20;;64105:125:::1;;;::::0;::::1;::::0;;9970:2:1;64105:125:0::1;::::0;::::1;9952:21:1::0;10009:2;9989:18;;;9982:30;10048:34;10028:18;;;10021:62;10119:8;10099:18;;;10092:36;10145:19;;64105:125:0::1;9768:402:1::0;64105:125:0::1;64250:36;:8;64276::::0;64250:17:::1;:36::i;:::-;64249:37;64241:71;;;::::0;::::1;::::0;;8915:2:1;64241:71:0::1;::::0;::::1;8897:21:1::0;8954:2;8934:18;;;8927:30;8993:23;8973:18;;;8966:51;9034:18;;64241:71:0::1;8713:345:1::0;64241:71:0::1;64323:17;:15;:17::i;:::-;64351:27;64399:14;;64381:15;:32;:93;;64460:14;;64381:93;;;64429:15;64381:93;64503:15;::::0;64351:123;;-1:-1:-1;64503:32:0::1;::::0;64523:11;64503:19:::1;:32::i;:::-;64485:15;:50:::0;64574:198:::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;64574:198:0;;;;;;64546:8:::1;:237:::0;;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;64546:237:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;64794:31:::1;:8;64574:198:::0;64794:12:::1;:31::i;:::-;;64094:739;64001:832:::0;;:::o;72192:123::-;29837:7;29864:6;30011:23;29864:6;5580:10;30011:23;30003:68;;;;;;;9265:2:1;30003:68:0;;;9247:21:1;;;9284:18;;;9277:30;9343:34;9323:18;;;9316:62;9395:18;;30003:68:0;9063:356:1;30003:68:0;72279:18;;::::1;::::0;:6:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;72192:123:::0;:::o;70170:788::-;70237:21;70261:8;70270:4;70261:14;;;;;;;;:::i;:::-;;;;;;;;;70310;;;:8;:14;;;;;;70325:10;70310:26;;;;;;;70355:11;;70261:14;;;;;;;;-1:-1:-1;70355:22:0;-1:-1:-1;70355:22:0;70347:53;;;;;;;10377:2:1;70347:53:0;;;10359:21:1;10416:2;10396:18;;;10389:30;10455:20;10435:18;;;10428:48;10493:18;;70347:53:0;10175:342:1;70347:53:0;70413:16;70424:4;70413:10;:16::i;:::-;70466:110;70482:10;70494:81;70559:4;:15;;;70494:46;70535:4;70494:36;70510:4;:19;;;70494:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46::i;:::-;:50;;:81::i;:::-;70466:15;:110::i;:::-;70603:11;;:24;;70619:7;70603:15;:24::i;:::-;70589:38;;;70672:19;;;;70656:46;;70697:4;;70656:36;;70589:38;70656:15;:36::i;:46::-;70638:15;;;:64;70715:72;70749:10;70762:24;70782:3;70762:15;:7;70774:2;70762:11;:15::i;:24::-;70715:12;;;;;:72;:25;:72::i;:::-;70824:7;;70798:59;;70824:7;;70833:23;70852:3;70833:14;:7;70845:1;70833:11;:14::i;70798:59::-;70882:4;70890:1;70882:9;70878:73;;;70932:7;70920:9;;:19;;;;:::i;:::-;70908:9;:31;70226:732;;70170:788;;:::o;66698:1073::-;66751:21;66775:8;66784:4;66775:14;;;;;;;;:::i;:::-;;;;;;;;;;;66751:38;;66823:4;:24;;;66804:15;:43;66800:82;;66864:7;66698:1073;:::o;66800:82::-;66911:12;;:37;;;;;66942:4;66911:37;;;4531:74:1;66892:16:0;;66911:12;;;:22;;4504:18:1;;66911:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66892:56;-1:-1:-1;66963:13:0;66959:109;;-1:-1:-1;67020:15:0;66993:24;;;;:42;-1:-1:-1;66698:1073:0:o;66959:109::-;67100:14;:12;:14::i;:::-;67088:9;:26;;;;67127:17;67147:128;67249:15;;67147:83;67214:4;:15;;;67147:62;67199:9;;67148:45;67168:4;:24;;;67148:15;:19;;:45;;;;:::i;:::-;67147:51;;:62::i;:128::-;67127:148;;67296:17;67354:10;;67316:22;:48;;;;:::i;:::-;67377:3;;67386:7;;67409:10;;67296:68;;-1:-1:-1;67377:3:0;;;;;:8;;67386:7;;;;67395:35;;67425:4;;67395:25;;:9;;:13;:25::i;:35::-;67377:54;;;;;;;;;;5223:42:1;5211:55;;;67377:54:0;;;5193:74:1;5283:18;;;5276:34;5166:18;;67377:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67442:3:0;;67451:7;;67442:3;;;;;-1:-1:-1;67442:8:0;;-1:-1:-1;67451:7:0;67460:27;67482:4;67460:17;:9;67474:2;67460:13;:17::i;:27::-;67442:46;;;;;;;;;;5223:42:1;5211:55;;;67442:46:0;;;5193:74:1;5283:18;;;5276:34;5166:18;;67442:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67509:3:0;;;;;-1:-1:-1;67509:8:0;;-1:-1:-1;67526:4:0;67533:34;67562:4;67533:24;:9;67547;67533:13;:24::i;:34::-;67509:59;;;;;;;;;;5223:42:1;5211:55;;;67509:59:0;;;5193:74:1;5283:18;;;5276:34;5166:18;;67509:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67601:107;67639:58;67692:4;67639:48;67677:9;67639:33;67663:8;67639:19;67653:4;67639:9;:13;;:19;;;;:::i;:58::-;67601:19;;;;;:23;:107::i;:::-;67579:19;;;:129;-1:-1:-1;;67748:15:0;67721:24;;;;:42;;;;-1:-1:-1;;66698:1073:0:o;71029:292::-;71088:21;71112:8;71121:4;71112:14;;;;;;;;:::i;:::-;;;;;;;;;71161;;;:8;:14;;;;;;71176:10;71161:26;;;;;;;;71245:11;;71112:14;;;;;;;71198:12;;71112:14;;-1:-1:-1;71198:59:0;;71161:26;71198:12;;;;;71176:10;71198:25;:59::i;:::-;71282:1;71268:15;;;71294;;;;:19;-1:-1:-1;;71029:292:0:o;72327:145::-;29837:7;29864:6;30011:23;29864:6;5580:10;30011:23;30003:68;;;;;;;9265:2:1;30003:68:0;;;9247:21:1;;;9284:18;;;9277:30;9343:34;9323:18;;;9316:62;9395:18;;30003:68:0;9063:356:1;30003:68:0;72430:34;;::::1;::::0;:13:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;66442:180::-:0;66504:8;:15;66487:14;66530:85;66558:6;66552:3;:12;66530:85;;;66588:15;66599:3;66588:10;:15::i;:::-;66566:5;;;:::i;:::-;;;66530:85;;71927:251;29837:7;29864:6;30011:23;29864:6;5580:10;30011:23;30003:68;;;;;;;9265:2:1;30003:68:0;;;9247:21:1;;;9284:18;;;9277:30;9343:34;9323:18;;;9316:62;9395:18;;30003:68:0;9063:356:1;30003:68:0;72065:3:::1;72047:14;:21;;72002:130;;;::::0;::::1;::::0;;11085:2:1;72002:130:0::1;::::0;::::1;11067:21:1::0;11124:2;11104:18;;;11097:30;11163:34;11143:18;;;11136:62;11234:6;11214:18;;;11207:34;11258:19;;72002:130:0::1;10883:400:1::0;72002:130:0::1;72143:10;:27:::0;71927:251::o;30442:94::-;29837:7;29864:6;30011:23;29864:6;5580:10;30011:23;30003:68;;;;;;;9265:2:1;30003:68:0;;;9247:21:1;;;9284:18;;;9277:30;9343:34;9323:18;;;9316:62;9395:18;;30003:68:0;9063:356:1;30003:68:0;30507:21:::1;30525:1;30507:9;:21::i;:::-;30442:94::o:0;71790:129::-;71861:7;;;;71847:10;:21;71839:43;;;;;;;8578:2:1;71839:43:0;;;8560:21:1;8617:1;8597:18;;;8590:29;8655:11;8635:18;;;8628:39;8684:18;;71839:43:0;8376:332:1;71839:43:0;71893:7;:18;;;;;;;;;;;;;;;71790:129::o;68655:662::-;68705:21;68729:8;68738:4;68729:14;;;;;;;;:::i;:::-;;;;;;;;;68778;;;:8;:14;;;;;;68793:10;68778:26;;;;;;;68825:11;;68729:14;;;;;;;;-1:-1:-1;68817:37:0;;;;;;;8241:2:1;68817:37:0;;;8223:21:1;8280:1;8260:18;;;8253:29;8318:11;8298:18;;;8291:39;8347:18;;68817:37:0;8039:332:1;68817:37:0;68907:10;68867:25;68895:23;;;:11;;:23;:11;:23;;68931:16;68942:4;68931:10;:16::i;:::-;68960:20;68983:123;69090:4;:15;;;68983:88;69066:4;68983:64;69027:4;:19;;;68983:4;:25;;;:43;;:64;;;;:::i;:123::-;69137:15;;68960:146;;-1:-1:-1;69137:33:0;;68960:146;69137:19;:33::i;:::-;69119:51;;69217:19;;;;69201:11;;:46;;69242:4;;69201:36;;:15;:36::i;:46::-;69183:15;;;:64;69280:9;;:27;;69294:12;69280:13;:27::i;:::-;69268:9;:39;-1:-1:-1;;;;;68655:662:0:o;61441:23::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61441:23:0;:::o;69325:793::-;69398:4;69414:21;69438:8;69447:1;69438:11;;;;;;;;:::i;:::-;;;;;;;;;69484:18;;;;;:11;:18;;;:11;:18;;;69438:11;;;;;;;;-1:-1:-1;69513:13:0;69493:1;69513:10;:13::i;:::-;69541:11;;:15;69537:239;;69603:161;69619:5;69626:123;69733:4;:15;;;69626:88;69709:4;69626:64;69670:4;:19;;;69626:4;:25;;;:43;;:64;;;;:::i;69603:161::-;69800:11;;:24;;69816:7;69800:15;:24::i;:::-;69786:38;;;69869:19;;;;69853:46;;69894:4;;69853:36;;69786:38;69853:15;:36::i;:46::-;69835:15;;;:64;69912:12;;:124;;:12;;69964:10;69998:4;70018:7;69912:29;:124::i;:::-;70081:7;70069:9;;:19;;;;:::i;:::-;70057:9;:31;-1:-1:-1;70106:4:0;;-1:-1:-1;;69325:793:0;;;;;:::o;72486:712::-;72592:14;;:46;;;;;72530:14;;;;72590:63;;72648:4;;72592:14;;;;;:28;;:46;;72621:4;;72627:10;;72592:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72640:1;72591:51;;;;;;;;:::i;:::-;;;;;;;72590:57;;:63;;;;:::i;:::-;72568:85;;72674:15;72692:152;72810:8;72819:1;72810:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:19;:33;;;;;;;;:19;;;;;:31;;:33;;;;:11;;:33;;;;;:19;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72693:111;72758:8;72767:1;72758:11;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:19;:44;;;;;72796:4;72758:44;;;4531:74:1;;;;72758:19:0;;;:29;;4504:18:1;;72758:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72695:8;;72722;:11;;72694:57;;72749:1;;72695:8;;;;;:18;;72722:8;72695;;72722:11;;;;:::i;:::-;;;;;;;;;;;;;;:19;72695:48;;;;;;;;;;72722:19;;;;72695:48;;;4531:74:1;;;;4504:18;;72695:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;72692:152::-;72674:170;;72865:11;72879:51;72925:4;72880:39;72896:22;72908:9;;72896:7;:11;;:22;;;;:::i;:::-;72880:11;;:15;:39::i;72879:51::-;72865:65;;72948:9;72943:248;72961:13;:20;72959:22;;72943:248;;;73012:13;73026:1;73012:16;;;;;;;;:::i;:::-;;;;;;;;;73030:4;73012:23;;;;:::i;:::-;73007:3;:29;:63;;;;-1:-1:-1;73045:13:0;73059:3;:1;73061;73059:3;:::i;:::-;73045:18;;;;;;;;:::i;:::-;;;;;;;;;73065:4;73045:25;;;;:::i;:::-;73040:3;:30;;73007:63;73003:177;;;73107:57;73153:10;73108:39;73137:6;73144:1;73137:9;;;;;;;;:::i;:::-;;;;;;;;;73109:22;73121:9;;73109:7;:11;;:22;;;;:::i;73107:57::-;73098:66;;73091:73;;;;72486:712;:::o;73003:177::-;72983:3;;;;:::i;:::-;;;;72943:248;;;;72547:651;;;72486:712;:::o;61507:30::-;;;;;;;;;;;;73210:235;29837:7;29864:6;30011:23;29864:6;5580:10;30011:23;30003:68;;;;;;;9265:2:1;30003:68:0;;;9247:21:1;;;9284:18;;;9277:30;9343:34;9323:18;;;9316:62;9395:18;;30003:68:0;9063:356:1;30003:68:0;73298:17:::1;;73287:7;:28;;73279:56;;;::::0;::::1;::::0;;9626:2:1;73279:56:0::1;::::0;::::1;9608:21:1::0;9665:2;9645:18;;;9638:30;9704:17;9684:18;;;9677:45;9739:18;;73279:56:0::1;9424:339:1::0;73279:56:0::1;73386:7;73366:17;;:27;;;;:::i;:::-;73346:17;:47:::0;73404:3:::1;::::0;:29:::1;::::0;;;;73413:10:::1;73404:29;::::0;::::1;5193:74:1::0;5283:18;;;5276:34;;;73404:3:0::1;::::0;;::::1;::::0;:8:::1;::::0;5166:18:1;;73404:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;73210:235:::0;:::o;67839:808::-;67905:21;67929:8;67938:4;67929:14;;;;;;;;:::i;:::-;;;;;;;;;67978;;;:8;:14;;;;;;67993:10;67978:26;;;;;;;67929:14;;;;;;;;-1:-1:-1;68015:16:0;67987:4;68015:10;:16::i;:::-;68046:11;;:15;68042:244;;68108:166;68124:10;68136:123;68243:4;:15;;;68136:88;68219:4;68136:64;68180:4;:19;;;68136:4;:25;;;:43;;:64;;;;:::i;68108:166::-;68310:11;;:24;;68326:7;68310:15;:24::i;:::-;68296:38;;;68379:19;;;;68363:46;;68404:4;;68363:36;;68296:38;68363:15;:36::i;:46::-;68345:15;;;:64;68422:12;;:124;;:12;;68474:10;68508:4;68528:7;68422:29;:124::i;:::-;68571:4;68579:1;68571:9;68567:73;;;68621:7;68609:9;;:19;;;;:::i;30691:192::-;29837:7;29864:6;30011:23;29864:6;5580:10;30011:23;30003:68;;;;;;;9265:2:1;30003:68:0;;;9247:21:1;;;9284:18;;;9277:30;9343:34;9323:18;;;9316:62;9395:18;;30003:68:0;9063:356:1;30003:68:0;30780:22:::1;::::0;::::1;30772:73;;;::::0;::::1;::::0;;7834:2:1;30772:73:0::1;::::0;::::1;7816:21:1::0;7873:2;7853:18;;;7846:30;7912:34;7892:18;;;7885:62;7983:8;7963:18;;;7956:36;8009:19;;30772:73:0::1;7632:402:1::0;30772:73:0::1;30856:19;30866:8;30856:9;:19::i;:::-;30691:192:::0;:::o;65287:1072::-;65403:18;65449:21;65473:8;65482:4;65473:14;;;;;;;;:::i;:::-;;;;;;;;;65522;;;:8;:14;;;;;;:21;;;;;;;;;;;65473:14;;;;;;;65579:19;;;;65628:12;;:37;;;;;65659:4;65628:37;;;4531:74:1;;;;65473:14:0;;-1:-1:-1;65522:21:0;;65579:19;;65473:14;;65628:12;;:22;;4504:18:1;;65628:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65609:56;;65698:4;:24;;;65680:15;:42;:59;;;;-1:-1:-1;65726:13:0;;;65680:59;65676:564;;;65756:18;65777:45;65797:4;:24;;;65777:15;:19;;:45;;;;:::i;:::-;65756:66;;65837:17;65904:10;;65857:26;:57;;;;:::i;:::-;65837:77;;65929:17;65949:162;66106:4;65949:138;66077:9;65949:109;66042:15;;65949:74;66007:4;:15;;;65949:39;65978:9;;65949:10;:28;;:39;;;;:::i;:162::-;65929:182;-1:-1:-1;66143:85:0;66180:33;66204:8;66180:19;65929:182;66194:4;66180:13;:19::i;:33::-;66143:14;;:18;:85::i;:::-;66126:102;;65741:499;;;65676:564;66263:86;66323:4;:15;;;66263:41;66299:4;66263:31;66279:14;66263:4;:11;;;:15;;:31;;;;:::i;:86::-;66250:99;65287:1072;-1:-1:-1;;;;;;;65287:1072:0:o;34153:98::-;34211:7;34238:5;34242:1;34238;:5;:::i;:::-;34231:12;34153:98;-1:-1:-1;;;34153:98:0:o;33772:::-;33830:7;33857:5;33861:1;33857;:5;:::i;22001:167::-;22135:23;;;22081:4;17537:19;;;:12;;;:19;;;;;;:24;;22105:55;17440:129;21429:152;21499:4;21523:50;21528:3;21548:23;;;21523:4;:50::i;34510:98::-;34568:7;34595:5;34599:1;34595;:5;:::i;34909:98::-;34967:7;34994:5;34998:1;34994;:5;:::i;71433:301::-;71525:8;;:33;;;;;71552:4;71525:33;;;4531:74:1;71508:14:0;;71525:8;;;:18;;4504::1;;71525:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71508:50;;71583:6;71573:7;:16;71569:158;;;71606:8;;71640:9;;71606:8;;;;;:17;;71624:3;;71629:21;;:6;;:10;:21::i;:::-;71606:45;;;;;;;;;;5223:42:1;5211:55;;;71606:45:0;;;5193:74:1;5283:18;;;5276:34;5166:18;;71606:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;71569:158::-;71684:8;;:31;;;;;:8;5211:55:1;;;71684:31:0;;;5193:74:1;5283:18;;;5276:34;;;71684:8:0;;;;:17;;5166:18:1;;71684:31:0;5019:297:1;56997:401:0;57185:48;;;57151:19;5211:55:1;;;57185:48:0;;;5193:74:1;5283:18;;;;5276:34;;;57185:48:0;;;;;;;;;;5166:18:1;;;;57185:48:0;;;;;;;;;57208:12;57185:48;;;57151:93;;-1:-1:-1;;;;57151:19:0;;;;:93;;57185:48;57151:93;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57115:129;;;;57277:7;:57;;;;-1:-1:-1;57289:11:0;;:16;;:44;;;57320:4;57309:24;;;;;;;;;;;;:::i;:::-;57255:135;;;;;;;7477:2:1;57255:135:0;;;7459:21:1;7516:2;7496:18;;;7489:30;7555;7535:18;;;7528:58;7603:18;;57255:135:0;7275:352:1;30891:173:0;30947:16;30966:6;;;30983:17;;;;;;;;;;31016:40;;30966:6;;;;;;;31016:40;;30947:16;31016:40;30936:128;30891:173;:::o;57721:443::-;57936:59;;;57902:19;4897:15:1;;;57936:59:0;;;4879:34:1;4949:15;;;4929:18;;;4922:43;4981:18;;;;4974:34;;;57936:59:0;;;;;;;;;;4791:18:1;;;;57936:59:0;;;;;;;;;57959:17;57936:59;;;57902:104;;-1:-1:-1;;;;57902:19:0;;;;:104;;57936:59;57902:104;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57866:140;;;;58039:7;:57;;;;-1:-1:-1;58051:11:0;;:16;;:44;;;58082:4;58071:24;;;;;;;;;;;;:::i;:::-;58017:139;;;;;;;10724:2:1;58017:139:0;;;10706:21:1;;;10743:18;;;10736:30;10802:34;10782:18;;;10775:62;10854:18;;58017:139:0;10522:356:1;58017:139:0;57855:309;;57721:443;;;;:::o;15344:414::-;15407:4;17537:19;;;:12;;;:19;;;;;;15424:327;;-1:-1:-1;15467:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;15650:18;;15628:19;;;:12;;;:19;;;;;;:40;;;;15683:11;;15424:327;-1:-1:-1;15734:5:0;15727:12;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:247:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:315::-;334:6;342;395:2;383:9;374:7;370:23;366:32;363:52;;;411:1;408;401:12;363:52;450:9;437:23;469:31;494:5;469:31;:::i;:::-;519:5;571:2;556:18;;;;543:32;;-1:-1:-1;;;266:315:1:o;586:902::-;670:6;701:2;744;732:9;723:7;719:23;715:32;712:52;;;760:1;757;750:12;712:52;800:9;787:23;833:18;825:6;822:30;819:50;;;865:1;862;855:12;819:50;888:22;;941:4;933:13;;929:27;-1:-1:-1;919:55:1;;970:1;967;960:12;919:55;1006:2;993:16;1029:60;1045:43;1085:2;1045:43;:::i;:::-;1029:60;:::i;:::-;1111:3;1135:2;1130:3;1123:15;1163:2;1158:3;1154:12;1147:19;;1194:2;1190;1186:11;1242:7;1237:2;1231;1228:1;1224:10;1220:2;1216:19;1212:28;1209:41;1206:61;;;1263:1;1260;1253:12;1206:61;1285:1;1276:10;;1295:163;1309:2;1306:1;1303:9;1295:163;;;1366:17;;1354:30;;1327:1;1320:9;;;;;1404:12;;;;1436;;1295:163;;;-1:-1:-1;1477:5:1;586:902;-1:-1:-1;;;;;;;586:902:1:o;1493:892::-;1588:6;1619:2;1662;1650:9;1641:7;1637:23;1633:32;1630:52;;;1678:1;1675;1668:12;1630:52;1711:9;1705:16;1744:18;1736:6;1733:30;1730:50;;;1776:1;1773;1766:12;1730:50;1799:22;;1852:4;1844:13;;1840:27;-1:-1:-1;1830:55:1;;1881:1;1878;1871:12;1830:55;1910:2;1904:9;1933:60;1949:43;1989:2;1949:43;:::i;1933:60::-;2015:3;2039:2;2034:3;2027:15;2067:2;2062:3;2058:12;2051:19;;2098:2;2094;2090:11;2146:7;2141:2;2135;2132:1;2128:10;2124:2;2120:19;2116:28;2113:41;2110:61;;;2167:1;2164;2157:12;2110:61;2189:1;2180:10;;2199:156;2213:2;2210:1;2207:9;2199:156;;;2270:10;;2258:23;;2231:1;2224:9;;;;;2301:12;;;;2333;;2199:156;;2390:277;2457:6;2510:2;2498:9;2489:7;2485:23;2481:32;2478:52;;;2526:1;2523;2516:12;2478:52;2558:9;2552:16;2611:5;2604:13;2597:21;2590:5;2587:32;2577:60;;2633:1;2630;2623:12;2672:180;2731:6;2784:2;2772:9;2763:7;2759:23;2755:32;2752:52;;;2800:1;2797;2790:12;2752:52;-1:-1:-1;2823:23:1;;2672:180;-1:-1:-1;2672:180:1:o;2857:184::-;2927:6;2980:2;2968:9;2959:7;2955:23;2951:32;2948:52;;;2996:1;2993;2986:12;2948:52;-1:-1:-1;3019:16:1;;2857:184;-1:-1:-1;2857:184:1:o;3046:315::-;3114:6;3122;3175:2;3163:9;3154:7;3150:23;3146:32;3143:52;;;3191:1;3188;3181:12;3143:52;3227:9;3214:23;3204:33;;3287:2;3276:9;3272:18;3259:32;3300:31;3325:5;3300:31;:::i;:::-;3350:5;3340:15;;;3046:315;;;;;:::o;3701:248::-;3769:6;3777;3830:2;3818:9;3809:7;3805:23;3801:32;3798:52;;;3846:1;3843;3836:12;3798:52;-1:-1:-1;;3869:23:1;;;3939:2;3924:18;;;3911:32;;-1:-1:-1;3701:248:1:o;3954:426::-;4083:3;4121:6;4115:13;4146:1;4156:129;4170:6;4167:1;4164:13;4156:129;;;4268:4;4252:14;;;4248:25;;4242:32;4229:11;;;4222:53;4185:12;4156:129;;;4303:6;4300:1;4297:13;4294:48;;;4338:1;4329:6;4324:3;4320:16;4313:27;4294:48;-1:-1:-1;4358:16:1;;;;;3954:426;-1:-1:-1;;3954:426:1:o;6469:801::-;6662:4;6710:2;6699:9;6695:18;6740:6;6729:9;6722:25;6766:2;6804;6799;6788:9;6784:18;6777:30;6827:6;6862;6856:13;6893:6;6885;6878:22;6931:2;6920:9;6916:18;6909:25;;6953:6;6950:1;6943:17;6996:2;6993:1;6983:16;6969:30;;7017:1;7027:217;7041:6;7038:1;7035:13;7027:217;;;7106:13;;7121:42;7102:62;7090:75;;7232:1;7220:14;;;;7185:12;;;;7056:9;7027:217;;;-1:-1:-1;7261:3:1;;6469:801;-1:-1:-1;;;;;;;6469:801:1:o;11723:334::-;11794:2;11788:9;11850:2;11840:13;;11855:66;11836:86;11824:99;;11953:18;11938:34;;11974:22;;;11935:62;11932:88;;;12000:18;;:::i;:::-;12036:2;12029:22;11723:334;;-1:-1:-1;11723:334:1:o;12062:183::-;12122:4;12155:18;12147:6;12144:30;12141:56;;;12177:18;;:::i;:::-;-1:-1:-1;12222:1:1;12218:14;12234:4;12214:25;;12062:183::o;12250:128::-;12290:3;12321:1;12317:6;12314:1;12311:13;12308:39;;;12327:18;;:::i;:::-;-1:-1:-1;12363:9:1;;12250:128::o;12383:274::-;12423:1;12449;12439:189;;12484:77;12481:1;12474:88;12585:4;12582:1;12575:15;12613:4;12610:1;12603:15;12439:189;-1:-1:-1;12642:9:1;;12383:274::o;12662:228::-;12702:7;12828:1;12760:66;12756:74;12753:1;12750:81;12745:1;12738:9;12731:17;12727:105;12724:131;;;12835:18;;:::i;:::-;-1:-1:-1;12875:9:1;;12662:228::o;12895:125::-;12935:4;12963:1;12960;12957:8;12954:34;;;12968:18;;:::i;:::-;-1:-1:-1;13005:9:1;;12895:125::o;13025:195::-;13064:3;13095:66;13088:5;13085:77;13082:103;;;13165:18;;:::i;:::-;-1:-1:-1;13212:1:1;13201:13;;13025:195::o;13225:184::-;13277:77;13274:1;13267:88;13374:4;13371:1;13364:15;13398:4;13395:1;13388:15;13414:184;13466:77;13463:1;13456:88;13563:4;13560:1;13553:15;13587:4;13584:1;13577:15;13603:184;13655:77;13652:1;13645:88;13752:4;13749:1;13742:15;13776:4;13773:1;13766:15;13792:154;13878:42;13871:5;13867:54;13860:5;13857:65;13847:93;;13936:1;13933;13926:12
Swarm Source
ipfs://e421cac999dfcdbbe34053bcf2edfe7d29eda71b923839fdc31c294eac57b7df
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.