编译器
0.8.17+commit.8df45f5f
文件 1 的 19:GenericErrors.sol
pragma solidity ^0.8.17;
error NotAContract();
文件 2 的 19:IERC1155.sol
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;
}
文件 3 的 19:IERC20.sol
pragma solidity ^0.8.17;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 4 的 19:IERC721.sol
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);
}
文件 5 的 19:ILooksRareAggregator.sol
pragma solidity 0.8.17;
import {BasicOrder, TokenTransfer} from "../libraries/OrderStructs.sol";
interface ILooksRareAggregator {
struct TradeData {
address proxy;
bytes4 selector;
BasicOrder[] orders;
bytes[] ordersExtraData;
bytes extraData;
}
function execute(
TokenTransfer[] calldata tokenTransfers,
TradeData[] calldata tradeData,
address originator,
address recipient,
bool isAtomic
) external payable;
event FunctionAdded(address proxy, bytes4 selector);
event FunctionRemoved(address proxy, bytes4 selector);
event Sweep(address sweeper);
error AlreadySet();
error ETHTransferFail();
error InvalidFunction();
error UseERC20EnabledLooksRareAggregator();
}
文件 6 的 19:IOwnableTwoSteps.sol
pragma solidity ^0.8.17;
interface IOwnableTwoSteps {
enum Status {
NoOngoingTransfer,
TransferInProgress,
RenouncementInProgress
}
error NoOngoingTransferInProgress();
error NotOwner();
error RenouncementNotInProgress();
error TransferAlreadyInProgress();
error TransferNotInProgress();
error WrongPotentialOwner();
event CancelOwnershipTransfer();
event InitiateOwnershipRenouncement();
event InitiateOwnershipTransfer(address previousOwner, address potentialOwner);
event NewOwner(address newOwner);
}
文件 7 的 19:IReentrancyGuard.sol
pragma solidity ^0.8.17;
interface IReentrancyGuard {
error ReentrancyFail();
}
文件 8 的 19:LooksRareAggregator.sol
pragma solidity 0.8.17;
import {OwnableTwoSteps} from "@looksrare/contracts-libs/contracts/OwnableTwoSteps.sol";
import {ReentrancyGuard} from "@looksrare/contracts-libs/contracts/ReentrancyGuard.sol";
import {LowLevelERC20Approve} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC20Approve.sol";
import {LowLevelERC20Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC20Transfer.sol";
import {LowLevelERC721Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC721Transfer.sol";
import {LowLevelERC1155Transfer} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelERC1155Transfer.sol";
import {IERC20} from "@looksrare/contracts-libs/contracts/interfaces/generic/IERC20.sol";
import {TokenReceiver} from "./TokenReceiver.sol";
import {ILooksRareAggregator} from "./interfaces/ILooksRareAggregator.sol";
import {TokenTransfer} from "./libraries/OrderStructs.sol";
import {InvalidOrderLength, TradeExecutionFailed, ZeroAddress} from "./libraries/SharedErrors.sol";
contract LooksRareAggregator is
ILooksRareAggregator,
TokenReceiver,
ReentrancyGuard,
LowLevelERC20Approve,
LowLevelERC20Transfer,
LowLevelERC721Transfer,
LowLevelERC1155Transfer,
OwnableTwoSteps
{
address public erc20EnabledLooksRareAggregator;
mapping(address => mapping(bytes4 => uint256)) private _proxyFunctionSelectors;
constructor(address _owner) OwnableTwoSteps(_owner) {}
function execute(
TokenTransfer[] calldata tokenTransfers,
TradeData[] calldata tradeData,
address originator,
address recipient,
bool isAtomic
) external payable nonReentrant {
if (recipient == address(0)) {
revert ZeroAddress();
}
uint256 tradeDataLength = tradeData.length;
if (tradeDataLength == 0) {
revert InvalidOrderLength();
}
if (tokenTransfers.length == 0) {
originator = msg.sender;
} else if (msg.sender != erc20EnabledLooksRareAggregator) {
revert UseERC20EnabledLooksRareAggregator();
}
for (uint256 i; i < tradeDataLength; ) {
TradeData calldata singleTradeData = tradeData[i];
address proxy = singleTradeData.proxy;
if (_proxyFunctionSelectors[proxy][singleTradeData.selector] != 1) {
revert InvalidFunction();
}
(bool success, bytes memory returnData) = proxy.delegatecall(
abi.encodeWithSelector(
singleTradeData.selector,
singleTradeData.orders,
singleTradeData.ordersExtraData,
singleTradeData.extraData,
recipient,
isAtomic
)
);
if (!success) {
if (isAtomic) {
if (returnData.length != 0) {
assembly {
let returnDataSize := mload(returnData)
revert(add(32, returnData), returnDataSize)
}
} else {
revert TradeExecutionFailed();
}
}
}
unchecked {
++i;
}
}
if (tokenTransfers.length != 0) {
_returnERC20TokensIfAny(tokenTransfers, originator);
}
bool status = true;
assembly {
if gt(selfbalance(), 1) {
status := call(gas(), originator, sub(selfbalance(), 1), 0, 0, 0, 0)
}
}
if (!status) {
revert ETHTransferFail();
}
emit Sweep(originator);
}
function setERC20EnabledLooksRareAggregator(address _erc20EnabledLooksRareAggregator) external onlyOwner {
if (erc20EnabledLooksRareAggregator != address(0)) {
revert AlreadySet();
}
erc20EnabledLooksRareAggregator = _erc20EnabledLooksRareAggregator;
}
function addFunction(address proxy, bytes4 selector) external onlyOwner {
_proxyFunctionSelectors[proxy][selector] = 1;
emit FunctionAdded(proxy, selector);
}
function removeFunction(address proxy, bytes4 selector) external onlyOwner {
delete _proxyFunctionSelectors[proxy][selector];
emit FunctionRemoved(proxy, selector);
}
function approve(
address currency,
address marketplace,
uint256 amount
) external onlyOwner {
_executeERC20Approve(currency, marketplace, amount);
}
function supportsProxyFunction(address proxy, bytes4 selector) external view returns (bool isSupported) {
isSupported = _proxyFunctionSelectors[proxy][selector] == 1;
}
function rescueERC721(
address collection,
address to,
uint256 tokenId
) external onlyOwner {
_executeERC721TransferFrom(collection, address(this), to, tokenId);
}
function rescueERC1155(
address collection,
address to,
uint256[] calldata tokenIds,
uint256[] calldata amounts
) external onlyOwner {
_executeERC1155SafeBatchTransferFrom(collection, address(this), to, tokenIds, amounts);
}
receive() external payable {}
function _returnERC20TokensIfAny(TokenTransfer[] calldata tokenTransfers, address recipient) private {
uint256 tokenTransfersLength = tokenTransfers.length;
for (uint256 i; i < tokenTransfersLength; ) {
uint256 balance = IERC20(tokenTransfers[i].currency).balanceOf(address(this));
if (balance != 0) {
_executeERC20DirectTransfer(tokenTransfers[i].currency, recipient, balance);
}
unchecked {
++i;
}
}
}
}
文件 9 的 19:LowLevelERC1155Transfer.sol
pragma solidity ^0.8.17;
import {IERC1155} from "../interfaces/generic/IERC1155.sol";
import {ERC1155SafeTransferFromFail, ERC1155SafeBatchTransferFromFail} from "../errors/LowLevelErrors.sol";
import {NotAContract} from "../errors/GenericErrors.sol";
contract LowLevelERC1155Transfer {
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();
}
}
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();
}
}
}
文件 10 的 19:LowLevelERC20Approve.sol
pragma solidity ^0.8.17;
import {IERC20} from "../interfaces/generic/IERC20.sol";
import {ERC20ApprovalFail} from "../errors/LowLevelErrors.sol";
import {NotAContract} from "../errors/GenericErrors.sol";
contract LowLevelERC20Approve {
function _executeERC20Approve(address currency, address to, uint256 amount) internal {
if (currency.code.length == 0) {
revert NotAContract();
}
(bool status, bytes memory data) = currency.call(abi.encodeCall(IERC20.approve, (to, amount)));
if (!status) {
revert ERC20ApprovalFail();
}
if (data.length > 0) {
if (!abi.decode(data, (bool))) {
revert ERC20ApprovalFail();
}
}
}
}
文件 11 的 19:LowLevelERC20Transfer.sol
pragma solidity ^0.8.17;
import {IERC20} from "../interfaces/generic/IERC20.sol";
import {ERC20TransferFail, ERC20TransferFromFail} from "../errors/LowLevelErrors.sol";
import {NotAContract} from "../errors/GenericErrors.sol";
contract LowLevelERC20Transfer {
function _executeERC20TransferFrom(address currency, address from, address to, uint256 amount) internal {
if (currency.code.length == 0) {
revert NotAContract();
}
(bool status, bytes memory data) = currency.call(abi.encodeCall(IERC20.transferFrom, (from, to, amount)));
if (!status) {
revert ERC20TransferFromFail();
}
if (data.length > 0) {
if (!abi.decode(data, (bool))) {
revert ERC20TransferFromFail();
}
}
}
function _executeERC20DirectTransfer(address currency, address to, uint256 amount) internal {
if (currency.code.length == 0) {
revert NotAContract();
}
(bool status, bytes memory data) = currency.call(abi.encodeCall(IERC20.transfer, (to, amount)));
if (!status) {
revert ERC20TransferFail();
}
if (data.length > 0) {
if (!abi.decode(data, (bool))) {
revert ERC20TransferFail();
}
}
}
}
文件 12 的 19:LowLevelERC721Transfer.sol
pragma solidity ^0.8.17;
import {IERC721} from "../interfaces/generic/IERC721.sol";
import {ERC721TransferFromFail} from "../errors/LowLevelErrors.sol";
import {NotAContract} from "../errors/GenericErrors.sol";
contract LowLevelERC721Transfer {
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();
}
}
}
文件 13 的 19:LowLevelErrors.sol
pragma solidity ^0.8.17;
error ETHTransferFail();
error ERC20ApprovalFail();
error ERC20TransferFail();
error ERC20TransferFromFail();
error ERC721TransferFromFail();
error ERC1155SafeTransferFromFail();
error ERC1155SafeBatchTransferFromFail();
文件 14 的 19:OrderEnums.sol
pragma solidity 0.8.17;
enum CollectionType {
ERC721,
ERC1155
}
文件 15 的 19:OrderStructs.sol
pragma solidity 0.8.17;
import {CollectionType} from "./OrderEnums.sol";
struct BasicOrder {
address signer;
address collection;
CollectionType collectionType;
uint256[] tokenIds;
uint256[] amounts;
uint256 price;
address currency;
uint256 startTime;
uint256 endTime;
bytes signature;
}
struct TokenTransfer {
uint256 amount;
address currency;
}
文件 16 的 19:OwnableTwoSteps.sol
pragma solidity ^0.8.17;
import {IOwnableTwoSteps} from "./interfaces/IOwnableTwoSteps.sol";
abstract contract OwnableTwoSteps is IOwnableTwoSteps {
address public owner;
address public potentialOwner;
Status public ownershipStatus;
modifier onlyOwner() {
_onlyOwner();
_;
}
constructor(address _owner) {
owner = _owner;
emit NewOwner(_owner);
}
function cancelOwnershipTransfer() external onlyOwner {
Status _ownershipStatus = ownershipStatus;
if (_ownershipStatus == Status.NoOngoingTransfer) {
revert NoOngoingTransferInProgress();
}
if (_ownershipStatus == Status.TransferInProgress) {
delete potentialOwner;
}
delete ownershipStatus;
emit CancelOwnershipTransfer();
}
function confirmOwnershipRenouncement() external onlyOwner {
if (ownershipStatus != Status.RenouncementInProgress) {
revert RenouncementNotInProgress();
}
delete owner;
delete ownershipStatus;
emit NewOwner(address(0));
}
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);
}
function initiateOwnershipTransfer(address newPotentialOwner) external onlyOwner {
if (ownershipStatus != Status.NoOngoingTransfer) {
revert TransferAlreadyInProgress();
}
ownershipStatus = Status.TransferInProgress;
potentialOwner = newPotentialOwner;
emit InitiateOwnershipTransfer(msg.sender, newPotentialOwner);
}
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();
}
}
文件 17 的 19:ReentrancyGuard.sol
pragma solidity ^0.8.17;
import {IReentrancyGuard} from "./interfaces/IReentrancyGuard.sol";
abstract contract ReentrancyGuard is IReentrancyGuard {
uint256 private _status;
modifier nonReentrant() {
if (_status == 2) {
revert ReentrancyFail();
}
_status = 2;
_;
_status = 1;
}
constructor() {
_status = 1;
}
}
文件 18 的 19:SharedErrors.sol
pragma solidity 0.8.17;
error InvalidOrderLength();
error TradeExecutionFailed();
error ZeroAddress();
文件 19 的 19:TokenReceiver.sol
pragma solidity 0.8.17;
abstract contract TokenReceiver {
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return this.onERC721Received.selector;
}
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(
address,
address,
uint256[] calldata,
uint256[] calldata,
bytes calldata
) external virtual returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}
{
"compilationTarget": {
"contracts/LooksRareAggregator.sol": "LooksRareAggregator"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 888888
},
"remappings": [
":@ensdomains/=node_modules/@ensdomains/",
":@looksrare/=node_modules/@looksrare/",
":@openzeppelin/=node_modules/@openzeppelin/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":eth-gas-reporter/=node_modules/eth-gas-reporter/",
":forge-std/=lib/forge-std/src/",
":hardhat/=node_modules/hardhat/",
":solmate/=node_modules/solmate/"
],
"viaIR": true
}
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadySet","type":"error"},{"inputs":[],"name":"ERC1155SafeBatchTransferFromFail","type":"error"},{"inputs":[],"name":"ERC20ApprovalFail","type":"error"},{"inputs":[],"name":"ERC20TransferFail","type":"error"},{"inputs":[],"name":"ERC721TransferFromFail","type":"error"},{"inputs":[],"name":"ETHTransferFail","type":"error"},{"inputs":[],"name":"InvalidFunction","type":"error"},{"inputs":[],"name":"InvalidOrderLength","type":"error"},{"inputs":[],"name":"NoOngoingTransferInProgress","type":"error"},{"inputs":[],"name":"NotAContract","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"ReentrancyFail","type":"error"},{"inputs":[],"name":"RenouncementNotInProgress","type":"error"},{"inputs":[],"name":"TradeExecutionFailed","type":"error"},{"inputs":[],"name":"TransferAlreadyInProgress","type":"error"},{"inputs":[],"name":"TransferNotInProgress","type":"error"},{"inputs":[],"name":"UseERC20EnabledLooksRareAggregator","type":"error"},{"inputs":[],"name":"WrongPotentialOwner","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[],"name":"CancelOwnershipTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"proxy","type":"address"},{"indexed":false,"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"FunctionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"proxy","type":"address"},{"indexed":false,"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"FunctionRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"InitiateOwnershipRenouncement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"potentialOwner","type":"address"}],"name":"InitiateOwnershipTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sweeper","type":"address"}],"name":"Sweep","type":"event"},{"inputs":[{"internalType":"address","name":"proxy","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"addFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"address","name":"marketplace","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmOwnershipRenouncement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"erc20EnabledLooksRareAggregator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"currency","type":"address"}],"internalType":"struct TokenTransfer[]","name":"tokenTransfers","type":"tuple[]"},{"components":[{"internalType":"address","name":"proxy","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"components":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"enum CollectionType","name":"collectionType","type":"uint8"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct BasicOrder[]","name":"orders","type":"tuple[]"},{"internalType":"bytes[]","name":"ordersExtraData","type":"bytes[]"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct ILooksRareAggregator.TradeData[]","name":"tradeData","type":"tuple[]"},{"internalType":"address","name":"originator","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"isAtomic","type":"bool"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"initiateOwnershipRenouncement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPotentialOwner","type":"address"}],"name":"initiateOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownershipStatus","outputs":[{"internalType":"enum IOwnableTwoSteps.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"potentialOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxy","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"removeFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"rescueERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rescueERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_erc20EnabledLooksRareAggregator","type":"address"}],"name":"setERC20EnabledLooksRareAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxy","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"supportsProxyFunction","outputs":[{"internalType":"bool","name":"isSupported","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]