More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 99,930 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x48656c6c | 20508795 | 150 days ago | IN | 0 ETH | 0.00003098 | ||||
Transfer | 18833095 | 385 days ago | IN | 0.0000001 ETH | 0.00099963 | ||||
Multi Asset Swap | 16742238 | 678 days ago | IN | 0 ETH | 0.00362363 | ||||
Multi Asset Swap | 16742222 | 678 days ago | IN | 0 ETH | 0.00427497 | ||||
Multi Asset Swap | 16742117 | 678 days ago | IN | 0 ETH | 0.00482821 | ||||
Multi Asset Swap | 16742062 | 678 days ago | IN | 0 ETH | 0.00420177 | ||||
Multi Asset Swap | 16082539 | 770 days ago | IN | 0.1066 ETH | 0.00828471 | ||||
Multi Asset Swap | 16080559 | 771 days ago | IN | 0.1292 ETH | 0.00495007 | ||||
Multi Asset Swap | 16080310 | 771 days ago | IN | 0.0929 ETH | 0.00676691 | ||||
Multi Asset Swap | 16080183 | 771 days ago | IN | 0.2887 ETH | 0.02199567 | ||||
Multi Asset Swap | 16073771 | 772 days ago | IN | 0.0422 ETH | 0.01221073 | ||||
Multi Asset Swap | 16072709 | 772 days ago | IN | 0.84975933 ETH | 0.01079228 | ||||
Multi Asset Swap | 16072282 | 772 days ago | IN | 0.00424999 ETH | 0.01041593 | ||||
Multi Asset Swap | 16070654 | 772 days ago | IN | 0.08075122 ETH | 0.013309 | ||||
Multi Asset Swap | 16070632 | 772 days ago | IN | 0.0968 ETH | 0.01209847 | ||||
Multi Asset Swap | 16070610 | 772 days ago | IN | 0.14859 ETH | 0.0196449 | ||||
Multi Asset Swap | 16070144 | 772 days ago | IN | 0.00155945 ETH | 0.00770236 | ||||
Multi Asset Swap | 16069808 | 772 days ago | IN | 0.0605 ETH | 0.01302753 | ||||
Multi Asset Swap | 16068970 | 772 days ago | IN | 0.0338 ETH | 0.01111408 | ||||
Multi Asset Swap | 16068823 | 772 days ago | IN | 0.27497732 ETH | 0.00672483 | ||||
Multi Asset Swap | 16067037 | 773 days ago | IN | 0.1239999 ETH | 0.00551684 | ||||
Multi Asset Swap | 16065297 | 773 days ago | IN | 0.0169 ETH | 0.00429273 | ||||
Multi Asset Swap | 16065247 | 773 days ago | IN | 0.4046 ETH | 0.04595249 | ||||
Multi Asset Swap | 16064625 | 773 days ago | IN | 0.0816 ETH | 0.01010947 | ||||
Multi Asset Swap | 16064618 | 773 days ago | IN | 0.0749 ETH | 0.00836105 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16082539 | 770 days ago | 0.0408 ETH | ||||
16082539 | 770 days ago | 0.0658 ETH | ||||
16080559 | 771 days ago | 0.086 ETH | ||||
16080559 | 771 days ago | 0.0432 ETH | ||||
16080559 | 771 days ago | 0.086 ETH | ||||
16080559 | 771 days ago | 0.086 ETH | ||||
16080310 | 771 days ago | 0.031 ETH | ||||
16080310 | 771 days ago | 0.031 ETH | ||||
16080310 | 771 days ago | 0.0624 ETH | ||||
16080310 | 771 days ago | 0.0305 ETH | ||||
16080183 | 771 days ago | 0.2602 ETH | ||||
16080183 | 771 days ago | 0.0285 ETH | ||||
16073771 | 772 days ago | 0.0286 ETH | ||||
16073771 | 772 days ago | 0.0136 ETH | ||||
16072709 | 772 days ago | 0.00005638 ETH | ||||
16072709 | 772 days ago | 0.065799 ETH | ||||
16072709 | 772 days ago | 0.00005638 ETH | ||||
16072709 | 772 days ago | 0.78396033 ETH | ||||
16072282 | 772 days ago | 0.00055 ETH | ||||
16072282 | 772 days ago | 0.00099999 ETH | ||||
16072282 | 772 days ago | 0.0027 ETH | ||||
16070654 | 772 days ago | 0.00047278 ETH | ||||
16070654 | 772 days ago | 0.033 ETH | ||||
16070654 | 772 days ago | 0.00047278 ETH | ||||
16070654 | 772 days ago | 0.04775122 ETH |
Loading...
Loading
Contract Name:
GenieSwap
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: BUSL-1.1 pragma solidity 0.8.4; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "./markets/MarketRegistry.sol"; import "./SpecialTransferHelper.sol"; import "../../interfaces/markets/tokens/IERC20.sol"; import "../../interfaces/markets/tokens/IERC721.sol"; import "../../interfaces/markets/tokens/IERC1155.sol"; contract GenieSwap is SpecialTransferHelper, Ownable, ReentrancyGuard { struct ERC20Details { address[] tokenAddrs; uint256[] amounts; } struct ERC1155Details { address tokenAddr; uint256[] ids; uint256[] amounts; } struct ConverstionDetails { bytes conversionData; } struct AffiliateDetails { address affiliate; bool isActive; } struct SponsoredMarket { uint256 marketId; bool isActive; } address public constant GOV = 0xE43aA28716b0B7531293557D5397F8b12f3F5aBc; address public guardian; address public converter; address public punkProxy; uint256 public baseFees; bool public openForTrades; bool public openForFreeTrades; MarketRegistry public marketRegistry; AffiliateDetails[] public affiliates; SponsoredMarket[] public sponsoredMarkets; modifier isOpenForTrades() { require(openForTrades, "trades not allowed"); _; } modifier isOpenForFreeTrades() { require(openForFreeTrades, "free trades not allowed"); _; } constructor(address _marketRegistry, address _converter, address _guardian) { marketRegistry = MarketRegistry(_marketRegistry); converter = _converter; guardian = _guardian; baseFees = 0; openForTrades = true; openForFreeTrades = true; affiliates.push(AffiliateDetails(GOV, true)); } function setUp() external onlyOwner { // Create CryptoPunk Proxy IWrappedPunk(0xb7F7F6C52F2e2fdb1963Eab30438024864c313F6).registerProxy(); punkProxy = IWrappedPunk(0xb7F7F6C52F2e2fdb1963Eab30438024864c313F6).proxyInfo(address(this)); // approve wrapped mooncats rescue to AcclimatedMoonCats contract IERC721(0x7C40c393DC0f283F318791d746d894DdD3693572).setApprovalForAll(0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69, true); } // @audit This function is used to approve specific tokens to specific market contracts with high volume. // This is done in very rare cases for the gas optimization purposes. function setOneTimeApproval(IERC20 token, address operator, uint256 amount) external onlyOwner { token.approve(operator, amount); } function updateGuardian(address _guardian) external onlyOwner { guardian = _guardian; } function addAffiliate(address _affiliate) external onlyOwner { affiliates.push(AffiliateDetails(_affiliate, true)); } function updateAffiliate(uint256 _affiliateIndex, address _affiliate, bool _IsActive) external onlyOwner { affiliates[_affiliateIndex] = AffiliateDetails(_affiliate, _IsActive); } function addSponsoredMarket(uint256 _marketId) external onlyOwner { sponsoredMarkets.push(SponsoredMarket(_marketId, true)); } function updateSponsoredMarket(uint256 _marketIndex, uint256 _marketId, bool _isActive) external onlyOwner { sponsoredMarkets[_marketIndex] = SponsoredMarket(_marketId, _isActive); } function setBaseFees(uint256 _baseFees) external onlyOwner { baseFees = _baseFees; } function setOpenForTrades(bool _openForTrades) external onlyOwner { openForTrades = _openForTrades; } function setOpenForFreeTrades(bool _openForFreeTrades) external onlyOwner { openForFreeTrades = _openForFreeTrades; } // @audit we will setup a system that will monitor the contract for any leftover // assets. In case any asset is leftover, the system should be able to trigger this // function to close all the trades until the leftover assets are rescued. function closeAllTrades() external { require(_msgSender() == guardian); openForTrades = false; openForFreeTrades = false; } function setConverter(address _converter) external onlyOwner { converter = _converter; } function setMarketRegistry(MarketRegistry _marketRegistry) external onlyOwner { marketRegistry = _marketRegistry; } function _transferEth(address _to, uint256 _amount) internal { (bool success, ) = _to.call{value: _amount}(''); require(success, "_transferEth: Eth transfer failed"); } function _collectFee(uint256[2] memory feeDetails) internal { require(feeDetails[1] >= baseFees, "Insufficient fee"); if (feeDetails[1] > 0) { AffiliateDetails memory affiliateDetails = affiliates[feeDetails[0]]; affiliateDetails.isActive ? _transferEth(affiliateDetails.affiliate, feeDetails[1]) : _transferEth(GOV, feeDetails[1]); } } function _checkCallResult(bool _success) internal pure { if (!_success) { // Copy revert reason from call assembly { returndatacopy(0, 0, returndatasize()) revert(0, returndatasize()) } } } function _transferFromHelper( ERC20Details memory erc20Details, SpecialTransferHelper.ERC721Details[] memory erc721Details, ERC1155Details[] memory erc1155Details ) internal { // transfer ERC20 tokens from the sender to this contract for (uint256 i = 0; i < erc20Details.tokenAddrs.length; i++) { IERC20(erc20Details.tokenAddrs[i]).transferFrom( _msgSender(), address(this), erc20Details.amounts[i] ); } // transfer ERC721 tokens from the sender to this contract for (uint256 i = 0; i < erc721Details.length; i++) { // accept CryptoPunks if (erc721Details[i].tokenAddr == 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB) { _acceptCryptoPunk(erc721Details[i]); } // accept Mooncat else if (erc721Details[i].tokenAddr == 0x60cd862c9C687A9dE49aecdC3A99b74A4fc54aB6) { _acceptMoonCat(erc721Details[i]); } // default else { for (uint256 j = 0; j < erc721Details[i].ids.length; j++) { IERC721(erc721Details[i].tokenAddr).transferFrom( _msgSender(), address(this), erc721Details[i].ids[j] ); } } } // transfer ERC1155 tokens from the sender to this contract for (uint256 i = 0; i < erc1155Details.length; i++) { IERC1155(erc1155Details[i].tokenAddr).safeBatchTransferFrom( _msgSender(), address(this), erc1155Details[i].ids, erc1155Details[i].amounts, "" ); } } function _conversionHelper( ConverstionDetails[] memory _converstionDetails ) internal { for (uint256 i = 0; i < _converstionDetails.length; i++) { // convert to desired asset (bool success, ) = converter.delegatecall(_converstionDetails[i].conversionData); // check if the call passed successfully _checkCallResult(success); } } function _trade( MarketRegistry.TradeDetails[] memory _tradeDetails ) internal { for (uint256 i = 0; i < _tradeDetails.length; i++) { // get market details (address _proxy, bool _isLib, bool _isActive) = marketRegistry.markets(_tradeDetails[i].marketId); // market should be active require(_isActive, "_trade: InActive Market"); // execute trade (bool success, ) = _isLib ? _proxy.delegatecall(_tradeDetails[i].tradeData) : _proxy.call{value:_tradeDetails[i].value}(_tradeDetails[i].tradeData); // check if the call passed successfully _checkCallResult(success); } } function _tradeSponsored( MarketRegistry.TradeDetails[] memory _tradeDetails, uint256 sponsoredMarketId ) internal returns (bool isSponsored) { for (uint256 i = 0; i < _tradeDetails.length; i++) { // check if the trade is for the sponsored market if (_tradeDetails[i].marketId == sponsoredMarketId) { isSponsored = true; } // get market details (address _proxy, bool _isLib, bool _isActive) = marketRegistry.markets(_tradeDetails[i].marketId); // market should be active require(_isActive, "_trade: InActive Market"); // execute trade (bool success, ) = _isLib ? _proxy.delegatecall(_tradeDetails[i].tradeData) : _proxy.call{value:_tradeDetails[i].value}(_tradeDetails[i].tradeData); // check if the call passed successfully _checkCallResult(success); } } function _returnDust(address[] memory _tokens) internal { for (uint256 i = 0; i < _tokens.length; i++) { if(_tokens[i] == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) { _transferEth(_msgSender(), address(this).balance); } else { IERC20(_tokens[i]).transfer(_msgSender(), IERC20(_tokens[i]).balanceOf(address(this))); } } } // swaps any combination of ERC-20/721/1155 // User needs to approve assets before invoking swap // WARNING: DO NOT SEND TOKENS TO THIS FUNCTION DIRECTLY!!! function multiAssetSwap( ERC20Details memory erc20Details, SpecialTransferHelper.ERC721Details[] memory erc721Details, ERC1155Details[] memory erc1155Details, ConverstionDetails[] memory converstionDetails, MarketRegistry.TradeDetails[] memory tradeDetails, address[] memory dustTokens, uint256[2] memory feeDetails // [affiliateIndex, ETH fee in Wei] ) payable external isOpenForTrades nonReentrant { // collect fees _collectFee(feeDetails); // transfer all tokens _transferFromHelper( erc20Details, erc721Details, erc1155Details ); // Convert any assets if needed _conversionHelper(converstionDetails); // execute trades _trade(tradeDetails); // return dust tokens (if any) _returnDust(dustTokens); } // Utility function that is used for free swaps for sponsored markets // WARNING: DO NOT SEND TOKENS TO THIS FUNCTION DIRECTLY!!! function multiAssetSwapWithoutFee( ERC20Details memory erc20Details, SpecialTransferHelper.ERC721Details[] memory erc721Details, ERC1155Details[] memory erc1155Details, ConverstionDetails[] memory converstionDetails, MarketRegistry.TradeDetails[] memory tradeDetails, address[] memory dustTokens, uint256 sponsoredMarketIndex ) payable external isOpenForFreeTrades nonReentrant { // fetch the marketId of the sponsored market SponsoredMarket memory sponsoredMarket = sponsoredMarkets[sponsoredMarketIndex]; // check if the market is active require(sponsoredMarket.isActive, "multiAssetSwapWithoutFee: InActive sponsored market"); // transfer all tokens _transferFromHelper( erc20Details, erc721Details, erc1155Details ); // Convert any assets if needed _conversionHelper(converstionDetails); // execute trades bool isSponsored = _tradeSponsored(tradeDetails, sponsoredMarket.marketId); // check if the trades include the sponsored market require(isSponsored, "multiAssetSwapWithoutFee: trades do not include sponsored market"); // return dust tokens (if any) _returnDust(dustTokens); } function onERC1155Received( address, address, uint256, uint256, bytes calldata ) public virtual returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] calldata, uint256[] calldata, bytes calldata ) public virtual returns (bytes4) { return this.onERC1155BatchReceived.selector; } function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return 0x150b7a02; } // Used by ERC721BasicToken.sol function onERC721Received( address, uint256, bytes calldata ) external virtual returns (bytes4) { return 0xf0b9e5ba; } function supportsInterface(bytes4 interfaceId) external virtual view returns (bool) { return interfaceId == this.supportsInterface.selector; } receive() external payable {} // Emergency function: In case any ETH get stuck in the contract unintentionally // Only owner can retrieve the asset balance to a recipient address function rescueETH(address recipient) onlyOwner external { _transferEth(recipient, address(this).balance); } // Emergency function: In case any ERC20 tokens get stuck in the contract unintentionally // Only owner can retrieve the asset balance to a recipient address function rescueERC20(address asset, address recipient) onlyOwner external { IERC20(asset).transfer(recipient, IERC20(asset).balanceOf(address(this))); } // Emergency function: In case any ERC721 tokens get stuck in the contract unintentionally // Only owner can retrieve the asset balance to a recipient address function rescueERC721(address asset, uint256[] calldata ids, address recipient) onlyOwner external { for (uint256 i = 0; i < ids.length; i++) { IERC721(asset).transferFrom(address(this), recipient, ids[i]); } } // Emergency function: In case any ERC1155 tokens get stuck in the contract unintentionally // Only owner can retrieve the asset balance to a recipient address function rescueERC1155(address asset, uint256[] calldata ids, uint256[] calldata amounts, address recipient) onlyOwner external { for (uint256 i = 0; i < ids.length; i++) { IERC1155(asset).safeTransferFrom(address(this), recipient, ids[i], amounts[i], ""); } } }
// SPDX-License-Identifier: MIT 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() { _setOwner(_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 { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT 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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.4; import "@openzeppelin/contracts/access/Ownable.sol"; contract MarketRegistry is Ownable { struct TradeDetails { uint256 marketId; uint256 value; bytes tradeData; } struct Market { address proxy; bool isLib; bool isActive; } Market[] public markets; constructor(address[] memory proxies, bool[] memory isLibs) { for (uint256 i = 0; i < proxies.length; i++) { markets.push(Market(proxies[i], isLibs[i], true)); } } function addMarket(address proxy, bool isLib) external onlyOwner { markets.push(Market(proxy, isLib, true)); } function setMarketStatus(uint256 marketId, bool newStatus) external onlyOwner { Market storage market = markets[marketId]; market.isActive = newStatus; } function setMarketProxy(uint256 marketId, address newProxy, bool isLib) external onlyOwner { Market storage market = markets[marketId]; market.proxy = newProxy; market.isLib = isLib; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.4; import "@openzeppelin/contracts/utils/Context.sol"; import "../../interfaces/punks/ICryptoPunks.sol"; import "../../interfaces/punks/IWrappedPunk.sol"; import "../../interfaces/mooncats/IMoonCatsRescue.sol"; contract SpecialTransferHelper is Context { struct ERC721Details { address tokenAddr; address[] to; uint256[] ids; } function _uintToBytes5(uint256 id) internal pure returns (bytes5 slicedDataBytes5) { bytes memory _bytes = new bytes(32); assembly { mstore(add(_bytes, 32), id) } bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(5, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, 5) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), 27) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, 5) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } assembly { slicedDataBytes5 := mload(add(tempBytes, 32)) } } function _acceptMoonCat(ERC721Details memory erc721Details) internal { for (uint256 i = 0; i < erc721Details.ids.length; i++) { bytes5 catId = _uintToBytes5(erc721Details.ids[i]); address owner = IMoonCatsRescue(erc721Details.tokenAddr).catOwners(catId); require(owner == _msgSender(), "_acceptMoonCat: invalid mooncat owner"); IMoonCatsRescue(erc721Details.tokenAddr).acceptAdoptionOffer(catId); } } function _transferMoonCat(ERC721Details memory erc721Details) internal { for (uint256 i = 0; i < erc721Details.ids.length; i++) { IMoonCatsRescue(erc721Details.tokenAddr).giveCat(_uintToBytes5(erc721Details.ids[i]), erc721Details.to[i]); } } function _acceptCryptoPunk(ERC721Details memory erc721Details) internal { for (uint256 i = 0; i < erc721Details.ids.length; i++) { address owner = ICryptoPunks(erc721Details.tokenAddr).punkIndexToAddress(erc721Details.ids[i]); require(owner == _msgSender(), "_acceptCryptoPunk: invalid punk owner"); ICryptoPunks(erc721Details.tokenAddr).buyPunk(erc721Details.ids[i]); } } function _transferCryptoPunk(ERC721Details memory erc721Details) internal { for (uint256 i = 0; i < erc721Details.ids.length; i++) { ICryptoPunks(erc721Details.tokenAddr).transferPunk(erc721Details.to[i], erc721Details.ids[i]); } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.4; interface IERC20 { /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.4; interface IERC721 { /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom(address _from, address _to, uint256 _tokenId) external payable; function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) external; function setApprovalForAll(address operator, bool approved) external; function approve(address to, uint256 tokenId) external; function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.4; interface IERC1155 { function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) external; function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) external; }
// SPDX-License-Identifier: MIT 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: BUSL-1.1 pragma solidity 0.8.4; interface ICryptoPunks { function punkIndexToAddress(uint index) external view returns(address owner); function offerPunkForSaleToAddress(uint punkIndex, uint minSalePriceInWei, address toAddress) external; function buyPunk(uint punkIndex) external payable; function transferPunk(address to, uint punkIndex) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.4; interface IWrappedPunk { /** * @dev Mints a wrapped punk */ function mint(uint256 punkIndex) external; /** * @dev Burns a specific wrapped punk */ function burn(uint256 punkIndex) external; /** * @dev Registers proxy */ function registerProxy() external; /** * @dev Gets proxy address */ function proxyInfo(address user) external view returns (address); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.4; interface IMoonCatsRescue { function acceptAdoptionOffer(bytes5 catId) payable external; function makeAdoptionOfferToAddress(bytes5 catId, uint price, address to) external; function giveCat(bytes5 catId, address to) external; function catOwners(bytes5 catId) external view returns(address); function rescueOrder(uint256 rescueIndex) external view returns(bytes5 catId); }
{ "evmVersion": "berlin", "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_marketRegistry","type":"address"},{"internalType":"address","name":"_converter","type":"address"},{"internalType":"address","name":"_guardian","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"GOV","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_affiliate","type":"address"}],"name":"addAffiliate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"addSponsoredMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"affiliates","outputs":[{"internalType":"address","name":"affiliate","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeAllTrades","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"converter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketRegistry","outputs":[{"internalType":"contract MarketRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"tokenAddrs","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct GenieSwap.ERC20Details","name":"erc20Details","type":"tuple"},{"components":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"internalType":"struct SpecialTransferHelper.ERC721Details[]","name":"erc721Details","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct GenieSwap.ERC1155Details[]","name":"erc1155Details","type":"tuple[]"},{"components":[{"internalType":"bytes","name":"conversionData","type":"bytes"}],"internalType":"struct GenieSwap.ConverstionDetails[]","name":"converstionDetails","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"tradeData","type":"bytes"}],"internalType":"struct MarketRegistry.TradeDetails[]","name":"tradeDetails","type":"tuple[]"},{"internalType":"address[]","name":"dustTokens","type":"address[]"},{"internalType":"uint256[2]","name":"feeDetails","type":"uint256[2]"}],"name":"multiAssetSwap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"tokenAddrs","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct GenieSwap.ERC20Details","name":"erc20Details","type":"tuple"},{"components":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"internalType":"struct SpecialTransferHelper.ERC721Details[]","name":"erc721Details","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct GenieSwap.ERC1155Details[]","name":"erc1155Details","type":"tuple[]"},{"components":[{"internalType":"bytes","name":"conversionData","type":"bytes"}],"internalType":"struct GenieSwap.ConverstionDetails[]","name":"converstionDetails","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"tradeData","type":"bytes"}],"internalType":"struct MarketRegistry.TradeDetails[]","name":"tradeDetails","type":"tuple[]"},{"internalType":"address[]","name":"dustTokens","type":"address[]"},{"internalType":"uint256","name":"sponsoredMarketIndex","type":"uint256"}],"name":"multiAssetSwapWithoutFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openForFreeTrades","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openForTrades","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punkProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_baseFees","type":"uint256"}],"name":"setBaseFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_converter","type":"address"}],"name":"setConverter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MarketRegistry","name":"_marketRegistry","type":"address"}],"name":"setMarketRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setOneTimeApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_openForFreeTrades","type":"bool"}],"name":"setOpenForFreeTrades","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_openForTrades","type":"bool"}],"name":"setOpenForTrades","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sponsoredMarkets","outputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_affiliateIndex","type":"uint256"},{"internalType":"address","name":"_affiliate","type":"address"},{"internalType":"bool","name":"_IsActive","type":"bool"}],"name":"updateAffiliate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_guardian","type":"address"}],"name":"updateGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketIndex","type":"uint256"},{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"updateSponsoredMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003951380380620039518339810160408190526200003491620001a3565b6200003f3362000136565b600180805560068054600380546001600160a01b039687166001600160a01b0319918216179091556002805495871695909116949094179093556000600581905561ff001960ff1996861662010000029690961661ff01600160b01b031990941693909317821794909416610100179093556040805180820190915273e43aa28716b0b7531293557d5397f8b12f3f5abc815260208101848152600780549586018155909252517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688909301805491511515600160a01b026001600160a81b03199092169390921692909217919091179055620001ec565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200019e57600080fd5b919050565b600080600060608486031215620001b8578283fd5b620001c38462000186565b9250620001d36020850162000186565b9150620001e36040850162000186565b90509250925092565b61375580620001fc6000396000f3fe60806040526004361061021e5760003560e01c80639f2ba09b11610123578063d8579704116100ab578063ecb96fe61161006f578063ecb96fe61461069a578063f0b9e5ba146106c0578063f23a6e61146106eb578063f2fde38b14610718578063fc5253951461073857600080fd5b8063d8579704146105ee578063dad9a7cd1461060e578063ddb382f914610621578063e4dd4b8a14610645578063e6041f9a1461067a57600080fd5b8063b9277963116100f2578063b92779631461054a578063bc197c811461056a578063bd38837b14610599578063c5cadd7f146105b9578063ccf3dc82146105ce57600080fd5b80639f2ba09b146104d0578063a1b62797146104f0578063b19337a41461050a578063b7ce33a21461052a57600080fd5b80633a5750b6116101a65780636335f25e116101755780636335f25e1461043d578063715018a61461045d57806381ea4ea61461047257806383206e80146104925780638da5cb5b146104b257600080fd5b80633a5750b6146103bd578063452a9320146103dd578063565528d7146103fd5780635d799f871461041d57600080fd5b8063150b7a02116101ed578063150b7a02146102c6578063180cb47f1461030b578063186b100c1461034b5780631bd787481461035e57806326e2dca21461039d57600080fd5b806301ffc9a71461022a57806304824e70146102705780630a9254e41461029257806311f85417146102a757600080fd5b3661022557005b600080fd5b34801561023657600080fd5b5061025b61024536600461322e565b6001600160e01b0319166301ffc9a760e01b1490565b60405190151581526020015b60405180910390f35b34801561027c57600080fd5b5061029061028b366004612e41565b610758565b005b34801561029e57600080fd5b50610290610798565b3480156102b357600080fd5b5060065461025b90610100900460ff1681565b3480156102d257600080fd5b506102f26102e1366004612f72565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610267565b34801561031757600080fd5b5061033373e43aa28716b0b7531293557d5397f8b12f3f5abc81565b6040516001600160a01b039091168152602001610267565b610290610359366004613296565b61094e565b34801561036a57600080fd5b5061037e61037936600461348f565b610a29565b604080516001600160a01b039093168352901515602083015201610267565b3480156103a957600080fd5b506102906103b836600461305b565b610a5e565b3480156103c957600080fd5b506102906103d836600461348f565b610b4d565b3480156103e957600080fd5b50600254610333906001600160a01b031681565b34801561040957600080fd5b506102906104183660046134bf565b610bfc565b34801561042957600080fd5b50610290610438366004612e80565b610ca8565b34801561044957600080fd5b50600454610333906001600160a01b031681565b34801561046957600080fd5b50610290610dd6565b34801561047e57600080fd5b5061029061048d366004612e41565b610e0c565b34801561049e57600080fd5b506102906104ad3660046131f6565b610eaa565b3480156104be57600080fd5b506000546001600160a01b0316610333565b3480156104dc57600080fd5b506102906104eb366004613256565b610ee7565b3480156104fc57600080fd5b5060065461025b9060ff1681565b34801561051657600080fd5b50610290610525366004612e41565b610f93565b34801561053657600080fd5b506102906105453660046130c0565b610fdf565b34801561055657600080fd5b5061029061056536600461348f565b61110d565b34801561057657600080fd5b506102f2610585366004612eb8565b63bc197c8160e01b98975050505050505050565b3480156105a557600080fd5b50600354610333906001600160a01b031681565b3480156105c557600080fd5b5061029061113c565b3480156105da57600080fd5b506102906105e93660046134f5565b611169565b3480156105fa57600080fd5b50610290610609366004612e41565b6111fe565b61029061061c366004613397565b611252565b34801561062d57600080fd5b5061063760055481565b604051908152602001610267565b34801561065157600080fd5b5061066561066036600461348f565b611472565b60408051928352901515602083015201610267565b34801561068657600080fd5b506102906106953660046131f6565b6114a3565b3480156106a657600080fd5b50600654610333906201000090046001600160a01b031681565b3480156106cc57600080fd5b506102f26106db36600461319d565b63785cf2dd60e11b949350505050565b3480156106f757600080fd5b506102f2610706366004612fe2565b63f23a6e6160e01b9695505050505050565b34801561072457600080fd5b50610290610733366004612e41565b6114e7565b34801561074457600080fd5b50610290610753366004612e41565b61157f565b6000546001600160a01b0316331461078b5760405162461bcd60e51b8152600401610782906135ed565b60405180910390fd5b61079581476115cb565b50565b6000546001600160a01b031633146107c25760405162461bcd60e51b8152600401610782906135ed565b73b7f7f6c52f2e2fdb1963eab30438024864c313f66001600160a01b031663ddd81f826040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561081157600080fd5b505af1158015610825573d6000803e3d6000fd5b5050604051631538f65960e31b815230600482015273b7f7f6c52f2e2fdb1963eab30438024864c313f6925063a9c7b2c8915060240160206040518083038186803b15801561087357600080fd5b505afa158015610887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ab9190612e64565b600480546001600160a01b0319166001600160a01b039290921691909117815560405163a22cb46560e01b815273c3f733ca98e0dad0386979eb96fb1722a1a05e699181019190915260016024820152737c40c393dc0f283f318791d746d894ddd36935729063a22cb46590604401600060405180830381600087803b15801561093457600080fd5b505af1158015610948573d6000803e3d6000fd5b50505050565b60065460ff166109955760405162461bcd60e51b81526020600482015260126024820152711d1c9859195cc81b9bdd08185b1b1bddd95960721b6044820152606401610782565b600260015414156109e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610782565b60026001556109f681611678565b610a01878787611765565b610a0a84611c07565b610a1383611cbe565b610a1c82611f40565b5050600180555050505050565b60078181548110610a3957600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b900460ff1682565b6000546001600160a01b03163314610a885760405162461bcd60e51b8152600401610782906135ed565b60005b82811015610b4657846001600160a01b03166323b872dd3084878786818110610ac457634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015610b1b57600080fd5b505af1158015610b2f573d6000803e3d6000fd5b505050508080610b3e906136bf565b915050610a8b565b5050505050565b6000546001600160a01b03163314610b775760405162461bcd60e51b8152600401610782906135ed565b6040805180820190915290815260016020820181815260088054928301815560005291517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360029092029182015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4909101805460ff1916911515919091179055565b6000546001600160a01b03163314610c265760405162461bcd60e51b8152600401610782906135ed565b6040518060400160405280836001600160a01b0316815260200182151581525060078481548110610c6757634e487b7160e01b600052603260045260246000fd5b600091825260209182902083519101805493909201511515600160a01b026001600160a81b03199093166001600160a01b0390911617919091179055505050565b6000546001600160a01b03163314610cd25760405162461bcd60e51b8152600401610782906135ed565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a082319060240160206040518083038186803b158015610d1b57600080fd5b505afa158015610d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5391906134a7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610d9957600080fd5b505af1158015610dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd19190613212565b505050565b6000546001600160a01b03163314610e005760405162461bcd60e51b8152600401610782906135ed565b610e0a6000612122565b565b6000546001600160a01b03163314610e365760405162461bcd60e51b8152600401610782906135ed565b604080518082019091526001600160a01b03918216815260016020820181815260078054928301815560005291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688909101805492511515600160a01b026001600160a81b03199093169190931617179055565b6000546001600160a01b03163314610ed45760405162461bcd60e51b8152600401610782906135ed565b6006805460ff1916911515919091179055565b6000546001600160a01b03163314610f115760405162461bcd60e51b8152600401610782906135ed565b60405163095ea7b360e01b81526001600160a01b0383811660048301526024820183905284169063095ea7b390604401602060405180830381600087803b158015610f5b57600080fd5b505af1158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190613212565b6000546001600160a01b03163314610fbd5760405162461bcd60e51b8152600401610782906135ed565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146110095760405162461bcd60e51b8152600401610782906135ed565b60005b8481101561110457866001600160a01b031663f242432a308489898681811061104557634e487b7160e01b600052603260045260246000fd5b9050602002013588888781811061106c57634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e089901b1681526001600160a01b03968716600482015295909416602486015250604484019190915260209091020135606482015260a06084820152600060a482015260c401600060405180830381600087803b1580156110d957600080fd5b505af11580156110ed573d6000803e3d6000fd5b5050505080806110fc906136bf565b91505061100c565b50505050505050565b6000546001600160a01b031633146111375760405162461bcd60e51b8152600401610782906135ed565b600555565b6002546001600160a01b0316336001600160a01b03161461115c57600080fd5b6006805461ffff19169055565b6000546001600160a01b031633146111935760405162461bcd60e51b8152600401610782906135ed565b6040518060400160405280838152602001821515815250600884815481106111cb57634e487b7160e01b600052603260045260246000fd5b60009182526020918290208351600292909202019081559101516001909101805460ff1916911515919091179055505050565b6000546001600160a01b031633146112285760405162461bcd60e51b8152600401610782906135ed565b600680546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b600654610100900460ff166112a95760405162461bcd60e51b815260206004820152601760248201527f6672656520747261646573206e6f7420616c6c6f7765640000000000000000006044820152606401610782565b600260015414156112fc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610782565b600260018190555060006008828154811061132757634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051808201909152600290920201805482526001015460ff16151591810182905291506113bf5760405162461bcd60e51b815260206004820152603360248201527f6d756c7469417373657453776170576974686f75744665653a20496e416374696044820152721d99481cdc1bdb9cdbdc9959081b585c9ad95d606a1b6064820152608401610782565b6113ca888888611765565b6113d385611c07565b60006113e3858360000151612172565b90508061145a576040805162461bcd60e51b81526020600482015260248101919091527f6d756c7469417373657453776170576974686f75744665653a2074726164657360448201527f20646f206e6f7420696e636c7564652073706f6e736f726564206d61726b65746064820152608401610782565b61146384611f40565b50506001805550505050505050565b6008818154811061148257600080fd5b60009182526020909120600290910201805460019091015490915060ff1682565b6000546001600160a01b031633146114cd5760405162461bcd60e51b8152600401610782906135ed565b600680549115156101000261ff0019909216919091179055565b6000546001600160a01b031633146115115760405162461bcd60e51b8152600401610782906135ed565b6001600160a01b0381166115765760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610782565b61079581612122565b6000546001600160a01b031633146115a95760405162461bcd60e51b8152600401610782906135ed565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611618576040519150601f19603f3d011682016040523d82523d6000602084013e61161d565b606091505b5050905080610dd15760405162461bcd60e51b815260206004820152602160248201527f5f7472616e736665724574683a20457468207472616e73666572206661696c656044820152601960fa1b6064820152608401610782565b600554602082015110156116c15760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610782565b602081015115610795578051600780546000929081106116f157634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080518082019091529101546001600160a01b0381168252600160a01b900460ff16151591810182905291506117575761175373e43aa28716b0b7531293557d5397f8b12f3f5abc8360015b60200201516115cb565b5050565b805161175390836001611749565b60005b83515181101561187b57835180518290811061179457634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166323b872dd6117b13390565b30876020015185815181106117d657634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b15801561183057600080fd5b505af1158015611844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118689190613212565b5080611873816136bf565b915050611768565b5060005b8251811015611afc578281815181106118a857634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b031673b47e3cd837ddf8e4c57f05d70ab865de6e193bbb6001600160a01b031614156119165761191183828151811061190457634e487b7160e01b600052603260045260246000fd5b6020026020010151612434565b611aea565b82818151811061193657634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b03167360cd862c9c687a9de49aecdc3a99b74a4fc54ab66001600160a01b0316141561199f5761191183828151811061199257634e487b7160e01b600052603260045260246000fd5b60200260200101516125fe565b60005b8382815181106119c257634e487b7160e01b600052603260045260246000fd5b60200260200101516040015151811015611ae8578382815181106119f657634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b03166323b872dd611a173390565b30878681518110611a3857634e487b7160e01b600052603260045260246000fd5b6020026020010151604001518581518110611a6357634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611abd57600080fd5b505af1158015611ad1573d6000803e3d6000fd5b505050508080611ae0906136bf565b9150506119a2565b505b80611af4816136bf565b91505061187f565b5060005b815181101561094857818181518110611b2957634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b0316632eb2c2d6611b4a3390565b30858581518110611b6b57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151868681518110611b9757634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516040518563ffffffff1660e01b8152600401611bc29493929190613595565b600060405180830381600087803b158015611bdc57600080fd5b505af1158015611bf0573d6000803e3d6000fd5b505050508080611bff906136bf565b915050611b00565b60005b81518110156117535760035482516000916001600160a01b031690849084908110611c4557634e487b7160e01b600052603260045260246000fd5b602002602001015160000151604051611c5e919061355c565b600060405180830381855af49150503d8060008114611c99576040519150601f19603f3d011682016040523d82523d6000602084013e611c9e565b606091505b50509050611cab816127b1565b5080611cb6816136bf565b915050611c0a565b60005b8151811015611753576000806000600660029054906101000a90046001600160a01b03166001600160a01b031663b1283e77868681518110611d1357634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516040518263ffffffff1660e01b8152600401611d3d91815260200190565b60606040518083038186803b158015611d5557600080fd5b505afa158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d9190613151565b92509250925080611dda5760405162461bcd60e51b815260206004820152601760248201527617dd1c9859194e88125b9058dd1a5d994813585c9ad95d604a1b6044820152606401610782565b600082611e9857836001600160a01b0316868681518110611e0b57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151878781518110611e3757634e487b7160e01b600052603260045260246000fd5b602002602001015160400151604051611e50919061355c565b60006040518083038185875af1925050503d8060008114611e8d576040519150601f19603f3d011682016040523d82523d6000602084013e611e92565b606091505b50611f1d565b836001600160a01b0316868681518110611ec257634e487b7160e01b600052603260045260246000fd5b602002602001015160400151604051611edb919061355c565b600060405180830381855af49150503d8060008114611f16576040519150601f19603f3d011682016040523d82523d6000602084013e611f1b565b606091505b505b509050611f29816127b1565b505050508080611f38906136bf565b915050611cc1565b60005b815181101561175357818181518110611f6c57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03161415611fb057611fab33476115cb565b612110565b818181518110611fd057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031663a9059cbb611fed3390565b84848151811061200d57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561205857600080fd5b505afa15801561206c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209091906134a7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156120d657600080fd5b505af11580156120ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210e9190613212565b505b8061211a816136bf565b915050611f43565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000805b835181101561242d57828482815181106121a057634e487b7160e01b600052603260045260246000fd5b60200260200101516000015114156121b757600191505b6000806000600660029054906101000a90046001600160a01b03166001600160a01b031663b1283e7788868151811061220057634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516040518263ffffffff1660e01b815260040161222a91815260200190565b60606040518083038186803b15801561224257600080fd5b505afa158015612256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227a9190613151565b925092509250806122c75760405162461bcd60e51b815260206004820152601760248201527617dd1c9859194e88125b9058dd1a5d994813585c9ad95d604a1b6044820152606401610782565b60008261238557836001600160a01b03168886815181106122f857634e487b7160e01b600052603260045260246000fd5b60200260200101516020015189878151811061232457634e487b7160e01b600052603260045260246000fd5b60200260200101516040015160405161233d919061355c565b60006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5061240a565b836001600160a01b03168886815181106123af57634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516040516123c8919061355c565b600060405180830381855af49150503d8060008114612403576040519150601f19603f3d011682016040523d82523d6000602084013e612408565b606091505b505b509050612416816127b1565b505050508080612425906136bf565b915050612176565b5092915050565b60005b81604001515181101561175357600082600001516001600160a01b031663581781688460400151848151811061247d57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016124a391815260200190565b60206040518083038186803b1580156124bb57600080fd5b505afa1580156124cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f39190612e64565b90506001600160a01b038116331461255b5760405162461bcd60e51b815260206004820152602560248201527f5f61636365707443727970746f50756e6b3a20696e76616c69642070756e6b2060448201526437bbb732b960d91b6064820152608401610782565b82600001516001600160a01b0316638264fe988460400151848151811061259257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016125b891815260200190565b600060405180830381600087803b1580156125d257600080fd5b505af11580156125e6573d6000803e3d6000fd5b505050505080806125f6906136bf565b915050612437565b60005b8160400151518110156117535760006126448360400151838151811061263757634e487b7160e01b600052603260045260246000fd5b60200260200101516127c0565b8351604051633894ca5760e01b81526001600160d81b0319831660048201529192506000916001600160a01b0390911690633894ca579060240160206040518083038186803b15801561269657600080fd5b505afa1580156126aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ce9190612e64565b90506001600160a01b03811633146127365760405162461bcd60e51b815260206004820152602560248201527f5f6163636570744d6f6f6e4361743a20696e76616c6964206d6f6f6e6361742060448201526437bbb732b960d91b6064820152608401610782565b83516040516301be705160e41b81526001600160d81b0319841660048201526001600160a01b0390911690631be7051090602401600060405180830381600087803b15801561278457600080fd5b505af1158015612798573d6000803e3d6000fd5b50505050505080806127a9906136bf565b915050612601565b80610795573d6000803e3d6000fd5b6040805160208082528183019092526000918291906020820181803683375050506020810184815260405191925060059081830190600a8401905b818310156128135780518352602092830192016127fb565b505060058352601f01601f191660405250602001519392505050565b600082601f83011261283f578081fd5b8135602061285461284f8361369c565b61366c565b80838252828201915082860187848660051b8901011115612873578586fd5b855b8581101561289a578135612888816136fc565b84529284019290840190600101612875565b5090979650505050505050565b600082601f8301126128b7578081fd5b813560206128c761284f8361369c565b80838252828201915082860187848660051b89010111156128e6578586fd5b855b8581101561289a5781356001600160401b0380821115612906578889fd5b90890190818b03601f190187131561291c578889fd5b612924613622565b8783013582811115612934578a8bfd5b6129428d8a83870101612d4f565b8252508652505092840192908401906001016128e8565b600082601f830112612969578081fd5b8135602061297961284f8361369c565b80838252828201915082860187848660051b8901011115612998578586fd5b855b8581101561289a5781356001600160401b03808211156129b8578889fd5b908901906060828c03601f19018113156129d057898afd5b6129d861364a565b888401356129e5816136fc565b8152604084810135848111156129f9578c8dfd5b612a078f8c83890101612cb3565b838c015250918401359183831115612a1d578b8cfd5b612a2b8e8b85880101612cb3565b908201528752505050928401929084019060010161299a565b600082601f830112612a54578081fd5b81356020612a6461284f8361369c565b80838252828201915082860187848660051b8901011115612a83578586fd5b855b8581101561289a5781356001600160401b0380821115612aa3578889fd5b908901906060828c03601f1901811315612abb57898afd5b612ac361364a565b88840135612ad0816136fc565b815260408481013584811115612ae4578c8dfd5b612af28f8c8389010161282f565b838c015250918401359183831115612b08578b8cfd5b612b168e8b85880101612cb3565b9082015287525050509284019290840190600101612a85565b600082601f830112612b3f578081fd5b81356020612b4f61284f8361369c565b80838252828201915082860187848660051b8901011115612b6e578586fd5b855b8581101561289a5781356001600160401b0380821115612b8e578889fd5b908901906060828c03601f1901811315612ba657898afd5b612bae61364a565b838901358152604080850135828b0152918401359183831115612bcf578b8cfd5b612bdd8e8b85880101612d4f565b9082015287525050509284019290840190600101612b70565b600082601f830112612c06578081fd5b604051604081018181106001600160401b0382111715612c2857612c286136e6565b8060405250808385604086011115612c3e578384fd5b835b6002811015612c5f578135835260209283019290910190600101612c40565b509195945050505050565b60008083601f840112612c7b578182fd5b5081356001600160401b03811115612c91578182fd5b6020830191508360208260051b8501011115612cac57600080fd5b9250929050565b600082601f830112612cc3578081fd5b81356020612cd361284f8361369c565b80838252828201915082860187848660051b8901011115612cf2578586fd5b855b8581101561289a57813584529284019290840190600101612cf4565b60008083601f840112612d21578182fd5b5081356001600160401b03811115612d37578182fd5b602083019150836020828501011115612cac57600080fd5b600082601f830112612d5f578081fd5b81356001600160401b03811115612d7857612d786136e6565b612d8b601f8201601f191660200161366c565b818152846020838601011115612d9f578283fd5b816020850160208301379081016020019190915292915050565b600060408284031215612dca578081fd5b604051604081016001600160401b038282108183111715612ded57612ded6136e6565b816040528293508435915080821115612e0557600080fd5b612e118683870161282f565b83526020850135915080821115612e2757600080fd5b50612e3485828601612cb3565b6020830152505092915050565b600060208284031215612e52578081fd5b8135612e5d816136fc565b9392505050565b600060208284031215612e75578081fd5b8151612e5d816136fc565b60008060408385031215612e92578081fd5b8235612e9d816136fc565b91506020830135612ead816136fc565b809150509250929050565b60008060008060008060008060a0898b031215612ed3578384fd5b8835612ede816136fc565b97506020890135612eee816136fc565b965060408901356001600160401b0380821115612f09578586fd5b612f158c838d01612c6a565b909850965060608b0135915080821115612f2d578586fd5b612f398c838d01612c6a565b909650945060808b0135915080821115612f51578384fd5b50612f5e8b828c01612d10565b999c989b5096995094979396929594505050565b600080600080600060808688031215612f89578283fd5b8535612f94816136fc565b94506020860135612fa4816136fc565b93506040860135925060608601356001600160401b03811115612fc5578182fd5b612fd188828901612d10565b969995985093965092949392505050565b60008060008060008060a08789031215612ffa578384fd5b8635613005816136fc565b95506020870135613015816136fc565b9450604087013593506060870135925060808701356001600160401b0381111561303d578283fd5b61304989828a01612d10565b979a9699509497509295939492505050565b60008060008060608587031215613070578182fd5b843561307b816136fc565b935060208501356001600160401b03811115613095578283fd5b6130a187828801612c6a565b90945092505060408501356130b5816136fc565b939692955090935050565b600080600080600080608087890312156130d8578384fd5b86356130e3816136fc565b955060208701356001600160401b03808211156130fe578586fd5b61310a8a838b01612c6a565b90975095506040890135915080821115613122578384fd5b5061312f89828a01612c6a565b9094509250506060870135613143816136fc565b809150509295509295509295565b600080600060608486031215613165578081fd5b8351613170816136fc565b602085015190935061318181613711565b604085015190925061319281613711565b809150509250925092565b600080600080606085870312156131b2578182fd5b84356131bd816136fc565b93506020850135925060408501356001600160401b038111156131de578283fd5b6131ea87828801612d10565b95989497509550505050565b600060208284031215613207578081fd5b8135612e5d81613711565b600060208284031215613223578081fd5b8151612e5d81613711565b60006020828403121561323f578081fd5b81356001600160e01b031981168114612e5d578182fd5b60008060006060848603121561326a578081fd5b8335613275816136fc565b92506020840135613285816136fc565b929592945050506040919091013590565b6000806000806000806000610100888a0312156132b1578081fd5b87356001600160401b03808211156132c7578283fd5b6132d38b838c01612db9565b985060208a01359150808211156132e8578283fd5b6132f48b838c01612a44565b975060408a0135915080821115613309578283fd5b6133158b838c01612959565b965060608a013591508082111561332a578283fd5b6133368b838c016128a7565b955060808a013591508082111561334b578283fd5b6133578b838c01612b2f565b945060a08a013591508082111561336c578283fd5b506133798a828b0161282f565b9250506133898960c08a01612bf6565b905092959891949750929550565b600080600080600080600060e0888a0312156133b1578081fd5b87356001600160401b03808211156133c7578283fd5b6133d38b838c01612db9565b985060208a01359150808211156133e8578283fd5b6133f48b838c01612a44565b975060408a0135915080821115613409578283fd5b6134158b838c01612959565b965060608a013591508082111561342a578283fd5b6134368b838c016128a7565b955060808a013591508082111561344b578283fd5b6134578b838c01612b2f565b945060a08a013591508082111561346c578283fd5b506134798a828b0161282f565b92505060c0880135905092959891949750929550565b6000602082840312156134a0578081fd5b5035919050565b6000602082840312156134b8578081fd5b5051919050565b6000806000606084860312156134d3578081fd5b8335925060208401356134e5816136fc565b9150604084013561319281613711565b600080600060608486031215613509578081fd5b8335925060208401359150604084013561319281613711565b6000815180845260208085019450808401835b8381101561355157815187529582019590820190600101613535565b509495945050505050565b60008251815b8181101561357c5760208186018101518583015201613562565b8181111561358a5782828501525b509190910192915050565b6001600160a01b0385811682528416602082015260a0604082018190526000906135c190830185613522565b82810360608401526135d38185613522565b838103608090940193909352508152602001949350505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051602081016001600160401b0381118282101715613644576136446136e6565b60405290565b604051606081016001600160401b0381118282101715613644576136446136e6565b604051601f8201601f191681016001600160401b0381118282101715613694576136946136e6565b604052919050565b60006001600160401b038211156136b5576136b56136e6565b5060051b60200190565b60006000198214156136df57634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461079557600080fd5b801515811461079557600080fdfea264697066735822122049f99a43371e601fa6857fe3fa02b1d8f54f9120105565b4c04e9d5de625ab1f64736f6c6343000804003300000000000000000000000003660bce8fb9f76d4b87c406c264e5e70d4186340000000000000000000000006a53e553e2ee4562efda99ba215ed65505faeee8000000000000000000000000073ab1c0cad3677cde9bdb0cdeedc2085c029579
Deployed Bytecode
0x60806040526004361061021e5760003560e01c80639f2ba09b11610123578063d8579704116100ab578063ecb96fe61161006f578063ecb96fe61461069a578063f0b9e5ba146106c0578063f23a6e61146106eb578063f2fde38b14610718578063fc5253951461073857600080fd5b8063d8579704146105ee578063dad9a7cd1461060e578063ddb382f914610621578063e4dd4b8a14610645578063e6041f9a1461067a57600080fd5b8063b9277963116100f2578063b92779631461054a578063bc197c811461056a578063bd38837b14610599578063c5cadd7f146105b9578063ccf3dc82146105ce57600080fd5b80639f2ba09b146104d0578063a1b62797146104f0578063b19337a41461050a578063b7ce33a21461052a57600080fd5b80633a5750b6116101a65780636335f25e116101755780636335f25e1461043d578063715018a61461045d57806381ea4ea61461047257806383206e80146104925780638da5cb5b146104b257600080fd5b80633a5750b6146103bd578063452a9320146103dd578063565528d7146103fd5780635d799f871461041d57600080fd5b8063150b7a02116101ed578063150b7a02146102c6578063180cb47f1461030b578063186b100c1461034b5780631bd787481461035e57806326e2dca21461039d57600080fd5b806301ffc9a71461022a57806304824e70146102705780630a9254e41461029257806311f85417146102a757600080fd5b3661022557005b600080fd5b34801561023657600080fd5b5061025b61024536600461322e565b6001600160e01b0319166301ffc9a760e01b1490565b60405190151581526020015b60405180910390f35b34801561027c57600080fd5b5061029061028b366004612e41565b610758565b005b34801561029e57600080fd5b50610290610798565b3480156102b357600080fd5b5060065461025b90610100900460ff1681565b3480156102d257600080fd5b506102f26102e1366004612f72565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610267565b34801561031757600080fd5b5061033373e43aa28716b0b7531293557d5397f8b12f3f5abc81565b6040516001600160a01b039091168152602001610267565b610290610359366004613296565b61094e565b34801561036a57600080fd5b5061037e61037936600461348f565b610a29565b604080516001600160a01b039093168352901515602083015201610267565b3480156103a957600080fd5b506102906103b836600461305b565b610a5e565b3480156103c957600080fd5b506102906103d836600461348f565b610b4d565b3480156103e957600080fd5b50600254610333906001600160a01b031681565b34801561040957600080fd5b506102906104183660046134bf565b610bfc565b34801561042957600080fd5b50610290610438366004612e80565b610ca8565b34801561044957600080fd5b50600454610333906001600160a01b031681565b34801561046957600080fd5b50610290610dd6565b34801561047e57600080fd5b5061029061048d366004612e41565b610e0c565b34801561049e57600080fd5b506102906104ad3660046131f6565b610eaa565b3480156104be57600080fd5b506000546001600160a01b0316610333565b3480156104dc57600080fd5b506102906104eb366004613256565b610ee7565b3480156104fc57600080fd5b5060065461025b9060ff1681565b34801561051657600080fd5b50610290610525366004612e41565b610f93565b34801561053657600080fd5b506102906105453660046130c0565b610fdf565b34801561055657600080fd5b5061029061056536600461348f565b61110d565b34801561057657600080fd5b506102f2610585366004612eb8565b63bc197c8160e01b98975050505050505050565b3480156105a557600080fd5b50600354610333906001600160a01b031681565b3480156105c557600080fd5b5061029061113c565b3480156105da57600080fd5b506102906105e93660046134f5565b611169565b3480156105fa57600080fd5b50610290610609366004612e41565b6111fe565b61029061061c366004613397565b611252565b34801561062d57600080fd5b5061063760055481565b604051908152602001610267565b34801561065157600080fd5b5061066561066036600461348f565b611472565b60408051928352901515602083015201610267565b34801561068657600080fd5b506102906106953660046131f6565b6114a3565b3480156106a657600080fd5b50600654610333906201000090046001600160a01b031681565b3480156106cc57600080fd5b506102f26106db36600461319d565b63785cf2dd60e11b949350505050565b3480156106f757600080fd5b506102f2610706366004612fe2565b63f23a6e6160e01b9695505050505050565b34801561072457600080fd5b50610290610733366004612e41565b6114e7565b34801561074457600080fd5b50610290610753366004612e41565b61157f565b6000546001600160a01b0316331461078b5760405162461bcd60e51b8152600401610782906135ed565b60405180910390fd5b61079581476115cb565b50565b6000546001600160a01b031633146107c25760405162461bcd60e51b8152600401610782906135ed565b73b7f7f6c52f2e2fdb1963eab30438024864c313f66001600160a01b031663ddd81f826040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561081157600080fd5b505af1158015610825573d6000803e3d6000fd5b5050604051631538f65960e31b815230600482015273b7f7f6c52f2e2fdb1963eab30438024864c313f6925063a9c7b2c8915060240160206040518083038186803b15801561087357600080fd5b505afa158015610887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ab9190612e64565b600480546001600160a01b0319166001600160a01b039290921691909117815560405163a22cb46560e01b815273c3f733ca98e0dad0386979eb96fb1722a1a05e699181019190915260016024820152737c40c393dc0f283f318791d746d894ddd36935729063a22cb46590604401600060405180830381600087803b15801561093457600080fd5b505af1158015610948573d6000803e3d6000fd5b50505050565b60065460ff166109955760405162461bcd60e51b81526020600482015260126024820152711d1c9859195cc81b9bdd08185b1b1bddd95960721b6044820152606401610782565b600260015414156109e85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610782565b60026001556109f681611678565b610a01878787611765565b610a0a84611c07565b610a1383611cbe565b610a1c82611f40565b5050600180555050505050565b60078181548110610a3957600080fd5b6000918252602090912001546001600160a01b0381169150600160a01b900460ff1682565b6000546001600160a01b03163314610a885760405162461bcd60e51b8152600401610782906135ed565b60005b82811015610b4657846001600160a01b03166323b872dd3084878786818110610ac457634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015610b1b57600080fd5b505af1158015610b2f573d6000803e3d6000fd5b505050508080610b3e906136bf565b915050610a8b565b5050505050565b6000546001600160a01b03163314610b775760405162461bcd60e51b8152600401610782906135ed565b6040805180820190915290815260016020820181815260088054928301815560005291517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360029092029182015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4909101805460ff1916911515919091179055565b6000546001600160a01b03163314610c265760405162461bcd60e51b8152600401610782906135ed565b6040518060400160405280836001600160a01b0316815260200182151581525060078481548110610c6757634e487b7160e01b600052603260045260246000fd5b600091825260209182902083519101805493909201511515600160a01b026001600160a81b03199093166001600160a01b0390911617919091179055505050565b6000546001600160a01b03163314610cd25760405162461bcd60e51b8152600401610782906135ed565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a082319060240160206040518083038186803b158015610d1b57600080fd5b505afa158015610d2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5391906134a7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610d9957600080fd5b505af1158015610dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd19190613212565b505050565b6000546001600160a01b03163314610e005760405162461bcd60e51b8152600401610782906135ed565b610e0a6000612122565b565b6000546001600160a01b03163314610e365760405162461bcd60e51b8152600401610782906135ed565b604080518082019091526001600160a01b03918216815260016020820181815260078054928301815560005291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688909101805492511515600160a01b026001600160a81b03199093169190931617179055565b6000546001600160a01b03163314610ed45760405162461bcd60e51b8152600401610782906135ed565b6006805460ff1916911515919091179055565b6000546001600160a01b03163314610f115760405162461bcd60e51b8152600401610782906135ed565b60405163095ea7b360e01b81526001600160a01b0383811660048301526024820183905284169063095ea7b390604401602060405180830381600087803b158015610f5b57600080fd5b505af1158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190613212565b6000546001600160a01b03163314610fbd5760405162461bcd60e51b8152600401610782906135ed565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146110095760405162461bcd60e51b8152600401610782906135ed565b60005b8481101561110457866001600160a01b031663f242432a308489898681811061104557634e487b7160e01b600052603260045260246000fd5b9050602002013588888781811061106c57634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e089901b1681526001600160a01b03968716600482015295909416602486015250604484019190915260209091020135606482015260a06084820152600060a482015260c401600060405180830381600087803b1580156110d957600080fd5b505af11580156110ed573d6000803e3d6000fd5b5050505080806110fc906136bf565b91505061100c565b50505050505050565b6000546001600160a01b031633146111375760405162461bcd60e51b8152600401610782906135ed565b600555565b6002546001600160a01b0316336001600160a01b03161461115c57600080fd5b6006805461ffff19169055565b6000546001600160a01b031633146111935760405162461bcd60e51b8152600401610782906135ed565b6040518060400160405280838152602001821515815250600884815481106111cb57634e487b7160e01b600052603260045260246000fd5b60009182526020918290208351600292909202019081559101516001909101805460ff1916911515919091179055505050565b6000546001600160a01b031633146112285760405162461bcd60e51b8152600401610782906135ed565b600680546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b600654610100900460ff166112a95760405162461bcd60e51b815260206004820152601760248201527f6672656520747261646573206e6f7420616c6c6f7765640000000000000000006044820152606401610782565b600260015414156112fc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610782565b600260018190555060006008828154811061132757634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051808201909152600290920201805482526001015460ff16151591810182905291506113bf5760405162461bcd60e51b815260206004820152603360248201527f6d756c7469417373657453776170576974686f75744665653a20496e416374696044820152721d99481cdc1bdb9cdbdc9959081b585c9ad95d606a1b6064820152608401610782565b6113ca888888611765565b6113d385611c07565b60006113e3858360000151612172565b90508061145a576040805162461bcd60e51b81526020600482015260248101919091527f6d756c7469417373657453776170576974686f75744665653a2074726164657360448201527f20646f206e6f7420696e636c7564652073706f6e736f726564206d61726b65746064820152608401610782565b61146384611f40565b50506001805550505050505050565b6008818154811061148257600080fd5b60009182526020909120600290910201805460019091015490915060ff1682565b6000546001600160a01b031633146114cd5760405162461bcd60e51b8152600401610782906135ed565b600680549115156101000261ff0019909216919091179055565b6000546001600160a01b031633146115115760405162461bcd60e51b8152600401610782906135ed565b6001600160a01b0381166115765760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610782565b61079581612122565b6000546001600160a01b031633146115a95760405162461bcd60e51b8152600401610782906135ed565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611618576040519150601f19603f3d011682016040523d82523d6000602084013e61161d565b606091505b5050905080610dd15760405162461bcd60e51b815260206004820152602160248201527f5f7472616e736665724574683a20457468207472616e73666572206661696c656044820152601960fa1b6064820152608401610782565b600554602082015110156116c15760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610782565b602081015115610795578051600780546000929081106116f157634e487b7160e01b600052603260045260246000fd5b6000918252602091829020604080518082019091529101546001600160a01b0381168252600160a01b900460ff16151591810182905291506117575761175373e43aa28716b0b7531293557d5397f8b12f3f5abc8360015b60200201516115cb565b5050565b805161175390836001611749565b60005b83515181101561187b57835180518290811061179457634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166323b872dd6117b13390565b30876020015185815181106117d657634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b15801561183057600080fd5b505af1158015611844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118689190613212565b5080611873816136bf565b915050611768565b5060005b8251811015611afc578281815181106118a857634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b031673b47e3cd837ddf8e4c57f05d70ab865de6e193bbb6001600160a01b031614156119165761191183828151811061190457634e487b7160e01b600052603260045260246000fd5b6020026020010151612434565b611aea565b82818151811061193657634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b03167360cd862c9c687a9de49aecdc3a99b74a4fc54ab66001600160a01b0316141561199f5761191183828151811061199257634e487b7160e01b600052603260045260246000fd5b60200260200101516125fe565b60005b8382815181106119c257634e487b7160e01b600052603260045260246000fd5b60200260200101516040015151811015611ae8578382815181106119f657634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b03166323b872dd611a173390565b30878681518110611a3857634e487b7160e01b600052603260045260246000fd5b6020026020010151604001518581518110611a6357634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611abd57600080fd5b505af1158015611ad1573d6000803e3d6000fd5b505050508080611ae0906136bf565b9150506119a2565b505b80611af4816136bf565b91505061187f565b5060005b815181101561094857818181518110611b2957634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b0316632eb2c2d6611b4a3390565b30858581518110611b6b57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151868681518110611b9757634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516040518563ffffffff1660e01b8152600401611bc29493929190613595565b600060405180830381600087803b158015611bdc57600080fd5b505af1158015611bf0573d6000803e3d6000fd5b505050508080611bff906136bf565b915050611b00565b60005b81518110156117535760035482516000916001600160a01b031690849084908110611c4557634e487b7160e01b600052603260045260246000fd5b602002602001015160000151604051611c5e919061355c565b600060405180830381855af49150503d8060008114611c99576040519150601f19603f3d011682016040523d82523d6000602084013e611c9e565b606091505b50509050611cab816127b1565b5080611cb6816136bf565b915050611c0a565b60005b8151811015611753576000806000600660029054906101000a90046001600160a01b03166001600160a01b031663b1283e77868681518110611d1357634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516040518263ffffffff1660e01b8152600401611d3d91815260200190565b60606040518083038186803b158015611d5557600080fd5b505afa158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d9190613151565b92509250925080611dda5760405162461bcd60e51b815260206004820152601760248201527617dd1c9859194e88125b9058dd1a5d994813585c9ad95d604a1b6044820152606401610782565b600082611e9857836001600160a01b0316868681518110611e0b57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151878781518110611e3757634e487b7160e01b600052603260045260246000fd5b602002602001015160400151604051611e50919061355c565b60006040518083038185875af1925050503d8060008114611e8d576040519150601f19603f3d011682016040523d82523d6000602084013e611e92565b606091505b50611f1d565b836001600160a01b0316868681518110611ec257634e487b7160e01b600052603260045260246000fd5b602002602001015160400151604051611edb919061355c565b600060405180830381855af49150503d8060008114611f16576040519150601f19603f3d011682016040523d82523d6000602084013e611f1b565b606091505b505b509050611f29816127b1565b505050508080611f38906136bf565b915050611cc1565b60005b815181101561175357818181518110611f6c57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b03161415611fb057611fab33476115cb565b612110565b818181518110611fd057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031663a9059cbb611fed3390565b84848151811061200d57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561205857600080fd5b505afa15801561206c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209091906134a7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156120d657600080fd5b505af11580156120ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210e9190613212565b505b8061211a816136bf565b915050611f43565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000805b835181101561242d57828482815181106121a057634e487b7160e01b600052603260045260246000fd5b60200260200101516000015114156121b757600191505b6000806000600660029054906101000a90046001600160a01b03166001600160a01b031663b1283e7788868151811061220057634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516040518263ffffffff1660e01b815260040161222a91815260200190565b60606040518083038186803b15801561224257600080fd5b505afa158015612256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227a9190613151565b925092509250806122c75760405162461bcd60e51b815260206004820152601760248201527617dd1c9859194e88125b9058dd1a5d994813585c9ad95d604a1b6044820152606401610782565b60008261238557836001600160a01b03168886815181106122f857634e487b7160e01b600052603260045260246000fd5b60200260200101516020015189878151811061232457634e487b7160e01b600052603260045260246000fd5b60200260200101516040015160405161233d919061355c565b60006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5061240a565b836001600160a01b03168886815181106123af57634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516040516123c8919061355c565b600060405180830381855af49150503d8060008114612403576040519150601f19603f3d011682016040523d82523d6000602084013e612408565b606091505b505b509050612416816127b1565b505050508080612425906136bf565b915050612176565b5092915050565b60005b81604001515181101561175357600082600001516001600160a01b031663581781688460400151848151811061247d57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016124a391815260200190565b60206040518083038186803b1580156124bb57600080fd5b505afa1580156124cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f39190612e64565b90506001600160a01b038116331461255b5760405162461bcd60e51b815260206004820152602560248201527f5f61636365707443727970746f50756e6b3a20696e76616c69642070756e6b2060448201526437bbb732b960d91b6064820152608401610782565b82600001516001600160a01b0316638264fe988460400151848151811061259257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016125b891815260200190565b600060405180830381600087803b1580156125d257600080fd5b505af11580156125e6573d6000803e3d6000fd5b505050505080806125f6906136bf565b915050612437565b60005b8160400151518110156117535760006126448360400151838151811061263757634e487b7160e01b600052603260045260246000fd5b60200260200101516127c0565b8351604051633894ca5760e01b81526001600160d81b0319831660048201529192506000916001600160a01b0390911690633894ca579060240160206040518083038186803b15801561269657600080fd5b505afa1580156126aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ce9190612e64565b90506001600160a01b03811633146127365760405162461bcd60e51b815260206004820152602560248201527f5f6163636570744d6f6f6e4361743a20696e76616c6964206d6f6f6e6361742060448201526437bbb732b960d91b6064820152608401610782565b83516040516301be705160e41b81526001600160d81b0319841660048201526001600160a01b0390911690631be7051090602401600060405180830381600087803b15801561278457600080fd5b505af1158015612798573d6000803e3d6000fd5b50505050505080806127a9906136bf565b915050612601565b80610795573d6000803e3d6000fd5b6040805160208082528183019092526000918291906020820181803683375050506020810184815260405191925060059081830190600a8401905b818310156128135780518352602092830192016127fb565b505060058352601f01601f191660405250602001519392505050565b600082601f83011261283f578081fd5b8135602061285461284f8361369c565b61366c565b80838252828201915082860187848660051b8901011115612873578586fd5b855b8581101561289a578135612888816136fc565b84529284019290840190600101612875565b5090979650505050505050565b600082601f8301126128b7578081fd5b813560206128c761284f8361369c565b80838252828201915082860187848660051b89010111156128e6578586fd5b855b8581101561289a5781356001600160401b0380821115612906578889fd5b90890190818b03601f190187131561291c578889fd5b612924613622565b8783013582811115612934578a8bfd5b6129428d8a83870101612d4f565b8252508652505092840192908401906001016128e8565b600082601f830112612969578081fd5b8135602061297961284f8361369c565b80838252828201915082860187848660051b8901011115612998578586fd5b855b8581101561289a5781356001600160401b03808211156129b8578889fd5b908901906060828c03601f19018113156129d057898afd5b6129d861364a565b888401356129e5816136fc565b8152604084810135848111156129f9578c8dfd5b612a078f8c83890101612cb3565b838c015250918401359183831115612a1d578b8cfd5b612a2b8e8b85880101612cb3565b908201528752505050928401929084019060010161299a565b600082601f830112612a54578081fd5b81356020612a6461284f8361369c565b80838252828201915082860187848660051b8901011115612a83578586fd5b855b8581101561289a5781356001600160401b0380821115612aa3578889fd5b908901906060828c03601f1901811315612abb57898afd5b612ac361364a565b88840135612ad0816136fc565b815260408481013584811115612ae4578c8dfd5b612af28f8c8389010161282f565b838c015250918401359183831115612b08578b8cfd5b612b168e8b85880101612cb3565b9082015287525050509284019290840190600101612a85565b600082601f830112612b3f578081fd5b81356020612b4f61284f8361369c565b80838252828201915082860187848660051b8901011115612b6e578586fd5b855b8581101561289a5781356001600160401b0380821115612b8e578889fd5b908901906060828c03601f1901811315612ba657898afd5b612bae61364a565b838901358152604080850135828b0152918401359183831115612bcf578b8cfd5b612bdd8e8b85880101612d4f565b9082015287525050509284019290840190600101612b70565b600082601f830112612c06578081fd5b604051604081018181106001600160401b0382111715612c2857612c286136e6565b8060405250808385604086011115612c3e578384fd5b835b6002811015612c5f578135835260209283019290910190600101612c40565b509195945050505050565b60008083601f840112612c7b578182fd5b5081356001600160401b03811115612c91578182fd5b6020830191508360208260051b8501011115612cac57600080fd5b9250929050565b600082601f830112612cc3578081fd5b81356020612cd361284f8361369c565b80838252828201915082860187848660051b8901011115612cf2578586fd5b855b8581101561289a57813584529284019290840190600101612cf4565b60008083601f840112612d21578182fd5b5081356001600160401b03811115612d37578182fd5b602083019150836020828501011115612cac57600080fd5b600082601f830112612d5f578081fd5b81356001600160401b03811115612d7857612d786136e6565b612d8b601f8201601f191660200161366c565b818152846020838601011115612d9f578283fd5b816020850160208301379081016020019190915292915050565b600060408284031215612dca578081fd5b604051604081016001600160401b038282108183111715612ded57612ded6136e6565b816040528293508435915080821115612e0557600080fd5b612e118683870161282f565b83526020850135915080821115612e2757600080fd5b50612e3485828601612cb3565b6020830152505092915050565b600060208284031215612e52578081fd5b8135612e5d816136fc565b9392505050565b600060208284031215612e75578081fd5b8151612e5d816136fc565b60008060408385031215612e92578081fd5b8235612e9d816136fc565b91506020830135612ead816136fc565b809150509250929050565b60008060008060008060008060a0898b031215612ed3578384fd5b8835612ede816136fc565b97506020890135612eee816136fc565b965060408901356001600160401b0380821115612f09578586fd5b612f158c838d01612c6a565b909850965060608b0135915080821115612f2d578586fd5b612f398c838d01612c6a565b909650945060808b0135915080821115612f51578384fd5b50612f5e8b828c01612d10565b999c989b5096995094979396929594505050565b600080600080600060808688031215612f89578283fd5b8535612f94816136fc565b94506020860135612fa4816136fc565b93506040860135925060608601356001600160401b03811115612fc5578182fd5b612fd188828901612d10565b969995985093965092949392505050565b60008060008060008060a08789031215612ffa578384fd5b8635613005816136fc565b95506020870135613015816136fc565b9450604087013593506060870135925060808701356001600160401b0381111561303d578283fd5b61304989828a01612d10565b979a9699509497509295939492505050565b60008060008060608587031215613070578182fd5b843561307b816136fc565b935060208501356001600160401b03811115613095578283fd5b6130a187828801612c6a565b90945092505060408501356130b5816136fc565b939692955090935050565b600080600080600080608087890312156130d8578384fd5b86356130e3816136fc565b955060208701356001600160401b03808211156130fe578586fd5b61310a8a838b01612c6a565b90975095506040890135915080821115613122578384fd5b5061312f89828a01612c6a565b9094509250506060870135613143816136fc565b809150509295509295509295565b600080600060608486031215613165578081fd5b8351613170816136fc565b602085015190935061318181613711565b604085015190925061319281613711565b809150509250925092565b600080600080606085870312156131b2578182fd5b84356131bd816136fc565b93506020850135925060408501356001600160401b038111156131de578283fd5b6131ea87828801612d10565b95989497509550505050565b600060208284031215613207578081fd5b8135612e5d81613711565b600060208284031215613223578081fd5b8151612e5d81613711565b60006020828403121561323f578081fd5b81356001600160e01b031981168114612e5d578182fd5b60008060006060848603121561326a578081fd5b8335613275816136fc565b92506020840135613285816136fc565b929592945050506040919091013590565b6000806000806000806000610100888a0312156132b1578081fd5b87356001600160401b03808211156132c7578283fd5b6132d38b838c01612db9565b985060208a01359150808211156132e8578283fd5b6132f48b838c01612a44565b975060408a0135915080821115613309578283fd5b6133158b838c01612959565b965060608a013591508082111561332a578283fd5b6133368b838c016128a7565b955060808a013591508082111561334b578283fd5b6133578b838c01612b2f565b945060a08a013591508082111561336c578283fd5b506133798a828b0161282f565b9250506133898960c08a01612bf6565b905092959891949750929550565b600080600080600080600060e0888a0312156133b1578081fd5b87356001600160401b03808211156133c7578283fd5b6133d38b838c01612db9565b985060208a01359150808211156133e8578283fd5b6133f48b838c01612a44565b975060408a0135915080821115613409578283fd5b6134158b838c01612959565b965060608a013591508082111561342a578283fd5b6134368b838c016128a7565b955060808a013591508082111561344b578283fd5b6134578b838c01612b2f565b945060a08a013591508082111561346c578283fd5b506134798a828b0161282f565b92505060c0880135905092959891949750929550565b6000602082840312156134a0578081fd5b5035919050565b6000602082840312156134b8578081fd5b5051919050565b6000806000606084860312156134d3578081fd5b8335925060208401356134e5816136fc565b9150604084013561319281613711565b600080600060608486031215613509578081fd5b8335925060208401359150604084013561319281613711565b6000815180845260208085019450808401835b8381101561355157815187529582019590820190600101613535565b509495945050505050565b60008251815b8181101561357c5760208186018101518583015201613562565b8181111561358a5782828501525b509190910192915050565b6001600160a01b0385811682528416602082015260a0604082018190526000906135c190830185613522565b82810360608401526135d38185613522565b838103608090940193909352508152602001949350505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051602081016001600160401b0381118282101715613644576136446136e6565b60405290565b604051606081016001600160401b0381118282101715613644576136446136e6565b604051601f8201601f191681016001600160401b0381118282101715613694576136946136e6565b604052919050565b60006001600160401b038211156136b5576136b56136e6565b5060051b60200190565b60006000198214156136df57634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461079557600080fd5b801515811461079557600080fdfea264697066735822122049f99a43371e601fa6857fe3fa02b1d8f54f9120105565b4c04e9d5de625ab1f64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000003660bce8fb9f76d4b87c406c264e5e70d4186340000000000000000000000006a53e553e2ee4562efda99ba215ed65505faeee8000000000000000000000000073ab1c0cad3677cde9bdb0cdeedc2085c029579
-----Decoded View---------------
Arg [0] : _marketRegistry (address): 0x03660bce8Fb9F76d4b87C406c264E5E70D418634
Arg [1] : _converter (address): 0x6a53E553e2eE4562EfDa99bA215Ed65505faEEe8
Arg [2] : _guardian (address): 0x073Ab1C0CAd3677cDe9BDb0cDEEDC2085c029579
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000003660bce8fb9f76d4b87c406c264e5e70d418634
Arg [1] : 0000000000000000000000006a53e553e2ee4562efda99ba215ed65505faeee8
Arg [2] : 000000000000000000000000073ab1c0cad3677cde9bdb0cdeedc2085c029579
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.