Overview
ETH Balance
1 wei
Eth Value
Less Than $0.01 (@ $3,359.47/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 8,556 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute | 19345468 | 266 days ago | IN | 5.26 ETH | 0.00799288 | ||||
Execute | 19322166 | 269 days ago | IN | 5.23 ETH | 0.00868071 | ||||
Execute | 19315642 | 270 days ago | IN | 0.2595 ETH | 0.0068784 | ||||
Execute | 19315564 | 270 days ago | IN | 0.239 ETH | 0.00733292 | ||||
Execute | 19315185 | 270 days ago | IN | 0.247 ETH | 0.00932767 | ||||
Execute | 19314087 | 270 days ago | IN | 0.525 ETH | 0.01060194 | ||||
Execute | 19309494 | 271 days ago | IN | 2.6698 ETH | 0.0049847 | ||||
Execute | 19309350 | 271 days ago | IN | 0.53 ETH | 0.00479063 | ||||
Execute | 19306472 | 271 days ago | IN | 0.375 ETH | 0.00567546 | ||||
Execute | 19305938 | 271 days ago | IN | 0.948 ETH | 0.00720878 | ||||
Execute | 19305649 | 271 days ago | IN | 0.262 ETH | 0.00673478 | ||||
Execute | 19305599 | 271 days ago | IN | 0.69 ETH | 0.00716874 | ||||
Execute | 19305414 | 271 days ago | IN | 0.1869 ETH | 0.00553393 | ||||
Execute | 19305412 | 271 days ago | IN | 0.1869 ETH | 0.00564792 | ||||
Execute | 19305348 | 271 days ago | IN | 4.879 ETH | 0.00751409 | ||||
Execute | 19305196 | 271 days ago | IN | 1.2 ETH | 0.00742714 | ||||
Execute | 19303757 | 272 days ago | IN | 0.31 ETH | 0.00452662 | ||||
Execute | 19298620 | 272 days ago | IN | 0.2399 ETH | 0.0074468 | ||||
Execute | 19297746 | 272 days ago | IN | 0.2489 ETH | 0.00495161 | ||||
Execute | 19294221 | 273 days ago | IN | 3.849 ETH | 0.00520769 | ||||
Execute | 19293479 | 273 days ago | IN | 0.255 ETH | 0.00557225 | ||||
Execute | 19292857 | 273 days ago | IN | 0.095 ETH | 0.00920454 | ||||
Execute | 19290687 | 273 days ago | IN | 0.397 ETH | 0.00861034 | ||||
Execute | 19289156 | 274 days ago | IN | 0.265 ETH | 0.00845859 | ||||
Execute | 19287897 | 274 days ago | IN | 0.2689 ETH | 0.00625776 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19345468 | 266 days ago | 5.26 ETH | ||||
19322166 | 269 days ago | 5.23 ETH | ||||
19315642 | 270 days ago | 0.2595 ETH | ||||
19315564 | 270 days ago | 0.239 ETH | ||||
19315185 | 270 days ago | 0.247 ETH | ||||
19314087 | 270 days ago | 0.525 ETH | ||||
19309494 | 271 days ago | 2.6698 ETH | ||||
19309350 | 271 days ago | 0.53 ETH | ||||
19306472 | 271 days ago | 0.375 ETH | ||||
19305938 | 271 days ago | 0.948 ETH | ||||
19305649 | 271 days ago | 0.262 ETH | ||||
19305599 | 271 days ago | 0.69 ETH | ||||
19305414 | 271 days ago | 0.1869 ETH | ||||
19305412 | 271 days ago | 0.1869 ETH | ||||
19305348 | 271 days ago | 4.879 ETH | ||||
19305196 | 271 days ago | 1.2 ETH | ||||
19303757 | 272 days ago | 0.31 ETH | ||||
19298620 | 272 days ago | 0.2399 ETH | ||||
19297746 | 272 days ago | 0.2489 ETH | ||||
19294221 | 273 days ago | 3.849 ETH | ||||
19293479 | 273 days ago | 0.255 ETH | ||||
19292857 | 273 days ago | 0.095 ETH | ||||
19290687 | 273 days ago | 0.397 ETH | ||||
19289156 | 274 days ago | 0.265 ETH | ||||
19287897 | 274 days ago | 0.2689 ETH |
Loading...
Loading
Contract Name:
LooksRareAggregator
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 888888 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; import {ReentrancyGuard} from "@looksrare/contracts-libs/contracts/ReentrancyGuard.sol"; import {LowLevelERC20Approve} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC20Approve.sol"; import {LowLevelERC20Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC20Transfer.sol"; import {LowLevelERC721Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC721Transfer.sol"; import {LowLevelERC1155Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC1155Transfer.sol"; import {IERC20} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC20.sol"; import {TokenReceiver} from "./TokenReceiver.sol"; import {ILooksRareAggregator} from "./interfaces/ILooksRareAggregator.sol"; import {TokenTransfer} from "./libraries/OrderStructs.sol"; import {InvalidOrderLength, TradeExecutionFailed, ZeroAddress} from "./libraries/SharedErrors.sol"; /** * @title LooksRareAggregator * @notice This contract allows NFT sweepers to buy NFTs from * different marketplaces by passing high-level structs * + low-level bytes as calldata. * @author LooksRare protocol team (👀,💎) */ contract LooksRareAggregator is ILooksRareAggregator, TokenReceiver, ReentrancyGuard, LowLevelERC20Approve, LowLevelERC20Transfer, LowLevelERC721Transfer, LowLevelERC1155Transfer, OwnableTwoSteps { /** * @notice Transactions that only involve ETH orders should be submitted to * this contract directly. Transactions that involve ERC20 orders * should be submitted to the contract ERC20EnabledLooksRareAggregator * and it will call this contract's execution function. The purpose * is to prevent a malicious proxy from stealing users' ERC20 tokens * if this contract's ownership is compromised. By not providing any * allowances to this aggregator, even if a malicious proxy is added, * it cannot call token.transferFrom(victim, attacker, amount) inside * the proxy within the context of the aggregator. */ address public erc20EnabledLooksRareAggregator; mapping(address => mapping(bytes4 => uint256)) private _proxyFunctionSelectors; constructor(address _owner) OwnableTwoSteps(_owner) {} /** * @inheritdoc ILooksRareAggregator */ function execute( TokenTransfer[] calldata tokenTransfers, TradeData[] calldata tradeData, address originator, address recipient, bool isAtomic ) external payable nonReentrant { if (recipient == address(0)) { revert ZeroAddress(); } uint256 tradeDataLength = tradeData.length; if (tradeDataLength == 0) { revert InvalidOrderLength(); } if (tokenTransfers.length == 0) { originator = msg.sender; } else if (msg.sender != erc20EnabledLooksRareAggregator) { revert UseERC20EnabledLooksRareAggregator(); } for (uint256 i; i < tradeDataLength; ) { TradeData calldata singleTradeData = tradeData[i]; address proxy = singleTradeData.proxy; if (_proxyFunctionSelectors[proxy][singleTradeData.selector] != 1) { revert InvalidFunction(); } (bool success, bytes memory returnData) = proxy.delegatecall( abi.encodeWithSelector( singleTradeData.selector, singleTradeData.orders, singleTradeData.ordersExtraData, singleTradeData.extraData, recipient, isAtomic ) ); if (!success) { if (isAtomic) { if (returnData.length != 0) { assembly { let returnDataSize := mload(returnData) revert(add(32, returnData), returnDataSize) } } else { revert TradeExecutionFailed(); } } } unchecked { ++i; } } if (tokenTransfers.length != 0) { _returnERC20TokensIfAny(tokenTransfers, originator); } bool status = true; assembly { if gt(selfbalance(), 1) { status := call(gas(), originator, sub(selfbalance(), 1), 0, 0, 0, 0) } } if (!status) { revert ETHTransferFail(); } emit Sweep(originator); } /** * @notice Enable making ERC20 trades by setting the ERC20 enabled LooksRare aggregator * @dev Must be called by the current owner. It can only be set once to prevent * a malicious aggregator from being set in case of an ownership compromise. * @param _erc20EnabledLooksRareAggregator The ERC20 enabled LooksRare aggregator's address */ function setERC20EnabledLooksRareAggregator(address _erc20EnabledLooksRareAggregator) external onlyOwner { if (erc20EnabledLooksRareAggregator != address(0)) { revert AlreadySet(); } erc20EnabledLooksRareAggregator = _erc20EnabledLooksRareAggregator; } /** * @notice Enable calling the specified proxy's trade function * @dev Must be called by the current owner * @param proxy The marketplace proxy's address * @param selector The marketplace proxy's function selector */ function addFunction(address proxy, bytes4 selector) external onlyOwner { _proxyFunctionSelectors[proxy][selector] = 1; emit FunctionAdded(proxy, selector); } /** * @notice Disable calling the specified proxy's trade function * @dev Must be called by the current owner * @param proxy The marketplace proxy's address * @param selector The marketplace proxy's function selector */ function removeFunction(address proxy, bytes4 selector) external onlyOwner { delete _proxyFunctionSelectors[proxy][selector]; emit FunctionRemoved(proxy, selector); } /** * @notice Approve marketplaces to transfer ERC20 tokens from the aggregator * @param currency The ERC20 token address to approve * @param marketplace The marketplace address to approve * @param amount The amount of ERC20 token to approve */ function approve( address currency, address marketplace, uint256 amount ) external onlyOwner { _executeERC20Approve(currency, marketplace, amount); } /** * @param proxy The marketplace proxy's address * @param selector The marketplace proxy's function selector * @return isSupported Whether the marketplace proxy's function can be called from the aggregator */ function supportsProxyFunction(address proxy, bytes4 selector) external view returns (bool isSupported) { isSupported = _proxyFunctionSelectors[proxy][selector] == 1; } /** * @notice Rescue any of the contract's trapped ERC721 tokens * @dev Must be called by the current owner * @param collection The address of the ERC721 token to rescue from the contract * @param tokenId The token ID of the ERC721 token to rescue from the contract * @param to Send the contract's specified ERC721 token ID to this address */ function rescueERC721( address collection, address to, uint256 tokenId ) external onlyOwner { _executeERC721TransferFrom(collection, address(this), to, tokenId); } /** * @notice Rescue any of the contract's trapped ERC1155 tokens * @dev Must be called by the current owner * @param collection The address of the ERC1155 token to rescue from the contract * @param tokenIds The token IDs of the ERC1155 token to rescue from the contract * @param amounts The amount of each token ID to rescue * @param to Send the contract's specified ERC1155 token ID to this address */ function rescueERC1155( address collection, address to, uint256[] calldata tokenIds, uint256[] calldata amounts ) external onlyOwner { _executeERC1155SafeBatchTransferFrom(collection, address(this), to, tokenIds, amounts); } /** * @dev If any order fails, the ETH paid to the marketplace * is refunded to the aggregator contract. The aggregator then has to refund * the ETH back to the user through _returnETHIfAny. */ receive() external payable {} function _returnERC20TokensIfAny(TokenTransfer[] calldata tokenTransfers, address recipient) private { uint256 tokenTransfersLength = tokenTransfers.length; for (uint256 i; i < tokenTransfersLength; ) { uint256 balance = IERC20(tokenTransfers[i].currency).balanceOf(address(this)); if (balance != 0) { _executeERC20DirectTransfer(tokenTransfers[i].currency, recipient, balance); } unchecked { ++i; } } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; abstract contract TokenReceiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return this.onERC721Received.selector; } function onERC1155Received( address, address, uint256, uint256, bytes calldata ) external virtual returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] calldata, uint256[] calldata, bytes calldata ) external virtual returns (bytes4) { return this.onERC1155BatchReceived.selector; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import {BasicOrder, TokenTransfer} from "../libraries/OrderStructs.sol"; interface ILooksRareAggregator { /** * @param proxy The marketplace proxy's address * @param selector The marketplace proxy's function selector * @param orders Orders to be executed by the marketplace * @param ordersExtraData Extra data for each order, specific for each marketplace * @param extraData Extra data specific for each marketplace */ struct TradeData { address proxy; bytes4 selector; BasicOrder[] orders; bytes[] ordersExtraData; bytes extraData; } /** * @notice Execute NFT sweeps in different marketplaces in a * single transaction * @param tokenTransfers Aggregated ERC20 token transfers for all markets * @param tradeData Data object to be passed downstream to each * marketplace's proxy for execution * @param originator The address that originated the transaction, * hard coded as msg.sender if it is called directly * @param recipient The address to receive the purchased NFTs * @param isAtomic Flag to enable atomic trades (all or nothing) * or partial trades */ function execute( TokenTransfer[] calldata tokenTransfers, TradeData[] calldata tradeData, address originator, address recipient, bool isAtomic ) external payable; /** * @notice Emitted when a marketplace proxy's function is enabled. * @param proxy The marketplace proxy's address * @param selector The marketplace proxy's function selector */ event FunctionAdded(address proxy, bytes4 selector); /** * @notice Emitted when a marketplace proxy's function is disabled. * @param proxy The marketplace proxy's address * @param selector The marketplace proxy's function selector */ event FunctionRemoved(address proxy, bytes4 selector); /** * @notice Emitted when execute is complete * @param sweeper The address that submitted the transaction */ event Sweep(address sweeper); error AlreadySet(); error ETHTransferFail(); error InvalidFunction(); error UseERC20EnabledLooksRareAggregator(); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; enum CollectionType { ERC721, ERC1155 }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import {CollectionType} from "./OrderEnums.sol"; /** * @param signer The order's maker * @param collection The address of the ERC721/ERC1155 token to be purchased * @param collectionType 0 for ERC721, 1 for ERC1155 * @param tokenIds The IDs of the tokens to be purchased * @param amounts Always 1 when ERC721, can be > 1 if ERC1155 * @param price The *taker bid* price to pay for the order * @param currency The order's currency, address(0) for ETH * @param startTime The timestamp when the order starts becoming valid * @param endTime The timestamp when the order stops becoming valid * @param signature split to v,r,s for LooksRare */ struct BasicOrder { address signer; address collection; CollectionType collectionType; uint256[] tokenIds; uint256[] amounts; uint256 price; address currency; uint256 startTime; uint256 endTime; bytes signature; } /** * @param amount ERC20 transfer amount * @param currency ERC20 transfer currency */ struct TokenTransfer { uint256 amount; address currency; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; error InvalidOrderLength(); error TradeExecutionFailed(); error ZeroAddress();
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; // Interfaces import {IOwnableTwoSteps} from "./interfaces/IOwnableTwoSteps.sol"; /** * @title OwnableTwoSteps * @notice This contract offers transfer of ownership in two steps with potential owner * having to confirm the transaction to become the owner. * Renouncement of the ownership is also a two-step process since the next potential owner is the address(0). * @author LooksRare protocol team (👀,💎) */ abstract contract OwnableTwoSteps is IOwnableTwoSteps { /** * @notice Address of the current owner. */ address public owner; /** * @notice Address of the potential owner. */ address public potentialOwner; /** * @notice Ownership status. */ Status public ownershipStatus; /** * @notice Modifier to wrap functions for contracts that inherit this contract. */ modifier onlyOwner() { _onlyOwner(); _; } /** * @notice Constructor * @param _owner The contract's owner */ constructor(address _owner) { owner = _owner; emit NewOwner(_owner); } /** * @notice This function is used to cancel the ownership transfer. * @dev This function can be used for both cancelling a transfer to a new owner and * cancelling the renouncement of the ownership. */ function cancelOwnershipTransfer() external onlyOwner { Status _ownershipStatus = ownershipStatus; if (_ownershipStatus == Status.NoOngoingTransfer) { revert NoOngoingTransferInProgress(); } if (_ownershipStatus == Status.TransferInProgress) { delete potentialOwner; } delete ownershipStatus; emit CancelOwnershipTransfer(); } /** * @notice This function is used to confirm the ownership renouncement. */ function confirmOwnershipRenouncement() external onlyOwner { if (ownershipStatus != Status.RenouncementInProgress) { revert RenouncementNotInProgress(); } delete owner; delete ownershipStatus; emit NewOwner(address(0)); } /** * @notice This function is used to confirm the ownership transfer. * @dev This function can only be called by the current potential owner. */ function confirmOwnershipTransfer() external { if (ownershipStatus != Status.TransferInProgress) { revert TransferNotInProgress(); } if (msg.sender != potentialOwner) { revert WrongPotentialOwner(); } owner = msg.sender; delete ownershipStatus; delete potentialOwner; emit NewOwner(msg.sender); } /** * @notice This function is used to initiate the transfer of ownership to a new owner. * @param newPotentialOwner New potential owner address */ function initiateOwnershipTransfer(address newPotentialOwner) external onlyOwner { if (ownershipStatus != Status.NoOngoingTransfer) { revert TransferAlreadyInProgress(); } ownershipStatus = Status.TransferInProgress; potentialOwner = newPotentialOwner; /** * @dev This function can only be called by the owner, so msg.sender is the owner. * We don't have to SLOAD the owner again. */ emit InitiateOwnershipTransfer(msg.sender, newPotentialOwner); } /** * @notice This function is used to initiate the ownership renouncement. */ function initiateOwnershipRenouncement() external onlyOwner { if (ownershipStatus != Status.NoOngoingTransfer) { revert TransferAlreadyInProgress(); } ownershipStatus = Status.RenouncementInProgress; emit InitiateOwnershipRenouncement(); } function _onlyOwner() private view { if (msg.sender != owner) revert NotOwner(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; // Interfaces import {IReentrancyGuard} from "./interfaces/IReentrancyGuard.sol"; /** * @title ReentrancyGuard * @notice This contract protects against reentrancy attacks. * It is adjusted from OpenZeppelin. * @author LooksRare protocol team (👀,💎) */ abstract contract ReentrancyGuard is IReentrancyGuard { uint256 private _status; /** * @notice Modifier to wrap functions to prevent reentrancy calls. */ modifier nonReentrant() { if (_status == 2) { revert ReentrancyFail(); } _status = 2; _; _status = 1; } constructor() { _status = 1; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /** * @notice It is emitted if the call recipient is not a contract. */ error NotAContract();
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /** * @notice It is emitted if the ETH transfer fails. */ error ETHTransferFail(); /** * @notice It is emitted if the ERC20 approval fails. */ error ERC20ApprovalFail(); /** * @notice It is emitted if the ERC20 transfer fails. */ error ERC20TransferFail(); /** * @notice It is emitted if the ERC20 transferFrom fails. */ error ERC20TransferFromFail(); /** * @notice It is emitted if the ERC721 transferFrom fails. */ error ERC721TransferFromFail(); /** * @notice It is emitted if the ERC1155 safeTransferFrom fails. */ error ERC1155SafeTransferFromFail(); /** * @notice It is emitted if the ERC1155 safeBatchTransferFrom fails. */ error ERC1155SafeBatchTransferFromFail();
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /** * @title IOwnableTwoSteps * @author LooksRare protocol team (👀,💎) */ interface IOwnableTwoSteps { /** * @notice This enum keeps track of the ownership status. * @param NoOngoingTransfer The default status when the owner is set * @param TransferInProgress The status when a transfer to a new owner is initialized * @param RenouncementInProgress The status when a transfer to address(0) is initialized */ enum Status { NoOngoingTransfer, TransferInProgress, RenouncementInProgress } /** * @notice This is returned when there is no transfer of ownership in progress. */ error NoOngoingTransferInProgress(); /** * @notice This is returned when the caller is not the owner. */ error NotOwner(); /** * @notice This is returned when there is no renouncement in progress but * the owner tries to validate the ownership renouncement. */ error RenouncementNotInProgress(); /** * @notice This is returned when the transfer is already in progress but the owner tries * initiate a new ownership transfer. */ error TransferAlreadyInProgress(); /** * @notice This is returned when there is no ownership transfer in progress but the * ownership change tries to be approved. */ error TransferNotInProgress(); /** * @notice This is returned when the ownership transfer is attempted to be validated by the * a caller that is not the potential owner. */ error WrongPotentialOwner(); /** * @notice This is emitted if the ownership transfer is cancelled. */ event CancelOwnershipTransfer(); /** * @notice This is emitted if the ownership renouncement is initiated. */ event InitiateOwnershipRenouncement(); /** * @notice This is emitted if the ownership transfer is initiated. * @param previousOwner Previous/current owner * @param potentialOwner Potential/future owner */ event InitiateOwnershipTransfer(address previousOwner, address potentialOwner); /** * @notice This is emitted when there is a new owner. */ event NewOwner(address newOwner); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /** * @title IReentrancyGuard * @author LooksRare protocol team (👀,💎) */ interface IReentrancyGuard { /** * @notice This is returned when there is a reentrant call. */ error ReentrancyFail(); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface IERC1155 { event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); event ApprovalForAll(address indexed account, address indexed operator, bool approved); event URI(string value, uint256 indexed id); function balanceOf(address account, uint256 id) external view returns (uint256); function balanceOfBatch( address[] calldata accounts, uint256[] calldata ids ) external view returns (uint256[] memory); function setApprovalForAll(address operator, bool approved) external; function isApprovedForAll(address account, address operator) external view returns (bool); function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface IERC20 { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface IERC721 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; function safeTransferFrom(address from, address to, uint256 tokenId) external; function transferFrom(address from, address to, uint256 tokenId) external; function approve(address to, uint256 tokenId) external; function setApprovalForAll(address operator, bool _approved) external; function getApproved(uint256 tokenId) external view returns (address operator); function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; // Interfaces import {IERC1155} from "../interfaces/generic/IERC1155.sol"; // Errors import {ERC1155SafeTransferFromFail, ERC1155SafeBatchTransferFromFail} from "../errors/LowLevelErrors.sol"; import {NotAContract} from "../errors/GenericErrors.sol"; /** * @title LowLevelERC1155Transfer * @notice This contract contains low-level calls to transfer ERC1155 tokens. * @author LooksRare protocol team (👀,💎) */ contract LowLevelERC1155Transfer { /** * @notice Execute ERC1155 safeTransferFrom * @param collection Address of the collection * @param from Address of the sender * @param to Address of the recipient * @param tokenId tokenId to transfer * @param amount Amount to transfer */ function _executeERC1155SafeTransferFrom( address collection, address from, address to, uint256 tokenId, uint256 amount ) internal { if (collection.code.length == 0) { revert NotAContract(); } (bool status, ) = collection.call(abi.encodeCall(IERC1155.safeTransferFrom, (from, to, tokenId, amount, ""))); if (!status) { revert ERC1155SafeTransferFromFail(); } } /** * @notice Execute ERC1155 safeBatchTransferFrom * @param collection Address of the collection * @param from Address of the sender * @param to Address of the recipient * @param tokenIds Array of tokenIds to transfer * @param amounts Array of amounts to transfer */ function _executeERC1155SafeBatchTransferFrom( address collection, address from, address to, uint256[] calldata tokenIds, uint256[] calldata amounts ) internal { if (collection.code.length == 0) { revert NotAContract(); } (bool status, ) = collection.call( abi.encodeCall(IERC1155.safeBatchTransferFrom, (from, to, tokenIds, amounts, "")) ); if (!status) { revert ERC1155SafeBatchTransferFromFail(); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; // Interfaces import {IERC20} from "../interfaces/generic/IERC20.sol"; // Errors import {ERC20ApprovalFail} from "../errors/LowLevelErrors.sol"; import {NotAContract} from "../errors/GenericErrors.sol"; /** * @title LowLevelERC20Approve * @notice This contract contains low-level calls to approve ERC20 tokens. * @author LooksRare protocol team (👀,💎) */ contract LowLevelERC20Approve { /** * @notice Execute ERC20 approve * @param currency Currency address * @param to Operator address * @param amount Amount to approve */ function _executeERC20Approve(address currency, address to, uint256 amount) internal { if (currency.code.length == 0) { revert NotAContract(); } (bool status, bytes memory data) = currency.call(abi.encodeCall(IERC20.approve, (to, amount))); if (!status) { revert ERC20ApprovalFail(); } if (data.length > 0) { if (!abi.decode(data, (bool))) { revert ERC20ApprovalFail(); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; // Interfaces import {IERC20} from "../interfaces/generic/IERC20.sol"; // Errors import {ERC20TransferFail, ERC20TransferFromFail} from "../errors/LowLevelErrors.sol"; import {NotAContract} from "../errors/GenericErrors.sol"; /** * @title LowLevelERC20Transfer * @notice This contract contains low-level calls to transfer ERC20 tokens. * @author LooksRare protocol team (👀,💎) */ contract LowLevelERC20Transfer { /** * @notice Execute ERC20 transferFrom * @param currency Currency address * @param from Sender address * @param to Recipient address * @param amount Amount to transfer */ function _executeERC20TransferFrom(address currency, address from, address to, uint256 amount) internal { if (currency.code.length == 0) { revert NotAContract(); } (bool status, bytes memory data) = currency.call(abi.encodeCall(IERC20.transferFrom, (from, to, amount))); if (!status) { revert ERC20TransferFromFail(); } if (data.length > 0) { if (!abi.decode(data, (bool))) { revert ERC20TransferFromFail(); } } } /** * @notice Execute ERC20 (direct) transfer * @param currency Currency address * @param to Recipient address * @param amount Amount to transfer */ function _executeERC20DirectTransfer(address currency, address to, uint256 amount) internal { if (currency.code.length == 0) { revert NotAContract(); } (bool status, bytes memory data) = currency.call(abi.encodeCall(IERC20.transfer, (to, amount))); if (!status) { revert ERC20TransferFail(); } if (data.length > 0) { if (!abi.decode(data, (bool))) { revert ERC20TransferFail(); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; // Interfaces import {IERC721} from "../interfaces/generic/IERC721.sol"; // Errors import {ERC721TransferFromFail} from "../errors/LowLevelErrors.sol"; import {NotAContract} from "../errors/GenericErrors.sol"; /** * @title LowLevelERC721Transfer * @notice This contract contains low-level calls to transfer ERC721 tokens. * @author LooksRare protocol team (👀,💎) */ contract LowLevelERC721Transfer { /** * @notice Execute ERC721 transferFrom * @param collection Address of the collection * @param from Address of the sender * @param to Address of the recipient * @param tokenId tokenId to transfer */ function _executeERC721TransferFrom(address collection, address from, address to, uint256 tokenId) internal { if (collection.code.length == 0) { revert NotAContract(); } (bool status, ) = collection.call(abi.encodeCall(IERC721.transferFrom, (from, to, tokenId))); if (!status) { revert ERC721TransferFromFail(); } } }
{ "remappings": [ "@ensdomains/=node_modules/@ensdomains/", "@looksrare/=node_modules/@looksrare/", "@openzeppelin/=node_modules/@openzeppelin/", "ds-test/=lib/forge-std/lib/ds-test/src/", "eth-gas-reporter/=node_modules/eth-gas-reporter/", "forge-std/=lib/forge-std/src/", "hardhat/=node_modules/hardhat/", "solmate/=node_modules/solmate/" ], "optimizer": { "enabled": true, "runs": 888888 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadySet","type":"error"},{"inputs":[],"name":"ERC1155SafeBatchTransferFromFail","type":"error"},{"inputs":[],"name":"ERC20ApprovalFail","type":"error"},{"inputs":[],"name":"ERC20TransferFail","type":"error"},{"inputs":[],"name":"ERC721TransferFromFail","type":"error"},{"inputs":[],"name":"ETHTransferFail","type":"error"},{"inputs":[],"name":"InvalidFunction","type":"error"},{"inputs":[],"name":"InvalidOrderLength","type":"error"},{"inputs":[],"name":"NoOngoingTransferInProgress","type":"error"},{"inputs":[],"name":"NotAContract","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"ReentrancyFail","type":"error"},{"inputs":[],"name":"RenouncementNotInProgress","type":"error"},{"inputs":[],"name":"TradeExecutionFailed","type":"error"},{"inputs":[],"name":"TransferAlreadyInProgress","type":"error"},{"inputs":[],"name":"TransferNotInProgress","type":"error"},{"inputs":[],"name":"UseERC20EnabledLooksRareAggregator","type":"error"},{"inputs":[],"name":"WrongPotentialOwner","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[],"name":"CancelOwnershipTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"proxy","type":"address"},{"indexed":false,"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"FunctionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"proxy","type":"address"},{"indexed":false,"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"FunctionRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"InitiateOwnershipRenouncement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"potentialOwner","type":"address"}],"name":"InitiateOwnershipTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sweeper","type":"address"}],"name":"Sweep","type":"event"},{"inputs":[{"internalType":"address","name":"proxy","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"addFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"address","name":"marketplace","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmOwnershipRenouncement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"erc20EnabledLooksRareAggregator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"currency","type":"address"}],"internalType":"struct TokenTransfer[]","name":"tokenTransfers","type":"tuple[]"},{"components":[{"internalType":"address","name":"proxy","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"components":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"enum CollectionType","name":"collectionType","type":"uint8"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct BasicOrder[]","name":"orders","type":"tuple[]"},{"internalType":"bytes[]","name":"ordersExtraData","type":"bytes[]"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct ILooksRareAggregator.TradeData[]","name":"tradeData","type":"tuple[]"},{"internalType":"address","name":"originator","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"isAtomic","type":"bool"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"initiateOwnershipRenouncement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPotentialOwner","type":"address"}],"name":"initiateOwnershipTransfer","outputs":[],"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":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownershipStatus","outputs":[{"internalType":"enum IOwnableTwoSteps.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"potentialOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxy","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"removeFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"rescueERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rescueERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20EnabledLooksRareAggregator","type":"address"}],"name":"setERC20EnabledLooksRareAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxy","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"supportsProxyFunction","outputs":[{"internalType":"bool","name":"isSupported","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080346100a357601f61205c38819003918201601f19168301916001600160401b038311848410176100a8578084926020946040528339810103126100a357516001600160a01b038116908190036100a3576001600081905580546001600160a01b031916821790556040519081527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc90602090a1604051611f9d90816100bf8239f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630c9a50b3146101ab57806312abee12146101a2578063150b7a021461019957806323452b9c146101905780632bb5a9e6146101875780633e5675391461017e5780635b6ac011146101755780637200b8291461016c5780637762df25146101635780637bcf8bba1461015a5780637df325e1146101515780638da5cb5b146101485780639b1106181461013f578063b949580014610136578063bc197c811461012d578063c0b6f56114610124578063ca53d0b71461011b578063e1f21c6714610112578063edf9d5c8146101095763f23a6e610361000e576101046112a9565b61000e565b50610104611116565b50610104611006565b50610104610f4a565b50610104610e1d565b50610104610d55565b50610104610cc2565b50610104610c6f565b50610104610c1c565b50610104610b2f565b50610104610a71565b50610104610a1e565b506101046108ae565b506101046107c3565b506101046106b3565b5061010461065b565b506101046104ff565b5061010461046d565b5061010461039d565b5061010461026e565b73ffffffffffffffffffffffffffffffffffffffff8116036101d257565b600080fd5b604435906101e4826101b4565b565b606435906101e4826101b4565b35906101e4826101b4565b7fffffffff000000000000000000000000000000000000000000000000000000008116036101d257565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126101d25760043561025e816101b4565b9060243561026b816101fe565b90565b50346101d2577fee43eda4dc4728f3b2c1a9b5dfdda27f5e3345bb35f639415984ffb909f1c95361029e36610228565b906102a7611e37565b73ffffffffffffffffffffffffffffffffffffffff811660005260046020526001610302836040600020907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b556040805173ffffffffffffffffffffffffffffffffffffffff90921682527fffffffff00000000000000000000000000000000000000000000000000000000909216602082015290819081015b0390a1005b9181601f840112156101d25782359167ffffffffffffffff83116101d2576020808501948460051b0101116101d257565b801515036101d257565b608435906101e482610386565b5060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d25767ffffffffffffffff6004358181116101d257366023820112156101d25780600401358281116101d2573660248260061b840101116101d2576024359283116101d25761041c610019933690600401610355565b6104246101d7565b9161042d6101e6565b936024610438610390565b960161133b565b9181601f840112156101d25782359167ffffffffffffffff83116101d257602083818601950101116101d257565b50346101d25760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d2576104a86004356101b4565b6104b36024356101b4565b60643567ffffffffffffffff81116101d2576104d390369060040161043f565b505060206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b50346101d2576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061657610538611e37565b60025460ff8160a01c166003811015610609575b80156105df578061055e600192610649565b146105b4575b507fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600254166002557f8eca980489e87f7dba4f26917aa4bfc906eb3f2b4f7b4b9fd0ff2b8bb3e21ae38180a180f35b7fffffffffffffffffffffffff00000000000000000000000000000000000000001660025538610564565b60046040517fccf69db7000000000000000000000000000000000000000000000000000000008152fd5b610611610619565b61054c565b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003111561065357565b6101e4610619565b50346101d25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257602060ff60025460a01c166040519060038110156106a7578152f35b6106af610619565b8152f35b50346101d25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d2576106eb611e37565b600260ff815460a01c1660038110156107b6575b0361078c577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154166001556107597fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff60025416600255565b604051600081527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc908060208101610350565b60046040517f045c5122000000000000000000000000000000000000000000000000000000008152fd5b6107be610619565b6106ff565b50346101d2576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610616576107fc611e37565b60025460ff8160a01c1660038110156108a1575b610877577fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000176002557f3ff05a45e46337fa1cbf20996d2eeb927280bce099f37252bcca1040609604ec8180a180f35b60046040517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b6108a9610619565b610810565b50346101d25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257600254600160ff8260a01c166108f381610649565b036109f45773ffffffffffffffffffffffffffffffffffffffff1633036109ca57600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905561096b7fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff60025416600255565b6109987fffffffffffffffffffffffff000000000000000000000000000000000000000060025416600255565b6040513381527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc908060208101610350565b60046040517fafdcfb92000000000000000000000000000000000000000000000000000000008152fd5b60046040517f5e4f2826000000000000000000000000000000000000000000000000000000008152fd5b50346101d25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b50346101d25760206001610adb73ffffffffffffffffffffffffffffffffffffffff610a9c36610228565b9116600052600484526040600020907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b5414604051908152f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126101d257600435610b1b816101b4565b90602435610b28816101b4565b9060443590565b50346101d257610b3e36610ae5565b9091610b48611e37565b803b15610bf2576000928380936040519073ffffffffffffffffffffffffffffffffffffffff60208301947f23b872dd000000000000000000000000000000000000000000000000000000008652306024850152166044830152606482015260648152610bb481611c33565b51925af1610bc0611c9d565b5015610bc857005b60046040517fe0f5c508000000000000000000000000000000000000000000000000000000008152fd5b60046040517f09ee12d5000000000000000000000000000000000000000000000000000000008152fd5b50346101d25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346101d25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b50346101d2577f5abbfd8975596a613736baed6c3c864ee660459894ad98c7e6492b4c3c40f325610cf236610228565b90610cfb611e37565b73ffffffffffffffffffffffffffffffffffffffff8116600052600460205260006103028360408320907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b50346101d25760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257610d906004356101b4565b610d9b6024356101b4565b67ffffffffffffffff6044358181116101d257610dbc903690600401610355565b50506064358181116101d257610dd6903690600401610355565b50506084359081116101d257610df090369060040161043f565b50506040517fbc197c81000000000000000000000000000000000000000000000000000000008152602090f35b50346101d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257600435610e59816101b4565b610e61611e37565b60ff60025460a01c166003811015610f3d575b610877576103507fb86c75c9bffca616b2d314cc914f7c3f1d174255b16b941c3f3ededee276d5ef91610ee1740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff6002541617600255565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216918217905560408051338152602081019290925290918291820190565b610f45610619565b610e74565b50346101d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257600435610f86816101b4565b610f8e611e37565b6003549073ffffffffffffffffffffffffffffffffffffffff808316610fdc577fffffffffffffffffffffffff00000000000000000000000000000000000000009116911617600355600080f35b60046040517fa741a045000000000000000000000000000000000000000000000000000000008152fd5b50346101d25761101536610ae5565b909161101f611e37565b803b15610bf2576040517f095ea7b3000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff90941660248201526044810192909252600092839283906110b281606481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611c5c565b51925af16110be611c9d565b90156110ec578051806110cd57005b816020806110e2936110e69501019101611e82565b1590565b6110ec57005b60046040517fe2f7b689000000000000000000000000000000000000000000000000000000008152fd5b50346101d25760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257600435611152816101b4565b60243561115e816101b4565b67ffffffffffffffff916044358381116101d257611180903690600401610355565b9190936064359081116101d25761119b903690600401610355565b9390926111a6611e37565b823b15610bf25761124960209561121761126a986040519473ffffffffffffffffffffffffffffffffffffffff8a8701977f2eb2c2d600000000000000000000000000000000000000000000000000000000895230602489015216604487015260a0606487015260c4860191611892565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc9687858403016084860152611892565b9080820394850160a482015260009687968796878095528084520182611c5c565b51925af1611276611c9d565b501561127f5780f35b60046040517f65da8e40000000000000000000000000000000000000000000000000000000008152fd5b50346101d25760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d2576112e46004356101b4565b6112ef6024356101b4565b60843567ffffffffffffffff81116101d25761130f90369060040161043f565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b93949190929560009560028754146116b957600287559273ffffffffffffffffffffffffffffffffffffffff81161561168f5787156116655784159384156115ed57503397908895949392915b885b81811061146a57505050505015611459575b505050600190814711611428575b50156113fe5760405173ffffffffffffffffffffffffffffffffffffffff9190911681527f807273efecfbeb7ae7d3a2189d1ed5a7db80074eed86e7d80b10bb925cd1db7390602090a16101e46001600055565b60046040517f07246cf4000000000000000000000000000000000000000000000000000000008152fd5b80808093507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4701855af1386113aa565b61146292611d43565b38828161139c565b849596975061148081836114f894959697611713565b61148981611761565b6114b38173ffffffffffffffffffffffffffffffffffffffff166000526004602052604060002090565b6020928381019160019687916114c88561176b565b7fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b54036115c3578792898f939261155b87611086611515889761176b565b946040996115468b61152981890189611775565b9290986115396060820182611775565b92909160808101906117c9565b949093519a8b998a019c8d5260248a016119df565b51915af49087611569611c9d565b9215611582575b5050505001939291908996959461138a565b61158c5787611570565b81511561159a575080519101fd5b600490517ff3da58dc000000000000000000000000000000000000000000000000000000008152fd5b60046040517fdb2079c3000000000000000000000000000000000000000000000000000000008152fd5b9761162961161060035473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b330361163b5790889594939291611388565b60046040517fe72943b3000000000000000000000000000000000000000000000000000000008152fd5b60046040517fc588f910000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1bbee726000000000000000000000000000000000000000000000000000000008152fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611754575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61813603018212156101d2570190565b61175c6116e3565b61171d565b3561026b816101b4565b3561026b816101fe565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101d2570180359067ffffffffffffffff82116101d257602001918160051b360383136101d257565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101d2570180359067ffffffffffffffff82116101d2576020019181360383136101d257565b359060028210156101d257565b9060028210156118345752565b61183c610619565b52565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156101d257016020813591019167ffffffffffffffff82116101d2578160051b360383136101d257565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116101d25760209260051b809284830137010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156101d257016020813591019167ffffffffffffffff82116101d25781360383136101d257565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9082818152602080910193818360051b82010194846000925b858410611988575050505050505090565b9091929394959685806119ce837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030188526119c88c886118cf565b9061191f565b990194019401929594939190611977565b95939192909897969860a09084828901838a525260c09485890195808260051b8b0101968394600094855b858710611a70575050505050505050938593611a3b84611a49946080986101e49b9a611a68980360208a015261195e565b91858303604087015261191f565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019015159052565b90919293949596997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408e82030185528a357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec184360301811215611bff5790836001920190611afb81611ae1846101f3565b73ffffffffffffffffffffffffffffffffffffffff169052565b611bed6020928392611b2d611b118584016101f3565b73ffffffffffffffffffffffffffffffffffffffff1682860152565b611b466040611b3d81850161181a565b90830190611827565b611b87611b6c6060611b5a8186018661183f565b90916101408091870152850191611892565b6080611b7a8186018661183f565b9185840390860152611892565b91898101358a830152611bba611b9e8d83016101f3565b73ffffffffffffffffffffffffffffffffffffffff16838e0152565b60e080820135908301526101008082013590830152611bdf61012091828101906118cf565b92909181850391015261191f565b9c019501970195949396929190611a0a565b8280fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff821117611c4f57604052565b611c57611c03565b604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611c4f57604052565b3d15611d04573d9067ffffffffffffffff8211611cf7575b60405191611ceb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184611c5c565b82523d6000602084013e565b611cff611c03565b611cb5565b606090565b9190811015611d1a575b60061b0190565b611d226116e3565b611d13565b908160209103126101d2575190565b506040513d6000823e3d90fd5b9291600090815b838110611d5957505050509050565b8080858481611d7e6116106116108d611d7860019a6020988993611d09565b01611761565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015293908190859060249082905afa938415611e2a575b8994611dfb575b508b84611dda575b50505050505001611d4a565b611df095611deb93611d7892611d09565b611e97565b80388487828b611dce565b81611e1c9295503d8611611e23575b611e148183611c5c565b810190611d27565b9238611dc6565b503d611e0a565b611e32611d36565b611dbf565b73ffffffffffffffffffffffffffffffffffffffff600154163303611e5857565b60046040517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b908160209103126101d2575161026b81610386565b919091803b15610bf2576040517fa9059cbb000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff9094166024820152604481019290925260009283928390611f058160648101611086565b51925af1611f11611c9d565b9015611f3d57805180611f22575050565b816020806110e293611f379501019101611e82565b611f3d57565b60046040517ff1568f95000000000000000000000000000000000000000000000000000000008152fdfea2646970667358221220cf213cfbc053cf2626fa46bb4c7633814c8a354bce3c58bb2c9331df6ae4be4d64736f6c634300081100330000000000000000000000003ab105f0e4a22ec4a96a9b0ca90c5c534d21f3a7
Deployed Bytecode
0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630c9a50b3146101ab57806312abee12146101a2578063150b7a021461019957806323452b9c146101905780632bb5a9e6146101875780633e5675391461017e5780635b6ac011146101755780637200b8291461016c5780637762df25146101635780637bcf8bba1461015a5780637df325e1146101515780638da5cb5b146101485780639b1106181461013f578063b949580014610136578063bc197c811461012d578063c0b6f56114610124578063ca53d0b71461011b578063e1f21c6714610112578063edf9d5c8146101095763f23a6e610361000e576101046112a9565b61000e565b50610104611116565b50610104611006565b50610104610f4a565b50610104610e1d565b50610104610d55565b50610104610cc2565b50610104610c6f565b50610104610c1c565b50610104610b2f565b50610104610a71565b50610104610a1e565b506101046108ae565b506101046107c3565b506101046106b3565b5061010461065b565b506101046104ff565b5061010461046d565b5061010461039d565b5061010461026e565b73ffffffffffffffffffffffffffffffffffffffff8116036101d257565b600080fd5b604435906101e4826101b4565b565b606435906101e4826101b4565b35906101e4826101b4565b7fffffffff000000000000000000000000000000000000000000000000000000008116036101d257565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126101d25760043561025e816101b4565b9060243561026b816101fe565b90565b50346101d2577fee43eda4dc4728f3b2c1a9b5dfdda27f5e3345bb35f639415984ffb909f1c95361029e36610228565b906102a7611e37565b73ffffffffffffffffffffffffffffffffffffffff811660005260046020526001610302836040600020907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b556040805173ffffffffffffffffffffffffffffffffffffffff90921682527fffffffff00000000000000000000000000000000000000000000000000000000909216602082015290819081015b0390a1005b9181601f840112156101d25782359167ffffffffffffffff83116101d2576020808501948460051b0101116101d257565b801515036101d257565b608435906101e482610386565b5060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d25767ffffffffffffffff6004358181116101d257366023820112156101d25780600401358281116101d2573660248260061b840101116101d2576024359283116101d25761041c610019933690600401610355565b6104246101d7565b9161042d6101e6565b936024610438610390565b960161133b565b9181601f840112156101d25782359167ffffffffffffffff83116101d257602083818601950101116101d257565b50346101d25760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d2576104a86004356101b4565b6104b36024356101b4565b60643567ffffffffffffffff81116101d2576104d390369060040161043f565b505060206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b50346101d2576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261061657610538611e37565b60025460ff8160a01c166003811015610609575b80156105df578061055e600192610649565b146105b4575b507fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600254166002557f8eca980489e87f7dba4f26917aa4bfc906eb3f2b4f7b4b9fd0ff2b8bb3e21ae38180a180f35b7fffffffffffffffffffffffff00000000000000000000000000000000000000001660025538610564565b60046040517fccf69db7000000000000000000000000000000000000000000000000000000008152fd5b610611610619565b61054c565b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003111561065357565b6101e4610619565b50346101d25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257602060ff60025460a01c166040519060038110156106a7578152f35b6106af610619565b8152f35b50346101d25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d2576106eb611e37565b600260ff815460a01c1660038110156107b6575b0361078c577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154166001556107597fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff60025416600255565b604051600081527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc908060208101610350565b60046040517f045c5122000000000000000000000000000000000000000000000000000000008152fd5b6107be610619565b6106ff565b50346101d2576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610616576107fc611e37565b60025460ff8160a01c1660038110156108a1575b610877577fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000176002557f3ff05a45e46337fa1cbf20996d2eeb927280bce099f37252bcca1040609604ec8180a180f35b60046040517f74ed79ae000000000000000000000000000000000000000000000000000000008152fd5b6108a9610619565b610810565b50346101d25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257600254600160ff8260a01c166108f381610649565b036109f45773ffffffffffffffffffffffffffffffffffffffff1633036109ca57600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000163317905561096b7fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff60025416600255565b6109987fffffffffffffffffffffffff000000000000000000000000000000000000000060025416600255565b6040513381527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc908060208101610350565b60046040517fafdcfb92000000000000000000000000000000000000000000000000000000008152fd5b60046040517f5e4f2826000000000000000000000000000000000000000000000000000000008152fd5b50346101d25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b50346101d25760206001610adb73ffffffffffffffffffffffffffffffffffffffff610a9c36610228565b9116600052600484526040600020907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b5414604051908152f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60609101126101d257600435610b1b816101b4565b90602435610b28816101b4565b9060443590565b50346101d257610b3e36610ae5565b9091610b48611e37565b803b15610bf2576000928380936040519073ffffffffffffffffffffffffffffffffffffffff60208301947f23b872dd000000000000000000000000000000000000000000000000000000008652306024850152166044830152606482015260648152610bb481611c33565b51925af1610bc0611c9d565b5015610bc857005b60046040517fe0f5c508000000000000000000000000000000000000000000000000000000008152fd5b60046040517f09ee12d5000000000000000000000000000000000000000000000000000000008152fd5b50346101d25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346101d25760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b50346101d2577f5abbfd8975596a613736baed6c3c864ee660459894ad98c7e6492b4c3c40f325610cf236610228565b90610cfb611e37565b73ffffffffffffffffffffffffffffffffffffffff8116600052600460205260006103028360408320907fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b50346101d25760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257610d906004356101b4565b610d9b6024356101b4565b67ffffffffffffffff6044358181116101d257610dbc903690600401610355565b50506064358181116101d257610dd6903690600401610355565b50506084359081116101d257610df090369060040161043f565b50506040517fbc197c81000000000000000000000000000000000000000000000000000000008152602090f35b50346101d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257600435610e59816101b4565b610e61611e37565b60ff60025460a01c166003811015610f3d575b610877576103507fb86c75c9bffca616b2d314cc914f7c3f1d174255b16b941c3f3ededee276d5ef91610ee1740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff6002541617600255565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216918217905560408051338152602081019290925290918291820190565b610f45610619565b610e74565b50346101d25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257600435610f86816101b4565b610f8e611e37565b6003549073ffffffffffffffffffffffffffffffffffffffff808316610fdc577fffffffffffffffffffffffff00000000000000000000000000000000000000009116911617600355600080f35b60046040517fa741a045000000000000000000000000000000000000000000000000000000008152fd5b50346101d25761101536610ae5565b909161101f611e37565b803b15610bf2576040517f095ea7b3000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff90941660248201526044810192909252600092839283906110b281606481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611c5c565b51925af16110be611c9d565b90156110ec578051806110cd57005b816020806110e2936110e69501019101611e82565b1590565b6110ec57005b60046040517fe2f7b689000000000000000000000000000000000000000000000000000000008152fd5b50346101d25760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d257600435611152816101b4565b60243561115e816101b4565b67ffffffffffffffff916044358381116101d257611180903690600401610355565b9190936064359081116101d25761119b903690600401610355565b9390926111a6611e37565b823b15610bf25761124960209561121761126a986040519473ffffffffffffffffffffffffffffffffffffffff8a8701977f2eb2c2d600000000000000000000000000000000000000000000000000000000895230602489015216604487015260a0606487015260c4860191611892565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc9687858403016084860152611892565b9080820394850160a482015260009687968796878095528084520182611c5c565b51925af1611276611c9d565b501561127f5780f35b60046040517f65da8e40000000000000000000000000000000000000000000000000000000008152fd5b50346101d25760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d2576112e46004356101b4565b6112ef6024356101b4565b60843567ffffffffffffffff81116101d25761130f90369060040161043f565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b93949190929560009560028754146116b957600287559273ffffffffffffffffffffffffffffffffffffffff81161561168f5787156116655784159384156115ed57503397908895949392915b885b81811061146a57505050505015611459575b505050600190814711611428575b50156113fe5760405173ffffffffffffffffffffffffffffffffffffffff9190911681527f807273efecfbeb7ae7d3a2189d1ed5a7db80074eed86e7d80b10bb925cd1db7390602090a16101e46001600055565b60046040517f07246cf4000000000000000000000000000000000000000000000000000000008152fd5b80808093507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4701855af1386113aa565b61146292611d43565b38828161139c565b849596975061148081836114f894959697611713565b61148981611761565b6114b38173ffffffffffffffffffffffffffffffffffffffff166000526004602052604060002090565b6020928381019160019687916114c88561176b565b7fffffffff0000000000000000000000000000000000000000000000000000000016600052602052604060002090565b54036115c3578792898f939261155b87611086611515889761176b565b946040996115468b61152981890189611775565b9290986115396060820182611775565b92909160808101906117c9565b949093519a8b998a019c8d5260248a016119df565b51915af49087611569611c9d565b9215611582575b5050505001939291908996959461138a565b61158c5787611570565b81511561159a575080519101fd5b600490517ff3da58dc000000000000000000000000000000000000000000000000000000008152fd5b60046040517fdb2079c3000000000000000000000000000000000000000000000000000000008152fd5b9761162961161060035473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b330361163b5790889594939291611388565b60046040517fe72943b3000000000000000000000000000000000000000000000000000000008152fd5b60046040517fc588f910000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1bbee726000000000000000000000000000000000000000000000000000000008152fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611754575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61813603018212156101d2570190565b61175c6116e3565b61171d565b3561026b816101b4565b3561026b816101fe565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101d2570180359067ffffffffffffffff82116101d257602001918160051b360383136101d257565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101d2570180359067ffffffffffffffff82116101d2576020019181360383136101d257565b359060028210156101d257565b9060028210156118345752565b61183c610619565b52565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156101d257016020813591019167ffffffffffffffff82116101d2578160051b360383136101d257565b90918281527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116101d25760209260051b809284830137010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156101d257016020813591019167ffffffffffffffff82116101d25781360383136101d257565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9082818152602080910193818360051b82010194846000925b858410611988575050505050505090565b9091929394959685806119ce837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030188526119c88c886118cf565b9061191f565b990194019401929594939190611977565b95939192909897969860a09084828901838a525260c09485890195808260051b8b0101968394600094855b858710611a70575050505050505050938593611a3b84611a49946080986101e49b9a611a68980360208a015261195e565b91858303604087015261191f565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019015159052565b90919293949596997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408e82030185528a357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec184360301811215611bff5790836001920190611afb81611ae1846101f3565b73ffffffffffffffffffffffffffffffffffffffff169052565b611bed6020928392611b2d611b118584016101f3565b73ffffffffffffffffffffffffffffffffffffffff1682860152565b611b466040611b3d81850161181a565b90830190611827565b611b87611b6c6060611b5a8186018661183f565b90916101408091870152850191611892565b6080611b7a8186018661183f565b9185840390860152611892565b91898101358a830152611bba611b9e8d83016101f3565b73ffffffffffffffffffffffffffffffffffffffff16838e0152565b60e080820135908301526101008082013590830152611bdf61012091828101906118cf565b92909181850391015261191f565b9c019501970195949396929190611a0a565b8280fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff821117611c4f57604052565b611c57611c03565b604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611c4f57604052565b3d15611d04573d9067ffffffffffffffff8211611cf7575b60405191611ceb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184611c5c565b82523d6000602084013e565b611cff611c03565b611cb5565b606090565b9190811015611d1a575b60061b0190565b611d226116e3565b611d13565b908160209103126101d2575190565b506040513d6000823e3d90fd5b9291600090815b838110611d5957505050509050565b8080858481611d7e6116106116108d611d7860019a6020988993611d09565b01611761565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015293908190859060249082905afa938415611e2a575b8994611dfb575b508b84611dda575b50505050505001611d4a565b611df095611deb93611d7892611d09565b611e97565b80388487828b611dce565b81611e1c9295503d8611611e23575b611e148183611c5c565b810190611d27565b9238611dc6565b503d611e0a565b611e32611d36565b611dbf565b73ffffffffffffffffffffffffffffffffffffffff600154163303611e5857565b60046040517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b908160209103126101d2575161026b81610386565b919091803b15610bf2576040517fa9059cbb000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff9094166024820152604481019290925260009283928390611f058160648101611086565b51925af1611f11611c9d565b9015611f3d57805180611f22575050565b816020806110e293611f379501019101611e82565b611f3d57565b60046040517ff1568f95000000000000000000000000000000000000000000000000000000008152fdfea2646970667358221220cf213cfbc053cf2626fa46bb4c7633814c8a354bce3c58bb2c9331df6ae4be4d64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003ab105f0e4a22ec4a96a9b0ca90c5c534d21f3a7
-----Decoded View---------------
Arg [0] : _owner (address): 0x3ab105F0e4A22ec4A96a9b0Ca90c5C534d21f3a7
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003ab105f0e4a22ec4a96a9b0ca90c5c534d21f3a7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,361.27 | 0.000000000000000001 | <$0.000001 |
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.