Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x75303ea2f193e99f7a4199a28442eb64e8dc0c905f2c039a973b5b10fdb65a81 | Grant Approvals | (pending) | 1 hr ago | IN | 0 ETH | (Pending) | |||
0x75981b8e8d330af773533a577db715f05d7042200687712b43f3944071e4b5ce | Grant Approvals | (pending) | 2 days ago | IN | 0 ETH | (Pending) | |||
0x5615958105811e01023e5246520f70e0ef3e369861642d669e64dfd9bd2d5d35 | Grant Approvals | (pending) | 2 days ago | IN | 0 ETH | (Pending) | |||
0x9b065eeec0400a6e838d4e821954d6d0fae418ab4999b809fc38d35089363f76 | Grant Approvals | (pending) | 3 days ago | IN | 0 ETH | (Pending) | |||
Grant Approvals | 21762575 | 16 mins ago | IN | 0 ETH | 0.0007577 | ||||
Grant Approvals | 21762571 | 17 mins ago | IN | 0 ETH | 0.00076984 | ||||
Grant Approvals | 21761307 | 4 hrs ago | IN | 0 ETH | 0.00049682 | ||||
Grant Approvals | 21759681 | 9 hrs ago | IN | 0 ETH | 0.00021445 | ||||
Grant Approvals | 21758351 | 14 hrs ago | IN | 0 ETH | 0.0000712 | ||||
Grant Approvals | 21757991 | 15 hrs ago | IN | 0 ETH | 0.00013073 | ||||
Grant Approvals | 21757797 | 16 hrs ago | IN | 0 ETH | 0.00012283 | ||||
Grant Approvals | 21757701 | 16 hrs ago | IN | 0 ETH | 0.0001855 | ||||
Grant Approvals | 21756415 | 20 hrs ago | IN | 0 ETH | 0.00013155 | ||||
Grant Approvals | 21756062 | 22 hrs ago | IN | 0 ETH | 0.00013065 | ||||
Grant Approvals | 21755414 | 24 hrs ago | IN | 0 ETH | 0.00008932 | ||||
Grant Approvals | 21754948 | 25 hrs ago | IN | 0 ETH | 0.00022307 | ||||
Grant Approvals | 21754651 | 26 hrs ago | IN | 0 ETH | 0.00012732 | ||||
Grant Approvals | 21753667 | 30 hrs ago | IN | 0 ETH | 0.0001267 | ||||
Grant Approvals | 21748434 | 47 hrs ago | IN | 0 ETH | 0.000074 | ||||
Grant Approvals | 21748015 | 2 days ago | IN | 0 ETH | 0.00009583 | ||||
Grant Approvals | 21747601 | 2 days ago | IN | 0 ETH | 0.00020017 | ||||
Grant Approvals | 21747306 | 2 days ago | IN | 0 ETH | 0.00019646 | ||||
Grant Approvals | 21746864 | 2 days ago | IN | 0 ETH | 0.00021437 | ||||
Grant Approvals | 21745757 | 2 days ago | IN | 0 ETH | 0.00069335 | ||||
Grant Approvals | 21745310 | 2 days ago | IN | 0 ETH | 0.00063309 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16824890 | 691 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TransferManager
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; // LooksRare unopinionated libraries import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol"; import {LowLevelERC721Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC721Transfer.sol"; import {LowLevelERC1155Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC1155Transfer.sol"; // Interfaces and errors import {ITransferManager} from "./interfaces/ITransferManager.sol"; import {AmountInvalid, LengthsInvalid} from "./errors/SharedErrors.sol"; // Libraries import {OrderStructs} from "./libraries/OrderStructs.sol"; // Enums import {CollectionType} from "./enums/CollectionType.sol"; /** * @title TransferManager * @notice This contract provides the transfer functions for ERC721/ERC1155 for contracts that require them. * Collection type "0" refers to ERC721 transfer functions. * Collection type "1" refers to ERC1155 transfer functions. * @dev "Safe" transfer functions for ERC721 are not implemented since they come with added gas costs * to verify if the recipient is a contract as it requires verifying the receiver interface is valid. * @author LooksRare protocol team (👀,💎) */ contract TransferManager is ITransferManager, LowLevelERC721Transfer, LowLevelERC1155Transfer, OwnableTwoSteps { /** * @notice This returns whether the user has approved the operator address. * The first address is the user and the second address is the operator (e.g. LooksRareProtocol). */ mapping(address => mapping(address => bool)) public hasUserApprovedOperator; /** * @notice This returns whether the operator address is allowed by this contract's owner. */ mapping(address => bool) public isOperatorAllowed; /** * @notice Constructor * @param _owner Owner address */ constructor(address _owner) OwnableTwoSteps(_owner) {} /** * @notice This function transfers items for a single ERC721 collection. * @param collection Collection address * @param from Sender address * @param to Recipient address * @param itemIds Array of itemIds * @param amounts Array of amounts */ function transferItemsERC721( address collection, address from, address to, uint256[] calldata itemIds, uint256[] calldata amounts ) external { uint256 length = itemIds.length; if (length == 0) { revert LengthsInvalid(); } _isOperatorValidForTransfer(from, msg.sender); for (uint256 i; i < length; ) { if (amounts[i] != 1) { revert AmountInvalid(); } _executeERC721TransferFrom(collection, from, to, itemIds[i]); unchecked { ++i; } } } /** * @notice This function transfers items for a single ERC1155 collection. * @param collection Collection address * @param from Sender address * @param to Recipient address * @param itemIds Array of itemIds * @param amounts Array of amounts * @dev It does not allow batch transferring if from = msg.sender since native function should be used. */ function transferItemsERC1155( address collection, address from, address to, uint256[] calldata itemIds, uint256[] calldata amounts ) external { uint256 length = itemIds.length; if (length == 0 || amounts.length != length) { revert LengthsInvalid(); } _isOperatorValidForTransfer(from, msg.sender); if (length == 1) { if (amounts[0] == 0) { revert AmountInvalid(); } _executeERC1155SafeTransferFrom(collection, from, to, itemIds[0], amounts[0]); } else { for (uint256 i; i < length; ) { if (amounts[i] == 0) { revert AmountInvalid(); } unchecked { ++i; } } _executeERC1155SafeBatchTransferFrom(collection, from, to, itemIds, amounts); } } /** * @notice This function transfers items across an array of collections that can be both ERC721 and ERC1155. * @param items Array of BatchTransferItem * @param from Sender address * @param to Recipient address */ function transferBatchItemsAcrossCollections( BatchTransferItem[] calldata items, address from, address to ) external { uint256 itemsLength = items.length; if (itemsLength == 0) { revert LengthsInvalid(); } if (from != msg.sender) { _isOperatorValidForTransfer(from, msg.sender); } for (uint256 i; i < itemsLength; ) { uint256[] calldata itemIds = items[i].itemIds; uint256 itemIdsLengthForSingleCollection = itemIds.length; uint256[] calldata amounts = items[i].amounts; if (itemIdsLengthForSingleCollection == 0 || amounts.length != itemIdsLengthForSingleCollection) { revert LengthsInvalid(); } CollectionType collectionType = items[i].collectionType; if (collectionType == CollectionType.ERC721) { for (uint256 j; j < itemIdsLengthForSingleCollection; ) { if (amounts[j] != 1) { revert AmountInvalid(); } _executeERC721TransferFrom(items[i].collection, from, to, itemIds[j]); unchecked { ++j; } } } else if (collectionType == CollectionType.ERC1155) { for (uint256 j; j < itemIdsLengthForSingleCollection; ) { if (amounts[j] == 0) { revert AmountInvalid(); } unchecked { ++j; } } _executeERC1155SafeBatchTransferFrom(items[i].collection, from, to, itemIds, amounts); } unchecked { ++i; } } } /** * @notice This function allows a user to grant approvals for an array of operators. * Users cannot grant approvals if the operator is not allowed by this contract's owner. * @param operators Array of operator addresses * @dev Each operator address must be globally allowed to be approved. */ function grantApprovals(address[] calldata operators) external { uint256 length = operators.length; if (length == 0) { revert LengthsInvalid(); } for (uint256 i; i < length; ) { address operator = operators[i]; if (!isOperatorAllowed[operator]) { revert OperatorNotAllowed(); } if (hasUserApprovedOperator[msg.sender][operator]) { revert OperatorAlreadyApprovedByUser(); } hasUserApprovedOperator[msg.sender][operator] = true; unchecked { ++i; } } emit ApprovalsGranted(msg.sender, operators); } /** * @notice This function allows a user to revoke existing approvals for an array of operators. * @param operators Array of operator addresses * @dev Each operator address must be approved at the user level to be revoked. */ function revokeApprovals(address[] calldata operators) external { uint256 length = operators.length; if (length == 0) { revert LengthsInvalid(); } for (uint256 i; i < length; ) { address operator = operators[i]; if (!hasUserApprovedOperator[msg.sender][operator]) { revert OperatorNotApprovedByUser(); } delete hasUserApprovedOperator[msg.sender][operator]; unchecked { ++i; } } emit ApprovalsRemoved(msg.sender, operators); } /** * @notice This function allows an operator to be added for the shared transfer system. * Once the operator is allowed, users can grant NFT approvals to this operator. * @param operator Operator address to allow * @dev Only callable by owner. */ function allowOperator(address operator) external onlyOwner { if (isOperatorAllowed[operator]) { revert OperatorAlreadyAllowed(); } isOperatorAllowed[operator] = true; emit OperatorAllowed(operator); } /** * @notice This function allows the user to remove an operator for the shared transfer system. * @param operator Operator address to remove * @dev Only callable by owner. */ function removeOperator(address operator) external onlyOwner { if (!isOperatorAllowed[operator]) { revert OperatorNotAllowed(); } delete isOperatorAllowed[operator]; emit OperatorRemoved(operator); } /** * @notice This function is internal and verifies whether the transfer * (by an operator on behalf of a user) is valid. If not, it reverts. * @param user User address * @param operator Operator address */ function _isOperatorValidForTransfer(address user, address operator) private view { if (isOperatorAllowed[operator] && hasUserApprovedOperator[user][operator]) { return; } revert TransferCallerInvalid(); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; /** * @notice CollectionType is used in OrderStructs.Maker's collectionType to determine the collection type being traded. */ enum CollectionType { ERC721, ERC1155 }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; /** * @notice QuoteType is used in OrderStructs.Maker's quoteType to determine whether the maker order is a bid or an ask. */ enum QuoteType { Bid, Ask }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; /** * @notice It is returned if the amount is invalid. * For ERC721, any number that is not 1. For ERC1155, if amount is 0. */ error AmountInvalid(); /** * @notice It is returned if the ask price is too high for the bid user. */ error AskTooHigh(); /** * @notice It is returned if the bid price is too low for the ask user. */ error BidTooLow(); /** * @notice It is returned if the function cannot be called by the sender. */ error CallerInvalid(); /** * @notice It is returned if the currency is invalid. */ error CurrencyInvalid(); /** * @notice The function selector is invalid for this strategy implementation. */ error FunctionSelectorInvalid(); /** * @notice It is returned if there is either a mismatch or an error in the length of the array(s). */ error LengthsInvalid(); /** * @notice It is returned if the merkle proof provided is invalid. */ error MerkleProofInvalid(); /** * @notice It is returned if the length of the merkle proof provided is greater than tolerated. * @param length Proof length */ error MerkleProofTooLarge(uint256 length); /** * @notice It is returned if the order is permanently invalid. * There may be an issue with the order formatting. */ error OrderInvalid(); /** * @notice It is returned if the maker quote type is invalid. */ error QuoteTypeInvalid();
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; // Libraries import {OrderStructs} from "../libraries/OrderStructs.sol"; // Enums import {CollectionType} from "../enums/CollectionType.sol"; /** * @title ITransferManager * @author LooksRare protocol team (👀,💎) */ interface ITransferManager { /** * @notice This struct is only used for transferBatchItemsAcrossCollections. * @param collection Collection address * @param collectionType 0 for ERC721, 1 for ERC1155 * @param itemIds Array of item ids to transfer * @param amounts Array of amounts to transfer */ struct BatchTransferItem { address collection; CollectionType collectionType; uint256[] itemIds; uint256[] amounts; } /** * @notice It is emitted if operators' approvals to transfer NFTs are granted by a user. * @param user Address of the user * @param operators Array of operator addresses */ event ApprovalsGranted(address user, address[] operators); /** * @notice It is emitted if operators' approvals to transfer NFTs are revoked by a user. * @param user Address of the user * @param operators Array of operator addresses */ event ApprovalsRemoved(address user, address[] operators); /** * @notice It is emitted if a new operator is added to the global allowlist. * @param operator Operator address */ event OperatorAllowed(address operator); /** * @notice It is emitted if an operator is removed from the global allowlist. * @param operator Operator address */ event OperatorRemoved(address operator); /** * @notice It is returned if the operator to approve has already been approved by the user. */ error OperatorAlreadyApprovedByUser(); /** * @notice It is returned if the operator to revoke has not been previously approved by the user. */ error OperatorNotApprovedByUser(); /** * @notice It is returned if the transfer caller is already allowed by the owner. * @dev This error can only be returned for owner operations. */ error OperatorAlreadyAllowed(); /** * @notice It is returned if the operator to approve is not in the global allowlist defined by the owner. * @dev This error can be returned if the user tries to grant approval to an operator address not in the * allowlist or if the owner tries to remove the operator from the global allowlist. */ error OperatorNotAllowed(); /** * @notice It is returned if the transfer caller is invalid. * For a transfer called to be valid, the operator must be in the global allowlist and * approved by the 'from' user. */ error TransferCallerInvalid(); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; // Enums import {CollectionType} from "../enums/CollectionType.sol"; import {QuoteType} from "../enums/QuoteType.sol"; /** * @title OrderStructs * @notice This library contains all order struct types for the LooksRare protocol (v2). * @author LooksRare protocol team (👀,💎) */ library OrderStructs { /** * 1. Maker struct */ /** * @notice Maker is the struct for a maker order. * @param quoteType Quote type (i.e. 0 = BID, 1 = ASK) * @param globalNonce Global user order nonce for maker orders * @param subsetNonce Subset nonce (shared across bid/ask maker orders) * @param orderNonce Order nonce (it can be shared across bid/ask maker orders) * @param strategyId Strategy id * @param collectionType Collection type (i.e. 0 = ERC721, 1 = ERC1155) * @param collection Collection address * @param currency Currency address (@dev address(0) = ETH) * @param signer Signer address * @param startTime Start timestamp * @param endTime End timestamp * @param price Minimum price for maker ask, maximum price for maker bid * @param itemIds Array of itemIds * @param amounts Array of amounts * @param additionalParameters Extra data specific for the order */ struct Maker { QuoteType quoteType; uint256 globalNonce; uint256 subsetNonce; uint256 orderNonce; uint256 strategyId; CollectionType collectionType; address collection; address currency; address signer; uint256 startTime; uint256 endTime; uint256 price; uint256[] itemIds; uint256[] amounts; bytes additionalParameters; } /** * 2. Taker struct */ /** * @notice Taker is the struct for a taker ask/bid order. It contains the parameters required for a direct purchase. * @dev Taker struct is matched against MakerAsk/MakerBid structs at the protocol level. * @param recipient Recipient address (to receive NFTs or non-fungible tokens) * @param additionalParameters Extra data specific for the order */ struct Taker { address recipient; bytes additionalParameters; } /** * 3. Merkle tree struct */ enum MerkleTreeNodePosition { Left, Right } /** * @notice MerkleTreeNode is a MerkleTree's node. * @param value It can be an order hash or a proof * @param position The node's position in its branch. * It can be left or right or none * (before the tree is sorted). */ struct MerkleTreeNode { bytes32 value; MerkleTreeNodePosition position; } /** * @notice MerkleTree is the struct for a merkle tree of order hashes. * @dev A Merkle tree can be computed with order hashes. * It can contain order hashes from both maker bid and maker ask structs. * @param root Merkle root * @param proof Array containing the merkle proof */ struct MerkleTree { bytes32 root; MerkleTreeNode[] proof; } /** * 4. Constants */ /** * @notice This is the type hash constant used to compute the maker order hash. */ bytes32 internal constant _MAKER_TYPEHASH = keccak256( "Maker(" "uint8 quoteType," "uint256 globalNonce," "uint256 subsetNonce," "uint256 orderNonce," "uint256 strategyId," "uint8 collectionType," "address collection," "address currency," "address signer," "uint256 startTime," "uint256 endTime," "uint256 price," "uint256[] itemIds," "uint256[] amounts," "bytes additionalParameters" ")" ); /** * 5. Hash functions */ /** * @notice This function is used to compute the order hash for a maker struct. * @param maker Maker order struct * @return makerHash Hash of the maker struct */ function hash(Maker memory maker) internal pure returns (bytes32) { // Encoding is done into two parts to avoid stack too deep issues return keccak256( bytes.concat( abi.encode( _MAKER_TYPEHASH, maker.quoteType, maker.globalNonce, maker.subsetNonce, maker.orderNonce, maker.strategyId, maker.collectionType, maker.collection, maker.currency ), abi.encode( maker.signer, maker.startTime, maker.endTime, maker.price, keccak256(abi.encodePacked(maker.itemIds)), keccak256(abi.encodePacked(maker.amounts)), keccak256(maker.additionalParameters) ) ) ); } }
// 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; /** * @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; 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 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 {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": [ "@chainlink/=node_modules/@chainlink/", "@ensdomains/=node_modules/@ensdomains/", "@eth-optimism/=node_modules/@eth-optimism/", "@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/", "murky/=lib/murky/src/", "openzeppelin-contracts/=lib/murky/lib/openzeppelin-contracts/", "solmate/=node_modules/solmate/" ], "optimizer": { "enabled": true, "runs": 888888 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "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":"AmountInvalid","type":"error"},{"inputs":[],"name":"ERC1155SafeBatchTransferFromFail","type":"error"},{"inputs":[],"name":"ERC1155SafeTransferFromFail","type":"error"},{"inputs":[],"name":"ERC721TransferFromFail","type":"error"},{"inputs":[],"name":"LengthsInvalid","type":"error"},{"inputs":[],"name":"NoOngoingTransferInProgress","type":"error"},{"inputs":[],"name":"NotAContract","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"OperatorAlreadyAllowed","type":"error"},{"inputs":[],"name":"OperatorAlreadyApprovedByUser","type":"error"},{"inputs":[],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OperatorNotApprovedByUser","type":"error"},{"inputs":[],"name":"RenouncementNotInProgress","type":"error"},{"inputs":[],"name":"TransferAlreadyInProgress","type":"error"},{"inputs":[],"name":"TransferCallerInvalid","type":"error"},{"inputs":[],"name":"TransferNotInProgress","type":"error"},{"inputs":[],"name":"WrongPotentialOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address[]","name":"operators","type":"address[]"}],"name":"ApprovalsGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address[]","name":"operators","type":"address[]"}],"name":"ApprovalsRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"CancelOwnershipTransfer","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":"operator","type":"address"}],"name":"OperatorAllowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"allowOperator","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":[{"internalType":"address[]","name":"operators","type":"address[]"}],"name":"grantApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"hasUserApprovedOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"}],"name":"isOperatorAllowed","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":"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":"operator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"operators","type":"address[]"}],"name":"revokeApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"enum CollectionType","name":"collectionType","type":"uint8"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct ITransferManager.BatchTransferItem[]","name":"items","type":"tuple[]"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferBatchItemsAcrossCollections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"transferItemsERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"transferItemsERC721","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051611dc8380380611dc883398101604081905261002f91610089565b600080546001600160a01b0319166001600160a01b03831690811790915560405190815281907f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc9060200160405180910390a150506100b9565b60006020828403121561009b57600080fd5b81516001600160a01b03811681146100b257600080fd5b9392505050565b611d00806100c86000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c80637200b829116100b2578063a0a406c611610081578063ac8a584a11610066578063ac8a584a146102a2578063c0b6f561146102b5578063e8f9f1dc146102c857600080fd5b8063a0a406c61461027c578063a7bc96d31461028f57600080fd5b80637200b829146101ec57806375ccc132146101f45780637762df25146102175780638da5cb5b1461025c57600080fd5b80633cc4cb06116100ee5780633cc4cb061461018b5780633e567539146101c95780635b6ac011146101d15780636cf0859c146101d957600080fd5b80630ca8e8a8146101205780631ba9a4581461013557806323452b9c146101485780632bb5a9e614610150575b600080fd5b61013361012e366004611879565b6102db565b005b6101336101433660046118de565b6105ed565b6101336106db565b6001546101759074010000000000000000000000000000000000000000900460ff1681565b604051610182919061192f565b60405180910390f35b6101b9610199366004611970565b600260209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610182565b6101336107e2565b6101336108d8565b6101336101e73660046119a3565b6109b2565b610133610b2f565b6101b96102023660046118de565b60036020526000908152604090205460ff1681565b6001546102379073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610182565b6000546102379073ffffffffffffffffffffffffffffffffffffffff1681565b61013361028a3660046119e5565b610c6c565b61013361029d3660046119e5565b610dd9565b6101336102b03660046118de565b610ea7565b6101336102c33660046118de565b610f8a565b6101336102d63660046119a3565b61108c565b826000819003610317576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316331461033e5761033e8333611260565b60005b818110156105e55736600087878481811061035e5761035e611a87565b90506020028101906103709190611ab6565b61037e906040810190611af4565b9092509050803660008a8a8781811061039957610399611a87565b90506020028101906103ab9190611ab6565b6103b9906060810190611af4565b9150915082600014806103cc5750808314155b15610403576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008b8b8881811061041757610417611a87565b90506020028101906104299190611ab6565b61043a906040810190602001611b5c565b9050600081600181111561045057610450611900565b036105155760005b8481101561050f5783838281811061047257610472611a87565b905060200201356001146104b2576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105078d8d8a8181106104c7576104c7611a87565b90506020028101906104d99190611ab6565b6104e79060208101906118de565b8c8c8a8a868181106104fb576104fb611a87565b90506020020135611302565b600101610458565b506105d4565b600181600181111561052957610529611900565b036105d45760005b848110156105935783838281811061054b5761054b611a87565b9050602002013560000361058b576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101610531565b506105d48c8c898181106105a9576105a9611a87565b90506020028101906105bb9190611ab6565b6105c99060208101906118de565b8b8b89898888611491565b866001019650505050505050610341565b505050505050565b6105f5611614565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff1615610655576040517f730e0eb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527fdde65206cdee4ea27ef1b170724ba50b41ad09a3bf2dda12935fc40c4dbf6e7591015b60405180910390a150565b6106e3611614565b60015474010000000000000000000000000000000000000000900460ff16600081600281111561071557610715611900565b0361074c576040517fccf69db700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181600281111561076057610760611900565b0361078e57600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f8eca980489e87f7dba4f26917aa4bfc906eb3f2b4f7b4b9fd0ff2b8bb3e21ae390600090a150565b6107ea611614565b600260015474010000000000000000000000000000000000000000900460ff16600281111561081b5761081b611900565b14610852576040517f045c512200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040519081527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc906020015b60405180910390a1565b6108e0611614565b600060015474010000000000000000000000000000000000000000900460ff16600281111561091157610911611900565b14610948576040517f74ed79ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740200000000000000000000000000000000000000001790556040517f3ff05a45e46337fa1cbf20996d2eeb927280bce099f37252bcca1040609604ec90600090a1565b8060008190036109ee576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610aee576000848483818110610a0d57610a0d611a87565b9050602002016020810190610a2291906118de565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205490915060ff16610a8f576040517f21d29a8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556001016109f1565b507fcd827905c56d07b7e3668c6d264b27603a45324dd955aadca79cf47eb24ca5fa338484604051610b2293929190611b7d565b60405180910390a1505050565b6001805474010000000000000000000000000000000000000000900460ff166002811115610b5f57610b5f611900565b14610b96576040517f5e4f282600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015473ffffffffffffffffffffffffffffffffffffffff163314610be7576040517fafdcfb9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633908117909155600180547fffffffffffffffffffffff0000000000000000000000000000000000000000001690556040519081527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc906020016108ce565b82801580610c7a5750818114155b15610cb1576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbb8733611260565b80600103610d5a5782826000818110610cd657610cd6611a87565b90506020020135600003610d16576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d5588888888886000818110610d2f57610d2f611a87565b9050602002013587876000818110610d4957610d49611a87565b90506020020135611667565b610dcf565b60005b81811015610dbf57838382818110610d7757610d77611a87565b90506020020135600003610db7576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101610d5d565b50610dcf88888888888888611491565b5050505050505050565b826000819003610e15576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1f8733611260565b60005b81811015610e9c57838382818110610e3c57610e3c611a87565b90506020020135600114610e7c576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e948989898989868181106104fb576104fb611a87565b600101610e22565b505050505050505050565b610eaf611614565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff16610f0e576040517f8a10919300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d91016106d0565b610f92611614565b600060015474010000000000000000000000000000000000000000900460ff166002811115610fc357610fc3611900565b14610ffa576040517f74ed79ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffff000000000000000000000000000000000000000000909116811774010000000000000000000000000000000000000000179091556040805133815260208101929092527fb86c75c9bffca616b2d314cc914f7c3f1d174255b16b941c3f3ededee276d5ef91016106d0565b8060008190036110c8576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561122c5760008484838181106110e7576110e7611a87565b90506020020160208101906110fc91906118de565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205490915060ff1661115e576040517f8a10919300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156111c9576040517fabb0fc9600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155016110cb565b507f2689e1a312b4212a2eb518d23bfd4c7cc30e3a7bc7a7e2524e8ec16e6a3713ab338484604051610b2293929190611b7d565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff1680156112c7575073ffffffffffffffffffffffffffffffffffffffff80831660009081526002602090815260408083209385168352929052205460ff165b156112d0575050565b6040517fb550954400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163b600003611353576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff848116602483015283811660448301526064820183905260009190861690608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790525161140d9190611be4565b6000604051808303816000865af19150503d806000811461144a576040519150601f19603f3d011682016040523d82523d6000602084013e61144f565b606091505b505090508061148a576040517fe0f5c50800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b8673ffffffffffffffffffffffffffffffffffffffff163b6000036114e2576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008773ffffffffffffffffffffffffffffffffffffffff1687878787878760405160240161151696959493929190611c5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2eb2c2d600000000000000000000000000000000000000000000000000000000179052516115979190611be4565b6000604051808303816000865af19150503d80600081146115d4576040519150601f19603f3d011682016040523d82523d6000602084013e6115d9565b606091505b5050905080610dcf576040517f65da8e4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611665576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8473ffffffffffffffffffffffffffffffffffffffff163b6000036116b8576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606482018490526084820183905260a060a4830152600060c48301819052919087169060e401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff242432a00000000000000000000000000000000000000000000000000000000179052516117879190611be4565b6000604051808303816000865af19150503d80600081146117c4576040519150601f19603f3d011682016040523d82523d6000602084013e6117c9565b606091505b50509050806105e5576040517f02f8f11e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008083601f84011261181657600080fd5b50813567ffffffffffffffff81111561182e57600080fd5b6020830191508360208260051b850101111561184957600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461187457600080fd5b919050565b6000806000806060858703121561188f57600080fd5b843567ffffffffffffffff8111156118a657600080fd5b6118b287828801611804565b90955093506118c5905060208601611850565b91506118d360408601611850565b905092959194509250565b6000602082840312156118f057600080fd5b6118f982611850565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061196a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561198357600080fd5b61198c83611850565b915061199a60208401611850565b90509250929050565b600080602083850312156119b657600080fd5b823567ffffffffffffffff8111156119cd57600080fd5b6119d985828601611804565b90969095509350505050565b600080600080600080600060a0888a031215611a0057600080fd5b611a0988611850565b9650611a1760208901611850565b9550611a2560408901611850565b9450606088013567ffffffffffffffff80821115611a4257600080fd5b611a4e8b838c01611804565b909650945060808a0135915080821115611a6757600080fd5b50611a748a828b01611804565b989b979a50959850939692959293505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611aea57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611b2957600080fd5b83018035915067ffffffffffffffff821115611b4457600080fd5b6020019150600581901b360382131561184957600080fd5b600060208284031215611b6e57600080fd5b8135600281106118f957600080fd5b73ffffffffffffffffffffffffffffffffffffffff848116825260406020808401829052908301849052600091859160608501845b87811015611bd75783611bc486611850565b1682529382019390820190600101611bb2565b5098975050505050505050565b6000825160005b81811015611c055760208186018101518583015201611beb565b506000920191825250919050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611c4557600080fd5b8260051b80836020870137939093016020019392505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525060a06040830152611c9860a083018688611c13565b8281036060840152611cab818587611c13565b838103608090940193909352505060008152602001969550505050505056fea2646970667358221220ec79abb2b33ff98b086f6cac43d1edee921c28a427ff821d73f982624ad0c3c764736f6c634300081100330000000000000000000000003ab105f0e4a22ec4a96a9b0ca90c5c534d21f3a7
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061011b5760003560e01c80637200b829116100b2578063a0a406c611610081578063ac8a584a11610066578063ac8a584a146102a2578063c0b6f561146102b5578063e8f9f1dc146102c857600080fd5b8063a0a406c61461027c578063a7bc96d31461028f57600080fd5b80637200b829146101ec57806375ccc132146101f45780637762df25146102175780638da5cb5b1461025c57600080fd5b80633cc4cb06116100ee5780633cc4cb061461018b5780633e567539146101c95780635b6ac011146101d15780636cf0859c146101d957600080fd5b80630ca8e8a8146101205780631ba9a4581461013557806323452b9c146101485780632bb5a9e614610150575b600080fd5b61013361012e366004611879565b6102db565b005b6101336101433660046118de565b6105ed565b6101336106db565b6001546101759074010000000000000000000000000000000000000000900460ff1681565b604051610182919061192f565b60405180910390f35b6101b9610199366004611970565b600260209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610182565b6101336107e2565b6101336108d8565b6101336101e73660046119a3565b6109b2565b610133610b2f565b6101b96102023660046118de565b60036020526000908152604090205460ff1681565b6001546102379073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610182565b6000546102379073ffffffffffffffffffffffffffffffffffffffff1681565b61013361028a3660046119e5565b610c6c565b61013361029d3660046119e5565b610dd9565b6101336102b03660046118de565b610ea7565b6101336102c33660046118de565b610f8a565b6101336102d63660046119a3565b61108c565b826000819003610317576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316331461033e5761033e8333611260565b60005b818110156105e55736600087878481811061035e5761035e611a87565b90506020028101906103709190611ab6565b61037e906040810190611af4565b9092509050803660008a8a8781811061039957610399611a87565b90506020028101906103ab9190611ab6565b6103b9906060810190611af4565b9150915082600014806103cc5750808314155b15610403576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008b8b8881811061041757610417611a87565b90506020028101906104299190611ab6565b61043a906040810190602001611b5c565b9050600081600181111561045057610450611900565b036105155760005b8481101561050f5783838281811061047257610472611a87565b905060200201356001146104b2576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105078d8d8a8181106104c7576104c7611a87565b90506020028101906104d99190611ab6565b6104e79060208101906118de565b8c8c8a8a868181106104fb576104fb611a87565b90506020020135611302565b600101610458565b506105d4565b600181600181111561052957610529611900565b036105d45760005b848110156105935783838281811061054b5761054b611a87565b9050602002013560000361058b576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101610531565b506105d48c8c898181106105a9576105a9611a87565b90506020028101906105bb9190611ab6565b6105c99060208101906118de565b8b8b89898888611491565b866001019650505050505050610341565b505050505050565b6105f5611614565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff1615610655576040517f730e0eb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527fdde65206cdee4ea27ef1b170724ba50b41ad09a3bf2dda12935fc40c4dbf6e7591015b60405180910390a150565b6106e3611614565b60015474010000000000000000000000000000000000000000900460ff16600081600281111561071557610715611900565b0361074c576040517fccf69db700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181600281111561076057610760611900565b0361078e57600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f8eca980489e87f7dba4f26917aa4bfc906eb3f2b4f7b4b9fd0ff2b8bb3e21ae390600090a150565b6107ea611614565b600260015474010000000000000000000000000000000000000000900460ff16600281111561081b5761081b611900565b14610852576040517f045c512200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040519081527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc906020015b60405180910390a1565b6108e0611614565b600060015474010000000000000000000000000000000000000000900460ff16600281111561091157610911611900565b14610948576040517f74ed79ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740200000000000000000000000000000000000000001790556040517f3ff05a45e46337fa1cbf20996d2eeb927280bce099f37252bcca1040609604ec90600090a1565b8060008190036109ee576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610aee576000848483818110610a0d57610a0d611a87565b9050602002016020810190610a2291906118de565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205490915060ff16610a8f576040517f21d29a8600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556001016109f1565b507fcd827905c56d07b7e3668c6d264b27603a45324dd955aadca79cf47eb24ca5fa338484604051610b2293929190611b7d565b60405180910390a1505050565b6001805474010000000000000000000000000000000000000000900460ff166002811115610b5f57610b5f611900565b14610b96576040517f5e4f282600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015473ffffffffffffffffffffffffffffffffffffffff163314610be7576040517fafdcfb9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633908117909155600180547fffffffffffffffffffffff0000000000000000000000000000000000000000001690556040519081527f3edd90e7770f06fafde38004653b33870066c33bfc923ff6102acd601f85dfbc906020016108ce565b82801580610c7a5750818114155b15610cb1576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cbb8733611260565b80600103610d5a5782826000818110610cd657610cd6611a87565b90506020020135600003610d16576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d5588888888886000818110610d2f57610d2f611a87565b9050602002013587876000818110610d4957610d49611a87565b90506020020135611667565b610dcf565b60005b81811015610dbf57838382818110610d7757610d77611a87565b90506020020135600003610db7576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101610d5d565b50610dcf88888888888888611491565b5050505050505050565b826000819003610e15576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1f8733611260565b60005b81811015610e9c57838382818110610e3c57610e3c611a87565b90506020020135600114610e7c576040517f0f3a948a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e948989898989868181106104fb576104fb611a87565b600101610e22565b505050505050505050565b610eaf611614565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff16610f0e576040517f8a10919300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660008181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d91016106d0565b610f92611614565b600060015474010000000000000000000000000000000000000000900460ff166002811115610fc357610fc3611900565b14610ffa576040517f74ed79ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffff000000000000000000000000000000000000000000909116811774010000000000000000000000000000000000000000179091556040805133815260208101929092527fb86c75c9bffca616b2d314cc914f7c3f1d174255b16b941c3f3ededee276d5ef91016106d0565b8060008190036110c8576040517f97983bdb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8181101561122c5760008484838181106110e7576110e7611a87565b90506020020160208101906110fc91906118de565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205490915060ff1661115e576040517f8a10919300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156111c9576040517fabb0fc9600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155016110cb565b507f2689e1a312b4212a2eb518d23bfd4c7cc30e3a7bc7a7e2524e8ec16e6a3713ab338484604051610b2293929190611b7d565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff1680156112c7575073ffffffffffffffffffffffffffffffffffffffff80831660009081526002602090815260408083209385168352929052205460ff165b156112d0575050565b6040517fb550954400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163b600003611353576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff848116602483015283811660448301526064820183905260009190861690608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790525161140d9190611be4565b6000604051808303816000865af19150503d806000811461144a576040519150601f19603f3d011682016040523d82523d6000602084013e61144f565b606091505b505090508061148a576040517fe0f5c50800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b8673ffffffffffffffffffffffffffffffffffffffff163b6000036114e2576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008773ffffffffffffffffffffffffffffffffffffffff1687878787878760405160240161151696959493929190611c5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2eb2c2d600000000000000000000000000000000000000000000000000000000179052516115979190611be4565b6000604051808303816000865af19150503d80600081146115d4576040519150601f19603f3d011682016040523d82523d6000602084013e6115d9565b606091505b5050905080610dcf576040517f65da8e4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314611665576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8473ffffffffffffffffffffffffffffffffffffffff163b6000036116b8576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606482018490526084820183905260a060a4830152600060c48301819052919087169060e401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff242432a00000000000000000000000000000000000000000000000000000000179052516117879190611be4565b6000604051808303816000865af19150503d80600081146117c4576040519150601f19603f3d011682016040523d82523d6000602084013e6117c9565b606091505b50509050806105e5576040517f02f8f11e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008083601f84011261181657600080fd5b50813567ffffffffffffffff81111561182e57600080fd5b6020830191508360208260051b850101111561184957600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461187457600080fd5b919050565b6000806000806060858703121561188f57600080fd5b843567ffffffffffffffff8111156118a657600080fd5b6118b287828801611804565b90955093506118c5905060208601611850565b91506118d360408601611850565b905092959194509250565b6000602082840312156118f057600080fd5b6118f982611850565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061196a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561198357600080fd5b61198c83611850565b915061199a60208401611850565b90509250929050565b600080602083850312156119b657600080fd5b823567ffffffffffffffff8111156119cd57600080fd5b6119d985828601611804565b90969095509350505050565b600080600080600080600060a0888a031215611a0057600080fd5b611a0988611850565b9650611a1760208901611850565b9550611a2560408901611850565b9450606088013567ffffffffffffffff80821115611a4257600080fd5b611a4e8b838c01611804565b909650945060808a0135915080821115611a6757600080fd5b50611a748a828b01611804565b989b979a50959850939692959293505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611aea57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611b2957600080fd5b83018035915067ffffffffffffffff821115611b4457600080fd5b6020019150600581901b360382131561184957600080fd5b600060208284031215611b6e57600080fd5b8135600281106118f957600080fd5b73ffffffffffffffffffffffffffffffffffffffff848116825260406020808401829052908301849052600091859160608501845b87811015611bd75783611bc486611850565b1682529382019390820190600101611bb2565b5098975050505050505050565b6000825160005b81811015611c055760208186018101518583015201611beb565b506000920191825250919050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611c4557600080fd5b8260051b80836020870137939093016020019392505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525060a06040830152611c9860a083018688611c13565b8281036060840152611cab818587611c13565b838103608090940193909352505060008152602001969550505050505056fea2646970667358221220ec79abb2b33ff98b086f6cac43d1edee921c28a427ff821d73f982624ad0c3c764736f6c63430008110033
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 |
---|
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.