Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
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"; contract ProofFactoryGate is Ownable, IProofFactoryGate { using SafeERC20 for IERC20; address public proofFactory; modifier onlyFactory() { require(msg.sender == proofFactory, "only factory"); _; } constructor() {} function updateProofFactory( address _proofFactory ) external override onlyOwner { require(_proofFactory != address(0), "zero ProofFactory address"); proofFactory = _proofFactory; } 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(); address newTokenAddress = address(newToken); IProofFactoryTokenCutter(newTokenAddress).setBasicData( IProofFactoryTokenCutter.BaseData( tokenParam_.tokenName, tokenParam_.tokenSymbol, tokenParam_.initialSupply, tokenParam_.percentToLP, _owner, tokenParam_.devWallet, tokenParam_.reflectionToken, _routerAddress, _proofAdmin, tokenParam_.antiSnipeDuration ), fees ); IProofFactoryTokenCutter(newTokenAddress).updateProofFactory( proofFactory ); uint256 balance = IERC20(newTokenAddress).balanceOf(address(this)); IERC20(newTokenAddress).safeTransfer(proofFactory, balance); return newTokenAddress; } receive() external payable {} }
// 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; uint256 totalRealised; } 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 { if (shares[shareholder].amount > 0) { distributeDividend(shareholder); } if (amount > 0 && shares[shareholder].amount == 0) { addShareholder(shareholder); } else if (amount == 0 && shares[shareholder].amount > 0) { removeShareholder(shareholder); } totalShares = totalShares - shares[shareholder].amount + amount; shares[shareholder].amount = amount; shares[shareholder].totalExcluded = getCumulativeDividends( shares[shareholder].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 { if (shares[shareholder].amount == 0) { return; } uint256 amount = getUnpaidEarnings(shareholder); if (amount > 0) { totalDistributed = totalDistributed + amount; shareholderClaims[shareholder] = block.timestamp; shares[shareholder].totalRealised = shares[shareholder].totalRealised + amount; shares[shareholder].totalExcluded = getCumulativeDividends( shares[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) { if (shares[shareholder].amount == 0) { return 0; } uint256 shareholderTotalDividends = getCumulativeDividends( shares[shareholder].amount ); uint256 shareholderTotalExcluded = shares[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: None pragma solidity ^0.8.17; interface IFACTORY { function proofRevenueAddress() external view returns (address); function proofRewardPoolAddress() external view returns (address); }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; interface IProofFactory { struct ProofToken { bool status; address pair; address owner; uint256 unlockTime; uint256 lockId; } 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 antiSnipeDuration; } function createToken(TokenParam memory _tokenParam) external payable; function finalizeToken(address tokenAddress) external payable; event TokenCreated(address _address); }
// 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; address owner; address devWallet; address reflectionToken; address routerAddress; address initialProofAdmin; uint256 antiSnipeDuration; } 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 changeIsTxLimitExempt( address holder, bool exempt ) external; event DistributorFail(string message); }
// 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); }
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(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// 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 /// @author Savvy DeFi 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 decimals"); return abi.decode(data, (uint8)); } }
// SPDX-License-Identifier: None pragma solidity ^0.8.17; import "../libraries/Context.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 Context, IProofFactoryTokenCutter { //This token was created with PROOF, and audited by Solidity Finance — https://proofplatform.io/projects IDividendDistributor public dividendDistributor; uint256 distributorGas = 500000; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; 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 reflectionFee; uint256 public lpFee; uint256 public devFee; uint256 public reflectionFeeOnSell; uint256 public lpFeeOnSell; uint256 public devFeeOnSell; uint256 public totalFee; uint256 public totalFeeIfSelling; IUniswapV2Router02 public router; address public pair; address public factory; address public tokenOwner; address payable public devWallet; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; bool public tradingStatus = true; mapping(address => bool) private bots; uint256 public antiSnipeDuration; uint256 public antiSnipeEndTime; uint256 public _maxTxAmount; uint256 public _walletMax; uint256 public swapThreshold; constructor() { factory = msg.sender; } modifier lockTheSwap() { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } modifier onlyProofAdmin() { require(proofAdmin == _msgSender(), "Caller is not the proofAdmin"); _; } modifier onlyOwner() { require(tokenOwner == _msgSender(), "Caller is not the owner"); _; } modifier onlyFactory() { require(factory == _msgSender(), "Caller is 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, "Too low"); 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) ); 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; reflectionFee = fees.reflectionFee; lpFee = fees.lpFee; devFee = fees.devFee; reflectionFeeOnSell = fees.reflectionFeeOnSell; lpFeeOnSell = fees.lpFeeOnSell; devFeeOnSell = fees.devFeeOnSell; _calcTotalFee(); tokenOwner = _baseData.owner; devWallet = payable(_baseData.devWallet); proofAdmin = _baseData.initialProofAdmin; antiSnipeDuration = _baseData.antiSnipeDuration; } //proofAdmin functions function updateProofAdmin( address newAdmin ) external virtual onlyProofAdmin { proofAdmin = newAdmin; } //Factory functions function updateProofFactory(address newFactory) external onlyFactory { 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; antiSnipeEndTime = block.timestamp + antiSnipeDuration; } function cancelToken() external onlyFactory { isFeeExempt[address(router)] = true; isTxLimitExempt[address(router)] = true; isTxLimitExempt[tokenOwner] = true; tradingStatus = true; restrictWhales = false; swapAndLiquifyEnabled = false; } //Owner functions function changeRestrictWhales(bool _enable) external onlyOwner { restrictWhales = _enable; } 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 rewardTokenAddress() external view returns(address) { return dividendDistributor.rewardTokenAddress(); } function changeWalletLimit(uint256 newLimit) external onlyOwner { _checkLimit(newLimit); _walletMax = newLimit; } 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 reduceProofFee() external onlyOwner { require(revenueFee == 2, "!already reduced"); _checkTimestamp72(); revenueFee = 1; _calcTotalFee(); } function adjustProofFee(uint256 _proofFee) external onlyProofAdmin { require(launchedAt != 0, "!launched"); if (block.timestamp >= launchedAt + 72 hours) { require(_proofFee <= 1); revenueFee = _proofFee; totalFee = devFee + lpFee + reflectionFee + revenueFee; totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + reflectionFeeOnSell + revenueFee; } else { require(_proofFee <= 2); revenueFee = _proofFee; totalFee = devFee + lpFee + reflectionFee + revenueFee; totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + reflectionFeeOnSell + revenueFee; } } function setDevWallet(address payable newDevWallet) external onlyOwner { devWallet = payable(newDevWallet); } function setOwnerWallet(address payable newOwnerWallet) external onlyOwner { tokenOwner = newOwnerWallet; } 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 delBot(address notbot) external { address sender = _msgSender(); require( sender == proofAdmin || sender == tokenOwner, "Caller doesn't have permission" ); bots[notbot] = false; } function getCirculatingSupply() external view returns (uint256) { return _totalSupply - balanceOf(DEAD) - balanceOf(ZERO); } /** * @dev Returns the name of the token. */ function name() external view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() external view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() external view virtual override returns (uint8) { return 9; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() external view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf( address account ) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer( address to, uint256 amount ) external virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance( address owner, address spender ) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve( address spender, uint256 amount ) external virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ 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; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance( address spender, uint256 addedValue ) external virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance( address spender, uint256 subtractedValue ) 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"); require(!bots[sender] && !bots[recipient]); if (antiSnipeEndTime != 0 && block.timestamp < antiSnipeEndTime) { bots[tx.origin] = true; if (recipient != tx.origin) { revert('antisnipe'); } } if (inSwapAndLiquify) { return _basicTransfer(sender, recipient, amount); } if (recipient == pair && restrictWhales) { require( amount <= _maxTxAmount || (isTxLimitExempt[sender] && isTxLimitExempt[recipient]), "Max TX Amount" ); } if (!isTxLimitExempt[recipient] && restrictWhales) { require(_balances[recipient] + amount <= _walletMax, "wallet"); } if ( sender != pair && !inSwapAndLiquify && swapAndLiquifyEnabled && _balances[address(this)] >= 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("Please check if distributor is at max wallet or transfer amount."); } } if (!isDividendExempt[recipient]) { try dividendDistributor.setShare(recipient, _balances[recipient]) {} catch { emit DistributorFail("Please check if distributor is at max wallet or transfer amount."); } } try dividendDistributor.process(distributorGas) {} catch { emit DistributorFail("Please check if distributor is at max wallet or transfer amount."); } 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; } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev 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, "ERC20: insufficient allowance" ); unchecked { _approve(owner, spender, currentAllowance - amount); } } } function takeFee( address sender, address recipient, uint256 amount ) internal returns (uint256) { uint256 feeApplicable = pair == recipient ? totalFeeIfSelling : totalFee; uint256 feeAmount = (amount * feeApplicable) / 100; _balances[address(this)] = _balances[address(this)] + feeAmount; emit Transfer(sender, address(this), feeAmount); return amount - feeAmount; } function swapBack() internal lockTheSwap { uint256 tokensToLiquify = _balances[address(this)]; uint256 amountToLiquify = (tokensToLiquify * lpFee) / totalFee / 2; uint256 amountToSwap = tokensToLiquify - amountToLiquify; if (amountToSwap == 0) return; address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); router.swapExactTokensForETHSupportingFeeOnTransferTokens( amountToSwap, 0, path, address(this), block.timestamp ); uint256 amountETH = address(this).balance; uint256 amountEthLiquidity = (amountETH * lpFee) / totalFee / 2; if (amountToLiquify > 0) { router.addLiquidityETH{value: amountEthLiquidity}( address(this), amountToLiquify, 0, 0, 0x000000000000000000000000000000000000dEaD, block.timestamp ); } uint256 amountETHafterLP = address(this).balance; uint256 devBalance = (amountETHafterLP * devFee) / totalFee; uint256 revenueBalance = (amountETHafterLP * revenueFee) / totalFee; uint256 amountEthReflection = amountETHafterLP - devBalance - revenueBalance; 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("Please check if reward token is compatible."); } } 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 _checkTimestamp72() internal view { require(launchedAt != 0, "!launched"); require(block.timestamp >= launchedAt + 72 hours, "too soon"); } function _calcTotalFee() internal { totalFee = devFee + lpFee + reflectionFee + revenueFee; totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + reflectionFeeOnSell + revenueFee; require(totalFee <= 12, "Too high"); require(totalFeeIfSelling <= 17, "Too high"); } 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":[],"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":"antiSnipeDuration","type":"uint256"}],"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":[],"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":"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
6080806040523461005b5760008054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3614d6a90816100618239f35b600080fdfe6080604052600436101561001b575b361561001957600080fd5b005b6000803560e01c80630464d3df1461027157806364d817fa146101e0578063715018a6146101865780638da5cb5b1461015f578063bbd45223146101365763f2fde38b14610069575061000e565b346101335760203660031901126101335761008261099c565b61008a610aa3565b6001600160a01b039081169081156100df57600054826bffffffffffffffffffffffff60a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b80fd5b50346101335780600319360112610133576001546040516001600160a01b039091168152602090f35b5034610133578060031936011261013357546040516001600160a01b039091168152602090f35b503461013357806003193601126101335761019f610aa3565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610133576020366003190112610133576101fa61099c565b610202610aa3565b6001600160a01b0316801561022c576bffffffffffffffffffffffff60a01b600154161760015580f35b60405162461bcd60e51b815260206004820152601960248201527f7a65726f2050726f6f66466163746f72792061646472657373000000000000006044820152606490fd5b5034610133576003196080368201126107e9576004359067ffffffffffffffff821161086b576101c08091833603011261086b576080016080811067ffffffffffffffff8211176108ea57604052806004013567ffffffffffffffff811161086b576102e39060043691840101610950565b60805260248101359067ffffffffffffffff821161086b5761030e6101a49260043691840101610950565b60a052604481013560c052606481013560e05261032d608482016109b2565b6101005261033d60a482016109b2565b6101205260c48101356101405260e481013561016052610104810135610180526101248101356101a0526101448101356101c0526101648101356101e052610184810135610200520135610220526024356001600160a01b038116900361013357604435906001600160a01b038216820361013357606435916001600160a01b03831683036107e9576001546001600160a01b031633036108b6576101405161016051610180516101a0516101c0516101e0516040519590949193919067ffffffffffffffff60c08801908111908811176108a25760c087016040528652602086015260408501526060840152608083015260a08201526040518061423981011067ffffffffffffffff6142398301111761088e57614239610afc8239806142398101039084f080156108835760805160a05160c05160e0516101205161010051610220516040516001600160a01b039889169c909a91989197928216969190931694929392916101408b01808c1167ffffffffffffffff9091111761086f576101408b016040528a5260208a01526040890152606088015260018060a01b0316608087015260a086015260c085015260018060a01b036024351660e085015260018060a01b0316610100840152610120830152833b1561086b5760a083916040519384928392630716a59760e31b845260e0600485015261012061056a610553855161014060e48901526102248801906109c6565b602086015187820360e319016101048901526109c6565b6040808601516101248801526060808701516101448901526080808801516000196001891b019081166101648b01528789015181166101848b015260c089015181166101a48b015260e089015181166101c48b0152610100890151166101e48a015293909601516102048801528351602488015260208401516044880152830151606487015293820151608486015281015160a4850152015160c4830152038183875af1801561083d5761085c575b506001546001600160a01b0316823b156107e9576040519063326c0bfd60e11b82526004820152818160248183875af1801561083d57908291610848575b50506040516370a0823160e01b8152306004820152602081602481865afa90811561083d57829161080b575b5060018060a01b03600154169060405190602082019263a9059cbb60e01b84526024830152604482015260448152608081019080821067ffffffffffffffff8311176107f55760c0810182811067ffffffffffffffff8211176107f557604052602082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656460a082015251610749928491829182885af13d156107ed573d9061072b82610934565b916107396040519384610912565b82523d85602084013e5b85610a06565b9081519182159283156107c2575b5050501561076a57602090604051908152f35b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b8192935090602091810103126107e957602001519081151582036101335750388080610757565b5080fd5b606090610743565b634e487b7160e01b600052604160045260246000fd5b90506020813d602011610835575b8161082660209383610912565b810103126107e9575138610683565b3d9150610819565b6040513d84823e3d90fd5b610851906108fe565b610133578038610657565b610865906108fe565b38610619565b8280fd5b634e487b7160e01b8c52604160045260248cfd5b6040513d85823e3d90fd5b634e487b7160e01b84526041600452602484fd5b634e487b7160e01b89526041600452602489fd5b60405162461bcd60e51b815260206004820152600c60248201526b6f6e6c7920666163746f727960a01b6044820152606490fd5b634e487b7160e01b83526041600452602483fd5b67ffffffffffffffff81116107f557604052565b90601f8019910116810190811067ffffffffffffffff8211176107f557604052565b67ffffffffffffffff81116107f557601f01601f191660200190565b81601f820112156109975780359061096782610934565b926109756040519485610912565b8284526020838301011161099757816000926020809301838601378301015290565b600080fd5b600435906001600160a01b038216820361099757565b35906001600160a01b038216820361099757565b919082519283825260005b8481106109f2575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016109d1565b91929015610a685750815115610a1a575090565b3b15610a235790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610a7b5750805190602001fd5b60405162461bcd60e51b815260206004820152908190610a9f9060248301906109c6565b0390fd5b6000546001600160a01b03163303610ab757565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fdfe6080806040523461005c576207a1206001556007805460ff60a01b1916600160a01b1790556002600c556019805461ffff60a81b191661010160a81b179055601780546001600160a01b031916331790556141d790816100628239f35b600080fdfe60808060405260043610156200001f575b5036156200001d57600080fd5b005b600090813560e01c9081630445b6671462001f4b5750806306fdde031462001ea8578063095ea7b31462001e7b578063125f9e331462001e0157806316d9962b1462001dcd57806318160ddd1462001dad5780631df4ccfc1462001d8d5780631f53ac021462001d3b57806323b872dd1462001c7357806327193bc41462001bf1578063273123b71462001b4a5780632b112e491462001afa5780632d48e8961462001a80578063313ce5671462001a6257806336e4ec641462001a4257806338b52cb814620010db5780633950935114620010825780633c8228121462000f875780633dab52691462000f2c5780633f4218e01462000ee95780634355855a1462000ea657806344de2e4c1462000e7e5780634a74bb021462000e56578063546a88111462000db957806359a51c341462000d8e57806364d817fa1462000d125780636827e7641462000cf2578063704ce43e1462000cd257806370a082311462000c955780637c0ff2051462000c755780637d1db4a51462000c555780637db1342c1462000c16578063807c2d9c1462000bf657806383ad79941462000bd65780638b42507f1462000b935780638ea5220f1462000b685780639502c4261462000b4857806395d89b411462000a66578063a3a2e89e1462000a00578063a3e6761014620009d5578063a457c2d7146200092c578063a8aa1b311462000901578063a9059cbb14620008c8578063aa8e79c214620008a8578063b0c8edbd1462000888578063bad3ea6a146200085f578063bb542ef0146200080c578063bf56b37114620007ec578063c45a015514620007c1578063ca987b0e14620007a1578063cb29813c1462000748578063cc6badb31462000728578063d4fb9a011462000700578063d920334e14620006c1578063dd62ed3e146200066c578063e4cbd6b3146200057d578063e66b1d1e1462000528578063ef92e2221462000443578063f16fd78d14620003f4578063f887ea4014620003c9578063fabe628314620003605763fbd75753036200001057346200035d57806003193601126200035d576200033960018060a01b03601754163314620020d5565b6019805460ff60b01b19811660b091821c60ff161590911b60ff60b01b1617905580f35b80fd5b50346200035d5760403660031901126200035d57620003c66200038262001fb4565b6200038c620020c5565b60185490916001600160a01b0391620003a9908316331462002234565b1683526009602052604083209060ff801983541691151516179055565b80f35b50346200035d57806003193601126200035d576015546040516001600160a01b039091168152602090f35b50346200035d5760203660031901126200035d576200041262001fb4565b600754906001600160a01b03906200042e8284163314620021e7565b16906001600160601b0360a01b161760075580f35b50346200035d57806003193601126200035d576200046d60018060a01b0360185416331462002234565b6002600c5403620004f057600b546200048881151562002281565b6203f4808101809111620004dc574210620004ac576001600c55620003c66200303b565b60405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b6044820152606490fd5b634e487b7160e01b82526011600452602482fd5b60405162461bcd60e51b815260206004820152601060248201526f08585b1c9958591e481c99591d58d95960821b6044820152606490fd5b50346200035d5760203660031901126200035d5762000546620020b5565b6200055d60018060a01b0360185416331462002234565b6007805460ff60a01b191691151560a01b60ff60a01b1691909117905580f35b50346200035d5780620005903662001ffc565b60185490916001600160a01b0391620005ad908316331462002234565b8184541690813b156200066857849160248392604051948593849263f821076960e01b845260048401525af19081156200065d57849162000645575b50541690813b1562000641578291602483926040519485938492635117196160e01b845260048401525af180156200063657620006235750f35b6200062e9062002013565b6200035d5780f35b6040513d84823e3d90fd5b5050fd5b620006509062002013565b62000641578238620005e9565b6040513d86823e3d90fd5b8480fd5b50346200035d5760403660031901126200035d576200068a62001fb4565b60406200069662001fd0565b9260018060a01b03809316815260036020522091166000526020526020604060002054604051908152f35b50346200035d5760203660031901126200035d57600435620006ef60018060a01b0360185416331462002234565b620006fa8162002f55565b601d5580f35b50346200035d57806003193601126200035d57602060ff60195460b01c166040519015158152f35b50346200035d57806003193601126200035d576020601054604051908152f35b50346200035d5760c03660031901126200035d576200077360018060a01b0360185416331462002234565b600435600d55604435600e55608435600f5560243560105560643560115560a435601255620003c66200303b565b50346200035d57806003193601126200035d576020601454604051908152f35b50346200035d57806003193601126200035d576017546040516001600160a01b039091168152602090f35b50346200035d57806003193601126200035d576020600b54604051908152f35b50346200035d5760203660031901126200035d576004356001600160a01b03818116918290036200085b576200084a60185491339083161462002234565b6001600160a01b0319161760185580f35b8280fd5b50346200035d57806003193601126200035d57546040516001600160a01b039091168152602090f35b50346200035d57806003193601126200035d576020601c54604051908152f35b50346200035d57806003193601126200035d576020601b54604051908152f35b50346200035d5760403660031901126200035d57620008f5620008ea62001fb4565b602435903362002318565b50602060405160018152f35b50346200035d57806003193601126200035d576016546040516001600160a01b039091168152602090f35b50346200035d5760403660031901126200035d576200094a62001fb4565b60406024359233815260036020522060018060a01b038216600052602052604060002054918083106200099057620009859203903362002960565b602060405160018152f35b60405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606490fd5b50346200035d57806003193601126200035d576018546040516001600160a01b039091168152602090f35b50346200035d5760403660031901126200035d57620003c662000a2262001fb4565b62000a2c620020c5565b60185490916001600160a01b039162000a49908316331462002234565b1683526008602052604083209060ff801983541691151516179055565b50346200035d57806003193601126200035d57604051908060065462000a8c8162002122565b8085529160019180831690811562000b1b575060011462000acc575b62000ac88562000abb8187038262002028565b6040519182918262001f69565b0390f35b925060068352600080516020620041628339815191525b82841062000b0257505050810160200162000abb8262000ac862000aa8565b8054602085870181019190915290930192810162000ae3565b86955062000ac89693506020925062000abb94915060ff191682840152151560051b820101929362000aa8565b50346200035d57806003193601126200035d576020601254604051908152f35b50346200035d57806003193601126200035d576019546040516001600160a01b039091168152602090f35b50346200035d5760203660031901126200035d5760209060ff906040906001600160a01b0362000bc262001fb4565b168152600984522054166040519015158152f35b50346200035d57806003193601126200035d576020600d54604051908152f35b50346200035d57806003193601126200035d576020601e54604051908152f35b50346200035d5760203660031901126200035d5760043562000c4460018060a01b0360185416331462002234565b62000c4f8162002f55565b601e5580f35b50346200035d57806003193601126200035d576020601d54604051908152f35b50346200035d57806003193601126200035d576020601154604051908152f35b50346200035d5760203660031901126200035d576020906040906001600160a01b0362000cc162001fb4565b168152600283522054604051908152f35b50346200035d57806003193601126200035d576020600e54604051908152f35b50346200035d57806003193601126200035d576020600f54604051908152f35b50346200035d5760203660031901126200035d5762000d3062001fb4565b6017546001600160a01b03919062000d4c9083163314620020d5565b1680825260096020526040822060ff19906001828254161790556008602052600160408420918254161790556001600160601b0360a01b601754161760175580f35b50346200035d57806003193601126200035d576007546040516001600160a01b039091168152602090f35b50346200035d57806003193601126200035d576017546001600160a01b039062000de79082163314620020d5565b806015541682526008602052604082209060ff1991600183825416179055806015541683526009602052604083206001838254161790556018541682526001604083209182541617905560195460ff60a01b1960075416600755600160b01b9061ffff60a81b19161760195580f35b50346200035d57806003193601126200035d57602060ff60195460a81c166040519015158152f35b50346200035d57806003193601126200035d57602060ff60075460a01c166040519015158152f35b50346200035d5760203660031901126200035d5760209060ff906040906001600160a01b0362000ed562001fb4565b168152600a84522054166040519015158152f35b50346200035d5760203660031901126200035d5760209060ff906040906001600160a01b0362000f1862001fb4565b168152600884522054166040519015158152f35b50346200035d5760403660031901126200035d5762000f4a620020b5565b62000f6160018060a01b0360185416331462002234565b6019805460ff60a81b191691151560a81b60ff60a81b16919091179055602435601f5580f35b50346200035d5760203660031901126200035d5760043562000fb560018060a01b03600754163314620021e7565b600b5462000fc581151562002281565b6203f48081018091116200106e5742106200104257600181116200103e57806200103891600c5562001016816200101062001006600f54600e54906200215f565b600d54906200215f565b6200215f565b601355620010106200102e601254601154906200215f565b601054906200215f565b60145580f35b5080fd5b600281116200103e57806200103891600c5562001016816200101062001006600f54600e54906200215f565b634e487b7160e01b83526011600452602483fd5b50346200035d5760403660031901126200035d5762000985906040620010a762001fb4565b9133815260036020522060018060a01b038216600052602052620010d36024356040600020546200215f565b903362002960565b50346200035d5760031960e0368201126200103e5760043567ffffffffffffffff81116200085b57610140809282360301126200085b5760405191820182811067ffffffffffffffff82111762001a2857604052806004013567ffffffffffffffff811162001a3e5762001156906004369184010162002068565b825260248101359067ffffffffffffffff821162001a3e5762001183610124926004369184010162002068565b60208401526044810135604084015260648101356060840152620011aa6084820162001fe7565b6080840152620011bd60a4820162001fe7565b60a0840152620011d060c4820162001fe7565b60c0840152620011e360e4820162001fe7565b60e0840152620011f7610104820162001fe7565b610100840152013561012082015260c03660231901126200103e57604051918260c081011067ffffffffffffffff60c08501111762001a285760c08301604052602435835260443560208401526064356040840152608435606084015260a435608084015260c43560a08401526200127b60018060a01b03601754163314620020d5565b815192835167ffffffffffffffff811162001a14576200129d60055462002122565b601f8111620019a5575b50602094601f82116001146200192f57948394958293949262001923575b50508160011b916000199060031b1c1916176005555b602083015192835167ffffffffffffffff81116200190f576200130060065462002122565b601f8111620018a0575b50602094601f82116001146200182a5794849582939495926200181e575b50508160011b916000199060031b1c1916176006555b6200135060408201516004546200215f565b6004556046606082015110620017ef57606462001377604083015160608401519062002183565b048362001389826040850151620021b8565b91338252600260205260408220620013a38282546200215f565b905560808401516001600160a01b031682526002602052604082208054620013cd9085906200215f565b90556040519081526000805160206200414283398151915290828260203393a360808401516040519384526001600160a01b031692602090a36040810151600581029080820460051490151715620017db576103e89004601d55604081015180800460011481151715620017db5760649004601e55604081015180600581020460051481151715620017db576005610fa0910204601f558260018060a01b0360e08301511681601554826001600160601b0360a01b82161760155516176040519063c45a015560e01b8252602082600481845afa9081156200173d576004928492620017b4575b50602090604051938480926315ab88c960e31b82525afa9182156200173d57602092604491859162001792575b506040516364e329cb60e11b81526001600160a01b0391821660048201523060248201529485938492165af19081156200065d5784916200175c575b50601680546001600160a01b0319166001600160a01b0392831617905530845260036020908152604080862060155484166000908152925290819020600019905560e083015160c0840151915192918216911667ffffffffffffffff61108384019081119084111762001748576110836200309f8439611083830190815260208101919091523060408201528190036060019084f080156200173d5783546001600160a01b0319166001600160a01b0391821617845530808552600860209081526040808720805460ff1990811660019081179092556017805487168a52838a208054831684179055858a5260098552838a20805483168417905560808881015188168b52848b2080548416851790556016805489168c52858c208054851686179055915488168b52848b20805484168517905561dead808c52858c2080548516861790558b8052858c20805485168617905591549097168a52600a8552838a208054831684179055948952828920805482168317905593885281882080548516821790558780528188208054909416179092558451600d5590840151600e5590830151600f55820151601055606082015160115560a09091015160125561012090620016e96200303b565b6080810151601880546001600160a01b039283166001600160a01b03199182161790915560a083015160198054918416918316919091179055610100830151600780549190931691161790550151601b5580f35b6040513d85823e3d90fd5b634e487b7160e01b86526041600452602486fd5b62001783915060203d6020116200178a575b6200177a818362002028565b810190620021c6565b386200151d565b503d6200176e565b620017ad9150843d86116200178a576200177a818362002028565b38620014e1565b6020919250620017d390823d84116200178a576200177a818362002028565b9190620014b4565b634e487b7160e01b84526011600452602484fd5b60405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606490fd5b01519050388062001328565b60068552601f198216956000805160206200416283398151915291865b88811062001887575083600195969798106200186d575b505050811b016006556200133e565b015160001960f88460031b161c191690553880806200185e565b9192602060018192868501518155019401920162001847565b60068552601f820160051c600080516020620041628339815191520160208310620018f8575b601f820160051c60008051602062004162833981519152018110620018ec57506200130a565b858155600101620018c6565b5060008051602062004162833981519152620018c6565b634e487b7160e01b84526041600452602484fd5b015190503880620012c5565b60058452601f198216956000805160206200412283398151915291855b8881106200198c5750836001959697981062001972575b505050811b01600555620012db565b015160001960f88460031b161c1916905538808062001963565b919260206001819286850151815501940192016200194c565b60058452601f820160051c600080516020620041228339815191520160208310620019fd575b601f820160051c60008051602062004122833981519152018110620019f15750620012a7565b848155600101620019cb565b5060008051602062004122833981519152620019cb565b634e487b7160e01b83526041600452602483fd5b634e487b7160e01b600052604160045260246000fd5b8380fd5b50346200035d57806003193601126200035d576020600c54604051908152f35b50346200035d57806003193601126200035d57602060405160098152f35b50346200035d578062001a933662001ffc565b6018549192916001600160a01b039062001ab1908216331462002234565b82541692833b156200085b576044908360405195869485936316a4744b60e11b8552600485015260248401525af18015620006365762001aef575080f35b620003c69062002013565b50346200035d57806003193601126200035d5762001b42602091604062001b3160045461dead8452600286528284205490620021b8565b9180805260028552205490620021b8565b604051908152f35b50346200035d5760203660031901126200035d5762001b6862001fb4565b6007546001600160a01b03919082163314801562001be3575b1562001b9e57168152601a60205260408120805460ff1916905580f35b60405162461bcd60e51b815260206004820152601e60248201527f43616c6c657220646f65736e27742068617665207065726d697373696f6e00006044820152606490fd5b508160185416331462001b81565b50346200035d57806003193601126200035d5762001c1b60018060a01b03601754163314620020d5565b600b5462001c3b5742600b5562001c35601b54426200215f565b601c5580f35b60405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b6044820152606490fd5b50346200035d5760603660031901126200035d5762001c9162001fb4565b9062001c9c62001fd0565b60406044359260018060a01b03851681526003602052818120338252602052205492600019840362001cd5575b620008f5935062002318565b82841062001cf65762001cf083620008f59503338362002960565b62001cc9565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b50346200035d5760203660031901126200035d576004356001600160a01b03818116918290036200085b5762001d779060185416331462002234565b6001600160601b0360a01b601954161760195580f35b50346200035d57806003193601126200035d576020601354604051908152f35b50346200035d57806003193601126200035d576020600454604051908152f35b50346200035d5760203660031901126200035d5762001df860018060a01b0360185416331462002234565b60043560015580f35b50346200035d57806003193601126200035d57805460405163125f9e3360e01b8152906001600160a01b03906020908390600490829085165afa9182156200173d576020939262001e57575b5060405191168152f35b62001e73919250833d81116200178a576200177a818362002028565b903862001e4d565b50346200035d5760403660031901126200035d576200098562001e9d62001fb4565b602435903362002960565b50346200035d57806003193601126200035d57604051908060055462001ece8162002122565b8085529160019180831690811562000b1b575060011462001efc5762000ac88562000abb8187038262002028565b925060058352600080516020620041228339815191525b82841062001f3257505050810160200162000abb8262000ac862000aa8565b8054602085870181019190915290930192810162001f13565b9050346200103e57816003193601126200103e57602090601f548152f35b6020808252825181830181905290939260005b82811062001f9f57505060409293506000838284010152601f8019910116010190565b81810186015184820160400152850162001f7c565b600435906001600160a01b038216820362001fcb57565b600080fd5b602435906001600160a01b038216820362001fcb57565b35906001600160a01b038216820362001fcb57565b604090600319011262001fcb576004359060243590565b67ffffffffffffffff811162001a2857604052565b90601f8019910116810190811067ffffffffffffffff82111762001a2857604052565b67ffffffffffffffff811162001a2857601f01601f191660200190565b81601f8201121562001fcb5780359062002082826200204b565b9262002092604051948562002028565b8284526020838301011162001fcb57816000926020809301838601378301015290565b60043590811515820362001fcb57565b60243590811515820362001fcb57565b15620020dd57565b60405162461bcd60e51b815260206004820152601960248201527f43616c6c6572206973206e6f742074686520666163746f7279000000000000006044820152606490fd5b90600182811c9216801562002154575b60208310146200213e57565b634e487b7160e01b600052602260045260246000fd5b91607f169162002132565b919082018092116200216d57565b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156200216d57565b8115620021a2570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116200216d57565b9081602091031262001fcb57516001600160a01b038116810362001fcb5790565b15620021ef57565b60405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74207468652070726f6f6641646d696e000000006044820152606490fd5b156200223c57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606490fd5b156200228957565b60405162461bcd60e51b8152602060048201526009602482015268085b185d5b98da195960ba1b6044820152606490fd5b60809060208152604060208201527f506c6561736520636865636b206966206469737472696275746f72206973206160408201527f74206d61782077616c6c6574206f72207472616e7366657220616d6f756e742e60608201520190565b9060199182549360009460ff809160b01c1615620029305760018060a01b0380841694858852602094601a865260409380858b20541615806200291d575b156200291957601c5480151590816200290e575b50620028c3575b80895460a01c166200286457908392918a9b9a9460165416998484169a808c148062002855575b620027c7575b8b875260098a52888884818a2054161580620027b8575b6200275c575b50508a1415806200274d575b806200273f575b8062002728575b620026ff575b50888552600291828952620023f48888882054620021b8565b8a8752838a5287872055601654851688818c148015620026f5575b62002649575b50508a86528289526200242c88888820546200215f565b8b8752838a5287872055898652600a8952818787205416156200259f575b50898552600a885285852054161562002500575b505081541660015490803b156200085b57602483928551948593849263ffb2c47960e01b845260048401525af19081620024e4575b5060008051602062004142833981519152949596975015600014620024de5760008051602062004182833981519152815180620024d081620022ba565b0390a15b51908152a3600190565b620024d4565b620024f0899162002013565b620024fc578762002493565b8780fd5b828454169087528484205491813b1562000668578551630a5b654b60e11b81526001600160a01b039190911660048201526024810192909252839081908390604490829084905af1918262002587575b50506200258157600080516020620041828339815191528351806200257581620022ba565b0390a15b38806200245e565b62002579565b620025929062002013565b6200085b57823862002550565b909192939485815416848a528782205490803b156200085b578851630a5b654b60e11b81526001600160a01b0394909416600485015260248401919091528290604490829084905af190816200262b575b508b94939291906200262557600080516020620041828339815191528651806200261a81620022ba565b0390a15b386200244a565b6200261e565b6200263d909c91959493929c62002013565b9a9091929338620025f0565b9091985060088a528b8389892054161580620026e4575b15620026db57620026c39203620026cc576064620026826014545b8362002183565b0490308852848b5262002699828a8a20546200215f565b308952858c528989205588518281528c600080516020620041428339815191528d3093a3620021b8565b96388062002415565b6064620026826013546200267b565b509050620026c3565b5087528b8389892054161562002660565b50818d146200240f565b805460ff60a01b19908116600160a01b1782556200271c62002a99565b815416905538620023db565b503086526002895286862054601f541115620023d5565b5081815460a81c16620023ce565b5081815460a01c1615620023c7565b620027739293949596979860028d5220546200215f565b601e54106200278b57908c95949392918888620023bb565b865162461bcd60e51b8152600481018a905260066024820152651dd85b1b195d60d21b6044820152606490fd5b508460075460a01c16620023b5565b90919293949550601d54881180159062002823575b15620027ef57908c95949392916200239e565b865162461bcd60e51b8152600481018a9052600d60248201526c13585e08151608105b5bdd5b9d609a1b6044820152606490fd5b50898d5260098952868d2054831683888f8362002844575b505050620027dc565b8e8152205416905083888f6200283b565b508260075460a01c1662002398565b505085600080516020620041428339815191529697508852600285526200288f84848a2054620021b8565b8789526002865283892055169586815281620028af84828420546200215f565b9188815260028652205551908152a3600190565b32808b52858b20805460ff19166001179055838516146200237157845162461bcd60e51b8152600481018890526009602482015268616e7469736e69706560b81b6044820152606490fd5b90504210386200236a565b8980fd5b508383168a5280858b2054161562002356565b60405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b6044820152606490fd5b6001600160a01b0390811691821562002a135716918215620029c35760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260038252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b3d1562002a94573d9062002a78826200204b565b9162002a88604051938462002028565b82523d6000602084013e565b606090565b600030815260209060028252604091828220549162002ac962002abf600e548562002183565b6013549062002197565b9062002adb600192831c8095620021b8565b801562002f4d57855160609586820182811067ffffffffffffffff82111762002f3957885260028252858201918836843780511562002f255730835260155489516315ab88c960e31b81526004956001600160a01b039592861692918a818981875afa90811562002f1b57899162002ef9575b5084518a101562002ee65786168c850152823b15620024fc578b5163791ac94760e01b8152878101919091526024810188905260a06044820152925160a4840181905287928492909160c484019190858c8e5b83831062002ec95750505050508383809230606483015242608483015203925af1801562002ebf5762002ea9575b508662002be462002abf47600e549062002183565b861c918062002e19575b50505082479462002c02600f548762002183565b9062002c2b62002c16601354809462002197565b9262002c25600c548a62002183565b62002197565b9062002c438262002c3d858b620021b8565b620021b8565b9762002cf2575b505050541690813b156200085b578651630d0e30db60e41b815293839285929183915af1918262002cda575b505062002cd5576a31b7b6b830ba34b136329760a91b6080927f506c6561736520636865636b2069662072657761726420746f6b656e2069732085602b60008051602062004182833981519152975195808752860152840152820152a1565b505050565b62002ce6829162002013565b6200035d578062002c76565b8162002d2e575b50508062002d0a575b808062002c4a565b8180809285601954165af162002d1f62002a64565b50156200085b57823862002d02565b909192501c838784601754168b5192838092633690e28760e01b82525afa90811562002ded5786808487829583958e859262002df7575b5050165af162002d7462002a64565b50156200066857838784601754168b519283809263d7e7a9e760e01b82525afa90811562002ded578680938682948394849162002dcb575b50165af162002dba62002a64565b501562001a3e578390388062002cf9565b62002de691508d803d106200178a576200177a818362002028565b3862002dac565b8a513d88823e3d90fd5b62002e119250803d106200178a576200177a818362002028565b388e62002d65565b60c48460155416918b51948593849263f305d71960e01b8452308a850152602484015289604484015289606484015261dead60848401524260a48401525af1801562002e9f5790879162002e70575b819062002bee565b813d831162002e97575b62002e86818362002028565b810103126200085b57853862002e68565b503d62002e7a565b88513d86823e3d90fd5b62002eb79094919462002013565b923862002bcf565b89513d87823e3d90fd5b84518c1686528d98508997509485019490930192018c8e62002ba1565b634e487b7160e01b895260328852602489fd5b62002f1491508b3d8d116200178a576200177a818362002028565b3862002b4e565b8d513d8b823e3d90fd5b634e487b7160e01b85526032600452602485fd5b634e487b7160e01b85526041600452602485fd5b505050505050565b62002f64600b54151562002281565b600454600581028115908281046005148217156200216d576103e89004831062002fd3576003820291820460031417156200216d57606490041062002fa557565b60405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606490fd5b156200300b57565b60405162461bcd60e51b81526020600482015260086024820152670a8dede40d0d2ced60c31b6044820152606490fd5b6200309c60116200305662001006600f54600e54906200215f565b62003094600c620030876200306e825480956200215f565b9384601355620010106200102e6012548854906200215f565b9283601455111562003003565b111562003003565b56fe608060409080825234620001e857606081620010838038038091620000258285620001ed565b833981010312620001e8576200003b8162000227565b60209062000058846200005084860162000227565b940162000227565b6ec097ce7bc90715b34b9f1000000000600b55610708600c55670de0b6b3a7640000600d55600180546001600160a01b03199081166001600160a01b03948516179091556002805482169584169590951790945560008054909416918116919091178355835163313ce56760e01b838201908152600482526001600160401b03929180870184811182821017620001d45787525185928392905afa3d15620001ca573d918211620001b6578451916200011b601f8201601f1916850184620001ed565b82523d848484013e5b156200017f5781818051810103126200017b5701519060ff82168092036200017857604d8211620001645750600a0a600d5551610e4690816200023d8239f35b634e487b7160e01b81526011600452602490fd5b80fd5b8280fd5b835162461bcd60e51b815260048101839052601060248201526f696e76616c696420646563696d616c7360801b6044820152606490fd5b634e487b7160e01b84526041600452602484fd5b6060915062000124565b634e487b7160e01b87526041600452602487fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200021157604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001e85756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826311ce023d146109f357508163125f9e331461018957816314b6ca96146107b657816328fd3198146107895781632d48e896146107595781633a98ef391461073a5781634fab0ae81461071b57816351171961146106f057816366817df5146106b85781638477d9f31461061f578163997664d714610600578163ce7c2ac2146105b2578163d0e30db014610298578163d4fda1f214610262578163e2d2e21914610243578163efca2eed14610224578163f0fc6bca146101b2578163f1e9f1e514610189578163f82107691461015e578163ffb2c4791461012d575063ffd49c841461010c57600080fd5b34610129578160031936011261012957602090600c549051908152f35b5080fd5b8390346101295760203660031901126101295781546001600160a01b031633036101295761015b9035610b8a565b80f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600c5580f35b50503461012957816003193601126101295760025490516001600160a01b039091168152602090f35b919050346102205782600319360112610220576101ce33610c58565b156101dd578261015b33610c9c565b906020606492519162461bcd60e51b8352820152601760248201527f546f6f20736f6f6e2e204e65656420746f2077616974210000000000000000006044820152fd5b8280fd5b5050346101295781600319360112610129576020906009549051908152f35b505034610129578160031936011261012957602090600a549051908152f35b9050346102205760203660031901126102205760209282916001600160a01b0361028a610a0f565b168252845220549051908152f35b919050826003193601126102205782546001600160a01b039190821633036105ae578160025416908051916370a0823160e01b9384845230868501526020918285602481845afa9485156105a4578895610571575b508351906060820182811067ffffffffffffffff82111761055e5785526002825284368584013782600154169085516315ab88c960e31b815285818b81865afa908115610554578b9161051a575b508461034685610ade565b9116905261035383610b01565b52888361035f84610ade565b51168461036b85610b01565b51160361049657505061037e8291610ade565b51169087823b15610493578088938651998a8092630d0e30db60e41b825234905af197881561048757849596979861046a575b50506024905b600254169685519788938492835230908301525afa9182156104615750849161042c575b506103e69250610aae565b6103f281600854610ad1565b6008556007549081610402578280f35b61041d61042392610418600a5493600b54610b11565b610b24565b90610ad1565b600a5538808280f35b905082813d831161045a575b6104428183610a8c565b81010312610455576103e69151386103db565b600080fd5b503d610438565b513d86823e3d90fd5b61047691929450610a62565b61048357829187386103b1565b8680fd5b508451903d90823e3d90fd5b80fd5b9091829894959697983b15610129576104d0928751808095819463b6f9de9560e01b8352868a840152608060248401526084830190610a25565b306044830152426064830152039134905af18015610510576104f8575b5090602483926103b7565b83929197610507602492610a62565b979192506104ed565b85513d8a823e3d90fd5b90508581813d831161054d575b6105318183610a8c565b8101031261054957518481168103610549573861033b565b8a80fd5b503d610527565b87513d8d823e3d90fd5b634e487b7160e01b8a526041895260248afd5b9094508281813d831161059d575b6105898183610a8c565b81010312610599575193386102ed565b8780fd5b503d61057f565b84513d8a823e3d90fd5b8380fd5b5050346101295760203660031901126101295760609181906001600160a01b036105da610a0f565b168152600660205220805491600260018301549201549181519384526020840152820152f35b5050346101295781600319360112610129576020906008549051908152f35b50503461012957816003193601126101295780519081809360035490818552602080950191600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915b868282106106985785906106948861068584890385610a8c565b51928284938452830190610a25565b0390f35b83546001600160a01b03168552889550909301926001928301920161066b565b5050346101295760203660031901126101295760209181906001600160a01b036106e0610a0f565b1681526005845220549051908152f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600d5580f35b505034610129578160031936011261012957602090600d549051908152f35b5050346101295781600319360112610129576020906007549051908152f35b91905034610220573660031901126101295781546001600160a01b031633036101295735600c55602435600d5580f35b505034610129576020366003190112610129576020906107af6107aa610a0f565b610dad565b9051908152f35b8383346101295780600319360112610129576107d0610a0f565b82546024359291906001600160a01b0390811633036109ef5780821693848652600692602092848452858820546109e1575b82158015806109d0575b156108d55750506003548688528884528086892055680100000000000000008110156108c2576001969798509061084b828861086f9401600355610b44565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b61088e81610889600754898b52868652878b205490610aae565b610ad1565b600755858752828252838720556108b76108ae84882054600a5490610b11565b600b5490610b24565b948652528320015580f35b634e487b7160e01b885260418952602488fd5b909150806109be575b6108ef575b5060019495965061086f565b60038054600019908181019081116109ab578361090e61092792610b44565b905490851b1c16898b528b875261084b898c2054610b44565b878952898552868920548254828101908111610998576109478591610b44565b905490851b1c168a528a8652878a20558154801561098557600198999a50019161097083610b44565b9091825491841b1b19169055558695946108e3565b634e487b7160e01b8a5260318b5260248afd5b634e487b7160e01b8b5260118c5260248bfd5b634e487b7160e01b8a5260118b5260248afd5b508587528383528487205415156108de565b50878952858552868920541561080c565b6109ea82610c9c565b610802565b8480fd5b849034610129578160031936011261012957602090600b548152f35b600435906001600160a01b038216820361045557565b90815180825260208080930193019160005b828110610a45575050505090565b83516001600160a01b031685529381019392810192600101610a37565b67ffffffffffffffff8111610a7657604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a7657604052565b91908203918211610abb57565b634e487b7160e01b600052601160045260246000fd5b91908201809211610abb57565b805115610aeb5760200190565b634e487b7160e01b600052603260045260246000fd5b805160011015610aeb5760400190565b81810292918115918404141715610abb57565b8115610b2e570490565b634e487b7160e01b600052601260045260246000fd5b600354811015610aeb5760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b6000198114610abb5760010190565b906003908154908115610c525792916000908180955a5b86881080610c49575b15610c3f57610bfd610bf6610c1192600e9a898c541015610c37575b8b54610bea610bd482610b44565b90546001600160a01b0392918c1b1c8216610c58565b610c18575b5050610ad1565b5a90610aae565b945a98610c0a8154610b7b565b9055610b7b565b9396610ba1565b610c24610c3092610b44565b9054908b1b1c16610c9c565b3880610bef565b868c55610bc6565b5095505050505050565b50858510610baa565b92505050565b6001600160a01b038116600090815260056020526040902054600c54610c7d91610ad1565b4210159081610c8a575090565b610c949150610dad565b600d54111590565b60018060a01b0380821690600092828452602091600683526040918286205415610ccf57610cc990610dad565b80610cd7575b505050505050565b60448492610ce783600954610ad1565b60095586885260058452428589205560068452610d0a836002878b200154610ad1565b878952600685526002868a200155610d2b6108ae868a2054600a5490610b11565b878952600685526001868a2001556002541695878551978894859363a9059cbb60e01b8552600485015260248401525af1908115610da45750610d71575b808080610ccf565b81813d8311610d9d575b610d858183610a8c565b81010312610129575180151503610493578080610d69565b503d610d7b565b513d85823e3d90fd5b6001600160a01b031660008181526006602052604081205490919015610e0c57610de16108ae6040842054600a5490610b11565b908252600660205260016040832001549081811115610e0757610e049250610aae565b90565b505090565b509056fea264697066735822122065a8ddf6611d2f33c026dc2e045e976b21c2a1f03d159ffe0f05c20c8643cab264736f6c63430008110033036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3eff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3fd72a8ea23981bee6010db9fcb484814e1fbb4f6c05474e7f786ef89cae9f3e5ea26469706673582212206bcbae3f01575387a9ad1123719cb70827be65812b899eae6b4f0d113647da1364736f6c63430008110033a26469706673582212201fe7c06349f1b89694260e76d084364bbfaaf8255e8b77516b2c22a0bcf8eed864736f6c63430008110033
Deployed Bytecode
0x6080604052600436101561001b575b361561001957600080fd5b005b6000803560e01c80630464d3df1461027157806364d817fa146101e0578063715018a6146101865780638da5cb5b1461015f578063bbd45223146101365763f2fde38b14610069575061000e565b346101335760203660031901126101335761008261099c565b61008a610aa3565b6001600160a01b039081169081156100df57600054826bffffffffffffffffffffffff60a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b80fd5b50346101335780600319360112610133576001546040516001600160a01b039091168152602090f35b5034610133578060031936011261013357546040516001600160a01b039091168152602090f35b503461013357806003193601126101335761019f610aa3565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610133576020366003190112610133576101fa61099c565b610202610aa3565b6001600160a01b0316801561022c576bffffffffffffffffffffffff60a01b600154161760015580f35b60405162461bcd60e51b815260206004820152601960248201527f7a65726f2050726f6f66466163746f72792061646472657373000000000000006044820152606490fd5b5034610133576003196080368201126107e9576004359067ffffffffffffffff821161086b576101c08091833603011261086b576080016080811067ffffffffffffffff8211176108ea57604052806004013567ffffffffffffffff811161086b576102e39060043691840101610950565b60805260248101359067ffffffffffffffff821161086b5761030e6101a49260043691840101610950565b60a052604481013560c052606481013560e05261032d608482016109b2565b6101005261033d60a482016109b2565b6101205260c48101356101405260e481013561016052610104810135610180526101248101356101a0526101448101356101c0526101648101356101e052610184810135610200520135610220526024356001600160a01b038116900361013357604435906001600160a01b038216820361013357606435916001600160a01b03831683036107e9576001546001600160a01b031633036108b6576101405161016051610180516101a0516101c0516101e0516040519590949193919067ffffffffffffffff60c08801908111908811176108a25760c087016040528652602086015260408501526060840152608083015260a08201526040518061423981011067ffffffffffffffff6142398301111761088e57614239610afc8239806142398101039084f080156108835760805160a05160c05160e0516101205161010051610220516040516001600160a01b039889169c909a91989197928216969190931694929392916101408b01808c1167ffffffffffffffff9091111761086f576101408b016040528a5260208a01526040890152606088015260018060a01b0316608087015260a086015260c085015260018060a01b036024351660e085015260018060a01b0316610100840152610120830152833b1561086b5760a083916040519384928392630716a59760e31b845260e0600485015261012061056a610553855161014060e48901526102248801906109c6565b602086015187820360e319016101048901526109c6565b6040808601516101248801526060808701516101448901526080808801516000196001891b019081166101648b01528789015181166101848b015260c089015181166101a48b015260e089015181166101c48b0152610100890151166101e48a015293909601516102048801528351602488015260208401516044880152830151606487015293820151608486015281015160a4850152015160c4830152038183875af1801561083d5761085c575b506001546001600160a01b0316823b156107e9576040519063326c0bfd60e11b82526004820152818160248183875af1801561083d57908291610848575b50506040516370a0823160e01b8152306004820152602081602481865afa90811561083d57829161080b575b5060018060a01b03600154169060405190602082019263a9059cbb60e01b84526024830152604482015260448152608081019080821067ffffffffffffffff8311176107f55760c0810182811067ffffffffffffffff8211176107f557604052602082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656460a082015251610749928491829182885af13d156107ed573d9061072b82610934565b916107396040519384610912565b82523d85602084013e5b85610a06565b9081519182159283156107c2575b5050501561076a57602090604051908152f35b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b8192935090602091810103126107e957602001519081151582036101335750388080610757565b5080fd5b606090610743565b634e487b7160e01b600052604160045260246000fd5b90506020813d602011610835575b8161082660209383610912565b810103126107e9575138610683565b3d9150610819565b6040513d84823e3d90fd5b610851906108fe565b610133578038610657565b610865906108fe565b38610619565b8280fd5b634e487b7160e01b8c52604160045260248cfd5b6040513d85823e3d90fd5b634e487b7160e01b84526041600452602484fd5b634e487b7160e01b89526041600452602489fd5b60405162461bcd60e51b815260206004820152600c60248201526b6f6e6c7920666163746f727960a01b6044820152606490fd5b634e487b7160e01b83526041600452602483fd5b67ffffffffffffffff81116107f557604052565b90601f8019910116810190811067ffffffffffffffff8211176107f557604052565b67ffffffffffffffff81116107f557601f01601f191660200190565b81601f820112156109975780359061096782610934565b926109756040519485610912565b8284526020838301011161099757816000926020809301838601378301015290565b600080fd5b600435906001600160a01b038216820361099757565b35906001600160a01b038216820361099757565b919082519283825260005b8481106109f2575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016109d1565b91929015610a685750815115610a1a575090565b3b15610a235790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610a7b5750805190602001fd5b60405162461bcd60e51b815260206004820152908190610a9f9060248301906109c6565b0390fd5b6000546001600160a01b03163303610ab757565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fdfe6080806040523461005c576207a1206001556007805460ff60a01b1916600160a01b1790556002600c556019805461ffff60a81b191661010160a81b179055601780546001600160a01b031916331790556141d790816100628239f35b600080fdfe60808060405260043610156200001f575b5036156200001d57600080fd5b005b600090813560e01c9081630445b6671462001f4b5750806306fdde031462001ea8578063095ea7b31462001e7b578063125f9e331462001e0157806316d9962b1462001dcd57806318160ddd1462001dad5780631df4ccfc1462001d8d5780631f53ac021462001d3b57806323b872dd1462001c7357806327193bc41462001bf1578063273123b71462001b4a5780632b112e491462001afa5780632d48e8961462001a80578063313ce5671462001a6257806336e4ec641462001a4257806338b52cb814620010db5780633950935114620010825780633c8228121462000f875780633dab52691462000f2c5780633f4218e01462000ee95780634355855a1462000ea657806344de2e4c1462000e7e5780634a74bb021462000e56578063546a88111462000db957806359a51c341462000d8e57806364d817fa1462000d125780636827e7641462000cf2578063704ce43e1462000cd257806370a082311462000c955780637c0ff2051462000c755780637d1db4a51462000c555780637db1342c1462000c16578063807c2d9c1462000bf657806383ad79941462000bd65780638b42507f1462000b935780638ea5220f1462000b685780639502c4261462000b4857806395d89b411462000a66578063a3a2e89e1462000a00578063a3e6761014620009d5578063a457c2d7146200092c578063a8aa1b311462000901578063a9059cbb14620008c8578063aa8e79c214620008a8578063b0c8edbd1462000888578063bad3ea6a146200085f578063bb542ef0146200080c578063bf56b37114620007ec578063c45a015514620007c1578063ca987b0e14620007a1578063cb29813c1462000748578063cc6badb31462000728578063d4fb9a011462000700578063d920334e14620006c1578063dd62ed3e146200066c578063e4cbd6b3146200057d578063e66b1d1e1462000528578063ef92e2221462000443578063f16fd78d14620003f4578063f887ea4014620003c9578063fabe628314620003605763fbd75753036200001057346200035d57806003193601126200035d576200033960018060a01b03601754163314620020d5565b6019805460ff60b01b19811660b091821c60ff161590911b60ff60b01b1617905580f35b80fd5b50346200035d5760403660031901126200035d57620003c66200038262001fb4565b6200038c620020c5565b60185490916001600160a01b0391620003a9908316331462002234565b1683526009602052604083209060ff801983541691151516179055565b80f35b50346200035d57806003193601126200035d576015546040516001600160a01b039091168152602090f35b50346200035d5760203660031901126200035d576200041262001fb4565b600754906001600160a01b03906200042e8284163314620021e7565b16906001600160601b0360a01b161760075580f35b50346200035d57806003193601126200035d576200046d60018060a01b0360185416331462002234565b6002600c5403620004f057600b546200048881151562002281565b6203f4808101809111620004dc574210620004ac576001600c55620003c66200303b565b60405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b6044820152606490fd5b634e487b7160e01b82526011600452602482fd5b60405162461bcd60e51b815260206004820152601060248201526f08585b1c9958591e481c99591d58d95960821b6044820152606490fd5b50346200035d5760203660031901126200035d5762000546620020b5565b6200055d60018060a01b0360185416331462002234565b6007805460ff60a01b191691151560a01b60ff60a01b1691909117905580f35b50346200035d5780620005903662001ffc565b60185490916001600160a01b0391620005ad908316331462002234565b8184541690813b156200066857849160248392604051948593849263f821076960e01b845260048401525af19081156200065d57849162000645575b50541690813b1562000641578291602483926040519485938492635117196160e01b845260048401525af180156200063657620006235750f35b6200062e9062002013565b6200035d5780f35b6040513d84823e3d90fd5b5050fd5b620006509062002013565b62000641578238620005e9565b6040513d86823e3d90fd5b8480fd5b50346200035d5760403660031901126200035d576200068a62001fb4565b60406200069662001fd0565b9260018060a01b03809316815260036020522091166000526020526020604060002054604051908152f35b50346200035d5760203660031901126200035d57600435620006ef60018060a01b0360185416331462002234565b620006fa8162002f55565b601d5580f35b50346200035d57806003193601126200035d57602060ff60195460b01c166040519015158152f35b50346200035d57806003193601126200035d576020601054604051908152f35b50346200035d5760c03660031901126200035d576200077360018060a01b0360185416331462002234565b600435600d55604435600e55608435600f5560243560105560643560115560a435601255620003c66200303b565b50346200035d57806003193601126200035d576020601454604051908152f35b50346200035d57806003193601126200035d576017546040516001600160a01b039091168152602090f35b50346200035d57806003193601126200035d576020600b54604051908152f35b50346200035d5760203660031901126200035d576004356001600160a01b03818116918290036200085b576200084a60185491339083161462002234565b6001600160a01b0319161760185580f35b8280fd5b50346200035d57806003193601126200035d57546040516001600160a01b039091168152602090f35b50346200035d57806003193601126200035d576020601c54604051908152f35b50346200035d57806003193601126200035d576020601b54604051908152f35b50346200035d5760403660031901126200035d57620008f5620008ea62001fb4565b602435903362002318565b50602060405160018152f35b50346200035d57806003193601126200035d576016546040516001600160a01b039091168152602090f35b50346200035d5760403660031901126200035d576200094a62001fb4565b60406024359233815260036020522060018060a01b038216600052602052604060002054918083106200099057620009859203903362002960565b602060405160018152f35b60405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606490fd5b50346200035d57806003193601126200035d576018546040516001600160a01b039091168152602090f35b50346200035d5760403660031901126200035d57620003c662000a2262001fb4565b62000a2c620020c5565b60185490916001600160a01b039162000a49908316331462002234565b1683526008602052604083209060ff801983541691151516179055565b50346200035d57806003193601126200035d57604051908060065462000a8c8162002122565b8085529160019180831690811562000b1b575060011462000acc575b62000ac88562000abb8187038262002028565b6040519182918262001f69565b0390f35b925060068352600080516020620041628339815191525b82841062000b0257505050810160200162000abb8262000ac862000aa8565b8054602085870181019190915290930192810162000ae3565b86955062000ac89693506020925062000abb94915060ff191682840152151560051b820101929362000aa8565b50346200035d57806003193601126200035d576020601254604051908152f35b50346200035d57806003193601126200035d576019546040516001600160a01b039091168152602090f35b50346200035d5760203660031901126200035d5760209060ff906040906001600160a01b0362000bc262001fb4565b168152600984522054166040519015158152f35b50346200035d57806003193601126200035d576020600d54604051908152f35b50346200035d57806003193601126200035d576020601e54604051908152f35b50346200035d5760203660031901126200035d5760043562000c4460018060a01b0360185416331462002234565b62000c4f8162002f55565b601e5580f35b50346200035d57806003193601126200035d576020601d54604051908152f35b50346200035d57806003193601126200035d576020601154604051908152f35b50346200035d5760203660031901126200035d576020906040906001600160a01b0362000cc162001fb4565b168152600283522054604051908152f35b50346200035d57806003193601126200035d576020600e54604051908152f35b50346200035d57806003193601126200035d576020600f54604051908152f35b50346200035d5760203660031901126200035d5762000d3062001fb4565b6017546001600160a01b03919062000d4c9083163314620020d5565b1680825260096020526040822060ff19906001828254161790556008602052600160408420918254161790556001600160601b0360a01b601754161760175580f35b50346200035d57806003193601126200035d576007546040516001600160a01b039091168152602090f35b50346200035d57806003193601126200035d576017546001600160a01b039062000de79082163314620020d5565b806015541682526008602052604082209060ff1991600183825416179055806015541683526009602052604083206001838254161790556018541682526001604083209182541617905560195460ff60a01b1960075416600755600160b01b9061ffff60a81b19161760195580f35b50346200035d57806003193601126200035d57602060ff60195460a81c166040519015158152f35b50346200035d57806003193601126200035d57602060ff60075460a01c166040519015158152f35b50346200035d5760203660031901126200035d5760209060ff906040906001600160a01b0362000ed562001fb4565b168152600a84522054166040519015158152f35b50346200035d5760203660031901126200035d5760209060ff906040906001600160a01b0362000f1862001fb4565b168152600884522054166040519015158152f35b50346200035d5760403660031901126200035d5762000f4a620020b5565b62000f6160018060a01b0360185416331462002234565b6019805460ff60a81b191691151560a81b60ff60a81b16919091179055602435601f5580f35b50346200035d5760203660031901126200035d5760043562000fb560018060a01b03600754163314620021e7565b600b5462000fc581151562002281565b6203f48081018091116200106e5742106200104257600181116200103e57806200103891600c5562001016816200101062001006600f54600e54906200215f565b600d54906200215f565b6200215f565b601355620010106200102e601254601154906200215f565b601054906200215f565b60145580f35b5080fd5b600281116200103e57806200103891600c5562001016816200101062001006600f54600e54906200215f565b634e487b7160e01b83526011600452602483fd5b50346200035d5760403660031901126200035d5762000985906040620010a762001fb4565b9133815260036020522060018060a01b038216600052602052620010d36024356040600020546200215f565b903362002960565b50346200035d5760031960e0368201126200103e5760043567ffffffffffffffff81116200085b57610140809282360301126200085b5760405191820182811067ffffffffffffffff82111762001a2857604052806004013567ffffffffffffffff811162001a3e5762001156906004369184010162002068565b825260248101359067ffffffffffffffff821162001a3e5762001183610124926004369184010162002068565b60208401526044810135604084015260648101356060840152620011aa6084820162001fe7565b6080840152620011bd60a4820162001fe7565b60a0840152620011d060c4820162001fe7565b60c0840152620011e360e4820162001fe7565b60e0840152620011f7610104820162001fe7565b610100840152013561012082015260c03660231901126200103e57604051918260c081011067ffffffffffffffff60c08501111762001a285760c08301604052602435835260443560208401526064356040840152608435606084015260a435608084015260c43560a08401526200127b60018060a01b03601754163314620020d5565b815192835167ffffffffffffffff811162001a14576200129d60055462002122565b601f8111620019a5575b50602094601f82116001146200192f57948394958293949262001923575b50508160011b916000199060031b1c1916176005555b602083015192835167ffffffffffffffff81116200190f576200130060065462002122565b601f8111620018a0575b50602094601f82116001146200182a5794849582939495926200181e575b50508160011b916000199060031b1c1916176006555b6200135060408201516004546200215f565b6004556046606082015110620017ef57606462001377604083015160608401519062002183565b048362001389826040850151620021b8565b91338252600260205260408220620013a38282546200215f565b905560808401516001600160a01b031682526002602052604082208054620013cd9085906200215f565b90556040519081526000805160206200414283398151915290828260203393a360808401516040519384526001600160a01b031692602090a36040810151600581029080820460051490151715620017db576103e89004601d55604081015180800460011481151715620017db5760649004601e55604081015180600581020460051481151715620017db576005610fa0910204601f558260018060a01b0360e08301511681601554826001600160601b0360a01b82161760155516176040519063c45a015560e01b8252602082600481845afa9081156200173d576004928492620017b4575b50602090604051938480926315ab88c960e31b82525afa9182156200173d57602092604491859162001792575b506040516364e329cb60e11b81526001600160a01b0391821660048201523060248201529485938492165af19081156200065d5784916200175c575b50601680546001600160a01b0319166001600160a01b0392831617905530845260036020908152604080862060155484166000908152925290819020600019905560e083015160c0840151915192918216911667ffffffffffffffff61108384019081119084111762001748576110836200309f8439611083830190815260208101919091523060408201528190036060019084f080156200173d5783546001600160a01b0319166001600160a01b0391821617845530808552600860209081526040808720805460ff1990811660019081179092556017805487168a52838a208054831684179055858a5260098552838a20805483168417905560808881015188168b52848b2080548416851790556016805489168c52858c208054851686179055915488168b52848b20805484168517905561dead808c52858c2080548516861790558b8052858c20805485168617905591549097168a52600a8552838a208054831684179055948952828920805482168317905593885281882080548516821790558780528188208054909416179092558451600d5590840151600e5590830151600f55820151601055606082015160115560a09091015160125561012090620016e96200303b565b6080810151601880546001600160a01b039283166001600160a01b03199182161790915560a083015160198054918416918316919091179055610100830151600780549190931691161790550151601b5580f35b6040513d85823e3d90fd5b634e487b7160e01b86526041600452602486fd5b62001783915060203d6020116200178a575b6200177a818362002028565b810190620021c6565b386200151d565b503d6200176e565b620017ad9150843d86116200178a576200177a818362002028565b38620014e1565b6020919250620017d390823d84116200178a576200177a818362002028565b9190620014b4565b634e487b7160e01b84526011600452602484fd5b60405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606490fd5b01519050388062001328565b60068552601f198216956000805160206200416283398151915291865b88811062001887575083600195969798106200186d575b505050811b016006556200133e565b015160001960f88460031b161c191690553880806200185e565b9192602060018192868501518155019401920162001847565b60068552601f820160051c600080516020620041628339815191520160208310620018f8575b601f820160051c60008051602062004162833981519152018110620018ec57506200130a565b858155600101620018c6565b5060008051602062004162833981519152620018c6565b634e487b7160e01b84526041600452602484fd5b015190503880620012c5565b60058452601f198216956000805160206200412283398151915291855b8881106200198c5750836001959697981062001972575b505050811b01600555620012db565b015160001960f88460031b161c1916905538808062001963565b919260206001819286850151815501940192016200194c565b60058452601f820160051c600080516020620041228339815191520160208310620019fd575b601f820160051c60008051602062004122833981519152018110620019f15750620012a7565b848155600101620019cb565b5060008051602062004122833981519152620019cb565b634e487b7160e01b83526041600452602483fd5b634e487b7160e01b600052604160045260246000fd5b8380fd5b50346200035d57806003193601126200035d576020600c54604051908152f35b50346200035d57806003193601126200035d57602060405160098152f35b50346200035d578062001a933662001ffc565b6018549192916001600160a01b039062001ab1908216331462002234565b82541692833b156200085b576044908360405195869485936316a4744b60e11b8552600485015260248401525af18015620006365762001aef575080f35b620003c69062002013565b50346200035d57806003193601126200035d5762001b42602091604062001b3160045461dead8452600286528284205490620021b8565b9180805260028552205490620021b8565b604051908152f35b50346200035d5760203660031901126200035d5762001b6862001fb4565b6007546001600160a01b03919082163314801562001be3575b1562001b9e57168152601a60205260408120805460ff1916905580f35b60405162461bcd60e51b815260206004820152601e60248201527f43616c6c657220646f65736e27742068617665207065726d697373696f6e00006044820152606490fd5b508160185416331462001b81565b50346200035d57806003193601126200035d5762001c1b60018060a01b03601754163314620020d5565b600b5462001c3b5742600b5562001c35601b54426200215f565b601c5580f35b60405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b6044820152606490fd5b50346200035d5760603660031901126200035d5762001c9162001fb4565b9062001c9c62001fd0565b60406044359260018060a01b03851681526003602052818120338252602052205492600019840362001cd5575b620008f5935062002318565b82841062001cf65762001cf083620008f59503338362002960565b62001cc9565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b50346200035d5760203660031901126200035d576004356001600160a01b03818116918290036200085b5762001d779060185416331462002234565b6001600160601b0360a01b601954161760195580f35b50346200035d57806003193601126200035d576020601354604051908152f35b50346200035d57806003193601126200035d576020600454604051908152f35b50346200035d5760203660031901126200035d5762001df860018060a01b0360185416331462002234565b60043560015580f35b50346200035d57806003193601126200035d57805460405163125f9e3360e01b8152906001600160a01b03906020908390600490829085165afa9182156200173d576020939262001e57575b5060405191168152f35b62001e73919250833d81116200178a576200177a818362002028565b903862001e4d565b50346200035d5760403660031901126200035d576200098562001e9d62001fb4565b602435903362002960565b50346200035d57806003193601126200035d57604051908060055462001ece8162002122565b8085529160019180831690811562000b1b575060011462001efc5762000ac88562000abb8187038262002028565b925060058352600080516020620041228339815191525b82841062001f3257505050810160200162000abb8262000ac862000aa8565b8054602085870181019190915290930192810162001f13565b9050346200103e57816003193601126200103e57602090601f548152f35b6020808252825181830181905290939260005b82811062001f9f57505060409293506000838284010152601f8019910116010190565b81810186015184820160400152850162001f7c565b600435906001600160a01b038216820362001fcb57565b600080fd5b602435906001600160a01b038216820362001fcb57565b35906001600160a01b038216820362001fcb57565b604090600319011262001fcb576004359060243590565b67ffffffffffffffff811162001a2857604052565b90601f8019910116810190811067ffffffffffffffff82111762001a2857604052565b67ffffffffffffffff811162001a2857601f01601f191660200190565b81601f8201121562001fcb5780359062002082826200204b565b9262002092604051948562002028565b8284526020838301011162001fcb57816000926020809301838601378301015290565b60043590811515820362001fcb57565b60243590811515820362001fcb57565b15620020dd57565b60405162461bcd60e51b815260206004820152601960248201527f43616c6c6572206973206e6f742074686520666163746f7279000000000000006044820152606490fd5b90600182811c9216801562002154575b60208310146200213e57565b634e487b7160e01b600052602260045260246000fd5b91607f169162002132565b919082018092116200216d57565b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156200216d57565b8115620021a2570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116200216d57565b9081602091031262001fcb57516001600160a01b038116810362001fcb5790565b15620021ef57565b60405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74207468652070726f6f6641646d696e000000006044820152606490fd5b156200223c57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606490fd5b156200228957565b60405162461bcd60e51b8152602060048201526009602482015268085b185d5b98da195960ba1b6044820152606490fd5b60809060208152604060208201527f506c6561736520636865636b206966206469737472696275746f72206973206160408201527f74206d61782077616c6c6574206f72207472616e7366657220616d6f756e742e60608201520190565b9060199182549360009460ff809160b01c1615620029305760018060a01b0380841694858852602094601a865260409380858b20541615806200291d575b156200291957601c5480151590816200290e575b50620028c3575b80895460a01c166200286457908392918a9b9a9460165416998484169a808c148062002855575b620027c7575b8b875260098a52888884818a2054161580620027b8575b6200275c575b50508a1415806200274d575b806200273f575b8062002728575b620026ff575b50888552600291828952620023f48888882054620021b8565b8a8752838a5287872055601654851688818c148015620026f5575b62002649575b50508a86528289526200242c88888820546200215f565b8b8752838a5287872055898652600a8952818787205416156200259f575b50898552600a885285852054161562002500575b505081541660015490803b156200085b57602483928551948593849263ffb2c47960e01b845260048401525af19081620024e4575b5060008051602062004142833981519152949596975015600014620024de5760008051602062004182833981519152815180620024d081620022ba565b0390a15b51908152a3600190565b620024d4565b620024f0899162002013565b620024fc578762002493565b8780fd5b828454169087528484205491813b1562000668578551630a5b654b60e11b81526001600160a01b039190911660048201526024810192909252839081908390604490829084905af1918262002587575b50506200258157600080516020620041828339815191528351806200257581620022ba565b0390a15b38806200245e565b62002579565b620025929062002013565b6200085b57823862002550565b909192939485815416848a528782205490803b156200085b578851630a5b654b60e11b81526001600160a01b0394909416600485015260248401919091528290604490829084905af190816200262b575b508b94939291906200262557600080516020620041828339815191528651806200261a81620022ba565b0390a15b386200244a565b6200261e565b6200263d909c91959493929c62002013565b9a9091929338620025f0565b9091985060088a528b8389892054161580620026e4575b15620026db57620026c39203620026cc576064620026826014545b8362002183565b0490308852848b5262002699828a8a20546200215f565b308952858c528989205588518281528c600080516020620041428339815191528d3093a3620021b8565b96388062002415565b6064620026826013546200267b565b509050620026c3565b5087528b8389892054161562002660565b50818d146200240f565b805460ff60a01b19908116600160a01b1782556200271c62002a99565b815416905538620023db565b503086526002895286862054601f541115620023d5565b5081815460a81c16620023ce565b5081815460a01c1615620023c7565b620027739293949596979860028d5220546200215f565b601e54106200278b57908c95949392918888620023bb565b865162461bcd60e51b8152600481018a905260066024820152651dd85b1b195d60d21b6044820152606490fd5b508460075460a01c16620023b5565b90919293949550601d54881180159062002823575b15620027ef57908c95949392916200239e565b865162461bcd60e51b8152600481018a9052600d60248201526c13585e08151608105b5bdd5b9d609a1b6044820152606490fd5b50898d5260098952868d2054831683888f8362002844575b505050620027dc565b8e8152205416905083888f6200283b565b508260075460a01c1662002398565b505085600080516020620041428339815191529697508852600285526200288f84848a2054620021b8565b8789526002865283892055169586815281620028af84828420546200215f565b9188815260028652205551908152a3600190565b32808b52858b20805460ff19166001179055838516146200237157845162461bcd60e51b8152600481018890526009602482015268616e7469736e69706560b81b6044820152606490fd5b90504210386200236a565b8980fd5b508383168a5280858b2054161562002356565b60405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b6044820152606490fd5b6001600160a01b0390811691821562002a135716918215620029c35760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260038252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b3d1562002a94573d9062002a78826200204b565b9162002a88604051938462002028565b82523d6000602084013e565b606090565b600030815260209060028252604091828220549162002ac962002abf600e548562002183565b6013549062002197565b9062002adb600192831c8095620021b8565b801562002f4d57855160609586820182811067ffffffffffffffff82111762002f3957885260028252858201918836843780511562002f255730835260155489516315ab88c960e31b81526004956001600160a01b039592861692918a818981875afa90811562002f1b57899162002ef9575b5084518a101562002ee65786168c850152823b15620024fc578b5163791ac94760e01b8152878101919091526024810188905260a06044820152925160a4840181905287928492909160c484019190858c8e5b83831062002ec95750505050508383809230606483015242608483015203925af1801562002ebf5762002ea9575b508662002be462002abf47600e549062002183565b861c918062002e19575b50505082479462002c02600f548762002183565b9062002c2b62002c16601354809462002197565b9262002c25600c548a62002183565b62002197565b9062002c438262002c3d858b620021b8565b620021b8565b9762002cf2575b505050541690813b156200085b578651630d0e30db60e41b815293839285929183915af1918262002cda575b505062002cd5576a31b7b6b830ba34b136329760a91b6080927f506c6561736520636865636b2069662072657761726420746f6b656e2069732085602b60008051602062004182833981519152975195808752860152840152820152a1565b505050565b62002ce6829162002013565b6200035d578062002c76565b8162002d2e575b50508062002d0a575b808062002c4a565b8180809285601954165af162002d1f62002a64565b50156200085b57823862002d02565b909192501c838784601754168b5192838092633690e28760e01b82525afa90811562002ded5786808487829583958e859262002df7575b5050165af162002d7462002a64565b50156200066857838784601754168b519283809263d7e7a9e760e01b82525afa90811562002ded578680938682948394849162002dcb575b50165af162002dba62002a64565b501562001a3e578390388062002cf9565b62002de691508d803d106200178a576200177a818362002028565b3862002dac565b8a513d88823e3d90fd5b62002e119250803d106200178a576200177a818362002028565b388e62002d65565b60c48460155416918b51948593849263f305d71960e01b8452308a850152602484015289604484015289606484015261dead60848401524260a48401525af1801562002e9f5790879162002e70575b819062002bee565b813d831162002e97575b62002e86818362002028565b810103126200085b57853862002e68565b503d62002e7a565b88513d86823e3d90fd5b62002eb79094919462002013565b923862002bcf565b89513d87823e3d90fd5b84518c1686528d98508997509485019490930192018c8e62002ba1565b634e487b7160e01b895260328852602489fd5b62002f1491508b3d8d116200178a576200177a818362002028565b3862002b4e565b8d513d8b823e3d90fd5b634e487b7160e01b85526032600452602485fd5b634e487b7160e01b85526041600452602485fd5b505050505050565b62002f64600b54151562002281565b600454600581028115908281046005148217156200216d576103e89004831062002fd3576003820291820460031417156200216d57606490041062002fa557565b60405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606490fd5b156200300b57565b60405162461bcd60e51b81526020600482015260086024820152670a8dede40d0d2ced60c31b6044820152606490fd5b6200309c60116200305662001006600f54600e54906200215f565b62003094600c620030876200306e825480956200215f565b9384601355620010106200102e6012548854906200215f565b9283601455111562003003565b111562003003565b56fe608060409080825234620001e857606081620010838038038091620000258285620001ed565b833981010312620001e8576200003b8162000227565b60209062000058846200005084860162000227565b940162000227565b6ec097ce7bc90715b34b9f1000000000600b55610708600c55670de0b6b3a7640000600d55600180546001600160a01b03199081166001600160a01b03948516179091556002805482169584169590951790945560008054909416918116919091178355835163313ce56760e01b838201908152600482526001600160401b03929180870184811182821017620001d45787525185928392905afa3d15620001ca573d918211620001b6578451916200011b601f8201601f1916850184620001ed565b82523d848484013e5b156200017f5781818051810103126200017b5701519060ff82168092036200017857604d8211620001645750600a0a600d5551610e4690816200023d8239f35b634e487b7160e01b81526011600452602490fd5b80fd5b8280fd5b835162461bcd60e51b815260048101839052601060248201526f696e76616c696420646563696d616c7360801b6044820152606490fd5b634e487b7160e01b84526041600452602484fd5b6060915062000124565b634e487b7160e01b87526041600452602487fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200021157604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001e85756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826311ce023d146109f357508163125f9e331461018957816314b6ca96146107b657816328fd3198146107895781632d48e896146107595781633a98ef391461073a5781634fab0ae81461071b57816351171961146106f057816366817df5146106b85781638477d9f31461061f578163997664d714610600578163ce7c2ac2146105b2578163d0e30db014610298578163d4fda1f214610262578163e2d2e21914610243578163efca2eed14610224578163f0fc6bca146101b2578163f1e9f1e514610189578163f82107691461015e578163ffb2c4791461012d575063ffd49c841461010c57600080fd5b34610129578160031936011261012957602090600c549051908152f35b5080fd5b8390346101295760203660031901126101295781546001600160a01b031633036101295761015b9035610b8a565b80f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600c5580f35b50503461012957816003193601126101295760025490516001600160a01b039091168152602090f35b919050346102205782600319360112610220576101ce33610c58565b156101dd578261015b33610c9c565b906020606492519162461bcd60e51b8352820152601760248201527f546f6f20736f6f6e2e204e65656420746f2077616974210000000000000000006044820152fd5b8280fd5b5050346101295781600319360112610129576020906009549051908152f35b505034610129578160031936011261012957602090600a549051908152f35b9050346102205760203660031901126102205760209282916001600160a01b0361028a610a0f565b168252845220549051908152f35b919050826003193601126102205782546001600160a01b039190821633036105ae578160025416908051916370a0823160e01b9384845230868501526020918285602481845afa9485156105a4578895610571575b508351906060820182811067ffffffffffffffff82111761055e5785526002825284368584013782600154169085516315ab88c960e31b815285818b81865afa908115610554578b9161051a575b508461034685610ade565b9116905261035383610b01565b52888361035f84610ade565b51168461036b85610b01565b51160361049657505061037e8291610ade565b51169087823b15610493578088938651998a8092630d0e30db60e41b825234905af197881561048757849596979861046a575b50506024905b600254169685519788938492835230908301525afa9182156104615750849161042c575b506103e69250610aae565b6103f281600854610ad1565b6008556007549081610402578280f35b61041d61042392610418600a5493600b54610b11565b610b24565b90610ad1565b600a5538808280f35b905082813d831161045a575b6104428183610a8c565b81010312610455576103e69151386103db565b600080fd5b503d610438565b513d86823e3d90fd5b61047691929450610a62565b61048357829187386103b1565b8680fd5b508451903d90823e3d90fd5b80fd5b9091829894959697983b15610129576104d0928751808095819463b6f9de9560e01b8352868a840152608060248401526084830190610a25565b306044830152426064830152039134905af18015610510576104f8575b5090602483926103b7565b83929197610507602492610a62565b979192506104ed565b85513d8a823e3d90fd5b90508581813d831161054d575b6105318183610a8c565b8101031261054957518481168103610549573861033b565b8a80fd5b503d610527565b87513d8d823e3d90fd5b634e487b7160e01b8a526041895260248afd5b9094508281813d831161059d575b6105898183610a8c565b81010312610599575193386102ed565b8780fd5b503d61057f565b84513d8a823e3d90fd5b8380fd5b5050346101295760203660031901126101295760609181906001600160a01b036105da610a0f565b168152600660205220805491600260018301549201549181519384526020840152820152f35b5050346101295781600319360112610129576020906008549051908152f35b50503461012957816003193601126101295780519081809360035490818552602080950191600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915b868282106106985785906106948861068584890385610a8c565b51928284938452830190610a25565b0390f35b83546001600160a01b03168552889550909301926001928301920161066b565b5050346101295760203660031901126101295760209181906001600160a01b036106e0610a0f565b1681526005845220549051908152f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600d5580f35b505034610129578160031936011261012957602090600d549051908152f35b5050346101295781600319360112610129576020906007549051908152f35b91905034610220573660031901126101295781546001600160a01b031633036101295735600c55602435600d5580f35b505034610129576020366003190112610129576020906107af6107aa610a0f565b610dad565b9051908152f35b8383346101295780600319360112610129576107d0610a0f565b82546024359291906001600160a01b0390811633036109ef5780821693848652600692602092848452858820546109e1575b82158015806109d0575b156108d55750506003548688528884528086892055680100000000000000008110156108c2576001969798509061084b828861086f9401600355610b44565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b61088e81610889600754898b52868652878b205490610aae565b610ad1565b600755858752828252838720556108b76108ae84882054600a5490610b11565b600b5490610b24565b948652528320015580f35b634e487b7160e01b885260418952602488fd5b909150806109be575b6108ef575b5060019495965061086f565b60038054600019908181019081116109ab578361090e61092792610b44565b905490851b1c16898b528b875261084b898c2054610b44565b878952898552868920548254828101908111610998576109478591610b44565b905490851b1c168a528a8652878a20558154801561098557600198999a50019161097083610b44565b9091825491841b1b19169055558695946108e3565b634e487b7160e01b8a5260318b5260248afd5b634e487b7160e01b8b5260118c5260248bfd5b634e487b7160e01b8a5260118b5260248afd5b508587528383528487205415156108de565b50878952858552868920541561080c565b6109ea82610c9c565b610802565b8480fd5b849034610129578160031936011261012957602090600b548152f35b600435906001600160a01b038216820361045557565b90815180825260208080930193019160005b828110610a45575050505090565b83516001600160a01b031685529381019392810192600101610a37565b67ffffffffffffffff8111610a7657604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a7657604052565b91908203918211610abb57565b634e487b7160e01b600052601160045260246000fd5b91908201809211610abb57565b805115610aeb5760200190565b634e487b7160e01b600052603260045260246000fd5b805160011015610aeb5760400190565b81810292918115918404141715610abb57565b8115610b2e570490565b634e487b7160e01b600052601260045260246000fd5b600354811015610aeb5760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b6000198114610abb5760010190565b906003908154908115610c525792916000908180955a5b86881080610c49575b15610c3f57610bfd610bf6610c1192600e9a898c541015610c37575b8b54610bea610bd482610b44565b90546001600160a01b0392918c1b1c8216610c58565b610c18575b5050610ad1565b5a90610aae565b945a98610c0a8154610b7b565b9055610b7b565b9396610ba1565b610c24610c3092610b44565b9054908b1b1c16610c9c565b3880610bef565b868c55610bc6565b5095505050505050565b50858510610baa565b92505050565b6001600160a01b038116600090815260056020526040902054600c54610c7d91610ad1565b4210159081610c8a575090565b610c949150610dad565b600d54111590565b60018060a01b0380821690600092828452602091600683526040918286205415610ccf57610cc990610dad565b80610cd7575b505050505050565b60448492610ce783600954610ad1565b60095586885260058452428589205560068452610d0a836002878b200154610ad1565b878952600685526002868a200155610d2b6108ae868a2054600a5490610b11565b878952600685526001868a2001556002541695878551978894859363a9059cbb60e01b8552600485015260248401525af1908115610da45750610d71575b808080610ccf565b81813d8311610d9d575b610d858183610a8c565b81010312610129575180151503610493578080610d69565b503d610d7b565b513d85823e3d90fd5b6001600160a01b031660008181526006602052604081205490919015610e0c57610de16108ae6040842054600a5490610b11565b908252600660205260016040832001549081811115610e0757610e049250610aae565b90565b505090565b509056fea264697066735822122065a8ddf6611d2f33c026dc2e045e976b21c2a1f03d159ffe0f05c20c8643cab264736f6c63430008110033036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3eff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3fd72a8ea23981bee6010db9fcb484814e1fbb4f6c05474e7f786ef89cae9f3e5ea26469706673582212206bcbae3f01575387a9ad1123719cb70827be65812b899eae6b4f0d113647da1364736f6c63430008110033a26469706673582212201fe7c06349f1b89694260e76d084364bbfaaf8255e8b77516b2c22a0bcf8eed864736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.