Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 49 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Cancel Swap Inte... | 16735177 | 567 days ago | IN | 0 ETH | 0.01185859 | ||||
Create Swap Inte... | 16709946 | 571 days ago | IN | 0 ETH | 0.00780498 | ||||
Cancel Swap Inte... | 16709926 | 571 days ago | IN | 0 ETH | 0.00290483 | ||||
Cancel Swap Inte... | 16709922 | 571 days ago | IN | 0 ETH | 0.00286094 | ||||
Create Swap Inte... | 16708449 | 571 days ago | IN | 0 ETH | 0.00918589 | ||||
Set Whitelist | 16708401 | 571 days ago | IN | 0 ETH | 0.00050481 | ||||
Set Whitelist | 16708323 | 571 days ago | IN | 0 ETH | 0.00045804 | ||||
Set Whitelist | 16708317 | 571 days ago | IN | 0 ETH | 0.00042118 | ||||
Transfer Ownersh... | 15640387 | 720 days ago | IN | 0 ETH | 0.00067639 | ||||
Close Swap Inten... | 15549166 | 733 days ago | IN | 0 ETH | 0.00148383 | ||||
Create Swap Inte... | 15549154 | 733 days ago | IN | 0 ETH | 0.00277543 | ||||
Cancel Swap Inte... | 15540213 | 734 days ago | IN | 0 ETH | 0.00337237 | ||||
Create Swap Inte... | 15540150 | 734 days ago | IN | 0 ETH | 0.01208147 | ||||
Set Whitelist | 15459364 | 748 days ago | IN | 0 ETH | 0.00036911 | ||||
Set Whitelist | 15410471 | 755 days ago | IN | 0 ETH | 0.00077166 | ||||
Close Swap Inten... | 15407460 | 756 days ago | IN | 9 ETH | 0.00166925 | ||||
Create Swap Inte... | 15407442 | 756 days ago | IN | 0 ETH | 0.00273882 | ||||
Create Swap Inte... | 15407322 | 756 days ago | IN | 0 ETH | 0.00289656 | ||||
Close Swap Inten... | 15407259 | 756 days ago | IN | 0 ETH | 0.00238601 | ||||
Create Swap Inte... | 15407253 | 756 days ago | IN | 0 ETH | 0.00390261 | ||||
Cancel Swap Inte... | 15407231 | 756 days ago | IN | 0 ETH | 0.00123428 | ||||
Cancel Swap Inte... | 15407195 | 756 days ago | IN | 0 ETH | 0.00102667 | ||||
Create Swap Inte... | 15407168 | 756 days ago | IN | 0 ETH | 0.00383092 | ||||
Cancel Swap Inte... | 15392178 | 758 days ago | IN | 0 ETH | 0.00384595 | ||||
Create Swap Inte... | 15392164 | 758 days ago | IN | 0 ETH | 0.01180347 |
Loading...
Loading
Contract Name:
VaultSwap
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; pragma abicoder v2; // import "hardhat/console.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; /* solhint-disable not-rely-on-time */ //Interface abstract contract ERC20Interface { function transferFrom( address from, address to, uint256 tokenId ) public virtual; function transfer(address recipient, uint256 amount) public virtual; } abstract contract ERC721Interface { function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual; function balanceOf(address owner) public view virtual returns (uint256 balance); } abstract contract ERC1155Interface { function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual; } abstract contract CustomInterface { function bridgeSafeTransferFrom( address dapp, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual; } contract VaultSwap is Ownable, Pausable, ReentrancyGuard, IERC721Receiver, IERC1155Receiver { using Counters for Counters.Counter; uint8 public constant VAULTSWAP_VERSION = 1; // Struct Payment struct PaymentStruct { bool status; uint256 value; } // Swap Struct struct SwapStruct { address dapp; // dapp asset contract address, needs to be white-listed AssetType typeStd; // the type? (TODO maybe change to enum) uint256[] tokenId; // list of asset ids (only 0 used i ncase of non-erc1155) uint256[] blc; // bytes data; } // Swap Status enum SwapStatus { Pending, Completed, Canceled } enum AssetType { ERC20, ERC721, ERC1155, CUSTOM } // SwapIntent Struct struct SwapIntent { uint256 id; address payable addressOne; uint256 valueOne; // must address payable addressTwo; // must uint256 valueTwo; // must uint256 swapStart; uint256 swapEnd; uint256 swapFee; SwapStatus status; } address[] public swapVaultNFTs; // is used to list users that pay no fees (give them vip nfts) address payable public vaultAddress; // to pay fees mapping(address => address) public dappRelations; // to specify contracts for custom interfaced smart contracts bytes32 public _whiteListMerkleRoot; // whitelist of tokens bool public whiteListEnabled; Counters.Counter private _swapIds; // Flag for the createSwap bool private swapFlag; // NFT Mapping mapping(uint256 => SwapStruct[]) public nftsOne; // assets to trade for initiators mapping(uint256 => SwapStruct[]) public nftsTwo; // assets to trade for confirtmators // Mapping key/value for get the swap infos mapping(address => SwapIntent[]) public swapList; // storing swaps of each user mapping(uint256 => uint256) public swapMatch; // to check swap_id => number in order of the user's swaps // Struct for the payment rules PaymentStruct public payment; // Events event SwapEvent( address indexed _creator, uint256 indexed time, SwapStatus indexed _status, uint256 _swapId, address _swapCounterPart ); // Events event EditCounterPartEvent(address _creator, uint256 time, uint256 _swapId, address _swapCounterPart); event WhiteListChange(address _dapp, bool _status); event PaymentReceived(address indexed _payer, uint256 _value); // solhint-disable-next-line func-visibility constructor(address[] memory _swapVaultNFTs, address _vaultAddress) { swapVaultNFTs = _swapVaultNFTs; vaultAddress = payable(_vaultAddress); } receive() external payable { emit PaymentReceived(msg.sender, msg.value); } /* solhint-disable no-unused-vars */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external override returns (bytes4) { return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")); } function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external override returns (bytes4) { return bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")); } function onERC1155BatchReceived( address operator, address from, uint256[] calldata id, uint256[] calldata value, bytes calldata data ) external override returns (bytes4) { return bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")); } /* solhint-enable no-unused-vars */ function getWeiPayValueAmount() external view returns (uint256) { return payment.value; } // Get swap infos function getSwapListByAddress(address _creator) external view returns (SwapIntent[] memory) { return swapList[_creator]; } // Get swap infos function getSwapIntentByAddress(address _creator, uint256 _swapId) external view returns (SwapIntent memory) { return swapList[_creator][swapMatch[_swapId]]; } // Get SwapStructLength function getSwapStructSize(uint256 _swapId, bool _nfts) external view returns (uint256) { if (_nfts) return nftsOne[_swapId].length; else return nftsTwo[_swapId].length; } // Get SwapStruct function getSwapStruct( uint256 _swapId, bool _nfts, uint256 _index ) external view returns (SwapStruct memory) { if (_nfts) return nftsOne[_swapId][_index]; else return nftsTwo[_swapId][_index]; } // Get SwapStruct function getSwapStructs(uint256 _swapId, bool _nfts) external view returns (SwapStruct[] memory) { if (_nfts) return nftsOne[_swapId]; else return nftsTwo[_swapId]; } function supportsInterface(bytes4 interfaceID) external view virtual override returns (bool) { return interfaceID == 0x01ffc9a7 || interfaceID == 0x4e2312e0; } function checkWhitelist( SwapStruct[] memory _nftsOne, SwapStruct[] memory _nftsTwo, bytes32[][] calldata merkleProofOne, bytes32[][] calldata merkleProofTwo ) internal view { if (whiteListEnabled) { uint256 i; for (i = 0; i < _nftsOne.length; i++) { bool isWhitelisted = MerkleProof.verify( merkleProofOne[i], _whiteListMerkleRoot, keccak256(abi.encodePacked(_nftsOne[i].dapp)) ); require(isWhitelisted, "Dapp is not supported"); // check if Dapp is supported } for (i = 0; i < _nftsTwo.length; i++) { bool isWhitelisted = MerkleProof.verify( merkleProofTwo[i], _whiteListMerkleRoot, keccak256(abi.encodePacked(_nftsTwo[i].dapp)) ); require(isWhitelisted, "Dapp is not supported"); // check if Dapp is supported } } } function checkPayment() internal view returns (uint256) { if (!payment.status) return 0; uint256 i; for (i = 0; i < swapVaultNFTs.length; i++) { if (ERC721Interface(swapVaultNFTs[i]).balanceOf(msg.sender) != 0) { return 0; } } return payment.value; } function initSwapIntent(SwapIntent memory _swapIntent) private view returns (SwapIntent memory) { _swapIntent.swapFee = checkPayment(); _swapIntent.addressOne = payable(msg.sender); // to ensure that only sender can create swap intents _swapIntent.id = _swapIds.current(); // set swap id _swapIntent.swapStart = block.timestamp; // set the time when swap started _swapIntent.swapEnd = 0; // will be set to non-zero on close/cancel _swapIntent.status = SwapStatus.Pending; // identify the status of the swap return _swapIntent; } // used to transfer all asset types (from) (to) function transferAssetByType( SwapStruct memory _swapStruct, address _from, address _to ) private { if (_swapStruct.typeStd == AssetType.ERC20) { if (_from == address(this)) { ERC20Interface(_swapStruct.dapp).transfer(_to, _swapStruct.blc[0]); } else { ERC20Interface(_swapStruct.dapp).transferFrom(_from, _to, _swapStruct.blc[0]); } } else if (_swapStruct.typeStd == AssetType.ERC721) { uint256 tokenIdIndex; for (tokenIdIndex = 0; tokenIdIndex < _swapStruct.tokenId.length; tokenIdIndex++) { ERC721Interface(_swapStruct.dapp).safeTransferFrom( _from, _to, _swapStruct.tokenId[tokenIdIndex], _swapStruct.data ); } } else if (_swapStruct.typeStd == AssetType.ERC1155) { ERC1155Interface(_swapStruct.dapp).safeBatchTransferFrom( _from, _to, _swapStruct.tokenId, _swapStruct.blc, _swapStruct.data ); } else { address dappRelation = dappRelations[_swapStruct.dapp]; if (_from == address(this)) _from = dappRelation; if (_to == address(this)) _to = dappRelation; CustomInterface(dappRelation).bridgeSafeTransferFrom( _swapStruct.dapp, _from, _to, _swapStruct.tokenId, _swapStruct.blc, _swapStruct.data ); } } // Create Swap function createSwapIntent( SwapIntent memory _swapIntent, SwapStruct[] memory _nftsOne, SwapStruct[] memory _nftsTwo, bytes32[][] calldata merkleProofOne, bytes32[][] calldata merkleProofTwo ) external payable whenNotPaused nonReentrant { // check the payment satisfies _swapIntent = initSwapIntent(_swapIntent); require(msg.value >= _swapIntent.valueOne + _swapIntent.swapFee, "More eth required"); // Bigger eth value required swapMatch[_swapIds.current()] = swapList[msg.sender].length; // specify the number of the swap in the list of user swaps swapList[msg.sender].push(_swapIntent); // add the swpa intent to the user checkWhitelist(_nftsOne, _nftsTwo, merkleProofOne, merkleProofTwo); uint256 i; for (i = 0; i < _nftsOne.length; i++) { nftsOne[_swapIntent.id].push(_nftsOne[i]); // fill swap with initalizer nfts } for (i = 0; i < _nftsTwo.length; i++) { nftsTwo[_swapIntent.id].push(_nftsTwo[i]); // fill swap with respondent nfts } for (i = 0; i < _nftsOne.length; i++) { transferAssetByType(_nftsOne[i], _swapIntent.addressOne, address(this)); } emit SwapEvent(msg.sender, block.timestamp, _swapIntent.status, _swapIntent.id, _swapIntent.addressTwo); _swapIds.increment(); } // Close the swap function closeSwapIntent( address _swapCreator, uint256 _swapId, bytes32[][] calldata merkleProofOne, bytes32[][] calldata merkleProofTwo ) external payable whenNotPaused nonReentrant { SwapIntent memory swapIntentCache = swapList[_swapCreator][swapMatch[_swapId]]; require( swapIntentCache.status == SwapStatus.Pending, "Swap is not opened" // Swap Status is not opened ); require( swapIntentCache.addressTwo == msg.sender, "Not interested counterpart" // Not the interested counterpart ); uint256 paymentValue = checkPayment(); require(msg.value >= swapIntentCache.valueTwo + paymentValue, "More eth required"); // Bigger eth value required if (paymentValue + swapIntentCache.swapFee > 0) vaultAddress.transfer(paymentValue + swapIntentCache.swapFee); swapIntentCache.addressTwo = payable(msg.sender); // to make address payable swapIntentCache.swapEnd = block.timestamp; // set time of swap closing (TODO maybe move in the end) swapIntentCache.status = SwapStatus.Completed; // (TODO maybe move in the end) // solhint-disable-next-line reentrancy swapList[_swapCreator][swapMatch[_swapId]] = swapIntentCache; SwapStruct[] memory _nftsOne = nftsOne[_swapId]; SwapStruct[] memory _nftsTwo = nftsTwo[_swapId]; checkWhitelist(_nftsOne, _nftsTwo, merkleProofOne, merkleProofTwo); // From Owner 2 to Owner 1 for (uint256 i = 0; i < _nftsTwo.length; i++) { transferAssetByType(_nftsTwo[i], swapIntentCache.addressTwo, swapIntentCache.addressOne); } if (swapIntentCache.valueTwo > 0) swapIntentCache.addressOne.transfer(swapIntentCache.valueTwo); // From Owner 1 to Owner 2 for (uint256 i = 0; i < _nftsOne.length; i++) { transferAssetByType(_nftsOne[i], address(this), swapIntentCache.addressTwo); } if (swapIntentCache.valueOne > 0) swapIntentCache.addressTwo.transfer(swapIntentCache.valueOne); emit SwapEvent( msg.sender, block.timestamp, SwapStatus.Completed, _swapId, _swapCreator // temp ); } // Cancel Swap function cancelSwapIntent(address _swapCreator, uint256 _swapId) external nonReentrant { SwapIntent memory swapIntentCache = swapList[_swapCreator][swapMatch[_swapId]]; SwapStruct[] memory _nftsOne = nftsOne[_swapId]; require( swapIntentCache.status == SwapStatus.Pending, "Swap is not opened" // Swap Status is not opened ); require( msg.sender == swapIntentCache.addressOne || msg.sender == swapIntentCache.addressTwo, "Not interested counterpart" // Not the interested counterpart ); //Rollback if (swapIntentCache.swapFee > 0) payable(msg.sender).transfer(swapIntentCache.swapFee); swapIntentCache.swapEnd = block.timestamp; swapIntentCache.status = SwapStatus.Canceled; // solhint-disable-next-line reentrancy swapList[_swapCreator][swapMatch[_swapId]] = swapIntentCache; uint256 i; for (i = 0; i < _nftsOne.length; i++) { transferAssetByType(_nftsOne[i], address(this), swapIntentCache.addressOne); } if (swapIntentCache.valueOne > 0) swapIntentCache.addressOne.transfer(swapIntentCache.valueOne); emit SwapEvent(msg.sender, block.timestamp, SwapStatus.Canceled, _swapId, address(0)); } // Edit CounterPart Address function editCounterPart(uint256 _swapId, address payable _counterPart) external { require( swapList[msg.sender][swapMatch[_swapId]].id == _swapId && msg.sender == swapList[msg.sender][swapMatch[_swapId]].addressOne, "Only for swap initiator" // Only for swap initiator ); swapList[msg.sender][swapMatch[_swapId]].addressTwo = _counterPart; emit EditCounterPartEvent(msg.sender, block.timestamp, _swapId, _counterPart); } // Set SWAPVAULT NFT address function setSwapNftAddresses(address[] memory _swapVaultNFTs) external onlyOwner { swapVaultNFTs = _swapVaultNFTs; } // Set Vault address function setVaultAddress(address payable _vaultAddress) external onlyOwner { vaultAddress = _vaultAddress; } // Handle dapp relations for the bridges function setDappRelation(address _dapp, address _customInterface) external onlyOwner { dappRelations[_dapp] = _customInterface; } // Handle the whitelist function setWhitelist(bytes32 merkleRootTreeHash) external onlyOwner { _whiteListMerkleRoot = merkleRootTreeHash; } // Turn on/off whitelisting by setting opposite boolean function toggleWhitelistEnabled() external onlyOwner { whiteListEnabled = !whiteListEnabled; } // Set the payment function setPayment(bool _status, uint256 _value) external onlyOwner whenNotPaused { payment.status = _status; payment.value = _value * (1 wei); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @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 is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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 { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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 making 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.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 IERC721Receiver { /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @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. * * NOTE: 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. * * NOTE: 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/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); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"_swapVaultNFTs","type":"address[]"},{"internalType":"address","name":"_vaultAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_swapId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_swapCounterPart","type":"address"}],"name":"EditCounterPartEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_payer","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_creator","type":"address"},{"indexed":true,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":true,"internalType":"enum VaultSwap.SwapStatus","name":"_status","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"_swapId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_swapCounterPart","type":"address"}],"name":"SwapEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_dapp","type":"address"},{"indexed":false,"internalType":"bool","name":"_status","type":"bool"}],"name":"WhiteListChange","type":"event"},{"inputs":[],"name":"VAULTSWAP_VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_whiteListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_swapCreator","type":"address"},{"internalType":"uint256","name":"_swapId","type":"uint256"}],"name":"cancelSwapIntent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapCreator","type":"address"},{"internalType":"uint256","name":"_swapId","type":"uint256"},{"internalType":"bytes32[][]","name":"merkleProofOne","type":"bytes32[][]"},{"internalType":"bytes32[][]","name":"merkleProofTwo","type":"bytes32[][]"}],"name":"closeSwapIntent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address payable","name":"addressOne","type":"address"},{"internalType":"uint256","name":"valueOne","type":"uint256"},{"internalType":"address payable","name":"addressTwo","type":"address"},{"internalType":"uint256","name":"valueTwo","type":"uint256"},{"internalType":"uint256","name":"swapStart","type":"uint256"},{"internalType":"uint256","name":"swapEnd","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"enum VaultSwap.SwapStatus","name":"status","type":"uint8"}],"internalType":"struct VaultSwap.SwapIntent","name":"_swapIntent","type":"tuple"},{"components":[{"internalType":"address","name":"dapp","type":"address"},{"internalType":"enum VaultSwap.AssetType","name":"typeStd","type":"uint8"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"blc","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct VaultSwap.SwapStruct[]","name":"_nftsOne","type":"tuple[]"},{"components":[{"internalType":"address","name":"dapp","type":"address"},{"internalType":"enum VaultSwap.AssetType","name":"typeStd","type":"uint8"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"blc","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct VaultSwap.SwapStruct[]","name":"_nftsTwo","type":"tuple[]"},{"internalType":"bytes32[][]","name":"merkleProofOne","type":"bytes32[][]"},{"internalType":"bytes32[][]","name":"merkleProofTwo","type":"bytes32[][]"}],"name":"createSwapIntent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dappRelations","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapId","type":"uint256"},{"internalType":"address payable","name":"_counterPart","type":"address"}],"name":"editCounterPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"uint256","name":"_swapId","type":"uint256"}],"name":"getSwapIntentByAddress","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address payable","name":"addressOne","type":"address"},{"internalType":"uint256","name":"valueOne","type":"uint256"},{"internalType":"address payable","name":"addressTwo","type":"address"},{"internalType":"uint256","name":"valueTwo","type":"uint256"},{"internalType":"uint256","name":"swapStart","type":"uint256"},{"internalType":"uint256","name":"swapEnd","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"enum VaultSwap.SwapStatus","name":"status","type":"uint8"}],"internalType":"struct VaultSwap.SwapIntent","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"}],"name":"getSwapListByAddress","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address payable","name":"addressOne","type":"address"},{"internalType":"uint256","name":"valueOne","type":"uint256"},{"internalType":"address payable","name":"addressTwo","type":"address"},{"internalType":"uint256","name":"valueTwo","type":"uint256"},{"internalType":"uint256","name":"swapStart","type":"uint256"},{"internalType":"uint256","name":"swapEnd","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"enum VaultSwap.SwapStatus","name":"status","type":"uint8"}],"internalType":"struct VaultSwap.SwapIntent[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapId","type":"uint256"},{"internalType":"bool","name":"_nfts","type":"bool"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getSwapStruct","outputs":[{"components":[{"internalType":"address","name":"dapp","type":"address"},{"internalType":"enum VaultSwap.AssetType","name":"typeStd","type":"uint8"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"blc","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct VaultSwap.SwapStruct","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapId","type":"uint256"},{"internalType":"bool","name":"_nfts","type":"bool"}],"name":"getSwapStructSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapId","type":"uint256"},{"internalType":"bool","name":"_nfts","type":"bool"}],"name":"getSwapStructs","outputs":[{"components":[{"internalType":"address","name":"dapp","type":"address"},{"internalType":"enum VaultSwap.AssetType","name":"typeStd","type":"uint8"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"blc","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct VaultSwap.SwapStruct[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWeiPayValueAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftsOne","outputs":[{"internalType":"address","name":"dapp","type":"address"},{"internalType":"enum VaultSwap.AssetType","name":"typeStd","type":"uint8"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftsTwo","outputs":[{"internalType":"address","name":"dapp","type":"address"},{"internalType":"enum VaultSwap.AssetType","name":"typeStd","type":"uint8"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"id","type":"uint256[]"},{"internalType":"uint256[]","name":"value","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payment","outputs":[{"internalType":"bool","name":"status","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dapp","type":"address"},{"internalType":"address","name":"_customInterface","type":"address"}],"name":"setDappRelation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setPayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_swapVaultNFTs","type":"address[]"}],"name":"setSwapNftAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_vaultAddress","type":"address"}],"name":"setVaultAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRootTreeHash","type":"bytes32"}],"name":"setWhitelist","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":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"swapList","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address payable","name":"addressOne","type":"address"},{"internalType":"uint256","name":"valueOne","type":"uint256"},{"internalType":"address payable","name":"addressTwo","type":"address"},{"internalType":"uint256","name":"valueTwo","type":"uint256"},{"internalType":"uint256","name":"swapStart","type":"uint256"},{"internalType":"uint256","name":"swapEnd","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"enum VaultSwap.SwapStatus","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"swapMatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"swapVaultNFTs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleWhitelistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200470d3803806200470d83398101604081905262000034916200017b565b6200003f336200008d565b6000805460ff60a01b1916905560018055815162000065906002906020850190620000dd565b50600380546001600160a01b0319166001600160a01b03929092169190911790555062000279565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821562000135579160200282015b828111156200013557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620000fe565b506200014392915062000147565b5090565b5b8082111562000143576000815560010162000148565b80516001600160a01b03811681146200017657600080fd5b919050565b600080604083850312156200018e578182fd5b82516001600160401b0380821115620001a5578384fd5b818501915085601f830112620001b9578384fd5b8151602082821115620001d057620001d062000263565b8160051b604051601f19603f83011681018181108682111715620001f857620001f862000263565b604052838152828101945085830182870184018b101562000217578889fd5b8896505b8487101562000244576200022f816200015e565b8652600196909601959483019483016200021b565b5096506200025690508782016200015e565b9450505050509250929050565b634e487b7160e01b600052604160045260246000fd5b61448480620002896000396000f3fe6080604052600436106102085760003560e01c806385535cc511610118578063bc197c81116100a0578063e2e616bb1161006f578063e2e616bb14610706578063eed188b514610720578063f23a6e6114610735578063f2fde38b1461077b578063f36669dc1461079b57600080fd5b8063bc197c811461065c578063bd79007d146106a4578063c66b5cca146106d3578063cf14e557146106e657600080fd5b80638e5f0203116100e75780638e5f0203146105a05780639ec5e7ae146105b3578063a68ae695146105e0578063aca8eaf014610615578063b78030781461063c57600080fd5b806385535cc5146104ff57806387f351651461051f5780638da5cb5b146105555780638e0c4f871461057357600080fd5b8063430bf08a1161019b5780634b7eb7201161016a5780634b7eb7201461045e5780635c975abb1461048b57806368026049146104aa57806368eb640d146104ca578063715018a6146104ea57600080fd5b8063430bf08a146103d1578063440bc7f31461040957806346fd12681461042957806349bc9fcb1461043e57600080fd5b806323e0aa4c116101d757806323e0aa4c1461032d57806325d4eeb01461035a57806342a229171461037c57806342f6487a1461039c57600080fd5b806301ffc9a714610249578063041fa44e1461027e578063150b7a02146102a257806319ba5e731461030057600080fd5b366102445760405134815233907f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7709060200160405180910390a2005b600080fd5b34801561025557600080fd5b50610269610264366004613bdc565b6107bb565b60405190151581526020015b60405180910390f35b34801561028a57600080fd5b5061029460055481565b604051908152602001610275565b3480156102ae57600080fd5b506102e76102bd366004613984565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b6040516001600160e01b03199091168152602001610275565b34801561030c57600080fd5b5061032061031b366004613a6d565b6107f2565b6040516102759190614205565b34801561033957600080fd5b5061034d610348366004613dad565b610914565b6040516102759190614214565b34801561036657600080fd5b5061037a610375366004613ba9565b610b78565b005b34801561038857600080fd5b50610294610397366004613d82565b610bf5565b3480156103a857600080fd5b50600d54600e546103ba9160ff169082565b604080519215158352602083019190915201610275565b3480156103dd57600080fd5b506003546103f1906001600160a01b031681565b6040516001600160a01b039091168152602001610275565b34801561041557600080fd5b5061037a610424366004613bc4565b610c27565b34801561043557600080fd5b5061037a610c56565b34801561044a57600080fd5b5061037a610459366004613a6d565b610c94565b34801561046a57600080fd5b5061047e610479366004613d82565b611317565b604051610275919061410e565b34801561049757600080fd5b50600054600160a01b900460ff16610269565b3480156104b657600080fd5b506103f16104c5366004613bc4565b61172c565b3480156104d657600080fd5b5061037a6104e5366004613892565b611756565b3480156104f657600080fd5b5061037a6117ae565b34801561050b57600080fd5b5061037a61051a366004613876565b6117e4565b34801561052b57600080fd5b506103f161053a366004613876565b6004602052600090815260409020546001600160a01b031681565b34801561056157600080fd5b506000546001600160a01b03166103f1565b34801561057f57600080fd5b5061029461058e366004613bc4565b600c6020526000908152604090205481565b61037a6105ae366004613a98565b611830565b3480156105bf57600080fd5b506105d36105ce366004613876565b61220c565b60405161027591906140bf565b3480156105ec57600080fd5b506106006105fb366004613a6d565b612334565b60405161027599989796959493929190614227565b34801561062157600080fd5b5061062a600181565b60405160ff9091168152602001610275565b34801561064857600080fd5b5061037a610657366004613b0e565b6123ad565b34801561066857600080fd5b506102e76106773660046138ca565b7fbc197c819b3e337a6f9652dd10becd7eef83032af3b9d958d3d42f669414662198975050505050505050565b3480156106b057600080fd5b506106c46106bf366004613de1565b6123ee565b60405161027593929190614090565b61037a6106e1366004613c04565b6124c8565b3480156106f257600080fd5b5061037a610701366004613d5e565b6129c7565b34801561071257600080fd5b506006546102699060ff1681565b34801561072c57600080fd5b50600e54610294565b34801561074157600080fd5b506102e76107503660046139f4565b7ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf979695505050505050565b34801561078757600080fd5b5061037a610796366004613876565b612b85565b3480156107a757600080fd5b506106c46107b6366004613de1565b612c20565b60006301ffc9a760e01b6001600160e01b0319831614806107ec5750630271189760e51b6001600160e01b03198316145b92915050565b6107fa613413565b6001600160a01b0383166000908152600b60209081526040808320858452600c909252909120548154811061083f57634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260099093029091018054835260018101546001600160a01b0390811694840194909452600280820154928401929092526003810154909316606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e0830152600883015491929161010084019160ff909116908111156108eb57634e487b7160e01b600052602160045260246000fd5b600281111561090a57634e487b7160e01b600052602160045260246000fd5b9052509392505050565b6109476040805160a081019091526000808252602082019081526020016060815260200160608152602001606081525090565b8215610b4357600084815260096020526040902080548390811061097b57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160a0810190915260049092020180546001600160a01b0381168352919290919083019060ff600160a01b9091041660038111156109d757634e487b7160e01b600052602160045260246000fd5b60038111156109f657634e487b7160e01b600052602160045260246000fd5b815260200160018201805480602002602001604051908101604052809291908181526020018280548015610a4957602002820191906000526020600020905b815481526020019060010190808311610a35575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610aa157602002820191906000526020600020905b815481526020019060010190808311610a8d575b50505050508152602001600382018054610aba906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae6906143a1565b8015610b335780601f10610b0857610100808354040283529160200191610b33565b820191906000526020600020905b815481529060010190602001808311610b1657829003601f168201915b5050505050815250509050610b71565b6000848152600a6020526040902080548390811061097b57634e487b7160e01b600052603260045260246000fd5b9392505050565b6000546001600160a01b03163314610bab5760405162461bcd60e51b8152600401610ba290614199565b60405180910390fd5b600054600160a01b900460ff1615610bd55760405162461bcd60e51b8152600401610ba29061416f565b600d805460ff1916831515179055610bee816001614382565b600e555050565b60008115610c1257506000828152600960205260409020546107ec565b506000828152600a60205260409020546107ec565b6000546001600160a01b03163314610c515760405162461bcd60e51b8152600401610ba290614199565b600555565b6000546001600160a01b03163314610c805760405162461bcd60e51b8152600401610ba290614199565b6006805460ff19811660ff90911615179055565b60026001541415610cb75760405162461bcd60e51b8152600401610ba2906141ce565b60026001556001600160a01b0382166000908152600b60209081526040808320848452600c90925282205481548110610d0057634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260099093029091018054835260018101546001600160a01b0390811694840194909452600280820154928401929092526003810154909316606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e0830152600883015491929161010084019160ff90911690811115610dac57634e487b7160e01b600052602160045260246000fd5b6002811115610dcb57634e487b7160e01b600052602160045260246000fd5b905250600083815260096020908152604080832080548251818502810185019093528083529495509293909291849084015b82821015610fd55760008481526020908190206040805160a081019091526004850290910180546001600160a01b03811683529192909190830190600160a01b900460ff166003811115610e6157634e487b7160e01b600052602160045260246000fd5b6003811115610e8057634e487b7160e01b600052602160045260246000fd5b815260200160018201805480602002602001604051908101604052809291908181526020018280548015610ed357602002820191906000526020600020905b815481526020019060010190808311610ebf575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610f2b57602002820191906000526020600020905b815481526020019060010190808311610f17575b50505050508152602001600382018054610f44906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f70906143a1565b8015610fbd5780601f10610f9257610100808354040283529160200191610fbd565b820191906000526020600020905b815481529060010190602001808311610fa057829003601f168201915b50505050508152505081526020019060010190610dfd565b5092935060009250610fe5915050565b826101000151600281111561100a57634e487b7160e01b600052602160045260246000fd5b1461104c5760405162461bcd60e51b815260206004820152601260248201527114ddd85c081a5cc81b9bdd081bdc195b995960721b6044820152606401610ba2565b81602001516001600160a01b0316336001600160a01b03161480611085575081606001516001600160a01b0316336001600160a01b0316145b6110d15760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420696e746572657374656420636f756e746572706172740000000000006044820152606401610ba2565b60e08201511561110d5760e0820151604051339180156108fc02916000818181858888f1935050505015801561110b573d6000803e3d6000fd5b505b4260c083015260026101008301526001600160a01b0384166000908152600b60209081526040808320868452600c90925290912054815484929190811061116457634e487b7160e01b600052603260045260246000fd5b600091825260209182902083516009929092020190815590820151600180830180546001600160a01b03199081166001600160a01b03948516179091556040850151600280860191909155606086015160038601805490931694169390931790556080840151600484015560a0840151600584015560c0840151600684015560e084015160078401556101008401516008840180549193909260ff199092169190849081111561122457634e487b7160e01b600052602160045260246000fd5b021790555090505060005b81518110156112805761126e82828151811061125b57634e487b7160e01b600052603260045260246000fd5b6020026020010151308560200151612c3c565b80611278816143dc565b91505061122f565b6040830151156112cd5782602001516001600160a01b03166108fc84604001519081150290604051600060405180830381858888f193505050501580156112cb573d6000803e3d6000fd5b505b60026040805186815260006020820152429133917fe04ebff38f5d8c549e62b96e4e558604e8078d05596368a9a0841db9567f1c73910160405180910390a4505060018055505050565b6060811561152b57600083815260096020908152604080832080548251818502810185019093528083529193909284015b828210156115205760008481526020908190206040805160a081019091526004850290910180546001600160a01b03811683529192909190830190600160a01b900460ff1660038111156113ac57634e487b7160e01b600052602160045260246000fd5b60038111156113cb57634e487b7160e01b600052602160045260246000fd5b81526020016001820180548060200260200160405190810160405280929190818152602001828054801561141e57602002820191906000526020600020905b81548152602001906001019080831161140a575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561147657602002820191906000526020600020905b815481526020019060010190808311611462575b5050505050815260200160038201805461148f906143a1565b80601f01602080910402602001604051908101604052809291908181526020018280546114bb906143a1565b80156115085780601f106114dd57610100808354040283529160200191611508565b820191906000526020600020905b8154815290600101906020018083116114eb57829003601f168201915b50505050508152505081526020019060010190611348565b5050505090506107ec565b6000838152600a6020908152604080832080548251818502810185019093528083529193909284015b828210156115205760008481526020908190206040805160a081019091526004850290910180546001600160a01b03811683529192909190830190600160a01b900460ff1660038111156115b857634e487b7160e01b600052602160045260246000fd5b60038111156115d757634e487b7160e01b600052602160045260246000fd5b81526020016001820180548060200260200160405190810160405280929190818152602001828054801561162a57602002820191906000526020600020905b815481526020019060010190808311611616575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561168257602002820191906000526020600020905b81548152602001906001019080831161166e575b5050505050815260200160038201805461169b906143a1565b80601f01602080910402602001604051908101604052809291908181526020018280546116c7906143a1565b80156117145780601f106116e957610100808354040283529160200191611714565b820191906000526020600020905b8154815290600101906020018083116116f757829003601f168201915b50505050508152505081526020019060010190611554565b6002818154811061173c57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146117805760405162461bcd60e51b8152600401610ba290614199565b6001600160a01b03918216600090815260046020526040902080546001600160a01b03191691909216179055565b6000546001600160a01b031633146117d85760405162461bcd60e51b8152600401610ba290614199565b6117e26000612fb9565b565b6000546001600160a01b0316331461180e5760405162461bcd60e51b8152600401610ba290614199565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600054600160a01b900460ff161561185a5760405162461bcd60e51b8152600401610ba29061416f565b6002600154141561187d5760405162461bcd60e51b8152600401610ba2906141ce565b60026001556001600160a01b0386166000908152600b60209081526040808320888452600c909252822054815481106118c657634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260099093029091018054835260018101546001600160a01b0390811694840194909452600280820154928401929092526003810154909316606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e0830152600883015491929161010084019160ff9091169081111561197257634e487b7160e01b600052602160045260246000fd5b600281111561199157634e487b7160e01b600052602160045260246000fd5b9052509050600081610100015160028111156119bd57634e487b7160e01b600052602160045260246000fd5b146119ff5760405162461bcd60e51b815260206004820152601260248201527114ddd85c081a5cc81b9bdd081bdc195b995960721b6044820152606401610ba2565b60608101516001600160a01b03163314611a5b5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420696e746572657374656420636f756e746572706172740000000000006044820152606401610ba2565b6000611a65613009565b9050808260800151611a77919061436a565b341015611aba5760405162461bcd60e51b8152602060048201526011602482015270135bdc9948195d1a081c995c5d5a5c9959607a1b6044820152606401610ba2565b60008260e0015182611acc919061436a565b1115611b1e5760035460e08301516001600160a01b03909116906108fc90611af4908461436a565b6040518115909202916000818181858888f19350505050158015611b1c573d6000803e3d6000fd5b505b3360608301524260c083015260016101008301526001600160a01b0388166000908152600b602090815260408083208a8452600c909252909120548154849291908110611b7b57634e487b7160e01b600052603260045260246000fd5b600091825260209182902083516009929092020190815590820151600180830180546001600160a01b03199081166001600160a01b03948516179091556040850151600280860191909155606086015160038601805490931694169390931790556080840151600484015560a0840151600584015560c0840151600684015560e084015160078401556101008401516008840180549193909260ff1990921691908490811115611c3b57634e487b7160e01b600052602160045260246000fd5b02179055505050600087815260096020908152604080832080548251818502810185019093528083529192909190849084015b82821015611e465760008481526020908190206040805160a081019091526004850290910180546001600160a01b03811683529192909190830190600160a01b900460ff166003811115611cd257634e487b7160e01b600052602160045260246000fd5b6003811115611cf157634e487b7160e01b600052602160045260246000fd5b815260200160018201805480602002602001604051908101604052809291908181526020018280548015611d4457602002820191906000526020600020905b815481526020019060010190808311611d30575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611d9c57602002820191906000526020600020905b815481526020019060010190808311611d88575b50505050508152602001600382018054611db5906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611de1906143a1565b8015611e2e5780601f10611e0357610100808354040283529160200191611e2e565b820191906000526020600020905b815481529060010190602001808311611e1157829003601f168201915b50505050508152505081526020019060010190611c6e565b5050505090506000600a60008a8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156120595760008481526020908190206040805160a081019091526004850290910180546001600160a01b03811683529192909190830190600160a01b900460ff166003811115611ee557634e487b7160e01b600052602160045260246000fd5b6003811115611f0457634e487b7160e01b600052602160045260246000fd5b815260200160018201805480602002602001604051908101604052809291908181526020018280548015611f5757602002820191906000526020600020905b815481526020019060010190808311611f43575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611faf57602002820191906000526020600020905b815481526020019060010190808311611f9b575b50505050508152602001600382018054611fc8906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff4906143a1565b80156120415780601f1061201657610100808354040283529160200191612041565b820191906000526020600020905b81548152906001019060200180831161202457829003601f168201915b50505050508152505081526020019060010190611e81565b50505050905061206d82828a8a8a8a6130f5565b60005b81518110156120c5576120b382828151811061209c57634e487b7160e01b600052603260045260246000fd5b602002602001015186606001518760200151612c3c565b806120bd816143dc565b915050612070565b506080840151156121135783602001516001600160a01b03166108fc85608001519081150290604051600060405180830381858888f19350505050158015612111573d6000803e3d6000fd5b505b60005b82518110156121675761215583828151811061214257634e487b7160e01b600052603260045260246000fd5b6020026020010151308760600151612c3c565b8061215f816143dc565b915050612116565b506040840151156121b55783606001516001600160a01b03166108fc85604001519081150290604051600060405180830381858888f193505050501580156121b3573d6000803e3d6000fd5b505b6001604080518b81526001600160a01b038d166020820152429133917fe04ebff38f5d8c549e62b96e4e558604e8078d05596368a9a0841db9567f1c73910160405180910390a45050600180555050505050505050565b6001600160a01b0381166000908152600b60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156123295760008481526020908190206040805161012081018252600986029092018054835260018101546001600160a01b0390811694840194909452600280820154928401929092526003810154909316606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e0830152600883015491929161010084019160ff909116908111156122f757634e487b7160e01b600052602160045260246000fd5b600281111561231657634e487b7160e01b600052602160045260246000fd5b8152505081526020019060010190612244565b505050509050919050565b600b602052816000526040600020818154811061235057600080fd5b60009182526020909120600990910201805460018201546002830154600384015460048501546005860154600687015460078801546008909801549699506001600160a01b03958616985093969290941694909392919060ff1689565b6000546001600160a01b031633146123d75760405162461bcd60e51b8152600401610ba290614199565b80516123ea90600290602084019061348f565b5050565b600a602052816000526040600020818154811061240a57600080fd5b6000918252602090912060049091020180546003820180546001600160a01b0383169550600160a01b90920460ff16935090612445906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054612471906143a1565b80156124be5780601f10612493576101008083540402835291602001916124be565b820191906000526020600020905b8154815290600101906020018083116124a157829003601f168201915b5050505050905083565b600054600160a01b900460ff16156124f25760405162461bcd60e51b8152600401610ba29061416f565b600260015414156125155760405162461bcd60e51b8152600401610ba2906141ce565b600260015561252387613342565b96508660e001518760400151612539919061436a565b34101561257c5760405162461bcd60e51b8152602060048201526011602482015270135bdc9948195d1a081c995c5d5a5c9959607a1b6044820152606401610ba2565b336000908152600b602052604081205490600c9061259960075490565b81526020808201929092526040908101600090812093909355338352600b8252808320805460018181018355918552938390208b51600990950201938455918a015183830180546001600160a01b039283166001600160a01b031991821617909155918b015160028086019190915560608c015160038601805491909316931692909217905560808a0151600484015560a08a0151600584015560c08a0151600684015560e08a015160078401556101008a01516008840180548c95949293919260ff1990911691849081111561268057634e487b7160e01b600052602160045260246000fd5b021790555050506126958686868686866130f5565b60005b86518110156127bc578751600090815260096020526040902087518890839081106126d357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518254600181018455600093845292829020815160049094020180546001600160a01b039094166001600160a01b0319851681178255928201519193909283916001600160a81b03191617600160a01b83600381111561274e57634e487b7160e01b600052602160045260246000fd5b02179055506040820151805161276e9160018401916020909101906134f4565b506060820151805161278a9160028401916020909101906134f4565b50608082015180516127a691600384019160209091019061352f565b50505080806127b4906143dc565b915050612698565b5060005b85518110156128e45787516000908152600a6020526040902086518790839081106127fb57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518254600181018455600093845292829020815160049094020180546001600160a01b039094166001600160a01b0319851681178255928201519193909283916001600160a81b03191617600160a01b83600381111561287657634e487b7160e01b600052602160045260246000fd5b0217905550604082015180516128969160018401916020909101906134f4565b50606082015180516128b29160028401916020909101906134f4565b50608082015180516128ce91600384019160209091019061352f565b50505080806128dc906143dc565b9150506127c0565b5060005b86518110156129395761292787828151811061291457634e487b7160e01b600052603260045260246000fd5b6020026020010151896020015130612c3c565b80612931816143dc565b9150506128e8565b876101000151600281111561295e57634e487b7160e01b600052602160045260246000fd5b885160608a0151604080519283526001600160a01b039091166020830152429133917fe04ebff38f5d8c549e62b96e4e558604e8078d05596368a9a0841db9567f1c73910160405180910390a46129b9600780546001019055565b505060018055505050505050565b336000908152600b60209081526040808320858452600c909252909120548154849291908110612a0757634e487b7160e01b600052603260045260246000fd5b906000526020600020906009020160000154148015612a7d5750336000908152600b60209081526040808320858452600c9092529091205481548110612a5d57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600990910201600101546001600160a01b031633145b612ac95760405162461bcd60e51b815260206004820152601760248201527f4f6e6c7920666f72207377617020696e69746961746f720000000000000000006044820152606401610ba2565b336000908152600b60209081526040808320858452600c909252909120548154839291908110612b0957634e487b7160e01b600052603260045260246000fd5b60009182526020918290206009919091020160030180546001600160a01b0319166001600160a01b03938416179055604080513381524292810192909252810184905290821660608201527fc1960fcc1e029f9b4831c97f3b9a4559512e4572459e7c832d1478f82ea0437b9060800160405180910390a15050565b6000546001600160a01b03163314612baf5760405162461bcd60e51b8152600401610ba290614199565b6001600160a01b038116612c145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba2565b612c1d81612fb9565b50565b6009602052816000526040600020818154811061240a57600080fd5b600083602001516003811115612c6257634e487b7160e01b600052602160045260246000fd5b1415612da1576001600160a01b038216301415612d225782600001516001600160a01b031663a9059cbb828560600151600081518110612cb257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401612ceb9291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612d0557600080fd5b505af1158015612d19573d6000803e3d6000fd5b50505050505050565b82600001516001600160a01b03166323b872dd83838660600151600081518110612d5c57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401612ceb565b600183602001516003811115612dc757634e487b7160e01b600052602160045260246000fd5b1415612e8d5760005b836040015151811015612e875783600001516001600160a01b031663b88d4fde848487604001518581518110612e1657634e487b7160e01b600052603260045260246000fd5b602002602001015188608001516040518563ffffffff1660e01b8152600401612e429493929190614053565b600060405180830381600087803b158015612e5c57600080fd5b505af1158015612e70573d6000803e3d6000fd5b505050508080612e7f906143dc565b915050612dd0565b50505050565b600283602001516003811115612eb357634e487b7160e01b600052602160045260246000fd5b1415612efd5782600001516001600160a01b0316632eb2c2d683838660400151876060015188608001516040518663ffffffff1660e01b8152600401612ceb959493929190613ff5565b82516001600160a01b039081166000908152600460205260409020548116908316301415612f29578092505b6001600160a01b038216301415612f3e578091505b835160408086015160608701516080880151925163810a665360e01b81526001600160a01b0386169463810a665394612f819491938a938a939290600401613f8e565b600060405180830381600087803b158015612f9b57600080fd5b505af1158015612faf573d6000803e3d6000fd5b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600d5460009060ff1661301c5750600090565b60005b6002548110156130ed576002818154811061304a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561309657600080fd5b505afa1580156130aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ce9190613d46565b156130db57600091505090565b806130e5816143dc565b91505061301f565b5050600e5490565b60065460ff161561333a5760005b86518110156132445760006131ea86868481811061313157634e487b7160e01b600052603260045260246000fd5b90506020028101906131439190614285565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506005548c519092508c91508690811061319b57634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516040516020016131cf919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528051906020012061337b565b9050806132315760405162461bcd60e51b815260206004820152601560248201527411185c1c081a5cc81b9bdd081cdd5c1c1bdc9d1959605a1b6044820152606401610ba2565b508061323c816143dc565b915050613103565b5060005b8551811015612d195760006132e084848481811061327657634e487b7160e01b600052603260045260246000fd5b90506020028101906132889190614285565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506005548b519092508b91508690811061319b57634e487b7160e01b600052603260045260246000fd5b9050806133275760405162461bcd60e51b815260206004820152601560248201527411185c1c081a5cc81b9bdd081cdd5c1c1bdc9d1959605a1b6044820152606401610ba2565b5080613332816143dc565b915050613248565b505050505050565b61334a613413565b613352613009565b60e08301525033602082015260075481524260a0820152600060c0820181905261010082015290565b6000826133888584613391565b14949350505050565b600081815b845181101561340b5760008582815181106133c157634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116133e757600083815260208290526040902092506133f8565b600081815260208490526040902092505b5080613403816143dc565b915050613396565b509392505050565b6040518061012001604052806000815260200160006001600160a01b031681526020016000815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000600281111561348a57634e487b7160e01b600052602160045260246000fd5b905290565b8280548282559060005260206000209081019282156134e4579160200282015b828111156134e457825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906134af565b506134f09291506135a2565b5090565b8280548282559060005260206000209081019282156134e4579160200282015b828111156134e4578251825591602001919060010190613514565b82805461353b906143a1565b90600052602060002090601f01602090048101928261355d57600085556134e4565b82601f1061357657805160ff19168380011785556134e4565b828001600101855582156134e457918201828111156134e4578251825591602001919060010190613514565b5b808211156134f057600081556001016135a3565b80356135c281614439565b919050565b60008083601f8401126135d8578182fd5b5081356001600160401b038111156135ee578182fd5b6020830191508360208260051b850101111561360957600080fd5b9250929050565b600082601f830112613620578081fd5b8135602061363561363083614347565b614317565b80838252828201915082860187848660051b8901011115613654578586fd5b855b858110156137355781356001600160401b0380821115613674578889fd5b9089019060a0828c03601f190181131561368c57898afd5b6136946142cc565b61369f8985016135b7565b815260406136ae818601613858565b8a8301526060850135848111156136c3578c8dfd5b6136d18f8c83890101613742565b828401525050608080850135848111156136e9578c8dfd5b6136f78f8c83890101613742565b60608401525091840135918383111561370e578b8cfd5b61371c8e8b858801016137ee565b9082015287525050509284019290840190600101613656565b5090979650505050505050565b600082601f830112613752578081fd5b8135602061376261363083614347565b80838252828201915082860187848660051b8901011115613781578586fd5b855b8581101561373557813584529284019290840190600101613783565b803580151581146135c257600080fd5b60008083601f8401126137c0578182fd5b5081356001600160401b038111156137d6578182fd5b60208301915083602082850101111561360957600080fd5b600082601f8301126137fe578081fd5b81356001600160401b0381111561381757613817614423565b61382a601f8201601f1916602001614317565b81815284602083860101111561383e578283fd5b816020850160208301379081016020019190915292915050565b8035600481106135c257600080fd5b8035600381106135c257600080fd5b600060208284031215613887578081fd5b8135610b7181614439565b600080604083850312156138a4578081fd5b82356138af81614439565b915060208301356138bf81614439565b809150509250929050565b60008060008060008060008060a0898b0312156138e5578384fd5b88356138f081614439565b9750602089013561390081614439565b965060408901356001600160401b038082111561391b578586fd5b6139278c838d016135c7565b909850965060608b013591508082111561393f578586fd5b61394b8c838d016135c7565b909650945060808b0135915080821115613963578384fd5b506139708b828c016137af565b999c989b5096995094979396929594505050565b60008060008060006080868803121561399b578283fd5b85356139a681614439565b945060208601356139b681614439565b93506040860135925060608601356001600160401b038111156139d7578182fd5b6139e3888289016137af565b969995985093965092949392505050565b60008060008060008060a08789031215613a0c578384fd5b8635613a1781614439565b95506020870135613a2781614439565b9450604087013593506060870135925060808701356001600160401b03811115613a4f578283fd5b613a5b89828a016137af565b979a9699509497509295939492505050565b60008060408385031215613a7f578182fd5b8235613a8a81614439565b946020939093013593505050565b60008060008060008060808789031215613ab0578384fd5b8635613abb81614439565b95506020870135945060408701356001600160401b0380821115613add578586fd5b613ae98a838b016135c7565b90965094506060890135915080821115613b01578384fd5b50613a5b89828a016135c7565b60006020808385031215613b20578182fd5b82356001600160401b03811115613b35578283fd5b8301601f81018513613b45578283fd5b8035613b5361363082614347565b80828252848201915084840188868560051b8701011115613b72578687fd5b8694505b83851015613b9d578035613b8981614439565b835260019490940193918501918501613b76565b50979650505050505050565b60008060408385031215613bbb578182fd5b613a8a8361379f565b600060208284031215613bd5578081fd5b5035919050565b600060208284031215613bed578081fd5b81356001600160e01b031981168114610b71578182fd5b60008060008060008060008789036101a0811215613c20578182fd5b61012080821215613c2f578283fd5b613c376142f4565b915089358252613c4960208b016135b7565b602083015260408a01356040830152613c6460608b016135b7565b606083015260808a0135608083015260a08a013560a083015260c08a013560c083015260e08a013560e0830152610100613c9f818c01613867565b908301529097508801356001600160401b0380821115613cbd578283fd5b613cc98b838c01613610565b97506101408a0135915080821115613cdf578283fd5b613ceb8b838c01613610565b96506101608a0135915080821115613d01578283fd5b613d0d8b838c016135c7565b90965094506101808a0135915080821115613d26578283fd5b50613d338a828b016135c7565b989b979a50959850939692959293505050565b600060208284031215613d57578081fd5b5051919050565b60008060408385031215613d70578182fd5b8235915060208301356138bf81614439565b60008060408385031215613d94578182fd5b82359150613da46020840161379f565b90509250929050565b600080600060608486031215613dc1578081fd5b83359250613dd16020850161379f565b9150604084013590509250925092565b60008060408385031215613df3578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015613e3157815187529582019590820190600101613e15565b509495945050505050565b60008151808452815b81811015613e6157602081850181015186830182015201613e45565b81811115613e725782602083870101525b50601f01601f19169290920160200192915050565b60048110613e9757613e9761440d565b9052565b60038110613e9757613e9761440d565b80518252602081015160018060a01b0380821660208501526040830151604085015280606084015116606085015250506080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080820151612e8782850182613e9b565b80516001600160a01b03168252602080820151600091613f3890850182613e87565b50604082015160a06040850152613f5260a0850182613e02565b905060608301518482036060860152613f6b8282613e02565b91505060808301518482036080860152613f858282613e3c565b95945050505050565b6001600160a01b03878116825286811660208301528516604082015260c060608201819052600090613fc290830186613e02565b8281036080840152613fd48186613e02565b905082810360a0840152613fe88185613e3c565b9998505050505050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061402190830186613e02565b82810360608401526140338186613e02565b905082810360808401526140478185613e3c565b98975050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061408690830184613e3c565b9695505050505050565b6001600160a01b03841681526140a96020820184613e87565b606060408201526000613f856060830184613e3c565b6020808252825182820181905260009190848201906040850190845b81811015614102576140ee838551613eab565b9284019261012092909201916001016140db565b50909695505050505050565b6000602080830181845280855180835260408601915060408160051b8701019250838701855b8281101561416257603f19888603018452614150858351613f16565b94509285019290850190600101614134565b5092979650505050505050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b61012081016107ec8284613eab565b602081526000610b716020830184613f16565b8981526001600160a01b03898116602083015260408201899052871660608201526080810186905260a0810185905260c0810184905260e081018390526101208101614277610100830184613e9b565b9a9950505050505050505050565b6000808335601e1984360301811261429b578283fd5b8301803591506001600160401b038211156142b4578283fd5b6020019150600581901b360382131561360957600080fd5b60405160a081016001600160401b03811182821017156142ee576142ee614423565b60405290565b60405161012081016001600160401b03811182821017156142ee576142ee614423565b604051601f8201601f191681016001600160401b038111828210171561433f5761433f614423565b604052919050565b60006001600160401b0382111561436057614360614423565b5060051b60200190565b6000821982111561437d5761437d6143f7565b500190565b600081600019048311821515161561439c5761439c6143f7565b500290565b600181811c908216806143b557607f821691505b602082108114156143d657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156143f0576143f06143f7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612c1d57600080fdfea26469706673582212202b5b360372cf8a7081b6ea17d52daaa52cf956f26003f6e6208b21ea7971c38c64736f6c634300080400330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000f213dd6063625e7ff6a442ae2c8412600c005cd900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102085760003560e01c806385535cc511610118578063bc197c81116100a0578063e2e616bb1161006f578063e2e616bb14610706578063eed188b514610720578063f23a6e6114610735578063f2fde38b1461077b578063f36669dc1461079b57600080fd5b8063bc197c811461065c578063bd79007d146106a4578063c66b5cca146106d3578063cf14e557146106e657600080fd5b80638e5f0203116100e75780638e5f0203146105a05780639ec5e7ae146105b3578063a68ae695146105e0578063aca8eaf014610615578063b78030781461063c57600080fd5b806385535cc5146104ff57806387f351651461051f5780638da5cb5b146105555780638e0c4f871461057357600080fd5b8063430bf08a1161019b5780634b7eb7201161016a5780634b7eb7201461045e5780635c975abb1461048b57806368026049146104aa57806368eb640d146104ca578063715018a6146104ea57600080fd5b8063430bf08a146103d1578063440bc7f31461040957806346fd12681461042957806349bc9fcb1461043e57600080fd5b806323e0aa4c116101d757806323e0aa4c1461032d57806325d4eeb01461035a57806342a229171461037c57806342f6487a1461039c57600080fd5b806301ffc9a714610249578063041fa44e1461027e578063150b7a02146102a257806319ba5e731461030057600080fd5b366102445760405134815233907f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7709060200160405180910390a2005b600080fd5b34801561025557600080fd5b50610269610264366004613bdc565b6107bb565b60405190151581526020015b60405180910390f35b34801561028a57600080fd5b5061029460055481565b604051908152602001610275565b3480156102ae57600080fd5b506102e76102bd366004613984565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b6040516001600160e01b03199091168152602001610275565b34801561030c57600080fd5b5061032061031b366004613a6d565b6107f2565b6040516102759190614205565b34801561033957600080fd5b5061034d610348366004613dad565b610914565b6040516102759190614214565b34801561036657600080fd5b5061037a610375366004613ba9565b610b78565b005b34801561038857600080fd5b50610294610397366004613d82565b610bf5565b3480156103a857600080fd5b50600d54600e546103ba9160ff169082565b604080519215158352602083019190915201610275565b3480156103dd57600080fd5b506003546103f1906001600160a01b031681565b6040516001600160a01b039091168152602001610275565b34801561041557600080fd5b5061037a610424366004613bc4565b610c27565b34801561043557600080fd5b5061037a610c56565b34801561044a57600080fd5b5061037a610459366004613a6d565b610c94565b34801561046a57600080fd5b5061047e610479366004613d82565b611317565b604051610275919061410e565b34801561049757600080fd5b50600054600160a01b900460ff16610269565b3480156104b657600080fd5b506103f16104c5366004613bc4565b61172c565b3480156104d657600080fd5b5061037a6104e5366004613892565b611756565b3480156104f657600080fd5b5061037a6117ae565b34801561050b57600080fd5b5061037a61051a366004613876565b6117e4565b34801561052b57600080fd5b506103f161053a366004613876565b6004602052600090815260409020546001600160a01b031681565b34801561056157600080fd5b506000546001600160a01b03166103f1565b34801561057f57600080fd5b5061029461058e366004613bc4565b600c6020526000908152604090205481565b61037a6105ae366004613a98565b611830565b3480156105bf57600080fd5b506105d36105ce366004613876565b61220c565b60405161027591906140bf565b3480156105ec57600080fd5b506106006105fb366004613a6d565b612334565b60405161027599989796959493929190614227565b34801561062157600080fd5b5061062a600181565b60405160ff9091168152602001610275565b34801561064857600080fd5b5061037a610657366004613b0e565b6123ad565b34801561066857600080fd5b506102e76106773660046138ca565b7fbc197c819b3e337a6f9652dd10becd7eef83032af3b9d958d3d42f669414662198975050505050505050565b3480156106b057600080fd5b506106c46106bf366004613de1565b6123ee565b60405161027593929190614090565b61037a6106e1366004613c04565b6124c8565b3480156106f257600080fd5b5061037a610701366004613d5e565b6129c7565b34801561071257600080fd5b506006546102699060ff1681565b34801561072c57600080fd5b50600e54610294565b34801561074157600080fd5b506102e76107503660046139f4565b7ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf979695505050505050565b34801561078757600080fd5b5061037a610796366004613876565b612b85565b3480156107a757600080fd5b506106c46107b6366004613de1565b612c20565b60006301ffc9a760e01b6001600160e01b0319831614806107ec5750630271189760e51b6001600160e01b03198316145b92915050565b6107fa613413565b6001600160a01b0383166000908152600b60209081526040808320858452600c909252909120548154811061083f57634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260099093029091018054835260018101546001600160a01b0390811694840194909452600280820154928401929092526003810154909316606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e0830152600883015491929161010084019160ff909116908111156108eb57634e487b7160e01b600052602160045260246000fd5b600281111561090a57634e487b7160e01b600052602160045260246000fd5b9052509392505050565b6109476040805160a081019091526000808252602082019081526020016060815260200160608152602001606081525090565b8215610b4357600084815260096020526040902080548390811061097b57634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160a0810190915260049092020180546001600160a01b0381168352919290919083019060ff600160a01b9091041660038111156109d757634e487b7160e01b600052602160045260246000fd5b60038111156109f657634e487b7160e01b600052602160045260246000fd5b815260200160018201805480602002602001604051908101604052809291908181526020018280548015610a4957602002820191906000526020600020905b815481526020019060010190808311610a35575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610aa157602002820191906000526020600020905b815481526020019060010190808311610a8d575b50505050508152602001600382018054610aba906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae6906143a1565b8015610b335780601f10610b0857610100808354040283529160200191610b33565b820191906000526020600020905b815481529060010190602001808311610b1657829003601f168201915b5050505050815250509050610b71565b6000848152600a6020526040902080548390811061097b57634e487b7160e01b600052603260045260246000fd5b9392505050565b6000546001600160a01b03163314610bab5760405162461bcd60e51b8152600401610ba290614199565b60405180910390fd5b600054600160a01b900460ff1615610bd55760405162461bcd60e51b8152600401610ba29061416f565b600d805460ff1916831515179055610bee816001614382565b600e555050565b60008115610c1257506000828152600960205260409020546107ec565b506000828152600a60205260409020546107ec565b6000546001600160a01b03163314610c515760405162461bcd60e51b8152600401610ba290614199565b600555565b6000546001600160a01b03163314610c805760405162461bcd60e51b8152600401610ba290614199565b6006805460ff19811660ff90911615179055565b60026001541415610cb75760405162461bcd60e51b8152600401610ba2906141ce565b60026001556001600160a01b0382166000908152600b60209081526040808320848452600c90925282205481548110610d0057634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260099093029091018054835260018101546001600160a01b0390811694840194909452600280820154928401929092526003810154909316606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e0830152600883015491929161010084019160ff90911690811115610dac57634e487b7160e01b600052602160045260246000fd5b6002811115610dcb57634e487b7160e01b600052602160045260246000fd5b905250600083815260096020908152604080832080548251818502810185019093528083529495509293909291849084015b82821015610fd55760008481526020908190206040805160a081019091526004850290910180546001600160a01b03811683529192909190830190600160a01b900460ff166003811115610e6157634e487b7160e01b600052602160045260246000fd5b6003811115610e8057634e487b7160e01b600052602160045260246000fd5b815260200160018201805480602002602001604051908101604052809291908181526020018280548015610ed357602002820191906000526020600020905b815481526020019060010190808311610ebf575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610f2b57602002820191906000526020600020905b815481526020019060010190808311610f17575b50505050508152602001600382018054610f44906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f70906143a1565b8015610fbd5780601f10610f9257610100808354040283529160200191610fbd565b820191906000526020600020905b815481529060010190602001808311610fa057829003601f168201915b50505050508152505081526020019060010190610dfd565b5092935060009250610fe5915050565b826101000151600281111561100a57634e487b7160e01b600052602160045260246000fd5b1461104c5760405162461bcd60e51b815260206004820152601260248201527114ddd85c081a5cc81b9bdd081bdc195b995960721b6044820152606401610ba2565b81602001516001600160a01b0316336001600160a01b03161480611085575081606001516001600160a01b0316336001600160a01b0316145b6110d15760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420696e746572657374656420636f756e746572706172740000000000006044820152606401610ba2565b60e08201511561110d5760e0820151604051339180156108fc02916000818181858888f1935050505015801561110b573d6000803e3d6000fd5b505b4260c083015260026101008301526001600160a01b0384166000908152600b60209081526040808320868452600c90925290912054815484929190811061116457634e487b7160e01b600052603260045260246000fd5b600091825260209182902083516009929092020190815590820151600180830180546001600160a01b03199081166001600160a01b03948516179091556040850151600280860191909155606086015160038601805490931694169390931790556080840151600484015560a0840151600584015560c0840151600684015560e084015160078401556101008401516008840180549193909260ff199092169190849081111561122457634e487b7160e01b600052602160045260246000fd5b021790555090505060005b81518110156112805761126e82828151811061125b57634e487b7160e01b600052603260045260246000fd5b6020026020010151308560200151612c3c565b80611278816143dc565b91505061122f565b6040830151156112cd5782602001516001600160a01b03166108fc84604001519081150290604051600060405180830381858888f193505050501580156112cb573d6000803e3d6000fd5b505b60026040805186815260006020820152429133917fe04ebff38f5d8c549e62b96e4e558604e8078d05596368a9a0841db9567f1c73910160405180910390a4505060018055505050565b6060811561152b57600083815260096020908152604080832080548251818502810185019093528083529193909284015b828210156115205760008481526020908190206040805160a081019091526004850290910180546001600160a01b03811683529192909190830190600160a01b900460ff1660038111156113ac57634e487b7160e01b600052602160045260246000fd5b60038111156113cb57634e487b7160e01b600052602160045260246000fd5b81526020016001820180548060200260200160405190810160405280929190818152602001828054801561141e57602002820191906000526020600020905b81548152602001906001019080831161140a575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561147657602002820191906000526020600020905b815481526020019060010190808311611462575b5050505050815260200160038201805461148f906143a1565b80601f01602080910402602001604051908101604052809291908181526020018280546114bb906143a1565b80156115085780601f106114dd57610100808354040283529160200191611508565b820191906000526020600020905b8154815290600101906020018083116114eb57829003601f168201915b50505050508152505081526020019060010190611348565b5050505090506107ec565b6000838152600a6020908152604080832080548251818502810185019093528083529193909284015b828210156115205760008481526020908190206040805160a081019091526004850290910180546001600160a01b03811683529192909190830190600160a01b900460ff1660038111156115b857634e487b7160e01b600052602160045260246000fd5b60038111156115d757634e487b7160e01b600052602160045260246000fd5b81526020016001820180548060200260200160405190810160405280929190818152602001828054801561162a57602002820191906000526020600020905b815481526020019060010190808311611616575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561168257602002820191906000526020600020905b81548152602001906001019080831161166e575b5050505050815260200160038201805461169b906143a1565b80601f01602080910402602001604051908101604052809291908181526020018280546116c7906143a1565b80156117145780601f106116e957610100808354040283529160200191611714565b820191906000526020600020905b8154815290600101906020018083116116f757829003601f168201915b50505050508152505081526020019060010190611554565b6002818154811061173c57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146117805760405162461bcd60e51b8152600401610ba290614199565b6001600160a01b03918216600090815260046020526040902080546001600160a01b03191691909216179055565b6000546001600160a01b031633146117d85760405162461bcd60e51b8152600401610ba290614199565b6117e26000612fb9565b565b6000546001600160a01b0316331461180e5760405162461bcd60e51b8152600401610ba290614199565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600054600160a01b900460ff161561185a5760405162461bcd60e51b8152600401610ba29061416f565b6002600154141561187d5760405162461bcd60e51b8152600401610ba2906141ce565b60026001556001600160a01b0386166000908152600b60209081526040808320888452600c909252822054815481106118c657634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080516101208101825260099093029091018054835260018101546001600160a01b0390811694840194909452600280820154928401929092526003810154909316606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e0830152600883015491929161010084019160ff9091169081111561197257634e487b7160e01b600052602160045260246000fd5b600281111561199157634e487b7160e01b600052602160045260246000fd5b9052509050600081610100015160028111156119bd57634e487b7160e01b600052602160045260246000fd5b146119ff5760405162461bcd60e51b815260206004820152601260248201527114ddd85c081a5cc81b9bdd081bdc195b995960721b6044820152606401610ba2565b60608101516001600160a01b03163314611a5b5760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420696e746572657374656420636f756e746572706172740000000000006044820152606401610ba2565b6000611a65613009565b9050808260800151611a77919061436a565b341015611aba5760405162461bcd60e51b8152602060048201526011602482015270135bdc9948195d1a081c995c5d5a5c9959607a1b6044820152606401610ba2565b60008260e0015182611acc919061436a565b1115611b1e5760035460e08301516001600160a01b03909116906108fc90611af4908461436a565b6040518115909202916000818181858888f19350505050158015611b1c573d6000803e3d6000fd5b505b3360608301524260c083015260016101008301526001600160a01b0388166000908152600b602090815260408083208a8452600c909252909120548154849291908110611b7b57634e487b7160e01b600052603260045260246000fd5b600091825260209182902083516009929092020190815590820151600180830180546001600160a01b03199081166001600160a01b03948516179091556040850151600280860191909155606086015160038601805490931694169390931790556080840151600484015560a0840151600584015560c0840151600684015560e084015160078401556101008401516008840180549193909260ff1990921691908490811115611c3b57634e487b7160e01b600052602160045260246000fd5b02179055505050600087815260096020908152604080832080548251818502810185019093528083529192909190849084015b82821015611e465760008481526020908190206040805160a081019091526004850290910180546001600160a01b03811683529192909190830190600160a01b900460ff166003811115611cd257634e487b7160e01b600052602160045260246000fd5b6003811115611cf157634e487b7160e01b600052602160045260246000fd5b815260200160018201805480602002602001604051908101604052809291908181526020018280548015611d4457602002820191906000526020600020905b815481526020019060010190808311611d30575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611d9c57602002820191906000526020600020905b815481526020019060010190808311611d88575b50505050508152602001600382018054611db5906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611de1906143a1565b8015611e2e5780601f10611e0357610100808354040283529160200191611e2e565b820191906000526020600020905b815481529060010190602001808311611e1157829003601f168201915b50505050508152505081526020019060010190611c6e565b5050505090506000600a60008a8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156120595760008481526020908190206040805160a081019091526004850290910180546001600160a01b03811683529192909190830190600160a01b900460ff166003811115611ee557634e487b7160e01b600052602160045260246000fd5b6003811115611f0457634e487b7160e01b600052602160045260246000fd5b815260200160018201805480602002602001604051908101604052809291908181526020018280548015611f5757602002820191906000526020600020905b815481526020019060010190808311611f43575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611faf57602002820191906000526020600020905b815481526020019060010190808311611f9b575b50505050508152602001600382018054611fc8906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff4906143a1565b80156120415780601f1061201657610100808354040283529160200191612041565b820191906000526020600020905b81548152906001019060200180831161202457829003601f168201915b50505050508152505081526020019060010190611e81565b50505050905061206d82828a8a8a8a6130f5565b60005b81518110156120c5576120b382828151811061209c57634e487b7160e01b600052603260045260246000fd5b602002602001015186606001518760200151612c3c565b806120bd816143dc565b915050612070565b506080840151156121135783602001516001600160a01b03166108fc85608001519081150290604051600060405180830381858888f19350505050158015612111573d6000803e3d6000fd5b505b60005b82518110156121675761215583828151811061214257634e487b7160e01b600052603260045260246000fd5b6020026020010151308760600151612c3c565b8061215f816143dc565b915050612116565b506040840151156121b55783606001516001600160a01b03166108fc85604001519081150290604051600060405180830381858888f193505050501580156121b3573d6000803e3d6000fd5b505b6001604080518b81526001600160a01b038d166020820152429133917fe04ebff38f5d8c549e62b96e4e558604e8078d05596368a9a0841db9567f1c73910160405180910390a45050600180555050505050505050565b6001600160a01b0381166000908152600b60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156123295760008481526020908190206040805161012081018252600986029092018054835260018101546001600160a01b0390811694840194909452600280820154928401929092526003810154909316606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e0830152600883015491929161010084019160ff909116908111156122f757634e487b7160e01b600052602160045260246000fd5b600281111561231657634e487b7160e01b600052602160045260246000fd5b8152505081526020019060010190612244565b505050509050919050565b600b602052816000526040600020818154811061235057600080fd5b60009182526020909120600990910201805460018201546002830154600384015460048501546005860154600687015460078801546008909801549699506001600160a01b03958616985093969290941694909392919060ff1689565b6000546001600160a01b031633146123d75760405162461bcd60e51b8152600401610ba290614199565b80516123ea90600290602084019061348f565b5050565b600a602052816000526040600020818154811061240a57600080fd5b6000918252602090912060049091020180546003820180546001600160a01b0383169550600160a01b90920460ff16935090612445906143a1565b80601f0160208091040260200160405190810160405280929190818152602001828054612471906143a1565b80156124be5780601f10612493576101008083540402835291602001916124be565b820191906000526020600020905b8154815290600101906020018083116124a157829003601f168201915b5050505050905083565b600054600160a01b900460ff16156124f25760405162461bcd60e51b8152600401610ba29061416f565b600260015414156125155760405162461bcd60e51b8152600401610ba2906141ce565b600260015561252387613342565b96508660e001518760400151612539919061436a565b34101561257c5760405162461bcd60e51b8152602060048201526011602482015270135bdc9948195d1a081c995c5d5a5c9959607a1b6044820152606401610ba2565b336000908152600b602052604081205490600c9061259960075490565b81526020808201929092526040908101600090812093909355338352600b8252808320805460018181018355918552938390208b51600990950201938455918a015183830180546001600160a01b039283166001600160a01b031991821617909155918b015160028086019190915560608c015160038601805491909316931692909217905560808a0151600484015560a08a0151600584015560c08a0151600684015560e08a015160078401556101008a01516008840180548c95949293919260ff1990911691849081111561268057634e487b7160e01b600052602160045260246000fd5b021790555050506126958686868686866130f5565b60005b86518110156127bc578751600090815260096020526040902087518890839081106126d357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518254600181018455600093845292829020815160049094020180546001600160a01b039094166001600160a01b0319851681178255928201519193909283916001600160a81b03191617600160a01b83600381111561274e57634e487b7160e01b600052602160045260246000fd5b02179055506040820151805161276e9160018401916020909101906134f4565b506060820151805161278a9160028401916020909101906134f4565b50608082015180516127a691600384019160209091019061352f565b50505080806127b4906143dc565b915050612698565b5060005b85518110156128e45787516000908152600a6020526040902086518790839081106127fb57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518254600181018455600093845292829020815160049094020180546001600160a01b039094166001600160a01b0319851681178255928201519193909283916001600160a81b03191617600160a01b83600381111561287657634e487b7160e01b600052602160045260246000fd5b0217905550604082015180516128969160018401916020909101906134f4565b50606082015180516128b29160028401916020909101906134f4565b50608082015180516128ce91600384019160209091019061352f565b50505080806128dc906143dc565b9150506127c0565b5060005b86518110156129395761292787828151811061291457634e487b7160e01b600052603260045260246000fd5b6020026020010151896020015130612c3c565b80612931816143dc565b9150506128e8565b876101000151600281111561295e57634e487b7160e01b600052602160045260246000fd5b885160608a0151604080519283526001600160a01b039091166020830152429133917fe04ebff38f5d8c549e62b96e4e558604e8078d05596368a9a0841db9567f1c73910160405180910390a46129b9600780546001019055565b505060018055505050505050565b336000908152600b60209081526040808320858452600c909252909120548154849291908110612a0757634e487b7160e01b600052603260045260246000fd5b906000526020600020906009020160000154148015612a7d5750336000908152600b60209081526040808320858452600c9092529091205481548110612a5d57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600990910201600101546001600160a01b031633145b612ac95760405162461bcd60e51b815260206004820152601760248201527f4f6e6c7920666f72207377617020696e69746961746f720000000000000000006044820152606401610ba2565b336000908152600b60209081526040808320858452600c909252909120548154839291908110612b0957634e487b7160e01b600052603260045260246000fd5b60009182526020918290206009919091020160030180546001600160a01b0319166001600160a01b03938416179055604080513381524292810192909252810184905290821660608201527fc1960fcc1e029f9b4831c97f3b9a4559512e4572459e7c832d1478f82ea0437b9060800160405180910390a15050565b6000546001600160a01b03163314612baf5760405162461bcd60e51b8152600401610ba290614199565b6001600160a01b038116612c145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba2565b612c1d81612fb9565b50565b6009602052816000526040600020818154811061240a57600080fd5b600083602001516003811115612c6257634e487b7160e01b600052602160045260246000fd5b1415612da1576001600160a01b038216301415612d225782600001516001600160a01b031663a9059cbb828560600151600081518110612cb257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401612ceb9291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612d0557600080fd5b505af1158015612d19573d6000803e3d6000fd5b50505050505050565b82600001516001600160a01b03166323b872dd83838660600151600081518110612d5c57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401612ceb565b600183602001516003811115612dc757634e487b7160e01b600052602160045260246000fd5b1415612e8d5760005b836040015151811015612e875783600001516001600160a01b031663b88d4fde848487604001518581518110612e1657634e487b7160e01b600052603260045260246000fd5b602002602001015188608001516040518563ffffffff1660e01b8152600401612e429493929190614053565b600060405180830381600087803b158015612e5c57600080fd5b505af1158015612e70573d6000803e3d6000fd5b505050508080612e7f906143dc565b915050612dd0565b50505050565b600283602001516003811115612eb357634e487b7160e01b600052602160045260246000fd5b1415612efd5782600001516001600160a01b0316632eb2c2d683838660400151876060015188608001516040518663ffffffff1660e01b8152600401612ceb959493929190613ff5565b82516001600160a01b039081166000908152600460205260409020548116908316301415612f29578092505b6001600160a01b038216301415612f3e578091505b835160408086015160608701516080880151925163810a665360e01b81526001600160a01b0386169463810a665394612f819491938a938a939290600401613f8e565b600060405180830381600087803b158015612f9b57600080fd5b505af1158015612faf573d6000803e3d6000fd5b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600d5460009060ff1661301c5750600090565b60005b6002548110156130ed576002818154811061304a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561309657600080fd5b505afa1580156130aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ce9190613d46565b156130db57600091505090565b806130e5816143dc565b91505061301f565b5050600e5490565b60065460ff161561333a5760005b86518110156132445760006131ea86868481811061313157634e487b7160e01b600052603260045260246000fd5b90506020028101906131439190614285565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506005548c519092508c91508690811061319b57634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516040516020016131cf919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528051906020012061337b565b9050806132315760405162461bcd60e51b815260206004820152601560248201527411185c1c081a5cc81b9bdd081cdd5c1c1bdc9d1959605a1b6044820152606401610ba2565b508061323c816143dc565b915050613103565b5060005b8551811015612d195760006132e084848481811061327657634e487b7160e01b600052603260045260246000fd5b90506020028101906132889190614285565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506005548b519092508b91508690811061319b57634e487b7160e01b600052603260045260246000fd5b9050806133275760405162461bcd60e51b815260206004820152601560248201527411185c1c081a5cc81b9bdd081cdd5c1c1bdc9d1959605a1b6044820152606401610ba2565b5080613332816143dc565b915050613248565b505050505050565b61334a613413565b613352613009565b60e08301525033602082015260075481524260a0820152600060c0820181905261010082015290565b6000826133888584613391565b14949350505050565b600081815b845181101561340b5760008582815181106133c157634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116133e757600083815260208290526040902092506133f8565b600081815260208490526040902092505b5080613403816143dc565b915050613396565b509392505050565b6040518061012001604052806000815260200160006001600160a01b031681526020016000815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000600281111561348a57634e487b7160e01b600052602160045260246000fd5b905290565b8280548282559060005260206000209081019282156134e4579160200282015b828111156134e457825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906134af565b506134f09291506135a2565b5090565b8280548282559060005260206000209081019282156134e4579160200282015b828111156134e4578251825591602001919060010190613514565b82805461353b906143a1565b90600052602060002090601f01602090048101928261355d57600085556134e4565b82601f1061357657805160ff19168380011785556134e4565b828001600101855582156134e457918201828111156134e4578251825591602001919060010190613514565b5b808211156134f057600081556001016135a3565b80356135c281614439565b919050565b60008083601f8401126135d8578182fd5b5081356001600160401b038111156135ee578182fd5b6020830191508360208260051b850101111561360957600080fd5b9250929050565b600082601f830112613620578081fd5b8135602061363561363083614347565b614317565b80838252828201915082860187848660051b8901011115613654578586fd5b855b858110156137355781356001600160401b0380821115613674578889fd5b9089019060a0828c03601f190181131561368c57898afd5b6136946142cc565b61369f8985016135b7565b815260406136ae818601613858565b8a8301526060850135848111156136c3578c8dfd5b6136d18f8c83890101613742565b828401525050608080850135848111156136e9578c8dfd5b6136f78f8c83890101613742565b60608401525091840135918383111561370e578b8cfd5b61371c8e8b858801016137ee565b9082015287525050509284019290840190600101613656565b5090979650505050505050565b600082601f830112613752578081fd5b8135602061376261363083614347565b80838252828201915082860187848660051b8901011115613781578586fd5b855b8581101561373557813584529284019290840190600101613783565b803580151581146135c257600080fd5b60008083601f8401126137c0578182fd5b5081356001600160401b038111156137d6578182fd5b60208301915083602082850101111561360957600080fd5b600082601f8301126137fe578081fd5b81356001600160401b0381111561381757613817614423565b61382a601f8201601f1916602001614317565b81815284602083860101111561383e578283fd5b816020850160208301379081016020019190915292915050565b8035600481106135c257600080fd5b8035600381106135c257600080fd5b600060208284031215613887578081fd5b8135610b7181614439565b600080604083850312156138a4578081fd5b82356138af81614439565b915060208301356138bf81614439565b809150509250929050565b60008060008060008060008060a0898b0312156138e5578384fd5b88356138f081614439565b9750602089013561390081614439565b965060408901356001600160401b038082111561391b578586fd5b6139278c838d016135c7565b909850965060608b013591508082111561393f578586fd5b61394b8c838d016135c7565b909650945060808b0135915080821115613963578384fd5b506139708b828c016137af565b999c989b5096995094979396929594505050565b60008060008060006080868803121561399b578283fd5b85356139a681614439565b945060208601356139b681614439565b93506040860135925060608601356001600160401b038111156139d7578182fd5b6139e3888289016137af565b969995985093965092949392505050565b60008060008060008060a08789031215613a0c578384fd5b8635613a1781614439565b95506020870135613a2781614439565b9450604087013593506060870135925060808701356001600160401b03811115613a4f578283fd5b613a5b89828a016137af565b979a9699509497509295939492505050565b60008060408385031215613a7f578182fd5b8235613a8a81614439565b946020939093013593505050565b60008060008060008060808789031215613ab0578384fd5b8635613abb81614439565b95506020870135945060408701356001600160401b0380821115613add578586fd5b613ae98a838b016135c7565b90965094506060890135915080821115613b01578384fd5b50613a5b89828a016135c7565b60006020808385031215613b20578182fd5b82356001600160401b03811115613b35578283fd5b8301601f81018513613b45578283fd5b8035613b5361363082614347565b80828252848201915084840188868560051b8701011115613b72578687fd5b8694505b83851015613b9d578035613b8981614439565b835260019490940193918501918501613b76565b50979650505050505050565b60008060408385031215613bbb578182fd5b613a8a8361379f565b600060208284031215613bd5578081fd5b5035919050565b600060208284031215613bed578081fd5b81356001600160e01b031981168114610b71578182fd5b60008060008060008060008789036101a0811215613c20578182fd5b61012080821215613c2f578283fd5b613c376142f4565b915089358252613c4960208b016135b7565b602083015260408a01356040830152613c6460608b016135b7565b606083015260808a0135608083015260a08a013560a083015260c08a013560c083015260e08a013560e0830152610100613c9f818c01613867565b908301529097508801356001600160401b0380821115613cbd578283fd5b613cc98b838c01613610565b97506101408a0135915080821115613cdf578283fd5b613ceb8b838c01613610565b96506101608a0135915080821115613d01578283fd5b613d0d8b838c016135c7565b90965094506101808a0135915080821115613d26578283fd5b50613d338a828b016135c7565b989b979a50959850939692959293505050565b600060208284031215613d57578081fd5b5051919050565b60008060408385031215613d70578182fd5b8235915060208301356138bf81614439565b60008060408385031215613d94578182fd5b82359150613da46020840161379f565b90509250929050565b600080600060608486031215613dc1578081fd5b83359250613dd16020850161379f565b9150604084013590509250925092565b60008060408385031215613df3578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015613e3157815187529582019590820190600101613e15565b509495945050505050565b60008151808452815b81811015613e6157602081850181015186830182015201613e45565b81811115613e725782602083870101525b50601f01601f19169290920160200192915050565b60048110613e9757613e9761440d565b9052565b60038110613e9757613e9761440d565b80518252602081015160018060a01b0380821660208501526040830151604085015280606084015116606085015250506080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080820151612e8782850182613e9b565b80516001600160a01b03168252602080820151600091613f3890850182613e87565b50604082015160a06040850152613f5260a0850182613e02565b905060608301518482036060860152613f6b8282613e02565b91505060808301518482036080860152613f858282613e3c565b95945050505050565b6001600160a01b03878116825286811660208301528516604082015260c060608201819052600090613fc290830186613e02565b8281036080840152613fd48186613e02565b905082810360a0840152613fe88185613e3c565b9998505050505050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061402190830186613e02565b82810360608401526140338186613e02565b905082810360808401526140478185613e3c565b98975050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061408690830184613e3c565b9695505050505050565b6001600160a01b03841681526140a96020820184613e87565b606060408201526000613f856060830184613e3c565b6020808252825182820181905260009190848201906040850190845b81811015614102576140ee838551613eab565b9284019261012092909201916001016140db565b50909695505050505050565b6000602080830181845280855180835260408601915060408160051b8701019250838701855b8281101561416257603f19888603018452614150858351613f16565b94509285019290850190600101614134565b5092979650505050505050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b61012081016107ec8284613eab565b602081526000610b716020830184613f16565b8981526001600160a01b03898116602083015260408201899052871660608201526080810186905260a0810185905260c0810184905260e081018390526101208101614277610100830184613e9b565b9a9950505050505050505050565b6000808335601e1984360301811261429b578283fd5b8301803591506001600160401b038211156142b4578283fd5b6020019150600581901b360382131561360957600080fd5b60405160a081016001600160401b03811182821017156142ee576142ee614423565b60405290565b60405161012081016001600160401b03811182821017156142ee576142ee614423565b604051601f8201601f191681016001600160401b038111828210171561433f5761433f614423565b604052919050565b60006001600160401b0382111561436057614360614423565b5060051b60200190565b6000821982111561437d5761437d6143f7565b500190565b600081600019048311821515161561439c5761439c6143f7565b500290565b600181811c908216806143b557607f821691505b602082108114156143d657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156143f0576143f06143f7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612c1d57600080fdfea26469706673582212202b5b360372cf8a7081b6ea17d52daaa52cf956f26003f6e6208b21ea7971c38c64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000f213dd6063625e7ff6a442ae2c8412600c005cd900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _swapVaultNFTs (address[]): 0x0000000000000000000000000000000000000000
Arg [1] : _vaultAddress (address): 0xF213dD6063625E7fF6a442aE2C8412600c005cD9
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000f213dd6063625e7ff6a442ae2c8412600c005cd9
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.