Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,450 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Liquidity721... | 14041233 | 1100 days ago | IN | 2.86700859 ETH | 0.21439267 | ||||
Add Liquidity721... | 14041174 | 1100 days ago | IN | 0.09974552 ETH | 0.04601751 | ||||
Add Liquidity721... | 14039675 | 1101 days ago | IN | 0.09897393 ETH | 0.05188157 | ||||
Add Liquidity721... | 14039553 | 1101 days ago | IN | 0.09897393 ETH | 0.02813771 | ||||
Add Liquidity721... | 14039549 | 1101 days ago | IN | 1.97947862 ETH | 0.15459981 | ||||
Add Liquidity115... | 14038890 | 1101 days ago | IN | 0.04242838 ETH | 0.06986518 | ||||
Add Liquidity721... | 14038490 | 1101 days ago | IN | 1.33023395 ETH | 0.07379814 | ||||
Add Liquidity721... | 14037164 | 1101 days ago | IN | 1.33023395 ETH | 0.05868587 | ||||
Add Liquidity721... | 14035389 | 1101 days ago | IN | 4.19683519 ETH | 0.07554549 | ||||
Add Liquidity115... | 14032425 | 1102 days ago | IN | 0.0409961 ETH | 0.06581493 | ||||
Add Liquidity721... | 14030574 | 1102 days ago | IN | 0.06 ETH | 0.33422835 | ||||
Add Liquidity721... | 14027100 | 1103 days ago | IN | 10.51827581 ETH | 0.1677005 | ||||
Add Liquidity721... | 14026637 | 1103 days ago | IN | 6.1 ETH | 0.14951164 | ||||
Add Liquidity721... | 14026622 | 1103 days ago | IN | 10.98 ETH | 0.2390312 | ||||
Add Liquidity721... | 14026514 | 1103 days ago | IN | 1.22 ETH | 0.34750125 | ||||
Add Liquidity721... | 14022972 | 1103 days ago | IN | 0.05285237 ETH | 0.04994979 | ||||
Add Liquidity721... | 14022269 | 1103 days ago | IN | 0.0147818 ETH | 0.00366154 | ||||
Add Liquidity721... | 14022265 | 1103 days ago | IN | 0.0147818 ETH | 0.00331352 | ||||
Add Liquidity721... | 14020931 | 1103 days ago | IN | 0.19853289 ETH | 0.09133021 | ||||
Add Liquidity721... | 14017379 | 1104 days ago | IN | 0.14 ETH | 0.42390263 | ||||
Add Liquidity721... | 14017030 | 1104 days ago | IN | 0.11705622 ETH | 0.05284946 | ||||
Add Liquidity721... | 14016516 | 1104 days ago | IN | 0.08118937 ETH | 0.03849119 | ||||
Add Liquidity721... | 14015533 | 1104 days ago | IN | 0.03 ETH | 0.22125538 | ||||
Add Liquidity721... | 14012961 | 1105 days ago | IN | 1.2 ETH | 0.55252656 | ||||
Add Liquidity721... | 14011666 | 1105 days ago | IN | 4.77443826 ETH | 0.52183679 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
14041233 | 1100 days ago | 2.86700859 ETH | ||||
14041174 | 1100 days ago | 0.09974552 ETH | ||||
14039675 | 1101 days ago | 0.09897393 ETH | ||||
14039553 | 1101 days ago | 0.09897393 ETH | ||||
14039549 | 1101 days ago | 1.97947862 ETH | ||||
14038890 | 1101 days ago | 0.04242838 ETH | ||||
14038490 | 1101 days ago | 1.33023395 ETH | ||||
14037164 | 1101 days ago | 1.33023395 ETH | ||||
14035389 | 1101 days ago | 4.19683519 ETH | ||||
14032425 | 1102 days ago | 0.0409961 ETH | ||||
14030574 | 1102 days ago | 0.06 ETH | ||||
14027100 | 1103 days ago | 10.51827581 ETH | ||||
14026637 | 1103 days ago | 6.1 ETH | ||||
14026622 | 1103 days ago | 10.98 ETH | ||||
14026514 | 1103 days ago | 1.22 ETH | ||||
14022972 | 1103 days ago | 0.05285237 ETH | ||||
14020931 | 1103 days ago | 0.19853289 ETH | ||||
14017379 | 1104 days ago | 0.14 ETH | ||||
14017030 | 1104 days ago | 0.11705622 ETH | ||||
14016516 | 1104 days ago | 0.08118937 ETH | ||||
14015533 | 1104 days ago | 0.03 ETH | ||||
14012961 | 1105 days ago | 1.2 ETH | ||||
14011666 | 1105 days ago | 4.77443826 ETH | ||||
14011649 | 1105 days ago | 5.15639333 ETH | ||||
14011385 | 1105 days ago | 6.65 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 2021-08-11 */ // Sources flattened with hardhat v2.4.3 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/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 vaultsForAsset(address asset) external view returns (address[] memory); function isLocked(uint256 id) external view returns (bool); function excludedFromFees(address addr) external view returns (bool); 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); // 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; } // File contracts/solidity/interface/INFTXVault.sol pragma solidity ^0.8.0; interface INFTXVault { function manager() external returns (address); function assetAddress() external returns (address); function vaultFactory() external returns (INFTXVaultFactory); function eligibilityStorage() external returns (INFTXEligibility); function is1155() external returns (bool); function allowAllItems() external returns (bool); function enableMint() external returns (bool); function enableRandomRedeem() external returns (bool); function enableTargetRedeem() external returns (bool); function vaultId() external 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 returns (uint256); function randomRedeemFee() external returns (uint256); function targetRedeemFee() external returns (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 MintFeeUpdated(uint256 mintFee); event RandomRedeemFeeUpdated(uint256 randomRedeemFee); event TargetRedeemFeeUpdated(uint256 targetRedeemFee); 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 ) external; function setFees( uint256 _mintFee, uint256 _randomRedeemFee, uint256 _targetRedeemFee ) 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/INFTXFeeDistributor.sol pragma solidity ^0.8.0; interface INFTXFeeDistributor { struct FeeReceiver { uint256 allocPoint; address receiver; bool isContract; } function nftxVaultFactory() external returns (address); function lpStaking() external returns (address); function treasury() external returns (address); function defaultTreasuryAlloc() external returns (uint256); function defaultLPAlloc() external returns (uint256); function allocTotal(uint256 vaultId) external returns (uint256); function specificTreasuryAlloc(uint256 vaultId) external returns (uint256); // Write functions. function __FeeDistributor__init__(address _lpStaking, address _treasury) external; function rescueTokens(address token) external; function distribute(uint256 vaultId) external; function addReceiver(uint256 _vaultId, uint256 _allocPoint, address _receiver, bool _isContract) external; function initializeVaultReceivers(uint256 _vaultId) external; function changeMultipleReceiverAlloc( uint256[] memory _vaultIds, uint256[] memory _receiverIdxs, uint256[] memory allocPoints ) external; function changeMultipleReceiverAddress( uint256[] memory _vaultIds, uint256[] memory _receiverIdxs, address[] memory addresses, bool[] memory isContracts ) external; function changeReceiverAlloc(uint256 _vaultId, uint256 _idx, uint256 _allocPoint) external; function changeReceiverAddress(uint256 _vaultId, uint256 _idx, address _address, bool _isContract) external; function removeReceiver(uint256 _vaultId, uint256 _receiverIdx) external; // Configuration functions. function setTreasuryAddress(address _treasury) external; function setDefaultTreasuryAlloc(uint256 _allocPoint) external; function setSpecificTreasuryAlloc(uint256 _vaultId, uint256 _allocPoint) external; function setLPStakingAddress(address _lpStaking) external; function setNFTXVaultFactory(address _factory) external; function setDefaultLPAlloc(uint256 _allocPoint) 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 stakingToken, 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/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/interface/ITimelockRewardDistributionToken.sol pragma solidity ^0.8.0; interface ITimelockRewardDistributionToken is IERC20Upgradeable { function distributeRewards(uint amount) external; function __TimelockRewardDistributionToken_init(IERC20Upgradeable _target, string memory _name, string memory _symbol) external; function mint(address account, address to, uint256 amount) external; function timelockMint(address account, uint256 amount, uint256 timelockLength) external; function burnFrom(address account, uint256 amount) external; function withdrawReward(address user) external; function dividendOf(address _owner) external view returns(uint256); function withdrawnRewardOf(address _owner) external view returns(uint256); function accumulativeRewardOf(address _owner) external view returns(uint256); function timelockUntil(address account) external view returns (uint256); } // 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/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 { IWETH public immutable WETH; INFTXLPStaking public immutable lpStaking; INFTXVaultFactory public immutable nftxFactory; IUniswapV2Router01 public immutable sushiRouter; uint256 public lockTime = 48 hours; uint256 constant BASE = 10**18; event UserStaked(uint256 vaultId, uint256 count, uint256 lpBalance, uint256 timelockUntil, address sender); constructor(address _nftxFactory, address _sushiRouter) Ownable() ReentrancyGuard() { nftxFactory = INFTXVaultFactory(_nftxFactory); lpStaking = INFTXLPStaking(INFTXFeeDistributor(INFTXVaultFactory(_nftxFactory).feeDistributor()).lpStaking()); sushiRouter = IUniswapV2Router01(_sushiRouter); WETH = IWETH(IUniswapV2Router01(_sushiRouter).WETH()); IERC20Upgradeable(address(IUniswapV2Router01(_sushiRouter).WETH())).approve(_sushiRouter, type(uint256).max); } function setLockTime(uint256 newLockTime) external onlyOwner { require(newLockTime <= 7 days, "Lock too long"); lockTime = newLockTime; } function addLiquidity721ETH( uint256 vaultId, uint256[] memory ids, uint256 minWethIn ) public 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) { WETH.deposit{value: msg.value}(); (, uint256 amountEth, uint256 liquidity) = _addLiquidity721WETH(vaultId, ids, minWethIn, msg.value, to); // Return extras. if (amountEth < msg.value) { WETH.withdraw(msg.value-amountEth); payable(to).call{value: msg.value-amountEth}; } return liquidity; } function addLiquidity1155ETH( uint256 vaultId, uint256[] memory ids, uint256[] memory amounts, uint256 minEthIn ) public 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) { WETH.deposit{value: msg.value}(); // Finish this. (, uint256 amountEth, uint256 liquidity) = _addLiquidity1155WETH(vaultId, ids, amounts, minEthIn, msg.value, to); // Return extras. if (amountEth < msg.value) { WETH.withdraw(msg.value-amountEth); payable(to).call{value: msg.value-amountEth}; } return liquidity; } function addLiquidity721( uint256 vaultId, uint256[] memory ids, uint256 minWethIn, uint256 wethIn ) public 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) { IERC20Upgradeable(address(WETH)).transferFrom(msg.sender, address(this), wethIn); (, uint256 amountEth, uint256 liquidity) = _addLiquidity721WETH(vaultId, ids, minWethIn, wethIn, to); // Return extras. if (amountEth < wethIn) { WETH.transfer(to, wethIn-amountEth); } 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) { IERC20Upgradeable(address(WETH)).transferFrom(msg.sender, address(this), wethIn); (, uint256 amountEth, uint256 liquidity) = _addLiquidity1155WETH(vaultId, ids, amounts, minWethIn, wethIn, to); // Return extras. if (amountEth < wethIn) { WETH.transfer(to, wethIn-amountEth); } return liquidity; } function lockedUntil(uint256 vaultId, address who) external view returns (uint256) { address xLPToken = lpStaking.newRewardDistributionToken(vaultId); return ITimelockRewardDistributionToken(xLPToken).timelockUntil(who); } function lockedLPBalance(uint256 vaultId, address who) external view returns (uint256) { ITimelockRewardDistributionToken xLPToken = ITimelockRewardDistributionToken(lpStaking.newRewardDistributionToken(vaultId)); if(block.timestamp > xLPToken.timelockUntil(who)) { return 0; } return xLPToken.balanceOf(who); } function _addLiquidity721WETH( uint256 vaultId, uint256[] memory ids, uint256 minWethIn, uint256 wethIn, address to ) internal returns (uint256, uint256, uint256) { address vault = nftxFactory.vault(vaultId); require(vault != address(0), "NFTXZap: Vault does not exist"); // Transfer tokens to zap and mint to NFTX. address assetAddress = INFTXVault(vault).assetAddress(); for (uint256 i = 0; i < ids.length; i++) { transferFromERC721(assetAddress, ids[i]); approveERC721(assetAddress, vault, ids[i]); } uint256[] memory emptyIds; uint256 count = INFTXVault(vault).mint(ids, emptyIds); uint256 balance = (count * BASE); // We should not be experiencing fees. require(balance == IERC20Upgradeable(vault).balanceOf(address(this)), "Did not receive expected balance"); 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) { address vault = nftxFactory.vault(vaultId); require(vault != address(0), "NFTXZap: Vault does not exist"); // 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. require(balance == IERC20Upgradeable(vault).balanceOf(address(this)), "Did not receive expected balance"); 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).approve(address(sushiRouter), minTokenIn); (uint256 amountToken, uint256 amountEth, uint256 liquidity) = sushiRouter.addLiquidity( address(vault), sushiRouter.WETH(), minTokenIn, wethIn, minTokenIn, minWethIn, address(this), block.timestamp ); // Stake in LP rewards contract address lpToken = pairFor(vault, address(WETH)); IERC20Upgradeable(lpToken).approve(address(lpStaking), liquidity); lpStaking.timelockDepositFor(vaultId, to, liquidity, lockTime); if (amountToken < minTokenIn) { IERC20Upgradeable(vault).transfer(to, minTokenIn-amountToken); } uint256 lockEndTime = block.timestamp + lockTime; emit UserStaked(vaultId, minTokenIn, liquidity, lockEndTime, to); return (amountToken, amountEth, liquidity); } function transferFromERC721(address assetAddr, uint256 tokenId) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // Cryptokitties. data = abi.encodeWithSignature("transferFrom(address,address,uint256)", msg.sender, address(this), 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 owner) = abi.decode(result, (address)); require(checkSuccess && owner == msg.sender, "Not the owner"); data = abi.encodeWithSignature("buyPunk(uint256)", tokenId); } else { // Default. data = abi.encodeWithSignature("safeTransferFrom(address,address,uint256)", msg.sender, address(this), 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); } else if (assetAddr == punks) { // CryptoPunks. data = abi.encodeWithSignature("offerPunkForSaleToAddress(uint256,uint256,address)", tokenId, 0, to); } else { if (IERC721(assetAddr).isApprovedForAll(address(this), to)) { return; } // Default. data = abi.encodeWithSignature("setApprovalForAll(address,bool)", to, true); } (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 { } }
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":"lockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"address","name":"who","type":"address"}],"name":"lockedLPBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"address","name":"who","type":"address"}],"name":"lockedUntil","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLockTime","type":"uint256"}],"name":"setLockTime","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
6101006040526202a3006002553480156200001957600080fd5b506040516200346c3803806200346c8339810160408190526200003c916200039a565b620000473362000309565b600180556001600160601b0319606083901b1660c05260408051630d43e8ad60e01b815290516001600160a01b03841691630d43e8ad916004808301926020929190829003018186803b1580156200009e57600080fd5b505afa158015620000b3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d9919062000376565b6001600160a01b0316639bf1401c6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200011457600080fd5b505af115801562000129573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200014f919062000376565b6001600160601b0319606091821b811660a0529082901b1660e052604080516315ab88c960e31b815290516001600160a01b0383169163ad5c4648916004808301926020929190829003018186803b158015620001ab57600080fd5b505afa158015620001c0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e6919062000376565b6001600160a01b03166080816001600160a01b031660601b81525050806001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200023c57600080fd5b505afa15801562000251573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000277919062000376565b60405163095ea7b360e01b81526001600160a01b0383811660048301526000196024830152919091169063095ea7b390604401602060405180830381600087803b158015620002c557600080fd5b505af1158015620002da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003009190620003d1565b505050620003f3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200037157600080fd5b919050565b60006020828403121562000388578081fd5b620003938262000359565b9392505050565b60008060408385031215620003ad578081fd5b620003b88362000359565b9150620003c86020840162000359565b90509250929050565b600060208284031215620003e3578081fd5b8151801515811462000393578182fd5b60805160601c60a05160601c60c05160601c60e05160601c612fae620004be6000396000818161034a0152818161199101528181611a2c01528181611a5c01526124070152600081816102fe015281816111ae015261159f0152600081816103b301528181610e64015281816110fa01528181611bdd0152611cbe0152600081816103fa01528181610623015281816106d0015281816108540152818161090001528181610aa201528181610b3c01528181610d0201528181610d9b0152611ba20152612fae6000f3fe6080604052600436106101845760003560e01c8063715018a6116100d6578063bc197c811161007f578063f23a6e6111610059578063f23a6e61146104b4578063f2fde38b146104f9578063f99e74051461051957600080fd5b8063bc197c811461043c578063bdd8172b14610481578063e0e9e64d1461049457600080fd5b8063ad402dfc116100b0578063ad402dfc146103d5578063ad5c4648146103e8578063ae04d45d1461041c57600080fd5b8063715018a61461036c5780638da5cb5b146103835780639bf1401c146103a157600080fd5b80631809d2c21161013857806353b573bf1161011257806353b573bf146102d95780635ee50f88146102ec5780636d13582c1461033857600080fd5b80631809d2c2146102865780631a6907cd146102a65780634a5ff061146102b957600080fd5b80630d668087116101695780630d668087146101f357806310cde78614610209578063150b7a021461022957600080fd5b806301ffc9a71461019057806302100155146101c557600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101b06101ab366004612948565b610539565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612b46565b6105a2565b6040519081526020016101bc565b3480156101ff57600080fd5b506101e560025481565b34801561021557600080fd5b506101e5610224366004612aca565b610790565b34801561023557600080fd5b5061026d610244366004612857565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b031990911681526020016101bc565b34801561029257600080fd5b506101e56102a1366004612c86565b6107aa565b6101e56102b4366004612bd7565b6107c2565b3480156102c557600080fd5b506101e56102d4366004612cdb565b6107d8565b6101e56102e73660046129cf565b6109bf565b3480156102f857600080fd5b506103207f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bc565b34801561034457600080fd5b506103207f000000000000000000000000000000000000000000000000000000000000000081565b34801561037857600080fd5b506103816109ce565b005b34801561038f57600080fd5b506000546001600160a01b0316610320565b3480156103ad57600080fd5b506103207f000000000000000000000000000000000000000000000000000000000000000081565b6101e56103e3366004612a41565b610a43565b3480156103f457600080fd5b506103207f000000000000000000000000000000000000000000000000000000000000000081565b34801561042857600080fd5b50610381610437366004612970565b610be2565b34801561044857600080fd5b5061026d6104573660046127ad565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6101e561048f366004612c25565b610ca3565b3480156104a057600080fd5b506101e56104af3660046129a0565b610e41565b3480156104c057600080fd5b5061026d6104cf3660046128c1565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561050557600080fd5b5061038161051436600461276e565b610fe6565b34801561052557600080fd5b506101e56105343660046129a0565b6110d7565b60006001600160e01b031982167f4e2312e000000000000000000000000000000000000000000000000000000000148061059c57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6000600260015414156105fc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026001556040516323b872dd60e01b8152336004820152306024820152604481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561066f57600080fd5b505af1158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a79190612928565b506000806106b98989898989896111a6565b925092505084821015610780576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb856107008589612ed5565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561074657600080fd5b505af115801561075a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077e9190612928565b505b6001805598975050505050505050565b60006107a08686868686336105a2565b9695505050505050565b60006107b985858585336107d8565b95945050505050565b60006107d084848433610ca3565b949350505050565b60006002600154141561082d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105f3565b60026001556040516323b872dd60e01b8152336004820152306024820152604481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401602060405180830381600087803b1580156108a057600080fd5b505af11580156108b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d89190612928565b506000806108e98888888888611597565b9250925050848210156109b0576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb856109308589612ed5565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561097657600080fd5b505af115801561098a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ae9190612928565b505b60018055979650505050505050565b60006107b98585858533610a43565b336109e16000546001600160a01b031690565b6001600160a01b031614610a375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f3565b610a416000611912565b565b600060026001541415610a985760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105f3565b60026001819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610afb57600080fd5b505af1158015610b0f573d6000803e3d6000fd5b5050505050600080610b258888888834896111a6565b9250925050348210156109b0576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016632e1a7d4d610b6b8434612ed5565b6040518263ffffffff1660e01b8152600401610b8991815260200190565b600060405180830381600087803b158015610ba357600080fd5b505af1158015610bb7573d6000803e3d6000fd5b50505050836001600160a01b03168234610bd19190612ed5565b505060018055979650505050505050565b33610bf56000546001600160a01b031690565b6001600160a01b031614610c4b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f3565b62093a80811115610c9e5760405162461bcd60e51b815260206004820152600d60248201527f4c6f636b20746f6f206c6f6e670000000000000000000000000000000000000060448201526064016105f3565b600255565b600060026001541415610cf85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105f3565b60026001819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d5b57600080fd5b505af1158015610d6f573d6000803e3d6000fd5b5050505050600080610d848787873488611597565b925092505034821015610e33576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016632e1a7d4d610dca8434612ed5565b6040518263ffffffff1660e01b8152600401610de891815260200190565b600060405180830381600087803b158015610e0257600080fd5b505af1158015610e16573d6000803e3d6000fd5b50505050836001600160a01b03168234610e309190612ed5565b50505b600180559695505050505050565b60405163b7019b3760e01b81526004810183905260009081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b7019b379060240160206040518083038186803b158015610ea657600080fd5b505afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190612791565b60405163c19ea05360e01b81526001600160a01b0385811660048301529192509082169063c19ea0539060240160206040518083038186803b158015610f2357600080fd5b505afa158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b9190612988565b421115610f6c57600091505061059c565b6040516370a0823160e01b81526001600160a01b0384811660048301528216906370a08231906024015b60206040518083038186803b158015610fae57600080fd5b505afa158015610fc2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d09190612988565b33610ff96000546001600160a01b031690565b6001600160a01b03161461104f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f3565b6001600160a01b0381166110cb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105f3565b6110d481611912565b50565b60405163b7019b3760e01b81526004810183905260009081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b7019b379060240160206040518083038186803b15801561113c57600080fd5b505afa158015611150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111749190612791565b60405163c19ea05360e01b81526001600160a01b0385811660048301529192509082169063c19ea05390602401610f96565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166381a36fb68b6040518263ffffffff1660e01b81526004016111fa91815260200190565b60206040518083038186803b15801561121257600080fd5b505afa158015611226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124a9190612791565b90506001600160a01b0381166112a25760405162461bcd60e51b815260206004820152601d60248201527f4e4654585a61703a205661756c7420646f6573206e6f7420657869737400000060448201526064016105f3565b6000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156112df57600080fd5b505af11580156112f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113179190612791565b6040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690632eb2c2d69061136590339030908f908f90600401612dbd565b600060405180830381600087803b15801561137f57600080fd5b505af1158015611393573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b1580156113e157600080fd5b505af11580156113f5573d6000803e3d6000fd5b50506040517f3d5d190c000000000000000000000000000000000000000000000000000000008152600092506001600160a01b0385169150633d5d190c90611443908e908e90600401612e15565b602060405180830381600087803b15801561145d57600080fd5b505af1158015611471573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114959190612988565b905060006114ab670de0b6b3a764000083612eb6565b6040516370a0823160e01b81523060048201529091506001600160a01b038516906370a082319060240160206040518083038186803b1580156114ed57600080fd5b505afa158015611501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115259190612988565b81146115735760405162461bcd60e51b815260206004820181905260248201527f446964206e6f7420726563656976652065787065637465642062616c616e636560448201526064016105f3565b6115818d85838d8d8d61197a565b9650965096505050505096509650969350505050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166381a36fb68a6040518263ffffffff1660e01b81526004016115eb91815260200190565b60206040518083038186803b15801561160357600080fd5b505afa158015611617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163b9190612791565b90506001600160a01b0381166116935760405162461bcd60e51b815260206004820152601d60248201527f4e4654585a61703a205661756c7420646f6573206e6f7420657869737400000060448201526064016105f3565b6000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156116d057600080fd5b505af11580156116e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117089190612791565b905060005b895181101561178b57611747828b838151811061173a57634e487b7160e01b600052603260045260246000fd5b6020026020010151611e49565b61177982848c848151811061176c57634e487b7160e01b600052603260045260246000fd5b6020026020010151612166565b8061178381612f1c565b91505061170d565b5060606000836001600160a01b0316633d5d190c8c846040518363ffffffff1660e01b81526004016117be929190612e15565b602060405180830381600087803b1580156117d857600080fd5b505af11580156117ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118109190612988565b90506000611826670de0b6b3a764000083612eb6565b6040516370a0823160e01b81523060048201529091506001600160a01b038616906370a082319060240160206040518083038186803b15801561186857600080fd5b505afa15801561187c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a09190612988565b81146118ee5760405162461bcd60e51b815260206004820181905260248201527f446964206e6f7420726563656976652065787065637465642062616c616e636560448201526064016105f3565b6118fc8d86838e8e8e61197a565b9750975097505050505050955095509592505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260248201869052600091829182919089169063095ea7b390604401602060405180830381600087803b1580156119ec57600080fd5b505af1158015611a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a249190612928565b5060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e8e337008c7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab357600080fd5b505afa158015611ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aeb9190612791565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018d9052606481018b9052608481018d905260a481018c90523060c48201524260e482015261010401606060405180830381600087803b158015611b5c57600080fd5b505af1158015611b70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b949190612d3a565b9250925092506000611bc68c7f00000000000000000000000000000000000000000000000000000000000000006123f2565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590529192509082169063095ea7b390604401602060405180830381600087803b158015611c3457600080fd5b505af1158015611c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6c9190612928565b506002546040517f6c9b9588000000000000000000000000000000000000000000000000000000008152600481018f90526001600160a01b038a811660248301526044820185905260648201929092527f000000000000000000000000000000000000000000000000000000000000000090911690636c9b958890608401600060405180830381600087803b158015611d0457600080fd5b505af1158015611d18573d6000803e3d6000fd5b505050508a841015611dbe576001600160a01b038c1663a9059cbb89611d3e878f612ed5565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015611d8457600080fd5b505af1158015611d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbc9190612928565b505b600060025442611dce9190612e9e565b90507f9f69538b20901013ea360bae2dce4079d45308fcfed02b3f0768c9f70f4ba9c08e8d85848d604051611e2e9594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405180910390a150929c919b509950975050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038516831415611ed0576040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b17905290506120da565b816001600160a01b0316856001600160a01b0316141561207b57600084604051602401611eff91815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b03891690611f61908590612da1565b600060405180830381855afa9150503d8060008114611f9c576040519150601f19603f3d011682016040523d82523d6000602084013e611fa1565b606091505b5091509150600081806020019051810190611fbc9190612791565b9050828015611fd357506001600160a01b03811633145b61201f5760405162461bcd60e51b815260206004820152600d60248201527f4e6f7420746865206f776e65720000000000000000000000000000000000000060448201526064016105f3565b6040516024810189905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe980000000000000000000000000000000000000000000000000000000017905294506120da9350505050565b6040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b03167f42842e0e0000000000000000000000000000000000000000000000000000000017905290505b600080866001600160a01b0316836040516120f59190612da1565b6000604051808303816000865af19150503d8060008114612132576040519150601f19603f3d011682016040523d82523d6000602084013e612137565b606091505b509150915081819061215c5760405162461bcd60e51b81526004016105f39190612e3a565b5050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b0386168314156121f0576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b1790529050612365565b816001600160a01b0316866001600160a01b031614156122775760405160248101859052600060448201526001600160a01b038616606482015260840160408051601f198184030181529190526020810180516001600160e01b03167fbf31196f000000000000000000000000000000000000000000000000000000001790529050612365565b6040517fe985e9c50000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03868116602483015287169063e985e9c59060440160206040518083038186803b1580156122d757600080fd5b505afa1580156122eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230f9190612928565b1561231c57505050505050565b6040516001600160a01b03861660248201526001604482015260640160408051601f198184030181529190526020810180516001600160e01b031663a22cb46560e01b17905290505b600080876001600160a01b0316836040516123809190612da1565b6000604051808303816000865af19150503d80600081146123bd576040519150601f19603f3d011682016040523d82523d6000602084013e6123c2565b606091505b50915091508181906123e75760405162461bcd60e51b81526004016105f39190612e3a565b505050505050505050565b60008060006124018585612570565b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561245e57600080fd5b505afa158015612472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124969190612791565b6040516bffffffffffffffffffffffff19606085811b8216602084015284901b1660348201526048016040516020818303038152906040528051906020012060405160200161254f9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b60408051601f19818403018152919052805160209091012095945050505050565b600080826001600160a01b0316846001600160a01b031614156125fb5760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f4144445260448201527f455353455300000000000000000000000000000000000000000000000000000060648201526084016105f3565b826001600160a01b0316846001600160a01b03161061261b57828461261e565b83835b90925090506001600160a01b0382166126795760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f41444452455353000060448201526064016105f3565b9250929050565b600082601f830112612690578081fd5b8135602067ffffffffffffffff8211156126ac576126ac612f4d565b8160051b6126bb828201612e6d565b8381528281019086840183880185018910156126d5578687fd5b8693505b858410156126f75780358352600193909301929184019184016126d9565b50979650505050505050565b600082601f830112612713578081fd5b813567ffffffffffffffff81111561272d5761272d612f4d565b612740601f8201601f1916602001612e6d565b818152846020838601011115612754578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561277f578081fd5b813561278a81612f63565b9392505050565b6000602082840312156127a2578081fd5b815161278a81612f63565b600080600080600060a086880312156127c4578081fd5b85356127cf81612f63565b945060208601356127df81612f63565b9350604086013567ffffffffffffffff808211156127fb578283fd5b61280789838a01612680565b9450606088013591508082111561281c578283fd5b61282889838a01612680565b9350608088013591508082111561283d578283fd5b5061284a88828901612703565b9150509295509295909350565b6000806000806080858703121561286c578384fd5b843561287781612f63565b9350602085013561288781612f63565b925060408501359150606085013567ffffffffffffffff8111156128a9578182fd5b6128b587828801612703565b91505092959194509250565b600080600080600060a086880312156128d8578081fd5b85356128e381612f63565b945060208601356128f381612f63565b93506040860135925060608601359150608086013567ffffffffffffffff81111561291c578182fd5b61284a88828901612703565b600060208284031215612939578081fd5b8151801515811461278a578182fd5b600060208284031215612959578081fd5b81356001600160e01b03198116811461278a578182fd5b600060208284031215612981578081fd5b5035919050565b600060208284031215612999578081fd5b5051919050565b600080604083850312156129b2578182fd5b8235915060208301356129c481612f63565b809150509250929050565b600080600080608085870312156129e4578081fd5b84359350602085013567ffffffffffffffff80821115612a02578283fd5b612a0e88838901612680565b94506040870135915080821115612a23578283fd5b50612a3087828801612680565b949793965093946060013593505050565b600080600080600060a08688031215612a58578283fd5b85359450602086013567ffffffffffffffff80821115612a76578485fd5b612a8289838a01612680565b95506040880135915080821115612a97578485fd5b50612aa488828901612680565b935050606086013591506080860135612abc81612f63565b809150509295509295909350565b600080600080600060a08688031215612ae1578283fd5b85359450602086013567ffffffffffffffff80821115612aff578485fd5b612b0b89838a01612680565b95506040880135915080821115612b20578485fd5b50612b2d88828901612680565b9598949750949560608101359550608001359392505050565b60008060008060008060c08789031215612b5e578384fd5b86359550602087013567ffffffffffffffff80821115612b7c578586fd5b612b888a838b01612680565b96506040890135915080821115612b9d578586fd5b50612baa89828a01612680565b945050606087013592506080870135915060a0870135612bc981612f63565b809150509295509295509295565b600080600060608486031215612beb578081fd5b83359250602084013567ffffffffffffffff811115612c08578182fd5b612c1486828701612680565b925050604084013590509250925092565b60008060008060808587031215612c3a578182fd5b84359350602085013567ffffffffffffffff811115612c57578283fd5b612c6387828801612680565b935050604085013591506060850135612c7b81612f63565b939692955090935050565b60008060008060808587031215612c9b578182fd5b84359350602085013567ffffffffffffffff811115612cb8578283fd5b612cc487828801612680565b949794965050505060408301359260600135919050565b600080600080600060a08688031215612cf2578283fd5b85359450602086013567ffffffffffffffff811115612d0f578384fd5b612d1b88828901612680565b94505060408601359250606086013591506080860135612abc81612f63565b600080600060608486031215612d4e578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015612d9657815187529582019590820190600101612d7a565b509495945050505050565b60008251612db3818460208701612eec565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a06040830152612de960a0830185612d67565b8281036060840152612dfb8185612d67565b838103608090940193909352508152602001949350505050565b604081526000612e286040830185612d67565b82810360208401526107b98185612d67565b6020815260008251806020840152612e59816040850160208701612eec565b601f01601f19169190910160400192915050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e9657612e96612f4d565b604052919050565b60008219821115612eb157612eb1612f37565b500190565b6000816000190483118215151615612ed057612ed0612f37565b500290565b600082821015612ee757612ee7612f37565b500390565b60005b83811015612f07578181015183820152602001612eef565b83811115612f16576000848401525b50505050565b6000600019821415612f3057612f30612f37565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110d457600080fdfea26469706673582212207a358e96b784a15df14ed45c5e48466d9776da9f64ca46ea73660fb9b2903f6c64736f6c63430008040033000000000000000000000000be86f647b167567525ccaafcd6f881f1ee558216000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f
Deployed Bytecode
0x6080604052600436106101845760003560e01c8063715018a6116100d6578063bc197c811161007f578063f23a6e6111610059578063f23a6e61146104b4578063f2fde38b146104f9578063f99e74051461051957600080fd5b8063bc197c811461043c578063bdd8172b14610481578063e0e9e64d1461049457600080fd5b8063ad402dfc116100b0578063ad402dfc146103d5578063ad5c4648146103e8578063ae04d45d1461041c57600080fd5b8063715018a61461036c5780638da5cb5b146103835780639bf1401c146103a157600080fd5b80631809d2c21161013857806353b573bf1161011257806353b573bf146102d95780635ee50f88146102ec5780636d13582c1461033857600080fd5b80631809d2c2146102865780631a6907cd146102a65780634a5ff061146102b957600080fd5b80630d668087116101695780630d668087146101f357806310cde78614610209578063150b7a021461022957600080fd5b806301ffc9a71461019057806302100155146101c557600080fd5b3661018b57005b600080fd5b34801561019c57600080fd5b506101b06101ab366004612948565b610539565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612b46565b6105a2565b6040519081526020016101bc565b3480156101ff57600080fd5b506101e560025481565b34801561021557600080fd5b506101e5610224366004612aca565b610790565b34801561023557600080fd5b5061026d610244366004612857565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b031990911681526020016101bc565b34801561029257600080fd5b506101e56102a1366004612c86565b6107aa565b6101e56102b4366004612bd7565b6107c2565b3480156102c557600080fd5b506101e56102d4366004612cdb565b6107d8565b6101e56102e73660046129cf565b6109bf565b3480156102f857600080fd5b506103207f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee55821681565b6040516001600160a01b0390911681526020016101bc565b34801561034457600080fd5b506103207f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b34801561037857600080fd5b506103816109ce565b005b34801561038f57600080fd5b506000546001600160a01b0316610320565b3480156103ad57600080fd5b506103207f000000000000000000000000688c3e4658b5367da06fd629e41879beab538e3781565b6101e56103e3366004612a41565b610a43565b3480156103f457600080fd5b506103207f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561042857600080fd5b50610381610437366004612970565b610be2565b34801561044857600080fd5b5061026d6104573660046127ad565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6101e561048f366004612c25565b610ca3565b3480156104a057600080fd5b506101e56104af3660046129a0565b610e41565b3480156104c057600080fd5b5061026d6104cf3660046128c1565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561050557600080fd5b5061038161051436600461276e565b610fe6565b34801561052557600080fd5b506101e56105343660046129a0565b6110d7565b60006001600160e01b031982167f4e2312e000000000000000000000000000000000000000000000000000000000148061059c57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6000600260015414156105fc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026001556040516323b872dd60e01b8152336004820152306024820152604481018490527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561066f57600080fd5b505af1158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a79190612928565b506000806106b98989898989896111a6565b925092505084821015610780576001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21663a9059cbb856107008589612ed5565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561074657600080fd5b505af115801561075a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077e9190612928565b505b6001805598975050505050505050565b60006107a08686868686336105a2565b9695505050505050565b60006107b985858585336107d8565b95945050505050565b60006107d084848433610ca3565b949350505050565b60006002600154141561082d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105f3565b60026001556040516323b872dd60e01b8152336004820152306024820152604481018490527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906323b872dd90606401602060405180830381600087803b1580156108a057600080fd5b505af11580156108b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d89190612928565b506000806108e98888888888611597565b9250925050848210156109b0576001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21663a9059cbb856109308589612ed5565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561097657600080fd5b505af115801561098a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ae9190612928565b505b60018055979650505050505050565b60006107b98585858533610a43565b336109e16000546001600160a01b031690565b6001600160a01b031614610a375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f3565b610a416000611912565b565b600060026001541415610a985760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105f3565b60026001819055507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610afb57600080fd5b505af1158015610b0f573d6000803e3d6000fd5b5050505050600080610b258888888834896111a6565b9250925050348210156109b0576001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216632e1a7d4d610b6b8434612ed5565b6040518263ffffffff1660e01b8152600401610b8991815260200190565b600060405180830381600087803b158015610ba357600080fd5b505af1158015610bb7573d6000803e3d6000fd5b50505050836001600160a01b03168234610bd19190612ed5565b505060018055979650505050505050565b33610bf56000546001600160a01b031690565b6001600160a01b031614610c4b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f3565b62093a80811115610c9e5760405162461bcd60e51b815260206004820152600d60248201527f4c6f636b20746f6f206c6f6e670000000000000000000000000000000000000060448201526064016105f3565b600255565b600060026001541415610cf85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105f3565b60026001819055507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d5b57600080fd5b505af1158015610d6f573d6000803e3d6000fd5b5050505050600080610d848787873488611597565b925092505034821015610e33576001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216632e1a7d4d610dca8434612ed5565b6040518263ffffffff1660e01b8152600401610de891815260200190565b600060405180830381600087803b158015610e0257600080fd5b505af1158015610e16573d6000803e3d6000fd5b50505050836001600160a01b03168234610e309190612ed5565b50505b600180559695505050505050565b60405163b7019b3760e01b81526004810183905260009081906001600160a01b037f000000000000000000000000688c3e4658b5367da06fd629e41879beab538e37169063b7019b379060240160206040518083038186803b158015610ea657600080fd5b505afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190612791565b60405163c19ea05360e01b81526001600160a01b0385811660048301529192509082169063c19ea0539060240160206040518083038186803b158015610f2357600080fd5b505afa158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b9190612988565b421115610f6c57600091505061059c565b6040516370a0823160e01b81526001600160a01b0384811660048301528216906370a08231906024015b60206040518083038186803b158015610fae57600080fd5b505afa158015610fc2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d09190612988565b33610ff96000546001600160a01b031690565b6001600160a01b03161461104f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f3565b6001600160a01b0381166110cb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105f3565b6110d481611912565b50565b60405163b7019b3760e01b81526004810183905260009081906001600160a01b037f000000000000000000000000688c3e4658b5367da06fd629e41879beab538e37169063b7019b379060240160206040518083038186803b15801561113c57600080fd5b505afa158015611150573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111749190612791565b60405163c19ea05360e01b81526001600160a01b0385811660048301529192509082169063c19ea05390602401610f96565b6000806000807f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b03166381a36fb68b6040518263ffffffff1660e01b81526004016111fa91815260200190565b60206040518083038186803b15801561121257600080fd5b505afa158015611226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124a9190612791565b90506001600160a01b0381166112a25760405162461bcd60e51b815260206004820152601d60248201527f4e4654585a61703a205661756c7420646f6573206e6f7420657869737400000060448201526064016105f3565b6000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156112df57600080fd5b505af11580156112f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113179190612791565b6040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690632eb2c2d69061136590339030908f908f90600401612dbd565b600060405180830381600087803b15801561137f57600080fd5b505af1158015611393573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b1580156113e157600080fd5b505af11580156113f5573d6000803e3d6000fd5b50506040517f3d5d190c000000000000000000000000000000000000000000000000000000008152600092506001600160a01b0385169150633d5d190c90611443908e908e90600401612e15565b602060405180830381600087803b15801561145d57600080fd5b505af1158015611471573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114959190612988565b905060006114ab670de0b6b3a764000083612eb6565b6040516370a0823160e01b81523060048201529091506001600160a01b038516906370a082319060240160206040518083038186803b1580156114ed57600080fd5b505afa158015611501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115259190612988565b81146115735760405162461bcd60e51b815260206004820181905260248201527f446964206e6f7420726563656976652065787065637465642062616c616e636560448201526064016105f3565b6115818d85838d8d8d61197a565b9650965096505050505096509650969350505050565b6000806000807f000000000000000000000000be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b03166381a36fb68a6040518263ffffffff1660e01b81526004016115eb91815260200190565b60206040518083038186803b15801561160357600080fd5b505afa158015611617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163b9190612791565b90506001600160a01b0381166116935760405162461bcd60e51b815260206004820152601d60248201527f4e4654585a61703a205661756c7420646f6573206e6f7420657869737400000060448201526064016105f3565b6000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156116d057600080fd5b505af11580156116e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117089190612791565b905060005b895181101561178b57611747828b838151811061173a57634e487b7160e01b600052603260045260246000fd5b6020026020010151611e49565b61177982848c848151811061176c57634e487b7160e01b600052603260045260246000fd5b6020026020010151612166565b8061178381612f1c565b91505061170d565b5060606000836001600160a01b0316633d5d190c8c846040518363ffffffff1660e01b81526004016117be929190612e15565b602060405180830381600087803b1580156117d857600080fd5b505af11580156117ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118109190612988565b90506000611826670de0b6b3a764000083612eb6565b6040516370a0823160e01b81523060048201529091506001600160a01b038616906370a082319060240160206040518083038186803b15801561186857600080fd5b505afa15801561187c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a09190612988565b81146118ee5760405162461bcd60e51b815260206004820181905260248201527f446964206e6f7420726563656976652065787065637465642062616c616e636560448201526064016105f3565b6118fc8d86838e8e8e61197a565b9750975097505050505050955095509592505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f8116600483015260248201869052600091829182919089169063095ea7b390604401602060405180830381600087803b1580156119ec57600080fd5b505af1158015611a00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a249190612928565b5060008060007f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b031663e8e337008c7f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab357600080fd5b505afa158015611ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aeb9190612791565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018d9052606481018b9052608481018d905260a481018c90523060c48201524260e482015261010401606060405180830381600087803b158015611b5c57600080fd5b505af1158015611b70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b949190612d3a565b9250925092506000611bc68c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26123f2565b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000688c3e4658b5367da06fd629e41879beab538e3781166004830152602482018590529192509082169063095ea7b390604401602060405180830381600087803b158015611c3457600080fd5b505af1158015611c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6c9190612928565b506002546040517f6c9b9588000000000000000000000000000000000000000000000000000000008152600481018f90526001600160a01b038a811660248301526044820185905260648201929092527f000000000000000000000000688c3e4658b5367da06fd629e41879beab538e3790911690636c9b958890608401600060405180830381600087803b158015611d0457600080fd5b505af1158015611d18573d6000803e3d6000fd5b505050508a841015611dbe576001600160a01b038c1663a9059cbb89611d3e878f612ed5565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015611d8457600080fd5b505af1158015611d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbc9190612928565b505b600060025442611dce9190612e9e565b90507f9f69538b20901013ea360bae2dce4079d45308fcfed02b3f0768c9f70f4ba9c08e8d85848d604051611e2e9594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405180910390a150929c919b509950975050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038516831415611ed0576040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b17905290506120da565b816001600160a01b0316856001600160a01b0316141561207b57600084604051602401611eff91815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b03891690611f61908590612da1565b600060405180830381855afa9150503d8060008114611f9c576040519150601f19603f3d011682016040523d82523d6000602084013e611fa1565b606091505b5091509150600081806020019051810190611fbc9190612791565b9050828015611fd357506001600160a01b03811633145b61201f5760405162461bcd60e51b815260206004820152600d60248201527f4e6f7420746865206f776e65720000000000000000000000000000000000000060448201526064016105f3565b6040516024810189905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe980000000000000000000000000000000000000000000000000000000017905294506120da9350505050565b6040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b03167f42842e0e0000000000000000000000000000000000000000000000000000000017905290505b600080866001600160a01b0316836040516120f59190612da1565b6000604051808303816000865af19150503d8060008114612132576040519150601f19603f3d011682016040523d82523d6000602084013e612137565b606091505b509150915081819061215c5760405162461bcd60e51b81526004016105f39190612e3a565b5050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b0386168314156121f0576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b1790529050612365565b816001600160a01b0316866001600160a01b031614156122775760405160248101859052600060448201526001600160a01b038616606482015260840160408051601f198184030181529190526020810180516001600160e01b03167fbf31196f000000000000000000000000000000000000000000000000000000001790529050612365565b6040517fe985e9c50000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03868116602483015287169063e985e9c59060440160206040518083038186803b1580156122d757600080fd5b505afa1580156122eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230f9190612928565b1561231c57505050505050565b6040516001600160a01b03861660248201526001604482015260640160408051601f198184030181529190526020810180516001600160e01b031663a22cb46560e01b17905290505b600080876001600160a01b0316836040516123809190612da1565b6000604051808303816000865af19150503d80600081146123bd576040519150601f19603f3d011682016040523d82523d6000602084013e6123c2565b606091505b50915091508181906123e75760405162461bcd60e51b81526004016105f39190612e3a565b505050505050505050565b60008060006124018585612570565b915091507f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561245e57600080fd5b505afa158015612472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124969190612791565b6040516bffffffffffffffffffffffff19606085811b8216602084015284901b1660348201526048016040516020818303038152906040528051906020012060405160200161254f9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b60408051601f19818403018152919052805160209091012095945050505050565b600080826001600160a01b0316846001600160a01b031614156125fb5760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f4144445260448201527f455353455300000000000000000000000000000000000000000000000000000060648201526084016105f3565b826001600160a01b0316846001600160a01b03161061261b57828461261e565b83835b90925090506001600160a01b0382166126795760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f41444452455353000060448201526064016105f3565b9250929050565b600082601f830112612690578081fd5b8135602067ffffffffffffffff8211156126ac576126ac612f4d565b8160051b6126bb828201612e6d565b8381528281019086840183880185018910156126d5578687fd5b8693505b858410156126f75780358352600193909301929184019184016126d9565b50979650505050505050565b600082601f830112612713578081fd5b813567ffffffffffffffff81111561272d5761272d612f4d565b612740601f8201601f1916602001612e6d565b818152846020838601011115612754578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561277f578081fd5b813561278a81612f63565b9392505050565b6000602082840312156127a2578081fd5b815161278a81612f63565b600080600080600060a086880312156127c4578081fd5b85356127cf81612f63565b945060208601356127df81612f63565b9350604086013567ffffffffffffffff808211156127fb578283fd5b61280789838a01612680565b9450606088013591508082111561281c578283fd5b61282889838a01612680565b9350608088013591508082111561283d578283fd5b5061284a88828901612703565b9150509295509295909350565b6000806000806080858703121561286c578384fd5b843561287781612f63565b9350602085013561288781612f63565b925060408501359150606085013567ffffffffffffffff8111156128a9578182fd5b6128b587828801612703565b91505092959194509250565b600080600080600060a086880312156128d8578081fd5b85356128e381612f63565b945060208601356128f381612f63565b93506040860135925060608601359150608086013567ffffffffffffffff81111561291c578182fd5b61284a88828901612703565b600060208284031215612939578081fd5b8151801515811461278a578182fd5b600060208284031215612959578081fd5b81356001600160e01b03198116811461278a578182fd5b600060208284031215612981578081fd5b5035919050565b600060208284031215612999578081fd5b5051919050565b600080604083850312156129b2578182fd5b8235915060208301356129c481612f63565b809150509250929050565b600080600080608085870312156129e4578081fd5b84359350602085013567ffffffffffffffff80821115612a02578283fd5b612a0e88838901612680565b94506040870135915080821115612a23578283fd5b50612a3087828801612680565b949793965093946060013593505050565b600080600080600060a08688031215612a58578283fd5b85359450602086013567ffffffffffffffff80821115612a76578485fd5b612a8289838a01612680565b95506040880135915080821115612a97578485fd5b50612aa488828901612680565b935050606086013591506080860135612abc81612f63565b809150509295509295909350565b600080600080600060a08688031215612ae1578283fd5b85359450602086013567ffffffffffffffff80821115612aff578485fd5b612b0b89838a01612680565b95506040880135915080821115612b20578485fd5b50612b2d88828901612680565b9598949750949560608101359550608001359392505050565b60008060008060008060c08789031215612b5e578384fd5b86359550602087013567ffffffffffffffff80821115612b7c578586fd5b612b888a838b01612680565b96506040890135915080821115612b9d578586fd5b50612baa89828a01612680565b945050606087013592506080870135915060a0870135612bc981612f63565b809150509295509295509295565b600080600060608486031215612beb578081fd5b83359250602084013567ffffffffffffffff811115612c08578182fd5b612c1486828701612680565b925050604084013590509250925092565b60008060008060808587031215612c3a578182fd5b84359350602085013567ffffffffffffffff811115612c57578283fd5b612c6387828801612680565b935050604085013591506060850135612c7b81612f63565b939692955090935050565b60008060008060808587031215612c9b578182fd5b84359350602085013567ffffffffffffffff811115612cb8578283fd5b612cc487828801612680565b949794965050505060408301359260600135919050565b600080600080600060a08688031215612cf2578283fd5b85359450602086013567ffffffffffffffff811115612d0f578384fd5b612d1b88828901612680565b94505060408601359250606086013591506080860135612abc81612f63565b600080600060608486031215612d4e578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015612d9657815187529582019590820190600101612d7a565b509495945050505050565b60008251612db3818460208701612eec565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a06040830152612de960a0830185612d67565b8281036060840152612dfb8185612d67565b838103608090940193909352508152602001949350505050565b604081526000612e286040830185612d67565b82810360208401526107b98185612d67565b6020815260008251806020840152612e59816040850160208701612eec565b601f01601f19169190910160400192915050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e9657612e96612f4d565b604052919050565b60008219821115612eb157612eb1612f37565b500190565b6000816000190483118215151615612ed057612ed0612f37565b500290565b600082821015612ee757612ee7612f37565b500390565b60005b83811015612f07578181015183820152602001612eef565b83811115612f16576000848401525b50505050565b6000600019821415612f3057612f30612f37565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110d457600080fdfea26469706673582212207a358e96b784a15df14ed45c5e48466d9776da9f64ca46ea73660fb9b2903f6c64736f6c63430008040033
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
47478:11149:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35890:269;;;;;;;;;;-1:-1:-1;35890:269:0;;;;;:::i;:::-;;:::i;:::-;;;17972:14:1;;17965:22;17947:41;;17935:2;17920:18;35890:269:0;;;;;;;;51240:556;;;;;;;;;;-1:-1:-1;51240:556:0;;;;;:::i;:::-;;:::i;:::-;;;23094:25:1;;;23082:2;23067:18;51240:556:0;23049:76:1;47770:34:0;;;;;;;;;;;;;;;;50960:274;;;;;;;;;;-1:-1:-1;50960:274:0;;;;;:::i;:::-;;:::i;31890:207::-;;;;;;;;;;-1:-1:-1;31890:207:0;;;;;:::i;:::-;32059:30;31890:207;;;;;;;;;;-1:-1:-1;;;;;;18161:79:1;;;18143:98;;18131:2;18116:18;31890:207:0;18098:149:1;50200:233:0;;;;;;;;;;-1:-1:-1;50200:233:0;;;;;:::i;:::-;;:::i;48609:218::-;;;;;;:::i;:::-;;:::i;50439:515::-;;;;;;;;;;-1:-1:-1;50439:515:0;;;;;:::i;:::-;;:::i;49354:258::-;;;;;;:::i;:::-;;:::i;47665:46::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14229:55:1;;;14211:74;;14199:2;14184:18;47665:46:0;14166:125:1;47716:47:0;;;;;;;;;;;;;;;46849:94;;;;;;;;;;;;;:::i;:::-;;46200:87;;;;;;;;;;-1:-1:-1;46246:7:0;46273:6;-1:-1:-1;;;;;46273:6:0;46200:87;;47619:41;;;;;;;;;;;;;;;49618:576;;;;;;:::i;:::-;;:::i;47586:27::-;;;;;;;;;;;;;;;48452:150;;;;;;;;;;-1:-1:-1;48452:150:0;;;;;:::i;:::-;;:::i;36570:203::-;;;;;;;;;;-1:-1:-1;36570:203:0;;;;;:::i;:::-;36729:36;36570:203;;;;;;;;48833:515;;;;;;:::i;:::-;;:::i;52043:341::-;;;;;;;;;;-1:-1:-1;52043:341:0;;;;;:::i;:::-;;:::i;36387:175::-;;;;;;;;;;-1:-1:-1;36387:175:0;;;;;:::i;:::-;36523:31;36387:175;;;;;;;;47098:192;;;;;;;;;;-1:-1:-1;47098:192:0;;;;;:::i;:::-;;:::i;51802:235::-;;;;;;;;;;-1:-1:-1;51802:235:0;;;;;:::i;:::-;;:::i;35890:269::-;36014:4;-1:-1:-1;;;;;;36038:60:0;;36053:45;36038:60;;:113;;-1:-1:-1;35528:36:0;-1:-1:-1;;;;;;35513:51:0;;;36115:36;36031:120;35890:269;-1:-1:-1;;35890:269:0:o;51240:556::-;51445:7;44358:1;44954:7;;:19;;44946:63;;;;-1:-1:-1;;;44946:63:0;;22790:2:1;44946:63:0;;;22772:21:1;22829:2;22809:18;;;22802:30;22868:33;22848:18;;;22841:61;22919:18;;44946:63:0;;;;;;;;;44358:1;45087:7;:18;51461:80:::1;::::0;-1:-1:-1;;;51461:80:0;;51507:10:::1;51461:80;::::0;::::1;15811:34:1::0;51527:4:0::1;15861:18:1::0;;;15854:43;15913:18;;;15906:34;;;51487:4:0::1;-1:-1:-1::0;;;;;51461:45:0::1;::::0;::::1;::::0;15723:18:1;;51461:80:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51551:17;51570::::0;51591:67:::1;51613:7;51622:3;51627:7;51636:9;51647:6;51655:2;51591:21;:67::i;:::-;51548:110;;;;;51706:6;51694:9;:18;51690:76;;;-1:-1:-1::0;;;;;51723:4:0::1;:13;;51737:2:::0;51741:16:::1;51748:9:::0;51741:6;:16:::1;:::i;:::-;51723:35;::::0;-1:-1:-1;;;;;;51723:35:0::1;::::0;;;;;;-1:-1:-1;;;;;17227:55:1;;;51723:35:0::1;::::0;::::1;17209:74:1::0;17299:18;;;17292:34;17182:18;;51723:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51690:76;44314:1:::0;45266:22;;51781:9;51240:556;-1:-1:-1;;;;;;;;51240:556:0:o;50960:274::-;51133:7;51156:72;51175:7;51184:3;51189:7;51198:9;51209:6;51217:10;51156:18;:72::i;:::-;51149:79;50960:274;-1:-1:-1;;;;;;50960:274:0:o;50200:233::-;50342:7;50365:62;50383:7;50392:3;50397:9;50408:6;50416:10;50365:17;:62::i;:::-;50358:69;50200:233;-1:-1:-1;;;;;50200:233:0:o;48609:218::-;48741:7;48764:57;48785:7;48794:3;48799:9;48810:10;48764:20;:57::i;:::-;48757:64;48609:218;-1:-1:-1;;;;48609:218:0:o;50439:515::-;50613:7;44358:1;44954:7;;:19;;44946:63;;;;-1:-1:-1;;;44946:63:0;;22790:2:1;44946:63:0;;;22772:21:1;22829:2;22809:18;;;22802:30;22868:33;22848:18;;;22841:61;22919:18;;44946:63:0;22762:181:1;44946:63:0;44358:1;45087:7;:18;50629:80:::1;::::0;-1:-1:-1;;;50629:80:0;;50675:10:::1;50629:80;::::0;::::1;15811:34:1::0;50695:4:0::1;15861:18:1::0;;;15854:43;15913:18;;;15906:34;;;50655:4:0::1;-1:-1:-1::0;;;;;50629:45:0::1;::::0;::::1;::::0;15723:18:1;;50629:80:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50719:17;50738::::0;50759:57:::1;50780:7;50789:3;50794:9;50805:6;50813:2;50759:20;:57::i;:::-;50716:100;;;;;50864:6;50852:9;:18;50848:76;;;-1:-1:-1::0;;;;;50881:4:0::1;:13;;50895:2:::0;50899:16:::1;50906:9:::0;50899:6;:16:::1;:::i;:::-;50881:35;::::0;-1:-1:-1;;;;;;50881:35:0::1;::::0;;;;;;-1:-1:-1;;;;;17227:55:1;;;50881:35:0::1;::::0;::::1;17209:74:1::0;17299:18;;;17292:34;17182:18;;50881:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50848:76;44314:1:::0;45266:22;;50939:9;50439:515;-1:-1:-1;;;;;;;50439:515:0:o;49354:258::-;49517:7;49540:66;49562:7;49571:3;49576:7;49585:8;49595:10;49540:21;:66::i;46849:94::-;46431:10;46420:7;46246;46273:6;-1:-1:-1;;;;;46273:6:0;;46200:87;46420:7;-1:-1:-1;;;;;46420:21:0;;46412:66;;;;-1:-1:-1;;;46412:66:0;;21351:2:1;46412:66:0;;;21333:21:1;;;21370:18;;;21363:30;21429:34;21409:18;;;21402:62;21481:18;;46412:66:0;21323:182:1;46412:66:0;46914:21:::1;46932:1;46914:9;:21::i;:::-;46849:94::o:0;49618:576::-;49813:7;44358:1;44954:7;;:19;;44946:63;;;;-1:-1:-1;;;44946:63:0;;22790:2:1;44946:63:0;;;22772:21:1;22829:2;22809:18;;;22802:30;22868:33;22848:18;;;22841:61;22919:18;;44946:63:0;22762:181:1;44946:63:0;44358:1;45087:7;:18;;;;49829:4:::1;-1:-1:-1::0;;;;;49829:12:0::1;;49849:9;49829:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;49892:17;49911::::0;49932:69:::1;49954:7;49963:3;49968:7;49977:8;49987:9;49998:2;49932:21;:69::i;:::-;49889:112;;;;;50049:9;50037;:21;50033:131;;;-1:-1:-1::0;;;;;50069:4:0::1;:13;;50083:19;50093:9:::0;50083::::1;:19;:::i;:::-;50069:34;;;;;;;;;;;;;23094:25:1::0;;23082:2;23067:18;;23049:76;50069:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50120:2;-1:-1:-1::0;;;;;50112:16:0::1;50146:9;50136;:19;;;;:::i;:::-;-1:-1:-1::0;;44314:1:0;45266:22;;50179:9;49618:576;-1:-1:-1;;;;;;;49618:576:0:o;48452:150::-;46431:10;46420:7;46246;46273:6;-1:-1:-1;;;;;46273:6:0;;46200:87;46420:7;-1:-1:-1;;;;;46420:21:0;;46412:66;;;;-1:-1:-1;;;46412:66:0;;21351:2:1;46412:66:0;;;21333:21:1;;;21370:18;;;21363:30;21429:34;21409:18;;;21402:62;21481:18;;46412:66:0;21323:182:1;46412:66:0;48543:6:::1;48528:11;:21;;48520:47;;;::::0;-1:-1:-1;;;48520:47:0;;21009:2:1;48520:47:0::1;::::0;::::1;20991:21:1::0;21048:2;21028:18;;;21021:30;21087:15;21067:18;;;21060:43;21120:18;;48520:47:0::1;20981:163:1::0;48520:47:0::1;48574:8;:22:::0;48452:150::o;48833:515::-;48997:7;44358:1;44954:7;;:19;;44946:63;;;;-1:-1:-1;;;44946:63:0;;22790:2:1;44946:63:0;;;22772:21:1;22829:2;22809:18;;;22802:30;22868:33;22848:18;;;22841:61;22919:18;;44946:63:0;22762:181:1;44946:63:0;44358:1;45087:7;:18;;;;49013:4:::1;-1:-1:-1::0;;;;;49013:12:0::1;;49033:9;49013:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;49055:17;49074::::0;49095:60:::1;49116:7;49125:3;49130:9;49141;49152:2;49095:20;:60::i;:::-;49052:103;;;;;49203:9;49191;:21;49187:131;;;-1:-1:-1::0;;;;;49223:4:0::1;:13;;49237:19;49247:9:::0;49237::::1;:19;:::i;:::-;49223:34;;;;;;;;;;;;;23094:25:1::0;;23082:2;23067:18;;23049:76;49223:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49274:2;-1:-1:-1::0;;;;;49266:16:0::1;49300:9;49290;:19;;;;:::i;:::-;49266:44;;49187:131;44314:1:::0;45266:22;;49333:9;48833:515;-1:-1:-1;;;;;;48833:515:0:o;52043:341::-;52214:45;;-1:-1:-1;;;52214:45:0;;;;;23094:25:1;;;52121:7:0;;;;-1:-1:-1;;;;;52214:9:0;:36;;;;23067:18:1;;52214:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52288:27;;-1:-1:-1;;;52288:27:0;;-1:-1:-1;;;;;14229:55:1;;;52288:27:0;;;14211:74:1;52137:123:0;;-1:-1:-1;52288:22:0;;;;;;14184:18:1;;52288:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52270:15;:45;52267:75;;;52333:1;52326:8;;;;;52267:75;52355:23;;-1:-1:-1;;;52355:23:0;;-1:-1:-1;;;;;14229:55:1;;;52355:23:0;;;14211:74:1;52355:18:0;;;;;14184::1;;52355:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47098:192::-;46431:10;46420:7;46246;46273:6;-1:-1:-1;;;;;46273:6:0;;46200:87;46420:7;-1:-1:-1;;;;;46420:21:0;;46412:66;;;;-1:-1:-1;;;46412:66:0;;21351:2:1;46412:66:0;;;21333:21:1;;;21370:18;;;21363:30;21429:34;21409:18;;;21402:62;21481:18;;46412:66:0;21323:182:1;46412:66:0;-1:-1:-1;;;;;47187:22:0;::::1;47179:73;;;::::0;-1:-1:-1;;;47179:73:0;;19854:2:1;47179:73:0::1;::::0;::::1;19836:21:1::0;19893:2;19873:18;;;19866:30;19932:34;19912:18;;;19905:62;20003:8;19983:18;;;19976:36;20029:19;;47179:73:0::1;19826:228:1::0;47179:73:0::1;47263:19;47273:8;47263:9;:19::i;:::-;47098:192:::0;:::o;51802:235::-;51911:45;;-1:-1:-1;;;51911:45:0;;;;;23094:25:1;;;51876:7:0;;;;-1:-1:-1;;;;;51911:9:0;:36;;;;23067:18:1;;51911:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51970:61;;-1:-1:-1;;;51970:61:0;;-1:-1:-1;;;;;14229:55:1;;;51970:61:0;;;14211:74:1;51892:64:0;;-1:-1:-1;51970:56:0;;;;;;14184:18:1;;51970:61:0;14166:125:1;53350:975:0;53547:7;53556;53565;53581:13;53597:11;-1:-1:-1;;;;;53597:17:0;;53615:7;53597:26;;;;;;;;;;;;;23094:25:1;;23082:2;23067:18;;23049:76;53597:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53581:42;-1:-1:-1;;;;;;53638:19:0;;53630:61;;;;-1:-1:-1;;;53630:61:0;;22073:2:1;53630:61:0;;;22055:21:1;22112:2;22092:18;;;22085:30;22151:31;22131:18;;;22124:59;22200:18;;53630:61:0;22045:179:1;53630:61:0;53749:20;53783:5;-1:-1:-1;;;;;53772:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53811:100;;;;;53749:55;;-1:-1:-1;;;;;;53811:55:0;;;;;:100;;53867:10;;53887:4;;53894:3;;53899:7;;53811:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53918:64:0;;-1:-1:-1;;;53918:64:0;;-1:-1:-1;;;;;16909:55:1;;;53918:64:0;;;16891:74:1;53977:4:0;16981:18:1;;;16974:50;53918:51:0;;;-1:-1:-1;53918:51:0;;-1:-1:-1;16864:18:1;;53918:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54005:36:0;;;;;53989:13;;-1:-1:-1;;;;;;54005:22:0;;;-1:-1:-1;54005:22:0;;:36;;54028:3;;54033:7;;54005:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53989:52;-1:-1:-1;54048:15:0;54067:12;47834:6;53989:52;54067:12;:::i;:::-;54145:49;;-1:-1:-1;;;54145:49:0;;54188:4;54145:49;;;14211:74:1;54048:32:0;;-1:-1:-1;;;;;;54145:34:0;;;;;14184:18:1;;54145:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54134:7;:60;54126:105;;;;-1:-1:-1;;;54126:105:0;;21712:2:1;54126:105:0;;;21694:21:1;;;21731:18;;;21724:30;21790:34;21770:18;;;21763:62;21842:18;;54126:105:0;21684:182:1;54126:105:0;54251:68;54272:7;54281:5;54288:7;54297:9;54308:6;54316:2;54251:20;:68::i;:::-;54244:75;;;;;;;;;;53350:975;;;;;;;;;;:::o;52390:954::-;52556:7;52565;52574;52590:13;52606:11;-1:-1:-1;;;;;52606:17:0;;52624:7;52606:26;;;;;;;;;;;;;23094:25:1;;23082:2;23067:18;;23049:76;52606:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52590:42;-1:-1:-1;;;;;;52647:19:0;;52639:61;;;;-1:-1:-1;;;52639:61:0;;22073:2:1;52639:61:0;;;22055:21:1;22112:2;22092:18;;;22085:30;22151:31;22131:18;;;22124:59;22200:18;;52639:61:0;22045:179:1;52639:61:0;52758:20;52792:5;-1:-1:-1;;;;;52781:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52758:55;;52825:9;52820:149;52844:3;:10;52840:1;:14;52820:149;;;52870:40;52889:12;52903:3;52907:1;52903:6;;;;;;-1:-1:-1;;;52903:6:0;;;;;;;;;;;;;;;52870:18;:40::i;:::-;52919:42;52933:12;52947:5;52954:3;52958:1;52954:6;;;;;;-1:-1:-1;;;52954:6:0;;;;;;;;;;;;;;;52919:13;:42::i;:::-;52856:3;;;;:::i;:::-;;;;52820:149;;;;52975:25;53007:13;53034:5;-1:-1:-1;;;;;53023:22:0;;53046:3;53051:8;53023:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53007:53;-1:-1:-1;53067:15:0;53086:12;47834:6;53007:53;53086:12;:::i;:::-;53164:49;;-1:-1:-1;;;53164:49:0;;53207:4;53164:49;;;14211:74:1;53067:32:0;;-1:-1:-1;;;;;;53164:34:0;;;;;14184:18:1;;53164:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53153:7;:60;53145:105;;;;-1:-1:-1;;;53145:105:0;;21712:2:1;53145:105:0;;;21694:21:1;;;21731:18;;;21724:30;21790:34;21770:18;;;21763:62;21842:18;;53145:105:0;21684:182:1;53145:105:0;53270:68;53291:7;53300:5;53307:7;53316:9;53327:6;53335:2;53270:20;:68::i;:::-;53263:75;;;;;;;;;;;52390:954;;;;;;;;;:::o;47298:173::-;47354:16;47373:6;;-1:-1:-1;;;;;47390:17:0;;;;;;;;;;47423:40;;47373:6;;;;;;;47423:40;;47354:16;47423:40;47298:173;;:::o;54331:1122::-;54578:66;;-1:-1:-1;;;54578:66:0;;-1:-1:-1;;;;;54619:11:0;17227:55:1;;54578:66:0;;;17209:74:1;17299:18;;;17292:34;;;-1:-1:-1;;;;;;54578:32:0;;;;;;17182:18:1;;54578:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54652:19;54673:17;54692;54713:11;-1:-1:-1;;;;;54713:24:0;;54754:5;54770:11;-1:-1:-1;;;;;54770:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54713:202;;-1:-1:-1;;;;;;54713:202:0;;;;;;;-1:-1:-1;;;;;16373:15:1;;;54713:202:0;;;16355:34:1;16425:15;;16405:18;;;16398:43;16457:18;;;16450:34;;;16500:18;;;16493:34;;;16543:19;;;16536:35;;;16587:19;;;16580:35;;;54878:4:0;16631:19:1;;;16624:44;54893:15:0;16684:19:1;;;16677:35;16266:19;;54713:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54651:264;;;;;;54962:15;54980:29;54988:5;55003:4;54980:7;:29::i;:::-;55016:65;;-1:-1:-1;;;55016:65:0;;-1:-1:-1;;;;;55059:9:0;17227:55:1;;55016:65:0;;;17209:74:1;17299:18;;;17292:34;;;54962:47:0;;-1:-1:-1;55016:34:0;;;;;;17182:18:1;;55016:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;55141:8:0;;55088:62;;;;;;;;23361:25:1;;;-1:-1:-1;;;;;23422:55:1;;;23402:18;;;23395:83;23494:18;;;23487:34;;;23537:18;;;23530:34;;;;55088:9:0;:28;;;;;;23333:19:1;;55088:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55181:10;55167:11;:24;55163:108;;;-1:-1:-1;;;;;55202:33:0;;;55236:2;55240:22;55251:11;55240:10;:22;:::i;:::-;55202:61;;-1:-1:-1;;;;;;55202:61:0;;;;;;;-1:-1:-1;;;;;17227:55:1;;;55202:61:0;;;17209:74:1;17299:18;;;17292:34;17182:18;;55202:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55163:108;55279:19;55319:8;;55301:15;:26;;;;:::i;:::-;55279:48;;55339:59;55350:7;55359:10;55371:9;55382:11;55395:2;55339:59;;;;;;;;;24224:25:1;;;24280:2;24265:18;;24258:34;;;;24323:2;24308:18;;24301:34;;;;24366:2;24351:18;;24344:34;-1:-1:-1;;;;;24415:55:1;24409:3;24394:19;;24387:84;24211:3;24196:19;;24178:299;55339:59:0;;;;;;;;-1:-1:-1;55413:11:0;;55426:9;;-1:-1:-1;55426:9:0;-1:-1:-1;54331:1122:0;-1:-1:-1;;;;;;;;54331:1122:0:o;55459:1239::-;55565:42;55630;55679:17;-1:-1:-1;;;;;55707:20:0;;;;55703:869;;;55774:100;;55839:10;55774:100;;;15811:34:1;55859:4:0;15861:18:1;;;15854:43;15913:18;;;15906:34;;;15723:18;;55774:100:0;;;-1:-1:-1;;55774:100:0;;;;;;;;;;;;;;-1:-1:-1;;;;;55774:100:0;-1:-1:-1;;;55774:100:0;;;;-1:-1:-1;55703:869:0;;;55905:5;-1:-1:-1;;;;;55892:18:0;:9;-1:-1:-1;;;;;55892:18:0;;55888:684;;;56007:31;56096:7;56041:63;;;;;;23094:25:1;;23082:2;23067:18;;23049:76;56041:63:0;;;;-1:-1:-1;;56041:63:0;;;;;;;;;;;;;;-1:-1:-1;;;;;56041:63:0;;;;;56158:49;56041:63;;-1:-1:-1;;;;;;;;;;56158:29:0;;;:49;;56041:63;;56158:49;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56115:92;;;;56219:13;56247:6;56236:29;;;;;;;;;;;;:::i;:::-;56218:47;;56284:12;:35;;;;-1:-1:-1;;;;;;56300:19:0;;56309:10;56300:19;56284:35;56276:61;;;;-1:-1:-1;;;56276:61:0;;20667:2:1;56276:61:0;;;20649:21:1;20706:2;20686:18;;;20679:30;20745:15;20725:18;;;20718:43;20778:18;;56276:61:0;20639:163:1;56276:61:0;56355:52;;;;;23094:25:1;;;23067:18;;56355:52:0;;;-1:-1:-1;;56355:52:0;;;;;;;;;;;;;;-1:-1:-1;;;;;56355:52:0;;;;;;-1:-1:-1;55888:684:0;;-1:-1:-1;;;;55888:684:0;;56460:104;;56529:10;56460:104;;;15811:34:1;56549:4:0;15861:18:1;;;15854:43;15913:18;;;15906:34;;;15723:18;;56460:104:0;;;-1:-1:-1;;56460:104:0;;;;;;;;;;;;;;-1:-1:-1;;;;;56460:104:0;;;;;;-1:-1:-1;55888:684:0;56579:12;56593:23;56628:9;-1:-1:-1;;;;;56620:23:0;56644:4;56620:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56578:71;;;;56664:7;56680:10;56656:36;;;;;-1:-1:-1;;;56656:36:0;;;;;;;;:::i;:::-;;55459:1239;;;;;;;:::o;56704:916::-;56817:42;56882;56931:17;-1:-1:-1;;;;;56959:20:0;;;;56955:539;;;57026:64;;-1:-1:-1;;;;;17227:55:1;;57026:64:0;;;17209:74:1;17299:18;;;17292:34;;;17182:18;;57026:64:0;;;-1:-1:-1;;57026:64:0;;;;;;;;;;;;;;-1:-1:-1;;;;;57026:64:0;-1:-1:-1;;;57026:64:0;;;;-1:-1:-1;56955:539:0;;;57121:5;-1:-1:-1;;;;;57108:18:0;:9;-1:-1:-1;;;;;57108:18:0;;57104:390;;;57171:93;;;;;23783:25:1;;;57258:1:0;23824:18:1;;;23817:45;-1:-1:-1;;;;;23898:55:1;;23878:18;;;23871:83;23756:18;;57171:93:0;;;-1:-1:-1;;57171:93:0;;;;;;;;;;;;;;-1:-1:-1;;;;;57171:93:0;;;;;;-1:-1:-1;57104:390:0;;;57293:54;;;;;57337:4;57293:54;;;14531:34:1;-1:-1:-1;;;;;14601:15:1;;;14581:18;;;14574:43;57293:35:0;;;;;14443:18:1;;57293:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57289:91;;;57362:7;;;56704:916;;;:::o;57289:91::-;57418:68;;-1:-1:-1;;;;;16909:55:1;;57418:68:0;;;16891:74:1;57481:4:0;16981:18:1;;;16974:50;16864:18;;57418:68:0;;;-1:-1:-1;;57418:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;57418:68:0;-1:-1:-1;;;57418:68:0;;;;-1:-1:-1;57104:390:0;57501:12;57515:23;57550:9;-1:-1:-1;;;;;57542:23:0;57566:4;57542:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57500:71;;;;57586:7;57602:10;57578:36;;;;;-1:-1:-1;;;57578:36:0;;;;;;;;:::i;:::-;;56704:916;;;;;;;;:::o;57708:429::-;57780:12;57802:14;57818;57836:26;57847:6;57855;57836:10;:26::i;:::-;57801:61;;;;57951:11;-1:-1:-1;;;;;57951:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57991:32;;-1:-1:-1;;12981:2:1;12977:15;;;12973:24;;57991:32:0;;;12961:37:1;13032:15;;;13028:24;13014:12;;;13007:46;13069:12;;57991:32:0;;;;;;;;;;;;57981:43;;;;;;57910:217;;;;;;;;13742:66:1;13730:79;;13846:2;13842:15;;;;-1:-1:-1;;13838:53:1;13834:1;13825:11;;13818:74;13917:2;13908:12;;13901:28;13959:66;13954:2;13945:12;;13938:88;14051:2;14042:12;;13720:340;57910:217:0;;;;-1:-1:-1;;57910:217:0;;;;;;;;;57900:228;;57910:217;57900:228;;;;;57708:429;-1:-1:-1;;;;;57708:429:0:o;58242:341::-;58317:14;58333;58376:6;-1:-1:-1;;;;;58366:16:0;:6;-1:-1:-1;;;;;58366:16:0;;;58358:66;;;;-1:-1:-1;;;58358:66:0;;20261:2:1;58358:66:0;;;20243:21:1;20300:2;20280:18;;;20273:30;20339:34;20319:18;;;20312:62;20410:7;20390:18;;;20383:35;20435:19;;58358:66:0;20233:227:1;58358:66:0;58461:6;-1:-1:-1;;;;;58452:15:0;:6;-1:-1:-1;;;;;58452:15:0;;:53;;58490:6;58498;58452:53;;;58471:6;58479;58452:53;58433:72;;-1:-1:-1;58433:72:0;-1:-1:-1;;;;;;58522:20:0;;58514:63;;;;-1:-1:-1;;;58514:63:0;;22431:2:1;58514:63:0;;;22413:21:1;22470:2;22450:18;;;22443:30;22509:32;22489:18;;;22482:60;22559:18;;58514:63:0;22403:180:1;58514:63:0;58242:341;;;;;:::o;14:743:1:-;68:5;121:3;114:4;106:6;102:17;98:27;88:2;;143:5;136;129:20;88:2;183:6;170:20;209:4;232:18;228:2;225:26;222:2;;;254:18;;:::i;:::-;300:2;297:1;293:10;323:28;347:2;343;339:11;323:28;:::i;:::-;385:15;;;416:12;;;;448:15;;;482;;;478:24;;475:33;-1:-1:-1;472:2:1;;;525:5;518;511:20;472:2;551:5;542:14;;565:163;579:2;576:1;573:9;565:163;;;636:17;;624:30;;597:1;590:9;;;;;674:12;;;;706;;565:163;;;-1:-1:-1;746:5:1;78:679;-1:-1:-1;;;;;;;78:679:1:o;762:550::-;804:5;857:3;850:4;842:6;838:17;834:27;824:2;;879:5;872;865:20;824:2;919:6;906:20;945:18;941:2;938:26;935:2;;;967:18;;:::i;:::-;1011:55;1054:2;1035:13;;-1:-1:-1;;1031:27:1;1060:4;1027:38;1011:55;:::i;:::-;1091:2;1082:7;1075:19;1137:3;1130:4;1125:2;1117:6;1113:15;1109:26;1106:35;1103:2;;;1158:5;1151;1144:20;1103:2;1227;1220:4;1212:6;1208:17;1201:4;1192:7;1188:18;1175:55;1250:16;;;1268:4;1246:27;1239:42;;;;1254:7;814:498;-1:-1:-1;;814:498:1:o;1317:257::-;1376:6;1429:2;1417:9;1408:7;1404:23;1400:32;1397:2;;;1450:6;1442;1435:22;1397:2;1494:9;1481:23;1513:31;1538:5;1513:31;:::i;:::-;1563:5;1387:187;-1:-1:-1;;;1387:187:1:o;1579:261::-;1649:6;1702:2;1690:9;1681:7;1677:23;1673:32;1670:2;;;1723:6;1715;1708:22;1670:2;1760:9;1754:16;1779:31;1804:5;1779:31;:::i;2119:1111::-;2273:6;2281;2289;2297;2305;2358:3;2346:9;2337:7;2333:23;2329:33;2326:2;;;2380:6;2372;2365:22;2326:2;2424:9;2411:23;2443:31;2468:5;2443:31;:::i;:::-;2493:5;-1:-1:-1;2550:2:1;2535:18;;2522:32;2563:33;2522:32;2563:33;:::i;:::-;2615:7;-1:-1:-1;2673:2:1;2658:18;;2645:32;2696:18;2726:14;;;2723:2;;;2758:6;2750;2743:22;2723:2;2786:61;2839:7;2830:6;2819:9;2815:22;2786:61;:::i;:::-;2776:71;;2900:2;2889:9;2885:18;2872:32;2856:48;;2929:2;2919:8;2916:16;2913:2;;;2950:6;2942;2935:22;2913:2;2978:63;3033:7;3022:8;3011:9;3007:24;2978:63;:::i;:::-;2968:73;;3094:3;3083:9;3079:19;3066:33;3050:49;;3124:2;3114:8;3111:16;3108:2;;;3145:6;3137;3130:22;3108:2;;3173:51;3216:7;3205:8;3194:9;3190:24;3173:51;:::i;:::-;3163:61;;;2316:914;;;;;;;;:::o;3235:685::-;3330:6;3338;3346;3354;3407:3;3395:9;3386:7;3382:23;3378:33;3375:2;;;3429:6;3421;3414:22;3375:2;3473:9;3460:23;3492:31;3517:5;3492:31;:::i;:::-;3542:5;-1:-1:-1;3599:2:1;3584:18;;3571:32;3612:33;3571:32;3612:33;:::i;:::-;3664:7;-1:-1:-1;3718:2:1;3703:18;;3690:32;;-1:-1:-1;3773:2:1;3758:18;;3745:32;3800:18;3789:30;;3786:2;;;3837:6;3829;3822:22;3786:2;3865:49;3906:7;3897:6;3886:9;3882:22;3865:49;:::i;:::-;3855:59;;;3365:555;;;;;;;:::o;3925:754::-;4029:6;4037;4045;4053;4061;4114:3;4102:9;4093:7;4089:23;4085:33;4082:2;;;4136:6;4128;4121:22;4082:2;4180:9;4167:23;4199:31;4224:5;4199:31;:::i;:::-;4249:5;-1:-1:-1;4306:2:1;4291:18;;4278:32;4319:33;4278:32;4319:33;:::i;:::-;4371:7;-1:-1:-1;4425:2:1;4410:18;;4397:32;;-1:-1:-1;4476:2:1;4461:18;;4448:32;;-1:-1:-1;4531:3:1;4516:19;;4503:33;4559:18;4548:30;;4545:2;;;4596:6;4588;4581:22;4545:2;4624:49;4665:7;4656:6;4645:9;4641:22;4624:49;:::i;4684:297::-;4751:6;4804:2;4792:9;4783:7;4779:23;4775:32;4772:2;;;4825:6;4817;4810:22;4772:2;4862:9;4856:16;4915:5;4908:13;4901:21;4894:5;4891:32;4881:2;;4942:6;4934;4927:22;4986:352;5044:6;5097:2;5085:9;5076:7;5072:23;5068:32;5065:2;;;5118:6;5110;5103:22;5065:2;5162:9;5149:23;-1:-1:-1;;;;;;5205:5:1;5201:78;5194:5;5191:89;5181:2;;5299:6;5291;5284:22;5343:190;5402:6;5455:2;5443:9;5434:7;5430:23;5426:32;5423:2;;;5476:6;5468;5461:22;5423:2;-1:-1:-1;5504:23:1;;5413:120;-1:-1:-1;5413:120:1:o;5538:194::-;5608:6;5661:2;5649:9;5640:7;5636:23;5632:32;5629:2;;;5682:6;5674;5667:22;5629:2;-1:-1:-1;5710:16:1;;5619:113;-1:-1:-1;5619:113:1:o;5737:325::-;5805:6;5813;5866:2;5854:9;5845:7;5841:23;5837:32;5834:2;;;5887:6;5879;5872:22;5834:2;5928:9;5915:23;5905:33;;5988:2;5977:9;5973:18;5960:32;6001:31;6026:5;6001:31;:::i;:::-;6051:5;6041:15;;;5824:238;;;;;:::o;6067:762::-;6203:6;6211;6219;6227;6280:3;6268:9;6259:7;6255:23;6251:33;6248:2;;;6302:6;6294;6287:22;6248:2;6343:9;6330:23;6320:33;;6404:2;6393:9;6389:18;6376:32;6427:18;6468:2;6460:6;6457:14;6454:2;;;6489:6;6481;6474:22;6454:2;6517:61;6570:7;6561:6;6550:9;6546:22;6517:61;:::i;:::-;6507:71;;6631:2;6620:9;6616:18;6603:32;6587:48;;6660:2;6650:8;6647:16;6644:2;;;6681:6;6673;6666:22;6644:2;;6709:63;6764:7;6753:8;6742:9;6738:24;6709:63;:::i;:::-;6238:591;;;;-1:-1:-1;6699:73:1;;6819:2;6804:18;6791:32;;-1:-1:-1;;;6238:591:1:o;6834:898::-;6979:6;6987;6995;7003;7011;7064:3;7052:9;7043:7;7039:23;7035:33;7032:2;;;7086:6;7078;7071:22;7032:2;7127:9;7114:23;7104:33;;7188:2;7177:9;7173:18;7160:32;7211:18;7252:2;7244:6;7241:14;7238:2;;;7273:6;7265;7258:22;7238:2;7301:61;7354:7;7345:6;7334:9;7330:22;7301:61;:::i;:::-;7291:71;;7415:2;7404:9;7400:18;7387:32;7371:48;;7444:2;7434:8;7431:16;7428:2;;;7465:6;7457;7450:22;7428:2;;7493:63;7548:7;7537:8;7526:9;7522:24;7493:63;:::i;:::-;7483:73;;;7603:2;7592:9;7588:18;7575:32;7565:42;;7657:3;7646:9;7642:19;7629:33;7671:31;7696:5;7671:31;:::i;:::-;7721:5;7711:15;;;7022:710;;;;;;;;:::o;7737:831::-;7882:6;7890;7898;7906;7914;7967:3;7955:9;7946:7;7942:23;7938:33;7935:2;;;7989:6;7981;7974:22;7935:2;8030:9;8017:23;8007:33;;8091:2;8080:9;8076:18;8063:32;8114:18;8155:2;8147:6;8144:14;8141:2;;;8176:6;8168;8161:22;8141:2;8204:61;8257:7;8248:6;8237:9;8233:22;8204:61;:::i;:::-;8194:71;;8318:2;8307:9;8303:18;8290:32;8274:48;;8347:2;8337:8;8334:16;8331:2;;;8368:6;8360;8353:22;8331:2;;8396:63;8451:7;8440:8;8429:9;8425:24;8396:63;:::i;:::-;7925:643;;;;-1:-1:-1;8386:73:1;;8506:2;8491:18;;8478:32;;-1:-1:-1;8557:3:1;8542:19;8529:33;;7925:643;-1:-1:-1;;;7925:643:1:o;8573:967::-;8727:6;8735;8743;8751;8759;8767;8820:3;8808:9;8799:7;8795:23;8791:33;8788:2;;;8842:6;8834;8827:22;8788:2;8883:9;8870:23;8860:33;;8944:2;8933:9;8929:18;8916:32;8967:18;9008:2;9000:6;8997:14;8994:2;;;9029:6;9021;9014:22;8994:2;9057:61;9110:7;9101:6;9090:9;9086:22;9057:61;:::i;:::-;9047:71;;9171:2;9160:9;9156:18;9143:32;9127:48;;9200:2;9190:8;9187:16;9184:2;;;9221:6;9213;9206:22;9184:2;;9249:63;9304:7;9293:8;9282:9;9278:24;9249:63;:::i;:::-;9239:73;;;9359:2;9348:9;9344:18;9331:32;9321:42;;9410:3;9399:9;9395:19;9382:33;9372:43;;9465:3;9454:9;9450:19;9437:33;9479:31;9504:5;9479:31;:::i;:::-;9529:5;9519:15;;;8778:762;;;;;;;;:::o;9545:504::-;9647:6;9655;9663;9716:2;9704:9;9695:7;9691:23;9687:32;9684:2;;;9737:6;9729;9722:22;9684:2;9778:9;9765:23;9755:33;;9839:2;9828:9;9824:18;9811:32;9866:18;9858:6;9855:30;9852:2;;;9903:6;9895;9888:22;9852:2;9931:61;9984:7;9975:6;9964:9;9960:22;9931:61;:::i;:::-;9921:71;;;10039:2;10028:9;10024:18;10011:32;10001:42;;9674:375;;;;;:::o;10054:640::-;10165:6;10173;10181;10189;10242:3;10230:9;10221:7;10217:23;10213:33;10210:2;;;10264:6;10256;10249:22;10210:2;10305:9;10292:23;10282:33;;10366:2;10355:9;10351:18;10338:32;10393:18;10385:6;10382:30;10379:2;;;10430:6;10422;10415:22;10379:2;10458:61;10511:7;10502:6;10491:9;10487:22;10458:61;:::i;:::-;10448:71;;;10566:2;10555:9;10551:18;10538:32;10528:42;;10620:2;10609:9;10605:18;10592:32;10633:31;10658:5;10633:31;:::i;:::-;10200:494;;;;-1:-1:-1;10200:494:1;;-1:-1:-1;;10200:494:1:o;10699:573::-;10810:6;10818;10826;10834;10887:3;10875:9;10866:7;10862:23;10858:33;10855:2;;;10909:6;10901;10894:22;10855:2;10950:9;10937:23;10927:33;;11011:2;11000:9;10996:18;10983:32;11038:18;11030:6;11027:30;11024:2;;;11075:6;11067;11060:22;11024:2;11103:61;11156:7;11147:6;11136:9;11132:22;11103:61;:::i;:::-;10845:427;;11093:71;;-1:-1:-1;;;;11211:2:1;11196:18;;11183:32;;11262:2;11247:18;11234:32;;10845:427;-1:-1:-1;10845:427:1:o;11277:709::-;11397:6;11405;11413;11421;11429;11482:3;11470:9;11461:7;11457:23;11453:33;11450:2;;;11504:6;11496;11489:22;11450:2;11545:9;11532:23;11522:33;;11606:2;11595:9;11591:18;11578:32;11633:18;11625:6;11622:30;11619:2;;;11670:6;11662;11655:22;11619:2;11698:61;11751:7;11742:6;11731:9;11727:22;11698:61;:::i;:::-;11688:71;;;11806:2;11795:9;11791:18;11778:32;11768:42;;11857:2;11846:9;11842:18;11829:32;11819:42;;11911:3;11900:9;11896:19;11883:33;11925:31;11950:5;11925:31;:::i;11991:316::-;12079:6;12087;12095;12148:2;12136:9;12127:7;12123:23;12119:32;12116:2;;;12169:6;12161;12154:22;12116:2;12203:9;12197:16;12187:26;;12253:2;12242:9;12238:18;12232:25;12222:35;;12297:2;12286:9;12282:18;12276:25;12266:35;;12106:201;;;;;:::o;12312:437::-;12365:3;12403:5;12397:12;12430:6;12425:3;12418:19;12456:4;12485:2;12480:3;12476:12;12469:19;;12522:2;12515:5;12511:14;12543:3;12555:169;12569:6;12566:1;12563:13;12555:169;;;12630:13;;12618:26;;12664:12;;;;12699:15;;;;12591:1;12584:9;12555:169;;;-1:-1:-1;12740:3:1;;12373:376;-1:-1:-1;;;;;12373:376:1:o;13092:274::-;13221:3;13259:6;13253:13;13275:53;13321:6;13316:3;13309:4;13301:6;13297:17;13275:53;:::i;:::-;13344:16;;;;;13229:137;-1:-1:-1;;13229:137:1:o;14628:915::-;15004:4;-1:-1:-1;;;;;15114:2:1;15106:6;15102:15;15091:9;15084:34;15166:2;15158:6;15154:15;15149:2;15138:9;15134:18;15127:43;;15206:3;15201:2;15190:9;15186:18;15179:31;15233:57;15285:3;15274:9;15270:19;15262:6;15233:57;:::i;:::-;15338:9;15330:6;15326:22;15321:2;15310:9;15306:18;15299:50;15372:44;15409:6;15401;15372:44;:::i;:::-;15453:22;;;15447:3;15432:19;;;15425:51;;;;-1:-1:-1;15485:20:1;;15534:2;15522:15;;15013:530;-1:-1:-1;;;;15013:530:1:o;17337:465::-;17594:2;17583:9;17576:21;17557:4;17620:56;17672:2;17661:9;17657:18;17649:6;17620:56;:::i;:::-;17724:9;17716:6;17712:22;17707:2;17696:9;17692:18;17685:50;17752:44;17789:6;17781;17752:44;:::i;19264:383::-;19413:2;19402:9;19395:21;19376:4;19445:6;19439:13;19488:6;19483:2;19472:9;19468:18;19461:34;19504:66;19563:6;19558:2;19547:9;19543:18;19538:2;19530:6;19526:15;19504:66;:::i;:::-;19631:2;19610:15;-1:-1:-1;;19606:29:1;19591:45;;;;19638:2;19587:54;;19385:262;-1:-1:-1;;19385:262:1:o;24482:275::-;24553:2;24547:9;24618:2;24599:13;;-1:-1:-1;;24595:27:1;24583:40;;24653:18;24638:34;;24674:22;;;24635:62;24632:2;;;24700:18;;:::i;:::-;24736:2;24729:22;24527:230;;-1:-1:-1;24527:230:1:o;24762:128::-;24802:3;24833:1;24829:6;24826:1;24823:13;24820:2;;;24839:18;;:::i;:::-;-1:-1:-1;24875:9:1;;24810:80::o;24895:168::-;24935:7;25001:1;24997;24993:6;24989:14;24986:1;24983:21;24978:1;24971:9;24964:17;24960:45;24957:2;;;25008:18;;:::i;:::-;-1:-1:-1;25048:9:1;;24947:116::o;25068:125::-;25108:4;25136:1;25133;25130:8;25127:2;;;25141:18;;:::i;:::-;-1:-1:-1;25178:9:1;;25117:76::o;25198:258::-;25270:1;25280:113;25294:6;25291:1;25288:13;25280:113;;;25370:11;;;25364:18;25351:11;;;25344:39;25316:2;25309:10;25280:113;;;25411:6;25408:1;25405:13;25402:2;;;25446:1;25437:6;25432:3;25428:16;25421:27;25402:2;;25251:205;;;:::o;25461:135::-;25500:3;-1:-1:-1;;25521:17:1;;25518:2;;;25541:18;;:::i;:::-;-1:-1:-1;25588:1:1;25577:13;;25508:88::o;25601:184::-;-1:-1:-1;;;25650:1:1;25643:88;25750:4;25747:1;25740:15;25774:4;25771:1;25764:15;25790:184;-1:-1:-1;;;25839:1:1;25832:88;25939:4;25936:1;25929:15;25963:4;25960:1;25953:15;25979:154;-1:-1:-1;;;;;26058:5:1;26054:54;26047:5;26044:65;26034:2;;26123:1;26120;26113:12
Swarm Source
ipfs://7a358e96b784a15df14ed45c5e48466d9776da9f64ca46ea73660fb9b2903f6c
Loading...
Loading
Loading...
Loading
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.