Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 27,015 transactions (+10 Pending)
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x808d0cea90ac2eaca02e50eed7cfb49a90808512ba81044539f2e8d5c8606901 | Grant Approvals | (pending) | 3 hrs ago | IN | 0 ETH | (Pending) | |||
0x6fc759c73acf80b0b0797e35c9602d5469cf6c1529a8dbd4a4215bdf23eaa927 | Grant Approvals | (pending) | 5 hrs ago | IN | 0 ETH | (Pending) | |||
0xc6565ffba484348f8882b22c8e2686e6318c394c10db11ad210f8143fe9dc9b1 | Grant Approvals | (pending) | 12 hrs ago | IN | 0 ETH | (Pending) | |||
0x7d33a7d5e7d409899773c74ed256dc7411b380d9e8ed54e70512da9c36170c88 | Grant Approvals | (pending) | 12 hrs ago | IN | 0 ETH | (Pending) | |||
0xefc347cffec6cd2cc4f5918b5f360621a84a75299e2b22c1d2bbc980754a9a53 | Grant Approvals | (pending) | 13 hrs ago | IN | 0 ETH | (Pending) | |||
0x832b5a1ff34400b5f5fad4aa5f19a049952fe41050074fd633872955c0a70f1f | Grant Approvals | (pending) | 13 hrs ago | IN | 0 ETH | (Pending) | |||
0x1059f7e7866129efc38ce17f6baefb5f01cc6af73b4cb68fbf900e3cd348bd04 | Grant Approvals | (pending) | 13 hrs ago | IN | 0 ETH | (Pending) | |||
0x265666b91297907c570b53c9169af0eadc8cb1c2d8e68131a48a76ab6ae97b5c | Grant Approvals | (pending) | 13 hrs ago | IN | 0 ETH | (Pending) | |||
0xd7ed3ccf904a57ff63b7ac50c7d0412b4a79036dc9b2239426e8ce3faba2476d | Grant Approvals | (pending) | 14 hrs ago | IN | 0 ETH | (Pending) | |||
0x0ca1c0c608fa3a77cb9b07a3642116696f523ef535da0e34f84f955e6c85ffc1 | 0xd85a75d1 | (pending) | 7 days ago | IN | 0 ETH | (Pending) | |||
Grant Approvals | 20255433 | 27 mins ago | IN | 0 ETH | 0.00016207 | ||||
Grant Approvals | 20255038 | 1 hr ago | IN | 0 ETH | 0.00011609 | ||||
Grant Approvals | 20253943 | 5 hrs ago | IN | 0 ETH | 0.00008604 | ||||
Grant Approvals | 20253559 | 6 hrs ago | IN | 0 ETH | 0.00013152 | ||||
Grant Approvals | 20253308 | 7 hrs ago | IN | 0 ETH | 0.00009473 | ||||
Grant Approvals | 20252585 | 10 hrs ago | IN | 0 ETH | 0.00007253 | ||||
Grant Approvals | 20252231 | 11 hrs ago | IN | 0 ETH | 0.00007416 | ||||
Grant Approvals | 20252174 | 11 hrs ago | IN | 0 ETH | 0.00008088 | ||||
Grant Approvals | 20251099 | 14 hrs ago | IN | 0 ETH | 0.00005565 | ||||
Grant Approvals | 20247554 | 26 hrs ago | IN | 0 ETH | 0.00012148 | ||||
Grant Approvals | 20247311 | 27 hrs ago | IN | 0 ETH | 0.0001252 | ||||
Grant Approvals | 20247090 | 28 hrs ago | IN | 0 ETH | 0.00009353 | ||||
Grant Approvals | 20245955 | 32 hrs ago | IN | 0 ETH | 0.00011753 | ||||
Grant Approvals | 20245601 | 33 hrs ago | IN | 0 ETH | 0.00010505 | ||||
Grant Approvals | 20244804 | 36 hrs ago | IN | 0 ETH | 0.00009877 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
20254393 | 3 hrs ago | 0 ETH | |||||
20254393 | 3 hrs ago | 0 ETH | |||||
20253100 | 8 hrs ago | 0 ETH | |||||
20253100 | 8 hrs ago | 0 ETH | |||||
20249303 | 20 hrs ago | 0 ETH | |||||
20249303 | 20 hrs ago | 0 ETH | |||||
20248778 | 22 hrs ago | 0 ETH | |||||
20248778 | 22 hrs ago | 0 ETH | |||||
20248757 | 22 hrs ago | 0 ETH | |||||
20248757 | 22 hrs ago | 0 ETH | |||||
20248513 | 23 hrs ago | 0 ETH | |||||
20248513 | 23 hrs ago | 0 ETH | |||||
20248508 | 23 hrs ago | 0 ETH | |||||
20248508 | 23 hrs ago | 0 ETH | |||||
20248065 | 25 hrs ago | 0 ETH | |||||
20248065 | 25 hrs ago | 0 ETH | |||||
20247419 | 27 hrs ago | 0 ETH | |||||
20247419 | 27 hrs ago | 0 ETH | |||||
20246539 | 30 hrs ago | 0 ETH | |||||
20246539 | 30 hrs ago | 0 ETH | |||||
20246049 | 31 hrs ago | 0 ETH | |||||
20246049 | 31 hrs ago | 0 ETH | |||||
20244670 | 36 hrs ago | 0 ETH | |||||
20244670 | 36 hrs ago | 0 ETH | |||||
20244670 | 36 hrs ago | 0 ETH |
Loading...
Loading
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 | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.