Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19237350 | 291 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
ProofFactoryGate
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: None pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "./libraries/Ownable.sol"; import "./libraries/ProofFactoryFees.sol"; import "./interfaces/IUniswapV2Router02.sol"; import "./interfaces/IProofFactoryTokenCutter.sol"; import "./interfaces/IProofFactoryGate.sol"; import "./tokenCutters/ProofFactoryTokenCutter.sol"; import "./interfaces/IFACTORY.sol"; contract ProofFactoryGate is Ownable, IProofFactoryGate { using SafeERC20 for IERC20; address public proofFactory; address public nftWhitelist; modifier onlyFactory() { require(msg.sender == proofFactory, "only factory"); _; } constructor(address _nftWhitelist) { nftWhitelist = _nftWhitelist; } function updateProofFactory( address _proofFactory ) external override onlyOwner { require(_proofFactory != address(0), "zero ProofFactory"); proofFactory = _proofFactory; } function setBaseNFTWhitelist(address newNFTWhitelist) external onlyOwner { nftWhitelist = newNFTWhitelist; } function createToken( IProofFactory.TokenParam memory tokenParam_, address _routerAddress, address _proofAdmin, address _owner ) external override onlyFactory returns (address) { //create token ProofFactoryFees.allFees memory fees = ProofFactoryFees.allFees( tokenParam_.initialReflectionFee, tokenParam_.initialReflectionFeeOnSell, tokenParam_.initialLpFee, tokenParam_.initialLpFeeOnSell, tokenParam_.initialDevFee, tokenParam_.initialDevFeeOnSell ); ProofFactoryTokenCutter newToken = new ProofFactoryTokenCutter(); Ownable(address(newToken)).transferOwnership(_owner); address newTokenAddress = address(newToken); IProofFactoryTokenCutter(newTokenAddress).setBasicData( IProofFactoryTokenCutter.BaseData( tokenParam_.tokenName, tokenParam_.tokenSymbol, tokenParam_.initialSupply, tokenParam_.percentToLP, tokenParam_.whitelistPeriod, _owner, tokenParam_.devWallet, tokenParam_.reflectionToken, _routerAddress, _proofAdmin, tokenParam_.whitelists, nftWhitelist ), fees ); IProofFactoryTokenCutter(newTokenAddress).updateProofFactory( proofFactory ); uint256 balance = IERC20(newTokenAddress).balanceOf(address(this)); IERC20(newTokenAddress).safeTransfer(proofFactory, balance); return newTokenAddress; } receive() external payable {} function isWhitelisted(address user) external view returns(bool) { return IFACTORY(proofFactory).isWhitelisted(user); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../token/ERC20/extensions/IERC20Metadata.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage); } } }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./libraries/TokenUtils.sol"; import "./interfaces/IDividendDistributor.sol"; import "./interfaces/IUniswapV2Router02.sol"; import "./interfaces/IUniswapV2Factory.sol"; import "./interfaces/IWETH.sol"; contract DividendDistributor is IDividendDistributor { address _token; struct Share { uint256 amount; uint256 totalExcluded; } IUniswapV2Router02 router; IERC20 public RewardToken; address[] shareholders; mapping(address => uint256) public shareholderIndexes; mapping(address => uint256) public shareholderClaims; mapping(address => Share) public shares; uint256 public totalShares; uint256 public totalDividends; uint256 public totalDistributed; uint256 public dividendsPerShare; uint256 public dividendsPerShareAccuracyFactor = 10 ** 36; uint256 public minPeriod = 30 minutes; uint256 public minDistribution = 1 * (10 ** 18); uint256 currentIndex; bool initialized; modifier onlyToken() { require(msg.sender == _token); _; } constructor(address _router, address _reflectionToken, address token) { router = IUniswapV2Router02(_router); RewardToken = IERC20(_reflectionToken); _token = token; uint8 rewardTokenDecimals = TokenUtils.expectDecimals(token); uint256 fixedPoint = 10 ** rewardTokenDecimals; minDistribution = 1 * fixedPoint; } function setDistributionCriteria( uint256 _minPeriod, uint256 _minDistribution ) external override onlyToken { minPeriod = _minPeriod; minDistribution = _minDistribution; } function getShareHolders() external view returns (address[] memory) { return shareholders; } function setMinPeriod(uint256 _minPeriod) external override onlyToken { minPeriod = _minPeriod; } function setMinDistribution( uint256 _minDistribution ) external override onlyToken { minDistribution = _minDistribution; } function setShare( address _shareholder, uint256 amount ) external override onlyToken { Share storage shareholder = shares[_shareholder]; uint256 shareholderAmount = shareholder.amount; if (shareholderAmount > 0) { distributeDividend(_shareholder); } if (amount > 0 && shareholderAmount == 0) { addShareholder(_shareholder); } else if (amount == 0 && shareholderAmount > 0) { removeShareholder(_shareholder); } totalShares = totalShares - shareholderAmount + amount; shareholder.amount = amount; shareholder.totalExcluded = getCumulativeDividends(amount); } function deposit() external payable override onlyToken { uint256 balanceBefore = RewardToken.balanceOf(address(this)); address[] memory path = new address[](2); path[0] = router.WETH(); path[1] = address(RewardToken); if (path[0] == path[1]) { //reward token is weth IWETH(path[0]).deposit{value: msg.value}(); } else { router.swapExactETHForTokensSupportingFeeOnTransferTokens{ value: msg.value }(0, path, address(this), block.timestamp); } uint256 amount = RewardToken.balanceOf(address(this)) - balanceBefore; totalDividends = totalDividends + amount; if (totalShares > 0) { dividendsPerShare = dividendsPerShare + (dividendsPerShareAccuracyFactor * amount) / totalShares; } } function process(uint256 gas) external override onlyToken { uint256 shareholderCount = shareholders.length; if (shareholderCount == 0) { return; } uint256 iterations = 0; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); while (gasUsed < gas && iterations < shareholderCount) { if (currentIndex >= shareholderCount) { currentIndex = 0; } if (shouldDistribute(shareholders[currentIndex])) { distributeDividend(shareholders[currentIndex]); } gasUsed = gasUsed + gasLeft - gasleft(); gasLeft = gasleft(); currentIndex++; iterations++; } } function shouldDistribute( address shareholder ) internal view returns (bool) { return shareholderClaims[shareholder] + minPeriod <= block.timestamp && getUnpaidEarnings(shareholder) >= minDistribution; } function distributeDividend(address _shareholder) internal { Share storage shareholder = shares[_shareholder]; if (shareholder.amount == 0) { return; } uint256 amount = getUnpaidEarnings(_shareholder); if (amount > 0) { totalDistributed = totalDistributed + amount; shareholderClaims[_shareholder] = block.timestamp; shareholder.totalExcluded = getCumulativeDividends(shareholder.amount); RewardToken.transfer(_shareholder, amount); } } function rewardTokenAddress() external view returns(address) { return address(RewardToken); } function claimDividend() external { require(shouldDistribute(msg.sender), "Too soon. Need to wait!"); distributeDividend(msg.sender); } function getUnpaidEarnings( address _shareholder ) public view returns (uint256) { Share storage shareholder = shares[_shareholder]; if (shareholder.amount == 0) { return 0; } uint256 shareholderTotalDividends = getCumulativeDividends(shareholder.amount); uint256 shareholderTotalExcluded = shareholder.totalExcluded; if (shareholderTotalDividends <= shareholderTotalExcluded) { return 0; } return shareholderTotalDividends - shareholderTotalExcluded; } function getCumulativeDividends( uint256 share ) internal view returns (uint256) { return (share * dividendsPerShare) / dividendsPerShareAccuracyFactor; } function addShareholder(address shareholder) internal { shareholderIndexes[shareholder] = shareholders.length; shareholders.push(shareholder); } function removeShareholder(address shareholder) internal { shareholders[shareholderIndexes[shareholder]] = shareholders[ shareholders.length - 1 ]; shareholderIndexes[ shareholders[shareholders.length - 1] ] = shareholderIndexes[shareholder]; shareholders.pop(); } }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface IDividendDistributor { function setDistributionCriteria( uint256 _minPeriod, uint256 _minDistribution ) external; function setShare(address shareholder, uint256 amount) external; function deposit() external payable; function process(uint256 gas) external; function setMinPeriod(uint256 _minPeriod) external; function setMinDistribution(uint256 _minDistribution) external; function rewardTokenAddress() external view returns(address); }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { function totalSupply() external view returns (uint256); function ownerOf(uint256 tokenId) external view returns (address owner); }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface IFACTORY { function proofRevenueAddress() external view returns (address); function proofRewardPoolAddress() external view returns (address); function isWhitelisted(address user) external view returns(bool); }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface IProofFactory { struct ProofToken { bool status; address pair; address owner; uint256 unlockTime; uint256 lockId; } struct WhitelistAdd_ { address[] whitelists; } struct TokenParam { string tokenName; string tokenSymbol; uint256 initialSupply; uint256 percentToLP; address reflectionToken; address devWallet; uint256 initialReflectionFee; uint256 initialReflectionFeeOnSell; uint256 initialLpFee; uint256 initialLpFeeOnSell; uint256 initialDevFee; uint256 initialDevFeeOnSell; uint256 unlockTime; uint256 whitelistPeriod; address[] whitelists; } event TokenCreated(address _address); function createToken(TokenParam memory _tokenParam) external payable; function addmoreWhitelist(address tokenAddress, WhitelistAdd_ memory _WhitelistAdd) external; function finalizeToken(address tokenAddress) external payable; }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; import "./IProofFactory.sol"; interface IProofFactoryGate { function updateProofFactory(address _newFactory) external; function createToken( IProofFactory.TokenParam memory _tokenParam, address _routerAddress, address _proofAdmin, address _owner ) external returns (address); }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "../libraries/ProofFactoryFees.sol"; interface IProofFactoryTokenCutter is IERC20, IERC20Metadata { struct BaseData { string tokenName; string tokenSymbol; uint256 initialSupply; uint256 percentToLP; uint256 whitelistPeriod; address owner; address devWallet; address reflectionToken; address routerAddress; address initialProofAdmin; address[] whitelists; address nftWhitelist; } struct WhitelistAdd_ { address [] whitelists; } function setBasicData( BaseData memory _baseData, ProofFactoryFees.allFees memory fees ) external; function pair() external view returns (address); function swapTradingStatus() external; function updateProofFactory(address _newFactory) external; function addMoreToWhitelist( WhitelistAdd_ memory _WhitelistAdd ) external; function updateWhitelistPeriod( uint256 _whitelistPeriod ) external; function changeIsTxLimitExempt( address holder, bool exempt ) external; function addNFTSnapshot() external; event DistributorFail(); function changeFees( uint256 initialMainFee, uint256 initialMainFeeOnSell, uint256 initialLpFee, uint256 initialLpFeeOnSell, uint256 initialDevFee, uint256 initialDevFeeOnSell ) external; }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface IUniswapV2Router02 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; import "./Context.sol"; abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; library ProofFactoryFees { struct allFees { uint256 reflectionFee; uint256 reflectionFeeOnSell; uint256 lpFee; uint256 lpFeeOnSell; uint256 devFee; uint256 devFeeOnSell; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.17; import "@openzeppelin/contracts/interfaces/IERC20Metadata.sol"; /// @title TokenUtils library TokenUtils { /// @dev A safe function to get the decimals of an ERC20 token. /// /// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an unexpected value. /// /// @param token The target token. /// /// @return The amount of decimals of the token. function expectDecimals(address token) internal view returns (uint8) { (bool success, bytes memory data) = token.staticcall( abi.encodeWithSelector(IERC20Metadata.decimals.selector) ); require (success, "invalid"); return abi.decode(data, (uint8)); } }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; import "../interfaces/IERC721A.sol"; import "../libraries/Ownable.sol"; import "../libraries/ProofFactoryFees.sol"; import "../interfaces/IFACTORY.sol"; import "../interfaces/IDividendDistributor.sol"; import "../interfaces/IUniswapV2Router02.sol"; import "../DividendDistributor.sol"; import "../interfaces/IProofFactoryTokenCutter.sol"; contract ProofFactoryTokenCutter is Ownable, IProofFactoryTokenCutter { //This token was created with PROOF, and audited by Solidity Finance — https://proofplatform.io/projects IDividendDistributor public dividendDistributor; uint256 distributorGas = 50000; mapping(address => bool) public userWhitelist; IERC721A public nftWhitelist; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; uint256 public whitelistEndTime; uint256 public whitelistPeriod; bool public whitelistMode = true; string private _name; string private _symbol; address constant DEAD = 0x000000000000000000000000000000000000dEaD; address constant ZERO = 0x0000000000000000000000000000000000000000; address public proofAdmin; bool public restrictWhales = true; mapping(address => bool) public isFeeExempt; mapping(address => bool) public isTxLimitExempt; mapping(address => bool) public isDividendExempt; uint256 public launchedAt; uint256 public revenueFee = 2; uint256 public revenueFeeOnSell = 2; uint256 public reflectionFee; uint256 public lpFee; uint256 public devFee; uint256 public reflectionFeeOnSell; uint256 public lpFeeOnSell; uint256 public devFeeOnSell; uint256 public totalFee; uint256 public totalFeeIfSelling; uint256 accLpFees; uint256 accDevFees; uint256 accRevenueFees; uint256 accReflectionFees; bool public proofFeeRemoved = false; bool public proofFeeReduced = false; IUniswapV2Router02 public router; address public pair; address public factory; address payable public devWallet; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; bool public tradingStatus = true; uint256 public _maxTxAmount; uint256 public _walletMax; uint256 public swapThreshold; constructor() { factory = msg.sender; } modifier lockTheSwap() { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } modifier onlyProofAdmin() { require( proofAdmin == _msgSender(), "not the proofAdmin" ); _; } modifier onlyFactory() { require(factory == _msgSender(), "not the factory"); _; } function setBasicData( BaseData memory _baseData, ProofFactoryFees.allFees memory fees ) external onlyFactory { _name = _baseData.tokenName; _symbol = _baseData.tokenSymbol; _totalSupply += _baseData.initialSupply; //Initial supply require(_baseData.percentToLP >= 70, "low lp"); uint256 forLP = (_baseData.initialSupply * _baseData.percentToLP) / 100; //95% uint256 forOwner = _baseData.initialSupply - forLP; //5% _balances[msg.sender] += forLP; _balances[_baseData.owner] += forOwner; emit Transfer(address(0), msg.sender, forLP); emit Transfer(address(0), _baseData.owner, forOwner); _maxTxAmount = (_baseData.initialSupply * 5) / 1000; _walletMax = (_baseData.initialSupply * 1) / 100; swapThreshold = (_baseData.initialSupply * 5) / 4000; router = IUniswapV2Router02(_baseData.routerAddress); pair = IUniswapV2Factory(router.factory()).createPair( router.WETH(), address(this) ); _allowances[address(this)][address(router)] = type(uint256).max; dividendDistributor = new DividendDistributor( _baseData.routerAddress, _baseData.reflectionToken, address(this) ); userWhitelist[address(this)] = true; userWhitelist[factory] = true; userWhitelist[pair] = true; userWhitelist[_baseData.owner] = true; userWhitelist[_baseData.initialProofAdmin] = true; userWhitelist[_baseData.routerAddress] = true; _addWhitelist(_baseData.whitelists); nftWhitelist = IERC721A(_baseData.nftWhitelist); isFeeExempt[address(this)] = true; isFeeExempt[factory] = true; isTxLimitExempt[address(this)] = true; isTxLimitExempt[_baseData.owner] = true; isTxLimitExempt[pair] = true; isTxLimitExempt[factory] = true; isTxLimitExempt[DEAD] = true; isTxLimitExempt[ZERO] = true; isDividendExempt[pair] = true; isDividendExempt[address(this)] = true; isDividendExempt[DEAD] = true; isDividendExempt[ZERO] = true; whitelistPeriod = _baseData.whitelistPeriod; reflectionFee = fees.reflectionFee; lpFee = fees.lpFee; devFee = fees.devFee; reflectionFeeOnSell = fees.reflectionFeeOnSell; lpFeeOnSell = fees.lpFeeOnSell; devFeeOnSell = fees.devFeeOnSell; _calcTotalFee(); devWallet = payable(_baseData.devWallet); proofAdmin = _baseData.initialProofAdmin; } //proofAdmin functions function updateProofAdmin( address newAdmin ) external virtual onlyProofAdmin { proofAdmin = newAdmin; userWhitelist[newAdmin] = true; } function updateWhitelistPeriod( uint256 _whitelistPeriod ) external onlyProofAdmin { whitelistPeriod = _whitelistPeriod; whitelistEndTime = launchedAt + (60 * _whitelistPeriod); whitelistMode = true; } //Factory functions function updateProofFactory(address newFactory) external onlyFactory { userWhitelist[newFactory] = true; isTxLimitExempt[newFactory] = true; isFeeExempt[newFactory] = true; factory = newFactory; } function swapTradingStatus() external onlyFactory { tradingStatus = !tradingStatus; } function setLaunchedAt() external onlyFactory { require(launchedAt == 0, "already launched"); launchedAt = block.timestamp; whitelistEndTime = block.timestamp + (60 * whitelistPeriod); whitelistMode = true; } function cancelToken() external onlyFactory { isFeeExempt[address(router)] = true; isTxLimitExempt[address(router)] = true; isTxLimitExempt[owner()] = true; tradingStatus = true; restrictWhales = false; swapAndLiquifyEnabled = false; } //Owner functions function changeFees( uint256 initialReflectionFee, uint256 initialReflectionFeeOnSell, uint256 initialLpFee, uint256 initialLpFeeOnSell, uint256 initialDevFee, uint256 initialDevFeeOnSell ) external onlyOwner { reflectionFee = initialReflectionFee; lpFee = initialLpFee; devFee = initialDevFee; reflectionFeeOnSell = initialReflectionFeeOnSell; lpFeeOnSell = initialLpFeeOnSell; devFeeOnSell = initialDevFeeOnSell; _calcTotalFee(); } function changeTxLimit(uint256 newLimit) external onlyOwner { _checkLimit(newLimit); _maxTxAmount = newLimit; } function changeWalletLimit(uint256 newLimit) external onlyOwner { _checkLimit(newLimit); _walletMax = newLimit; } function changeRestrictWhales(bool newValue) external onlyOwner { restrictWhales = newValue; } function changeIsFeeExempt(address holder, bool exempt) external onlyOwner { isFeeExempt[holder] = exempt; } function changeIsTxLimitExempt( address holder, bool exempt ) external onlyOwner { isTxLimitExempt[holder] = exempt; } function changeDistributorGas(uint256 _distributorGas) external onlyOwner { distributorGas = _distributorGas; } function changeMinDistSettings( uint256 _minPeriod, uint256 _minDistLimit ) external onlyOwner { dividendDistributor.setMinPeriod(_minPeriod); dividendDistributor.setMinDistribution(_minDistLimit); } function setDevWallet(address payable newDevWallet) external onlyOwner { devWallet = payable(newDevWallet); } function changeSwapBackSettings( bool enableSwapBack, uint256 newSwapBackLimit ) external onlyOwner { swapAndLiquifyEnabled = enableSwapBack; swapThreshold = newSwapBackLimit; } function setDistributionCriteria( uint256 newMinPeriod_, uint256 newMinDistribution_ ) external onlyOwner { dividendDistributor.setDistributionCriteria( newMinPeriod_, newMinDistribution_ ); } function getCirculatingSupply() external view returns (uint256) { return _totalSupply - balanceOf(DEAD) - balanceOf(ZERO); } function rewardTokenAddress() external view returns(address) { return dividendDistributor.rewardTokenAddress(); } function isWhitelisted(address user) public view returns (bool) { return userWhitelist[user]; } function name() external view virtual override returns (string memory) { return _name; } function symbol() external view virtual override returns (string memory) { return _symbol; } function decimals() external view virtual override returns (uint8) { return 9; } function totalSupply() external view virtual override returns (uint256) { return _totalSupply; } function balanceOf( address account ) public view virtual override returns (uint256) { return _balances[account]; } function transfer( address to, uint256 amount ) external virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } function allowance( address owner, address spender ) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve( address spender, uint256 amount ) external virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } function transferFrom( address from, address to, uint256 amount ) external virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } function increaseAllowance( address spender, uint256 addedValue ) external virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } function decreaseAllowance( address spender, uint256 subtractedValue ) external virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require( currentAllowance >= subtractedValue, "Decreased allowance below zero" ); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } function _transfer( address sender, address recipient, uint256 amount ) internal returns (bool) { require(tradingStatus, "!trading"); if(whitelistMode) { if (block.timestamp >= whitelistEndTime ) { whitelistMode = false; } else { if (sender == pair) { //buy require(isWhitelisted(recipient), "Not whitelisted"); } else if (recipient == pair) { //sell require(isWhitelisted(sender), "Not whitelisted"); } else { //transfer require(isWhitelisted(sender) && isWhitelisted(recipient), "Not Whitelisted"); } } } if (!proofFeeRemoved && launchedAt != 0) { //first 31 days only if (!proofFeeReduced) { //case where proofFee is still 2, check if we can reduce if (block.timestamp > launchedAt + 86400) { _calcTotalFee(); } } else { //case where proofFee gas been reduced already, check if we can remove if (block.timestamp > launchedAt + 31 days) { _calcTotalFee(); } } } if (inSwapAndLiquify) { return _basicTransfer(sender, recipient, amount); } if (recipient == pair && restrictWhales) { require( amount <= _maxTxAmount || (isTxLimitExempt[sender] && isTxLimitExempt[recipient]), "Max TX" ); } if (!isTxLimitExempt[recipient] && restrictWhales) { require(_balances[recipient] + amount <= _walletMax, "wallet"); } if ( sender != pair && !inSwapAndLiquify && swapAndLiquifyEnabled && (accDevFees + accLpFees + accReflectionFees + accRevenueFees) >= swapThreshold ) { swapBack(); } _balances[sender] = _balances[sender] - amount; uint256 finalAmount = amount; if (sender == pair || recipient == pair) { finalAmount = !isFeeExempt[sender] && !isFeeExempt[recipient] ? takeFee(sender, recipient, amount) : amount; } _balances[recipient] = _balances[recipient] + finalAmount; // Dividend tracker if (!isDividendExempt[sender]) { try dividendDistributor.setShare(sender, _balances[sender]) {} catch { emit DistributorFail(); } } if (!isDividendExempt[recipient]) { try dividendDistributor.setShare(recipient, _balances[recipient]) {} catch { emit DistributorFail(); } } try dividendDistributor.process(distributorGas) {} catch { emit DistributorFail(); } emit Transfer(sender, recipient, finalAmount); return true; } function _basicTransfer( address sender, address recipient, uint256 amount ) internal returns (bool) { _balances[sender] = _balances[sender] - amount; _balances[recipient] = _balances[recipient] + amount; emit Transfer(sender, recipient, amount); return true; } function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "Approve from the zero address"); require(spender != address(0), "Approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require( currentAllowance >= amount, "Insufficient allowance" ); unchecked { _approve(owner, spender, currentAllowance - amount); } } } function takeFee( address sender, address recipient, uint256 amount ) internal returns (uint256) { uint256 feeApplicable; uint256 _lpApplicable; uint256 _devApplicable; uint256 _proofApplicable; uint256 _reflectionApplicable; if (pair == recipient) { feeApplicable = totalFeeIfSelling; _lpApplicable = lpFeeOnSell; _devApplicable = devFeeOnSell; _proofApplicable = revenueFeeOnSell; _reflectionApplicable = reflectionFeeOnSell; } else { feeApplicable = totalFee; _lpApplicable = lpFee; _devApplicable = devFee; _proofApplicable = revenueFee; _reflectionApplicable = reflectionFee; } if (feeApplicable == 0) return(amount); uint256 feeAmount = (amount * feeApplicable) / 100; accLpFees += feeAmount * _lpApplicable / feeApplicable; accDevFees += feeAmount * _devApplicable / feeApplicable; accRevenueFees += feeAmount * _proofApplicable / feeApplicable; accReflectionFees += feeAmount * _reflectionApplicable / feeApplicable; _balances[address(this)] = _balances[address(this)] + feeAmount; emit Transfer(sender, address(this), feeAmount); return amount - feeAmount; } function swapBack() internal lockTheSwap { uint256 tokensToLiquify = swapThreshold; uint256 lpProportion = accLpFees; uint256 devProportion = accDevFees; uint256 proofProportion = accRevenueFees; uint256 reflectionProportion = accReflectionFees; uint256 totalProportion = lpProportion + devProportion + proofProportion + reflectionProportion; uint256 lpAmt = tokensToLiquify * lpProportion / totalProportion; uint256 amountToLiquify = lpAmt / 2; if (tokensToLiquify - amountToLiquify == 0) return; address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); router.swapExactTokensForETHSupportingFeeOnTransferTokens( (tokensToLiquify - amountToLiquify), 0, path, address(this), block.timestamp ); uint256 amountA; if (amountToLiquify > 0) { (amountA,,) = router.addLiquidityETH{value: ((address(this).balance * amountToLiquify) / (totalProportion - amountToLiquify))}( address(this), amountToLiquify, 0, 0, 0x000000000000000000000000000000000000dEaD, block.timestamp ); } accLpFees = lpProportion < (lpAmt - (amountToLiquify - amountA)) ? 0 : (lpProportion - (lpAmt - (amountToLiquify - amountA))); if (totalProportion - lpProportion == 0) return; uint256 amountETHafterLP = address(this).balance; uint256 devBalance = amountETHafterLP * devProportion / (devProportion + proofProportion + reflectionProportion); uint256 revenueBalance = (amountETHafterLP * proofProportion) / (devProportion + proofProportion + reflectionProportion); uint256 amountEthReflection = amountETHafterLP - devBalance - revenueBalance; accDevFees = devProportion < (tokensToLiquify * devProportion / totalProportion) ? 0 : (devProportion - (tokensToLiquify * devProportion / totalProportion)); accRevenueFees = proofProportion < (tokensToLiquify * proofProportion / totalProportion) ? 0 : (proofProportion - (tokensToLiquify * proofProportion / totalProportion)); accReflectionFees = reflectionProportion < (tokensToLiquify * reflectionProportion / totalProportion) ? 0 : (reflectionProportion - (tokensToLiquify * reflectionProportion / totalProportion)); if (amountETHafterLP > 0) { if (revenueBalance > 0) { uint256 revenueSplit = revenueBalance / 2; (bool sent, ) = payable(IFACTORY(factory).proofRevenueAddress()).call{value: revenueSplit}(""); require(sent); (bool sent1, ) = payable(IFACTORY(factory).proofRewardPoolAddress()).call{value: revenueSplit}(""); require(sent1); } if (devBalance > 0) { (bool sent, ) = devWallet.call{value: devBalance}(""); require(sent); } } try dividendDistributor.deposit{value: amountEthReflection}() {} catch { emit DistributorFail(); } } function _checkLimit(uint256 _newLimit) internal view { require(launchedAt != 0, "!launched"); require(_newLimit >= (_totalSupply * 5) / 1000, "Min 0.5%"); require(_newLimit <= (_totalSupply * 3) / 100, "Max 3%"); } function _calcTotalFee() internal { uint256 _devFee = devFee; uint256 _lpFee = lpFee; uint256 _reflectionFee = reflectionFee; uint256 _devFeeOnSell = devFeeOnSell; uint256 _lpFeeOnSell = lpFeeOnSell; uint256 _reflectionFeeOnSell = reflectionFeeOnSell; if (!proofFeeRemoved && launchedAt != 0) { //first 31 days only if (!proofFeeReduced) { //case where proofFee is still 2, check if we can reduce if (block.timestamp > launchedAt + 86400) { revenueFee = 1; revenueFeeOnSell = 1; proofFeeReduced = true; } else { revenueFee = 2; revenueFeeOnSell = 2; } } else { //case where it is 1, check if we can remove if (block.timestamp > launchedAt + 31 days) { revenueFee = 0; revenueFeeOnSell = 0; proofFeeRemoved = true; } else { revenueFee = 1; revenueFeeOnSell = 1; } } } if (_devFee + _lpFee + _reflectionFee == 0) { revenueFee = 0; } totalFee = _devFee + _lpFee + _reflectionFee + revenueFee; if (_devFeeOnSell + _lpFeeOnSell + _reflectionFeeOnSell == 0) { revenueFeeOnSell = 0; } totalFeeIfSelling = _devFeeOnSell + _lpFeeOnSell + _reflectionFeeOnSell + revenueFeeOnSell; if (IFACTORY(factory).isWhitelisted(owner())) { require(totalFee <= 12, "high KYC fee"); require(totalFeeIfSelling <= 17, "high KYC fee"); } else { require(totalFee <= 7, "high fee"); require(totalFeeIfSelling <= 7, "high fee"); } } function _addWhitelist(address[] memory _whitelists) internal { uint256 length = _whitelists.length; for (uint256 i = 0; i < length; i++) { userWhitelist[_whitelists[i]] = true; } } function addMoreToWhitelist(WhitelistAdd_ memory _WhitelistAdd) external onlyFactory { _addWhitelist(_WhitelistAdd.whitelists); } function addNFTSnapshot() external onlyFactory { uint256 len = nftWhitelist.totalSupply() + 1; for (uint256 i = 1; i < len; ) { userWhitelist[nftWhitelist.ownerOf(i)] = true; unchecked { ++i; } } } function withdrawAndSync() external onlyOwner { _transfer(address(this), msg.sender, balanceOf(address(this)) - (accDevFees + accLpFees + accReflectionFees + accRevenueFees)); } receive() external payable {} }
{ "optimizer": { "enabled": true, "runs": 200, "details": { "yul": true } }, "viaIR": true, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_nftWhitelist","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"components":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"percentToLP","type":"uint256"},{"internalType":"address","name":"reflectionToken","type":"address"},{"internalType":"address","name":"devWallet","type":"address"},{"internalType":"uint256","name":"initialReflectionFee","type":"uint256"},{"internalType":"uint256","name":"initialReflectionFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"initialLpFee","type":"uint256"},{"internalType":"uint256","name":"initialLpFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"initialDevFee","type":"uint256"},{"internalType":"uint256","name":"initialDevFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"uint256","name":"whitelistPeriod","type":"uint256"},{"internalType":"address[]","name":"whitelists","type":"address[]"}],"internalType":"struct IProofFactory.TokenParam","name":"tokenParam_","type":"tuple"},{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"address","name":"_proofAdmin","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"createToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftWhitelist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newNFTWhitelist","type":"address"}],"name":"setBaseNFTWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proofFactory","type":"address"}],"name":"updateProofFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080346100a757601f615a6f38819003918201601f19168301916001600160401b038311848410176100ac578084926020946040528339810103126100a757516001600160a01b0390818116908190036100a75760005460018060a01b0319903382821617600055604051933391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a360025416176002556159ac90816100c38239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c9081630ab16c1914610b7b575080633af32abf14610aeb57806342cb2e7914610aab57806364d817fa14610a2b578063715018a6146109d15780638da5cb5b146109aa5780639f2560b01461016b578063bbd45223146101425763f2fde38b0361000f573461013f57602036600319011261013f576100a2610ba0565b6100aa610d5a565b6001600160a01b039081169081156100fa57600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b60405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f20616464726573730000006044820152606490fd5b80fd5b503461013f578060031936011261013f576001546040516001600160a01b039091168152602090f35b503461013f576003199060803683011261013f576001600160401b036004351161013f576101e080926004353603011261013f576040519182018281106001600160401b0382111761099657604052600435600401356001600160401b038111610885576101e0906004369181350101610c1e565b8252602460043501356001600160401b03811161088557610208906004369181350101610c1e565b6020830152600435604481013560408401526064810135606084015261023090608401610bbb565b608083015261024360a460043501610bbb565b60a083015260043560c481013560c084015260e481013560e08401526101048101356101008401526101248101356101208401526101448101356101408401526101648101356101608401526101848101356101808401526101a48101356101a08401526101c401356001600160401b038111610885573660238260043501011215610885576001600160401b036004828135010135116109965760405190600481813501013560051b6102fa6020820184610be2565b60048281350101358352602083019036602482856004350101011161099257906024836004350101915b60248185600435010101831061097657505050506101c08301526024356001600160a01b038116900361013f576044356001600160a01b038116900361013f576064356001600160a01b0381168103610885576001546001600160a01b031633036109425760c08301519060e08401516101008501516101208601516101408701519161016088015193604051968760c08101106001600160401b0360c08a01111761092e5760c088016040528752602087015260408601526060850152608084015260a083015260405180614bc38101106001600160401b03614bc38301111761091a57614bc3610db4823980614bc38101039084f0801561090f576001600160a01b031693843b1561090b5760405163f2fde38b60e01b81526001600160a01b03831660048201528481602481838a5af18015610900576108ed575b508051916020820151916040810151916060820151906101a083015160018060a01b0360a085015116926101c060018060a01b036080870151169501519560018060a01b036002541697604051998a6101808101106001600160401b036101808d011117610845576101808b016040528a5260208a015260408901526060880152608087015260018060a01b031660a086015260c085015260e084015260018060a01b036024351661010084015260018060a01b0360443516610120840152610140830152610160820152833b156108e95782604051809363329acc4960e11b825260e0600483015261057d610566855161018060e4860152610264850190610c65565b602086015184820360e31901610104860152610c65565b60408501516101248401526060850151610144840152608085015161016484015260a08501516001600160a01b0390811661018485015260c086015181166101a485015260e086015181166101c485015261010086015181166101e48501526101208601511661020484015261014085015183820360e3190161022485015280518083526020928301969290910190855b8181106108c45750505061016001516001600160a01b031661024483015280516024830152602081015160448301526040810151606483015260608101516084830152608081015160a483015260a0015160c482015290918190038183875af18015610891579082916108b0575b50506001546001600160a01b0316823b15610885576040519063326c0bfd60e11b82526004820152818160248183875af180156108915790829161089c575b50506040516370a0823160e01b8152306004820152602081602481865afa90811561089157829161085b575b5060018060a01b03600154169160405191602083019363a9059cbb60e01b8552602484015260448301526044825260808201918083106001600160401b038411176108455760c081018381106001600160401b0382111761084557604052602083527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656460a0820152516107ab938291829182885af13d1561083c573d61078c81610c03565b9061079a6040519283610be2565b8152809260203d92013e5b84610cbd565b8051908115918215610822575b5050156107ca57602090604051908152f35b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6108359250602080918301019101610ca5565b38806107b8565b606091506107a5565b634e487b7160e01b600052604160045260246000fd5b90506020813d602011610889575b8161087660209383610be2565b810103126108855751386106e7565b5080fd5b3d9150610869565b6040513d84823e3d90fd5b6108a590610bcf565b61013f5780386106bb565b6108b990610bcf565b61013f57803861067c565b82516001600160a01b031688526020978801978a97508996509092019160010161060e565b8280fd5b6108f990949194610bcf565b9238610462565b6040513d87823e3d90fd5b8380fd5b6040513d85823e3d90fd5b634e487b7160e01b84526041600452602484fd5b634e487b7160e01b89526041600452602489fd5b60405162461bcd60e51b815260206004820152600c60248201526b6f6e6c7920666163746f727960a01b6044820152606490fd5b60208060249361098586610bbb565b8152019301929150610324565b8480fd5b634e487b7160e01b82526041600452602482fd5b503461013f578060031936011261013f57546040516001600160a01b039091168152602090f35b503461013f578060031936011261013f576109ea610d5a565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461013f57602036600319011261013f57610a45610ba0565b610a4d610d5a565b6001600160a01b03168015610a72576001600160601b0360a01b600154161760015580f35b60405162461bcd60e51b81526020600482015260116024820152707a65726f2050726f6f66466163746f727960781b6044820152606490fd5b503461013f57602036600319011261013f57610ac5610ba0565b610acd610d5a565b60018060a01b03166001600160601b0360a01b600254161760025580f35b503461013f57602036600319011261013f57610b05610ba0565b600154604051633af32abf60e01b81526001600160a01b0392831660048201529160209183916024918391165afa9081156108915760209291610b4e575b506040519015158152f35b610b6e9150823d8111610b74575b610b668183610be2565b810190610ca5565b38610b43565b503d610b5c565b9050346108855781600319360112610885576002546001600160a01b03168152602090f35b600435906001600160a01b0382168203610bb657565b600080fd5b35906001600160a01b0382168203610bb657565b6001600160401b03811161084557604052565b90601f801991011681019081106001600160401b0382111761084557604052565b6001600160401b03811161084557601f01601f191660200190565b81601f82011215610bb657803590610c3582610c03565b92610c436040519485610be2565b82845260208383010111610bb657816000926020809301838601378301015290565b919082519283825260005b848110610c91575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610c70565b90816020910312610bb657518015158103610bb65790565b91929015610d1f5750815115610cd1575090565b3b15610cda5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610d325750805190602001fd5b60405162461bcd60e51b815260206004820152908190610d56906024830190610c65565b0390fd5b6000546001600160a01b03163303610d6e57565b60405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606490fdfe608080604052346100b75760008054336001600160a01b0319808316821784559290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a361c3506002908155600a805460ff19166001179055600d805460ff60a01b1916600160a01b17905560128190556013556020805461ffff191690556023805461ffff60a81b191661010160a81b1790556022805490911633179055614b0690816100bd8239f35b600080fdfe60808060405260043610156200001f575b5036156200001d57600080fd5b005b600090813560e01c9081630445b66714620022a25750806306fdde0314620021ff578063095ea7b314620021d25780630ab16c1914620021a7578063125f9e33146200212c57806316d9962b146200210557806318160ddd14620020e55780631df4ccfc14620020c55780631f53ac02146200207b57806323b872dd1462001fba57806327193bc41462001f1a5780632b112e491462001eca5780632d48e8961462001e58578063313ce5671462001e3a57806336e4ec641462001e1a578063395093511462001dc15780633af32abf146200095c5780633dab52691462001d735780633f4218e01462001d305780634355855a1462001ced57806344de2e4c1462001cc5578063461e5d3f1462001ca5578063497a000a1462001c2e5780634a74bb021462001c06578063546a88111462001b6457806359a51c341462001b395780635fef86801462001ac757806364d817fa1462001a39578063653598921462000fe75780636827e7641462000fc7578063704ce43e1462000fa757806370a082311462000f6a57806370c757ec1462000f45578063715018a61462000ee75780637c0ff2051462000ec75780637d1db4a51462000ea75780637db1342c1462000e75578063807c2d9c1462000e55578063838420131462000e3157806383ad79941462000e1157806388cda8731462000dea5780638b42507f1462000da75780638da5cb5b1462000d7e5780638ea5220f1462000d535780639502c4261462000d3357806395d89b411462000c51578063a3a2e89e1462000bf6578063a457c2d71462000b4d578063a8aa1b311462000b22578063a9059cbb1462000ae9578063b48e665e1462000ac9578063bad3ea6a1462000a9e578063bf56b3711462000a7e578063c45a01551462000a53578063ca987b0e1462000a33578063cb29813c14620009e7578063cc6badb314620009c7578063d4fb9a01146200099f578063d741b9c3146200095c578063d920334e146200092a578063dd62ed3e14620008d5578063e4cbd6b314620007f5578063e572967b1462000746578063e66b1d1e14620006fe578063ebdfd72214620006de578063f16fd78d1462000678578063f2fde38b14620005ba578063f576f5391462000457578063f887ea40146200042a578063fabe628314620003cc5763fbd7575303620000105734620003c95780600319360112620003c957620003a560018060a01b03602254163314620024fa565b6023805460ff60b01b19811660b091821c60ff161590911b60ff60b01b1617905580f35b80fd5b5034620003c9576040366003190112620003c95762000427620003ee6200230b565b620003f86200237a565b9062000403620024a0565b60018060a01b03168352600f602052604083209060ff801983541691151516179055565b80f35b5034620003c95780600319360112620003c9576020805460405160109190911c6001600160a01b03168152f35b5034620003c95780600319360112620003c9576022546001600160a01b0390620004859082163314620024fa565b806004541660405180916318160ddd60e01b825281600460209384935afa918215620005af57849262000576575b506001928383018093116200056257835b838110620004d0578580f35b602490838360045416604051938480926331a9108f60e11b82528560048301525afa918215620005575786928491899162000523575b501687526003845260408720805460ff19168317905501620004c4565b620005489150863d88116200054f575b6200053f81836200239e565b810190620025dd565b3862000506565b503d62000533565b6040513d89823e3d90fd5b634e487b7160e01b85526011600452602485fd5b9080925081813d8311620005a7575b6200059181836200239e565b81010312620005a357519038620004b3565b8380fd5b503d62000585565b6040513d86823e3d90fd5b5034620003c9576020366003190112620003c957620005d86200230b565b620005e2620024a0565b6001600160a01b039081169081156200063357600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b60405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f20616464726573730000006044820152606490fd5b5034620003c9576020366003190112620003c957620006966200230b565b600d54906001600160a01b0390620006b28284163314620025fe565b1680916001600160601b0360a01b1617600d558152600360205260408120600160ff1982541617905580f35b5034620003c95780600319360112620003c9576020600854604051908152f35b5034620003c9576020366003190112620003c9576200071c6200236a565b62000726620024a0565b600d805460ff60a01b191691151560a01b60ff60a01b1691909117905580f35b5034620003c957600319602036820112620007f157600435906001600160401b0390818311620005a3576020908336030112620007ed57604051906020820182811082821117620007d7576040528260040135908111620005a35762000427926004620007b7923692010162002429565b8152620007d060018060a01b03602254163314620024fa565b51620039bf565b634e487b7160e01b600052604160045260246000fd5b8280fd5b5080fd5b5034620003c95780620008083662002353565b9062000813620024a0565b6001546001600160a01b039190821690813b15620008d157849160248392604051948593849263f821076960e01b845260048401525af1908115620005af578491620008b9575b50506001541690813b15620008b5578291602483926040519485938492635117196160e01b845260048401525af18015620008aa57620008975750f35b620008a2906200238a565b620003c95780f35b6040513d84823e3d90fd5b5050fd5b620008c4906200238a565b620008b55782386200085a565b8480fd5b5034620003c9576040366003190112620003c957620008f36200230b565b6040620008ff62002327565b9260018060a01b03809316815260066020522091166000526020526020604060002054604051908152f35b5034620003c9576020366003190112620003c9576004356200094b620024a0565b620009568162003603565b60245580f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b036200098b6200230b565b168152600384522054166040519015158152f35b5034620003c95780600319360112620003c957602060ff60235460b01c166040519015158152f35b5034620003c95780600319360112620003c9576020601754604051908152f35b5034620003c95760c0366003190112620003c95762000a05620024a0565b60043560145560443560155560843560165560243560175560643560185560a4356019556200042762003750565b5034620003c95780600319360112620003c9576020601b54604051908152f35b5034620003c95780600319360112620003c9576022546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c9576020601154604051908152f35b5034620003c95780600319360112620003c9576001546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c9576020600954604051908152f35b5034620003c9576040366003190112620003c95762000b1662000b0b6200230b565b60243590336200267f565b50602060405160018152f35b5034620003c95780600319360112620003c9576021546040516001600160a01b039091168152602090f35b5034620003c9576040366003190112620003c95762000b6b6200230b565b60406024359233815260066020522060018060a01b0382166000526020526040600020549180831062000bb15762000ba69203903362002d2d565b602060405160018152f35b60405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606490fd5b5034620003c9576040366003190112620003c9576200042762000c186200230b565b62000c226200237a565b9062000c2d620024a0565b60018060a01b03168352600e602052604083209060ff801983541691151516179055565b5034620003c95780600319360112620003c9576040519080600c5462000c778162002539565b8085529160019180831690811562000d06575060011462000cb7575b62000cb38562000ca6818703826200239e565b60405191829182620022c0565b0390f35b9250600c835260008051602062004a518339815191525b82841062000ced57505050810160200162000ca68262000cb362000c93565b8054602085870181019190915290930192810162000cce565b86955062000cb39693506020925062000ca694915060ff191682840152151560051b820101929362000c93565b5034620003c95780600319360112620003c9576020601954604051908152f35b5034620003c95780600319360112620003c9576023546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c957546040516001600160a01b039091168152602090f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b0362000dd66200230b565b168152600f84522054166040519015158152f35b5034620003c95780600319360112620003c957602060ff815460081c166040519015158152f35b5034620003c95780600319360112620003c9576020601454604051908152f35b5034620003c95780600319360112620003c957602060ff8154166040519015158152f35b5034620003c95780600319360112620003c9576020602554604051908152f35b5034620003c9576020366003190112620003c95760043562000e96620024a0565b62000ea18162003603565b60255580f35b5034620003c95780600319360112620003c9576020602454604051908152f35b5034620003c95780600319360112620003c9576020601854604051908152f35b5034620003c95780600319360112620003c95762000f04620024a0565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034620003c95780600319360112620003c957602060ff600a54166040519015158152f35b5034620003c9576020366003190112620003c9576020906040906001600160a01b0362000f966200230b565b168152600583522054604051908152f35b5034620003c95780600319360112620003c9576020601554604051908152f35b5034620003c95780600319360112620003c9576020601654604051908152f35b5034620003c9576003199060e036830112620003c9576001600160401b0360043511620003c957610180809260043536030112620003c9576040519182018281106001600160401b03821117620007d757604052600435600401356001600160401b038111620007f15762001064906004369181350101620023dc565b8252602460043501356001600160401b038111620007f1576200108f906004369181350101620023dc565b6020830152600435604481013560408401526064810135606084015260848101356080840152620010c39060a4016200233e565b60a0830152620010d860c4600435016200233e565b60c0830152620010ed60e4600435016200233e565b60e083015262001103610104600435016200233e565b6101008301526200111a610124600435016200233e565b6101208301526001600160401b03610144600435013511620003c9576200114d3660048035610144810135010162002429565b61014083015262001164610164600435016200233e565b61016083015260c0366023190112620003c9576040519060c082018281106001600160401b03821117620007d757604052602435825260443560208301526064356040830152608435606083015260a435608083015260c43560a0830152620011d960018060a01b03602254163314620024fa565b82519283516001600160401b03811162001a2557620011fa600b5462002539565b601f8111620019b6575b50602094601f82116001146200194057948394958293949262001934575b50508160011b916000199060031b1c191617600b555b60208101519283516001600160401b03811162001920576200125c600c5462002539565b601f8111620018b1575b506020601f82116001146200183857849582939495926200182c575b50508160011b916000199060031b1c191617600c555b620012aa604083015160075462002576565b6007556046606083015110620017fe576064620012d160408401516060850151906200259a565b0483620012e3826040860151620025cf565b91338252600560205260408220620012fd82825462002576565b905560a08501516001600160a01b0316825260056020526040822080546200132790859062002576565b905560405190815260008051602062004a7183398151915290828260203393a360a08501516040519384526001600160a01b031692602090a36040820151600581029080820460051490151715620017ea576103e89004602455604082015180800460011481151715620017ea5760649004602555604082015180600581020460051481151715620017ea57610fa0600591909102046026556101008201516020805462010000600160b01b031916601092831b62010000600160b01b03161780825560405163c45a015560e01b815286939092908390600490829085901c6001600160a01b03165afa9081156200175e576004928492620017c3575b506040516315ab88c960e31b815292602091849190829060101c6001600160a01b03165afa9182156200175e576020926044918591620017a1575b506040516364e329cb60e11b81526001600160a01b0391821660048201523060248201529485938492165af1908115620005af5784916200177d575b50602180546001600160a01b0319166001600160a01b03928316179055308452600660209081526040808620825460101c84166000908152925290819020600019905561010084015160e085015191519291821691166001600160401b03611022840190811190841117620017695761102262003a2f8439611022830190815260208101919091523060408201528190036060019084f09081156200175e57600180546001600160a01b0319166001600160a01b0393841617815530855260036020526040808620805460ff19908116841790915560225485168752818720805482168417905560215485168752818720805482168417905560a086810151861688528288208054831685179055610120870151861688528288208054831685179055610100870151909516875290862080549091169091179055610140830151620015e790620039bf565b61016083015160048054600180861b600019019384166001600160601b03871b9092169190911790915530808752600e60209081526040808920805460ff1990811686179091556022805487168b52828b208054831687179055848b52600f8452828b208054831687179055888a015187168b52828b2080548316871790556021805488168c52838c208054841688179055905487168b52828b20805483168717905561dead808c52838c2080548416881790558b8052838c20805484168817905590549096168a5260108352818a208054821686179055928952808920805484168517905593885283882080548316841790558780528388208054909216909217905560808086015160095583516014559183015160155590820151601655810151601755606081015160185501516019556200172462003750565b60c0810151602380546001600160a01b03199081166001600160a01b039384161790915561012090920151600d8054909316911617905580f35b6040513d85823e3d90fd5b634e487b7160e01b86526041600452602486fd5b6200179a915060203d6020116200054f576200053f81836200239e565b386200149b565b620017bc9150843d86116200054f576200053f81836200239e565b386200145f565b6020919250620017e290823d84116200054f576200053f81836200239e565b919062001424565b634e487b7160e01b84526011600452602484fd5b60405162461bcd60e51b815260206004820152600660248201526506c6f77206c760d41b6044820152606490fd5b01519050388062001282565b600c855260008051602062004a5183398151915290855b601f198416811062001898575060019394959683601f198116106200187e575b505050811b01600c5562001298565b015160001960f88460031b161c191690553880806200186f565b9091602060018192858b0151815501930191016200184f565b600c8552601f820160051c60008051602062004a51833981519152016020831062001909575b601f820160051c60008051602062004a51833981519152018110620018fd575062001266565b858155600101620018d7565b5060008051602062004a51833981519152620018d7565b634e487b7160e01b84526041600452602484fd5b01519050388062001222565b600b8452601f1982169560008051602062004a9183398151915291855b8881106200199d5750836001959697981062001983575b505050811b01600b5562001238565b015160001960f88460031b161c1916905538808062001974565b919260206001819286850151815501940192016200195d565b600b8452601f820160051c60008051602062004a91833981519152016020831062001a0e575b601f820160051c60008051602062004a9183398151915201811062001a02575062001204565b848155600101620019dc565b5060008051602062004a91833981519152620019dc565b634e487b7160e01b83526041600452602483fd5b5034620003c9576020366003190112620003c95762001a576200230b565b6022546001600160a01b03919062001a739083163314620024fa565b1680825260036020526040822060ff1990600182825416179055600f60205260408320600182825416179055600e602052600160408420918254161790556001600160601b0360a01b602254161760225580f35b5034620003c95780600319360112620003c95762001ae4620024a0565b308152600560205262001b3562001b2d604083205462001b2662001b1c62001b12601d54601c549062002576565b601f549062002576565b601e549062002576565b90620025cf565b33306200267f565b5080f35b5034620003c95780600319360112620003c957600d546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c9576022546001600160a01b039062001b929082163314620024fa565b8060205460101c168252600e602052604082209060ff19916001838254161790558060205460101c168352600f6020526040832060018382541617905582541682526001604083209182541617905560235460ff60a01b19600d5416600d55600160b01b9061ffff60a81b19161760235580f35b5034620003c95780600319360112620003c957602060ff60235460a81c166040519015158152f35b5034620003c9576020366003190112620003c95760043562001c5c60018060a01b03600d54163314620025fe565b8060095560115481603c0291603c83040362001c91579062001c7e9162002576565b600855600160ff19600a541617600a5580f35b634e487b7160e01b83526011600452602483fd5b5034620003c95780600319360112620003c9576020601354604051908152f35b5034620003c95780600319360112620003c957602060ff600d5460a01c166040519015158152f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b0362001d1c6200230b565b168152601084522054166040519015158152f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b0362001d5f6200230b565b168152600e84522054166040519015158152f35b5034620003c9576040366003190112620003c95762001d916200236a565b62001d9b620024a0565b6023805460ff60a81b191691151560a81b60ff60a81b1691909117905560243560265580f35b5034620003c9576040366003190112620003c95762000ba690604062001de66200230b565b9133815260066020522060018060a01b03821660005260205262001e1260243560406000205462002576565b903362002d2d565b5034620003c95780600319360112620003c9576020601254604051908152f35b5034620003c95780600319360112620003c957602060405160098152f35b5034620003c9578062001e6b3662002353565b62001e78929192620024a0565b6001546001600160a01b031692833b15620007ed576044908360405195869485936316a4744b60e11b8552600485015260248401525af18015620008aa5762001ebf575080f35b62000427906200238a565b5034620003c95780600319360112620003c95762001f12602091604062001f0160075461dead8452600586528284205490620025cf565b9180805260058552205490620025cf565b604051908152f35b5034620003c95780600319360112620003c95762001f4460018060a01b03602254163314620024fa565b60115462001f82574260115560095480603c0290603c82040362001f6e5762001c7e904262002576565b634e487b7160e01b82526011600452602482fd5b60405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b6044820152606490fd5b5034620003c9576060366003190112620003c95762001fd86200230b565b9062001fe362002327565b60406044359260018060a01b0385168152600660205281812033825260205220549260001984036200201c575b62000b1693506200267f565b8284106200203d57620020378362000b169503338362002d2d565b62002010565b60405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606490fd5b5034620003c9576020366003190112620003c9576004356001600160a01b03811690819003620007f157620020af620024a0565b6001600160601b0360a01b602354161760235580f35b5034620003c95780600319360112620003c9576020601a54604051908152f35b5034620003c95780600319360112620003c9576020600754604051908152f35b5034620003c9576020366003190112620003c95762002123620024a0565b60043560025580f35b5034620003c95780600319360112620003c95760015460405163125f9e3360e01b8152906001600160a01b03906020908390600490829085165afa9182156200175e576020939262002183575b5060405191168152f35b6200219f919250833d81116200054f576200053f81836200239e565b903862002179565b5034620003c95780600319360112620003c9576004546040516001600160a01b039091168152602090f35b5034620003c9576040366003190112620003c95762000ba6620021f46200230b565b602435903362002d2d565b5034620003c95780600319360112620003c9576040519080600b54620022258162002539565b8085529160019180831690811562000d065750600114620022535762000cb38562000ca6818703826200239e565b9250600b835260008051602062004a918339815191525b8284106200228957505050810160200162000ca68262000cb362000c93565b805460208587018101919091529093019281016200226a565b905034620007f15781600319360112620007f1576020906026548152f35b6020808252825181830181905290939260005b828110620022f657505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501620022d3565b600435906001600160a01b03821682036200232257565b600080fd5b602435906001600160a01b03821682036200232257565b35906001600160a01b03821682036200232257565b604090600319011262002322576004359060243590565b6004359081151582036200232257565b6024359081151582036200232257565b6001600160401b038111620007d757604052565b90601f801991011681019081106001600160401b03821117620007d757604052565b6001600160401b038111620007d757601f01601f191660200190565b81601f820112156200232257803590620023f682620023c0565b926200240660405194856200239e565b828452602083830101116200232257816000926020809301838601378301015290565b9080601f8301121562002322578135906001600160401b038211620007d7578160051b6040519360209362002461858401876200239e565b8552838086019282010192831162002322578301905b82821062002486575050505090565b83809162002494846200233e565b81520191019062002477565b6000546001600160a01b03163303620024b557565b60405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606490fd5b156200250257565b60405162461bcd60e51b815260206004820152600f60248201526e6e6f742074686520666163746f727960881b6044820152606490fd5b90600182811c921680156200256b575b60208310146200255557565b634e487b7160e01b600052602260045260246000fd5b91607f169162002549565b919082018092116200258457565b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156200258457565b8115620025b9570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116200258457565b908160209103126200232257516001600160a01b0381168103620023225790565b156200260657565b60405162461bcd60e51b81526020600482015260126024820152713737ba103a343290383937b7b320b236b4b760711b6044820152606490fd5b156200264857565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606490fd5b6023805460009460ff9492909160b01c85161562002cfd57600a5485811662002c1d575b50602092858454818116158062002c11575b62002ba0575b50825460a01c1662002b2e576021549697966001600160a01b0380831697918116968a9391928989148062002b1f575b62002aa4575b898552600f88526040958787838189205416158062002a95575b62002a3b575b5050848316998a14158062002a2c575b8062002a1e575b80620029f9575b620029d0575b508885526005918289526200274e8888882054620025cf565b8a8752838a5287872055878560215416808c14908115620029c5575b506200297e575b508a865282895262002787888888205462002576565b8b8752838a52878720558986526010895281878720541615620028e1575b50898552601088528585205416156200284f575b50506001541660025490803b15620007ed57602483928551948593849263ffb2c47960e01b845260048401525af1908162002833575b509660008051602062004a7183398151915294959697156000146200282c578060008051602062004ab183398151915291a15b51908152a3600190565b5062002822565b6200283f89916200238a565b6200284b5738620027ef565b8780fd5b82600154169087528484205491813b15620008d1578551630a5b654b60e11b81526001600160a01b039190911660048201526024810192909252839081908390604490829084905af19182620028c9575b5050620028c35760008051602062004ab18339815191528280a15b3880620027b9565b620028bb565b620028d4906200238a565b620007ed578238620028a0565b90919293948560015416848a528782205490803b15620007ed578851630a5b654b60e11b81526001600160a01b0394909416600485015260248401919091528290604490829084905af1908162002960575b508b94939291906200295a5760008051602062004ab18339815191528580a15b38620027a5565b62002953565b62002972909c91959493929c6200238a565b9a909192933862002933565b909750600e89528187872054161580620029b4575b15620029ae57620029a690848962002e1a565b963862002771565b620029a6565b508a86528187872054161562002993565b90508c14386200276a565b805460ff60a01b19908116600160a01b178255620029ed62002fb9565b81541690553862002735565b5062002a1362001b1c62001b12601d54601c549062002576565b60265411156200272f565b5081815460a81c1662002728565b5081815460a01c161562002721565b62002a5192939495969760058c52205462002576565b6025541062002a6857908b94939291878762002711565b855162461bcd60e51b81526004810189905260066024820152651dd85b1b195d60d21b6044820152606490fd5b5083600d5460a01c166200270b565b9091929350602454861180159062002af6575b1562002ac857908a939291620026f1565b60405162461bcd60e51b815260048101889052600660248201526509ac2f040a8b60d31b6044820152606490fd5b508382168b52600f87528060408c205416801562002ab75750888b528060408c20541662002ab7565b5080600d5460a01c16620026eb565b6001600160a01b0394851680885260058552604088205490965060008051602062004a7183398151915295925062002b68908490620025cf565b8688526005855260408820551694858152604062002b8a838284205462002576565b91878152600585522055604051908152a3600190565b60081c1662002bee5760115462015180810180911162002bda57421162002bca575b8538620026bb565b62002bd462003750565b62002bc2565b634e487b7160e01b88526011600452602488fd5b6011546228de80810180911162002bda5742111562002bc25762002bd462003750565b506011541515620026b5565b600854421062002c365760ff1916600a555b38620026a3565b506021546001600160a01b039085821690821681810362002c7357505083168652600360205262002c6d8560408820541662002640565b62002c2f565b9091851690810362002c9857508652600360205262002c6d8560408820541662002640565b908752600360205285604088205416908162002cec575b5062002c6d5760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606490fd5b875250604086205485163862002caf565b60405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b6044820152606490fd5b6001600160a01b0390811691821562002dd5571691821562002d905760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260068252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606490fd5b6021546001600160a01b039283169083160362002f6b57601b54916018549260195460135490601754915b831562002f61578380928162002e5c818c6200259a565b606490049962002e6d908b6200259a565b9062002e7991620025ae565b601c549062002e889162002576565b601c5562002e9790896200259a565b9062002ea391620025ae565b601d549062002eb29162002576565b601d5562002ec190876200259a565b9062002ecd91620025ae565b601e549062002edc9162002576565b601e5562002eeb90856200259a565b9062002ef791620025ae565b601f549062002f069162002576565b601f55306000526005602052826040600020549062002f259162002576565b3060005260056020526040600020556040519083825230921690602060008051602062004a7183398151915291a362002f5e91620025cf565b90565b5050505050505090565b601a549160155492601654601254906014549162002e45565b3d1562002fb4573d9062002f9882620023c0565b9162002fa860405193846200239e565b82523d6000602084013e565b606090565b602654600090601c54601d5491601e54601f5462002fe88162002fe28462002fe2898962002576565b62002576565b93620030008562002ffa83876200259a565b620025ae565b90620030108260011c86620025cf565b15620035f957604051606081018181106001600160401b03821117620035e557604052600281526040366020830137805115620035d15730602082015260018060a01b0360205460101c166040516315ab88c960e31b8152602081600481855afa908115620035c6578b91620035a2575b508251600110156200358e576001600160a01b03166040830152620030ab600185901c88620025cf565b91813b156200358a57918a9160405193849263791ac94760e01b845260a4840190600485015284602485015260a060448501528151809152602060c48501920190855b81811062003564575050508383809230606483015242608483015203925af1801562003543576200354e575b50878260011c62003473575b9182620031466200313f6200315c958460011c620025cf565b83620025cf565b8310156200344e575050875b601c5585620025cf565b156200344657859347916200318e6200317688856200259a565b620031878362002fe2888c62002576565b90620025ae565b94620031b06200319f86866200259a565b620031878462002fe2898d62002576565b94620031c886620031c28988620025cf565b620025cf565b98620031da8562002ffa83866200259a565b8110156200342a5750875b601d55620031f98462002ffa83856200259a565b8110156200340e5750865b601e55620032188362002ffa84846200259a565b821015620033f357505050835b601f556200329d575b50506001546001600160a01b03169050803b15620007ed57828091600460405180958193630d0e30db60e41b83525af1918262003285575b505062003282578060008051602062004ab183398151915291a1565b50565b62003290906200238a565b620007f157813862003266565b80620032e1575b5080620032b3575b806200322e565b602354829182918291906001600160a01b03165af1620032d262002f84565b5015620007f1578138620032ac565b90915060011c6004602060018060a01b036022541660405192838092633690e28760e01b82525afa908115620033c457858084819482948391620033cf575b506001600160a01b03165af16200333662002f84565b5015620005a35760225460405163d7e7a9e760e01b815290602090829060049082906001600160a01b03165afa908115620033c457858093819382938391620033a0575b506001600160a01b03165af16200339062002f84565b5015620007ed57829038620032a4565b620033bd915060203d6020116200054f576200053f81836200239e565b386200337a565b6040513d87823e3d90fd5b620033ec915060203d6020116200054f576200053f81836200239e565b3862003320565b620034089262002ffa8362001b26936200259a565b62003225565b8062001b268562002ffa6200342494866200259a565b62003204565b8062001b268662002ffa6200344094876200259a565b620031e5565b505050505050565b8162001b2662003466926200346d9460011c620025cf565b82620025cf565b62003152565b5060205460101c6001600160a01b0316916060620034a96200349a600184901c476200259a565b620031878460011c8b620025cf565b9360c48b604051968793849263f305d71960e01b84523060048501528760011c6024850152806044850152606484015261dead60848401524260a48401525af180156200354357899062003501575b90925062003126565b5090916060813d82116200353a575b816200351f606093836200239e565b810103126200353657906200315c929151620034f8565b8880fd5b3d915062003510565b6040513d8b823e3d90fd5b6200355c909891986200238a565b96386200311a565b82516001600160a01b031684528f965087955060209384019390920191600101620030ee565b8a80fd5b634e487b7160e01b8b52603260045260248bfd5b620035bf915060203d6020116200054f576200053f81836200239e565b3862003081565b6040513d8d823e3d90fd5b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b8a52604160045260248afd5b5050505050505050565b60115415620036ab576007546005810281159082810460051482171562002584576103e8900483106200367b57600382029182046003141715620025845760649004106200364d57565b60405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606490fd5b60405162461bcd60e51b8152602060048201526009602482015268085b185d5b98da195960ba1b6044820152606490fd5b15620036e457565b60405162461bcd60e51b8152602060048201526008602482015267686967682066656560c01b6044820152606490fd5b156200371c57565b60405162461bcd60e51b815260206004820152600c60248201526b68696768204b59432066656560a01b6044820152606490fd5b60165460155460145490601954916018549060175492602095865460ff81161580620039b3575b620038d0575b5092620037c2620037b88462002fe28588620037ac620037ee9b9962002fe262002fe29a620037e49d62002576565b15620038c55762002576565b6012549062002576565b9586601a55620037d88462002fe2848462002576565b15620038ba5762002576565b6013549062002576565b9182601b5560018060a01b03806022541682600092835416602460405180948193633af32abf60e01b835260048301525afa928315620008aa57829362003878575b5050506000146200385b57620038599162003851600c601193111562003714565b111562003714565b565b620038599162003870600780931115620036dc565b1115620036dc565b9080929350813d8311620038b2575b6200389381836200239e565b81010312620007f15751908115158203620003c9575038808062003830565b503d62003887565b600060135562002576565b600060125562002576565b909492939060081c60ff166200395057601154916201518083018093116200258457620037b8620037e49562002fe2620037c293620037ee9962002fe29742116000146200394057600160128190556013558c5461ff001916610100178d555b959850955050949650506200377d565b6002601255600260135562003930565b601154916228de8083018093116200258457620037b8620037e49562002fe2620037c293620037ee9962002fe2974211600014620039a357600060128190556013558c5460ff19166001178d5562003930565b6001601255600160135562003930565b50601154151562003777565b80519060005b828110620039d257505050565b815181101562003a18576003602060018060a01b03818460051b8601015116600052526040600020600160ff1982541617905560001981146200258457600101620039c5565b634e487b7160e01b600052603260045260246000fdfe608060409080825234620001df57606081620010228038038091620000258285620001e4565b833981010312620001df576200003b816200021e565b6020906200005884620000508486016200021e565b94016200021e565b6ec097ce7bc90715b34b9f1000000000600b55610708600c55670de0b6b3a7640000600d55600180546001600160a01b03199081166001600160a01b03948516179091556002805482169584169590951790945560008054909416918116919091178355835163313ce56760e01b838201908152600482526001600160401b03929180870184811182821017620001cb5787525185928392905afa3d15620001c1573d918211620001ad578451916200011b601f8201601f1916850184620001e4565b82523d848484013e5b156200017f5781818051810103126200017b5701519060ff82168092036200017857604d8211620001645750600a0a600d5551610dee9081620002348239f35b634e487b7160e01b81526011600452602490fd5b80fd5b8280fd5b835162461bcd60e51b81526004810183905260076024820152661a5b9d985b1a5960ca1b6044820152606490fd5b634e487b7160e01b84526041600452602484fd5b6060915062000124565b634e487b7160e01b87526041600452602487fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200020857604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001df5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826311ce023d146109d757508163125f9e331461018957816314b6ca96146107aa57816328fd31981461077d5781632d48e8961461074d5781633a98ef391461072e5781634fab0ae81461070f57816351171961146106e457816366817df5146106ac5781638477d9f314610613578163997664d7146105f4578163ce7c2ac2146105b2578163d0e30db014610298578163d4fda1f214610262578163e2d2e21914610243578163efca2eed14610224578163f0fc6bca146101b2578163f1e9f1e514610189578163f82107691461015e578163ffb2c4791461012d575063ffd49c841461010c57600080fd5b34610129578160031936011261012957602090600c549051908152f35b5080fd5b8390346101295760203660031901126101295781546001600160a01b031633036101295761015b9035610b6e565b80f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600c5580f35b50503461012957816003193601126101295760025490516001600160a01b039091168152602090f35b919050346102205782600319360112610220576101ce33610c3c565b156101dd578261015b33610c80565b906020606492519162461bcd60e51b8352820152601760248201527f546f6f20736f6f6e2e204e65656420746f2077616974210000000000000000006044820152fd5b8280fd5b5050346101295781600319360112610129576020906009549051908152f35b505034610129578160031936011261012957602090600a549051908152f35b9050346102205760203660031901126102205760209282916001600160a01b0361028a6109f3565b168252845220549051908152f35b919050826003193601126102205782546001600160a01b039190821633036105ae578160025416908051916370a0823160e01b9384845230868501526020918285602481845afa9485156105a4578895610571575b508351906060820182811067ffffffffffffffff82111761055e5785526002825284368584013782600154169085516315ab88c960e31b815285818b81865afa908115610554578b9161051a575b508461034685610ac2565b9116905261035383610ae5565b52888361035f84610ac2565b51168461036b85610ae5565b51160361049657505061037e8291610ac2565b51169087823b15610493578088938651998a8092630d0e30db60e41b825234905af197881561048757849596979861046a575b50506024905b600254169685519788938492835230908301525afa9182156104615750849161042c575b506103e69250610a92565b6103f281600854610ab5565b6008556007549081610402578280f35b61041d61042392610418600a5493600b54610af5565b610b08565b90610ab5565b600a5538808280f35b905082813d831161045a575b6104428183610a70565b81010312610455576103e69151386103db565b600080fd5b503d610438565b513d86823e3d90fd5b61047691929450610a46565b61048357829187386103b1565b8680fd5b508451903d90823e3d90fd5b80fd5b9091829894959697983b15610129576104d0928751808095819463b6f9de9560e01b8352868a840152608060248401526084830190610a09565b306044830152426064830152039134905af18015610510576104f8575b5090602483926103b7565b83929197610507602492610a46565b979192506104ed565b85513d8a823e3d90fd5b90508581813d831161054d575b6105318183610a70565b8101031261054957518481168103610549573861033b565b8a80fd5b503d610527565b87513d8d823e3d90fd5b634e487b7160e01b8a526041895260248afd5b9094508281813d831161059d575b6105898183610a70565b81010312610599575193386102ed565b8780fd5b503d61057f565b84513d8a823e3d90fd5b8380fd5b505034610129576020366003190112610129579081906001600160a01b036105d86109f3565b1681526006602052206001815491015482519182526020820152f35b5050346101295781600319360112610129576020906008549051908152f35b50503461012957816003193601126101295780519081809360035490818552602080950191600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915b8682821061068c5785906106888861067984890385610a70565b51928284938452830190610a09565b0390f35b83546001600160a01b03168552889550909301926001928301920161065f565b5050346101295760203660031901126101295760209181906001600160a01b036106d46109f3565b1681526005845220549051908152f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600d5580f35b505034610129578160031936011261012957602090600d549051908152f35b5050346101295781600319360112610129576020906007549051908152f35b91905034610220573660031901126101295781546001600160a01b031633036101295735600c55602435600d5580f35b505034610129576020366003190112610129576020906107a361079e6109f3565b610d69565b9051908152f35b919050346102205780600319360112610220576107c56109f3565b8354602435926001600160a01b039291831633036109d3578282169485875260066020528187209586549485158015806109c5575b881591821590816109bd575b50156108b657505050600354928391895282602052882055680100000000000000008210156108a35750926108858161088061089d95610878610894966108548a6001809c01600355610b28565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b600754610a92565b610ab5565b600755808555600a5490610af5565b600b5490610b08565b91015580f35b634e487b7160e01b875260419052602486fd5b91955091929190816109b5575b506108e3575b505050506108948261088560019461088061089d95610878565b600392835492600019938481019081116109a2578661090461091e92610b28565b905490881b1c16828c5284602052610854848d2054610b28565b895281602052808920549084548481019081116109a25761093f8791610b28565b905490871b1c168a5282602052892055825490811561098f57509461088061089d956108949583956108859560019a019161097983610b28565b9091825491841b1b1916905555955050946108c9565b634e487b7160e01b895260319052602488fd5b634e487b7160e01b8b526011845260248bfd5b9050386108c3565b905038610806565b6109ce87610c80565b6107fa565b8580fd5b849034610129578160031936011261012957602090600b548152f35b600435906001600160a01b038216820361045557565b90815180825260208080930193019160005b828110610a29575050505090565b83516001600160a01b031685529381019392810192600101610a1b565b67ffffffffffffffff8111610a5a57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a5a57604052565b91908203918211610a9f57565b634e487b7160e01b600052601160045260246000fd5b91908201809211610a9f57565b805115610acf5760200190565b634e487b7160e01b600052603260045260246000fd5b805160011015610acf5760400190565b81810292918115918404141715610a9f57565b8115610b12570490565b634e487b7160e01b600052601260045260246000fd5b600354811015610acf5760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b6000198114610a9f5760010190565b906003908154908115610c365792916000908180955a5b86881080610c2d575b15610c2357610be1610bda610bf592600e9a898c541015610c1b575b8b54610bce610bb882610b28565b90546001600160a01b0392918c1b1c8216610c3c565b610bfc575b5050610ab5565b5a90610a92565b945a98610bee8154610b5f565b9055610b5f565b9396610b85565b610c08610c1492610b28565b9054908b1b1c16610c80565b3880610bd3565b868c55610baa565b5095505050505050565b50858510610b8e565b92505050565b6001600160a01b038116600090815260056020526040902054600c54610c6191610ab5565b4210159081610c6e575090565b610c789150610d69565b600d54111590565b60018060a01b039081811690600092828452602091600683526040852090815415610cb557610cae90610d69565b9081610cbd575b505050505050565b8392604491610cce84600954610ab5565b600955868852600585524260408920556001610cf16108948354600a5490610af5565b910155600254169486604051968794859363a9059cbb60e01b8552600485015260248401525af18015610d5e57610d2b575b808080610cb5565b81813d8311610d57575b610d3f8183610a70565b81010312610129575180151503610493578080610d23565b503d610d35565b6040513d85823e3d90fd5b6001600160a01b0316600090815260066020526040902080548015610db157610d9a610894600192600a5490610af5565b91015480821115610db157610dae91610a92565b90565b505060009056fea2646970667358221220ddaa082a3bd187e0a7b02a8bf23ad3421782d8bbc0b2c7af395dc025b2e3e24064736f6c63430008110033df6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9d491e240ecd34d50a8e73bc9d6e4edd4580d0daf50f4cea2ae5d0a527615281ca2646970667358221220f804dd19086415858621c0307228dbdcebf2aafb6234707076c84113eec7960664736f6c63430008110033a264697066735822122046f72c957720484c01d34d1c97a55b0790306028971a104f3cce6c27c07d66fd64736f6c634300081100330000000000000000000000002ced5bc349d9241a314d3739f12f5f6f2bda6a68
Deployed Bytecode
0x608080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c9081630ab16c1914610b7b575080633af32abf14610aeb57806342cb2e7914610aab57806364d817fa14610a2b578063715018a6146109d15780638da5cb5b146109aa5780639f2560b01461016b578063bbd45223146101425763f2fde38b0361000f573461013f57602036600319011261013f576100a2610ba0565b6100aa610d5a565b6001600160a01b039081169081156100fa57600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b60405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f20616464726573730000006044820152606490fd5b80fd5b503461013f578060031936011261013f576001546040516001600160a01b039091168152602090f35b503461013f576003199060803683011261013f576001600160401b036004351161013f576101e080926004353603011261013f576040519182018281106001600160401b0382111761099657604052600435600401356001600160401b038111610885576101e0906004369181350101610c1e565b8252602460043501356001600160401b03811161088557610208906004369181350101610c1e565b6020830152600435604481013560408401526064810135606084015261023090608401610bbb565b608083015261024360a460043501610bbb565b60a083015260043560c481013560c084015260e481013560e08401526101048101356101008401526101248101356101208401526101448101356101408401526101648101356101608401526101848101356101808401526101a48101356101a08401526101c401356001600160401b038111610885573660238260043501011215610885576001600160401b036004828135010135116109965760405190600481813501013560051b6102fa6020820184610be2565b60048281350101358352602083019036602482856004350101011161099257906024836004350101915b60248185600435010101831061097657505050506101c08301526024356001600160a01b038116900361013f576044356001600160a01b038116900361013f576064356001600160a01b0381168103610885576001546001600160a01b031633036109425760c08301519060e08401516101008501516101208601516101408701519161016088015193604051968760c08101106001600160401b0360c08a01111761092e5760c088016040528752602087015260408601526060850152608084015260a083015260405180614bc38101106001600160401b03614bc38301111761091a57614bc3610db4823980614bc38101039084f0801561090f576001600160a01b031693843b1561090b5760405163f2fde38b60e01b81526001600160a01b03831660048201528481602481838a5af18015610900576108ed575b508051916020820151916040810151916060820151906101a083015160018060a01b0360a085015116926101c060018060a01b036080870151169501519560018060a01b036002541697604051998a6101808101106001600160401b036101808d011117610845576101808b016040528a5260208a015260408901526060880152608087015260018060a01b031660a086015260c085015260e084015260018060a01b036024351661010084015260018060a01b0360443516610120840152610140830152610160820152833b156108e95782604051809363329acc4960e11b825260e0600483015261057d610566855161018060e4860152610264850190610c65565b602086015184820360e31901610104860152610c65565b60408501516101248401526060850151610144840152608085015161016484015260a08501516001600160a01b0390811661018485015260c086015181166101a485015260e086015181166101c485015261010086015181166101e48501526101208601511661020484015261014085015183820360e3190161022485015280518083526020928301969290910190855b8181106108c45750505061016001516001600160a01b031661024483015280516024830152602081015160448301526040810151606483015260608101516084830152608081015160a483015260a0015160c482015290918190038183875af18015610891579082916108b0575b50506001546001600160a01b0316823b15610885576040519063326c0bfd60e11b82526004820152818160248183875af180156108915790829161089c575b50506040516370a0823160e01b8152306004820152602081602481865afa90811561089157829161085b575b5060018060a01b03600154169160405191602083019363a9059cbb60e01b8552602484015260448301526044825260808201918083106001600160401b038411176108455760c081018381106001600160401b0382111761084557604052602083527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656460a0820152516107ab938291829182885af13d1561083c573d61078c81610c03565b9061079a6040519283610be2565b8152809260203d92013e5b84610cbd565b8051908115918215610822575b5050156107ca57602090604051908152f35b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6108359250602080918301019101610ca5565b38806107b8565b606091506107a5565b634e487b7160e01b600052604160045260246000fd5b90506020813d602011610889575b8161087660209383610be2565b810103126108855751386106e7565b5080fd5b3d9150610869565b6040513d84823e3d90fd5b6108a590610bcf565b61013f5780386106bb565b6108b990610bcf565b61013f57803861067c565b82516001600160a01b031688526020978801978a97508996509092019160010161060e565b8280fd5b6108f990949194610bcf565b9238610462565b6040513d87823e3d90fd5b8380fd5b6040513d85823e3d90fd5b634e487b7160e01b84526041600452602484fd5b634e487b7160e01b89526041600452602489fd5b60405162461bcd60e51b815260206004820152600c60248201526b6f6e6c7920666163746f727960a01b6044820152606490fd5b60208060249361098586610bbb565b8152019301929150610324565b8480fd5b634e487b7160e01b82526041600452602482fd5b503461013f578060031936011261013f57546040516001600160a01b039091168152602090f35b503461013f578060031936011261013f576109ea610d5a565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461013f57602036600319011261013f57610a45610ba0565b610a4d610d5a565b6001600160a01b03168015610a72576001600160601b0360a01b600154161760015580f35b60405162461bcd60e51b81526020600482015260116024820152707a65726f2050726f6f66466163746f727960781b6044820152606490fd5b503461013f57602036600319011261013f57610ac5610ba0565b610acd610d5a565b60018060a01b03166001600160601b0360a01b600254161760025580f35b503461013f57602036600319011261013f57610b05610ba0565b600154604051633af32abf60e01b81526001600160a01b0392831660048201529160209183916024918391165afa9081156108915760209291610b4e575b506040519015158152f35b610b6e9150823d8111610b74575b610b668183610be2565b810190610ca5565b38610b43565b503d610b5c565b9050346108855781600319360112610885576002546001600160a01b03168152602090f35b600435906001600160a01b0382168203610bb657565b600080fd5b35906001600160a01b0382168203610bb657565b6001600160401b03811161084557604052565b90601f801991011681019081106001600160401b0382111761084557604052565b6001600160401b03811161084557601f01601f191660200190565b81601f82011215610bb657803590610c3582610c03565b92610c436040519485610be2565b82845260208383010111610bb657816000926020809301838601378301015290565b919082519283825260005b848110610c91575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610c70565b90816020910312610bb657518015158103610bb65790565b91929015610d1f5750815115610cd1575090565b3b15610cda5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610d325750805190602001fd5b60405162461bcd60e51b815260206004820152908190610d56906024830190610c65565b0390fd5b6000546001600160a01b03163303610d6e57565b60405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606490fdfe608080604052346100b75760008054336001600160a01b0319808316821784559290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a361c3506002908155600a805460ff19166001179055600d805460ff60a01b1916600160a01b17905560128190556013556020805461ffff191690556023805461ffff60a81b191661010160a81b1790556022805490911633179055614b0690816100bd8239f35b600080fdfe60808060405260043610156200001f575b5036156200001d57600080fd5b005b600090813560e01c9081630445b66714620022a25750806306fdde0314620021ff578063095ea7b314620021d25780630ab16c1914620021a7578063125f9e33146200212c57806316d9962b146200210557806318160ddd14620020e55780631df4ccfc14620020c55780631f53ac02146200207b57806323b872dd1462001fba57806327193bc41462001f1a5780632b112e491462001eca5780632d48e8961462001e58578063313ce5671462001e3a57806336e4ec641462001e1a578063395093511462001dc15780633af32abf146200095c5780633dab52691462001d735780633f4218e01462001d305780634355855a1462001ced57806344de2e4c1462001cc5578063461e5d3f1462001ca5578063497a000a1462001c2e5780634a74bb021462001c06578063546a88111462001b6457806359a51c341462001b395780635fef86801462001ac757806364d817fa1462001a39578063653598921462000fe75780636827e7641462000fc7578063704ce43e1462000fa757806370a082311462000f6a57806370c757ec1462000f45578063715018a61462000ee75780637c0ff2051462000ec75780637d1db4a51462000ea75780637db1342c1462000e75578063807c2d9c1462000e55578063838420131462000e3157806383ad79941462000e1157806388cda8731462000dea5780638b42507f1462000da75780638da5cb5b1462000d7e5780638ea5220f1462000d535780639502c4261462000d3357806395d89b411462000c51578063a3a2e89e1462000bf6578063a457c2d71462000b4d578063a8aa1b311462000b22578063a9059cbb1462000ae9578063b48e665e1462000ac9578063bad3ea6a1462000a9e578063bf56b3711462000a7e578063c45a01551462000a53578063ca987b0e1462000a33578063cb29813c14620009e7578063cc6badb314620009c7578063d4fb9a01146200099f578063d741b9c3146200095c578063d920334e146200092a578063dd62ed3e14620008d5578063e4cbd6b314620007f5578063e572967b1462000746578063e66b1d1e14620006fe578063ebdfd72214620006de578063f16fd78d1462000678578063f2fde38b14620005ba578063f576f5391462000457578063f887ea40146200042a578063fabe628314620003cc5763fbd7575303620000105734620003c95780600319360112620003c957620003a560018060a01b03602254163314620024fa565b6023805460ff60b01b19811660b091821c60ff161590911b60ff60b01b1617905580f35b80fd5b5034620003c9576040366003190112620003c95762000427620003ee6200230b565b620003f86200237a565b9062000403620024a0565b60018060a01b03168352600f602052604083209060ff801983541691151516179055565b80f35b5034620003c95780600319360112620003c9576020805460405160109190911c6001600160a01b03168152f35b5034620003c95780600319360112620003c9576022546001600160a01b0390620004859082163314620024fa565b806004541660405180916318160ddd60e01b825281600460209384935afa918215620005af57849262000576575b506001928383018093116200056257835b838110620004d0578580f35b602490838360045416604051938480926331a9108f60e11b82528560048301525afa918215620005575786928491899162000523575b501687526003845260408720805460ff19168317905501620004c4565b620005489150863d88116200054f575b6200053f81836200239e565b810190620025dd565b3862000506565b503d62000533565b6040513d89823e3d90fd5b634e487b7160e01b85526011600452602485fd5b9080925081813d8311620005a7575b6200059181836200239e565b81010312620005a357519038620004b3565b8380fd5b503d62000585565b6040513d86823e3d90fd5b5034620003c9576020366003190112620003c957620005d86200230b565b620005e2620024a0565b6001600160a01b039081169081156200063357600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b60405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f20616464726573730000006044820152606490fd5b5034620003c9576020366003190112620003c957620006966200230b565b600d54906001600160a01b0390620006b28284163314620025fe565b1680916001600160601b0360a01b1617600d558152600360205260408120600160ff1982541617905580f35b5034620003c95780600319360112620003c9576020600854604051908152f35b5034620003c9576020366003190112620003c9576200071c6200236a565b62000726620024a0565b600d805460ff60a01b191691151560a01b60ff60a01b1691909117905580f35b5034620003c957600319602036820112620007f157600435906001600160401b0390818311620005a3576020908336030112620007ed57604051906020820182811082821117620007d7576040528260040135908111620005a35762000427926004620007b7923692010162002429565b8152620007d060018060a01b03602254163314620024fa565b51620039bf565b634e487b7160e01b600052604160045260246000fd5b8280fd5b5080fd5b5034620003c95780620008083662002353565b9062000813620024a0565b6001546001600160a01b039190821690813b15620008d157849160248392604051948593849263f821076960e01b845260048401525af1908115620005af578491620008b9575b50506001541690813b15620008b5578291602483926040519485938492635117196160e01b845260048401525af18015620008aa57620008975750f35b620008a2906200238a565b620003c95780f35b6040513d84823e3d90fd5b5050fd5b620008c4906200238a565b620008b55782386200085a565b8480fd5b5034620003c9576040366003190112620003c957620008f36200230b565b6040620008ff62002327565b9260018060a01b03809316815260066020522091166000526020526020604060002054604051908152f35b5034620003c9576020366003190112620003c9576004356200094b620024a0565b620009568162003603565b60245580f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b036200098b6200230b565b168152600384522054166040519015158152f35b5034620003c95780600319360112620003c957602060ff60235460b01c166040519015158152f35b5034620003c95780600319360112620003c9576020601754604051908152f35b5034620003c95760c0366003190112620003c95762000a05620024a0565b60043560145560443560155560843560165560243560175560643560185560a4356019556200042762003750565b5034620003c95780600319360112620003c9576020601b54604051908152f35b5034620003c95780600319360112620003c9576022546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c9576020601154604051908152f35b5034620003c95780600319360112620003c9576001546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c9576020600954604051908152f35b5034620003c9576040366003190112620003c95762000b1662000b0b6200230b565b60243590336200267f565b50602060405160018152f35b5034620003c95780600319360112620003c9576021546040516001600160a01b039091168152602090f35b5034620003c9576040366003190112620003c95762000b6b6200230b565b60406024359233815260066020522060018060a01b0382166000526020526040600020549180831062000bb15762000ba69203903362002d2d565b602060405160018152f35b60405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606490fd5b5034620003c9576040366003190112620003c9576200042762000c186200230b565b62000c226200237a565b9062000c2d620024a0565b60018060a01b03168352600e602052604083209060ff801983541691151516179055565b5034620003c95780600319360112620003c9576040519080600c5462000c778162002539565b8085529160019180831690811562000d06575060011462000cb7575b62000cb38562000ca6818703826200239e565b60405191829182620022c0565b0390f35b9250600c835260008051602062004a518339815191525b82841062000ced57505050810160200162000ca68262000cb362000c93565b8054602085870181019190915290930192810162000cce565b86955062000cb39693506020925062000ca694915060ff191682840152151560051b820101929362000c93565b5034620003c95780600319360112620003c9576020601954604051908152f35b5034620003c95780600319360112620003c9576023546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c957546040516001600160a01b039091168152602090f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b0362000dd66200230b565b168152600f84522054166040519015158152f35b5034620003c95780600319360112620003c957602060ff815460081c166040519015158152f35b5034620003c95780600319360112620003c9576020601454604051908152f35b5034620003c95780600319360112620003c957602060ff8154166040519015158152f35b5034620003c95780600319360112620003c9576020602554604051908152f35b5034620003c9576020366003190112620003c95760043562000e96620024a0565b62000ea18162003603565b60255580f35b5034620003c95780600319360112620003c9576020602454604051908152f35b5034620003c95780600319360112620003c9576020601854604051908152f35b5034620003c95780600319360112620003c95762000f04620024a0565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034620003c95780600319360112620003c957602060ff600a54166040519015158152f35b5034620003c9576020366003190112620003c9576020906040906001600160a01b0362000f966200230b565b168152600583522054604051908152f35b5034620003c95780600319360112620003c9576020601554604051908152f35b5034620003c95780600319360112620003c9576020601654604051908152f35b5034620003c9576003199060e036830112620003c9576001600160401b0360043511620003c957610180809260043536030112620003c9576040519182018281106001600160401b03821117620007d757604052600435600401356001600160401b038111620007f15762001064906004369181350101620023dc565b8252602460043501356001600160401b038111620007f1576200108f906004369181350101620023dc565b6020830152600435604481013560408401526064810135606084015260848101356080840152620010c39060a4016200233e565b60a0830152620010d860c4600435016200233e565b60c0830152620010ed60e4600435016200233e565b60e083015262001103610104600435016200233e565b6101008301526200111a610124600435016200233e565b6101208301526001600160401b03610144600435013511620003c9576200114d3660048035610144810135010162002429565b61014083015262001164610164600435016200233e565b61016083015260c0366023190112620003c9576040519060c082018281106001600160401b03821117620007d757604052602435825260443560208301526064356040830152608435606083015260a435608083015260c43560a0830152620011d960018060a01b03602254163314620024fa565b82519283516001600160401b03811162001a2557620011fa600b5462002539565b601f8111620019b6575b50602094601f82116001146200194057948394958293949262001934575b50508160011b916000199060031b1c191617600b555b60208101519283516001600160401b03811162001920576200125c600c5462002539565b601f8111620018b1575b506020601f82116001146200183857849582939495926200182c575b50508160011b916000199060031b1c191617600c555b620012aa604083015160075462002576565b6007556046606083015110620017fe576064620012d160408401516060850151906200259a565b0483620012e3826040860151620025cf565b91338252600560205260408220620012fd82825462002576565b905560a08501516001600160a01b0316825260056020526040822080546200132790859062002576565b905560405190815260008051602062004a7183398151915290828260203393a360a08501516040519384526001600160a01b031692602090a36040820151600581029080820460051490151715620017ea576103e89004602455604082015180800460011481151715620017ea5760649004602555604082015180600581020460051481151715620017ea57610fa0600591909102046026556101008201516020805462010000600160b01b031916601092831b62010000600160b01b03161780825560405163c45a015560e01b815286939092908390600490829085901c6001600160a01b03165afa9081156200175e576004928492620017c3575b506040516315ab88c960e31b815292602091849190829060101c6001600160a01b03165afa9182156200175e576020926044918591620017a1575b506040516364e329cb60e11b81526001600160a01b0391821660048201523060248201529485938492165af1908115620005af5784916200177d575b50602180546001600160a01b0319166001600160a01b03928316179055308452600660209081526040808620825460101c84166000908152925290819020600019905561010084015160e085015191519291821691166001600160401b03611022840190811190841117620017695761102262003a2f8439611022830190815260208101919091523060408201528190036060019084f09081156200175e57600180546001600160a01b0319166001600160a01b0393841617815530855260036020526040808620805460ff19908116841790915560225485168752818720805482168417905560215485168752818720805482168417905560a086810151861688528288208054831685179055610120870151861688528288208054831685179055610100870151909516875290862080549091169091179055610140830151620015e790620039bf565b61016083015160048054600180861b600019019384166001600160601b03871b9092169190911790915530808752600e60209081526040808920805460ff1990811686179091556022805487168b52828b208054831687179055848b52600f8452828b208054831687179055888a015187168b52828b2080548316871790556021805488168c52838c208054841688179055905487168b52828b20805483168717905561dead808c52838c2080548416881790558b8052838c20805484168817905590549096168a5260108352818a208054821686179055928952808920805484168517905593885283882080548316841790558780528388208054909216909217905560808086015160095583516014559183015160155590820151601655810151601755606081015160185501516019556200172462003750565b60c0810151602380546001600160a01b03199081166001600160a01b039384161790915561012090920151600d8054909316911617905580f35b6040513d85823e3d90fd5b634e487b7160e01b86526041600452602486fd5b6200179a915060203d6020116200054f576200053f81836200239e565b386200149b565b620017bc9150843d86116200054f576200053f81836200239e565b386200145f565b6020919250620017e290823d84116200054f576200053f81836200239e565b919062001424565b634e487b7160e01b84526011600452602484fd5b60405162461bcd60e51b815260206004820152600660248201526506c6f77206c760d41b6044820152606490fd5b01519050388062001282565b600c855260008051602062004a5183398151915290855b601f198416811062001898575060019394959683601f198116106200187e575b505050811b01600c5562001298565b015160001960f88460031b161c191690553880806200186f565b9091602060018192858b0151815501930191016200184f565b600c8552601f820160051c60008051602062004a51833981519152016020831062001909575b601f820160051c60008051602062004a51833981519152018110620018fd575062001266565b858155600101620018d7565b5060008051602062004a51833981519152620018d7565b634e487b7160e01b84526041600452602484fd5b01519050388062001222565b600b8452601f1982169560008051602062004a9183398151915291855b8881106200199d5750836001959697981062001983575b505050811b01600b5562001238565b015160001960f88460031b161c1916905538808062001974565b919260206001819286850151815501940192016200195d565b600b8452601f820160051c60008051602062004a91833981519152016020831062001a0e575b601f820160051c60008051602062004a9183398151915201811062001a02575062001204565b848155600101620019dc565b5060008051602062004a91833981519152620019dc565b634e487b7160e01b83526041600452602483fd5b5034620003c9576020366003190112620003c95762001a576200230b565b6022546001600160a01b03919062001a739083163314620024fa565b1680825260036020526040822060ff1990600182825416179055600f60205260408320600182825416179055600e602052600160408420918254161790556001600160601b0360a01b602254161760225580f35b5034620003c95780600319360112620003c95762001ae4620024a0565b308152600560205262001b3562001b2d604083205462001b2662001b1c62001b12601d54601c549062002576565b601f549062002576565b601e549062002576565b90620025cf565b33306200267f565b5080f35b5034620003c95780600319360112620003c957600d546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c9576022546001600160a01b039062001b929082163314620024fa565b8060205460101c168252600e602052604082209060ff19916001838254161790558060205460101c168352600f6020526040832060018382541617905582541682526001604083209182541617905560235460ff60a01b19600d5416600d55600160b01b9061ffff60a81b19161760235580f35b5034620003c95780600319360112620003c957602060ff60235460a81c166040519015158152f35b5034620003c9576020366003190112620003c95760043562001c5c60018060a01b03600d54163314620025fe565b8060095560115481603c0291603c83040362001c91579062001c7e9162002576565b600855600160ff19600a541617600a5580f35b634e487b7160e01b83526011600452602483fd5b5034620003c95780600319360112620003c9576020601354604051908152f35b5034620003c95780600319360112620003c957602060ff600d5460a01c166040519015158152f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b0362001d1c6200230b565b168152601084522054166040519015158152f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b0362001d5f6200230b565b168152600e84522054166040519015158152f35b5034620003c9576040366003190112620003c95762001d916200236a565b62001d9b620024a0565b6023805460ff60a81b191691151560a81b60ff60a81b1691909117905560243560265580f35b5034620003c9576040366003190112620003c95762000ba690604062001de66200230b565b9133815260066020522060018060a01b03821660005260205262001e1260243560406000205462002576565b903362002d2d565b5034620003c95780600319360112620003c9576020601254604051908152f35b5034620003c95780600319360112620003c957602060405160098152f35b5034620003c9578062001e6b3662002353565b62001e78929192620024a0565b6001546001600160a01b031692833b15620007ed576044908360405195869485936316a4744b60e11b8552600485015260248401525af18015620008aa5762001ebf575080f35b62000427906200238a565b5034620003c95780600319360112620003c95762001f12602091604062001f0160075461dead8452600586528284205490620025cf565b9180805260058552205490620025cf565b604051908152f35b5034620003c95780600319360112620003c95762001f4460018060a01b03602254163314620024fa565b60115462001f82574260115560095480603c0290603c82040362001f6e5762001c7e904262002576565b634e487b7160e01b82526011600452602482fd5b60405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b6044820152606490fd5b5034620003c9576060366003190112620003c95762001fd86200230b565b9062001fe362002327565b60406044359260018060a01b0385168152600660205281812033825260205220549260001984036200201c575b62000b1693506200267f565b8284106200203d57620020378362000b169503338362002d2d565b62002010565b60405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606490fd5b5034620003c9576020366003190112620003c9576004356001600160a01b03811690819003620007f157620020af620024a0565b6001600160601b0360a01b602354161760235580f35b5034620003c95780600319360112620003c9576020601a54604051908152f35b5034620003c95780600319360112620003c9576020600754604051908152f35b5034620003c9576020366003190112620003c95762002123620024a0565b60043560025580f35b5034620003c95780600319360112620003c95760015460405163125f9e3360e01b8152906001600160a01b03906020908390600490829085165afa9182156200175e576020939262002183575b5060405191168152f35b6200219f919250833d81116200054f576200053f81836200239e565b903862002179565b5034620003c95780600319360112620003c9576004546040516001600160a01b039091168152602090f35b5034620003c9576040366003190112620003c95762000ba6620021f46200230b565b602435903362002d2d565b5034620003c95780600319360112620003c9576040519080600b54620022258162002539565b8085529160019180831690811562000d065750600114620022535762000cb38562000ca6818703826200239e565b9250600b835260008051602062004a918339815191525b8284106200228957505050810160200162000ca68262000cb362000c93565b805460208587018101919091529093019281016200226a565b905034620007f15781600319360112620007f1576020906026548152f35b6020808252825181830181905290939260005b828110620022f657505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501620022d3565b600435906001600160a01b03821682036200232257565b600080fd5b602435906001600160a01b03821682036200232257565b35906001600160a01b03821682036200232257565b604090600319011262002322576004359060243590565b6004359081151582036200232257565b6024359081151582036200232257565b6001600160401b038111620007d757604052565b90601f801991011681019081106001600160401b03821117620007d757604052565b6001600160401b038111620007d757601f01601f191660200190565b81601f820112156200232257803590620023f682620023c0565b926200240660405194856200239e565b828452602083830101116200232257816000926020809301838601378301015290565b9080601f8301121562002322578135906001600160401b038211620007d7578160051b6040519360209362002461858401876200239e565b8552838086019282010192831162002322578301905b82821062002486575050505090565b83809162002494846200233e565b81520191019062002477565b6000546001600160a01b03163303620024b557565b60405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606490fd5b156200250257565b60405162461bcd60e51b815260206004820152600f60248201526e6e6f742074686520666163746f727960881b6044820152606490fd5b90600182811c921680156200256b575b60208310146200255557565b634e487b7160e01b600052602260045260246000fd5b91607f169162002549565b919082018092116200258457565b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156200258457565b8115620025b9570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116200258457565b908160209103126200232257516001600160a01b0381168103620023225790565b156200260657565b60405162461bcd60e51b81526020600482015260126024820152713737ba103a343290383937b7b320b236b4b760711b6044820152606490fd5b156200264857565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606490fd5b6023805460009460ff9492909160b01c85161562002cfd57600a5485811662002c1d575b50602092858454818116158062002c11575b62002ba0575b50825460a01c1662002b2e576021549697966001600160a01b0380831697918116968a9391928989148062002b1f575b62002aa4575b898552600f88526040958787838189205416158062002a95575b62002a3b575b5050848316998a14158062002a2c575b8062002a1e575b80620029f9575b620029d0575b508885526005918289526200274e8888882054620025cf565b8a8752838a5287872055878560215416808c14908115620029c5575b506200297e575b508a865282895262002787888888205462002576565b8b8752838a52878720558986526010895281878720541615620028e1575b50898552601088528585205416156200284f575b50506001541660025490803b15620007ed57602483928551948593849263ffb2c47960e01b845260048401525af1908162002833575b509660008051602062004a7183398151915294959697156000146200282c578060008051602062004ab183398151915291a15b51908152a3600190565b5062002822565b6200283f89916200238a565b6200284b5738620027ef565b8780fd5b82600154169087528484205491813b15620008d1578551630a5b654b60e11b81526001600160a01b039190911660048201526024810192909252839081908390604490829084905af19182620028c9575b5050620028c35760008051602062004ab18339815191528280a15b3880620027b9565b620028bb565b620028d4906200238a565b620007ed578238620028a0565b90919293948560015416848a528782205490803b15620007ed578851630a5b654b60e11b81526001600160a01b0394909416600485015260248401919091528290604490829084905af1908162002960575b508b94939291906200295a5760008051602062004ab18339815191528580a15b38620027a5565b62002953565b62002972909c91959493929c6200238a565b9a909192933862002933565b909750600e89528187872054161580620029b4575b15620029ae57620029a690848962002e1a565b963862002771565b620029a6565b508a86528187872054161562002993565b90508c14386200276a565b805460ff60a01b19908116600160a01b178255620029ed62002fb9565b81541690553862002735565b5062002a1362001b1c62001b12601d54601c549062002576565b60265411156200272f565b5081815460a81c1662002728565b5081815460a01c161562002721565b62002a5192939495969760058c52205462002576565b6025541062002a6857908b94939291878762002711565b855162461bcd60e51b81526004810189905260066024820152651dd85b1b195d60d21b6044820152606490fd5b5083600d5460a01c166200270b565b9091929350602454861180159062002af6575b1562002ac857908a939291620026f1565b60405162461bcd60e51b815260048101889052600660248201526509ac2f040a8b60d31b6044820152606490fd5b508382168b52600f87528060408c205416801562002ab75750888b528060408c20541662002ab7565b5080600d5460a01c16620026eb565b6001600160a01b0394851680885260058552604088205490965060008051602062004a7183398151915295925062002b68908490620025cf565b8688526005855260408820551694858152604062002b8a838284205462002576565b91878152600585522055604051908152a3600190565b60081c1662002bee5760115462015180810180911162002bda57421162002bca575b8538620026bb565b62002bd462003750565b62002bc2565b634e487b7160e01b88526011600452602488fd5b6011546228de80810180911162002bda5742111562002bc25762002bd462003750565b506011541515620026b5565b600854421062002c365760ff1916600a555b38620026a3565b506021546001600160a01b039085821690821681810362002c7357505083168652600360205262002c6d8560408820541662002640565b62002c2f565b9091851690810362002c9857508652600360205262002c6d8560408820541662002640565b908752600360205285604088205416908162002cec575b5062002c6d5760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606490fd5b875250604086205485163862002caf565b60405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b6044820152606490fd5b6001600160a01b0390811691821562002dd5571691821562002d905760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260068252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606490fd5b6021546001600160a01b039283169083160362002f6b57601b54916018549260195460135490601754915b831562002f61578380928162002e5c818c6200259a565b606490049962002e6d908b6200259a565b9062002e7991620025ae565b601c549062002e889162002576565b601c5562002e9790896200259a565b9062002ea391620025ae565b601d549062002eb29162002576565b601d5562002ec190876200259a565b9062002ecd91620025ae565b601e549062002edc9162002576565b601e5562002eeb90856200259a565b9062002ef791620025ae565b601f549062002f069162002576565b601f55306000526005602052826040600020549062002f259162002576565b3060005260056020526040600020556040519083825230921690602060008051602062004a7183398151915291a362002f5e91620025cf565b90565b5050505050505090565b601a549160155492601654601254906014549162002e45565b3d1562002fb4573d9062002f9882620023c0565b9162002fa860405193846200239e565b82523d6000602084013e565b606090565b602654600090601c54601d5491601e54601f5462002fe88162002fe28462002fe2898962002576565b62002576565b93620030008562002ffa83876200259a565b620025ae565b90620030108260011c86620025cf565b15620035f957604051606081018181106001600160401b03821117620035e557604052600281526040366020830137805115620035d15730602082015260018060a01b0360205460101c166040516315ab88c960e31b8152602081600481855afa908115620035c6578b91620035a2575b508251600110156200358e576001600160a01b03166040830152620030ab600185901c88620025cf565b91813b156200358a57918a9160405193849263791ac94760e01b845260a4840190600485015284602485015260a060448501528151809152602060c48501920190855b81811062003564575050508383809230606483015242608483015203925af1801562003543576200354e575b50878260011c62003473575b9182620031466200313f6200315c958460011c620025cf565b83620025cf565b8310156200344e575050875b601c5585620025cf565b156200344657859347916200318e6200317688856200259a565b620031878362002fe2888c62002576565b90620025ae565b94620031b06200319f86866200259a565b620031878462002fe2898d62002576565b94620031c886620031c28988620025cf565b620025cf565b98620031da8562002ffa83866200259a565b8110156200342a5750875b601d55620031f98462002ffa83856200259a565b8110156200340e5750865b601e55620032188362002ffa84846200259a565b821015620033f357505050835b601f556200329d575b50506001546001600160a01b03169050803b15620007ed57828091600460405180958193630d0e30db60e41b83525af1918262003285575b505062003282578060008051602062004ab183398151915291a1565b50565b62003290906200238a565b620007f157813862003266565b80620032e1575b5080620032b3575b806200322e565b602354829182918291906001600160a01b03165af1620032d262002f84565b5015620007f1578138620032ac565b90915060011c6004602060018060a01b036022541660405192838092633690e28760e01b82525afa908115620033c457858084819482948391620033cf575b506001600160a01b03165af16200333662002f84565b5015620005a35760225460405163d7e7a9e760e01b815290602090829060049082906001600160a01b03165afa908115620033c457858093819382938391620033a0575b506001600160a01b03165af16200339062002f84565b5015620007ed57829038620032a4565b620033bd915060203d6020116200054f576200053f81836200239e565b386200337a565b6040513d87823e3d90fd5b620033ec915060203d6020116200054f576200053f81836200239e565b3862003320565b620034089262002ffa8362001b26936200259a565b62003225565b8062001b268562002ffa6200342494866200259a565b62003204565b8062001b268662002ffa6200344094876200259a565b620031e5565b505050505050565b8162001b2662003466926200346d9460011c620025cf565b82620025cf565b62003152565b5060205460101c6001600160a01b0316916060620034a96200349a600184901c476200259a565b620031878460011c8b620025cf565b9360c48b604051968793849263f305d71960e01b84523060048501528760011c6024850152806044850152606484015261dead60848401524260a48401525af180156200354357899062003501575b90925062003126565b5090916060813d82116200353a575b816200351f606093836200239e565b810103126200353657906200315c929151620034f8565b8880fd5b3d915062003510565b6040513d8b823e3d90fd5b6200355c909891986200238a565b96386200311a565b82516001600160a01b031684528f965087955060209384019390920191600101620030ee565b8a80fd5b634e487b7160e01b8b52603260045260248bfd5b620035bf915060203d6020116200054f576200053f81836200239e565b3862003081565b6040513d8d823e3d90fd5b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b8a52604160045260248afd5b5050505050505050565b60115415620036ab576007546005810281159082810460051482171562002584576103e8900483106200367b57600382029182046003141715620025845760649004106200364d57565b60405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606490fd5b60405162461bcd60e51b8152602060048201526009602482015268085b185d5b98da195960ba1b6044820152606490fd5b15620036e457565b60405162461bcd60e51b8152602060048201526008602482015267686967682066656560c01b6044820152606490fd5b156200371c57565b60405162461bcd60e51b815260206004820152600c60248201526b68696768204b59432066656560a01b6044820152606490fd5b60165460155460145490601954916018549060175492602095865460ff81161580620039b3575b620038d0575b5092620037c2620037b88462002fe28588620037ac620037ee9b9962002fe262002fe29a620037e49d62002576565b15620038c55762002576565b6012549062002576565b9586601a55620037d88462002fe2848462002576565b15620038ba5762002576565b6013549062002576565b9182601b5560018060a01b03806022541682600092835416602460405180948193633af32abf60e01b835260048301525afa928315620008aa57829362003878575b5050506000146200385b57620038599162003851600c601193111562003714565b111562003714565b565b620038599162003870600780931115620036dc565b1115620036dc565b9080929350813d8311620038b2575b6200389381836200239e565b81010312620007f15751908115158203620003c9575038808062003830565b503d62003887565b600060135562002576565b600060125562002576565b909492939060081c60ff166200395057601154916201518083018093116200258457620037b8620037e49562002fe2620037c293620037ee9962002fe29742116000146200394057600160128190556013558c5461ff001916610100178d555b959850955050949650506200377d565b6002601255600260135562003930565b601154916228de8083018093116200258457620037b8620037e49562002fe2620037c293620037ee9962002fe2974211600014620039a357600060128190556013558c5460ff19166001178d5562003930565b6001601255600160135562003930565b50601154151562003777565b80519060005b828110620039d257505050565b815181101562003a18576003602060018060a01b03818460051b8601015116600052526040600020600160ff1982541617905560001981146200258457600101620039c5565b634e487b7160e01b600052603260045260246000fdfe608060409080825234620001df57606081620010228038038091620000258285620001e4565b833981010312620001df576200003b816200021e565b6020906200005884620000508486016200021e565b94016200021e565b6ec097ce7bc90715b34b9f1000000000600b55610708600c55670de0b6b3a7640000600d55600180546001600160a01b03199081166001600160a01b03948516179091556002805482169584169590951790945560008054909416918116919091178355835163313ce56760e01b838201908152600482526001600160401b03929180870184811182821017620001cb5787525185928392905afa3d15620001c1573d918211620001ad578451916200011b601f8201601f1916850184620001e4565b82523d848484013e5b156200017f5781818051810103126200017b5701519060ff82168092036200017857604d8211620001645750600a0a600d5551610dee9081620002348239f35b634e487b7160e01b81526011600452602490fd5b80fd5b8280fd5b835162461bcd60e51b81526004810183905260076024820152661a5b9d985b1a5960ca1b6044820152606490fd5b634e487b7160e01b84526041600452602484fd5b6060915062000124565b634e487b7160e01b87526041600452602487fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200020857604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001df5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826311ce023d146109d757508163125f9e331461018957816314b6ca96146107aa57816328fd31981461077d5781632d48e8961461074d5781633a98ef391461072e5781634fab0ae81461070f57816351171961146106e457816366817df5146106ac5781638477d9f314610613578163997664d7146105f4578163ce7c2ac2146105b2578163d0e30db014610298578163d4fda1f214610262578163e2d2e21914610243578163efca2eed14610224578163f0fc6bca146101b2578163f1e9f1e514610189578163f82107691461015e578163ffb2c4791461012d575063ffd49c841461010c57600080fd5b34610129578160031936011261012957602090600c549051908152f35b5080fd5b8390346101295760203660031901126101295781546001600160a01b031633036101295761015b9035610b6e565b80f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600c5580f35b50503461012957816003193601126101295760025490516001600160a01b039091168152602090f35b919050346102205782600319360112610220576101ce33610c3c565b156101dd578261015b33610c80565b906020606492519162461bcd60e51b8352820152601760248201527f546f6f20736f6f6e2e204e65656420746f2077616974210000000000000000006044820152fd5b8280fd5b5050346101295781600319360112610129576020906009549051908152f35b505034610129578160031936011261012957602090600a549051908152f35b9050346102205760203660031901126102205760209282916001600160a01b0361028a6109f3565b168252845220549051908152f35b919050826003193601126102205782546001600160a01b039190821633036105ae578160025416908051916370a0823160e01b9384845230868501526020918285602481845afa9485156105a4578895610571575b508351906060820182811067ffffffffffffffff82111761055e5785526002825284368584013782600154169085516315ab88c960e31b815285818b81865afa908115610554578b9161051a575b508461034685610ac2565b9116905261035383610ae5565b52888361035f84610ac2565b51168461036b85610ae5565b51160361049657505061037e8291610ac2565b51169087823b15610493578088938651998a8092630d0e30db60e41b825234905af197881561048757849596979861046a575b50506024905b600254169685519788938492835230908301525afa9182156104615750849161042c575b506103e69250610a92565b6103f281600854610ab5565b6008556007549081610402578280f35b61041d61042392610418600a5493600b54610af5565b610b08565b90610ab5565b600a5538808280f35b905082813d831161045a575b6104428183610a70565b81010312610455576103e69151386103db565b600080fd5b503d610438565b513d86823e3d90fd5b61047691929450610a46565b61048357829187386103b1565b8680fd5b508451903d90823e3d90fd5b80fd5b9091829894959697983b15610129576104d0928751808095819463b6f9de9560e01b8352868a840152608060248401526084830190610a09565b306044830152426064830152039134905af18015610510576104f8575b5090602483926103b7565b83929197610507602492610a46565b979192506104ed565b85513d8a823e3d90fd5b90508581813d831161054d575b6105318183610a70565b8101031261054957518481168103610549573861033b565b8a80fd5b503d610527565b87513d8d823e3d90fd5b634e487b7160e01b8a526041895260248afd5b9094508281813d831161059d575b6105898183610a70565b81010312610599575193386102ed565b8780fd5b503d61057f565b84513d8a823e3d90fd5b8380fd5b505034610129576020366003190112610129579081906001600160a01b036105d86109f3565b1681526006602052206001815491015482519182526020820152f35b5050346101295781600319360112610129576020906008549051908152f35b50503461012957816003193601126101295780519081809360035490818552602080950191600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915b8682821061068c5785906106888861067984890385610a70565b51928284938452830190610a09565b0390f35b83546001600160a01b03168552889550909301926001928301920161065f565b5050346101295760203660031901126101295760209181906001600160a01b036106d46109f3565b1681526005845220549051908152f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600d5580f35b505034610129578160031936011261012957602090600d549051908152f35b5050346101295781600319360112610129576020906007549051908152f35b91905034610220573660031901126101295781546001600160a01b031633036101295735600c55602435600d5580f35b505034610129576020366003190112610129576020906107a361079e6109f3565b610d69565b9051908152f35b919050346102205780600319360112610220576107c56109f3565b8354602435926001600160a01b039291831633036109d3578282169485875260066020528187209586549485158015806109c5575b881591821590816109bd575b50156108b657505050600354928391895282602052882055680100000000000000008210156108a35750926108858161088061089d95610878610894966108548a6001809c01600355610b28565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b600754610a92565b610ab5565b600755808555600a5490610af5565b600b5490610b08565b91015580f35b634e487b7160e01b875260419052602486fd5b91955091929190816109b5575b506108e3575b505050506108948261088560019461088061089d95610878565b600392835492600019938481019081116109a2578661090461091e92610b28565b905490881b1c16828c5284602052610854848d2054610b28565b895281602052808920549084548481019081116109a25761093f8791610b28565b905490871b1c168a5282602052892055825490811561098f57509461088061089d956108949583956108859560019a019161097983610b28565b9091825491841b1b1916905555955050946108c9565b634e487b7160e01b895260319052602488fd5b634e487b7160e01b8b526011845260248bfd5b9050386108c3565b905038610806565b6109ce87610c80565b6107fa565b8580fd5b849034610129578160031936011261012957602090600b548152f35b600435906001600160a01b038216820361045557565b90815180825260208080930193019160005b828110610a29575050505090565b83516001600160a01b031685529381019392810192600101610a1b565b67ffffffffffffffff8111610a5a57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a5a57604052565b91908203918211610a9f57565b634e487b7160e01b600052601160045260246000fd5b91908201809211610a9f57565b805115610acf5760200190565b634e487b7160e01b600052603260045260246000fd5b805160011015610acf5760400190565b81810292918115918404141715610a9f57565b8115610b12570490565b634e487b7160e01b600052601260045260246000fd5b600354811015610acf5760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b6000198114610a9f5760010190565b906003908154908115610c365792916000908180955a5b86881080610c2d575b15610c2357610be1610bda610bf592600e9a898c541015610c1b575b8b54610bce610bb882610b28565b90546001600160a01b0392918c1b1c8216610c3c565b610bfc575b5050610ab5565b5a90610a92565b945a98610bee8154610b5f565b9055610b5f565b9396610b85565b610c08610c1492610b28565b9054908b1b1c16610c80565b3880610bd3565b868c55610baa565b5095505050505050565b50858510610b8e565b92505050565b6001600160a01b038116600090815260056020526040902054600c54610c6191610ab5565b4210159081610c6e575090565b610c789150610d69565b600d54111590565b60018060a01b039081811690600092828452602091600683526040852090815415610cb557610cae90610d69565b9081610cbd575b505050505050565b8392604491610cce84600954610ab5565b600955868852600585524260408920556001610cf16108948354600a5490610af5565b910155600254169486604051968794859363a9059cbb60e01b8552600485015260248401525af18015610d5e57610d2b575b808080610cb5565b81813d8311610d57575b610d3f8183610a70565b81010312610129575180151503610493578080610d23565b503d610d35565b6040513d85823e3d90fd5b6001600160a01b0316600090815260066020526040902080548015610db157610d9a610894600192600a5490610af5565b91015480821115610db157610dae91610a92565b90565b505060009056fea2646970667358221220ddaa082a3bd187e0a7b02a8bf23ad3421782d8bbc0b2c7af395dc025b2e3e24064736f6c63430008110033df6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9d491e240ecd34d50a8e73bc9d6e4edd4580d0daf50f4cea2ae5d0a527615281ca2646970667358221220f804dd19086415858621c0307228dbdcebf2aafb6234707076c84113eec7960664736f6c63430008110033a264697066735822122046f72c957720484c01d34d1c97a55b0790306028971a104f3cce6c27c07d66fd64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002ced5bc349d9241a314d3739f12f5f6f2bda6a68
-----Decoded View---------------
Arg [0] : _nftWhitelist (address): 0x2cED5bc349D9241a314d3739f12f5f6f2BDA6A68
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002ced5bc349d9241a314d3739f12f5f6f2bda6a68
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 29 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.