Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
100,000,000 MCGA
Holders
138
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.000000000008307307 MCGAValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
StarBaseNoLockerERC20
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-05-21 */ //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@&%&@&&&&@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&&&&&&&&&&&&&&&&&&&&&&@@@@&&@@&&@@@&&&&&&&#/(&%##&@&&&&&&&&@@@&&&&&&@@@@&&&&&&&&&&&&&&&&&& //&&&&&&&&&&&&&&@@@@@@@@@@@@@@@&&&%%%&&&&&&%/*(&%(/#&&&&&&&&&&&@@@@@@@@@@@@&&&@@&&&&&&&&&&&& //&&&&&&&&&&&&&@@@@@@@@@@@@@&&%%%%%%%&&&&@&#,,(&%(*(%@&&&%%%%%%%%&&@@@@@@@@@@@@&&&&&&&&&&&&& //&&&&&&&&&&@&&@@@@@@@@@@&&%###%%%%&&@@@@@&(.,(&%(**%@@@@&&&%%%%%%#%%&@@@@@@@@@&&&&&&&&&&&&& //&&&&&&&&&&&&&@@@@@@@@@#//#%%%%&@@@@@@@@@%* ,(&%(*,(@@@@@&&&&&&%%%%#/(&@@@&@@@&&&&&&&&&&&&& //&&&&&&&&&&&&@@@@@@@&%*,/#%%&&@@@@@@@@@@@#, ,(&&#*.(&@@@@@@@@@@@&%%%#/*#&@@@&@@@&&&&&&&&&&& //&&&&&&&&&&&@@@@@@@@(,,(%%%&@@@@@@@@@@@@@#. ,(&&#*./%@@@@@@@@@@@@&&%%%/,/%@@&@&&&&&&&&&&&&& //&&&&&&&&&&&&@@@@@@(,,(%%%&@@@@@@@@@@@@@@(. ,(&&#*.*%@@&@@@@@@@@@@&%&&%/*/&@@@&&&&&&&&&&&&& //&&&&&&&&&&&&@@@@&%,,(&%%&@@@@@@@@@@@@@@&/../#&&%/.*%@@@@@@@@@@&@@@&%%&%/.(&@@@@&&&&&&&&&&& //&&&&&&&&&&&@&&@@%*.*(%%&@@@@@@@@@@@@@@@%/.*/#&&%/.,(@@@@@@@&&&&&&@@&&&%(,,#@&@&&&&&&&&&&&& //&&&&&&&&&&&&&@&@#,,/%%%&@@@@@@@@@@@@@@@#*.#%%&&#/.,(&@@@@@@&&&&&&@@&&%%#*./&@@&&&&&&&&&&&& //&&&&&&&&&&&@@@&&#..(&%%&@@@@@@@@@@@@@&%#* /%&@%/.*(%&@@@@@@@@@@@&&&%%&#* /%@&&&&&&&&&&&&& //&&&&&&&&&&&@@@@&#.,/%%%&@@@@@@@@@@@@&%%%(..*#%%&&,*#&%&@@@@@@@@@@@@&&%%#*./%@&&&&&&&&&&&&& //&&&&&&&&&&&@&&@@#. .*#%&@@@@@@@@@@@@%%%%(,,/#&&%#,/#&%%&@@@@&&&@@&@&&%(, .(&@@&&&&&&&&&&&& //&&&&&&&&&&&&&&@@%/,,*/#%@@@@@@@&@@@%%%%%(..*#&%#*.*#&%#%&@&&@@@@@@&%#(/***#@@@&&&&&&&&&&&& //&&&&&&&&&&&@@@@@&%*,,*#%&@@@@@@@@@&##%%%(*,*(##/*,/#%%##&&@@&@@&&&&%#(*,,(&@&&&&&&&&&&&&&& //&&&&&&&&&&&&&@&@@@#/**(%&%&@@@@@@&%##%##(/,*/(//**(######&@&&&@&&%%%#(((#&@@&@@&&&&&&&&&&& //&&&&&&&&&&&@@@&@@@@%(*/(#%%&&&@@&%(%%####(**///***(%%##%##&@@@@&%%%####%&@@@@@@&&&&&&&&&&& //&&&&&&&&&&&@&&&@@@@@&#**(%%%%%&@%##%&&&%#(****/*,/#%&&&%%##&&&%%&&%%%%&&@@@@@@&&&&&&&&&&&& //&&&&&&&&&&&&&@@@@&@@@@&(,*(%%%%%%%%&&&%##((//(((/((#&&&&&&%%&&&&&%%%&@@@&@@@&&&&&&&&&&&&&& //&&&&&&&&&&&&@@@@@&@@&@@@&(/(%%&&%%%%%%##%%((###((%%##%&%%%&&&&&&%%&@@@@@@@@@@&&&&&&&&&&&&& //&&&&&&&&&&&&&&@@@@@@@@@@@@@&###%&&&&&%%%%%#%%#####%%%%%&&&&&&&&&@@@@@@@@@@@@@@&&&&&&&&&&&& //&&&&&&&&&&&@@@&@@@&#(%&@@@@@&@@&&&&&&%%%%&&&%(%&&&%%%%&&&&&&&@@@@@@@@&%&@@@@&&&&&&&&&&&&&& //&&&&&&&&&&&&&&@@&&/,*%(/(%&&@@@@&&@&&&&%&&%%%%%%%&&&&&&@@@@@@@@@&%/##(.,#&@@@&&&&&&&&&&&&& //&&&&&&&&&&&&@@&@@@%#%#/(%**/%((%&&&&@@@@@@@@@&@@@&&@&&@@&&&####*/#/*/%##%&&&@@&&&&&&&&&&&& //&&&&&&&&&&&&&@@&&@&&&@@&(*/(*,*%**/#/*(###((%@&%(&@%//(#,,/(,*#/**%&&@@@&&@@&&&&&&&&&&&&&& //&&&&&&&&&&&&&&&&&&&&@&@&&&&&@&&%*/(/,,(//(,/#@&#*%@&(,,(/#&%%%&@@@&&&@@&&&@&&&&&&&&&&&&&&& //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&@&@&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@ @@ // @@ This token was launched using StarBase. To learn more or to launch @@ // @@ your own token, visit: https://starbase.services @@ // @@ @@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ /** Make China Great Again */ //Telegram: https://t.me/MCGAETH // Website: MCGAETH.COM //Twitter: https://x.com/mcgatoken // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; interface IERCBurn { function burn(uint256 _amount) external; function approve(address spender, uint256 amount) external returns (bool); function allowance(address owner, address spender) external returns (uint256); function balanceOf(address account) external view returns (uint256); } // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } 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 is the index of the value in the `values` array plus 1. // Position 0 is used to mean a value is not in the set. mapping(bytes32 value => uint256) _positions; } /** * @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._positions[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 cache the value's position to prevent multiple reads from the same storage slot uint256 position = set._positions[value]; if (position != 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 valueIndex = position - 1; uint256 lastIndex = set._values.length - 1; if (valueIndex != lastIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the lastValue to the index where the value to delete is set._values[valueIndex] = lastValue; // Update the tracked position of the lastValue (that was just moved) set._positions[lastValue] = position; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the tracked position for the deleted slot delete set._positions[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._positions[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) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // 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 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; /// @solidity memory-safe-assembly 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 in 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; /// @solidity memory-safe-assembly assembly { result := store } return result; } } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Locker { struct UserInfo { EnumerableSet.AddressSet lockedTokens; // records all tokens the user has locked mapping(address => uint256[]) locksForToken; // map erc20 address to lock id for that token } struct TokenLock { uint256 lockDate; // the date the token was locked uint256 amount; // the amount of tokens still locked (initialAmount minus withdrawls) uint256 initialAmount; // the initial lock amount uint256 unlockDate; // the date the token can be withdrawn uint256 lockID; // lockID nonce per uni pair address owner; } struct FeeStruct { uint256 ethFee; // Small eth fee to prevent spam on the platform IERCBurn secondaryFeeToken; // UNCX or UNCL uint256 secondaryTokenFee; // optional, UNCX or UNCL uint256 secondaryTokenDiscount; // discount on liquidity fee for burning secondaryToken uint256 liquidityFee; // fee on univ2 liquidity tokens uint256 referralPercent; // fee for referrals IERCBurn referralToken; // token the refferer must hold to qualify as a referrer uint256 referralHold; // balance the referrer must hold to qualify as a referrer uint256 referralDiscount; // discount on flatrate fees for using a valid referral address } function setDev(address payable _devaddr) external; function setSecondaryFeeToken(address _secondaryFeeToken) external; /** * @notice referrers need to hold the specified token and hold amount to be elegible for referral fees */ function setReferralTokenAndHold( IERCBurn _referralToken, uint256 _hold ) external; function setFees( uint256 _referralPercent, uint256 _referralDiscount, uint256 _ethFee, uint256 _secondaryTokenFee, uint256 _secondaryTokenDiscount, uint256 _liquidityFee ) external; /** * @notice whitelisted accounts dont pay flatrate fees on locking */ function whitelistFeeAccount(address _user, bool _add) external; /** * @notice Creates a new lock * @param _lpToken the univ2 token address * @param _amount amount of LP tokens to lock * @param _unlock_date the unix timestamp (in seconds) until unlock * @param _referral the referrer address if any or address(0) for none * @param _fee_in_eth fees can be paid in eth or in a secondary token such as UNCX with a discount on univ2 tokens * @param _withdrawer the user who can withdraw liquidity once the lock expires. */ function lockLPToken( address _lpToken, uint256 _amount, uint256 _unlock_date, address payable _referral, bool _fee_in_eth, address payable _withdrawer ) external payable; /** * @notice extend a lock with a new unlock date, _index and _lockID ensure the correct lock is changed * this prevents errors when a user performs multiple tx per block possibly with varying gas prices */ function relock( address _lpToken, uint256 _index, uint256 _lockID, uint256 _unlock_date ) external; /** * @notice withdraw a specified amount from a lock. _index and _lockID ensure the correct lock is changed * this prevents errors when a user performs multiple tx per block possibly with varying gas prices */ function withdraw( address _lpToken, uint256 _index, uint256 _lockID, uint256 _amount ) external; /** * @notice increase the amount of tokens per a specific lock, this is preferable to creating a new lock, less fees, and faster loading on our live block explorer */ function incrementLock( address _lpToken, uint256 _index, uint256 _lockID, uint256 _amount ) external; /** * @notice split a lock into two seperate locks, useful when a lock is about to expire and youd like to relock a portion * and withdraw a smaller portion */ function splitLock( address _lpToken, uint256 _index, uint256 _lockID, uint256 _amount ) external payable; /** * @notice transfer a lock to a new owner, e.g. presale project -> project owner */ function transferLockOwnership( address _lpToken, uint256 _index, uint256 _lockID, address payable _newOwner ) external; /** * @notice migrates liquidity to uniswap v3 */ function migrate( address _lpToken, uint256 _index, uint256 _lockID, uint256 _amount ) external; function getNumLocksForToken( address _lpToken ) external view returns (uint256); function getNumLockedTokens() external view returns (uint256); function getLockedTokenAtIndex( uint256 _index ) external view returns (address); // user functions function getUserNumLockedTokens( address _user ) external view returns (uint256); function getUserLockedTokenAtIndex( address _user, uint256 _index ) external view returns (address); function getUserNumLocksForToken( address _user, address _lpToken ) external view returns (uint256); function getUserLockForTokenAtIndex( address _user, address _lpToken, uint256 _index ) external view returns (uint256, uint256, uint256, uint256, uint256, address); // whitelist function getWhitelistedUsersLength() external view returns (uint256); function getWhitelistedUserAtIndex( uint256 _index ) external view returns (address); function getUserWhitelistStatus(address _user) external view returns (bool); } 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; } interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } 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); } interface IAgoraERC20Config { /** * @dev information used to construct the token. */ struct TokenConstructorParameters { bytes baseParameters; bytes taxParameters; bytes tokenLPInfo; } /** * @dev Basic info of the token */ struct TokenInfoParameters { string name; string symbol; bool autoCreateLiquidity; uint256 maxSupply; address tokensRecepient; uint256 maxTokensWallet; bool payInTax; bool protectLiquidity; } /** * @dev This struct express the taxes on per 1000, to allow percetanges between 0 and 1. */ struct TaxParameters { uint256 buyTax; uint256 sellTax; uint256 lpBuyTax; uint256 lpSellTax; uint256 maxTxBuy; uint256 maxTxSell; address taxSwapRecepient; } /** * @dev Liquidity pool supply information */ struct TokenLpInfo { uint256 lpTokensupply; uint256 ethForSupply; bool burnLP; uint256 lockFee; uint256 lpLockUpInDays; } } interface IAgoraERC20 is IAgoraERC20Config, IERC20, IERC20Metadata { function addLiquidity() external payable returns (address); event LiquidityLocked(uint256 lpTokens, uint256 daysLocked); event TaxChanged( uint256 previousBuyTax, uint256 previousSellTax, uint256 newBuyTax, uint256 newSellTax ); event LPTaxChanged( uint256 previousBuyTax, uint256 previousSellTax, uint256 newBuyTax, uint256 newSellTax ); event LiquidityAdded( uint256 tokensSupplied, uint256 ethSupplied, uint256 lpTokensIssued ); event LimitsRaised( uint128 oldBuyLimit, uint128 oldSellLimit, uint128 oldMaxWallet, uint128 newBuyLimit, uint128 newSellLimit, uint128 newMaxWallet ); event LiquidityBurned(uint256 liquidityBurned); event LiquiditySupplied(uint256 tokens, uint256 eth); event ExternalCallError(uint256); } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Revertible { function _revert(bytes4 errorSelector) internal pure { assembly { mstore(0x00, errorSelector) revert(0x00, 0x04) } } } interface IAgoraErrors { error NotEnoughBalance(); error CallerIsNotTheOwner(); error CannotSetNewOwnerToTheZeroAddress(); error TaxesCanNotBeRaised(); error ApproveFromTheZeroAddress(); error ApproveToTheZeroAddress(); error OperationNotAllowed(); error BurnFromTheZeroAddress(); error BurnExceedsBalance(); error MintToZeroAddress(); error LpTokensExceedsTotalSupply(); error TooFewLPTokens(); error LPAlreadyCreated(); error NotEnoughFundsForLP(); error HardCapIsTooHigh(); error LPNotInit(); error TransactionIsTooBig(); error LimitsLoweringIsNotAllowed(); error MaxWalletExceeded(); error InsufficientAllowance(); } abstract contract Ownable is Revertible, Context, IAgoraErrors { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { _revert(CallerIsNotTheOwner.selector); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { _revert(CannotSetNewOwnerToTheZeroAddress.selector); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract StarBaseAbstractERC20 is IAgoraERC20, Ownable { bytes32 public constant x_ID_HASH = 0xb07887f9e6857c947639357c810260e93a866b112197fa793b96ffe10082a244; using EnumerableSet for EnumerableSet.AddressSet; using EnumerableSet for EnumerableSet.Bytes32Set; /** @dev {_balances} Addresses balances */ mapping(address => uint256) internal _balances; /** @dev {_allowances} Addresses allocance details */ mapping(address => mapping(address => uint256)) private _allowances; /** @dev {_unlimited} Enumerable set for addresses where limits do not apply */ EnumerableSet.AddressSet internal _excludedFromLimits; // Config IUniswapV2Router02 internal immutable _uniswapRouter; uint256 internal constant MAX_SWAP_THRESHOLD_MULTIPLE = 20; uint256 internal constant CALL_GAS_LIMIT = 50000; address public immutable factory; address public immutable startShipVault; address public taxRecipient; string private _name; string private _symbol; uint128 private _totalSupply; // Tax bool private _hasTax; uint16 public buyTax; uint16 public sellTax; bool private _hasLPTax; uint16 public buyLPTax; uint16 public sellLPTax; uint128 public accumulatedTax; uint128 public starShipAccumulatedTax; uint128 public lpAccumulatedTax; bool public autoConversion; uint16 public starShipTaxPoints = 5; bool public shouldPayInTax; // Liquidty info uint32 public lpCreatedDate; address public pairAddress; bool public burnLiquidity; bool internal _IsInConversion; uint16 public pctForSwap; // Per thousands uint128 public tokensThreshHoldForSwap; uint128 public lockFee; uint256 public liquidityLockedInDays; uint128 public initialLiquidityFunds; uint256 public lockedUntil; // Caps uint128 public buyMaxTx; uint128 public sellMaxTx; uint128 public maxWallet; modifier onlyFactoryOrOwner() { if (msg.sender != factory && msg.sender != owner()) { _revert(OperationNotAllowed.selector); } _; } constructor( address[5] memory addresses_, bytes memory tokenInfo_, bytes memory taxesInfo_, bytes memory lpInfo_ ) { pctForSwap = 5; transferOwnership(addresses_[0]); _uniswapRouter = IUniswapV2Router02(addresses_[1]); factory = addresses_[3]; startShipVault = addresses_[4]; TokenInfoParameters memory tokenParameters = abi.decode( tokenInfo_, (TokenInfoParameters) ); _name = tokenParameters.name; _symbol = tokenParameters.symbol; shouldPayInTax = tokenParameters.payInTax; tokensThreshHoldForSwap = tokensThreshHoldForSwap; if (type(uint128).max < tokenParameters.maxTokensWallet) { _revert(HardCapIsTooHigh.selector); } maxWallet = uint128(tokenParameters.maxTokensWallet); TaxParameters memory taxParams = abi.decode(taxesInfo_, (TaxParameters)); _processLimits(taxParams); taxRecipient = taxParams.taxSwapRecepient; TokenLpInfo memory tokenLpInfo = abi.decode(lpInfo_, (TokenLpInfo)); _processSupply(tokenParameters, tokenLpInfo); burnLiquidity = tokenLpInfo.burnLP; lockFee = uint128(tokenLpInfo.lockFee); liquidityLockedInDays = tokenLpInfo.lpLockUpInDays; initialLiquidityFunds = uint128(tokenLpInfo.ethForSupply); _excludedFromLimits.add(address(_uniswapRouter)); pairAddress = IUniswapV2Factory(_uniswapRouter.factory()).createPair( address(this), _uniswapRouter.WETH() ); _excludedFromLimits.add(pairAddress); _excludedFromLimits.add(address(this)); _excludedFromLimits.add(address(0)); _excludedFromLimits.add(owner()); _approve(address(this), address(_uniswapRouter), type(uint256).max); _approve(address(this), pairAddress, type(uint256).max); } // ########################################### // ERC 20 INTERFACE IMPLEMENTATION // ########################################### /** @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 { if (account == address(0)) { _revert(MintToZeroAddress.selector); } _beforeTokenTransfer(address(0), account, amount); _totalSupply += uint128(amount); unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, 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 Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256) { return _totalSupply; } /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256) { return _balances[account]; } /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from_, address to_, uint256 amount_ ) external returns (bool) { // Approvals _safeGuardAllowance(from_, _msgSender(), amount_); return _transfer(from_, to_, amount_); } /** * @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 {} /** * @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) { return _allowances[owner][spender]; } /** * @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) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @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 { if (owner == address(0)) { _revert(ApproveFromTheZeroAddress.selector); } if (spender == address(0)) { _revert(ApproveToTheZeroAddress.selector); } _allowances[owner][spender] = amount; emit Approval(owner, spender, 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 { if (account == address(0)) { _revert(BurnFromTheZeroAddress.selector); } _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; if (accountBalance < amount) { _revert(BurnExceedsBalance.selector); } unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= uint128(amount); } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Destroys a `value` amount of tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 value) public virtual { _burn(_msgSender(), value); } /** * @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 default value returned by this function, unless * it's 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 returns (uint8) { return 18; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal returns (bool) { _safeGuardTransfer(from, to, amount); uint128 realAmount = _applyTaxes(from, to, amount); _swapTaxes(from, to); unchecked { _balances[from] -= amount; _balances[to] += realAmount; } emit Transfer(from, to, realAmount); return true; } /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool) { return _transfer(msg.sender, to, amount); } function _applyTaxes( address from_, address to_, uint256 amount_ ) internal returns (uint128) { uint128 taxedAmount = uint128(amount_); uint128 taxAmount = 0; uint128 starshipTax = 0; uint128 lpTax = 0; if (_shouldApplyTax() && !_IsInConversion) { if (from_ == pairAddress && !_excludedFromLimits.contains(to_)) { if (buyTax > 0) { taxAmount = (taxedAmount * buyTax) / 1000; } if (shouldPayInTax) { starshipTax = (taxedAmount * starShipTaxPoints) / 1000; starShipAccumulatedTax += starshipTax; } if (_hasLPTax && buyLPTax > 0) { lpTax += (taxedAmount * buyLPTax) / 1000; lpAccumulatedTax += lpTax; } } else if ( to_ == pairAddress && !_excludedFromLimits.contains(from_) ) { if (sellTax > 0) { taxAmount = (taxedAmount * sellTax) / 1000; } if (shouldPayInTax) { starshipTax = (taxedAmount * starShipTaxPoints) / 1000; starShipAccumulatedTax += starshipTax; } if (_hasLPTax && sellLPTax > 0) { lpTax += (taxedAmount * sellLPTax) / 1000; lpAccumulatedTax += lpTax; } } if (taxAmount > 0 || starshipTax > 0 || lpTax > 0) { unchecked { accumulatedTax += taxAmount; _balances[address(this)] += taxAmount + starshipTax + lpTax; } emit Transfer( from_, address(this), taxAmount + starshipTax + lpTax ); } } return taxedAmount - starshipTax - taxAmount - lpTax; } function _shouldApplyTax() internal view returns (bool) { return _hasTax || shouldPayInTax || _hasLPTax; } function _buyTax() internal view returns (uint16) { return shouldPayInTax ? buyTax + starShipTaxPoints : buyTax; } function _sellTax() internal view returns (uint16) { return shouldPayInTax ? sellTax + starShipTaxPoints : sellTax; } /** * Reads and stores the relevant information about the taxes. * @param taxParams_ Tax configuration */ function _processLimits(TaxParameters memory taxParams_) internal { if ( type(uint128).max < taxParams_.maxTxSell || type(uint128).max < taxParams_.maxTxBuy ) { _revert(HardCapIsTooHigh.selector); } buyMaxTx = uint128(taxParams_.maxTxBuy); sellMaxTx = uint128(taxParams_.maxTxSell); if (taxParams_.buyTax == 0 && taxParams_.sellTax == 0) { _hasTax = false; } else { _hasTax = true; buyTax = uint16(taxParams_.buyTax); sellTax = uint16(taxParams_.sellTax); } if (taxParams_.lpBuyTax == 0 && taxParams_.lpSellTax == 0) { _hasLPTax = false; } else { _hasLPTax = true; buyLPTax = uint16(taxParams_.lpBuyTax); sellLPTax = uint16(taxParams_.lpSellTax); } } function _processSupply( TokenInfoParameters memory tokenParameters_, TokenLpInfo memory tokenLpInfo_ ) internal virtual; /** * @dev Safeguard method to withdraw all the remaining eth to the project address * */ function withdrawNative() external { _transferNative(address(this).balance, taxRecipient); } function withdrawERC20() external { this.transferFrom( address(this), taxRecipient, this.balanceOf(address(this)) ); } function _transferNative( uint256 amount, address to ) internal returns (bool) { uint256 gas = (CALL_GAS_LIMIT == 0 || CALL_GAS_LIMIT > gasleft()) ? gasleft() : CALL_GAS_LIMIT; (bool success, ) = to.call{value: amount, gas: gas}(""); return success; } function toggleConversion() external onlyOwner { autoConversion = !autoConversion; } /** * @dev Function to change the buy and sell tax for marketing * @param newBuyTax_ New buy tax in per thousand * @param newSellTax_ New sell tax in per thousand */ function changeTaxes( uint256 newBuyTax_, uint256 newSellTax_, uint256 newBuyLPTax_, uint256 newSellLPTax_ ) external onlyOwner { uint16 oldBuyTax = buyTax; uint16 oldSellTax = sellTax; buyTax = uint16(newBuyTax_); sellTax = uint16(newSellTax_); _hasTax = buyTax > 0 && sellTax > 0; emit TaxChanged(oldBuyTax, oldSellTax, buyTax, sellTax); oldBuyTax = buyLPTax; oldSellTax = sellLPTax; buyLPTax = uint16(newBuyLPTax_); sellLPTax = uint16(newSellLPTax_); _hasLPTax = buyLPTax > 0 && sellLPTax > 0; emit LPTaxChanged(oldBuyTax, oldSellTax, buyLPTax, sellLPTax); } function _safeGuardTransfer( address from_, address to_, uint256 amount_ ) internal view virtual { uint256 fromBalance = _balances[from_]; if (fromBalance < amount_) { _revert(NotEnoughBalance.selector); } if ( buyMaxTx > 0 && from_ == pairAddress && !_excludedFromLimits.contains(to_) && amount_ > buyMaxTx ) { _revert(TransactionIsTooBig.selector); } if ( sellMaxTx > 0 && to_ == pairAddress && !_excludedFromLimits.contains(from_) && amount_ > sellMaxTx ) { _revert(TransactionIsTooBig.selector); } uint256 toBalance = _balances[to_]; if ( maxWallet > 0 && maxWallet < toBalance + amount_ && !_excludedFromLimits.contains(to_) ) { _revert(MaxWalletExceeded.selector); } } function changeTransactionHardCaps( uint256 newBuyMaxTx_, uint256 newSellMaxTx_, uint256 newMaxWallet_ ) external onlyOwner { if ( newBuyMaxTx_ < buyMaxTx || newSellMaxTx_ < sellMaxTx || newMaxWallet_ < maxWallet ) { _revert(LimitsLoweringIsNotAllowed.selector); } uint128 oldMaxWallet = maxWallet; uint128 oldMaxSellTx = sellMaxTx; uint128 oldMaxBuyTx = buyMaxTx; buyMaxTx = uint128(newBuyMaxTx_); sellMaxTx = uint128(newSellMaxTx_); maxWallet = uint128(newMaxWallet_); emit LimitsRaised( oldMaxBuyTx, oldMaxSellTx, oldMaxWallet, buyMaxTx, sellMaxTx, maxWallet ); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _safeGuardAllowance( address owner_, address spender_, uint256 amount_ ) internal virtual { uint256 currentAllowance = this.allowance(owner_, spender_); if (currentAllowance != type(uint256).max) { if (currentAllowance < amount_) { _revert(InsufficientAllowance.selector); } unchecked { _approve(owner_, spender_, currentAllowance - amount_); } } } receive() external payable {} function _swapTaxes(address from_, address to_) internal { if (_shouldApplyTax() && autoConversion) { uint256 swapBalance = accumulatedTax + starShipAccumulatedTax + lpAccumulatedTax; uint256 swapThresholdInTokens = (_totalSupply * pctForSwap) / 1000; if ( swapBalance >= swapThresholdInTokens && !_IsInConversion && from_ != pairAddress && from_ != address(_uniswapRouter) && to_ != address(_uniswapRouter) ) { _IsInConversion = true; if ( swapBalance > swapThresholdInTokens * MAX_SWAP_THRESHOLD_MULTIPLE ) { swapBalance = swapThresholdInTokens * MAX_SWAP_THRESHOLD_MULTIPLE; } // Perform the auto swap to native token: _doSwap(swapBalance, this.balanceOf(address(this))); // Flag that the autoswap is complete: _IsInConversion = false; } } } function _doSwap(uint256 swapBalance_, uint256 contractBalance_) internal { uint256 preSwapNativeBalance = address(this).balance; address[] memory path = new address[](2); path[0] = address(this); path[1] = _uniswapRouter.WETH(); uint256 lpTokensProportion = 0; if (swapBalance_ < contractBalance_) { lpTokensProportion = (swapBalance_ * lpAccumulatedTax) / contractBalance_; } else { lpTokensProportion = lpAccumulatedTax; } // Wrap external calls in try / catch to handle errors try _uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( swapBalance_ - (lpTokensProportion / 2), 0, path, address(this), block.timestamp + 600 ) { uint256 postSwapBalance = address(this).balance; uint256 lpTokens = (lpTokensProportion / 2); uint256 totalPendingSwap = accumulatedTax + starShipAccumulatedTax + lpTokens; uint256 balanceToDistribute = postSwapBalance - preSwapNativeBalance; uint256 projectBalanceToDistribute = (balanceToDistribute * accumulatedTax) / totalPendingSwap; uint256 starShipBalance = (balanceToDistribute * starShipAccumulatedTax) / totalPendingSwap; uint256 lpBalance = (balanceToDistribute * lpTokens) / totalPendingSwap; if (swapBalance_ < contractBalance_) { accumulatedTax -= uint128( (accumulatedTax * swapBalance_) / contractBalance_ ); starShipAccumulatedTax -= uint128( (starShipAccumulatedTax * swapBalance_) / contractBalance_ ); lpAccumulatedTax -= uint128( (lpAccumulatedTax * swapBalance_) / contractBalance_ ); } else { (accumulatedTax, starShipAccumulatedTax, lpAccumulatedTax) = ( 0, 0, 0 ); } if (_hasLPTax) { try _uniswapRouter.addLiquidityETH{value: lpBalance}( address(this), lpTokens, 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ) { emit LiquiditySupplied(lpTokens, lpBalance); } catch { } } // Distribute to treasuries: bool success; uint256 gas; if (projectBalanceToDistribute > 0) { _transferNative(projectBalanceToDistribute, taxRecipient); } if (starShipBalance > 0) { _transferNative(starShipBalance, startShipVault); } } catch { // Dont allow a failed external call (in this case to uniswap) to stop a transfer. // Emit that this has occured and continue. emit ExternalCallError(5); } } } contract StarBaseNoLockerERC20 is StarBaseAbstractERC20 { constructor( address[5] memory addresses, bytes memory tokenInfo, bytes memory taxesInfo, bytes memory lpInfo ) StarBaseAbstractERC20(addresses, tokenInfo, taxesInfo, lpInfo) { autoConversion = true; } /** * This will mint the balances for the liquidity pool, which will be minted to the * contract and the rest will be minted to the caller. Also, transaction will revert * if less than 25% of the tokens are not designated to the liquidity pool. * * @param tokenParameters Token info parameters where the total supply is * @param tokenLpInfo The information about the liquidity pool */ function _processSupply( TokenInfoParameters memory tokenParameters, TokenLpInfo memory tokenLpInfo ) internal override { _mint(owner(), tokenParameters.maxSupply); } function addLiquidity() external payable override returns (address) {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[5]","name":"addresses","type":"address[5]"},{"internalType":"bytes","name":"tokenInfo","type":"bytes"},{"internalType":"bytes","name":"taxesInfo","type":"bytes"},{"internalType":"bytes","name":"lpInfo","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApproveFromTheZeroAddress","type":"error"},{"inputs":[],"name":"ApproveToTheZeroAddress","type":"error"},{"inputs":[],"name":"BurnExceedsBalance","type":"error"},{"inputs":[],"name":"BurnFromTheZeroAddress","type":"error"},{"inputs":[],"name":"CallerIsNotTheOwner","type":"error"},{"inputs":[],"name":"CannotSetNewOwnerToTheZeroAddress","type":"error"},{"inputs":[],"name":"HardCapIsTooHigh","type":"error"},{"inputs":[],"name":"InsufficientAllowance","type":"error"},{"inputs":[],"name":"LPAlreadyCreated","type":"error"},{"inputs":[],"name":"LPNotInit","type":"error"},{"inputs":[],"name":"LimitsLoweringIsNotAllowed","type":"error"},{"inputs":[],"name":"LpTokensExceedsTotalSupply","type":"error"},{"inputs":[],"name":"MaxWalletExceeded","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"NotEnoughBalance","type":"error"},{"inputs":[],"name":"NotEnoughFundsForLP","type":"error"},{"inputs":[],"name":"OperationNotAllowed","type":"error"},{"inputs":[],"name":"TaxesCanNotBeRaised","type":"error"},{"inputs":[],"name":"TooFewLPTokens","type":"error"},{"inputs":[],"name":"TransactionIsTooBig","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"ExternalCallError","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousBuyTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousSellTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBuyTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellTax","type":"uint256"}],"name":"LPTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"oldBuyLimit","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"oldSellLimit","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"oldMaxWallet","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"newBuyLimit","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"newSellLimit","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"newMaxWallet","type":"uint128"}],"name":"LimitsRaised","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSupplied","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethSupplied","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpTokensIssued","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityBurned","type":"uint256"}],"name":"LiquidityBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lpTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daysLocked","type":"uint256"}],"name":"LiquidityLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eth","type":"uint256"}],"name":"LiquiditySupplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousBuyTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousSellTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBuyTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellTax","type":"uint256"}],"name":"TaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"accumulatedTax","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLiquidity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnLiquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLPTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMaxTx","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyTax_","type":"uint256"},{"internalType":"uint256","name":"newSellTax_","type":"uint256"},{"internalType":"uint256","name":"newBuyLPTax_","type":"uint256"},{"internalType":"uint256","name":"newSellLPTax_","type":"uint256"}],"name":"changeTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyMaxTx_","type":"uint256"},{"internalType":"uint256","name":"newSellMaxTx_","type":"uint256"},{"internalType":"uint256","name":"newMaxWallet_","type":"uint256"}],"name":"changeTransactionHardCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialLiquidityFunds","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityLockedInDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockFee","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedUntil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpAccumulatedTax","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpCreatedDate","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pctForSwap","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLPTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMaxTx","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shouldPayInTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"starShipAccumulatedTax","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"starShipTaxPoints","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startShipVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokensThreshHoldForSwap","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"x_ID_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e0604052600a805461ffff60881b1916600560881b1790553480156200002557600080fd5b506040516200323b3803806200323b83398101604081905262000048916200098c565b83838383620000573362000461565b600b805461ffff60b01b1916600560b01b17905583516200007890620004b1565b6020808501516001600160a01b0390811660809081526060870151821660a0528601511660c0528351600091620000b6918601810190860162000a89565b8051909150600690620000ca908262000c13565b506020810151600790620000df908262000c13565b5060c0810151600a8054911515600160981b0260ff60981b19909216919091179055600c80546001600160801b031981166001600160801b039182161790915560a082015111156200013d576200013d630805e55f60e11b620004ea565b60a0810151601180546001600160801b0319166001600160801b0390921691909117905582516000906200017b906020908601810190860162000cdf565b90506200018881620004f4565b60c0810151600580546001600160a01b0319166001600160a01b039092169190911790558251600090620001c6906020908601810190860162000d6c565b9050620001d4838262000633565b6040810151600b8054911515600160a01b0260ff60a01b199092169190911790556060810151600c80546001600160801b03928316600160801b02908316179055608080830151600d556020830151600e8054919093166001600160801b03199190911617909155516200024b9060039062000659565b506080516001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200028d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b3919062000dc8565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000303573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000329919062000dc8565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000377573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039d919062000dc8565b600b80546001600160a01b0319166001600160a01b03929092169182179055620003ca9060039062000659565b50620003d860033062000659565b50620003e76003600062000659565b5062000408620003ff6000546001600160a01b031690565b60039062000659565b5062000420306080516000196200067960201b60201c565b600b546200043c9030906001600160a01b031660001962000679565b5050600a805460ff60801b1916600160801b1790555062000e1c975050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620004bb6200071c565b6001600160a01b038116620004dc57620004dc6302c4fd4960e51b620004ea565b620004e78162000461565b50565b8060005260046000fd5b60a08101516001600160801b03108062000518575060808101516001600160801b03105b15620005305762000530630805e55f60e11b620004ea565b608081015160a08201516001600160801b03908116600160801b0291161760105580511580156200056357506020810151155b156200057c576008805460ff60801b19169055620005be565b6008805482516020840151600160801b62ffffff60801b19909316600160881b61ffff93841602179290921761ffff60981b1916600160981b91909216021790555b6040810151158015620005d357506060810151155b15620005e9576008805460ff60a81b1916905550565b600880546040830151606084015161ffff908116600160c01b0261ffff60c01b1991909216600160b01b0262ffffff60a81b1990931692909217600160a81b179190911617905550565b620006556200064a6000546001600160a01b031690565b606084015162000743565b5050565b600062000670836001600160a01b03841662000802565b90505b92915050565b6001600160a01b0383166200069a576200069a6356fdae6560e11b620004ea565b6001600160a01b038216620006bb57620006bb63b2fa1ef360e01b620004ea565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b03163314620007415762000741633e8be92f60e01b620004ea565b565b6001600160a01b038216620007635762000763622e076360e81b620004ea565b60088054829190600090620007839084906001600160801b031662000de6565b82546001600160801b039182166101009390930a9283029190920219909116179055506001600160a01b038216600081815260016020526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620007f69085815260200190565b60405180910390a35050565b60008181526001830160205260408120546200084b5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000673565b50600062000673565b505050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b038111828210171562000894576200089462000859565b60405290565b60405161010081016001600160401b038111828210171562000894576200089462000859565b80516001600160a01b0381168114620008d857600080fd5b919050565b600082601f830112620008ef57600080fd5b81516001600160401b03808211156200090c576200090c62000859565b604051601f8301601f19908116603f0116810190828211818310171562000937576200093762000859565b816040528381526020925086838588010111156200095457600080fd5b600091505b8382101562000978578582018301518183018401529082019062000959565b600093810190920192909252949350505050565b6000806000806101008587031215620009a457600080fd5b85601f860112620009b457600080fd5b620009be6200086f565b8060a0870188811115620009d157600080fd5b875b81811015620009f657620009e781620008c0565b845260209384019301620009d3565b505190955090506001600160401b038082111562000a1357600080fd5b62000a2188838901620008dd565b945060c087015191508082111562000a3857600080fd5b62000a4688838901620008dd565b935060e087015191508082111562000a5d57600080fd5b5062000a6c87828801620008dd565b91505092959194509250565b80518015158114620008d857600080fd5b60006020828403121562000a9c57600080fd5b81516001600160401b038082111562000ab457600080fd5b90830190610100828603121562000aca57600080fd5b62000ad46200089a565b82518281111562000ae457600080fd5b62000af287828601620008dd565b82525060208301518281111562000b0857600080fd5b62000b1687828601620008dd565b60208301525062000b2a6040840162000a78565b60408201526060830151606082015262000b4760808401620008c0565b608082015260a083015160a082015262000b6460c0840162000a78565b60c082015262000b7760e0840162000a78565b60e082015295945050505050565b600181811c9082168062000b9a57607f821691505b60208210810362000bbb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200085457600081815260208120601f850160051c8101602086101562000bea5750805b601f850160051c820191505b8181101562000c0b5782815560010162000bf6565b505050505050565b81516001600160401b0381111562000c2f5762000c2f62000859565b62000c478162000c40845462000b85565b8462000bc1565b602080601f83116001811462000c7f576000841562000c665750858301515b600019600386901b1c1916600185901b17855562000c0b565b600085815260208120601f198616915b8281101562000cb05788860151825594840194600190910190840162000c8f565b508582101562000ccf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060e0828403121562000cf257600080fd5b60405160e081016001600160401b038111828210171562000d175762000d1762000859565b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015262000d6060c08401620008c0565b60c08201529392505050565b600060a0828403121562000d7f57600080fd5b62000d896200086f565b825181526020830151602082015262000da56040840162000a78565b604082015260608301516060820152608083015160808201528091505092915050565b60006020828403121562000ddb57600080fd5b6200067082620008c0565b6001600160801b0381811683821601908082111562000e1557634e487b7160e01b600052601160045260246000fd5b5092915050565b60805160a05160c0516123cc62000e6f600039600081816107380152611f67015260006106930152600081816118460152818161188401528181611a2a01528181611b280152611e2d01526123cc6000f3fe6080604052600436106102765760003560e01c806395d89b411161014f578063d851e102116100c1578063f2fde38b1161007a578063f2fde38b1461081e578063f466a7371461083e578063f8b45b0514610853578063f9c0a3c314610873578063fc9b15e314610893578063fd935c4c146108b557600080fd5b8063d851e10214610726578063da942cbf1461075a578063db7321e11461077b578063dd62ed3e146107af578063e6d20a43146107f5578063e8078d941461081757600080fd5b8063a9059cbb11610113578063a9059cbb1461063a578063ba4f247c1461065a578063c45a015514610681578063c72172fd146106b5578063cc1776d3146106ee578063ce0617ec1461071057600080fd5b806395d89b41146105a557806395f535c9146105ba578063a063d44e146105da578063a6d3bb67146105fa578063a8b089821461061a57600080fd5b80634824167b116101e857806370a08231116101ac57806370a08231146104c3578063715018a6146104f9578063737ea06e1461050e5780637b9906b7146105465780638da5cb5b14610566578063938b3aeb1461058457600080fd5b80634824167b146104245780634f7041a51461044457806350431ce41461046657806356a062351461047b5780636bc357bf146104a257600080fd5b806323b872dd1161023a57806323b872dd1461035057806325172038146103705780632ed6d5e814610392578063313ce567146103a957806342966c68146103c5578063474465e0146103e557600080fd5b806306fdde0314610282578063091f3b6e146102ad578063095ea7b3146102e257806318160ddd146103125780631dafcff11461033a57600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b506102976108d5565b6040516102a49190611f9d565b60405180910390f35b3480156102b957600080fd5b50600b546102cf90600160b01b900461ffff1681565b60405161ffff90911681526020016102a4565b3480156102ee57600080fd5b506103026102fd366004612000565b610967565b60405190151581526020016102a4565b34801561031e57600080fd5b506008546001600160801b03165b6040519081526020016102a4565b34801561034657600080fd5b5061032c600d5481565b34801561035c57600080fd5b5061030261036b36600461202c565b610981565b34801561037c57600080fd5b506008546102cf90600160b01b900461ffff1681565b34801561039e57600080fd5b506103a76109a1565b005b3480156103b557600080fd5b50604051601281526020016102a4565b3480156103d157600080fd5b506103a76103e036600461206d565b610a93565b3480156103f157600080fd5b5060095461040c90600160801b90046001600160801b031681565b6040516001600160801b0390911681526020016102a4565b34801561043057600080fd5b50600c5461040c906001600160801b031681565b34801561045057600080fd5b506008546102cf90600160881b900461ffff1681565b34801561047257600080fd5b506103a7610a9d565b34801561048757600080fd5b50600c5461040c90600160801b90046001600160801b031681565b3480156104ae57600080fd5b50600a5461030290600160801b900460ff1681565b3480156104cf57600080fd5b5061032c6104de366004612086565b6001600160a01b031660009081526001602052604090205490565b34801561050557600080fd5b506103a7610ab4565b34801561051a57600080fd5b5060055461052e906001600160a01b031681565b6040516001600160a01b0390911681526020016102a4565b34801561055257600080fd5b506103a76105613660046120a3565b610ac8565b34801561057257600080fd5b506000546001600160a01b031661052e565b34801561059057600080fd5b50600a5461030290600160981b900460ff1681565b3480156105b157600080fd5b50610297610bd0565b3480156105c657600080fd5b50600e5461040c906001600160801b031681565b3480156105e657600080fd5b506103a76105f53660046120cf565b610bdf565b34801561060657600080fd5b50600a5461040c906001600160801b031681565b34801561062657600080fd5b50600b5461052e906001600160a01b031681565b34801561064657600080fd5b50610302610655366004612000565b610da0565b34801561066657600080fd5b5060105461040c90600160801b90046001600160801b031681565b34801561068d57600080fd5b5061052e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106c157600080fd5b50600a546106d990600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016102a4565b3480156106fa57600080fd5b506008546102cf90600160981b900461ffff1681565b34801561071c57600080fd5b5061032c600f5481565b34801561073257600080fd5b5061052e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561076657600080fd5b50600b5461030290600160a01b900460ff1681565b34801561078757600080fd5b5061032c7fb07887f9e6857c947639357c810260e93a866b112197fa793b96ffe10082a24481565b3480156107bb57600080fd5b5061032c6107ca366004612101565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561080157600080fd5b506008546102cf90600160c01b900461ffff1681565b600061052e565b34801561082a57600080fd5b506103a7610839366004612086565b610db4565b34801561084a57600080fd5b506103a7610de3565b34801561085f57600080fd5b5060115461040c906001600160801b031681565b34801561087f57600080fd5b5060095461040c906001600160801b031681565b34801561089f57600080fd5b50600a546102cf90600160881b900461ffff1681565b3480156108c157600080fd5b5060105461040c906001600160801b031681565b6060600680546108e49061213a565b80601f01602080910402602001604051908101604052809291908181526020018280546109109061213a565b801561095d5780601f106109325761010080835404028352916020019161095d565b820191906000526020600020905b81548152906001019060200180831161094057829003601f168201915b5050505050905090565b600033610975818585610e0c565b60019150505b92915050565b600061098e843384610eaa565b610999848484610f53565b949350505050565b6005546040516370a0823160e01b81523060048201819052916323b872dd9183916001600160a01b03169082906370a0823190602401602060405180830381865afa1580156109f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a189190612174565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a90919061218d565b50565b610a903382610ff5565b600554610a909047906001600160a01b03166110b7565b610abc611130565b610ac66000611152565b565b610ad0611130565b6010546001600160801b0316831080610afa5750601054600160801b90046001600160801b031682105b80610b0f57506011546001600160801b031681105b15610b2457610b246375ff525b60e01b6111a2565b60118054601080546001600160801b03878116600160801b8883168102828117958690556001600160801b03198716898516908117909855604080518587168082529684900486166020820181905298861691810182905291851690931760608201529404909116608084015260a0830194909452907f9da282dae9508ab66f11209ef1f9e7bbe0728ad3f06f7ba8783fc13d1e6d388a9060c0015b60405180910390a1505050505050565b6060600780546108e49061213a565b610be7611130565b6008805463ffffffff60881b198116600160881b61ffff888116820261ffff60981b191692909217600160981b888416810291909117948590558184048316949304821692041615801590610c485750600854600160981b900461ffff1615155b6008805460ff60801b1916600160801b9215159290920291909117908190556040805161ffff85811682528481166020830152600160881b8404811682840152600160981b9093049092166060830152517f996af4dde4d067a946811671989668032cdbe3f94e5f2352530dba72da86b8759181900360800190a150506008805463ffffffff60b01b198116600160b01b61ffff868116820261ffff60c01b191692909217600160c01b868416810291909117948590558184048316949304821692041615801590610d265750600854600160c01b900461ffff1615155b60088054911515600160a81b0260ff60a81b1990921691909117908190556040805161ffff85811682528481166020830152600160b01b8404811692820192909252600160c01b9092041660608201527fdbe9f29542588ba3c52d9a210036ea7fa83d5c8812d999342fe46fc2f3fce89990608001610bc0565b6000610dad338484610f53565b9392505050565b610dbc611130565b6001600160a01b038116610dda57610dda6302c4fd4960e51b6111a2565b610a9081611152565b610deb611130565b600a805460ff60801b198116600160801b9182900460ff1615909102179055565b6001600160a01b038316610e2a57610e2a6356fdae6560e11b6111a2565b6001600160a01b038216610e4857610e4863b2fa1ef360e01b6111a2565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b604051636eb1769f60e11b81526001600160a01b03808516600483015283166024820152600090309063dd62ed3e90604401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190612174565b90506000198114610f4d5781811015610f4057610f406313be252b60e01b6111a2565b610f4d8484848403610e0c565b50505050565b6000610f608484846111ac565b6000610f6d85858561132d565b9050610f79858561176e565b6001600160a01b038581166000818152600160209081526040808320805489900390559388168083529184902080546001600160801b038716908101909155935193845290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3506001949350505050565b6001600160a01b038216611013576110136304fca6bd60e41b6111a2565b6001600160a01b038216600090815260016020526040902054818110156110445761104463588569f760e01b6111a2565b6001600160a01b0383166000818152600160205260408082208585039055600880546001600160801b03808216889003166001600160801b0319909116179055519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610e9d9086815260200190565b6000805a61c350116110cb5761c3506110cd565b5a5b90506000836001600160a01b0316858390604051600060405180830381858888f193505050503d806000811461111f576040519150601f19603f3d011682016040523d82523d6000602084013e611124565b606091505b50909695505050505050565b6000546001600160a01b03163314610ac657610ac6633e8be92f60e01b6111a2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8060005260046000fd5b6001600160a01b038316600090815260016020526040902054818110156111dd576111dd63569d45cf60e11b6111a2565b6010546001600160801b0316158015906112045750600b546001600160a01b038581169116145b80156112185750611216600384611970565b155b801561122e57506010546001600160801b031682115b1561124357611243631ca5a3cb60e21b6111a2565b601054600160801b90046001600160801b0316158015906112715750600b546001600160a01b038481169116145b80156112855750611283600385611970565b155b80156112a25750601054600160801b90046001600160801b031682115b156112b7576112b7631ca5a3cb60e21b6111a2565b6001600160a01b0383166000908152600160205260409020546011546001600160801b0316158015906112fd57506112ef83826121c5565b6011546001600160801b0316105b8015611311575061130f600385611970565b155b1561132657611326632ce93b5960e01b6111a2565b5050505050565b60008181808061133b611992565b80156113515750600b54600160a81b900460ff16155b1561174257600b546001600160a01b03898116911614801561137b5750611379600388611970565b155b156114e357600854600160881b900461ffff16156113bc576008546103e8906113af90600160881b900461ffff16866121d8565b6113b99190612219565b92505b600a54600160981b900460ff161561143f57600a546103e8906113ea90600160881b900461ffff16866121d8565b6113f49190612219565b915081600960108282829054906101000a90046001600160801b031661141a919061223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b600854600160a81b900460ff1680156114645750600854600160b01b900461ffff1615155b156114de576008546103e89061148590600160b01b900461ffff16866121d8565b61148f9190612219565b611499908261223f565b600a805491925082916000906114b99084906001600160801b031661223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b61166b565b600b546001600160a01b0388811691161480156115085750611506600389611970565b155b1561166b57600854600160981b900461ffff1615611549576008546103e89061153c90600160981b900461ffff16866121d8565b6115469190612219565b92505b600a54600160981b900460ff16156115cc57600a546103e89061157790600160881b900461ffff16866121d8565b6115819190612219565b915081600960108282829054906101000a90046001600160801b03166115a7919061223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b600854600160a81b900460ff1680156115f15750600854600160c01b900461ffff1615155b1561166b576008546103e89061161290600160c01b900461ffff16866121d8565b61161c9190612219565b611626908261223f565b600a805491925082916000906116469084906001600160801b031661223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b6000836001600160801b0316118061168c57506000826001600160801b0316115b806116a057506000816001600160801b0316115b1561174257600980546001600160801b031981166001600160801b039182168601821617909155306000818152600160205260409020805485870185019093169092019091556001600160a01b0389167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8361171c868861223f565b611726919061223f565b6040516001600160801b03909116815260200160405180910390a35b808361174e8487612266565b6117589190612266565b6117629190612266565b98975050505050505050565b611776611992565b801561178b5750600a54600160801b900460ff165b1561196c57600a546009546000916001600160801b03908116916117b991600160801b82048116911661223f565b6117c3919061223f565b600b546008546001600160801b0392831693506000926103e8926117f492600160b01b90910461ffff1691166121d8565b6117fe9190612219565b6001600160801b031690508082101580156118235750600b54600160a81b900460ff16155b801561183d5750600b546001600160a01b03858116911614155b801561187b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614155b80156118b957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b15610f4d57600b805460ff60a81b1916600160a81b1790556118dc601482612286565b8211156118f1576118ee601482612286565b91505b6040516370a0823160e01b8152306004820181905261195c918491906370a0823190602401602060405180830381865afa158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190612174565b6119cf565b600b805460ff60a81b1916905550505b5050565b6001600160a01b03811660009081526001830160205260408120541515610dad565b600854600090600160801b900460ff16806119b65750600a54600160981b900460ff165b806119ca5750600854600160a81b900460ff165b905090565b604080516002808252606082018352479260009291906020830190803683370190505090503081600081518110611a0857611a0861229d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaa91906122b3565b81600181518110611abd57611abd61229d565b60200260200101906001600160a01b031690816001600160a01b031681525050600083851015611b1057600a548490611aff906001600160801b031687612286565b611b0991906122d0565b9050611b1e565b50600a546001600160801b03165b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663791ac947611b586002846122d0565b611b6290886122e4565b60008530611b72426102586121c5565b6040518663ffffffff1660e01b8152600401611b929594939291906122f7565b600060405180830381600087803b158015611bac57600080fd5b505af1925050508015611bbd575060015b611bfa57604051600581527f60dc41faad9fe4f70f304dcef26d96d71e98ec8e21e4a340921d94dfe46307dc9060200160405180910390a1611326565b476000611c086002846122d0565b6009549091506000908290611c2f906001600160801b03600160801b82048116911661223f565b6001600160801b0316611c4291906121c5565b90506000611c5087856122e4565b6009549091506000908390611c6e906001600160801b031684612286565b611c7891906122d0565b6009549091506000908490611c9d90600160801b90046001600160801b031685612286565b611ca791906122d0565b9050600084611cb68786612286565b611cc091906122d0565b90508a8c1015611e03576009548b90611ce3908e906001600160801b0316612286565b611ced91906122d0565b60098054600090611d089084906001600160801b0316612266565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508a8c600960109054906101000a90046001600160801b03166001600160801b0316611d579190612286565b611d6191906122d0565b60098054601090611d83908490600160801b90046001600160801b0316612266565b82546101009290920a6001600160801b03818102199093169183160217909155600a548d9250611db5918f9116612286565b611dbf91906122d0565b600a8054600090611dda9084906001600160801b0316612266565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550611e19565b600a80546001600160801b031916905560006009555b600854600160a81b900460ff1615611f39577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d719823089600080611e726000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af193505050508015611ef7575060408051601f3d908101601f19168201909252611ef491810190612368565b60015b15611f3957505060408051888152602081018490527f3093137ef5ce18e5dc5e3d21ac966505edafb77edc1e264ae46d103a78c484a992500160405180910390a15b6000808415611f5b57600554611f599086906001600160a01b03166110b7565b505b8315611f8d57611f8b847f00000000000000000000000000000000000000000000000000000000000000006110b7565b505b5050505050505050505050505050565b600060208083528351808285015260005b81811015611fca57858101830151858201604001528201611fae565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610a9057600080fd5b6000806040838503121561201357600080fd5b823561201e81611feb565b946020939093013593505050565b60008060006060848603121561204157600080fd5b833561204c81611feb565b9250602084013561205c81611feb565b929592945050506040919091013590565b60006020828403121561207f57600080fd5b5035919050565b60006020828403121561209857600080fd5b8135610dad81611feb565b6000806000606084860312156120b857600080fd5b505081359360208301359350604090920135919050565b600080600080608085870312156120e557600080fd5b5050823594602084013594506040840135936060013592509050565b6000806040838503121561211457600080fd5b823561211f81611feb565b9150602083013561212f81611feb565b809150509250929050565b600181811c9082168061214e57607f821691505b60208210810361216e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561218657600080fd5b5051919050565b60006020828403121561219f57600080fd5b81518015158114610dad57600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561097b5761097b6121af565b6001600160801b038181168382160280821691908281146121fb576121fb6121af565b505092915050565b634e487b7160e01b600052601260045260246000fd5b60006001600160801b038084168061223357612233612203565b92169190910492915050565b6001600160801b0381811683821601908082111561225f5761225f6121af565b5092915050565b6001600160801b0382811682821603908082111561225f5761225f6121af565b808202811582820484141761097b5761097b6121af565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156122c557600080fd5b8151610dad81611feb565b6000826122df576122df612203565b500490565b8181038181111561097b5761097b6121af565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156123475784516001600160a01b031683529383019391830191600101612322565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561237d57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212207d3652429213c85fa3df0251001c99cf9e8dd35206cc62109869142ea61cc85964736f6c634300081500330000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b13360000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000663a5c229c09b049e36dcc11a9b0d4a8eb9db2140000000000000000000000007ce6a5b0513efc73d15dc4809b4bc51e76aea3230000000000000000000000002a384fd9e2f27621a0b80d12974dd2aceb250e2e000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b13360000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4347410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4347410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b133600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000001f
Deployed Bytecode
0x6080604052600436106102765760003560e01c806395d89b411161014f578063d851e102116100c1578063f2fde38b1161007a578063f2fde38b1461081e578063f466a7371461083e578063f8b45b0514610853578063f9c0a3c314610873578063fc9b15e314610893578063fd935c4c146108b557600080fd5b8063d851e10214610726578063da942cbf1461075a578063db7321e11461077b578063dd62ed3e146107af578063e6d20a43146107f5578063e8078d941461081757600080fd5b8063a9059cbb11610113578063a9059cbb1461063a578063ba4f247c1461065a578063c45a015514610681578063c72172fd146106b5578063cc1776d3146106ee578063ce0617ec1461071057600080fd5b806395d89b41146105a557806395f535c9146105ba578063a063d44e146105da578063a6d3bb67146105fa578063a8b089821461061a57600080fd5b80634824167b116101e857806370a08231116101ac57806370a08231146104c3578063715018a6146104f9578063737ea06e1461050e5780637b9906b7146105465780638da5cb5b14610566578063938b3aeb1461058457600080fd5b80634824167b146104245780634f7041a51461044457806350431ce41461046657806356a062351461047b5780636bc357bf146104a257600080fd5b806323b872dd1161023a57806323b872dd1461035057806325172038146103705780632ed6d5e814610392578063313ce567146103a957806342966c68146103c5578063474465e0146103e557600080fd5b806306fdde0314610282578063091f3b6e146102ad578063095ea7b3146102e257806318160ddd146103125780631dafcff11461033a57600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b506102976108d5565b6040516102a49190611f9d565b60405180910390f35b3480156102b957600080fd5b50600b546102cf90600160b01b900461ffff1681565b60405161ffff90911681526020016102a4565b3480156102ee57600080fd5b506103026102fd366004612000565b610967565b60405190151581526020016102a4565b34801561031e57600080fd5b506008546001600160801b03165b6040519081526020016102a4565b34801561034657600080fd5b5061032c600d5481565b34801561035c57600080fd5b5061030261036b36600461202c565b610981565b34801561037c57600080fd5b506008546102cf90600160b01b900461ffff1681565b34801561039e57600080fd5b506103a76109a1565b005b3480156103b557600080fd5b50604051601281526020016102a4565b3480156103d157600080fd5b506103a76103e036600461206d565b610a93565b3480156103f157600080fd5b5060095461040c90600160801b90046001600160801b031681565b6040516001600160801b0390911681526020016102a4565b34801561043057600080fd5b50600c5461040c906001600160801b031681565b34801561045057600080fd5b506008546102cf90600160881b900461ffff1681565b34801561047257600080fd5b506103a7610a9d565b34801561048757600080fd5b50600c5461040c90600160801b90046001600160801b031681565b3480156104ae57600080fd5b50600a5461030290600160801b900460ff1681565b3480156104cf57600080fd5b5061032c6104de366004612086565b6001600160a01b031660009081526001602052604090205490565b34801561050557600080fd5b506103a7610ab4565b34801561051a57600080fd5b5060055461052e906001600160a01b031681565b6040516001600160a01b0390911681526020016102a4565b34801561055257600080fd5b506103a76105613660046120a3565b610ac8565b34801561057257600080fd5b506000546001600160a01b031661052e565b34801561059057600080fd5b50600a5461030290600160981b900460ff1681565b3480156105b157600080fd5b50610297610bd0565b3480156105c657600080fd5b50600e5461040c906001600160801b031681565b3480156105e657600080fd5b506103a76105f53660046120cf565b610bdf565b34801561060657600080fd5b50600a5461040c906001600160801b031681565b34801561062657600080fd5b50600b5461052e906001600160a01b031681565b34801561064657600080fd5b50610302610655366004612000565b610da0565b34801561066657600080fd5b5060105461040c90600160801b90046001600160801b031681565b34801561068d57600080fd5b5061052e7f0000000000000000000000007ce6a5b0513efc73d15dc4809b4bc51e76aea32381565b3480156106c157600080fd5b50600a546106d990600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016102a4565b3480156106fa57600080fd5b506008546102cf90600160981b900461ffff1681565b34801561071c57600080fd5b5061032c600f5481565b34801561073257600080fd5b5061052e7f0000000000000000000000002a384fd9e2f27621a0b80d12974dd2aceb250e2e81565b34801561076657600080fd5b50600b5461030290600160a01b900460ff1681565b34801561078757600080fd5b5061032c7fb07887f9e6857c947639357c810260e93a866b112197fa793b96ffe10082a24481565b3480156107bb57600080fd5b5061032c6107ca366004612101565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561080157600080fd5b506008546102cf90600160c01b900461ffff1681565b600061052e565b34801561082a57600080fd5b506103a7610839366004612086565b610db4565b34801561084a57600080fd5b506103a7610de3565b34801561085f57600080fd5b5060115461040c906001600160801b031681565b34801561087f57600080fd5b5060095461040c906001600160801b031681565b34801561089f57600080fd5b50600a546102cf90600160881b900461ffff1681565b3480156108c157600080fd5b5060105461040c906001600160801b031681565b6060600680546108e49061213a565b80601f01602080910402602001604051908101604052809291908181526020018280546109109061213a565b801561095d5780601f106109325761010080835404028352916020019161095d565b820191906000526020600020905b81548152906001019060200180831161094057829003601f168201915b5050505050905090565b600033610975818585610e0c565b60019150505b92915050565b600061098e843384610eaa565b610999848484610f53565b949350505050565b6005546040516370a0823160e01b81523060048201819052916323b872dd9183916001600160a01b03169082906370a0823190602401602060405180830381865afa1580156109f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a189190612174565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a90919061218d565b50565b610a903382610ff5565b600554610a909047906001600160a01b03166110b7565b610abc611130565b610ac66000611152565b565b610ad0611130565b6010546001600160801b0316831080610afa5750601054600160801b90046001600160801b031682105b80610b0f57506011546001600160801b031681105b15610b2457610b246375ff525b60e01b6111a2565b60118054601080546001600160801b03878116600160801b8883168102828117958690556001600160801b03198716898516908117909855604080518587168082529684900486166020820181905298861691810182905291851690931760608201529404909116608084015260a0830194909452907f9da282dae9508ab66f11209ef1f9e7bbe0728ad3f06f7ba8783fc13d1e6d388a9060c0015b60405180910390a1505050505050565b6060600780546108e49061213a565b610be7611130565b6008805463ffffffff60881b198116600160881b61ffff888116820261ffff60981b191692909217600160981b888416810291909117948590558184048316949304821692041615801590610c485750600854600160981b900461ffff1615155b6008805460ff60801b1916600160801b9215159290920291909117908190556040805161ffff85811682528481166020830152600160881b8404811682840152600160981b9093049092166060830152517f996af4dde4d067a946811671989668032cdbe3f94e5f2352530dba72da86b8759181900360800190a150506008805463ffffffff60b01b198116600160b01b61ffff868116820261ffff60c01b191692909217600160c01b868416810291909117948590558184048316949304821692041615801590610d265750600854600160c01b900461ffff1615155b60088054911515600160a81b0260ff60a81b1990921691909117908190556040805161ffff85811682528481166020830152600160b01b8404811692820192909252600160c01b9092041660608201527fdbe9f29542588ba3c52d9a210036ea7fa83d5c8812d999342fe46fc2f3fce89990608001610bc0565b6000610dad338484610f53565b9392505050565b610dbc611130565b6001600160a01b038116610dda57610dda6302c4fd4960e51b6111a2565b610a9081611152565b610deb611130565b600a805460ff60801b198116600160801b9182900460ff1615909102179055565b6001600160a01b038316610e2a57610e2a6356fdae6560e11b6111a2565b6001600160a01b038216610e4857610e4863b2fa1ef360e01b6111a2565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b604051636eb1769f60e11b81526001600160a01b03808516600483015283166024820152600090309063dd62ed3e90604401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190612174565b90506000198114610f4d5781811015610f4057610f406313be252b60e01b6111a2565b610f4d8484848403610e0c565b50505050565b6000610f608484846111ac565b6000610f6d85858561132d565b9050610f79858561176e565b6001600160a01b038581166000818152600160209081526040808320805489900390559388168083529184902080546001600160801b038716908101909155935193845290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3506001949350505050565b6001600160a01b038216611013576110136304fca6bd60e41b6111a2565b6001600160a01b038216600090815260016020526040902054818110156110445761104463588569f760e01b6111a2565b6001600160a01b0383166000818152600160205260408082208585039055600880546001600160801b03808216889003166001600160801b0319909116179055519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610e9d9086815260200190565b6000805a61c350116110cb5761c3506110cd565b5a5b90506000836001600160a01b0316858390604051600060405180830381858888f193505050503d806000811461111f576040519150601f19603f3d011682016040523d82523d6000602084013e611124565b606091505b50909695505050505050565b6000546001600160a01b03163314610ac657610ac6633e8be92f60e01b6111a2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8060005260046000fd5b6001600160a01b038316600090815260016020526040902054818110156111dd576111dd63569d45cf60e11b6111a2565b6010546001600160801b0316158015906112045750600b546001600160a01b038581169116145b80156112185750611216600384611970565b155b801561122e57506010546001600160801b031682115b1561124357611243631ca5a3cb60e21b6111a2565b601054600160801b90046001600160801b0316158015906112715750600b546001600160a01b038481169116145b80156112855750611283600385611970565b155b80156112a25750601054600160801b90046001600160801b031682115b156112b7576112b7631ca5a3cb60e21b6111a2565b6001600160a01b0383166000908152600160205260409020546011546001600160801b0316158015906112fd57506112ef83826121c5565b6011546001600160801b0316105b8015611311575061130f600385611970565b155b1561132657611326632ce93b5960e01b6111a2565b5050505050565b60008181808061133b611992565b80156113515750600b54600160a81b900460ff16155b1561174257600b546001600160a01b03898116911614801561137b5750611379600388611970565b155b156114e357600854600160881b900461ffff16156113bc576008546103e8906113af90600160881b900461ffff16866121d8565b6113b99190612219565b92505b600a54600160981b900460ff161561143f57600a546103e8906113ea90600160881b900461ffff16866121d8565b6113f49190612219565b915081600960108282829054906101000a90046001600160801b031661141a919061223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b600854600160a81b900460ff1680156114645750600854600160b01b900461ffff1615155b156114de576008546103e89061148590600160b01b900461ffff16866121d8565b61148f9190612219565b611499908261223f565b600a805491925082916000906114b99084906001600160801b031661223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b61166b565b600b546001600160a01b0388811691161480156115085750611506600389611970565b155b1561166b57600854600160981b900461ffff1615611549576008546103e89061153c90600160981b900461ffff16866121d8565b6115469190612219565b92505b600a54600160981b900460ff16156115cc57600a546103e89061157790600160881b900461ffff16866121d8565b6115819190612219565b915081600960108282829054906101000a90046001600160801b03166115a7919061223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b600854600160a81b900460ff1680156115f15750600854600160c01b900461ffff1615155b1561166b576008546103e89061161290600160c01b900461ffff16866121d8565b61161c9190612219565b611626908261223f565b600a805491925082916000906116469084906001600160801b031661223f565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b6000836001600160801b0316118061168c57506000826001600160801b0316115b806116a057506000816001600160801b0316115b1561174257600980546001600160801b031981166001600160801b039182168601821617909155306000818152600160205260409020805485870185019093169092019091556001600160a01b0389167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8361171c868861223f565b611726919061223f565b6040516001600160801b03909116815260200160405180910390a35b808361174e8487612266565b6117589190612266565b6117629190612266565b98975050505050505050565b611776611992565b801561178b5750600a54600160801b900460ff165b1561196c57600a546009546000916001600160801b03908116916117b991600160801b82048116911661223f565b6117c3919061223f565b600b546008546001600160801b0392831693506000926103e8926117f492600160b01b90910461ffff1691166121d8565b6117fe9190612219565b6001600160801b031690508082101580156118235750600b54600160a81b900460ff16155b801561183d5750600b546001600160a01b03858116911614155b801561187b57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316846001600160a01b031614155b80156118b957507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316836001600160a01b031614155b15610f4d57600b805460ff60a81b1916600160a81b1790556118dc601482612286565b8211156118f1576118ee601482612286565b91505b6040516370a0823160e01b8152306004820181905261195c918491906370a0823190602401602060405180830381865afa158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190612174565b6119cf565b600b805460ff60a81b1916905550505b5050565b6001600160a01b03811660009081526001830160205260408120541515610dad565b600854600090600160801b900460ff16806119b65750600a54600160981b900460ff165b806119ca5750600854600160a81b900460ff165b905090565b604080516002808252606082018352479260009291906020830190803683370190505090503081600081518110611a0857611a0861229d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaa91906122b3565b81600181518110611abd57611abd61229d565b60200260200101906001600160a01b031690816001600160a01b031681525050600083851015611b1057600a548490611aff906001600160801b031687612286565b611b0991906122d0565b9050611b1e565b50600a546001600160801b03165b6001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1663791ac947611b586002846122d0565b611b6290886122e4565b60008530611b72426102586121c5565b6040518663ffffffff1660e01b8152600401611b929594939291906122f7565b600060405180830381600087803b158015611bac57600080fd5b505af1925050508015611bbd575060015b611bfa57604051600581527f60dc41faad9fe4f70f304dcef26d96d71e98ec8e21e4a340921d94dfe46307dc9060200160405180910390a1611326565b476000611c086002846122d0565b6009549091506000908290611c2f906001600160801b03600160801b82048116911661223f565b6001600160801b0316611c4291906121c5565b90506000611c5087856122e4565b6009549091506000908390611c6e906001600160801b031684612286565b611c7891906122d0565b6009549091506000908490611c9d90600160801b90046001600160801b031685612286565b611ca791906122d0565b9050600084611cb68786612286565b611cc091906122d0565b90508a8c1015611e03576009548b90611ce3908e906001600160801b0316612286565b611ced91906122d0565b60098054600090611d089084906001600160801b0316612266565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508a8c600960109054906101000a90046001600160801b03166001600160801b0316611d579190612286565b611d6191906122d0565b60098054601090611d83908490600160801b90046001600160801b0316612266565b82546101009290920a6001600160801b03818102199093169183160217909155600a548d9250611db5918f9116612286565b611dbf91906122d0565b600a8054600090611dda9084906001600160801b0316612266565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550611e19565b600a80546001600160801b031916905560006009555b600854600160a81b900460ff1615611f39577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d719823089600080611e726000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af193505050508015611ef7575060408051601f3d908101601f19168201909252611ef491810190612368565b60015b15611f3957505060408051888152602081018490527f3093137ef5ce18e5dc5e3d21ac966505edafb77edc1e264ae46d103a78c484a992500160405180910390a15b6000808415611f5b57600554611f599086906001600160a01b03166110b7565b505b8315611f8d57611f8b847f0000000000000000000000002a384fd9e2f27621a0b80d12974dd2aceb250e2e6110b7565b505b5050505050505050505050505050565b600060208083528351808285015260005b81811015611fca57858101830151858201604001528201611fae565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610a9057600080fd5b6000806040838503121561201357600080fd5b823561201e81611feb565b946020939093013593505050565b60008060006060848603121561204157600080fd5b833561204c81611feb565b9250602084013561205c81611feb565b929592945050506040919091013590565b60006020828403121561207f57600080fd5b5035919050565b60006020828403121561209857600080fd5b8135610dad81611feb565b6000806000606084860312156120b857600080fd5b505081359360208301359350604090920135919050565b600080600080608085870312156120e557600080fd5b5050823594602084013594506040840135936060013592509050565b6000806040838503121561211457600080fd5b823561211f81611feb565b9150602083013561212f81611feb565b809150509250929050565b600181811c9082168061214e57607f821691505b60208210810361216e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561218657600080fd5b5051919050565b60006020828403121561219f57600080fd5b81518015158114610dad57600080fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561097b5761097b6121af565b6001600160801b038181168382160280821691908281146121fb576121fb6121af565b505092915050565b634e487b7160e01b600052601260045260246000fd5b60006001600160801b038084168061223357612233612203565b92169190910492915050565b6001600160801b0381811683821601908082111561225f5761225f6121af565b5092915050565b6001600160801b0382811682821603908082111561225f5761225f6121af565b808202811582820484141761097b5761097b6121af565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156122c557600080fd5b8151610dad81611feb565b6000826122df576122df612203565b500490565b8181038181111561097b5761097b6121af565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156123475784516001600160a01b031683529383019391830191600101612322565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561237d57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212207d3652429213c85fa3df0251001c99cf9e8dd35206cc62109869142ea61cc85964736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b13360000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000663a5c229c09b049e36dcc11a9b0d4a8eb9db2140000000000000000000000007ce6a5b0513efc73d15dc4809b4bc51e76aea3230000000000000000000000002a384fd9e2f27621a0b80d12974dd2aceb250e2e000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b13360000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4347410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4347410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b133600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000001f
-----Decoded View---------------
Arg [0] : addresses (address[5]): 0x3b3F01373270b6f70FA815ec1Cc121271B5b1336,0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D,0x663A5C229c09b049E36dCc11a9B0d4a8Eb9db214,0x7ce6A5b0513eFc73D15dC4809b4bc51e76aeA323,0x2a384fD9e2f27621A0b80D12974Dd2AcEb250e2E
Arg [1] : tokenInfo (bytes): 0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b13360000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4347410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d43474100000000000000000000000000000000000000000000000000000000
Arg [2] : taxesInfo (bytes): 0x000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b1336
Arg [3] : lpInfo (bytes): 0x000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000001f
-----Encoded View---------------
36 Constructor Arguments found :
Arg [0] : 0000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b1336
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000663a5c229c09b049e36dcc11a9b0d4a8eb9db214
Arg [3] : 0000000000000000000000007ce6a5b0513efc73d15dc4809b4bc51e76aea323
Arg [4] : 0000000000000000000000002a384fd9e2f27621a0b80d12974dd2aceb250e2e
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [6] : 00000000000000000000000000000000000000000000000000000000000002c0
Arg [7] : 00000000000000000000000000000000000000000000000000000000000003c0
Arg [8] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [13] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [14] : 0000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b1336
Arg [15] : 0000000000000000000000000000000000000000000422ca8b0a00a425000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [19] : 4d43474100000000000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [21] : 4d43474100000000000000000000000000000000000000000000000000000000
Arg [22] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000096
Arg [24] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [25] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [26] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [27] : 0000000000000000000000000000000000000000000422ca8b0a00a425000000
Arg [28] : 0000000000000000000000000000000000000000000422ca8b0a00a425000000
Arg [29] : 0000000000000000000000003b3f01373270b6f70fa815ec1cc121271b5b1336
Arg [30] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [31] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [32] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [34] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [35] : 000000000000000000000000000000000000000000000000000000000000001f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.