| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| 0x75303ea2f193e99f7a4199a28442eb64e8dc0c905f2c039a973b5b10fdb65a81 | Grant Approvals | (pending) | 2 days ago | IN | 0 ETH | (Pending) | |||
| Grant Approvals | 24673527 | 4 hrs ago | IN | 0 ETH | 0.00000765 | ||||
| Grant Approvals | 24642151 | 4 days ago | IN | 0 ETH | 0.00001121 | ||||
| Grant Approvals | 24624603 | 6 days ago | IN | 0 ETH | 0.00010019 | ||||
| Grant Approvals | 24623548 | 7 days ago | IN | 0 ETH | 0.00000174 | ||||
| Grant Approvals | 24615874 | 8 days ago | IN | 0 ETH | 0.00000211 | ||||
| Grant Approvals | 24612899 | 8 days ago | IN | 0 ETH | 0.00000751 | ||||
| Grant Approvals | 24599890 | 10 days ago | IN | 0 ETH | 0.00000726 | ||||
| Grant Approvals | 24579362 | 13 days ago | IN | 0 ETH | 0.00010381 | ||||
| Grant Approvals | 24576791 | 13 days ago | IN | 0 ETH | 0.00000753 | ||||
| Grant Approvals | 24574705 | 13 days ago | IN | 0 ETH | 0.00000186 | ||||
| Grant Approvals | 24566970 | 15 days ago | IN | 0 ETH | 0.00010182 | ||||
| Grant Approvals | 24558200 | 16 days ago | IN | 0 ETH | 0.00000398 | ||||
| Grant Approvals | 24530921 | 20 days ago | IN | 0 ETH | 0.00000728 | ||||
| Grant Approvals | 24524760 | 20 days ago | IN | 0 ETH | 0.00010092 | ||||
| Grant Approvals | 24502285 | 24 days ago | IN | 0 ETH | 0.00010079 | ||||
| Grant Approvals | 24497986 | 24 days ago | IN | 0 ETH | 0.0001007 | ||||
| Grant Approvals | 24495918 | 24 days ago | IN | 0 ETH | 0.00000343 | ||||
| Grant Approvals | 24492466 | 25 days ago | IN | 0 ETH | 0.00010618 | ||||
| Grant Approvals | 24487843 | 26 days ago | IN | 0 ETH | 0.00000492 | ||||
| Grant Approvals | 24487816 | 26 days ago | IN | 0 ETH | 0.00000217 | ||||
| Grant Approvals | 24487140 | 26 days ago | IN | 0 ETH | 0.00010072 | ||||
| Grant Approvals | 24485809 | 26 days ago | IN | 0 ETH | 0.00010946 | ||||
| Grant Approvals | 24485798 | 26 days ago | IN | 0 ETH | 0.00010759 | ||||
| Grant Approvals | 24463548 | 29 days ago | IN | 0 ETH | 0.0000059 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60806040 | 16824890 | 1098 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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
Contract ABI
API[{"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
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.