More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,510 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Provide Inventor... | 15547032 | 882 days ago | IN | 0 ETH | 0.00090226 | ||||
Provide Inventor... | 15209012 | 935 days ago | IN | 0 ETH | 0.00048575 | ||||
Transfer Ownersh... | 15129816 | 947 days ago | IN | 0 ETH | 0.00098743 | ||||
Provide Inventor... | 14865735 | 992 days ago | IN | 0 ETH | 0.00048426 | ||||
Add Liquidity721... | 14705863 | 1017 days ago | IN | 56.38964013 ETH | 0.13249443 | ||||
Provide Inventor... | 14705643 | 1017 days ago | IN | 0 ETH | 0.03091936 | ||||
Provide Inventor... | 14705560 | 1017 days ago | IN | 0 ETH | 0.02353815 | ||||
Provide Inventor... | 14705298 | 1018 days ago | IN | 0 ETH | 0.01511613 | ||||
Add Liquidity721... | 14705113 | 1018 days ago | IN | 0.3519895 ETH | 0.07042545 | ||||
Provide Inventor... | 14705002 | 1018 days ago | IN | 0 ETH | 0.06420498 | ||||
Provide Inventor... | 14704890 | 1018 days ago | IN | 0 ETH | 0.1041241 | ||||
Provide Inventor... | 14704826 | 1018 days ago | IN | 0 ETH | 0.03992637 | ||||
Provide Inventor... | 14704556 | 1018 days ago | IN | 0 ETH | 0.033895 | ||||
Provide Inventor... | 14704442 | 1018 days ago | IN | 0 ETH | 0.01410742 | ||||
Provide Inventor... | 14704301 | 1018 days ago | IN | 0 ETH | 0.01555985 | ||||
Provide Inventor... | 14703625 | 1018 days ago | IN | 0 ETH | 0.01236143 | ||||
Add Liquidity721... | 14703499 | 1018 days ago | IN | 0.09875509 ETH | 0.0298092 | ||||
Provide Inventor... | 14703225 | 1018 days ago | IN | 0 ETH | 0.01595611 | ||||
Provide Inventor... | 14703180 | 1018 days ago | IN | 0 ETH | 0.01545361 | ||||
Add Liquidity721... | 14703063 | 1018 days ago | IN | 0.17567567 ETH | 0.05969278 | ||||
Provide Inventor... | 14702983 | 1018 days ago | IN | 0 ETH | 0.02602314 | ||||
Provide Inventor... | 14702926 | 1018 days ago | IN | 0 ETH | 0.03202137 | ||||
Provide Inventor... | 14702910 | 1018 days ago | IN | 0 ETH | 0.02293442 | ||||
Provide Inventor... | 14702451 | 1018 days ago | IN | 0 ETH | 0.07026509 | ||||
Add Liquidity721... | 14702394 | 1018 days ago | IN | 0.65 ETH | 0.35984779 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
14705863 | 1017 days ago | 56.38964013 ETH | ||||
14705113 | 1018 days ago | 0.3519895 ETH | ||||
14703499 | 1018 days ago | 0.09875509 ETH | ||||
14703063 | 1018 days ago | 0.17567567 ETH | ||||
14702394 | 1018 days ago | 0.65 ETH | ||||
14702027 | 1018 days ago | 0.99672958 ETH | ||||
14701179 | 1018 days ago | 6.37628939 ETH | ||||
14700392 | 1018 days ago | 1 ETH | ||||
14699837 | 1018 days ago | 42.83819695 ETH | ||||
14699802 | 1018 days ago | 258.8554127 ETH | ||||
14699802 | 1018 days ago | 258.8554127 ETH | ||||
14697066 | 1019 days ago | 0.25961879 ETH | ||||
14695799 | 1019 days ago | 170 ETH | ||||
14694659 | 1019 days ago | 0.96116906 ETH | ||||
14694332 | 1019 days ago | 15 ETH | ||||
14693652 | 1019 days ago | 0.14 ETH | ||||
14693489 | 1019 days ago | 2.3 ETH | ||||
14682003 | 1021 days ago | 0.28 ETH | ||||
14681145 | 1021 days ago | 4.02484474 ETH | ||||
14679460 | 1022 days ago | 8 ETH | ||||
14677303 | 1022 days ago | 0.98293077 ETH | ||||
14676092 | 1022 days ago | 0.1983628 ETH | ||||
14674963 | 1022 days ago | 0.22297073 ETH | ||||
14673192 | 1023 days ago | 4.34566638 ETH | ||||
14663703 | 1024 days ago | 0.04370032 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
NFTXStakingZap
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-19 */ // Sources flattened with hardhat v2.8.2 https://hardhat.org // File contracts/solidity/interface/INFTXEligibility.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface INFTXEligibility { // Read functions. function name() external pure returns (string memory); function finalized() external view returns (bool); function targetAsset() external pure returns (address); function checkAllEligible(uint256[] calldata tokenIds) external view returns (bool); function checkEligible(uint256[] calldata tokenIds) external view returns (bool[] memory); function checkAllIneligible(uint256[] calldata tokenIds) external view returns (bool); function checkIsEligible(uint256 tokenId) external view returns (bool); // Write functions. function __NFTXEligibility_init_bytes(bytes calldata configData) external; function beforeMintHook(uint256[] calldata tokenIds) external; function afterMintHook(uint256[] calldata tokenIds) external; function beforeRedeemHook(uint256[] calldata tokenIds) external; function afterRedeemHook(uint256[] calldata tokenIds) external; } // File contracts/solidity/token/IERC20Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/solidity/proxy/IBeacon.sol pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function childImplementation() external view returns (address); function upgradeChildTo(address newImplementation) external; } // File contracts/solidity/interface/INFTXVaultFactory.sol pragma solidity ^0.8.0; interface INFTXVaultFactory is IBeacon { // Read functions. function numVaults() external view returns (uint256); function zapContract() external view returns (address); function feeDistributor() external view returns (address); function eligibilityManager() external view returns (address); function vault(uint256 vaultId) external view returns (address); function allVaults() external view returns (address[] memory); function vaultsForAsset(address asset) external view returns (address[] memory); function isLocked(uint256 id) external view returns (bool); function excludedFromFees(address addr) external view returns (bool); function factoryMintFee() external view returns (uint64); function factoryRandomRedeemFee() external view returns (uint64); function factoryTargetRedeemFee() external view returns (uint64); function factoryRandomSwapFee() external view returns (uint64); function factoryTargetSwapFee() external view returns (uint64); function vaultFees(uint256 vaultId) external view returns (uint256, uint256, uint256, uint256, uint256); event NewFeeDistributor(address oldDistributor, address newDistributor); event NewZapContract(address oldZap, address newZap); event FeeExclusion(address feeExcluded, bool excluded); event NewEligibilityManager(address oldEligManager, address newEligManager); event NewVault(uint256 indexed vaultId, address vaultAddress, address assetAddress); event UpdateVaultFees(uint256 vaultId, uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee); event DisableVaultFees(uint256 vaultId); event UpdateFactoryFees(uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee); // Write functions. function __NFTXVaultFactory_init(address _vaultImpl, address _feeDistributor) external; function createVault( string calldata name, string calldata symbol, address _assetAddress, bool is1155, bool allowAllItems ) external returns (uint256); function setFeeDistributor(address _feeDistributor) external; function setEligibilityManager(address _eligibilityManager) external; function setZapContract(address _zapContract) external; function setFeeExclusion(address _excludedAddr, bool excluded) external; function setFactoryFees( uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee ) external; function setVaultFees( uint256 vaultId, uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee ) external; function disableVaultFees(uint256 vaultId) external; } // File contracts/solidity/interface/INFTXVault.sol pragma solidity ^0.8.0; interface INFTXVault is IERC20Upgradeable { function manager() external view returns (address); function assetAddress() external view returns (address); function vaultFactory() external view returns (INFTXVaultFactory); function eligibilityStorage() external view returns (INFTXEligibility); function is1155() external view returns (bool); function allowAllItems() external view returns (bool); function enableMint() external view returns (bool); function enableRandomRedeem() external view returns (bool); function enableTargetRedeem() external view returns (bool); function enableRandomSwap() external view returns (bool); function enableTargetSwap() external view returns (bool); function vaultId() external view returns (uint256); function nftIdAt(uint256 holdingsIndex) external view returns (uint256); function allHoldings() external view returns (uint256[] memory); function totalHoldings() external view returns (uint256); function mintFee() external view returns (uint256); function randomRedeemFee() external view returns (uint256); function targetRedeemFee() external view returns (uint256); function randomSwapFee() external view returns (uint256); function targetSwapFee() external view returns (uint256); function vaultFees() external view returns (uint256, uint256, uint256, uint256, uint256); event VaultInit( uint256 indexed vaultId, address assetAddress, bool is1155, bool allowAllItems ); event ManagerSet(address manager); event EligibilityDeployed(uint256 moduleIndex, address eligibilityAddr); // event CustomEligibilityDeployed(address eligibilityAddr); event EnableMintUpdated(bool enabled); event EnableRandomRedeemUpdated(bool enabled); event EnableTargetRedeemUpdated(bool enabled); event EnableRandomSwapUpdated(bool enabled); event EnableTargetSwapUpdated(bool enabled); event Minted(uint256[] nftIds, uint256[] amounts, address to); event Redeemed(uint256[] nftIds, uint256[] specificIds, address to); event Swapped( uint256[] nftIds, uint256[] amounts, uint256[] specificIds, uint256[] redeemedIds, address to ); function __NFTXVault_init( string calldata _name, string calldata _symbol, address _assetAddress, bool _is1155, bool _allowAllItems ) external; function finalizeVault() external; function setVaultMetadata( string memory name_, string memory symbol_ ) external; function setVaultFeatures( bool _enableMint, bool _enableRandomRedeem, bool _enableTargetRedeem, bool _enableRandomSwap, bool _enableTargetSwap ) external; function setFees( uint256 _mintFee, uint256 _randomRedeemFee, uint256 _targetRedeemFee, uint256 _randomSwapFee, uint256 _targetSwapFee ) external; function disableVaultFees() external; // This function allows for an easy setup of any eligibility module contract from the EligibilityManager. // It takes in ABI encoded parameters for the desired module. This is to make sure they can all follow // a similar interface. function deployEligibilityStorage( uint256 moduleIndex, bytes calldata initData ) external returns (address); // The manager has control over options like fees and features function setManager(address _manager) external; function mint( uint256[] calldata tokenIds, uint256[] calldata amounts /* ignored for ERC721 vaults */ ) external returns (uint256); function mintTo( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ address to ) external returns (uint256); function redeem(uint256 amount, uint256[] calldata specificIds) external returns (uint256[] calldata); function redeemTo( uint256 amount, uint256[] calldata specificIds, address to ) external returns (uint256[] calldata); function swap( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds ) external returns (uint256[] calldata); function swapTo( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds, address to ) external returns (uint256[] calldata); function allValidNFTs(uint256[] calldata tokenIds) external view returns (bool); } // File contracts/solidity/interface/INFTXSimpleFeeDistributor.sol pragma solidity ^0.8.0; interface INFTXSimpleFeeDistributor { struct FeeReceiver { uint256 allocPoint; address receiver; bool isContract; } function nftxVaultFactory() external view returns (address); function lpStaking() external view returns (address); function inventoryStaking() external view returns (address); function treasury() external view returns (address); function allocTotal() external view returns (uint256); // Write functions. function __SimpleFeeDistributor__init__(address _lpStaking, address _treasury) external; function rescueTokens(address token) external; function distribute(uint256 vaultId) external; function addReceiver(uint256 _allocPoint, address _receiver, bool _isContract) external; function initializeVaultReceivers(uint256 _vaultId) external; function changeReceiverAlloc(uint256 _idx, uint256 _allocPoint) external; function changeReceiverAddress(uint256 _idx, address _address, bool _isContract) external; function removeReceiver(uint256 _receiverIdx) external; // Configuration functions. function setTreasuryAddress(address _treasury) external; function setLPStakingAddress(address _lpStaking) external; function setInventoryStakingAddress(address _inventoryStaking) external; function setNFTXVaultFactory(address _factory) external; } // File contracts/solidity/interface/INFTXLPStaking.sol pragma solidity ^0.8.0; interface INFTXLPStaking { function nftxVaultFactory() external view returns (address); function rewardDistTokenImpl() external view returns (address); function stakingTokenProvider() external view returns (address); function vaultToken(address _stakingToken) external view returns (address); function stakingToken(address _vaultToken) external view returns (address); function rewardDistributionToken(uint256 vaultId) external view returns (address); function newRewardDistributionToken(uint256 vaultId) external view returns (address); function oldRewardDistributionToken(uint256 vaultId) external view returns (address); function unusedRewardDistributionToken(uint256 vaultId) external view returns (address); function rewardDistributionTokenAddr(address stakedToken, address rewardToken) external view returns (address); // Write functions. function __NFTXLPStaking__init(address _stakingTokenProvider) external; function setNFTXVaultFactory(address newFactory) external; function setStakingTokenProvider(address newProvider) external; function addPoolForVault(uint256 vaultId) external; function updatePoolForVault(uint256 vaultId) external; function updatePoolForVaults(uint256[] calldata vaultId) external; function receiveRewards(uint256 vaultId, uint256 amount) external returns (bool); function deposit(uint256 vaultId, uint256 amount) external; function timelockDepositFor(uint256 vaultId, address account, uint256 amount, uint256 timelockLength) external; function exit(uint256 vaultId, uint256 amount) external; function rescue(uint256 vaultId) external; function withdraw(uint256 vaultId, uint256 amount) external; function claimRewards(uint256 vaultId) external; } // File contracts/solidity/interface/INFTXInventoryStaking.sol pragma solidity ^0.8.0; interface INFTXInventoryStaking { function nftxVaultFactory() external view returns (INFTXVaultFactory); function vaultXToken(uint256 vaultId) external view returns (address); function xTokenAddr(address baseToken) external view returns (address); function xTokenShareValue(uint256 vaultId) external view returns (uint256); function __NFTXInventoryStaking_init(address nftxFactory) external; function deployXTokenForVault(uint256 vaultId) external; function receiveRewards(uint256 vaultId, uint256 amount) external returns (bool); function timelockMintFor(uint256 vaultId, uint256 amount, address to, uint256 timelockLength) external returns (uint256); function deposit(uint256 vaultId, uint256 _amount) external; function withdraw(uint256 vaultId, uint256 _share) external; } // File contracts/solidity/interface/IUniswapV2Router01.sol pragma solidity ^0.8.0; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // File contracts/solidity/testing/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File contracts/solidity/testing/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File contracts/solidity/interface/IERC165Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File contracts/solidity/token/IERC1155Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; } // File contracts/solidity/token/IERC721ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File contracts/solidity/token/ERC721HolderUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721HolderUpgradeable is IERC721ReceiverUpgradeable { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // File contracts/solidity/token/IERC1155ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); } // File contracts/solidity/util/ERC165Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is IERC165Upgradeable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } } // File contracts/solidity/token/ERC1155ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155ReceiverUpgradeable is ERC165Upgradeable, IERC1155ReceiverUpgradeable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || super.supportsInterface(interfaceId); } } // File contracts/solidity/token/ERC1155HolderUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155HolderUpgradeable is ERC1155ReceiverUpgradeable { function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } } // File contracts/solidity/proxy/Initializable.sol // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File contracts/solidity/util/ContextUpgradeable.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File contracts/solidity/util/OwnableUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File contracts/solidity/util/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/solidity/util/SafeERC20Upgradeable.sol pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20Upgradeable { using Address for address; function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20Upgradeable 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(IERC20Upgradeable 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' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/solidity/NFTXStakingZap.sol pragma solidity ^0.8.0; // Authors: @0xKiwi_. interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(msg.sender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == msg.sender, "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } contract NFTXStakingZap is Ownable, ReentrancyGuard, ERC721HolderUpgradeable, ERC1155HolderUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; IWETH public immutable WETH; INFTXLPStaking public lpStaking; INFTXInventoryStaking public inventoryStaking; INFTXVaultFactory public immutable nftxFactory; IUniswapV2Router01 public immutable sushiRouter; uint256 public lpLockTime = 48 hours; uint256 public inventoryLockTime = 7 days; uint256 constant BASE = 1e18; event UserStaked(uint256 vaultId, uint256 count, uint256 lpBalance, uint256 timelockUntil, address sender); constructor(address _nftxFactory, address _sushiRouter) Ownable() ReentrancyGuard() { nftxFactory = INFTXVaultFactory(_nftxFactory); sushiRouter = IUniswapV2Router01(_sushiRouter); WETH = IWETH(IUniswapV2Router01(_sushiRouter).WETH()); IERC20Upgradeable(address(IUniswapV2Router01(_sushiRouter).WETH())).safeApprove(_sushiRouter, type(uint256).max); } function assignStakingContracts() public { require(address(lpStaking) == address(0) || address(inventoryStaking) == address(0), "not zero"); lpStaking = INFTXLPStaking(INFTXSimpleFeeDistributor(INFTXVaultFactory(nftxFactory).feeDistributor()).lpStaking()); inventoryStaking = INFTXInventoryStaking(INFTXSimpleFeeDistributor(INFTXVaultFactory(nftxFactory).feeDistributor()).inventoryStaking()); } function setLPLockTime(uint256 newLPLockTime) external onlyOwner { require(newLPLockTime <= 7 days, "Lock too long"); lpLockTime = newLPLockTime; } function setInventoryLockTime(uint256 newInventoryLockTime) external onlyOwner { require(newInventoryLockTime <= 14 days, "Lock too long"); inventoryLockTime = newInventoryLockTime; } function provideInventory721(uint256 vaultId, uint256[] calldata tokenIds) external { uint256 count = tokenIds.length; INFTXVault vault = INFTXVault(nftxFactory.vault(vaultId)); inventoryStaking.timelockMintFor(vaultId, count*BASE, msg.sender, inventoryLockTime); address xToken = inventoryStaking.vaultXToken(vaultId); uint256 oldBal = IERC20Upgradeable(vault).balanceOf(xToken); uint256[] memory amounts = new uint256[](0); address assetAddress = vault.assetAddress(); uint256 length = tokenIds.length; for (uint256 i; i < length; ++i) { transferFromERC721(assetAddress, tokenIds[i], address(vault)); approveERC721(assetAddress, address(vault), tokenIds[i]); } vault.mintTo(tokenIds, amounts, address(xToken)); uint256 newBal = IERC20Upgradeable(vault).balanceOf(xToken); require(newBal == oldBal + count*BASE, "Incorrect vtokens minted"); } function provideInventory1155(uint256 vaultId, uint256[] calldata tokenIds, uint256[] calldata amounts) external { uint256 length = tokenIds.length; require(length == amounts.length, "Not equal length"); uint256 count; for (uint256 i; i < length; ++i) { count += amounts[i]; } INFTXVault vault = INFTXVault(nftxFactory.vault(vaultId)); inventoryStaking.timelockMintFor(vaultId, count*BASE, msg.sender, inventoryLockTime); address xToken = inventoryStaking.vaultXToken(vaultId); uint256 oldBal = IERC20Upgradeable(vault).balanceOf(address(xToken)); IERC1155Upgradeable nft = IERC1155Upgradeable(vault.assetAddress()); nft.safeBatchTransferFrom(msg.sender, address(this), tokenIds, amounts, ""); nft.setApprovalForAll(address(vault), true); vault.mintTo(tokenIds, amounts, address(xToken)); uint256 newBal = IERC20Upgradeable(vault).balanceOf(address(xToken)); require(newBal == oldBal + count*BASE, "Incorrect vtokens minted"); } function addLiquidity721ETH( uint256 vaultId, uint256[] calldata ids, uint256 minWethIn ) external payable returns (uint256) { return addLiquidity721ETHTo(vaultId, ids, minWethIn, msg.sender); } function addLiquidity721ETHTo( uint256 vaultId, uint256[] memory ids, uint256 minWethIn, address to ) public payable nonReentrant returns (uint256) { require(to != address(0) && to != address(this)); WETH.deposit{value: msg.value}(); (, uint256 amountEth, uint256 liquidity) = _addLiquidity721WETH(vaultId, ids, minWethIn, msg.value, to); // Return extras. uint256 remaining = msg.value-amountEth; if (remaining != 0) { WETH.withdraw(remaining); (bool success, ) = payable(to).call{value: remaining}(""); require(success, "Address: unable to send value, recipient may have reverted"); } return liquidity; } function addLiquidity1155ETH( uint256 vaultId, uint256[] calldata ids, uint256[] calldata amounts, uint256 minEthIn ) external payable returns (uint256) { return addLiquidity1155ETHTo(vaultId, ids, amounts, minEthIn, msg.sender); } function addLiquidity1155ETHTo( uint256 vaultId, uint256[] memory ids, uint256[] memory amounts, uint256 minEthIn, address to ) public payable nonReentrant returns (uint256) { require(to != address(0) && to != address(this)); WETH.deposit{value: msg.value}(); // Finish this. (, uint256 amountEth, uint256 liquidity) = _addLiquidity1155WETH(vaultId, ids, amounts, minEthIn, msg.value, to); // Return extras. uint256 remaining = msg.value-amountEth; if (remaining != 0) { WETH.withdraw(remaining); (bool success, ) = payable(to).call{value: remaining}(""); require(success, "Address: unable to send value, recipient may have reverted"); } return liquidity; } function addLiquidity721( uint256 vaultId, uint256[] calldata ids, uint256 minWethIn, uint256 wethIn ) external returns (uint256) { return addLiquidity721To(vaultId, ids, minWethIn, wethIn, msg.sender); } function addLiquidity721To( uint256 vaultId, uint256[] memory ids, uint256 minWethIn, uint256 wethIn, address to ) public nonReentrant returns (uint256) { require(to != address(0) && to != address(this)); IERC20Upgradeable(address(WETH)).safeTransferFrom(msg.sender, address(this), wethIn); (, uint256 amountEth, uint256 liquidity) = _addLiquidity721WETH(vaultId, ids, minWethIn, wethIn, to); // Return extras. uint256 remaining = wethIn-amountEth; if (remaining != 0) { WETH.transfer(to, remaining); } return liquidity; } function addLiquidity1155( uint256 vaultId, uint256[] memory ids, uint256[] memory amounts, uint256 minWethIn, uint256 wethIn ) public returns (uint256) { return addLiquidity1155To(vaultId, ids, amounts, minWethIn, wethIn, msg.sender); } function addLiquidity1155To( uint256 vaultId, uint256[] memory ids, uint256[] memory amounts, uint256 minWethIn, uint256 wethIn, address to ) public nonReentrant returns (uint256) { require(to != address(0) && to != address(this)); IERC20Upgradeable(address(WETH)).safeTransferFrom(msg.sender, address(this), wethIn); (, uint256 amountEth, uint256 liquidity) = _addLiquidity1155WETH(vaultId, ids, amounts, minWethIn, wethIn, to); // Return extras. uint256 remaining = wethIn-amountEth; if (remaining != 0) { WETH.transfer(to, remaining); } return liquidity; } function _addLiquidity721WETH( uint256 vaultId, uint256[] memory ids, uint256 minWethIn, uint256 wethIn, address to ) internal returns (uint256, uint256, uint256) { require(nftxFactory.excludedFromFees(address(this))); address vault = nftxFactory.vault(vaultId); // Transfer tokens to zap and mint to NFTX. address assetAddress = INFTXVault(vault).assetAddress(); uint256 length = ids.length; for (uint256 i; i < length; i++) { transferFromERC721(assetAddress, ids[i], vault); approveERC721(assetAddress, vault, ids[i]); } uint256[] memory emptyIds; INFTXVault(vault).mint(ids, emptyIds); uint256 balance = length * BASE; // We should not be experiencing fees. return _addLiquidityAndLock(vaultId, vault, balance, minWethIn, wethIn, to); } function _addLiquidity1155WETH( uint256 vaultId, uint256[] memory ids, uint256[] memory amounts, uint256 minWethIn, uint256 wethIn, address to ) internal returns (uint256, uint256, uint256) { require(nftxFactory.excludedFromFees(address(this))); address vault = nftxFactory.vault(vaultId); // Transfer tokens to zap and mint to NFTX. address assetAddress = INFTXVault(vault).assetAddress(); IERC1155Upgradeable(assetAddress).safeBatchTransferFrom(msg.sender, address(this), ids, amounts, ""); IERC1155Upgradeable(assetAddress).setApprovalForAll(vault, true); uint256 count = INFTXVault(vault).mint(ids, amounts); uint256 balance = (count * BASE); // We should not be experiencing fees. return _addLiquidityAndLock(vaultId, vault, balance, minWethIn, wethIn, to); } function _addLiquidityAndLock( uint256 vaultId, address vault, uint256 minTokenIn, uint256 minWethIn, uint256 wethIn, address to ) internal returns (uint256, uint256, uint256) { // Provide liquidity. IERC20Upgradeable(vault).safeApprove(address(sushiRouter), minTokenIn); (uint256 amountToken, uint256 amountEth, uint256 liquidity) = sushiRouter.addLiquidity( address(vault), address(WETH), minTokenIn, wethIn, minTokenIn, minWethIn, address(this), block.timestamp ); // Stake in LP rewards contract address lpToken = pairFor(vault, address(WETH)); IERC20Upgradeable(lpToken).safeApprove(address(lpStaking), liquidity); lpStaking.timelockDepositFor(vaultId, to, liquidity, lpLockTime); uint256 remaining = minTokenIn-amountToken; if (remaining != 0) { IERC20Upgradeable(vault).safeTransfer(to, remaining); } uint256 lockEndTime = block.timestamp + lpLockTime; emit UserStaked(vaultId, minTokenIn, liquidity, lockEndTime, to); return (amountToken, amountEth, liquidity); } // function removeLiquidity( // address tokenA, // address tokenB, // uint256 liquidity, // uint256 amountAMin, // uint256 amountBMin, // address to, // uint256 deadline // ) external returns (uint256 amountA, uint256 amountB); // function removeLiquidityETH( // address token, // uint256 liquidity, // uint256 amountTokenMin, // uint256 amountETHMin, // address to, // uint256 deadline // ) external returns (uint256 amountToken, uint256 amountETH); function _removeLiquidityAndLock( uint256 vaultId, address vault, uint256 minTokenIn, uint256 minWethIn, uint256 wethIn, address to ) internal returns (uint256, uint256, uint256) { // Provide liquidity. IERC20Upgradeable(vault).safeApprove(address(sushiRouter), minTokenIn); (uint256 amountToken, uint256 amountEth, uint256 liquidity) = sushiRouter.addLiquidity( address(vault), address(WETH), minTokenIn, wethIn, minTokenIn, minWethIn, address(this), block.timestamp ); // Stake in LP rewards contract address lpToken = pairFor(vault, address(WETH)); IERC20Upgradeable(lpToken).safeApprove(address(lpStaking), liquidity); lpStaking.timelockDepositFor(vaultId, to, liquidity, lpLockTime); uint256 remaining = minTokenIn-amountToken; if (remaining != 0) { IERC20Upgradeable(vault).safeTransfer(to, remaining); } uint256 lockEndTime = block.timestamp + lpLockTime; emit UserStaked(vaultId, minTokenIn, liquidity, lockEndTime, to); return (amountToken, amountEth, liquidity); } function transferFromERC721(address assetAddr, uint256 tokenId, address to) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // Cryptokitties. data = abi.encodeWithSignature("transferFrom(address,address,uint256)", msg.sender, to, tokenId); } else if (assetAddr == punks) { // CryptoPunks. // Fix here for frontrun attack. Added in v1.0.2. bytes memory punkIndexToAddress = abi.encodeWithSignature("punkIndexToAddress(uint256)", tokenId); (bool checkSuccess, bytes memory result) = address(assetAddr).staticcall(punkIndexToAddress); (address nftOwner) = abi.decode(result, (address)); require(checkSuccess && nftOwner == msg.sender, "Not the NFT owner"); data = abi.encodeWithSignature("buyPunk(uint256)", tokenId); } else { // Default. // We push to the vault to avoid an unneeded transfer. data = abi.encodeWithSignature("safeTransferFrom(address,address,uint256)", msg.sender, to, tokenId); } (bool success, bytes memory resultData) = address(assetAddr).call(data); require(success, string(resultData)); } function approveERC721(address assetAddr, address to, uint256 tokenId) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // Cryptokitties. // data = abi.encodeWithSignature("approve(address,uint256)", to, tokenId); // No longer needed to approve with pushing. return; } else if (assetAddr == punks) { // CryptoPunks. data = abi.encodeWithSignature("offerPunkForSaleToAddress(uint256,uint256,address)", tokenId, 0, to); } else { // No longer needed to approve with pushing. return; } (bool success, bytes memory resultData) = address(assetAddr).call(data); require(success, string(resultData)); } // calculates the CREATE2 address for a pair without making any external calls function pairFor(address tokenA, address tokenB) internal view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address(uint160(uint256(keccak256(abi.encodePacked( hex'ff', sushiRouter.factory(), keccak256(abi.encodePacked(token0, token1)), hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash ))))); } // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES'); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS'); } receive() external payable { require(msg.sender == address(WETH), "Only WETH"); } function rescue(address token) external onlyOwner { if (token == address(0)) { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success, "Address: unable to send value, recipient may have reverted"); } else { IERC20Upgradeable(token).safeTransfer(msg.sender, IERC20Upgradeable(token).balanceOf(address(this))); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_nftxFactory","type":"address"},{"internalType":"address","name":"_sushiRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timelockUntil","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"UserStaked","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minWethIn","type":"uint256"},{"internalType":"uint256","name":"wethIn","type":"uint256"}],"name":"addLiquidity1155","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minEthIn","type":"uint256"}],"name":"addLiquidity1155ETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minEthIn","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"addLiquidity1155ETHTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minWethIn","type":"uint256"},{"internalType":"uint256","name":"wethIn","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"addLiquidity1155To","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"minWethIn","type":"uint256"},{"internalType":"uint256","name":"wethIn","type":"uint256"}],"name":"addLiquidity721","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"minWethIn","type":"uint256"}],"name":"addLiquidity721ETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"minWethIn","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"addLiquidity721ETHTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"minWethIn","type":"uint256"},{"internalType":"uint256","name":"wethIn","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"addLiquidity721To","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assignStakingContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inventoryLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inventoryStaking","outputs":[{"internalType":"contract INFTXInventoryStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpStaking","outputs":[{"internalType":"contract INFTXLPStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftxFactory","outputs":[{"internalType":"contract INFTXVaultFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"provideInventory1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"provideInventory721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newInventoryLockTime","type":"uint256"}],"name":"setInventoryLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLPLockTime","type":"uint256"}],"name":"setLPLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiRouter","outputs":[{"internalType":"contract IUniswapV2Router01","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040526202a30060045562093a806005553480156200001f57600080fd5b506040516200494a3803806200494a8339810160408190526200004291620005fd565b6200004d33620001a6565b600180556001600160601b0319606083811b821660a05282901b1660c052604080516315ab88c960e31b815290516001600160a01b0383169163ad5c4648916004808301926020929190829003018186803b158015620000ac57600080fd5b505afa158015620000c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000e79190620005e0565b6001600160a01b03166080816001600160a01b031660601b815250506200019e81600019836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200014557600080fd5b505afa1580156200015a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001809190620005e0565b6001600160a01b0316620001f660201b620021c7179092919060201c565b5050620006f5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b801580620002845750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156200024757600080fd5b505afa1580156200025c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000282919062000656565b155b620002fc5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620003549185916200035916565b505050565b6000620003b5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200043760201b6200235c179092919060201c565b805190915015620003545780806020019051810190620003d6919062000634565b620003545760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620002f3565b606062000448848460008562000452565b90505b9392505050565b606082471015620004b55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620002f3565b843b620005055760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620002f3565b600080866001600160a01b031685876040516200052391906200066f565b60006040518083038185875af1925050503d806000811462000562576040519150601f19603f3d011682016040523d82523d6000602084013e62000567565b606091505b5090925090506200057a82828662000585565b979650505050505050565b60608315620005965750816200044b565b825115620005a75782518084602001fd5b8160405162461bcd60e51b8152600401620002f391906200068d565b80516001600160a01b0381168114620005db57600080fd5b919050565b600060208284031215620005f2578081fd5b6200044b82620005c3565b6000806040838503121562000610578081fd5b6200061b83620005c3565b91506200062b60208401620005c3565b90509250929050565b60006020828403121562000646578081fd5b815180151581146200044b578182fd5b60006020828403121562000668578081fd5b5051919050565b6000825162000683818460208701620006c2565b9190910192915050565b6020815260008251806020840152620006ae816040850160208701620006c2565b601f01601f19169190910160400192915050565b60005b83811015620006df578181015183820152602001620006c5565b83811115620006ef576000848401525b50505050565b60805160601c60a05160601c60c05160601c614182620007c8600039600081816103e8015281816130ab0152818161315f01526133cd01526000818161039c01528181610f360152818161105d0152818161124501528181611c2a015281816123d7015281816124730152818161271601526127b20152600081816101cb0152818161054d0152818161075c015281816107d6015281816109a001528181610a19015281816117b70152818161186b01528181611a1e01528181611ad10152818161310801526131ec01526141826000f3fe6080604052600436106101bb5760003560e01c806384d5a232116100ec578063ad5c46481161008a578063c46c4e8a11610064578063c46c4e8a146105c7578063cd9d37b7146105dd578063f23a6e61146105fd578063f2fde38b1461064257600080fd5b8063ad5c46481461053b578063bc197c811461056f578063bdd8172b146105b457600080fd5b80639bf1401c116100c65780639bf1401c146104d25780639d2cbed0146104f2578063a7b1284614610512578063ad402dfc1461052857600080fd5b806384d5a2321461047f5780638da5cb5b1461049f5780639199fc9c146104bd57600080fd5b806353b573bf11610159578063715018a611610133578063715018a61461040a578063739697751461041f57806374a1b0b01461043f578063839006f21461045f57600080fd5b806353b573bf146103775780635ee50f881461038a5780636d13582c146103d657600080fd5b8063150b7a0211610195578063150b7a02146102c75780631809d2c2146103245780631a6907cd146103445780634a5ff0611461035757600080fd5b806301ffc9a714610244578063021001551461027957806310cde786146102a757600080fd5b3661023f57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461023d5760405162461bcd60e51b815260206004820152600960248201527f4f6e6c792057455448000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561025057600080fd5b5061026461025f36600461394a565b610662565b60405190151581526020015b60405180910390f35b34801561028557600080fd5b50610299610294366004613c94565b6106cb565b604051908152602001610270565b3480156102b357600080fd5b506102996102c2366004613c18565b610865565b3480156102d357600080fd5b5061030b6102e2366004613859565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b03199091168152602001610270565b34801561033057600080fd5b5061029961033f366004613b33565b61087f565b610299610352366004613ae2565b6108c3565b34801561036357600080fd5b50610299610372366004613d86565b61090f565b610299610385366004613a63565b610aa7565b34801561039657600080fd5b506103be7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610270565b3480156103e257600080fd5b506103be7f000000000000000000000000000000000000000000000000000000000000000081565b34801561041657600080fd5b5061023d610b26565b34801561042b57600080fd5b5061023d61043a366004613972565b610b9b565b34801561044b57600080fd5b506003546103be906001600160a01b031681565b34801561046b57600080fd5b5061023d61047a366004613777565b610c4c565b34801561048b57600080fd5b5061023d61049a366004613972565b610e16565b3480156104ab57600080fd5b506000546001600160a01b03166103be565b3480156104c957600080fd5b5061023d610ec7565b3480156104de57600080fd5b506002546103be906001600160a01b031681565b3480156104fe57600080fd5b5061023d61050d3660046139ec565b61118b565b34801561051e57600080fd5b5061029960045481565b610299610536366004613b8f565b611731565b34801561054757600080fd5b506103be7f000000000000000000000000000000000000000000000000000000000000000081565b34801561057b57600080fd5b5061030b61058a3660046137af565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6102996105c2366004613d25565b611998565b3480156105d357600080fd5b5061029960055481565b3480156105e957600080fd5b5061023d6105f83660046139a2565b611c0f565b34801561060957600080fd5b5061030b6106183660046138c3565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561064e57600080fd5b5061023d61065d366004613777565b6120d9565b60006001600160e01b031982167f4e2312e00000000000000000000000000000000000000000000000000000000014806106c557507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6000600260015414156107205760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610234565b60026001556001600160a01b0382161580159061074657506001600160a01b0382163014155b61074f57600080fd5b6107846001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333086612375565b6000806107958989898989896123b3565b9250925050600082866107a891906140ad565b905080156108545760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561081a57600080fd5b505af115801561082e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610852919061392a565b505b506001805598975050505050505050565b60006108758686868686336106cb565b9695505050505050565b60006108758686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925087915033905061090f565b6000610906858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508792503391506119989050565b95945050505050565b6000600260015414156109645760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610234565b60026001556001600160a01b0382161580159061098a57506001600160a01b0382163014155b61099357600080fd5b6109c86001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333086612375565b6000806109d888888888886126f2565b9250925050600082866109eb91906140ad565b90508015610a975760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b158015610a5d57600080fd5b505af1158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a95919061392a565b505b5060018055979650505050505050565b6000610b1b8787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a9250899182918501908490808284376000920191909152508892503391506117319050565b979650505050505050565b33610b396000546001600160a01b031690565b6001600160a01b031614610b8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610234565b610b9960006129ee565b565b33610bae6000546001600160a01b031690565b6001600160a01b031614610c045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610234565b62127500811115610c475760405162461bcd60e51b815260206004820152600d60248201526c4c6f636b20746f6f206c6f6e6760981b6044820152606401610234565b600555565b33610c5f6000546001600160a01b031690565b6001600160a01b031614610cb55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610234565b6001600160a01b038116610d8557604051600090339047908381818185875af1925050503d8060008114610d05576040519150601f19603f3d011682016040523d82523d6000602084013e610d0a565b606091505b5050905080610d815760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610234565b5050565b6040516370a0823160e01b8152306004820152610e139033906001600160a01b038416906370a082319060240160206040518083038186803b158015610dca57600080fd5b505afa158015610dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e02919061398a565b6001600160a01b0384169190612a4b565b50565b33610e296000546001600160a01b031690565b6001600160a01b031614610e7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610234565b62093a80811115610ec25760405162461bcd60e51b815260206004820152600d60248201526c4c6f636b20746f6f206c6f6e6760981b6044820152606401610234565b600455565b6002546001600160a01b03161580610ee857506003546001600160a01b0316155b610f345760405162461bcd60e51b815260206004820152600860248201527f6e6f74207a65726f0000000000000000000000000000000000000000000000006044820152606401610234565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630d43e8ad6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8d57600080fd5b505afa158015610fa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc59190613793565b6001600160a01b0316639bf1401c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffd57600080fd5b505afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110359190613793565b600260006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630d43e8ad6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b457600080fd5b505afa1580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec9190613793565b6001600160a01b03166374a1b0b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561112457600080fd5b505afa158015611138573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115c9190613793565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b828181146111db5760405162461bcd60e51b815260206004820152601060248201527f4e6f7420657175616c206c656e677468000000000000000000000000000000006044820152606401610234565b6000805b8281101561122b5784848281811061120757634e487b7160e01b600052603260045260246000fd5b90506020020135826112199190614076565b9150611224816140f0565b90506111df565b506040516340d1b7db60e11b8152600481018890526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906381a36fb69060240160206040518083038186803b15801561128f57600080fd5b505afa1580156112a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c79190613793565b6003549091506001600160a01b0316632699f55a896112ee670de0b6b3a76400008661408e565b6005546040516001600160e01b031960e086901b168152600481019390935260248301919091523360448301526064820152608401602060405180830381600087803b15801561133d57600080fd5b505af1158015611351573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611375919061398a565b5060035460405162d3f20f60e21b8152600481018a90526000916001600160a01b03169063034fc83c9060240160206040518083038186803b1580156113ba57600080fd5b505afa1580156113ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f29190613793565b6040516370a0823160e01b81526001600160a01b0380831660048301529192506000918416906370a082319060240160206040518083038186803b15801561143957600080fd5b505afa15801561144d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611471919061398a565b90506000836001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114ae57600080fd5b505afa1580156114c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e69190613793565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d69061151f90339030908f908f908f908f90600401613eb5565b600060405180830381600087803b15801561153957600080fd5b505af115801561154d573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038781166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b15801561159b57600080fd5b505af11580156115af573d6000803e3d6000fd5b5050604051635882017560e11b81526001600160a01b038716925063b10402ea91506115e7908d908d908d908d908a90600401613f69565b602060405180830381600087803b15801561160157600080fd5b505af1158015611615573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611639919061398a565b506040516370a0823160e01b81526001600160a01b038481166004830152600091908616906370a082319060240160206040518083038186803b15801561167f57600080fd5b505afa158015611693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b7919061398a565b90506116cb670de0b6b3a76400008761408e565b6116d59084614076565b81146117235760405162461bcd60e51b815260206004820152601860248201527f496e636f72726563742076746f6b656e73206d696e74656400000000000000006044820152606401610234565b505050505050505050505050565b6000600260015414156117865760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610234565b60026001556001600160a01b038216158015906117ac57506001600160a01b0382163014155b6117b557600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561181057600080fd5b505af1158015611824573d6000803e3d6000fd5b505050505060008061183a8888888834896123b3565b92509250506000823461184d91906140ad565b90508015610a9757604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156118b757600080fd5b505af11580156118cb573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d806000811461191c576040519150601f19603f3d011682016040523d82523d6000602084013e611921565b606091505b5050905080610a955760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610234565b6000600260015414156119ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610234565b60026001556001600160a01b03821615801590611a1357506001600160a01b0382163014155b611a1c57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a7757600080fd5b505af1158015611a8b573d6000803e3d6000fd5b5050505050600080611aa087878734886126f2565b925092505060008234611ab391906140ad565b90508015611c0057604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611b1d57600080fd5b505af1158015611b31573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b82576040519150601f19603f3d011682016040523d82523d6000602084013e611b87565b606091505b5050905080611bfe5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610234565b505b50600180559695505050505050565b6040516340d1b7db60e11b81526004810184905281906000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906381a36fb69060240160206040518083038186803b158015611c7457600080fd5b505afa158015611c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cac9190613793565b6003549091506001600160a01b0316632699f55a86611cd3670de0b6b3a76400008661408e565b6005546040516001600160e01b031960e086901b168152600481019390935260248301919091523360448301526064820152608401602060405180830381600087803b158015611d2257600080fd5b505af1158015611d36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5a919061398a565b5060035460405162d3f20f60e21b8152600481018790526000916001600160a01b03169063034fc83c9060240160206040518083038186803b158015611d9f57600080fd5b505afa158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd79190613793565b6040516370a0823160e01b81526001600160a01b0380831660048301529192506000918416906370a082319060240160206040518083038186803b158015611e1e57600080fd5b505afa158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e56919061398a565b60408051600080825260208201909252919250506000846001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea557600080fd5b505afa158015611eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edd9190613793565b90508660005b81811015611f5d57611f1c838b8b84818110611f0f57634e487b7160e01b600052603260045260246000fd5b9050602002013589612a7b565b611f4d83888c8c85818110611f4157634e487b7160e01b600052603260045260246000fd5b90506020020135612dab565b611f56816140f0565b9050611ee3565b50604051635882017560e11b81526001600160a01b0387169063b10402ea90611f90908c908c9088908b90600401613fac565b602060405180830381600087803b158015611faa57600080fd5b505af1158015611fbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe2919061398a565b506040516370a0823160e01b81526001600160a01b038681166004830152600091908816906370a082319060240160206040518083038186803b15801561202857600080fd5b505afa15801561203c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612060919061398a565b9050612074670de0b6b3a76400008961408e565b61207e9086614076565b81146120cc5760405162461bcd60e51b815260206004820152601860248201527f496e636f72726563742076746f6b656e73206d696e74656400000000000000006044820152606401610234565b5050505050505050505050565b336120ec6000546001600160a01b031690565b6001600160a01b0316146121425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610234565b6001600160a01b0381166121be5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610234565b610e13816129ee565b80158061226957506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561222f57600080fd5b505afa158015612243573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612267919061398a565b155b6122db5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610234565b6040516001600160a01b0383166024820152604481018290526123579084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612e7f565b505050565b606061236b8484600085612f64565b90505b9392505050565b6040516001600160a01b03808516602483015283166044820152606481018290526123ad9085906323b872dd60e01b90608401612320565b50505050565b6040516306df336560e51b8152306004820152600090819081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063dbe66ca09060240160206040518083038186803b15801561241957600080fd5b505afa15801561242d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612451919061392a565b61245a57600080fd5b6040516340d1b7db60e11b8152600481018a90526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906381a36fb69060240160206040518083038186803b1580156124bd57600080fd5b505afa1580156124d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f59190613793565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253257600080fd5b505afa158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a9190613793565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d69061259f90339030908f908f90600401613f11565b600060405180830381600087803b1580156125b957600080fd5b505af11580156125cd573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b15801561261b57600080fd5b505af115801561262f573d6000803e3d6000fd5b5050604051630f57464360e21b8152600092506001600160a01b0385169150633d5d190c90612664908e908e90600401613fed565b602060405180830381600087803b15801561267e57600080fd5b505af1158015612692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b6919061398a565b905060006126cc670de0b6b3a76400008361408e565b90506126dc8d85838d8d8d613098565b9650965096505050505096509650969350505050565b6040516306df336560e51b8152306004820152600090819081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063dbe66ca09060240160206040518083038186803b15801561275857600080fd5b505afa15801561276c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612790919061392a565b61279957600080fd5b6040516340d1b7db60e11b8152600481018990526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906381a36fb69060240160206040518083038186803b1580156127fc57600080fd5b505afa158015612810573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128349190613793565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561287157600080fd5b505afa158015612885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a99190613793565b895190915060005b8181101561292f576128eb838c83815181106128dd57634e487b7160e01b600052603260045260246000fd5b602002602001015186612a7b565b61291d83858d848151811061291057634e487b7160e01b600052603260045260246000fd5b6020026020010151612dab565b80612927816140f0565b9150506128b1565b50604051630f57464360e21b81526060906001600160a01b03851690633d5d190c90612961908e908590600401613fed565b602060405180830381600087803b15801561297b57600080fd5b505af115801561298f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b3919061398a565b5060006129c8670de0b6b3a76400008461408e565b90506129d88d86838e8e8e613098565b9750975097505050505050955095509592505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03831660248201526044810182905261235790849063a9059cbb60e01b90606401612320565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415612b0b576040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b1790529050612d1e565b816001600160a01b0316866001600160a01b03161415612cb657600085604051602401612b3a91815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b038a1690612b9c908590613e99565b600060405180830381855afa9150503d8060008114612bd7576040519150601f19603f3d011682016040523d82523d6000602084013e612bdc565b606091505b5091509150600081806020019051810190612bf79190613793565b9050828015612c0e57506001600160a01b03811633145b612c5a5760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e65720000000000000000000000000000006044820152606401610234565b604051602481018a905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe98000000000000000000000000000000000000000000000000000000001790529450612d1e9350505050565b6040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03167f42842e0e0000000000000000000000000000000000000000000000000000000017905290505b600080876001600160a01b031683604051612d399190613e99565b6000604051808303816000865af19150503d8060008114612d76576040519150601f19603f3d011682016040523d82523d6000602084013e612d7b565b606091505b5091509150818190612da05760405162461bcd60e51b81526004016102349190614012565b505050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415612df057505050505050565b816001600160a01b0316866001600160a01b03161415612e775760405160248101859052600060448201526001600160a01b038616606482015260840160408051601f198184030181529190526020810180516001600160e01b03167fbf31196f000000000000000000000000000000000000000000000000000000001790529050612d1e565b505050505050565b6000612ed4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661235c9092919063ffffffff16565b8051909150156123575780806020019051810190612ef2919061392a565b6123575760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610234565b606082471015612fdc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610234565b843b61302a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610234565b600080866001600160a01b031685876040516130469190613e99565b60006040518083038185875af1925050503d8060008114613083576040519150601f19603f3d011682016040523d82523d6000602084013e613088565b606091505b5091509150610b1b82828661337f565b600080806130d06001600160a01b0389167f0000000000000000000000000000000000000000000000000000000000000000896121c7565b6040517fe8e337000000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301527f00000000000000000000000000000000000000000000000000000000000000008116602483015260448201899052606482018790526084820189905260a482018890523060c48301524260e4830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e8e337009061010401606060405180830381600087803b1580156131a657600080fd5b505af11580156131ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131de9190613de5565b92509250925060006132108c7f00000000000000000000000000000000000000000000000000000000000000006133b8565b60025490915061322d906001600160a01b038084169116846121c7565b600260009054906101000a90046001600160a01b03166001600160a01b0316636c9b95888e8a856004546040518563ffffffff1660e01b815260040161329594939291909384526001600160a01b039290921660208401526040830152606082015260800190565b600060405180830381600087803b1580156132af57600080fd5b505af11580156132c3573d6000803e3d6000fd5b505050506000848c6132d591906140ad565b905080156132f1576132f16001600160a01b038e168a83612a4b565b6000600454426133019190614076565b90507f9f69538b20901013ea360bae2dce4079d45308fcfed02b3f0768c9f70f4ba9c08f8e86848e6040516133619594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405180910390a150939d929c50909a509098505050505050505050565b6060831561338e57508161236e565b82511561339e5782518084602001fd5b8160405162461bcd60e51b81526004016102349190614012565b60008060006133c78585613536565b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561342457600080fd5b505afa158015613438573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061345c9190613793565b6040516bffffffffffffffffffffffff19606085811b8216602084015284901b166034820152604801604051602081830303815290604052805190602001206040516020016135159291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b60408051601f19818403018152919052805160209091012095945050505050565b600080826001600160a01b0316846001600160a01b031614156135c15760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f4144445260448201527f45535345530000000000000000000000000000000000000000000000000000006064820152608401610234565b826001600160a01b0316846001600160a01b0316106135e15782846135e4565b83835b90925090506001600160a01b03821661363f5760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f4144445245535300006044820152606401610234565b9250929050565b60008083601f840112613657578182fd5b50813567ffffffffffffffff81111561366e578182fd5b6020830191508360208260051b850101111561363f57600080fd5b600082601f830112613699578081fd5b8135602067ffffffffffffffff8211156136b5576136b5614121565b8160051b6136c4828201614045565b8381528281019086840183880185018910156136de578687fd5b8693505b858410156137005780358352600193909301929184019184016136e2565b50979650505050505050565b600082601f83011261371c578081fd5b813567ffffffffffffffff81111561373657613736614121565b613749601f8201601f1916602001614045565b81815284602083860101111561375d578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613788578081fd5b813561236e81614137565b6000602082840312156137a4578081fd5b815161236e81614137565b600080600080600060a086880312156137c6578081fd5b85356137d181614137565b945060208601356137e181614137565b9350604086013567ffffffffffffffff808211156137fd578283fd5b61380989838a01613689565b9450606088013591508082111561381e578283fd5b61382a89838a01613689565b9350608088013591508082111561383f578283fd5b5061384c8882890161370c565b9150509295509295909350565b6000806000806080858703121561386e578384fd5b843561387981614137565b9350602085013561388981614137565b925060408501359150606085013567ffffffffffffffff8111156138ab578182fd5b6138b78782880161370c565b91505092959194509250565b600080600080600060a086880312156138da578081fd5b85356138e581614137565b945060208601356138f581614137565b93506040860135925060608601359150608086013567ffffffffffffffff81111561391e578182fd5b61384c8882890161370c565b60006020828403121561393b578081fd5b8151801515811461236e578182fd5b60006020828403121561395b578081fd5b81356001600160e01b03198116811461236e578182fd5b600060208284031215613983578081fd5b5035919050565b60006020828403121561399b578081fd5b5051919050565b6000806000604084860312156139b6578283fd5b83359250602084013567ffffffffffffffff8111156139d3578283fd5b6139df86828701613646565b9497909650939450505050565b600080600080600060608688031215613a03578283fd5b85359450602086013567ffffffffffffffff80821115613a21578485fd5b613a2d89838a01613646565b90965094506040880135915080821115613a45578283fd5b50613a5288828901613646565b969995985093965092949392505050565b60008060008060008060808789031215613a7b578384fd5b86359550602087013567ffffffffffffffff80821115613a99578586fd5b613aa58a838b01613646565b90975095506040890135915080821115613abd578283fd5b50613aca89828a01613646565b979a9699509497949695606090950135949350505050565b60008060008060608587031215613af7578182fd5b84359350602085013567ffffffffffffffff811115613b14578283fd5b613b2087828801613646565b9598909750949560400135949350505050565b600080600080600060808688031215613b4a578283fd5b85359450602086013567ffffffffffffffff811115613b67578384fd5b613b7388828901613646565b9699909850959660408101359660609091013595509350505050565b600080600080600060a08688031215613ba6578283fd5b85359450602086013567ffffffffffffffff80821115613bc4578485fd5b613bd089838a01613689565b95506040880135915080821115613be5578485fd5b50613bf288828901613689565b935050606086013591506080860135613c0a81614137565b809150509295509295909350565b600080600080600060a08688031215613c2f578283fd5b85359450602086013567ffffffffffffffff80821115613c4d578485fd5b613c5989838a01613689565b95506040880135915080821115613c6e578485fd5b50613c7b88828901613689565b9598949750949560608101359550608001359392505050565b60008060008060008060c08789031215613cac578384fd5b86359550602087013567ffffffffffffffff80821115613cca578586fd5b613cd68a838b01613689565b96506040890135915080821115613ceb578586fd5b50613cf889828a01613689565b945050606087013592506080870135915060a0870135613d1781614137565b809150509295509295509295565b60008060008060808587031215613d3a578182fd5b84359350602085013567ffffffffffffffff811115613d57578283fd5b613d6387828801613689565b935050604085013591506060850135613d7b81614137565b939692955090935050565b600080600080600060a08688031215613d9d578283fd5b85359450602086013567ffffffffffffffff811115613dba578384fd5b613dc688828901613689565b94505060408601359250606086013591506080860135613c0a81614137565b600080600060608486031215613df9578081fd5b8351925060208401519150604084015190509250925092565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613e43578081fd5b8260051b80836020870137939093016020019283525090919050565b6000815180845260208085019450808401835b83811015613e8e57815187529582019590820190600101613e72565b509495945050505050565b60008251613eab8184602087016140c4565b9190910192915050565b60006001600160a01b03808916835280881660208401525060a06040830152613ee260a083018688613e12565b8281036060840152613ef5818587613e12565b8381036080909401939093525081526020019695505050505050565b60006001600160a01b03808716835280861660208401525060a06040830152613f3d60a0830185613e5f565b8281036060840152613f4f8185613e5f565b838103608090940193909352508152602001949350505050565b606081526000613f7d606083018789613e12565b8281036020840152613f90818688613e12565b9150506001600160a01b03831660408301529695505050505050565b606081526000613fc0606083018688613e12565b8281036020840152613fd28186613e5f565b9150506001600160a01b038316604083015295945050505050565b6040815260006140006040830185613e5f565b82810360208401526109068185613e5f565b60208152600082518060208401526140318160408501602087016140c4565b601f01601f19169190910160400192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561406e5761406e614121565b604052919050565b600082198211156140895761408961410b565b500190565b60008160001904831182151516156140a8576140a861410b565b500290565b6000828210156140bf576140bf61410b565b500390565b60005b838110156140df5781810151838201526020016140c7565b838111156123ad5750506000910152565b60006000198214156141045761410461410b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e1357600080fdfea2646970667358221220737625016b049392f34f38c384c9ea5d91ba4c9e0a93c53320cbec21466354bf64736f6c63430008040033000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f
Deployed Bytecode
0x6080604052600436106101bb5760003560e01c806384d5a232116100ec578063ad5c46481161008a578063c46c4e8a11610064578063c46c4e8a146105c7578063cd9d37b7146105dd578063f23a6e61146105fd578063f2fde38b1461064257600080fd5b8063ad5c46481461053b578063bc197c811461056f578063bdd8172b146105b457600080fd5b80639bf1401c116100c65780639bf1401c146104d25780639d2cbed0146104f2578063a7b1284614610512578063ad402dfc1461052857600080fd5b806384d5a2321461047f5780638da5cb5b1461049f5780639199fc9c146104bd57600080fd5b806353b573bf11610159578063715018a611610133578063715018a61461040a578063739697751461041f57806374a1b0b01461043f578063839006f21461045f57600080fd5b806353b573bf146103775780635ee50f881461038a5780636d13582c146103d657600080fd5b8063150b7a0211610195578063150b7a02146102c75780631809d2c2146103245780631a6907cd146103445780634a5ff0611461035757600080fd5b806301ffc9a714610244578063021001551461027957806310cde786146102a757600080fd5b3661023f57336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2161461023d5760405162461bcd60e51b815260206004820152600960248201527f4f6e6c792057455448000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561025057600080fd5b5061026461025f36600461394a565b610662565b60405190151581526020015b60405180910390f35b34801561028557600080fd5b50610299610294366004613c94565b6106cb565b604051908152602001610270565b3480156102b357600080fd5b506102996102c2366004613c18565b610865565b3480156102d357600080fd5b5061030b6102e2366004613859565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b03199091168152602001610270565b34801561033057600080fd5b5061029961033f366004613b33565b61087f565b610299610352366004613ae2565b6108c3565b34801561036357600080fd5b50610299610372366004613d86565b61090f565b610299610385366004613a63565b610aa7565b34801561039657600080fd5b506103be7f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821681565b6040516001600160a01b039091168152602001610270565b3480156103e257600080fd5b506103be7f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b34801561041657600080fd5b5061023d610b26565b34801561042b57600080fd5b5061023d61043a366004613972565b610b9b565b34801561044b57600080fd5b506003546103be906001600160a01b031681565b34801561046b57600080fd5b5061023d61047a366004613777565b610c4c565b34801561048b57600080fd5b5061023d61049a366004613972565b610e16565b3480156104ab57600080fd5b506000546001600160a01b03166103be565b3480156104c957600080fd5b5061023d610ec7565b3480156104de57600080fd5b506002546103be906001600160a01b031681565b3480156104fe57600080fd5b5061023d61050d3660046139ec565b61118b565b34801561051e57600080fd5b5061029960045481565b610299610536366004613b8f565b611731565b34801561054757600080fd5b506103be7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561057b57600080fd5b5061030b61058a3660046137af565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6102996105c2366004613d25565b611998565b3480156105d357600080fd5b5061029960055481565b3480156105e957600080fd5b5061023d6105f83660046139a2565b611c0f565b34801561060957600080fd5b5061030b6106183660046138c3565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561064e57600080fd5b5061023d61065d366004613777565b6120d9565b60006001600160e01b031982167f4e2312e00000000000000000000000000000000000000000000000000000000014806106c557507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6000600260015414156107205760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610234565b60026001556001600160a01b0382161580159061074657506001600160a01b0382163014155b61074f57600080fd5b6107846001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216333086612375565b6000806107958989898989896123b3565b9250925050600082866107a891906140ad565b905080156108545760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169063a9059cbb90604401602060405180830381600087803b15801561081a57600080fd5b505af115801561082e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610852919061392a565b505b506001805598975050505050505050565b60006108758686868686336106cb565b9695505050505050565b60006108758686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925087915033905061090f565b6000610906858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508792503391506119989050565b95945050505050565b6000600260015414156109645760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610234565b60026001556001600160a01b0382161580159061098a57506001600160a01b0382163014155b61099357600080fd5b6109c86001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216333086612375565b6000806109d888888888886126f2565b9250925050600082866109eb91906140ad565b90508015610a975760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169063a9059cbb90604401602060405180830381600087803b158015610a5d57600080fd5b505af1158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a95919061392a565b505b5060018055979650505050505050565b6000610b1b8787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a9250899182918501908490808284376000920191909152508892503391506117319050565b979650505050505050565b33610b396000546001600160a01b031690565b6001600160a01b031614610b8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610234565b610b9960006129ee565b565b33610bae6000546001600160a01b031690565b6001600160a01b031614610c045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610234565b62127500811115610c475760405162461bcd60e51b815260206004820152600d60248201526c4c6f636b20746f6f206c6f6e6760981b6044820152606401610234565b600555565b33610c5f6000546001600160a01b031690565b6001600160a01b031614610cb55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610234565b6001600160a01b038116610d8557604051600090339047908381818185875af1925050503d8060008114610d05576040519150601f19603f3d011682016040523d82523d6000602084013e610d0a565b606091505b5050905080610d815760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610234565b5050565b6040516370a0823160e01b8152306004820152610e139033906001600160a01b038416906370a082319060240160206040518083038186803b158015610dca57600080fd5b505afa158015610dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e02919061398a565b6001600160a01b0384169190612a4b565b50565b33610e296000546001600160a01b031690565b6001600160a01b031614610e7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610234565b62093a80811115610ec25760405162461bcd60e51b815260206004820152600d60248201526c4c6f636b20746f6f206c6f6e6760981b6044820152606401610234565b600455565b6002546001600160a01b03161580610ee857506003546001600160a01b0316155b610f345760405162461bcd60e51b815260206004820152600860248201527f6e6f74207a65726f0000000000000000000000000000000000000000000000006044820152606401610234565b7f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316630d43e8ad6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8d57600080fd5b505afa158015610fa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc59190613793565b6001600160a01b0316639bf1401c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffd57600080fd5b505afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110359190613793565b600260006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316630d43e8ad6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b457600080fd5b505afa1580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec9190613793565b6001600160a01b03166374a1b0b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561112457600080fd5b505afa158015611138573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115c9190613793565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b828181146111db5760405162461bcd60e51b815260206004820152601060248201527f4e6f7420657175616c206c656e677468000000000000000000000000000000006044820152606401610234565b6000805b8281101561122b5784848281811061120757634e487b7160e01b600052603260045260246000fd5b90506020020135826112199190614076565b9150611224816140f0565b90506111df565b506040516340d1b7db60e11b8152600481018890526000907f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316906381a36fb69060240160206040518083038186803b15801561128f57600080fd5b505afa1580156112a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c79190613793565b6003549091506001600160a01b0316632699f55a896112ee670de0b6b3a76400008661408e565b6005546040516001600160e01b031960e086901b168152600481019390935260248301919091523360448301526064820152608401602060405180830381600087803b15801561133d57600080fd5b505af1158015611351573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611375919061398a565b5060035460405162d3f20f60e21b8152600481018a90526000916001600160a01b03169063034fc83c9060240160206040518083038186803b1580156113ba57600080fd5b505afa1580156113ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f29190613793565b6040516370a0823160e01b81526001600160a01b0380831660048301529192506000918416906370a082319060240160206040518083038186803b15801561143957600080fd5b505afa15801561144d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611471919061398a565b90506000836001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114ae57600080fd5b505afa1580156114c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e69190613793565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d69061151f90339030908f908f908f908f90600401613eb5565b600060405180830381600087803b15801561153957600080fd5b505af115801561154d573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038781166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b15801561159b57600080fd5b505af11580156115af573d6000803e3d6000fd5b5050604051635882017560e11b81526001600160a01b038716925063b10402ea91506115e7908d908d908d908d908a90600401613f69565b602060405180830381600087803b15801561160157600080fd5b505af1158015611615573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611639919061398a565b506040516370a0823160e01b81526001600160a01b038481166004830152600091908616906370a082319060240160206040518083038186803b15801561167f57600080fd5b505afa158015611693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b7919061398a565b90506116cb670de0b6b3a76400008761408e565b6116d59084614076565b81146117235760405162461bcd60e51b815260206004820152601860248201527f496e636f72726563742076746f6b656e73206d696e74656400000000000000006044820152606401610234565b505050505050505050505050565b6000600260015414156117865760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610234565b60026001556001600160a01b038216158015906117ac57506001600160a01b0382163014155b6117b557600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561181057600080fd5b505af1158015611824573d6000803e3d6000fd5b505050505060008061183a8888888834896123b3565b92509250506000823461184d91906140ad565b90508015610a9757604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156118b757600080fd5b505af11580156118cb573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d806000811461191c576040519150601f19603f3d011682016040523d82523d6000602084013e611921565b606091505b5050905080610a955760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610234565b6000600260015414156119ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610234565b60026001556001600160a01b03821615801590611a1357506001600160a01b0382163014155b611a1c57600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a7757600080fd5b505af1158015611a8b573d6000803e3d6000fd5b5050505050600080611aa087878734886126f2565b925092505060008234611ab391906140ad565b90508015611c0057604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611b1d57600080fd5b505af1158015611b31573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b82576040519150601f19603f3d011682016040523d82523d6000602084013e611b87565b606091505b5050905080611bfe5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610234565b505b50600180559695505050505050565b6040516340d1b7db60e11b81526004810184905281906000907f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316906381a36fb69060240160206040518083038186803b158015611c7457600080fd5b505afa158015611c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cac9190613793565b6003549091506001600160a01b0316632699f55a86611cd3670de0b6b3a76400008661408e565b6005546040516001600160e01b031960e086901b168152600481019390935260248301919091523360448301526064820152608401602060405180830381600087803b158015611d2257600080fd5b505af1158015611d36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5a919061398a565b5060035460405162d3f20f60e21b8152600481018790526000916001600160a01b03169063034fc83c9060240160206040518083038186803b158015611d9f57600080fd5b505afa158015611db3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd79190613793565b6040516370a0823160e01b81526001600160a01b0380831660048301529192506000918416906370a082319060240160206040518083038186803b158015611e1e57600080fd5b505afa158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e56919061398a565b60408051600080825260208201909252919250506000846001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea557600080fd5b505afa158015611eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edd9190613793565b90508660005b81811015611f5d57611f1c838b8b84818110611f0f57634e487b7160e01b600052603260045260246000fd5b9050602002013589612a7b565b611f4d83888c8c85818110611f4157634e487b7160e01b600052603260045260246000fd5b90506020020135612dab565b611f56816140f0565b9050611ee3565b50604051635882017560e11b81526001600160a01b0387169063b10402ea90611f90908c908c9088908b90600401613fac565b602060405180830381600087803b158015611faa57600080fd5b505af1158015611fbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe2919061398a565b506040516370a0823160e01b81526001600160a01b038681166004830152600091908816906370a082319060240160206040518083038186803b15801561202857600080fd5b505afa15801561203c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612060919061398a565b9050612074670de0b6b3a76400008961408e565b61207e9086614076565b81146120cc5760405162461bcd60e51b815260206004820152601860248201527f496e636f72726563742076746f6b656e73206d696e74656400000000000000006044820152606401610234565b5050505050505050505050565b336120ec6000546001600160a01b031690565b6001600160a01b0316146121425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610234565b6001600160a01b0381166121be5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610234565b610e13816129ee565b80158061226957506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561222f57600080fd5b505afa158015612243573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612267919061398a565b155b6122db5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610234565b6040516001600160a01b0383166024820152604481018290526123579084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612e7f565b505050565b606061236b8484600085612f64565b90505b9392505050565b6040516001600160a01b03808516602483015283166044820152606481018290526123ad9085906323b872dd60e01b90608401612320565b50505050565b6040516306df336560e51b8152306004820152600090819081906001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216169063dbe66ca09060240160206040518083038186803b15801561241957600080fd5b505afa15801561242d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612451919061392a565b61245a57600080fd5b6040516340d1b7db60e11b8152600481018a90526000907f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316906381a36fb69060240160206040518083038186803b1580156124bd57600080fd5b505afa1580156124d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f59190613793565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253257600080fd5b505afa158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a9190613793565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d69061259f90339030908f908f90600401613f11565b600060405180830381600087803b1580156125b957600080fd5b505af11580156125cd573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b15801561261b57600080fd5b505af115801561262f573d6000803e3d6000fd5b5050604051630f57464360e21b8152600092506001600160a01b0385169150633d5d190c90612664908e908e90600401613fed565b602060405180830381600087803b15801561267e57600080fd5b505af1158015612692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b6919061398a565b905060006126cc670de0b6b3a76400008361408e565b90506126dc8d85838d8d8d613098565b9650965096505050505096509650969350505050565b6040516306df336560e51b8152306004820152600090819081906001600160a01b037f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216169063dbe66ca09060240160206040518083038186803b15801561275857600080fd5b505afa15801561276c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612790919061392a565b61279957600080fd5b6040516340d1b7db60e11b8152600481018990526000907f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b0316906381a36fb69060240160206040518083038186803b1580156127fc57600080fd5b505afa158015612810573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128349190613793565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561287157600080fd5b505afa158015612885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a99190613793565b895190915060005b8181101561292f576128eb838c83815181106128dd57634e487b7160e01b600052603260045260246000fd5b602002602001015186612a7b565b61291d83858d848151811061291057634e487b7160e01b600052603260045260246000fd5b6020026020010151612dab565b80612927816140f0565b9150506128b1565b50604051630f57464360e21b81526060906001600160a01b03851690633d5d190c90612961908e908590600401613fed565b602060405180830381600087803b15801561297b57600080fd5b505af115801561298f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b3919061398a565b5060006129c8670de0b6b3a76400008461408e565b90506129d88d86838e8e8e613098565b9750975097505050505050955095509592505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03831660248201526044810182905261235790849063a9059cbb60e01b90606401612320565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415612b0b576040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b1790529050612d1e565b816001600160a01b0316866001600160a01b03161415612cb657600085604051602401612b3a91815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b038a1690612b9c908590613e99565b600060405180830381855afa9150503d8060008114612bd7576040519150601f19603f3d011682016040523d82523d6000602084013e612bdc565b606091505b5091509150600081806020019051810190612bf79190613793565b9050828015612c0e57506001600160a01b03811633145b612c5a5760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e65720000000000000000000000000000006044820152606401610234565b604051602481018a905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe98000000000000000000000000000000000000000000000000000000001790529450612d1e9350505050565b6040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03167f42842e0e0000000000000000000000000000000000000000000000000000000017905290505b600080876001600160a01b031683604051612d399190613e99565b6000604051808303816000865af19150503d8060008114612d76576040519150601f19603f3d011682016040523d82523d6000602084013e612d7b565b606091505b5091509150818190612da05760405162461bcd60e51b81526004016102349190614012565b505050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415612df057505050505050565b816001600160a01b0316866001600160a01b03161415612e775760405160248101859052600060448201526001600160a01b038616606482015260840160408051601f198184030181529190526020810180516001600160e01b03167fbf31196f000000000000000000000000000000000000000000000000000000001790529050612d1e565b505050505050565b6000612ed4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661235c9092919063ffffffff16565b8051909150156123575780806020019051810190612ef2919061392a565b6123575760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610234565b606082471015612fdc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610234565b843b61302a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610234565b600080866001600160a01b031685876040516130469190613e99565b60006040518083038185875af1925050503d8060008114613083576040519150601f19603f3d011682016040523d82523d6000602084013e613088565b606091505b5091509150610b1b82828661337f565b600080806130d06001600160a01b0389167f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f896121c7565b6040517fe8e337000000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116602483015260448201899052606482018790526084820189905260a482018890523060c48301524260e4830152600091829182917f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9091169063e8e337009061010401606060405180830381600087803b1580156131a657600080fd5b505af11580156131ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131de9190613de5565b92509250925060006132108c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26133b8565b60025490915061322d906001600160a01b038084169116846121c7565b600260009054906101000a90046001600160a01b03166001600160a01b0316636c9b95888e8a856004546040518563ffffffff1660e01b815260040161329594939291909384526001600160a01b039290921660208401526040830152606082015260800190565b600060405180830381600087803b1580156132af57600080fd5b505af11580156132c3573d6000803e3d6000fd5b505050506000848c6132d591906140ad565b905080156132f1576132f16001600160a01b038e168a83612a4b565b6000600454426133019190614076565b90507f9f69538b20901013ea360bae2dce4079d45308fcfed02b3f0768c9f70f4ba9c08f8e86848e6040516133619594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405180910390a150939d929c50909a509098505050505050505050565b6060831561338e57508161236e565b82511561339e5782518084602001fd5b8160405162461bcd60e51b81526004016102349190614012565b60008060006133c78585613536565b915091507f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561342457600080fd5b505afa158015613438573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061345c9190613793565b6040516bffffffffffffffffffffffff19606085811b8216602084015284901b166034820152604801604051602081830303815290604052805190602001206040516020016135159291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b60408051601f19818403018152919052805160209091012095945050505050565b600080826001600160a01b0316846001600160a01b031614156135c15760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f4144445260448201527f45535345530000000000000000000000000000000000000000000000000000006064820152608401610234565b826001600160a01b0316846001600160a01b0316106135e15782846135e4565b83835b90925090506001600160a01b03821661363f5760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f4144445245535300006044820152606401610234565b9250929050565b60008083601f840112613657578182fd5b50813567ffffffffffffffff81111561366e578182fd5b6020830191508360208260051b850101111561363f57600080fd5b600082601f830112613699578081fd5b8135602067ffffffffffffffff8211156136b5576136b5614121565b8160051b6136c4828201614045565b8381528281019086840183880185018910156136de578687fd5b8693505b858410156137005780358352600193909301929184019184016136e2565b50979650505050505050565b600082601f83011261371c578081fd5b813567ffffffffffffffff81111561373657613736614121565b613749601f8201601f1916602001614045565b81815284602083860101111561375d578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613788578081fd5b813561236e81614137565b6000602082840312156137a4578081fd5b815161236e81614137565b600080600080600060a086880312156137c6578081fd5b85356137d181614137565b945060208601356137e181614137565b9350604086013567ffffffffffffffff808211156137fd578283fd5b61380989838a01613689565b9450606088013591508082111561381e578283fd5b61382a89838a01613689565b9350608088013591508082111561383f578283fd5b5061384c8882890161370c565b9150509295509295909350565b6000806000806080858703121561386e578384fd5b843561387981614137565b9350602085013561388981614137565b925060408501359150606085013567ffffffffffffffff8111156138ab578182fd5b6138b78782880161370c565b91505092959194509250565b600080600080600060a086880312156138da578081fd5b85356138e581614137565b945060208601356138f581614137565b93506040860135925060608601359150608086013567ffffffffffffffff81111561391e578182fd5b61384c8882890161370c565b60006020828403121561393b578081fd5b8151801515811461236e578182fd5b60006020828403121561395b578081fd5b81356001600160e01b03198116811461236e578182fd5b600060208284031215613983578081fd5b5035919050565b60006020828403121561399b578081fd5b5051919050565b6000806000604084860312156139b6578283fd5b83359250602084013567ffffffffffffffff8111156139d3578283fd5b6139df86828701613646565b9497909650939450505050565b600080600080600060608688031215613a03578283fd5b85359450602086013567ffffffffffffffff80821115613a21578485fd5b613a2d89838a01613646565b90965094506040880135915080821115613a45578283fd5b50613a5288828901613646565b969995985093965092949392505050565b60008060008060008060808789031215613a7b578384fd5b86359550602087013567ffffffffffffffff80821115613a99578586fd5b613aa58a838b01613646565b90975095506040890135915080821115613abd578283fd5b50613aca89828a01613646565b979a9699509497949695606090950135949350505050565b60008060008060608587031215613af7578182fd5b84359350602085013567ffffffffffffffff811115613b14578283fd5b613b2087828801613646565b9598909750949560400135949350505050565b600080600080600060808688031215613b4a578283fd5b85359450602086013567ffffffffffffffff811115613b67578384fd5b613b7388828901613646565b9699909850959660408101359660609091013595509350505050565b600080600080600060a08688031215613ba6578283fd5b85359450602086013567ffffffffffffffff80821115613bc4578485fd5b613bd089838a01613689565b95506040880135915080821115613be5578485fd5b50613bf288828901613689565b935050606086013591506080860135613c0a81614137565b809150509295509295909350565b600080600080600060a08688031215613c2f578283fd5b85359450602086013567ffffffffffffffff80821115613c4d578485fd5b613c5989838a01613689565b95506040880135915080821115613c6e578485fd5b50613c7b88828901613689565b9598949750949560608101359550608001359392505050565b60008060008060008060c08789031215613cac578384fd5b86359550602087013567ffffffffffffffff80821115613cca578586fd5b613cd68a838b01613689565b96506040890135915080821115613ceb578586fd5b50613cf889828a01613689565b945050606087013592506080870135915060a0870135613d1781614137565b809150509295509295509295565b60008060008060808587031215613d3a578182fd5b84359350602085013567ffffffffffffffff811115613d57578283fd5b613d6387828801613689565b935050604085013591506060850135613d7b81614137565b939692955090935050565b600080600080600060a08688031215613d9d578283fd5b85359450602086013567ffffffffffffffff811115613dba578384fd5b613dc688828901613689565b94505060408601359250606086013591506080860135613c0a81614137565b600080600060608486031215613df9578081fd5b8351925060208401519150604084015190509250925092565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613e43578081fd5b8260051b80836020870137939093016020019283525090919050565b6000815180845260208085019450808401835b83811015613e8e57815187529582019590820190600101613e72565b509495945050505050565b60008251613eab8184602087016140c4565b9190910192915050565b60006001600160a01b03808916835280881660208401525060a06040830152613ee260a083018688613e12565b8281036060840152613ef5818587613e12565b8381036080909401939093525081526020019695505050505050565b60006001600160a01b03808716835280861660208401525060a06040830152613f3d60a0830185613e5f565b8281036060840152613f4f8185613e5f565b838103608090940193909352508152602001949350505050565b606081526000613f7d606083018789613e12565b8281036020840152613f90818688613e12565b9150506001600160a01b03831660408301529695505050505050565b606081526000613fc0606083018688613e12565b8281036020840152613fd28186613e5f565b9150506001600160a01b038316604083015295945050505050565b6040815260006140006040830185613e5f565b82810360208401526109068185613e5f565b60208152600082518060208401526140318160408501602087016140c4565b601f01601f19169190910160400192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561406e5761406e614121565b604052919050565b600082198211156140895761408961410b565b500190565b60008160001904831182151516156140a8576140a861410b565b500290565b6000828210156140bf576140bf61410b565b500390565b60005b838110156140df5781810151838201526020016140c7565b838111156123ad5750506000910152565b60006000198214156141045761410461410b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e1357600080fdfea2646970667358221220737625016b049392f34f38c384c9ea5d91ba4c9e0a93c53320cbec21466354bf64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f
-----Decoded View---------------
Arg [0] : _nftxFactory (address): 0xBE86f647b167567525cCAAfcd6f881F1Ee558216
Arg [1] : _sushiRouter (address): 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216
Arg [1] : 000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f
Deployed Bytecode Sourcemap
60556:15750:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75859:10;-1:-1:-1;;;;;75881:4:0;75859:27;;75851:49;;;;-1:-1:-1;;;75851:49:0;;25565:2:1;75851:49:0;;;25547:21:1;25604:1;25584:18;;;25577:29;25642:11;25622:18;;;25615:39;25671:18;;75851:49:0;;;;;;;;;60556:15750;;;;;37046:269;;;;;;;;;;-1:-1:-1;37046:269:0;;;;;:::i;:::-;;:::i;:::-;;;22661:14:1;;22654:22;22636:41;;22624:2;22609:18;37046:269:0;;;;;;;;67402:648;;;;;;;;;;-1:-1:-1;67402:648:0;;;;;:::i;:::-;;:::i;:::-;;;30727:25:1;;;30715:2;30700:18;67402:648:0;30682:76:1;67122:274:0;;;;;;;;;;-1:-1:-1;67122:274:0;;;;;:::i;:::-;;:::i;33046:207::-;;;;;;;;;;-1:-1:-1;33046:207:0;;;;;:::i;:::-;33215:30;33046:207;;;;;;;;;;-1:-1:-1;;;;;;22850:79:1;;;22832:98;;22820:2;22805:18;33046:207:0;22787:149:1;66267:237:0;;;;;;;;;;-1:-1:-1;66267:237:0;;;;;:::i;:::-;;:::i;64298:222::-;;;;;;:::i;:::-;;:::i;66510:606::-;;;;;;;;;;-1:-1:-1;66510:606:0;;;;;:::i;:::-;;:::i;65231:264::-;;;;;;:::i;:::-;;:::i;60838:46::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16683:55:1;;;16665:74;;16653:2;16638:18;60838:46:0;16620:125:1;60889:47:0;;;;;;;;;;;;;;;59927:94;;;;;;;;;;;;;:::i;62146:196::-;;;;;;;;;;-1:-1:-1;62146:196:0;;;;;:::i;:::-;;:::i;60788:45::-;;;;;;;;;;-1:-1:-1;60788:45:0;;;;-1:-1:-1;;;;;60788:45:0;;;75912:391;;;;;;;;;;-1:-1:-1;75912:391:0;;;;;:::i;:::-;;:::i;61979:160::-;;;;;;;;;;-1:-1:-1;61979:160:0;;;;;:::i;:::-;;:::i;59278:87::-;;;;;;;;;;-1:-1:-1;59324:7:0;59351:6;-1:-1:-1;;;;;59351:6:0;59278:87;;61560:413;;;;;;;;;;;;;:::i;60752:31::-;;;;;;;;;;-1:-1:-1;60752:31:0;;;;-1:-1:-1;;;;;60752:31:0;;;63279:1013;;;;;;;;;;-1:-1:-1;63279:1013:0;;;;;:::i;:::-;;:::i;60943:36::-;;;;;;;;;;;;;;;;65501:760;;;;;;:::i;:::-;;:::i;60719:27::-;;;;;;;;;;;;;;;37726:203;;;;;;;;;;-1:-1:-1;37726:203:0;;;;;:::i;:::-;37885:36;37726:203;;;;;;;;64526:699;;;;;;:::i;:::-;;:::i;60985:41::-;;;;;;;;;;;;;;;;62348:925;;;;;;;;;;-1:-1:-1;62348:925:0;;;;;:::i;:::-;;:::i;37543:175::-;;;;;;;;;;-1:-1:-1;37543:175:0;;;;;:::i;:::-;37679:31;37543:175;;;;;;;;60176:192;;;;;;;;;;-1:-1:-1;60176:192:0;;;;;:::i;:::-;;:::i;37046:269::-;37170:4;-1:-1:-1;;;;;;37194:60:0;;37209:45;37194:60;;:113;;-1:-1:-1;36684:36:0;-1:-1:-1;;;;;;36669:51:0;;;37271:36;37187:120;37046:269;-1:-1:-1;;37046:269:0:o;67402:648::-;67607:7;57436:1;58032:7;;:19;;58024:63;;;;-1:-1:-1;;;58024:63:0;;29654:2:1;58024:63:0;;;29636:21:1;29693:2;29673:18;;;29666:30;29732:33;29712:18;;;29705:61;29783:18;;58024:63:0;29626:181:1;58024:63:0;57436:1;58165:7;:18;-1:-1:-1;;;;;67631:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;67651:19:0;::::1;67665:4;67651:19;;67631:39;67623:48;;;::::0;::::1;;67678:84;-1:-1:-1::0;;;;;67704:4:0::1;67678:49;67728:10;67748:4;67755:6:::0;67678:49:::1;:84::i;:::-;67772:17;67791::::0;67812:67:::1;67834:7;67843:3;67848:7;67857:9;67868:6;67876:2;67812:21;:67::i;:::-;67769:110;;;;;67911:17;67938:9;67931:6;:16;;;;:::i;:::-;67911:36:::0;-1:-1:-1;67959:14:0;;67955:65:::1;;67984:28;::::0;-1:-1:-1;;;67984:28:0;;-1:-1:-1;;;;;20655:55:1;;;67984:28:0::1;::::0;::::1;20637:74:1::0;20727:18;;;20720:34;;;67984:4:0::1;:13;::::0;::::1;::::0;20610:18:1;;67984:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67955:65;-1:-1:-1::0;57392:1:0;58344:22;;68035:9;67402:648;-1:-1:-1;;;;;;;;67402:648:0:o;67122:274::-;67295:7;67318:72;67337:7;67346:3;67351:7;67360:9;67371:6;67379:10;67318:18;:72::i;:::-;67311:79;67122:274;-1:-1:-1;;;;;;67122:274:0:o;66267:237::-;66413:7;66436:62;66454:7;66463:3;;66436:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66468:9:0;;-1:-1:-1;66479:6:0;;-1:-1:-1;66487:10:0;;-1:-1:-1;66436:17:0;:62::i;64298:222::-;64434:7;64457:57;64478:7;64487:3;;64457:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64492:9:0;;-1:-1:-1;64503:10:0;;-1:-1:-1;64457:20:0;;-1:-1:-1;64457:57:0:i;:::-;64450:64;64298:222;-1:-1:-1;;;;;64298:222:0:o;66510:606::-;66684:7;57436:1;58032:7;;:19;;58024:63;;;;-1:-1:-1;;;58024:63:0;;29654:2:1;58024:63:0;;;29636:21:1;29693:2;29673:18;;;29666:30;29732:33;29712:18;;;29705:61;29783:18;;58024:63:0;29626:181:1;58024:63:0;57436:1;58165:7;:18;-1:-1:-1;;;;;66708:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;66728:19:0;::::1;66742:4;66728:19;;66708:39;66700:48;;;::::0;::::1;;66755:84;-1:-1:-1::0;;;;;66781:4:0::1;66755:49;66805:10;66825:4;66832:6:::0;66755:49:::1;:84::i;:::-;66849:17;66868::::0;66889:57:::1;66910:7;66919:3;66924:9;66935:6;66943:2;66889:20;:57::i;:::-;66846:100;;;;;66978:17;67005:9;66998:6;:16;;;;:::i;:::-;66978:36:::0;-1:-1:-1;67025:14:0;;67021:65:::1;;67050:28;::::0;-1:-1:-1;;;67050:28:0;;-1:-1:-1;;;;;20655:55:1;;;67050:28:0::1;::::0;::::1;20637:74:1::0;20727:18;;;20720:34;;;67050:4:0::1;:13;::::0;::::1;::::0;20610:18:1;;67050:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;67021:65;-1:-1:-1::0;57392:1:0;58344:22;;67101:9;66510:606;-1:-1:-1;;;;;;;66510:606:0:o;65231:264::-;65400:7;65423:66;65445:7;65454:3;;65423:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65423:66:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65459:7:0;;-1:-1:-1;65459:7:0;;;;65423:66;;;65459:7;;65423:66;65459:7;65423:66;;;;;;;;;-1:-1:-1;65468:8:0;;-1:-1:-1;65478:10:0;;-1:-1:-1;65423:21:0;;-1:-1:-1;65423:66:0:i;:::-;65416:73;65231:264;-1:-1:-1;;;;;;;65231:264:0:o;59927:94::-;59509:10;59498:7;59324;59351:6;-1:-1:-1;;;;;59351:6:0;;59278:87;59498:7;-1:-1:-1;;;;;59498:21:0;;59490:66;;;;-1:-1:-1;;;59490:66:0;;27484:2:1;59490:66:0;;;27466:21:1;;;27503:18;;;27496:30;27562:34;27542:18;;;27535:62;27614:18;;59490:66:0;27456:182:1;59490:66:0;59992:21:::1;60010:1;59992:9;:21::i;:::-;59927:94::o:0;62146:196::-;59509:10;59498:7;59324;59351:6;-1:-1:-1;;;;;59351:6:0;;59278:87;59498:7;-1:-1:-1;;;;;59498:21:0;;59490:66;;;;-1:-1:-1;;;59490:66:0;;27484:2:1;59490:66:0;;;27466:21:1;;;27503:18;;;27496:30;27562:34;27542:18;;;27535:62;27614:18;;59490:66:0;27456:182:1;59490:66:0;62264:7:::1;62240:20;:31;;62232:57;;;::::0;-1:-1:-1;;;62232:57:0;;27142:2:1;62232:57:0::1;::::0;::::1;27124:21:1::0;27181:2;27161:18;;;27154:30;-1:-1:-1;;;27200:18:1;;;27193:43;27253:18;;62232:57:0::1;27114:163:1::0;62232:57:0::1;62296:17;:40:::0;62146:196::o;75912:391::-;59509:10;59498:7;59324;59351:6;-1:-1:-1;;;;;59351:6:0;;59278:87;59498:7;-1:-1:-1;;;;;59498:21:0;;59490:66;;;;-1:-1:-1;;;59490:66:0;;27484:2:1;59490:66:0;;;27466:21:1;;;27503:18;;;27496:30;27562:34;27542:18;;;27535:62;27614:18;;59490:66:0;27456:182:1;59490:66:0;-1:-1:-1;;;;;75973:19:0;::::1;75969:329;;76022:58;::::0;76004:12:::1;::::0;76030:10:::1;::::0;76054:21:::1;::::0;76004:12;76022:58;76004:12;76022:58;76054:21;76030:10;76022:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76003:77;;;76097:7;76089:78;;;::::0;-1:-1:-1;;;76089:78:0;;26308:2:1;76089:78:0::1;::::0;::::1;26290:21:1::0;26347:2;26327:18;;;26320:30;26386:34;26366:18;;;26359:62;26457:28;26437:18;;;26430:56;26503:19;;76089:78:0::1;26280:248:1::0;76089:78:0::1;75969:329;75912:391:::0;:::o;75969:329::-:1;76240:49;::::0;-1:-1:-1;;;76240:49:0;;76283:4:::1;76240:49;::::0;::::1;16665:74:1::0;76190:100:0::1;::::0;76228:10:::1;::::0;-1:-1:-1;;;;;76240:34:0;::::1;::::0;::::1;::::0;16638:18:1;;76240:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;76190:37:0;::::1;::::0;:100;:37:::1;:100::i;:::-;75912:391:::0;:::o;61979:160::-;59509:10;59498:7;59324;59351:6;-1:-1:-1;;;;;59351:6:0;;59278:87;59498:7;-1:-1:-1;;;;;59498:21:0;;59490:66;;;;-1:-1:-1;;;59490:66:0;;27484:2:1;59490:66:0;;;27466:21:1;;;27503:18;;;27496:30;27562:34;27542:18;;;27535:62;27614:18;;59490:66:0;27456:182:1;59490:66:0;62076:6:::1;62059:13;:23;;62051:49;;;::::0;-1:-1:-1;;;62051:49:0;;27142:2:1;62051:49:0::1;::::0;::::1;27124:21:1::0;27181:2;27161:18;;;27154:30;-1:-1:-1;;;27200:18:1;;;27193:43;27253:18;;62051:49:0::1;27114:163:1::0;62051:49:0::1;62107:10;:26:::0;61979:160::o;61560:413::-;61624:9;;-1:-1:-1;;;;;61624:9:0;61616:32;;:75;;-1:-1:-1;61660:16:0;;-1:-1:-1;;;;;61660:16:0;61652:39;61616:75;61608:96;;;;-1:-1:-1;;;61608:96:0;;28203:2:1;61608:96:0;;;28185:21:1;28242:1;28222:18;;;28215:29;28280:10;28260:18;;;28253:38;28308:18;;61608:96:0;28175:157:1;61608:96:0;61782:11;-1:-1:-1;;;;;61764:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61738:84:0;;:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61711:9;;:114;;;;;-1:-1:-1;;;;;61711:114:0;;;;;-1:-1:-1;;;;;61711:114:0;;;;;;61917:11;-1:-1:-1;;;;;61899:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61873:91:0;;:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61832:16;:135;;-1:-1:-1;;61832:135:0;-1:-1:-1;;;;;61832:135:0;;;;;;;;;;61560:413::o;63279:1013::-;63416:8;63446:24;;;63438:53;;;;-1:-1:-1;;;63438:53:0;;28539:2:1;63438:53:0;;;28521:21:1;28578:2;28558:18;;;28551:30;28617:18;28597;;;28590:46;28653:18;;63438:53:0;28511:166:1;63438:53:0;63498:13;63523:9;63518:69;63538:6;63534:1;:10;63518:69;;;63569:7;;63577:1;63569:10;;;;;-1:-1:-1;;;63569:10:0;;;;;;;;;;;;;;;63560:19;;;;;:::i;:::-;;-1:-1:-1;63546:3:0;;;:::i;:::-;;;63518:69;;;-1:-1:-1;63623:26:0;;-1:-1:-1;;;63623:26:0;;;;;30727:25:1;;;63593:16:0;;63623:11;-1:-1:-1;;;;;63623:17:0;;;;30700:18:1;;63623:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63657:16;;63593:57;;-1:-1:-1;;;;;;63657:16:0;:32;63690:7;63699:10;61056:4;63699:5;:10;:::i;:::-;63723:17;;63657:84;;-1:-1:-1;;;;;;63657:84:0;;;;;;;;;;31829:25:1;;;;31870:18;;;31863:34;;;;63711:10:0;31913:18:1;;;31906:83;32005:18;;;31998:34;31801:19;;63657:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;63765:16:0;;:37;;-1:-1:-1;;;63765:37:0;;;;;30727:25:1;;;63748:14:0;;-1:-1:-1;;;;;63765:16:0;;:28;;30700:18:1;;63765:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63826:51;;-1:-1:-1;;;63826:51:0;;-1:-1:-1;;;;;16683:55:1;;;63826:51:0;;;16665:74:1;63748:54:0;;-1:-1:-1;63809:14:0;;63826:34;;;;;16638:18:1;;63826:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63809:68;;63884:23;63930:5;-1:-1:-1;;;;;63930:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63958:75;;-1:-1:-1;;;63958:75:0;;63884:67;;-1:-1:-1;;;;;;63958:25:0;;;;;:75;;63984:10;;64004:4;;64011:8;;;;64021:7;;;;63958:75;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64040:43:0;;-1:-1:-1;;;64040:43:0;;-1:-1:-1;;;;;20337:55:1;;;64040:43:0;;;20319:74:1;64078:4:0;20409:18:1;;;20402:50;64040:21:0;;;-1:-1:-1;64040:21:0;;-1:-1:-1;20292:18:1;;64040:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64090:48:0;;-1:-1:-1;;;64090:48:0;;-1:-1:-1;;;;;64090:12:0;;;-1:-1:-1;64090:12:0;;-1:-1:-1;64090:48:0;;64103:8;;;;64113:7;;;;64130:6;;64090:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;64162:51:0;;-1:-1:-1;;;64162:51:0;;-1:-1:-1;;;;;16683:55:1;;;64162:51:0;;;16665:74:1;64145:14:0;;64162:34;;;;;;16638:18:1;;64162:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64145:68;-1:-1:-1;64247:10:0;61056:4;64247:5;:10;:::i;:::-;64238:19;;:6;:19;:::i;:::-;64228:6;:29;64220:66;;;;-1:-1:-1;;;64220:66:0;;25212:2:1;64220:66:0;;;25194:21:1;25251:2;25231:18;;;25224:30;25290:26;25270:18;;;25263:54;25334:18;;64220:66:0;25184:174:1;64220:66:0;63279:1013;;;;;;;;;;;;:::o;65501:760::-;65696:7;57436:1;58032:7;;:19;;58024:63;;;;-1:-1:-1;;;58024:63:0;;29654:2:1;58024:63:0;;;29636:21:1;29693:2;29673:18;;;29666:30;29732:33;29712:18;;;29705:61;29783:18;;58024:63:0;29626:181:1;58024:63:0;57436:1;58165:7;:18;-1:-1:-1;;;;;65720:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;65740:19:0;::::1;65754:4;65740:19;;65720:39;65712:48;;;::::0;::::1;;65767:4;-1:-1:-1::0;;;;;65767:12:0::1;;65787:9;65767:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;65830:17;65849::::0;65870:69:::1;65892:7;65901:3;65906:7;65915:8;65925:9;65936:2;65870:21;:69::i;:::-;65827:112;;;;;65971:17;66001:9;65991;:19;;;;:::i;:::-;65971:39:::0;-1:-1:-1;66021:14:0;;66017:214:::1;;66046:24;::::0;-1:-1:-1;;;66046:24:0;;::::1;::::0;::::1;30727:25:1::0;;;66046:4:0::1;-1:-1:-1::0;;;;;66046:13:0::1;::::0;::::1;::::0;30700:18:1;;66046:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66080:12;66106:2;-1:-1:-1::0;;;;;66098:16:0::1;66122:9;66098:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66079:57;;;66153:7;66145:78;;;::::0;-1:-1:-1;;;66145:78:0;;26308:2:1;66145:78:0::1;::::0;::::1;26290:21:1::0;26347:2;26327:18;;;26320:30;26386:34;26366:18;;;26359:62;26457:28;26437:18;;;26430:56;26503:19;;66145:78:0::1;26280:248:1::0;64526:699:0;64690:7;57436:1;58032:7;;:19;;58024:63;;;;-1:-1:-1;;;58024:63:0;;29654:2:1;58024:63:0;;;29636:21:1;29693:2;29673:18;;;29666:30;29732:33;29712:18;;;29705:61;29783:18;;58024:63:0;29626:181:1;58024:63:0;57436:1;58165:7;:18;-1:-1:-1;;;;;64714:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;64734:19:0;::::1;64748:4;64734:19;;64714:39;64706:48;;;::::0;::::1;;64761:4;-1:-1:-1::0;;;;;64761:12:0::1;;64781:9;64761:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;64803:17;64822::::0;64843:60:::1;64864:7;64873:3;64878:9;64889;64900:2;64843:20;:60::i;:::-;64800:103;;;;;64935:17;64965:9;64955;:19;;;;:::i;:::-;64935:39:::0;-1:-1:-1;64985:14:0;;64981:214:::1;;65010:24;::::0;-1:-1:-1;;;65010:24:0;;::::1;::::0;::::1;30727:25:1::0;;;65010:4:0::1;-1:-1:-1::0;;;;;65010:13:0::1;::::0;::::1;::::0;30700:18:1;;65010:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65044:12;65070:2;-1:-1:-1::0;;;;;65062:16:0::1;65086:9;65062:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65043:57;;;65117:7;65109:78;;;::::0;-1:-1:-1;;;65109:78:0;;26308:2:1;65109:78:0::1;::::0;::::1;26290:21:1::0;26347:2;26327:18;;;26320:30;26386:34;26366:18;;;26359:62;26457:28;26437:18;;;26430:56;26503:19;;65109:78:0::1;26280:248:1::0;65109:78:0::1;64981:214;;-1:-1:-1::0;57392:1:0;58344:22;;65210:9;64526:699;-1:-1:-1;;;;;;64526:699:0:o;62348:925::-;62507:26;;-1:-1:-1;;;62507:26:0;;;;;30727:25:1;;;62455:8:0;;62439:13;;62507:11;-1:-1:-1;;;;;62507:17:0;;;;30700:18:1;;62507:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62541:16;;62477:57;;-1:-1:-1;;;;;;62541:16:0;:32;62574:7;62583:10;61056:4;62583:5;:10;:::i;:::-;62607:17;;62541:84;;-1:-1:-1;;;;;;62541:84:0;;;;;;;;;;31829:25:1;;;;31870:18;;;31863:34;;;;62595:10:0;31913:18:1;;;31906:83;32005:18;;;31998:34;31801:19;;62541:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;62649:16:0;;:37;;-1:-1:-1;;;62649:37:0;;;;;30727:25:1;;;62632:14:0;;-1:-1:-1;;;;;62649:16:0;;:28;;30700:18:1;;62649:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62710:42;;-1:-1:-1;;;62710:42:0;;-1:-1:-1;;;;;16683:55:1;;;62710:42:0;;;16665:74:1;62632:54:0;;-1:-1:-1;62693:14:0;;62710:34;;;;;16638:18:1;;62710:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62786:16;;;62759:24;62786:16;;;;;;;;;62693:59;;-1:-1:-1;62759:43:0;62809:20;62832:5;-1:-1:-1;;;;;62832:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62809:43;-1:-1:-1;62876:8:0;62859:14;62898:176;62918:6;62914:1;:10;62898:176;;;62940:61;62959:12;62973:8;;62982:1;62973:11;;;;;-1:-1:-1;;;62973:11:0;;;;;;;;;;;;;;;62994:5;62940:18;:61::i;:::-;63010:56;63024:12;63046:5;63054:8;;63063:1;63054:11;;;;;-1:-1:-1;;;63054:11:0;;;;;;;;;;;;;;;63010:13;:56::i;:::-;62926:3;;;:::i;:::-;;;62898:176;;;-1:-1:-1;63080:48:0;;-1:-1:-1;;;63080:48:0;;-1:-1:-1;;;;;63080:12:0;;;;;:48;;63093:8;;;;63103:7;;63120:6;;63080:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;63152:42:0;;-1:-1:-1;;;63152:42:0;;-1:-1:-1;;;;;16683:55:1;;;63152:42:0;;;16665:74:1;63135:14:0;;63152:34;;;;;;16638:18:1;;63152:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63135:59;-1:-1:-1;63228:10:0;61056:4;63228:5;:10;:::i;:::-;63219:19;;:6;:19;:::i;:::-;63209:6;:29;63201:66;;;;-1:-1:-1;;;63201:66:0;;25212:2:1;63201:66:0;;;25194:21:1;25251:2;25231:18;;;25224:30;25290:26;25270:18;;;25263:54;25334:18;;63201:66:0;25184:174:1;63201:66:0;62348:925;;;;;;;;;;;:::o;60176:192::-;59509:10;59498:7;59324;59351:6;-1:-1:-1;;;;;59351:6:0;;59278:87;59498:7;-1:-1:-1;;;;;59498:21:0;;59490:66;;;;-1:-1:-1;;;59490:66:0;;27484:2:1;59490:66:0;;;27466:21:1;;;27503:18;;;27496:30;27562:34;27542:18;;;27535:62;27614:18;;59490:66:0;27456:182:1;59490:66:0;-1:-1:-1;;;;;60265:22:0;::::1;60257:73;;;::::0;-1:-1:-1;;;60257:73:0;;24805:2:1;60257:73:0::1;::::0;::::1;24787:21:1::0;24844:2;24824:18;;;24817:30;24883:34;24863:18;;;24856:62;24954:8;24934:18;;;24927:36;24980:19;;60257:73:0::1;24777:228:1::0;60257:73:0::1;60341:19;60351:8;60341:9;:19::i;52896:633::-:0;53277:10;;;53276:62;;-1:-1:-1;53293:39:0;;;;;53317:4;53293:39;;;16985:34:1;-1:-1:-1;;;;;17055:15:1;;;17035:18;;;17028:43;53293:15:0;;;;;16897:18:1;;53293:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;53276:62;53268:152;;;;-1:-1:-1;;;53268:152:0;;30014:2:1;53268:152:0;;;29996:21:1;30053:2;30033:18;;;30026:30;30092:34;30072:18;;;30065:62;30163:24;30143:18;;;30136:52;30205:19;;53268:152:0;29986:244:1;53268:152:0;53458:62;;-1:-1:-1;;;;;20655:55:1;;53458:62:0;;;20637:74:1;20727:18;;;20720:34;;;53431:90:0;;53451:5;;53481:22;;20610:18:1;;53458:62:0;;;;-1:-1:-1;;53458:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;53458:62:0;-1:-1:-1;;;;;;53458:62:0;;;;;;;;;;53431:19;:90::i;:::-;52896:633;;;:::o;47242:195::-;47345:12;47377:52;47399:6;47407:4;47413:1;47416:12;47377:21;:52::i;:::-;47370:59;;47242:195;;;;;;:::o;52411:216::-;52550:68;;-1:-1:-1;;;;;19257:15:1;;;52550:68:0;;;19239:34:1;19309:15;;19289:18;;;19282:43;19341:18;;;19334:34;;;52523:96:0;;52543:5;;-1:-1:-1;;;52573:27:0;19151:18:1;;52550:68:0;19133:241:1;52523:96:0;52411:216;;;;:::o;68911:860::-;69150:43;;-1:-1:-1;;;69150:43:0;;69187:4;69150:43;;;16665:74:1;69108:7:0;;;;;;-1:-1:-1;;;;;69150:11:0;:28;;;;16638:18:1;;69150:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69142:52;;;;;;69217:26;;-1:-1:-1;;;69217:26:0;;;;;30727:25:1;;;69201:13:0;;69217:11;-1:-1:-1;;;;;69217:17:0;;;;30700:18:1;;69217:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69201:42;;69301:20;69335:5;-1:-1:-1;;;;;69324:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69363:100;;-1:-1:-1;;;69363:100:0;;69301:55;;-1:-1:-1;;;;;;69363:55:0;;;;;:100;;69419:10;;69439:4;;69446:3;;69451:7;;69363:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69470:64:0;;-1:-1:-1;;;69470:64:0;;-1:-1:-1;;;;;20337:55:1;;;69470:64:0;;;20319:74:1;69529:4:0;20409:18:1;;;20402:50;69470:51:0;;;-1:-1:-1;69470:51:0;;-1:-1:-1;20292:18:1;;69470:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69563:36:0;;-1:-1:-1;;;69563:36:0;;69547:13;;-1:-1:-1;;;;;;69563:22:0;;;-1:-1:-1;69563:22:0;;:36;;69586:3;;69591:7;;69563:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69547:52;-1:-1:-1;69606:15:0;69625:12;61056:4;69547:52;69625:12;:::i;:::-;69606:32;;69697:68;69718:7;69727:5;69734:7;69743:9;69754:6;69762:2;69697:20;:68::i;:::-;69690:75;;;;;;;;;;68911:860;;;;;;;;;;:::o;68056:849::-;68264:43;;-1:-1:-1;;;68264:43:0;;68301:4;68264:43;;;16665:74:1;68222:7:0;;;;;;-1:-1:-1;;;;;68264:11:0;:28;;;;16638:18:1;;68264:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68256:52;;;;;;68331:26;;-1:-1:-1;;;68331:26:0;;;;;30727:25:1;;;68315:13:0;;68331:11;-1:-1:-1;;;;;68331:17:0;;;;30700:18:1;;68331:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68315:42;;68415:20;68449:5;-1:-1:-1;;;;;68438:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68494:10;;68415:55;;-1:-1:-1;68477:14:0;68511:148;68531:6;68527:1;:10;68511:148;;;68553:47;68572:12;68586:3;68590:1;68586:6;;;;;;-1:-1:-1;;;68586:6:0;;;;;;;;;;;;;;;68594:5;68553:18;:47::i;:::-;68609:42;68623:12;68637:5;68644:3;68648:1;68644:6;;;;;;-1:-1:-1;;;68644:6:0;;;;;;;;;;;;;;;68609:13;:42::i;:::-;68539:3;;;;:::i;:::-;;;;68511:148;;;-1:-1:-1;68697:37:0;;-1:-1:-1;;;68697:37:0;;68665:25;;-1:-1:-1;;;;;68697:22:0;;;;;:37;;68720:3;;68665:25;;68697:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;68741:15:0;68759:13;61056:4;68759:6;:13;:::i;:::-;68741:31;;68831:68;68852:7;68861:5;68868:7;68877:9;68888:6;68896:2;68831:20;:68::i;:::-;68824:75;;;;;;;;;;;68056:849;;;;;;;;;:::o;60376:173::-;60432:16;60451:6;;-1:-1:-1;;;;;60468:17:0;;;-1:-1:-1;;60468:17:0;;;;;;60501:40;;60451:6;;;;;;;60501:40;;60432:16;60501:40;60376:173;;:::o;52215:188::-;52336:58;;-1:-1:-1;;;;;20655:55:1;;52336:58:0;;;20637:74:1;20727:18;;;20720:34;;;52309:86:0;;52329:5;;-1:-1:-1;;;52359:23:0;20610:18:1;;52336:58:0;20592:168:1;72690:1303:0;72808:42;72873;72922:17;-1:-1:-1;;;;;72950:20:0;;;;72946:921;;;73017:89;;73082:10;73017:89;;;19239:34:1;-1:-1:-1;;;;;19309:15:1;;19289:18;;;19282:43;19341:18;;;19334:34;;;19151:18;;73017:89:0;;;-1:-1:-1;;73017:89:0;;;;;;;;;;;;;;-1:-1:-1;;;;;73017:89:0;-1:-1:-1;;;73017:89:0;;;;-1:-1:-1;72946:921:0;;;73137:5;-1:-1:-1;;;;;73124:18:0;:9;-1:-1:-1;;;;;73124:18:0;;73120:747;;;73239:31;73328:7;73273:63;;;;;;30727:25:1;;30715:2;30700:18;;30682:76;73273:63:0;;;;-1:-1:-1;;73273:63:0;;;;;;;;;;;;;;-1:-1:-1;;;;;73273:63:0;;;;;73390:49;73273:63;;-1:-1:-1;;;;;;;;;;73390:29:0;;;:49;;73273:63;;73390:49;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73347:92;;;;73451:16;73482:6;73471:29;;;;;;;;;;;;:::i;:::-;73450:50;;73519:12;:38;;;;-1:-1:-1;;;;;;73535:22:0;;73547:10;73535:22;73519:38;73511:68;;;;-1:-1:-1;;;73511:68:0;;30437:2:1;73511:68:0;;;30419:21:1;30476:2;30456:18;;;30449:30;30515:19;30495:18;;;30488:47;30552:18;;73511:68:0;30409:167:1;73511:68:0;73597:52;;;;;30727:25:1;;;30700:18;;73597:52:0;;;-1:-1:-1;;73597:52:0;;;;;;;;;;;;;;-1:-1:-1;;;;;73597:52:0;;;;;;-1:-1:-1;73120:747:0;;-1:-1:-1;;;;73120:747:0;;73766:93;;73835:10;73766:93;;;19239:34:1;-1:-1:-1;;;;;19309:15:1;;19289:18;;;19282:43;19341:18;;;19334:34;;;19151:18;;73766:93:0;;;-1:-1:-1;;73766:93:0;;;;;;;;;;;;;;-1:-1:-1;;;;;73766:93:0;;;;;;-1:-1:-1;73120:747:0;73874:12;73888:23;73923:9;-1:-1:-1;;;;;73915:23:0;73939:4;73915:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73873:71;;;;73959:7;73975:10;73951:36;;;;;-1:-1:-1;;;73951:36:0;;;;;;;;:::i;:::-;;72690:1303;;;;;;;;:::o;73999:849::-;74112:42;74177;74226:17;-1:-1:-1;;;;;74254:20:0;;;;74250:472;;;74453:7;;;73999:849;;;:::o;74250:472::-;74490:5;-1:-1:-1;;;;;74477:18:0;:9;-1:-1:-1;;;;;74477:18:0;;74473:249;;;74540:93;;;;;31416:25:1;;;74627:1:0;31457:18:1;;;31450:45;-1:-1:-1;;;;;31531:55:1;;31511:18;;;31504:83;31389:18;;74540:93:0;;;-1:-1:-1;;74540:93:0;;;;;;;;;;;;;;-1:-1:-1;;;;;74540:93:0;;;;;;-1:-1:-1;74473:249:0;;;74708:7;;;73999:849;;;:::o;54704:772::-;55139:23;55165:69;55193:4;55165:69;;;;;;;;;;;;;;;;;55173:5;-1:-1:-1;;;;;55165:27:0;;;:69;;;;;:::i;:::-;55249:17;;55139:95;;-1:-1:-1;55249:21:0;55245:224;;55391:10;55380:30;;;;;;;;;;;;:::i;:::-;55372:85;;;;-1:-1:-1;;;55372:85:0;;29243:2:1;55372:85:0;;;29225:21:1;29282:2;29262:18;;;29255:30;29321:34;29301:18;;;29294:62;29392:12;29372:18;;;29365:40;29422:19;;55372:85:0;29215:232:1;48294:530:0;48421:12;48479:5;48454:21;:30;;48446:81;;;;-1:-1:-1;;;48446:81:0;;26735:2:1;48446:81:0;;;26717:21:1;26774:2;26754:18;;;26747:30;26813:34;26793:18;;;26786:62;26884:8;26864:18;;;26857:36;26910:19;;48446:81:0;26707:228:1;48446:81:0;44691:20;;48538:60;;;;-1:-1:-1;;;48538:60:0;;27845:2:1;48538:60:0;;;27827:21:1;27884:2;27864:18;;;27857:30;27923:31;27903:18;;;27896:59;27972:18;;48538:60:0;27817:179:1;48538:60:0;48672:12;48686:23;48713:6;-1:-1:-1;;;;;48713:11:0;48733:5;48741:4;48713:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48671:75;;;;48764:52;48782:7;48791:10;48803:12;48764:17;:52::i;69777:1155::-;69963:7;;;70024:70;-1:-1:-1;;;;;70024:36:0;;70069:11;70083:10;70024:36;:70::i;:::-;70163:193;;;;;-1:-1:-1;;;;;19801:15:1;;;70163:193:0;;;19783:34:1;70227:4:0;19853:15:1;;19833:18;;;19826:43;19885:18;;;19878:34;;;19928:18;;;19921:34;;;19971:19;;;19964:35;;;20015:19;;;20008:35;;;70320:4:0;20059:19:1;;;20052:44;70334:15:0;20112:19:1;;;20105:35;-1:-1:-1;;;;;;70163:11:0;:24;;;;;;19694:19:1;;70163:193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70101:255;;;;;;70403:15;70421:29;70429:5;70444:4;70421:7;:29::i;:::-;70504:9;;70403:47;;-1:-1:-1;70457:69:0;;-1:-1:-1;;;;;70457:38:0;;;;70504:9;70516;70457:38;:69::i;:::-;70533:9;;;;;;;;;-1:-1:-1;;;;;70533:9:0;-1:-1:-1;;;;;70533:28:0;;70562:7;70571:2;70575:9;70586:10;;70533:64;;;;;;;;;;;;;;;;;30994:25:1;;;-1:-1:-1;;;;;31055:55:1;;;;31050:2;31035:18;;31028:83;31142:2;31127:18;;31120:34;31185:2;31170:18;;31163:34;30981:3;30966:19;;30948:255;70533:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70610:17;70641:11;70630:10;:22;;;;:::i;:::-;70610:42;-1:-1:-1;70663:14:0;;70659:89;;70688:52;-1:-1:-1;;;;;70688:37:0;;70726:2;70730:9;70688:37;:52::i;:::-;70756:19;70796:10;;70778:15;:28;;;;:::i;:::-;70756:50;;70818:59;70829:7;70838:10;70850:9;70861:11;70874:2;70818:59;;;;;;;;;32302:25:1;;;32358:2;32343:18;;32336:34;;;;32401:2;32386:18;;32379:34;;;;32444:2;32429:18;;32422:34;-1:-1:-1;;;;;32493:55:1;32487:3;32472:19;;32465:84;32289:3;32274:19;;32256:299;70818:59:0;;;;;;;;-1:-1:-1;70892:11:0;;70905:9;;-1:-1:-1;70916:9:0;;-1:-1:-1;69777:1155:0;;-1:-1:-1;;;;;;;;;69777:1155:0:o;50834:742::-;50949:12;50978:7;50974:595;;;-1:-1:-1;51009:10:0;51002:17;;50974:595;51123:17;;:21;51119:439;;51386:10;51380:17;51447:15;51434:10;51430:2;51426:19;51419:44;51334:148;51529:12;51522:20;;-1:-1:-1;;;51522:20:0;;;;;;;;:::i;74936:429::-;75008:12;75030:14;75046;75064:26;75075:6;75083;75064:10;:26::i;:::-;75029:61;;;;75179:11;-1:-1:-1;;;;;75179:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75219:32;;-1:-1:-1;;15225:2:1;15221:15;;;15217:24;;75219:32:0;;;15205:37:1;15276:15;;;15272:24;15258:12;;;15251:46;15313:12;;75219:32:0;;;;;;;;;;;;75209:43;;;;;;75138:217;;;;;;;;15986:66:1;15974:79;;16090:2;16086:15;;;;-1:-1:-1;;16082:53:1;16078:1;16069:11;;16062:74;16161:2;16152:12;;16145:28;16203:66;16198:2;16189:12;;16182:88;16295:2;16286:12;;15964:340;75138:217:0;;;;-1:-1:-1;;75138:217:0;;;;;;;;;75128:228;;75138:217;75128:228;;;;;74936:429;-1:-1:-1;;;;;74936:429:0:o;75470:341::-;75545:14;75561;75604:6;-1:-1:-1;;;;;75594:16:0;:6;-1:-1:-1;;;;;75594:16:0;;;75586:66;;;;-1:-1:-1;;;75586:66:0;;25902:2:1;75586:66:0;;;25884:21:1;25941:2;25921:18;;;25914:30;25980:34;25960:18;;;25953:62;26051:7;26031:18;;;26024:35;26076:19;;75586:66:0;25874:227:1;75586:66:0;75689:6;-1:-1:-1;;;;;75680:15:0;:6;-1:-1:-1;;;;;75680:15:0;;:53;;75718:6;75726;75680:53;;;75699:6;75707;75680:53;75661:72;;-1:-1:-1;75661:72:0;-1:-1:-1;;;;;;75750:20:0;;75742:63;;;;-1:-1:-1;;;75742:63:0;;28884:2:1;75742:63:0;;;28866:21:1;28923:2;28903:18;;;28896:30;28962:32;28942:18;;;28935:60;29012:18;;75742:63:0;28856:180:1;75742:63:0;75470:341;;;;;:::o;14:395:1:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;239:18;228:30;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;382:3;375:4;365:6;362:1;358:14;350:6;346:27;342:38;339:47;336:2;;;399:1;396;389:12;414:743;468:5;521:3;514:4;506:6;502:17;498:27;488:2;;543:5;536;529:20;488:2;583:6;570:20;609:4;632:18;628:2;625:26;622:2;;;654:18;;:::i;:::-;700:2;697:1;693:10;723:28;747:2;743;739:11;723:28;:::i;:::-;785:15;;;816:12;;;;848:15;;;882;;;878:24;;875:33;-1:-1:-1;872:2:1;;;925:5;918;911:20;872:2;951:5;942:14;;965:163;979:2;976:1;973:9;965:163;;;1036:17;;1024:30;;997:1;990:9;;;;;1074:12;;;;1106;;965:163;;;-1:-1:-1;1146:5:1;478:679;-1:-1:-1;;;;;;;478:679:1:o;1162:550::-;1204:5;1257:3;1250:4;1242:6;1238:17;1234:27;1224:2;;1279:5;1272;1265:20;1224:2;1319:6;1306:20;1345:18;1341:2;1338:26;1335:2;;;1367:18;;:::i;:::-;1411:55;1454:2;1435:13;;-1:-1:-1;;1431:27:1;1460:4;1427:38;1411:55;:::i;:::-;1491:2;1482:7;1475:19;1537:3;1530:4;1525:2;1517:6;1513:15;1509:26;1506:35;1503:2;;;1558:5;1551;1544:20;1503:2;1627;1620:4;1612:6;1608:17;1601:4;1592:7;1588:18;1575:55;1650:16;;;1668:4;1646:27;1639:42;;;;1654:7;1214:498;-1:-1:-1;;1214:498:1:o;1717:257::-;1776:6;1829:2;1817:9;1808:7;1804:23;1800:32;1797:2;;;1850:6;1842;1835:22;1797:2;1894:9;1881:23;1913:31;1938:5;1913:31;:::i;1979:261::-;2049:6;2102:2;2090:9;2081:7;2077:23;2073:32;2070:2;;;2123:6;2115;2108:22;2070:2;2160:9;2154:16;2179:31;2204:5;2179:31;:::i;2519:1111::-;2673:6;2681;2689;2697;2705;2758:3;2746:9;2737:7;2733:23;2729:33;2726:2;;;2780:6;2772;2765:22;2726:2;2824:9;2811:23;2843:31;2868:5;2843:31;:::i;:::-;2893:5;-1:-1:-1;2950:2:1;2935:18;;2922:32;2963:33;2922:32;2963:33;:::i;:::-;3015:7;-1:-1:-1;3073:2:1;3058:18;;3045:32;3096:18;3126:14;;;3123:2;;;3158:6;3150;3143:22;3123:2;3186:61;3239:7;3230:6;3219:9;3215:22;3186:61;:::i;:::-;3176:71;;3300:2;3289:9;3285:18;3272:32;3256:48;;3329:2;3319:8;3316:16;3313:2;;;3350:6;3342;3335:22;3313:2;3378:63;3433:7;3422:8;3411:9;3407:24;3378:63;:::i;:::-;3368:73;;3494:3;3483:9;3479:19;3466:33;3450:49;;3524:2;3514:8;3511:16;3508:2;;;3545:6;3537;3530:22;3508:2;;3573:51;3616:7;3605:8;3594:9;3590:24;3573:51;:::i;:::-;3563:61;;;2716:914;;;;;;;;:::o;3635:685::-;3730:6;3738;3746;3754;3807:3;3795:9;3786:7;3782:23;3778:33;3775:2;;;3829:6;3821;3814:22;3775:2;3873:9;3860:23;3892:31;3917:5;3892:31;:::i;:::-;3942:5;-1:-1:-1;3999:2:1;3984:18;;3971:32;4012:33;3971:32;4012:33;:::i;:::-;4064:7;-1:-1:-1;4118:2:1;4103:18;;4090:32;;-1:-1:-1;4173:2:1;4158:18;;4145:32;4200:18;4189:30;;4186:2;;;4237:6;4229;4222:22;4186:2;4265:49;4306:7;4297:6;4286:9;4282:22;4265:49;:::i;:::-;4255:59;;;3765:555;;;;;;;:::o;4325:754::-;4429:6;4437;4445;4453;4461;4514:3;4502:9;4493:7;4489:23;4485:33;4482:2;;;4536:6;4528;4521:22;4482:2;4580:9;4567:23;4599:31;4624:5;4599:31;:::i;:::-;4649:5;-1:-1:-1;4706:2:1;4691:18;;4678:32;4719:33;4678:32;4719:33;:::i;:::-;4771:7;-1:-1:-1;4825:2:1;4810:18;;4797:32;;-1:-1:-1;4876:2:1;4861:18;;4848:32;;-1:-1:-1;4931:3:1;4916:19;;4903:33;4959:18;4948:30;;4945:2;;;4996:6;4988;4981:22;4945:2;5024:49;5065:7;5056:6;5045:9;5041:22;5024:49;:::i;5084:297::-;5151:6;5204:2;5192:9;5183:7;5179:23;5175:32;5172:2;;;5225:6;5217;5210:22;5172:2;5262:9;5256:16;5315:5;5308:13;5301:21;5294:5;5291:32;5281:2;;5342:6;5334;5327:22;5386:352;5444:6;5497:2;5485:9;5476:7;5472:23;5468:32;5465:2;;;5518:6;5510;5503:22;5465:2;5562:9;5549:23;-1:-1:-1;;;;;;5605:5:1;5601:78;5594:5;5591:89;5581:2;;5699:6;5691;5684:22;5743:190;5802:6;5855:2;5843:9;5834:7;5830:23;5826:32;5823:2;;;5876:6;5868;5861:22;5823:2;-1:-1:-1;5904:23:1;;5813:120;-1:-1:-1;5813:120:1:o;5938:194::-;6008:6;6061:2;6049:9;6040:7;6036:23;6032:32;6029:2;;;6082:6;6074;6067:22;6029:2;-1:-1:-1;6110:16:1;;6019:113;-1:-1:-1;6019:113:1:o;6137:525::-;6232:6;6240;6248;6301:2;6289:9;6280:7;6276:23;6272:32;6269:2;;;6322:6;6314;6307:22;6269:2;6363:9;6350:23;6340:33;;6424:2;6413:9;6409:18;6396:32;6451:18;6443:6;6440:30;6437:2;;;6488:6;6480;6473:22;6437:2;6532:70;6594:7;6585:6;6574:9;6570:22;6532:70;:::i;:::-;6259:403;;6621:8;;-1:-1:-1;6506:96:1;;-1:-1:-1;;;;6259:403:1:o;6667:871::-;6798:6;6806;6814;6822;6830;6883:2;6871:9;6862:7;6858:23;6854:32;6851:2;;;6904:6;6896;6889:22;6851:2;6945:9;6932:23;6922:33;;7006:2;6995:9;6991:18;6978:32;7029:18;7070:2;7062:6;7059:14;7056:2;;;7091:6;7083;7076:22;7056:2;7135:70;7197:7;7188:6;7177:9;7173:22;7135:70;:::i;:::-;7224:8;;-1:-1:-1;7109:96:1;-1:-1:-1;7312:2:1;7297:18;;7284:32;;-1:-1:-1;7328:16:1;;;7325:2;;;7362:6;7354;7347:22;7325:2;;7406:72;7470:7;7459:8;7448:9;7444:24;7406:72;:::i;:::-;6841:697;;;;-1:-1:-1;6841:697:1;;-1:-1:-1;7497:8:1;;7380:98;6841:697;-1:-1:-1;;;6841:697:1:o;7543:940::-;7683:6;7691;7699;7707;7715;7723;7776:3;7764:9;7755:7;7751:23;7747:33;7744:2;;;7798:6;7790;7783:22;7744:2;7839:9;7826:23;7816:33;;7900:2;7889:9;7885:18;7872:32;7923:18;7964:2;7956:6;7953:14;7950:2;;;7985:6;7977;7970:22;7950:2;8029:70;8091:7;8082:6;8071:9;8067:22;8029:70;:::i;:::-;8118:8;;-1:-1:-1;8003:96:1;-1:-1:-1;8206:2:1;8191:18;;8178:32;;-1:-1:-1;8222:16:1;;;8219:2;;;8256:6;8248;8241:22;8219:2;;8300:72;8364:7;8353:8;8342:9;8338:24;8300:72;:::i;:::-;7734:749;;;;-1:-1:-1;7734:749:1;;;;;8473:2;8458:18;;;8445:32;;7734:749;-1:-1:-1;;;;7734:749:1:o;8488:593::-;8592:6;8600;8608;8616;8669:2;8657:9;8648:7;8644:23;8640:32;8637:2;;;8690:6;8682;8675:22;8637:2;8731:9;8718:23;8708:33;;8792:2;8781:9;8777:18;8764:32;8819:18;8811:6;8808:30;8805:2;;;8856:6;8848;8841:22;8805:2;8900:70;8962:7;8953:6;8942:9;8938:22;8900:70;:::i;:::-;8627:454;;8989:8;;-1:-1:-1;8874:96:1;;9071:2;9056:18;9043:32;;8627:454;-1:-1:-1;;;;8627:454:1:o;9086:662::-;9199:6;9207;9215;9223;9231;9284:3;9272:9;9263:7;9259:23;9255:33;9252:2;;;9306:6;9298;9291:22;9252:2;9347:9;9334:23;9324:33;;9408:2;9397:9;9393:18;9380:32;9435:18;9427:6;9424:30;9421:2;;;9472:6;9464;9457:22;9421:2;9516:70;9578:7;9569:6;9558:9;9554:22;9516:70;:::i;:::-;9242:506;;9605:8;;-1:-1:-1;9490:96:1;;9687:2;9672:18;;9659:32;;9738:2;9723:18;;;9710:32;;-1:-1:-1;9242:506:1;-1:-1:-1;;;;9242:506:1:o;9753:898::-;9898:6;9906;9914;9922;9930;9983:3;9971:9;9962:7;9958:23;9954:33;9951:2;;;10005:6;9997;9990:22;9951:2;10046:9;10033:23;10023:33;;10107:2;10096:9;10092:18;10079:32;10130:18;10171:2;10163:6;10160:14;10157:2;;;10192:6;10184;10177:22;10157:2;10220:61;10273:7;10264:6;10253:9;10249:22;10220:61;:::i;:::-;10210:71;;10334:2;10323:9;10319:18;10306:32;10290:48;;10363:2;10353:8;10350:16;10347:2;;;10384:6;10376;10369:22;10347:2;;10412:63;10467:7;10456:8;10445:9;10441:24;10412:63;:::i;:::-;10402:73;;;10522:2;10511:9;10507:18;10494:32;10484:42;;10576:3;10565:9;10561:19;10548:33;10590:31;10615:5;10590:31;:::i;:::-;10640:5;10630:15;;;9941:710;;;;;;;;:::o;10656:831::-;10801:6;10809;10817;10825;10833;10886:3;10874:9;10865:7;10861:23;10857:33;10854:2;;;10908:6;10900;10893:22;10854:2;10949:9;10936:23;10926:33;;11010:2;10999:9;10995:18;10982:32;11033:18;11074:2;11066:6;11063:14;11060:2;;;11095:6;11087;11080:22;11060:2;11123:61;11176:7;11167:6;11156:9;11152:22;11123:61;:::i;:::-;11113:71;;11237:2;11226:9;11222:18;11209:32;11193:48;;11266:2;11256:8;11253:16;11250:2;;;11287:6;11279;11272:22;11250:2;;11315:63;11370:7;11359:8;11348:9;11344:24;11315:63;:::i;:::-;10844:643;;;;-1:-1:-1;11305:73:1;;11425:2;11410:18;;11397:32;;-1:-1:-1;11476:3:1;11461:19;11448:33;;10844:643;-1:-1:-1;;;10844:643:1:o;11492:967::-;11646:6;11654;11662;11670;11678;11686;11739:3;11727:9;11718:7;11714:23;11710:33;11707:2;;;11761:6;11753;11746:22;11707:2;11802:9;11789:23;11779:33;;11863:2;11852:9;11848:18;11835:32;11886:18;11927:2;11919:6;11916:14;11913:2;;;11948:6;11940;11933:22;11913:2;11976:61;12029:7;12020:6;12009:9;12005:22;11976:61;:::i;:::-;11966:71;;12090:2;12079:9;12075:18;12062:32;12046:48;;12119:2;12109:8;12106:16;12103:2;;;12140:6;12132;12125:22;12103:2;;12168:63;12223:7;12212:8;12201:9;12197:24;12168:63;:::i;:::-;12158:73;;;12278:2;12267:9;12263:18;12250:32;12240:42;;12329:3;12318:9;12314:19;12301:33;12291:43;;12384:3;12373:9;12369:19;12356:33;12398:31;12423:5;12398:31;:::i;:::-;12448:5;12438:15;;;11697:762;;;;;;;;:::o;12464:640::-;12575:6;12583;12591;12599;12652:3;12640:9;12631:7;12627:23;12623:33;12620:2;;;12674:6;12666;12659:22;12620:2;12715:9;12702:23;12692:33;;12776:2;12765:9;12761:18;12748:32;12803:18;12795:6;12792:30;12789:2;;;12840:6;12832;12825:22;12789:2;12868:61;12921:7;12912:6;12901:9;12897:22;12868:61;:::i;:::-;12858:71;;;12976:2;12965:9;12961:18;12948:32;12938:42;;13030:2;13019:9;13015:18;13002:32;13043:31;13068:5;13043:31;:::i;:::-;12610:494;;;;-1:-1:-1;12610:494:1;;-1:-1:-1;;12610:494:1:o;13109:709::-;13229:6;13237;13245;13253;13261;13314:3;13302:9;13293:7;13289:23;13285:33;13282:2;;;13336:6;13328;13321:22;13282:2;13377:9;13364:23;13354:33;;13438:2;13427:9;13423:18;13410:32;13465:18;13457:6;13454:30;13451:2;;;13502:6;13494;13487:22;13451:2;13530:61;13583:7;13574:6;13563:9;13559:22;13530:61;:::i;:::-;13520:71;;;13638:2;13627:9;13623:18;13610:32;13600:42;;13689:2;13678:9;13674:18;13661:32;13651:42;;13743:3;13732:9;13728:19;13715:33;13757:31;13782:5;13757:31;:::i;13823:316::-;13911:6;13919;13927;13980:2;13968:9;13959:7;13955:23;13951:32;13948:2;;;14001:6;13993;13986:22;13948:2;14035:9;14029:16;14019:26;;14085:2;14074:9;14070:18;14064:25;14054:35;;14129:2;14118:9;14114:18;14108:25;14098:35;;13938:201;;;;;:::o;14144:407::-;14244:6;14239:3;14232:19;14214:3;14274:66;14266:6;14263:78;14260:2;;;14356:3;14351;14344:16;14260:2;14394:6;14391:1;14387:14;14446:8;14439:5;14432:4;14427:3;14423:14;14410:45;14478:18;;;;14498:4;14474:29;14512:15;;;-1:-1:-1;14474:29:1;;14222:329;-1:-1:-1;14222:329:1:o;14556:437::-;14609:3;14647:5;14641:12;14674:6;14669:3;14662:19;14700:4;14729:2;14724:3;14720:12;14713:19;;14766:2;14759:5;14755:14;14787:3;14799:169;14813:6;14810:1;14807:13;14799:169;;;14874:13;;14862:26;;14908:12;;;;14943:15;;;;14835:1;14828:9;14799:169;;;-1:-1:-1;14984:3:1;;14617:376;-1:-1:-1;;;;;14617:376:1:o;15336:274::-;15465:3;15503:6;15497:13;15519:53;15565:6;15560:3;15553:4;15545:6;15541:17;15519:53;:::i;:::-;15588:16;;;;;15473:137;-1:-1:-1;;15473:137:1:o;17082:969::-;17478:4;-1:-1:-1;;;;;17588:2:1;17580:6;17576:15;17565:9;17558:34;17640:2;17632:6;17628:15;17623:2;17612:9;17608:18;17601:43;;17680:3;17675:2;17664:9;17660:18;17653:31;17707:74;17776:3;17765:9;17761:19;17753:6;17745;17707:74;:::i;:::-;17829:9;17821:6;17817:22;17812:2;17801:9;17797:18;17790:50;17863:61;17917:6;17909;17901;17863:61;:::i;:::-;17961:22;;;17955:3;17940:19;;;17933:51;;;;-1:-1:-1;17993:20:1;;18042:2;18030:15;;17487:564;-1:-1:-1;;;;;;17487:564:1:o;18056:915::-;18432:4;-1:-1:-1;;;;;18542:2:1;18534:6;18530:15;18519:9;18512:34;18594:2;18586:6;18582:15;18577:2;18566:9;18562:18;18555:43;;18634:3;18629:2;18618:9;18614:18;18607:31;18661:57;18713:3;18702:9;18698:19;18690:6;18661:57;:::i;:::-;18766:9;18758:6;18754:22;18749:2;18738:9;18734:18;18727:50;18800:44;18837:6;18829;18800:44;:::i;:::-;18881:22;;;18875:3;18860:19;;;18853:51;;;;-1:-1:-1;18913:20:1;;18962:2;18950:15;;18441:530;-1:-1:-1;;;;18441:530:1:o;20765:639::-;21070:2;21059:9;21052:21;21033:4;21096:73;21165:2;21154:9;21150:18;21142:6;21134;21096:73;:::i;:::-;21217:9;21209:6;21205:22;21200:2;21189:9;21185:18;21178:50;21245:61;21299:6;21291;21283;21245:61;:::i;:::-;21237:69;;;-1:-1:-1;;;;;21346:6:1;21342:55;21337:2;21326:9;21322:18;21315:83;21042:362;;;;;;;;:::o;21409:612::-;21704:2;21693:9;21686:21;21667:4;21730:73;21799:2;21788:9;21784:18;21776:6;21768;21730:73;:::i;:::-;21851:9;21843:6;21839:22;21834:2;21823:9;21819:18;21812:50;21879:44;21916:6;21908;21879:44;:::i;:::-;21871:52;;;-1:-1:-1;;;;;21963:6:1;21959:55;21954:2;21943:9;21939:18;21932:83;21676:345;;;;;;;:::o;22026:465::-;22283:2;22272:9;22265:21;22246:4;22309:56;22361:2;22350:9;22346:18;22338:6;22309:56;:::i;:::-;22413:9;22405:6;22401:22;22396:2;22385:9;22381:18;22374:50;22441:44;22478:6;22470;22441:44;:::i;24215:383::-;24364:2;24353:9;24346:21;24327:4;24396:6;24390:13;24439:6;24434:2;24423:9;24419:18;24412:34;24455:66;24514:6;24509:2;24498:9;24494:18;24489:2;24481:6;24477:15;24455:66;:::i;:::-;24582:2;24561:15;-1:-1:-1;;24557:29:1;24542:45;;;;24589:2;24538:54;;24336:262;-1:-1:-1;;24336:262:1:o;32560:275::-;32631:2;32625:9;32696:2;32677:13;;-1:-1:-1;;32673:27:1;32661:40;;32731:18;32716:34;;32752:22;;;32713:62;32710:2;;;32778:18;;:::i;:::-;32814:2;32807:22;32605:230;;-1:-1:-1;32605:230:1:o;32840:128::-;32880:3;32911:1;32907:6;32904:1;32901:13;32898:2;;;32917:18;;:::i;:::-;-1:-1:-1;32953:9:1;;32888:80::o;32973:168::-;33013:7;33079:1;33075;33071:6;33067:14;33064:1;33061:21;33056:1;33049:9;33042:17;33038:45;33035:2;;;33086:18;;:::i;:::-;-1:-1:-1;33126:9:1;;33025:116::o;33146:125::-;33186:4;33214:1;33211;33208:8;33205:2;;;33219:18;;:::i;:::-;-1:-1:-1;33256:9:1;;33195:76::o;33276:258::-;33348:1;33358:113;33372:6;33369:1;33366:13;33358:113;;;33448:11;;;33442:18;33429:11;;;33422:39;33394:2;33387:10;33358:113;;;33489:6;33486:1;33483:13;33480:2;;;-1:-1:-1;;33524:1:1;33506:16;;33499:27;33329:205::o;33539:135::-;33578:3;-1:-1:-1;;33599:17:1;;33596:2;;;33619:18;;:::i;:::-;-1:-1:-1;33666:1:1;33655:13;;33586:88::o;33679:184::-;-1:-1:-1;;;33728:1:1;33721:88;33828:4;33825:1;33818:15;33852:4;33849:1;33842:15;33868:184;-1:-1:-1;;;33917:1:1;33910:88;34017:4;34014:1;34007:15;34041:4;34038:1;34031:15;34057:154;-1:-1:-1;;;;;34136:5:1;34132:54;34125:5;34122:65;34112:2;;34201:1;34198;34191:12
Swarm Source
ipfs://737625016b049392f34f38c384c9ea5d91ba4c9e0a93c53320cbec21466354bf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.