Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| 0xe708274a27e86e7f521bce79859c0f3ebf839cb2ab848220075cab1f159aa5fb | List Item | (pending) | 1 min ago | IN | 0 ETH | (Pending) | |||
| Buy Item | 24748561 | 14 mins ago | IN | 0.0076 ETH | 0.000276 | ||||
| List Item | 24748508 | 25 mins ago | IN | 0 ETH | 0.00014334 | ||||
| List Item | 24748333 | 1 hr ago | IN | 0 ETH | 0.00000949 | ||||
| Buy Item | 24748153 | 1 hr ago | IN | 0.0075 ETH | 0.00025854 | ||||
| List Item | 24748120 | 1 hr ago | IN | 0 ETH | 0.00013133 | ||||
| List Item | 24747898 | 2 hrs ago | IN | 0 ETH | 0.00001431 | ||||
| Cancel Listing | 24747894 | 2 hrs ago | IN | 0 ETH | 0.00000562 | ||||
| Cancel Listing | 24747893 | 2 hrs ago | IN | 0 ETH | 0.00000597 | ||||
| List Item | 24747867 | 2 hrs ago | IN | 0 ETH | 0.00001288 | ||||
| Cancel Listing | 24747851 | 2 hrs ago | IN | 0 ETH | 0.0000108 | ||||
| List Item | 24747800 | 2 hrs ago | IN | 0 ETH | 0.00001594 | ||||
| List Item | 24747657 | 3 hrs ago | IN | 0 ETH | 0.0000381 | ||||
| Cancel Listing | 24747654 | 3 hrs ago | IN | 0 ETH | 0.00001506 | ||||
| Cancel Listing | 24747653 | 3 hrs ago | IN | 0 ETH | 0.0000159 | ||||
| Cancel Listing | 24747454 | 3 hrs ago | IN | 0 ETH | 0.00000254 | ||||
| List Item | 24747351 | 4 hrs ago | IN | 0 ETH | 0.00003162 | ||||
| List Item | 24747292 | 4 hrs ago | IN | 0 ETH | 0.00000256 | ||||
| Cancel Listing | 24747289 | 4 hrs ago | IN | 0 ETH | 0.00000113 | ||||
| List Item | 24747224 | 4 hrs ago | IN | 0 ETH | 0.00000348 | ||||
| List Item | 24747218 | 4 hrs ago | IN | 0 ETH | 0.00000394 | ||||
| List Item | 24747211 | 4 hrs ago | IN | 0 ETH | 0.00000441 | ||||
| List Item | 24747207 | 4 hrs ago | IN | 0 ETH | 0.00020261 | ||||
| Cancel Listing | 24747173 | 4 hrs ago | IN | 0 ETH | 0.00002424 | ||||
| List Item | 24747147 | 4 hrs ago | IN | 0 ETH | 0.00000359 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 24748561 | 14 mins ago | 0.00684 ETH | ||||
| Transfer | 24748561 | 14 mins ago | 0.000152 ETH | ||||
| Transfer | 24748561 | 14 mins ago | 0.000608 ETH | ||||
| Transfer | 24748153 | 1 hr ago | 0.00675 ETH | ||||
| Transfer | 24748153 | 1 hr ago | 0.00015 ETH | ||||
| Transfer | 24748153 | 1 hr ago | 0.0006 ETH | ||||
| Transfer | 24744091 | 15 hrs ago | 0.0065224 ETH | ||||
| Transfer | 24744091 | 15 hrs ago | 0.00014494 ETH | ||||
| Transfer | 24744091 | 15 hrs ago | 0.00057976 ETH | ||||
| Transfer | 24743432 | 17 hrs ago | 0.006543 ETH | ||||
| Transfer | 24743432 | 17 hrs ago | 0.0001454 ETH | ||||
| Transfer | 24743432 | 17 hrs ago | 0.0005816 ETH | ||||
| Transfer | 24743311 | 17 hrs ago | 0.00675 ETH | ||||
| Transfer | 24743311 | 17 hrs ago | 0.00015 ETH | ||||
| Transfer | 24743311 | 17 hrs ago | 0.0006 ETH | ||||
| Transfer | 24743253 | 18 hrs ago | 0.006516 ETH | ||||
| Transfer | 24743253 | 18 hrs ago | 0.0001448 ETH | ||||
| Transfer | 24743253 | 18 hrs ago | 0.0005792 ETH | ||||
| Transfer | 24743195 | 18 hrs ago | 0.0064863 ETH | ||||
| Transfer | 24743195 | 18 hrs ago | 0.00014414 ETH | ||||
| Transfer | 24743195 | 18 hrs ago | 0.00057656 ETH | ||||
| Transfer | 24743195 | 18 hrs ago | 0.0064863 ETH | ||||
| Transfer | 24743195 | 18 hrs ago | 0.00014414 ETH | ||||
| Transfer | 24743195 | 18 hrs ago | 0.00057656 ETH | ||||
| Transfer | 24743195 | 18 hrs ago | 0.0064863 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CuboidsMarketplace
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/interfaces/IERC2981.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
/**
* @title CuboidsMarketplace v3
*
* FIXES vs v2:
* [CRITICAL] sweepFloor drained escrowed offer ETH - the "refund overpayment"
* block used address(this).balance which includes locked offer funds.
* Fixed: require(msg.value == totalCost) is enforced before execution,
* so there is never overpayment. The drain block is removed entirely.
*
* [NEW] escrowBalance - tracks exactly how much ETH is locked in offers.
* sweepFloor only uses msg.value, never touches escrow.
* adminWithdrawExcess() protects escrow from being drained by owner.
*
* [NEW] Offer expiry - every offer has a deadline (default 7 days).
* expireOffer() lets anyone trigger a refund after expiry.
* acceptOffer() rejects expired offers - buyer must re-offer.
*
* [NEW] adminRefundOffer() - owner can force-refund any stuck offer.
*
* [CLARIFIED] Cancelled listings do NOT affect offers. Offers stay active
* and can be cancelled by the buyer or accepted by the token owner
* at any time, regardless of listing state.
*/
contract CuboidsMarketplace is ReentrancyGuard, Ownable {
// ==========================================
// STATE
// ==========================================
IERC721 public immutable nftContract;
IERC2981 public immutable royaltyContract;
address public feeRecipient;
uint256 public feeBps = 200; // 2%
uint256 public offerDuration = 7 days;
struct Listing {
address seller;
uint256 price;
bool active;
}
struct Offer {
address buyer;
uint256 amount;
uint256 expiry;
bool active;
}
mapping(uint256 => Listing) public listings;
mapping(uint256 => mapping(address => Offer)) public offers;
mapping(uint256 => address[]) public offerors;
/// @dev Total ETH locked in active offers. sweepFloor must never touch this.
uint256 public escrowBalance;
uint256 public totalVolumeWei;
uint256 public totalSales;
// ==========================================
// EVENTS
// ==========================================
event Listed(uint256 indexed tokenId, address indexed seller, uint256 price);
event Sale(uint256 indexed tokenId, address indexed seller, address indexed buyer, uint256 price);
event Cancelled(uint256 indexed tokenId, address indexed seller);
event OfferMade(uint256 indexed tokenId, address indexed buyer, uint256 amount, uint256 expiry);
event OfferCancelled(uint256 indexed tokenId, address indexed buyer);
event OfferExpired(uint256 indexed tokenId, address indexed buyer, uint256 amount);
event OfferAccepted(uint256 indexed tokenId, address indexed seller, address indexed buyer, uint256 amount);
event FeeRecipientUpdated(address newRecipient);
event OfferDurationUpdated(uint256 newDuration);
// ==========================================
// CONSTRUCTOR
// ==========================================
constructor(address nftAddress, address feeRecipient_) Ownable(msg.sender) {
require(nftAddress != address(0), "Zero address");
require(feeRecipient_ != address(0), "Zero address");
nftContract = IERC721(nftAddress);
royaltyContract = IERC2981(nftAddress);
feeRecipient = feeRecipient_;
}
// ==========================================
// INTERNAL: Split payment
// Only called with specific ETH amounts - never reads address(this).balance
// ==========================================
function _splitPayment(uint256 tokenId, uint256 amount, address seller) internal {
(address royaltyReceiver, uint256 royaltyAmount) = royaltyContract.royaltyInfo(tokenId, amount);
uint256 platformFee = (amount * feeBps) / 10000;
uint256 sellerAmount = amount - royaltyAmount - platformFee;
if (royaltyAmount > 0 && royaltyReceiver != address(0)) {
(bool royaltyOk, ) = payable(royaltyReceiver).call{value: royaltyAmount}("");
if (!royaltyOk) sellerAmount += royaltyAmount;
}
if (platformFee > 0) {
(bool feeOk, ) = payable(feeRecipient).call{value: platformFee}("");
require(feeOk, "Fee payment failed");
}
(bool sellerOk, ) = payable(seller).call{value: sellerAmount}("");
require(sellerOk, "Seller payment failed");
}
// ==========================================
// LISTINGS
// ==========================================
function listItem(uint256 tokenId, uint256 price) external {
require(price > 0, "Price must be > 0");
require(nftContract.ownerOf(tokenId) == msg.sender, "Not token owner");
require(
nftContract.isApprovedForAll(msg.sender, address(this)) ||
nftContract.getApproved(tokenId) == address(this),
"Marketplace not approved"
);
listings[tokenId] = Listing({ seller: msg.sender, price: price, active: true });
emit Listed(tokenId, msg.sender, price);
}
function cancelListing(uint256 tokenId) external {
Listing storage l = listings[tokenId];
require(l.active, "Not listed");
require(l.seller == msg.sender || owner() == msg.sender, "Not seller");
l.active = false;
emit Cancelled(tokenId, l.seller);
// Offers on this token remain active and unaffected.
// Buyers can still cancel their offers. Owner can still accept them.
}
function buyItem(uint256 tokenId) external payable nonReentrant {
Listing storage l = listings[tokenId];
require(l.active, "Not listed");
require(msg.value == l.price, "Wrong ETH amount");
require(l.seller != msg.sender, "Cannot buy own listing");
require(nftContract.ownerOf(tokenId) == l.seller, "Seller no longer owns token");
address seller = l.seller;
uint256 price = l.price;
l.active = false;
totalVolumeWei += price;
totalSales += 1;
nftContract.safeTransferFrom(seller, msg.sender, tokenId);
_splitPayment(tokenId, price, seller);
emit Sale(tokenId, seller, msg.sender, price);
}
/**
* @notice Buy multiple listings in one transaction.
*
* KEY SAFETY PROPERTY:
* require(msg.value == totalCost) enforces exact payment.
* There is zero overpayment by definition.
* Therefore no "refund balance" block is needed or exists.
* escrowBalance (offer funds) is NEVER read or touched here.
*/
function sweepFloor(uint256[] calldata tokenIds) external payable nonReentrant {
require(tokenIds.length > 0, "Empty list");
require(tokenIds.length <= 50, "Max 50 per sweep");
// Phase 1: validate all listings and compute exact cost
uint256 totalCost = 0;
for (uint256 i = 0; i < tokenIds.length; i++) {
Listing storage l = listings[tokenIds[i]];
require(l.active, "Token not listed");
require(l.seller != msg.sender, "Cannot buy own listing");
require(nftContract.ownerOf(tokenIds[i]) == l.seller, "Seller no longer owns");
totalCost += l.price;
}
require(msg.value == totalCost, "Wrong total ETH");
// Phase 2: execute - only msg.value is disbursed, escrow untouched
for (uint256 i = 0; i < tokenIds.length; i++) {
Listing storage l = listings[tokenIds[i]];
address seller = l.seller;
uint256 price = l.price;
l.active = false;
totalVolumeWei += price;
totalSales += 1;
nftContract.safeTransferFrom(seller, msg.sender, tokenIds[i]);
_splitPayment(tokenIds[i], price, seller);
emit Sale(tokenIds[i], seller, msg.sender, price);
}
// No balance drain. escrowBalance is safe.
}
// ==========================================
// OFFERS
// ==========================================
/**
* @notice Place an offer on any token (listed or unlisted).
* ETH is locked in escrow until: accepted, cancelled, or expired.
* Making a new offer on the same token refunds the previous one first.
*/
function makeOffer(uint256 tokenId) external payable nonReentrant {
require(msg.value > 0, "Offer must be > 0");
Offer storage existing = offers[tokenId][msg.sender];
// Refund previous offer for same token if active
if (existing.active && existing.amount > 0) {
uint256 refund = existing.amount;
existing.active = false;
existing.amount = 0;
escrowBalance -= refund;
(bool ok, ) = payable(msg.sender).call{value: refund}("");
require(ok, "Refund of previous offer failed");
}
uint256 expiry = block.timestamp + offerDuration;
offers[tokenId][msg.sender] = Offer({
buyer: msg.sender,
amount: msg.value,
expiry: expiry,
active: true
});
escrowBalance += msg.value;
bool found = false;
for (uint256 i = 0; i < offerors[tokenId].length; i++) {
if (offerors[tokenId][i] == msg.sender) { found = true; break; }
}
if (!found) offerors[tokenId].push(msg.sender);
emit OfferMade(tokenId, msg.sender, msg.value, expiry);
}
/**
* @notice Cancel your own offer and get ETH back.
* Works at any time - whether or not the listing is active.
*/
function cancelOffer(uint256 tokenId) external nonReentrant {
Offer storage o = offers[tokenId][msg.sender];
require(o.active, "No active offer");
uint256 refund = o.amount;
o.active = false;
o.amount = 0;
escrowBalance -= refund;
(bool ok, ) = payable(msg.sender).call{value: refund}("");
require(ok, "Refund failed");
emit OfferCancelled(tokenId, msg.sender);
}
/**
* @notice Trigger expiry refund on an offer past its deadline.
* Anyone can call - funds always go to the original buyer.
*/
function expireOffer(uint256 tokenId, address buyer) external nonReentrant {
Offer storage o = offers[tokenId][buyer];
require(o.active, "No active offer");
require(block.timestamp > o.expiry, "Offer not yet expired");
uint256 refund = o.amount;
o.active = false;
o.amount = 0;
escrowBalance -= refund;
(bool ok, ) = payable(buyer).call{value: refund}("");
require(ok, "Expiry refund failed");
emit OfferExpired(tokenId, buyer, refund);
}
/**
* @notice Accept an offer as the token owner.
* Works whether or not the token is currently listed.
* Expired offers are rejected - buyer must re-offer.
*/
function acceptOffer(uint256 tokenId, address buyer) external nonReentrant {
require(nftContract.ownerOf(tokenId) == msg.sender, "Not token owner");
require(
nftContract.isApprovedForAll(msg.sender, address(this)) ||
nftContract.getApproved(tokenId) == address(this),
"Marketplace not approved"
);
Offer storage o = offers[tokenId][buyer];
require(o.active, "No active offer from this buyer");
require(o.amount > 0, "Zero offer");
require(block.timestamp <= o.expiry, "Offer expired - ask buyer to re-offer");
uint256 amount = o.amount;
o.active = false;
o.amount = 0;
escrowBalance -= amount;
totalVolumeWei += amount;
totalSales += 1;
if (listings[tokenId].active && listings[tokenId].seller == msg.sender) {
listings[tokenId].active = false;
}
nftContract.safeTransferFrom(msg.sender, buyer, tokenId);
_splitPayment(tokenId, amount, msg.sender);
emit OfferAccepted(tokenId, msg.sender, buyer, amount);
}
// ==========================================
// VIEW FUNCTIONS
// ==========================================
function getListing(uint256 tokenId) external view returns (
address seller, uint256 price, bool active
) {
Listing memory l = listings[tokenId];
return (l.seller, l.price, l.active);
}
function getOffer(uint256 tokenId, address buyer) external view returns (
uint256 amount, bool active
) {
Offer memory o = offers[tokenId][buyer];
return (o.amount, o.active);
}
function getOfferDetails(uint256 tokenId, address buyer) external view returns (
uint256 amount, uint256 expiry, bool active, bool isExpired
) {
Offer memory o = offers[tokenId][buyer];
return (o.amount, o.expiry, o.active, block.timestamp > o.expiry);
}
function getOffersForToken(uint256 tokenId) external view returns (
address[] memory buyers,
uint256[] memory amounts
) {
address[] memory allOfferors = offerors[tokenId];
uint256 count = 0;
for (uint256 i = 0; i < allOfferors.length; i++) {
Offer memory o = offers[tokenId][allOfferors[i]];
if (o.active && block.timestamp <= o.expiry) count++;
}
buyers = new address[](count);
amounts = new uint256[](count);
uint256 idx = 0;
for (uint256 i = 0; i < allOfferors.length; i++) {
Offer memory o = offers[tokenId][allOfferors[i]];
if (o.active && block.timestamp <= o.expiry) {
buyers[idx] = allOfferors[i];
amounts[idx] = o.amount;
idx++;
}
}
}
function getActiveListings(uint256[] calldata tokenIds) external view returns (
uint256[] memory ids,
address[] memory sellers,
uint256[] memory prices
) {
uint256 count = 0;
for (uint256 i = 0; i < tokenIds.length; i++) {
if (listings[tokenIds[i]].active) count++;
}
ids = new uint256[](count);
sellers = new address[](count);
prices = new uint256[](count);
uint256 idx = 0;
for (uint256 i = 0; i < tokenIds.length; i++) {
Listing memory l = listings[tokenIds[i]];
if (l.active) {
ids[idx] = tokenIds[i];
sellers[idx] = l.seller;
prices[idx] = l.price;
idx++;
}
}
}
// ==========================================
// ADMIN
// ==========================================
function setFeeRecipient(address newRecipient) external onlyOwner {
require(newRecipient != address(0), "Zero address");
feeRecipient = newRecipient;
emit FeeRecipientUpdated(newRecipient);
}
function setFeeBps(uint256 newFeeBps) external onlyOwner {
require(newFeeBps <= 1000, "Max 10%");
feeBps = newFeeBps;
}
function setOfferDuration(uint256 newDuration) external onlyOwner {
require(newDuration >= 1 hours, "Min 1 hour");
require(newDuration <= 30 days, "Max 30 days");
offerDuration = newDuration;
emit OfferDurationUpdated(newDuration);
}
function adminCancelListing(uint256 tokenId) external onlyOwner {
listings[tokenId].active = false;
}
/**
* @notice Force-refund a stuck offer back to the buyer.
* For emergency use only. ETH always goes to the original buyer.
*/
function adminRefundOffer(uint256 tokenId, address buyer) external onlyOwner nonReentrant {
Offer storage o = offers[tokenId][buyer];
require(o.active, "No active offer");
require(o.amount > 0, "Nothing to refund");
uint256 refund = o.amount;
o.active = false;
o.amount = 0;
escrowBalance -= refund;
(bool ok, ) = payable(buyer).call{value: refund}("");
require(ok, "Admin refund failed");
emit OfferCancelled(tokenId, buyer);
}
/**
* @notice Withdraw any ETH that entered the contract outside of offers.
* escrowBalance (offer funds) is fully protected and cannot be withdrawn.
*/
function adminWithdrawExcess() external onlyOwner nonReentrant {
uint256 excess = address(this).balance - escrowBalance;
require(excess > 0, "No excess ETH");
(bool ok, ) = payable(owner()).call{value: excess}("");
require(ok, "Withdraw failed");
}
receive() external payable { revert("Use buyItem() or makeOffer()"); }
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC2981.sol)
pragma solidity >=0.6.2;
import {IERC165} from "../utils/introspection/IERC165.sol";
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
*
* NOTE: ERC-2981 allows setting the royalty to 100% of the price. In that case all the price would be sent to the
* royalty receiver and 0 tokens to the seller. Contracts dealing with royalty should consider empty transfers.
*/
function royaltyInfo(
uint256 tokenId,
uint256 salePrice
) external view returns (address receiver, uint256 royaltyAmount);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/IERC721.sol)
pragma solidity >=0.6.2;
import {IERC165} from "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC-721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC-721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or
* {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC-721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"evmVersion": "cancun",
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"address","name":"feeRecipient_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"}],"name":"Cancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRecipient","type":"address"}],"name":"FeeRecipientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Listed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OfferAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"}],"name":"OfferCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"OfferDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OfferExpired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expiry","type":"uint256"}],"name":"OfferMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Sale","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"}],"name":"acceptOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"adminCancelListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"}],"name":"adminRefundOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminWithdrawExcess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"buyItem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"cancelListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"cancelOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"escrowBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"}],"name":"expireOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getActiveListings","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address[]","name":"sellers","type":"address[]"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getListing","outputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"}],"name":"getOffer","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"}],"name":"getOfferDetails","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"isExpired","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOffersForToken","outputs":[{"internalType":"address[]","name":"buyers","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"listItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"listings","outputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"makeOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"nftContract","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offerDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"offerors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"offers","outputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyContract","outputs":[{"internalType":"contract IERC2981","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFeeBps","type":"uint256"}],"name":"setFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRecipient","type":"address"}],"name":"setFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"setOfferDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"sweepFloor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"totalSales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVolumeWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c060405260c860035562093a8060045534801561001b575f80fd5b506040516131ab3803806131ab83398101604081905261003a91610191565b60015f55338061006457604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006d81610125565b506001600160a01b0382166100b35760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b604482015260640161005b565b6001600160a01b0381166100f85760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b604482015260640161005b565b6001600160a01b03918216608081905260a052600280546001600160a01b031916919092161790556101c2565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b80516001600160a01b038116811461018c575f80fd5b919050565b5f80604083850312156101a2575f80fd5b6101ab83610176565b91506101b960208401610176565b90509250929050565b60805160a051612f746102375f395f8181610336015261295b01525f81816106a601528181610a9101528181610c6f015281816112730152818161133f015281816113d6015281816116f0015281816117bc0152818161185301528181611b040152818161254c01526126880152612f745ff3fe6080604052600436106101e9575f3560e01c8063912d9ac111610108578063d56d229d1161009d578063e74b981b1161006d578063e74b981b14610738578063e7fb74c714610757578063ebdfbce51461076a578063ef706adf146107ee578063f2fde38b1461080d575f80fd5b8063d56d229d14610695578063d888a5c7146106c8578063de74e57b146106dc578063e11e1b0c14610723575f80fd5b8063afe3acbe116100d8578063afe3acbe146105bd578063b9520ce4146105dc578063bd14b4991461066b578063bd62869a14610680575f80fd5b8063912d9ac11461053e578063918d407d1461055d5780639a2f64741461057c578063a308f2b41461058f575f80fd5b8063469048401161017e57806372c27b621161014e57806372c27b62146104b657806381785ffe146104d5578063883efa67146105025780638da5cb5b14610521575f80fd5b806346904840146103cc5780636605ff66146103eb5780636d008ea714610400578063715018a6146104a2575f80fd5b80631db29b42116101b95780631db29b421461035857806324a9d8531461036b578063263faf841461038e578063305a67a8146103ad575f80fd5b8063107a274a1461023f5780631378b62e146102cd57806314b1a983146102ee5780631663ee0314610325575f80fd5b3661023b5760405162461bcd60e51b815260206004820152601c60248201527f557365206275794974656d2829206f72206d616b654f6666657228290000000060448201526064015b60405180910390fd5b5f80fd5b34801561024a575f80fd5b506102a1610259366004612c0e565b5f81815260056020908152604091829020825160608101845281546001600160a01b0316808252600183015493820184905260029092015460ff161515930183905293909250565b604080516001600160a01b03909416845260208401929092521515908201526060015b60405180910390f35b3480156102d8575f80fd5b506102ec6102e7366004612c0e565b61082c565b005b3480156102f9575f80fd5b5061030d610308366004612c25565b6108f0565b6040516001600160a01b0390911681526020016102c4565b348015610330575f80fd5b5061030d7f000000000000000000000000000000000000000000000000000000000000000081565b6102ec610366366004612c45565b610924565b348015610376575f80fd5b5061038060035481565b6040519081526020016102c4565b348015610399575f80fd5b506102ec6103a8366004612c0e565b610dac565b3480156103b8575f80fd5b506102ec6103c7366004612c0e565b610dce565b3480156103d7575f80fd5b5060025461030d906001600160a01b031681565b3480156103f6575f80fd5b50610380600a5481565b34801561040b575f80fd5b5061047a61041a366004612cc8565b5f9182526006602090815260408084206001600160a01b039384168552825292839020835160808101855281549093168352600181015491830182905260028101549383018490526003015460ff16151560609092018290529242831090565b60408051948552602085019390935290151591830191909152151560608201526080016102c4565b3480156104ad575f80fd5b506102ec610ece565b3480156104c1575f80fd5b506102ec6104d0366004612c0e565b610ee1565b3480156104e0575f80fd5b506104f46104ef366004612c0e565b610f2a565b6040516102c4929190612d68565b34801561050d575f80fd5b506102ec61051c366004612c25565b611210565b34801561052c575f80fd5b506001546001600160a01b031661030d565b348015610549575f80fd5b506102ec610558366004612cc8565b611528565b348015610568575f80fd5b506102ec610577366004612cc8565b6116c8565b6102ec61058a366004612c0e565b611bbf565b34801561059a575f80fd5b506105ae6105a9366004612c45565b611e90565b6040516102c493929190612d95565b3480156105c8575f80fd5b506102ec6105d7366004612cc8565b6120e4565b3480156105e7575f80fd5b506106566105f6366004612cc8565b5f9182526006602090815260408084206001600160a01b039384168552825292839020835160808101855281549093168352600181015491830182905260028101549383019390935260039092015460ff16151560609091018190529091565b604080519283529015156020830152016102c4565b348015610676575f80fd5b5061038060095481565b34801561068b575f80fd5b5061038060045481565b3480156106a0575f80fd5b5061030d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106d3575f80fd5b506102ec612290565b3480156106e7575f80fd5b506102a16106f6366004612c0e565b60056020525f90815260409020805460018201546002909201546001600160a01b03909116919060ff1683565b34801561072e575f80fd5b5061038060085481565b348015610743575f80fd5b506102ec610752366004612dd7565b61239d565b6102ec610765366004612c0e565b612438565b348015610775575f80fd5b506107c2610784366004612cc8565b600660209081525f928352604080842090915290825290208054600182015460028301546003909301546001600160a01b0390921692909160ff1684565b604080516001600160a01b039095168552602085019390935291830152151560608201526080016102c4565b3480156107f9575f80fd5b506102ec610808366004612c0e565b612744565b348015610818575f80fd5b506102ec610827366004612dd7565b612874565b6108346128ae565b610e108110156108735760405162461bcd60e51b815260206004820152600a60248201526926b4b71018903437bab960b11b6044820152606401610232565b62278d008111156108b45760405162461bcd60e51b815260206004820152600b60248201526a4d6178203330206461797360a81b6044820152606401610232565b60048190556040518181527febd12e9754bcf5bd8dc9ebe98e437a18443ab0b1b7e2d81139658d1c76d02128906020015b60405180910390a150565b6007602052815f5260405f208181548110610909575f80fd5b5f918252602090912001546001600160a01b03169150829050565b61092c6128db565b806109665760405162461bcd60e51b815260206004820152600a602482015269115b5c1d1e481b1a5cdd60b21b6044820152606401610232565b60328111156109aa5760405162461bcd60e51b815260206004820152601060248201526f04d6178203530207065722073776565760841b6044820152606401610232565b5f805b82811015610b94575f60055f8686858181106109cb576109cb612df9565b602090810292909201358352508101919091526040015f20600281015490915060ff16610a2d5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881b9bdd081b1a5cdd195960821b6044820152606401610232565b8054336001600160a01b0390911603610a815760405162461bcd60e51b815260206004820152601660248201527543616e6e6f7420627579206f776e206c697374696e6760501b6044820152606401610232565b80546001600160a01b03908116907f000000000000000000000000000000000000000000000000000000000000000016636352211e878786818110610ac857610ac8612df9565b905060200201356040518263ffffffff1660e01b8152600401610aed91815260200190565b602060405180830381865afa158015610b08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2c9190612e0d565b6001600160a01b031614610b7a5760405162461bcd60e51b815260206004820152601560248201527453656c6c6572206e6f206c6f6e676572206f776e7360581b6044820152606401610232565b6001810154610b899084612e3c565b9250506001016109ad565b50803414610bd65760405162461bcd60e51b815260206004820152600f60248201526e0aee4dedcce40e8dee8c2d8408aa89608b1b6044820152606401610232565b5f5b82811015610d9d575f60055f868685818110610bf657610bf6612df9565b602090810292909201358352508101919091526040015f9081208054600182015460028301805460ff19169055600980549395506001600160a01b0390921693909283929190610c47908490612e3c565b925050819055506001600a5f828254610c609190612e3c565b90915550506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166342842e0e83338a8a89818110610ca857610ca8612df9565b6040516001600160e01b031960e088901b1681526001600160a01b039586166004820152949093166024850152506020909102013560448201526064015f604051808303815f87803b158015610cfc575f80fd5b505af1158015610d0e573d5f803e3d5ffd5b50505050610d35878786818110610d2757610d27612df9565b905060200201358284612932565b336001600160a01b038316888887818110610d5257610d52612df9565b905060200201357f88863d5e20f64464b554931394e2e4b6f09c10015147215bf26b3ba5070acebe84604051610d8a91815260200190565b60405180910390a4505050600101610bd8565b5050610da860015f55565b5050565b610db46128ae565b5f908152600560205260409020600201805460ff19169055565b5f818152600560205260409020600281015460ff16610e1c5760405162461bcd60e51b815260206004820152600a602482015269139bdd081b1a5cdd195960b21b6044820152606401610232565b80546001600160a01b0316331480610e4d575033610e426001546001600160a01b031690565b6001600160a01b0316145b610e865760405162461bcd60e51b815260206004820152600a6024820152692737ba1039b2b63632b960b11b6044820152606401610232565b60028101805460ff1916905580546040516001600160a01b039091169083907f26deca31ff8139a06c52453ce8985d34f7648a6d9af1d283c4063d052c355a0f905f90a35050565b610ed66128ae565b610edf5f612bbd565b565b610ee96128ae565b6103e8811115610f255760405162461bcd60e51b81526020600482015260076024820152664d61782031302560c81b6044820152606401610232565b600355565b6060805f60075f8581526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610f9157602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f73575b505050505090505f805b8251811015611053575f86815260066020526040812084518290869085908110610fc757610fc7612df9565b6020908102919091018101516001600160a01b0390811683528282019390935260409182015f208251608081018452815490941684526001810154918401919091526002810154918301919091526003015460ff1615801560608301819052919250611037575080604001514211155b1561104a578261104681612e55565b9350505b50600101610f9b565b508067ffffffffffffffff81111561106d5761106d612e6d565b604051908082528060200260200182016040528015611096578160200160208202803683370190505b5093508067ffffffffffffffff8111156110b2576110b2612e6d565b6040519080825280602002602001820160405280156110db578160200160208202803683370190505b5092505f805b8351811015611207575f8781526006602052604081208551829087908590811061110d5761110d612df9565b6020908102919091018101516001600160a01b0390811683528282019390935260409182015f208251608081018452815490941684526001810154918401919091526002810154918301919091526003015460ff161580156060830181905291925061117d575080604001514211155b156111fe5784828151811061119457611194612df9565b60200260200101518784815181106111ae576111ae612df9565b60200260200101906001600160a01b031690816001600160a01b03168152505080602001518684815181106111e5576111e5612df9565b6020908102919091010152826111fa81612e55565b9350505b506001016110e1565b50505050915091565b5f81116112535760405162461bcd60e51b815260206004820152601160248201527005072696365206d757374206265203e203607c1b6044820152606401610232565b6040516331a9108f60e11b81526004810183905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156112b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112dc9190612e0d565b6001600160a01b0316146113245760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b6044820152606401610232565b60405163e985e9c560e01b81523360048201523060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e985e9c590604401602060405180830381865afa15801561138c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b09190612e81565b8061144a575060405163020604bf60e21b81526004810183905230906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063081812fc90602401602060405180830381865afa15801561141b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061143f9190612e0d565b6001600160a01b0316145b6114915760405162461bcd60e51b815260206004820152601860248201527713585c9ad95d1c1b1858d9481b9bdd08185c1c1c9bdd995960421b6044820152606401610232565b6040805160608101825233808252602080830185815260018486018181525f89815260058552879020955186546001600160a01b0319166001600160a01b03909116178655915190850155516002909301805460ff191693151593909317909255915183815284917f50955776c5778c3b7d968d86d8c51fb6b29a7a74c20866b533268e209fc08343910160405180910390a35050565b6115306128ae565b6115386128db565b5f8281526006602090815260408083206001600160a01b03851684529091529020600381015460ff1661157d5760405162461bcd60e51b815260040161023290612ea0565b5f8160010154116115c45760405162461bcd60e51b8152602060048201526011602482015270139bdd1a1a5b99c81d1bc81c99599d5b99607a1b6044820152606401610232565b60018101805460038301805460ff191690555f9182905560088054919283926115ee908490612ec9565b90915550506040515f906001600160a01b0385169083908381818185875af1925050503d805f811461163b576040519150601f19603f3d011682016040523d82523d5f602084013e611640565b606091505b50509050806116875760405162461bcd60e51b815260206004820152601360248201527210591b5a5b881c99599d5b990819985a5b1959606a1b6044820152606401610232565b6040516001600160a01b0385169086907f1f51377b3e685a0e2419f9bb4ba7c07ec54936353ba3d0fb3c6538dab6766222905f90a3505050610da860015f55565b6116d06128db565b6040516331a9108f60e11b81526004810183905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015611735573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117599190612e0d565b6001600160a01b0316146117a15760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b6044820152606401610232565b60405163e985e9c560e01b81523360048201523060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e985e9c590604401602060405180830381865afa158015611809573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182d9190612e81565b806118c7575060405163020604bf60e21b81526004810183905230906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063081812fc90602401602060405180830381865afa158015611898573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118bc9190612e0d565b6001600160a01b0316145b61190e5760405162461bcd60e51b815260206004820152601860248201527713585c9ad95d1c1b1858d9481b9bdd08185c1c1c9bdd995960421b6044820152606401610232565b5f8281526006602090815260408083206001600160a01b03851684529091529020600381015460ff166119835760405162461bcd60e51b815260206004820152601f60248201527f4e6f20616374697665206f666665722066726f6d2074686973206275796572006044820152606401610232565b5f8160010154116119c35760405162461bcd60e51b815260206004820152600a6024820152692d32b9379037b33332b960b11b6044820152606401610232565b8060020154421115611a255760405162461bcd60e51b815260206004820152602560248201527f4f666665722065787069726564202d2061736b20627579657220746f2072652d60448201526437b33332b960d91b6064820152608401610232565b60018101805460038301805460ff191690555f918290556008805491928392611a4f908490612ec9565b925050819055508060095f828254611a679190612e3c565b925050819055506001600a5f828254611a809190612e3c565b90915550505f8481526005602052604090206002015460ff168015611aba57505f848152600560205260409020546001600160a01b031633145b15611ad8575f848152600560205260409020600201805460ff191690555b604051632142170760e11b81523360048201526001600160a01b038481166024830152604482018690527f000000000000000000000000000000000000000000000000000000000000000016906342842e0e906064015f604051808303815f87803b158015611b45575f80fd5b505af1158015611b57573d5f803e3d5ffd5b50505050611b66848233612932565b826001600160a01b0316336001600160a01b0316857fc67f49229cab3f614ad390c12432e0e671552dcfd15e24ddc005cf5a01a0213584604051611bac91815260200190565b60405180910390a45050610da860015f55565b611bc76128db565b5f3411611c0a5760405162461bcd60e51b815260206004820152601160248201527004f66666572206d757374206265203e203607c1b6044820152606401610232565b5f8181526006602090815260408083203384529091529020600381015460ff168015611c3957505f8160010154115b15611d055760018101805460038301805460ff191690555f918290556008805491928392611c68908490612ec9565b90915550506040515f90339083908381818185875af1925050503d805f8114611cac576040519150601f19603f3d011682016040523d82523d5f602084013e611cb1565b606091505b5050905080611d025760405162461bcd60e51b815260206004820152601f60248201527f526566756e64206f662070726576696f7573206f66666572206661696c6564006044820152606401610232565b50505b5f60045442611d149190612e3c565b60408051608081018252338082523460208084018281528486018781526001606087018181525f8d81526006865289812097815296909452968520955186546001600160a01b0319166001600160a01b039091161786559051958501959095559351600284015592516003909201805460ff191692151592909217909155600880549394509192611da6908490612e3c565b909155505f9050805b5f85815260076020526040902054811015611e10575f858152600760205260409020805433919083908110611de657611de6612df9565b5f918252602090912001546001600160a01b031603611e085760019150611e10565b600101611daf565b5080611e44575f8481526007602090815260408220805460018101825590835291200180546001600160a01b031916331790555b6040805134815260208101849052339186917fd7df0c72641d362ea57ecc9cab99c77f936e36bb826f096258c3404196b26d6a910160405180910390a3505050611e8d60015f55565b50565b60608060605f805b85811015611eef5760055f888884818110611eb557611eb5612df9565b602090810292909201358352508101919091526040015f206002015460ff1615611ee75781611ee381612e55565b9250505b600101611e98565b508067ffffffffffffffff811115611f0957611f09612e6d565b604051908082528060200260200182016040528015611f32578160200160208202803683370190505b5093508067ffffffffffffffff811115611f4e57611f4e612e6d565b604051908082528060200260200182016040528015611f77578160200160208202803683370190505b5092508067ffffffffffffffff811115611f9357611f93612e6d565b604051908082528060200260200182016040528015611fbc578160200160208202803683370190505b5091505f805b868110156120da575f60055f8a8a85818110611fe057611fe0612df9565b602090810292909201358352508181019290925260409081015f20815160608101835281546001600160a01b031681526001820154938101939093526002015460ff16158015918301919091529091506120d15788888381811061204657612046612df9565b9050602002013587848151811061205f5761205f612df9565b602002602001018181525050805f015186848151811061208157612081612df9565b60200260200101906001600160a01b031690816001600160a01b03168152505080602001518584815181106120b8576120b8612df9565b6020908102919091010152826120cd81612e55565b9350505b50600101611fc2565b5050509250925092565b6120ec6128db565b5f8281526006602090815260408083206001600160a01b03851684529091529020600381015460ff166121315760405162461bcd60e51b815260040161023290612ea0565b8060020154421161217c5760405162461bcd60e51b815260206004820152601560248201527413d999995c881b9bdd081e595d08195e1c1a5c9959605a1b6044820152606401610232565b60018101805460038301805460ff191690555f9182905560088054919283926121a6908490612ec9565b90915550506040515f906001600160a01b0385169083908381818185875af1925050503d805f81146121f3576040519150601f19603f3d011682016040523d82523d5f602084013e6121f8565b606091505b50509050806122405760405162461bcd60e51b8152602060048201526014602482015273115e1c1a5c9e481c99599d5b990819985a5b195960621b6044820152606401610232565b836001600160a01b0316857f73dedbcfa9a17d6e3f87cd88fa5c704da1a9abff4ec94d2f1a0b0fd0b24d082a8460405161227c91815260200190565b60405180910390a3505050610da860015f55565b6122986128ae565b6122a06128db565b5f600854476122af9190612ec9565b90505f81116122f05760405162461bcd60e51b815260206004820152600d60248201526c09cde40caf0c6cae6e6408aa89609b1b6044820152606401610232565b5f6123036001546001600160a01b031690565b6001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806123925760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b6044820152606401610232565b5050610edf60015f55565b6123a56128ae565b6001600160a01b0381166123ea5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610232565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f7a7b5a0a132f9e0581eb8527f66eae9ee89c2a3e79d4ac7e41a1f1f4d48a7fc2906020016108e5565b6124406128db565b5f818152600560205260409020600281015460ff1661248e5760405162461bcd60e51b815260206004820152600a602482015269139bdd081b1a5cdd195960b21b6044820152606401610232565b806001015434146124d45760405162461bcd60e51b815260206004820152601060248201526f15dc9bdb99c811551208185b5bdd5b9d60821b6044820152606401610232565b8054336001600160a01b03909116036125285760405162461bcd60e51b815260206004820152601660248201527543616e6e6f7420627579206f776e206c697374696e6760501b6044820152606401610232565b80546040516331a9108f60e11b8152600481018490526001600160a01b03918216917f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015612591573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125b59190612e0d565b6001600160a01b03161461260b5760405162461bcd60e51b815260206004820152601b60248201527f53656c6c6572206e6f206c6f6e676572206f776e7320746f6b656e00000000006044820152606401610232565b8054600182015460028301805460ff19169055600980546001600160a01b03909316928291905f9061263e908490612e3c565b925050819055506001600a5f8282546126579190612e3c565b9091555050604051632142170760e11b81526001600160a01b038381166004830152336024830152604482018690527f000000000000000000000000000000000000000000000000000000000000000016906342842e0e906064015f604051808303815f87803b1580156126c9575f80fd5b505af11580156126db573d5f803e3d5ffd5b505050506126ea848284612932565b336001600160a01b0316826001600160a01b0316857f88863d5e20f64464b554931394e2e4b6f09c10015147215bf26b3ba5070acebe8460405161273091815260200190565b60405180910390a4505050611e8d60015f55565b61274c6128db565b5f8181526006602090815260408083203384529091529020600381015460ff166127885760405162461bcd60e51b815260040161023290612ea0565b60018101805460038301805460ff191690555f9182905560088054919283926127b2908490612ec9565b90915550506040515f90339083908381818185875af1925050503d805f81146127f6576040519150601f19603f3d011682016040523d82523d5f602084013e6127fb565b606091505b505090508061283c5760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b6044820152606401610232565b604051339085907f1f51377b3e685a0e2419f9bb4ba7c07ec54936353ba3d0fb3c6538dab6766222905f90a3505050611e8d60015f55565b61287c6128ae565b6001600160a01b0381166128a557604051631e4fbdf760e01b81525f6004820152602401610232565b611e8d81612bbd565b6001546001600160a01b03163314610edf5760405163118cdaa760e01b8152336004820152602401610232565b60025f540361292c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610232565b60025f55565b60405163152a902d60e11b815260048101849052602481018390525f9081906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632a55205a906044016040805180830381865afa15801561299f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129c39190612edc565b915091505f612710600354866129d99190612f08565b6129e39190612f1f565b90505f816129f18488612ec9565b6129fb9190612ec9565b90505f83118015612a1457506001600160a01b03841615155b15612a7f575f846001600160a01b0316846040515f6040518083038185875af1925050503d805f8114612a62576040519150601f19603f3d011682016040523d82523d5f602084013e612a67565b606091505b5050905080612a7d57612a7a8483612e3c565b91505b505b8115612b1c576002546040515f916001600160a01b03169084908381818185875af1925050503d805f8114612acf576040519150601f19603f3d011682016040523d82523d5f602084013e612ad4565b606091505b5050905080612b1a5760405162461bcd60e51b8152602060048201526012602482015271119959481c185e5b595b9d0819985a5b195960721b6044820152606401610232565b505b5f856001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612b65576040519150601f19603f3d011682016040523d82523d5f602084013e612b6a565b606091505b5050905080612bb35760405162461bcd60e51b815260206004820152601560248201527414d95b1b195c881c185e5b595b9d0819985a5b1959605a1b6044820152606401610232565b5050505050505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60208284031215612c1e575f80fd5b5035919050565b5f8060408385031215612c36575f80fd5b50508035926020909101359150565b5f8060208385031215612c56575f80fd5b823567ffffffffffffffff80821115612c6d575f80fd5b818501915085601f830112612c80575f80fd5b813581811115612c8e575f80fd5b8660208260051b8501011115612ca2575f80fd5b60209290920196919550909350505050565b6001600160a01b0381168114611e8d575f80fd5b5f8060408385031215612cd9575f80fd5b823591506020830135612ceb81612cb4565b809150509250929050565b5f815180845260208085019450602084015f5b83811015612d2e5781516001600160a01b031687529582019590820190600101612d09565b509495945050505050565b5f815180845260208085019450602084015f5b83811015612d2e57815187529582019590820190600101612d4c565b604081525f612d7a6040830185612cf6565b8281036020840152612d8c8185612d39565b95945050505050565b606081525f612da76060830186612d39565b8281036020840152612db98186612cf6565b90508281036040840152612dcd8185612d39565b9695505050505050565b5f60208284031215612de7575f80fd5b8135612df281612cb4565b9392505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612e1d575f80fd5b8151612df281612cb4565b634e487b7160e01b5f52601160045260245ffd5b80820180821115612e4f57612e4f612e28565b92915050565b5f60018201612e6657612e66612e28565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612e91575f80fd5b81518015158114612df2575f80fd5b6020808252600f908201526e27379030b1ba34bb329037b33332b960891b604082015260600190565b81810381811115612e4f57612e4f612e28565b5f8060408385031215612eed575f80fd5b8251612ef881612cb4565b6020939093015192949293505050565b8082028115828204841417612e4f57612e4f612e28565b5f82612f3957634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220bc406de1427e901a3b8c5b863c8d424869843f78461869bc139bf6ffb4fd60ad64736f6c6343000819003300000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2500000000000000000000000007497bd5298ac3698a6d4003fd541064db1369ff
Deployed Bytecode
0x6080604052600436106101e9575f3560e01c8063912d9ac111610108578063d56d229d1161009d578063e74b981b1161006d578063e74b981b14610738578063e7fb74c714610757578063ebdfbce51461076a578063ef706adf146107ee578063f2fde38b1461080d575f80fd5b8063d56d229d14610695578063d888a5c7146106c8578063de74e57b146106dc578063e11e1b0c14610723575f80fd5b8063afe3acbe116100d8578063afe3acbe146105bd578063b9520ce4146105dc578063bd14b4991461066b578063bd62869a14610680575f80fd5b8063912d9ac11461053e578063918d407d1461055d5780639a2f64741461057c578063a308f2b41461058f575f80fd5b8063469048401161017e57806372c27b621161014e57806372c27b62146104b657806381785ffe146104d5578063883efa67146105025780638da5cb5b14610521575f80fd5b806346904840146103cc5780636605ff66146103eb5780636d008ea714610400578063715018a6146104a2575f80fd5b80631db29b42116101b95780631db29b421461035857806324a9d8531461036b578063263faf841461038e578063305a67a8146103ad575f80fd5b8063107a274a1461023f5780631378b62e146102cd57806314b1a983146102ee5780631663ee0314610325575f80fd5b3661023b5760405162461bcd60e51b815260206004820152601c60248201527f557365206275794974656d2829206f72206d616b654f6666657228290000000060448201526064015b60405180910390fd5b5f80fd5b34801561024a575f80fd5b506102a1610259366004612c0e565b5f81815260056020908152604091829020825160608101845281546001600160a01b0316808252600183015493820184905260029092015460ff161515930183905293909250565b604080516001600160a01b03909416845260208401929092521515908201526060015b60405180910390f35b3480156102d8575f80fd5b506102ec6102e7366004612c0e565b61082c565b005b3480156102f9575f80fd5b5061030d610308366004612c25565b6108f0565b6040516001600160a01b0390911681526020016102c4565b348015610330575f80fd5b5061030d7f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2581565b6102ec610366366004612c45565b610924565b348015610376575f80fd5b5061038060035481565b6040519081526020016102c4565b348015610399575f80fd5b506102ec6103a8366004612c0e565b610dac565b3480156103b8575f80fd5b506102ec6103c7366004612c0e565b610dce565b3480156103d7575f80fd5b5060025461030d906001600160a01b031681565b3480156103f6575f80fd5b50610380600a5481565b34801561040b575f80fd5b5061047a61041a366004612cc8565b5f9182526006602090815260408084206001600160a01b039384168552825292839020835160808101855281549093168352600181015491830182905260028101549383018490526003015460ff16151560609092018290529242831090565b60408051948552602085019390935290151591830191909152151560608201526080016102c4565b3480156104ad575f80fd5b506102ec610ece565b3480156104c1575f80fd5b506102ec6104d0366004612c0e565b610ee1565b3480156104e0575f80fd5b506104f46104ef366004612c0e565b610f2a565b6040516102c4929190612d68565b34801561050d575f80fd5b506102ec61051c366004612c25565b611210565b34801561052c575f80fd5b506001546001600160a01b031661030d565b348015610549575f80fd5b506102ec610558366004612cc8565b611528565b348015610568575f80fd5b506102ec610577366004612cc8565b6116c8565b6102ec61058a366004612c0e565b611bbf565b34801561059a575f80fd5b506105ae6105a9366004612c45565b611e90565b6040516102c493929190612d95565b3480156105c8575f80fd5b506102ec6105d7366004612cc8565b6120e4565b3480156105e7575f80fd5b506106566105f6366004612cc8565b5f9182526006602090815260408084206001600160a01b039384168552825292839020835160808101855281549093168352600181015491830182905260028101549383019390935260039092015460ff16151560609091018190529091565b604080519283529015156020830152016102c4565b348015610676575f80fd5b5061038060095481565b34801561068b575f80fd5b5061038060045481565b3480156106a0575f80fd5b5061030d7f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2581565b3480156106d3575f80fd5b506102ec612290565b3480156106e7575f80fd5b506102a16106f6366004612c0e565b60056020525f90815260409020805460018201546002909201546001600160a01b03909116919060ff1683565b34801561072e575f80fd5b5061038060085481565b348015610743575f80fd5b506102ec610752366004612dd7565b61239d565b6102ec610765366004612c0e565b612438565b348015610775575f80fd5b506107c2610784366004612cc8565b600660209081525f928352604080842090915290825290208054600182015460028301546003909301546001600160a01b0390921692909160ff1684565b604080516001600160a01b039095168552602085019390935291830152151560608201526080016102c4565b3480156107f9575f80fd5b506102ec610808366004612c0e565b612744565b348015610818575f80fd5b506102ec610827366004612dd7565b612874565b6108346128ae565b610e108110156108735760405162461bcd60e51b815260206004820152600a60248201526926b4b71018903437bab960b11b6044820152606401610232565b62278d008111156108b45760405162461bcd60e51b815260206004820152600b60248201526a4d6178203330206461797360a81b6044820152606401610232565b60048190556040518181527febd12e9754bcf5bd8dc9ebe98e437a18443ab0b1b7e2d81139658d1c76d02128906020015b60405180910390a150565b6007602052815f5260405f208181548110610909575f80fd5b5f918252602090912001546001600160a01b03169150829050565b61092c6128db565b806109665760405162461bcd60e51b815260206004820152600a602482015269115b5c1d1e481b1a5cdd60b21b6044820152606401610232565b60328111156109aa5760405162461bcd60e51b815260206004820152601060248201526f04d6178203530207065722073776565760841b6044820152606401610232565b5f805b82811015610b94575f60055f8686858181106109cb576109cb612df9565b602090810292909201358352508101919091526040015f20600281015490915060ff16610a2d5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881b9bdd081b1a5cdd195960821b6044820152606401610232565b8054336001600160a01b0390911603610a815760405162461bcd60e51b815260206004820152601660248201527543616e6e6f7420627579206f776e206c697374696e6760501b6044820152606401610232565b80546001600160a01b03908116907f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2516636352211e878786818110610ac857610ac8612df9565b905060200201356040518263ffffffff1660e01b8152600401610aed91815260200190565b602060405180830381865afa158015610b08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2c9190612e0d565b6001600160a01b031614610b7a5760405162461bcd60e51b815260206004820152601560248201527453656c6c6572206e6f206c6f6e676572206f776e7360581b6044820152606401610232565b6001810154610b899084612e3c565b9250506001016109ad565b50803414610bd65760405162461bcd60e51b815260206004820152600f60248201526e0aee4dedcce40e8dee8c2d8408aa89608b1b6044820152606401610232565b5f5b82811015610d9d575f60055f868685818110610bf657610bf6612df9565b602090810292909201358352508101919091526040015f9081208054600182015460028301805460ff19169055600980549395506001600160a01b0390921693909283929190610c47908490612e3c565b925050819055506001600a5f828254610c609190612e3c565b90915550506001600160a01b037f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f25166342842e0e83338a8a89818110610ca857610ca8612df9565b6040516001600160e01b031960e088901b1681526001600160a01b039586166004820152949093166024850152506020909102013560448201526064015f604051808303815f87803b158015610cfc575f80fd5b505af1158015610d0e573d5f803e3d5ffd5b50505050610d35878786818110610d2757610d27612df9565b905060200201358284612932565b336001600160a01b038316888887818110610d5257610d52612df9565b905060200201357f88863d5e20f64464b554931394e2e4b6f09c10015147215bf26b3ba5070acebe84604051610d8a91815260200190565b60405180910390a4505050600101610bd8565b5050610da860015f55565b5050565b610db46128ae565b5f908152600560205260409020600201805460ff19169055565b5f818152600560205260409020600281015460ff16610e1c5760405162461bcd60e51b815260206004820152600a602482015269139bdd081b1a5cdd195960b21b6044820152606401610232565b80546001600160a01b0316331480610e4d575033610e426001546001600160a01b031690565b6001600160a01b0316145b610e865760405162461bcd60e51b815260206004820152600a6024820152692737ba1039b2b63632b960b11b6044820152606401610232565b60028101805460ff1916905580546040516001600160a01b039091169083907f26deca31ff8139a06c52453ce8985d34f7648a6d9af1d283c4063d052c355a0f905f90a35050565b610ed66128ae565b610edf5f612bbd565b565b610ee96128ae565b6103e8811115610f255760405162461bcd60e51b81526020600482015260076024820152664d61782031302560c81b6044820152606401610232565b600355565b6060805f60075f8581526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015610f9157602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610f73575b505050505090505f805b8251811015611053575f86815260066020526040812084518290869085908110610fc757610fc7612df9565b6020908102919091018101516001600160a01b0390811683528282019390935260409182015f208251608081018452815490941684526001810154918401919091526002810154918301919091526003015460ff1615801560608301819052919250611037575080604001514211155b1561104a578261104681612e55565b9350505b50600101610f9b565b508067ffffffffffffffff81111561106d5761106d612e6d565b604051908082528060200260200182016040528015611096578160200160208202803683370190505b5093508067ffffffffffffffff8111156110b2576110b2612e6d565b6040519080825280602002602001820160405280156110db578160200160208202803683370190505b5092505f805b8351811015611207575f8781526006602052604081208551829087908590811061110d5761110d612df9565b6020908102919091018101516001600160a01b0390811683528282019390935260409182015f208251608081018452815490941684526001810154918401919091526002810154918301919091526003015460ff161580156060830181905291925061117d575080604001514211155b156111fe5784828151811061119457611194612df9565b60200260200101518784815181106111ae576111ae612df9565b60200260200101906001600160a01b031690816001600160a01b03168152505080602001518684815181106111e5576111e5612df9565b6020908102919091010152826111fa81612e55565b9350505b506001016110e1565b50505050915091565b5f81116112535760405162461bcd60e51b815260206004820152601160248201527005072696365206d757374206265203e203607c1b6044820152606401610232565b6040516331a9108f60e11b81526004810183905233906001600160a01b037f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f251690636352211e90602401602060405180830381865afa1580156112b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112dc9190612e0d565b6001600160a01b0316146113245760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b6044820152606401610232565b60405163e985e9c560e01b81523360048201523060248201527f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f256001600160a01b03169063e985e9c590604401602060405180830381865afa15801561138c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b09190612e81565b8061144a575060405163020604bf60e21b81526004810183905230906001600160a01b037f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f25169063081812fc90602401602060405180830381865afa15801561141b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061143f9190612e0d565b6001600160a01b0316145b6114915760405162461bcd60e51b815260206004820152601860248201527713585c9ad95d1c1b1858d9481b9bdd08185c1c1c9bdd995960421b6044820152606401610232565b6040805160608101825233808252602080830185815260018486018181525f89815260058552879020955186546001600160a01b0319166001600160a01b03909116178655915190850155516002909301805460ff191693151593909317909255915183815284917f50955776c5778c3b7d968d86d8c51fb6b29a7a74c20866b533268e209fc08343910160405180910390a35050565b6115306128ae565b6115386128db565b5f8281526006602090815260408083206001600160a01b03851684529091529020600381015460ff1661157d5760405162461bcd60e51b815260040161023290612ea0565b5f8160010154116115c45760405162461bcd60e51b8152602060048201526011602482015270139bdd1a1a5b99c81d1bc81c99599d5b99607a1b6044820152606401610232565b60018101805460038301805460ff191690555f9182905560088054919283926115ee908490612ec9565b90915550506040515f906001600160a01b0385169083908381818185875af1925050503d805f811461163b576040519150601f19603f3d011682016040523d82523d5f602084013e611640565b606091505b50509050806116875760405162461bcd60e51b815260206004820152601360248201527210591b5a5b881c99599d5b990819985a5b1959606a1b6044820152606401610232565b6040516001600160a01b0385169086907f1f51377b3e685a0e2419f9bb4ba7c07ec54936353ba3d0fb3c6538dab6766222905f90a3505050610da860015f55565b6116d06128db565b6040516331a9108f60e11b81526004810183905233906001600160a01b037f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f251690636352211e90602401602060405180830381865afa158015611735573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117599190612e0d565b6001600160a01b0316146117a15760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b6044820152606401610232565b60405163e985e9c560e01b81523360048201523060248201527f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f256001600160a01b03169063e985e9c590604401602060405180830381865afa158015611809573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182d9190612e81565b806118c7575060405163020604bf60e21b81526004810183905230906001600160a01b037f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f25169063081812fc90602401602060405180830381865afa158015611898573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118bc9190612e0d565b6001600160a01b0316145b61190e5760405162461bcd60e51b815260206004820152601860248201527713585c9ad95d1c1b1858d9481b9bdd08185c1c1c9bdd995960421b6044820152606401610232565b5f8281526006602090815260408083206001600160a01b03851684529091529020600381015460ff166119835760405162461bcd60e51b815260206004820152601f60248201527f4e6f20616374697665206f666665722066726f6d2074686973206275796572006044820152606401610232565b5f8160010154116119c35760405162461bcd60e51b815260206004820152600a6024820152692d32b9379037b33332b960b11b6044820152606401610232565b8060020154421115611a255760405162461bcd60e51b815260206004820152602560248201527f4f666665722065787069726564202d2061736b20627579657220746f2072652d60448201526437b33332b960d91b6064820152608401610232565b60018101805460038301805460ff191690555f918290556008805491928392611a4f908490612ec9565b925050819055508060095f828254611a679190612e3c565b925050819055506001600a5f828254611a809190612e3c565b90915550505f8481526005602052604090206002015460ff168015611aba57505f848152600560205260409020546001600160a01b031633145b15611ad8575f848152600560205260409020600201805460ff191690555b604051632142170760e11b81523360048201526001600160a01b038481166024830152604482018690527f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2516906342842e0e906064015f604051808303815f87803b158015611b45575f80fd5b505af1158015611b57573d5f803e3d5ffd5b50505050611b66848233612932565b826001600160a01b0316336001600160a01b0316857fc67f49229cab3f614ad390c12432e0e671552dcfd15e24ddc005cf5a01a0213584604051611bac91815260200190565b60405180910390a45050610da860015f55565b611bc76128db565b5f3411611c0a5760405162461bcd60e51b815260206004820152601160248201527004f66666572206d757374206265203e203607c1b6044820152606401610232565b5f8181526006602090815260408083203384529091529020600381015460ff168015611c3957505f8160010154115b15611d055760018101805460038301805460ff191690555f918290556008805491928392611c68908490612ec9565b90915550506040515f90339083908381818185875af1925050503d805f8114611cac576040519150601f19603f3d011682016040523d82523d5f602084013e611cb1565b606091505b5050905080611d025760405162461bcd60e51b815260206004820152601f60248201527f526566756e64206f662070726576696f7573206f66666572206661696c6564006044820152606401610232565b50505b5f60045442611d149190612e3c565b60408051608081018252338082523460208084018281528486018781526001606087018181525f8d81526006865289812097815296909452968520955186546001600160a01b0319166001600160a01b039091161786559051958501959095559351600284015592516003909201805460ff191692151592909217909155600880549394509192611da6908490612e3c565b909155505f9050805b5f85815260076020526040902054811015611e10575f858152600760205260409020805433919083908110611de657611de6612df9565b5f918252602090912001546001600160a01b031603611e085760019150611e10565b600101611daf565b5080611e44575f8481526007602090815260408220805460018101825590835291200180546001600160a01b031916331790555b6040805134815260208101849052339186917fd7df0c72641d362ea57ecc9cab99c77f936e36bb826f096258c3404196b26d6a910160405180910390a3505050611e8d60015f55565b50565b60608060605f805b85811015611eef5760055f888884818110611eb557611eb5612df9565b602090810292909201358352508101919091526040015f206002015460ff1615611ee75781611ee381612e55565b9250505b600101611e98565b508067ffffffffffffffff811115611f0957611f09612e6d565b604051908082528060200260200182016040528015611f32578160200160208202803683370190505b5093508067ffffffffffffffff811115611f4e57611f4e612e6d565b604051908082528060200260200182016040528015611f77578160200160208202803683370190505b5092508067ffffffffffffffff811115611f9357611f93612e6d565b604051908082528060200260200182016040528015611fbc578160200160208202803683370190505b5091505f805b868110156120da575f60055f8a8a85818110611fe057611fe0612df9565b602090810292909201358352508181019290925260409081015f20815160608101835281546001600160a01b031681526001820154938101939093526002015460ff16158015918301919091529091506120d15788888381811061204657612046612df9565b9050602002013587848151811061205f5761205f612df9565b602002602001018181525050805f015186848151811061208157612081612df9565b60200260200101906001600160a01b031690816001600160a01b03168152505080602001518584815181106120b8576120b8612df9565b6020908102919091010152826120cd81612e55565b9350505b50600101611fc2565b5050509250925092565b6120ec6128db565b5f8281526006602090815260408083206001600160a01b03851684529091529020600381015460ff166121315760405162461bcd60e51b815260040161023290612ea0565b8060020154421161217c5760405162461bcd60e51b815260206004820152601560248201527413d999995c881b9bdd081e595d08195e1c1a5c9959605a1b6044820152606401610232565b60018101805460038301805460ff191690555f9182905560088054919283926121a6908490612ec9565b90915550506040515f906001600160a01b0385169083908381818185875af1925050503d805f81146121f3576040519150601f19603f3d011682016040523d82523d5f602084013e6121f8565b606091505b50509050806122405760405162461bcd60e51b8152602060048201526014602482015273115e1c1a5c9e481c99599d5b990819985a5b195960621b6044820152606401610232565b836001600160a01b0316857f73dedbcfa9a17d6e3f87cd88fa5c704da1a9abff4ec94d2f1a0b0fd0b24d082a8460405161227c91815260200190565b60405180910390a3505050610da860015f55565b6122986128ae565b6122a06128db565b5f600854476122af9190612ec9565b90505f81116122f05760405162461bcd60e51b815260206004820152600d60248201526c09cde40caf0c6cae6e6408aa89609b1b6044820152606401610232565b5f6123036001546001600160a01b031690565b6001600160a01b0316826040515f6040518083038185875af1925050503d805f811461234a576040519150601f19603f3d011682016040523d82523d5f602084013e61234f565b606091505b50509050806123925760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b6044820152606401610232565b5050610edf60015f55565b6123a56128ae565b6001600160a01b0381166123ea5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610232565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f7a7b5a0a132f9e0581eb8527f66eae9ee89c2a3e79d4ac7e41a1f1f4d48a7fc2906020016108e5565b6124406128db565b5f818152600560205260409020600281015460ff1661248e5760405162461bcd60e51b815260206004820152600a602482015269139bdd081b1a5cdd195960b21b6044820152606401610232565b806001015434146124d45760405162461bcd60e51b815260206004820152601060248201526f15dc9bdb99c811551208185b5bdd5b9d60821b6044820152606401610232565b8054336001600160a01b03909116036125285760405162461bcd60e51b815260206004820152601660248201527543616e6e6f7420627579206f776e206c697374696e6760501b6044820152606401610232565b80546040516331a9108f60e11b8152600481018490526001600160a01b03918216917f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f251690636352211e90602401602060405180830381865afa158015612591573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125b59190612e0d565b6001600160a01b03161461260b5760405162461bcd60e51b815260206004820152601b60248201527f53656c6c6572206e6f206c6f6e676572206f776e7320746f6b656e00000000006044820152606401610232565b8054600182015460028301805460ff19169055600980546001600160a01b03909316928291905f9061263e908490612e3c565b925050819055506001600a5f8282546126579190612e3c565b9091555050604051632142170760e11b81526001600160a01b038381166004830152336024830152604482018690527f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2516906342842e0e906064015f604051808303815f87803b1580156126c9575f80fd5b505af11580156126db573d5f803e3d5ffd5b505050506126ea848284612932565b336001600160a01b0316826001600160a01b0316857f88863d5e20f64464b554931394e2e4b6f09c10015147215bf26b3ba5070acebe8460405161273091815260200190565b60405180910390a4505050611e8d60015f55565b61274c6128db565b5f8181526006602090815260408083203384529091529020600381015460ff166127885760405162461bcd60e51b815260040161023290612ea0565b60018101805460038301805460ff191690555f9182905560088054919283926127b2908490612ec9565b90915550506040515f90339083908381818185875af1925050503d805f81146127f6576040519150601f19603f3d011682016040523d82523d5f602084013e6127fb565b606091505b505090508061283c5760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b6044820152606401610232565b604051339085907f1f51377b3e685a0e2419f9bb4ba7c07ec54936353ba3d0fb3c6538dab6766222905f90a3505050611e8d60015f55565b61287c6128ae565b6001600160a01b0381166128a557604051631e4fbdf760e01b81525f6004820152602401610232565b611e8d81612bbd565b6001546001600160a01b03163314610edf5760405163118cdaa760e01b8152336004820152602401610232565b60025f540361292c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610232565b60025f55565b60405163152a902d60e11b815260048101849052602481018390525f9081906001600160a01b037f00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f251690632a55205a906044016040805180830381865afa15801561299f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129c39190612edc565b915091505f612710600354866129d99190612f08565b6129e39190612f1f565b90505f816129f18488612ec9565b6129fb9190612ec9565b90505f83118015612a1457506001600160a01b03841615155b15612a7f575f846001600160a01b0316846040515f6040518083038185875af1925050503d805f8114612a62576040519150601f19603f3d011682016040523d82523d5f602084013e612a67565b606091505b5050905080612a7d57612a7a8483612e3c565b91505b505b8115612b1c576002546040515f916001600160a01b03169084908381818185875af1925050503d805f8114612acf576040519150601f19603f3d011682016040523d82523d5f602084013e612ad4565b606091505b5050905080612b1a5760405162461bcd60e51b8152602060048201526012602482015271119959481c185e5b595b9d0819985a5b195960721b6044820152606401610232565b505b5f856001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612b65576040519150601f19603f3d011682016040523d82523d5f602084013e612b6a565b606091505b5050905080612bb35760405162461bcd60e51b815260206004820152601560248201527414d95b1b195c881c185e5b595b9d0819985a5b1959605a1b6044820152606401610232565b5050505050505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60208284031215612c1e575f80fd5b5035919050565b5f8060408385031215612c36575f80fd5b50508035926020909101359150565b5f8060208385031215612c56575f80fd5b823567ffffffffffffffff80821115612c6d575f80fd5b818501915085601f830112612c80575f80fd5b813581811115612c8e575f80fd5b8660208260051b8501011115612ca2575f80fd5b60209290920196919550909350505050565b6001600160a01b0381168114611e8d575f80fd5b5f8060408385031215612cd9575f80fd5b823591506020830135612ceb81612cb4565b809150509250929050565b5f815180845260208085019450602084015f5b83811015612d2e5781516001600160a01b031687529582019590820190600101612d09565b509495945050505050565b5f815180845260208085019450602084015f5b83811015612d2e57815187529582019590820190600101612d4c565b604081525f612d7a6040830185612cf6565b8281036020840152612d8c8185612d39565b95945050505050565b606081525f612da76060830186612d39565b8281036020840152612db98186612cf6565b90508281036040840152612dcd8185612d39565b9695505050505050565b5f60208284031215612de7575f80fd5b8135612df281612cb4565b9392505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612e1d575f80fd5b8151612df281612cb4565b634e487b7160e01b5f52601160045260245ffd5b80820180821115612e4f57612e4f612e28565b92915050565b5f60018201612e6657612e66612e28565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612e91575f80fd5b81518015158114612df2575f80fd5b6020808252600f908201526e27379030b1ba34bb329037b33332b960891b604082015260600190565b81810381811115612e4f57612e4f612e28565b5f8060408385031215612eed575f80fd5b8251612ef881612cb4565b6020939093015192949293505050565b8082028115828204841417612e4f57612e4f612e28565b5f82612f3957634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220bc406de1427e901a3b8c5b863c8d424869843f78461869bc139bf6ffb4fd60ad64736f6c63430008190033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f2500000000000000000000000007497bd5298ac3698a6d4003fd541064db1369ff
-----Decoded View---------------
Arg [0] : nftAddress (address): 0x15F2C5d9311f7d8D41B40479eA2b5F1361865f25
Arg [1] : feeRecipient_ (address): 0x07497Bd5298Ac3698A6D4003FD541064Db1369fF
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000015f2c5d9311f7d8d41b40479ea2b5f1361865f25
Arg [1] : 00000000000000000000000007497bd5298ac3698a6d4003fd541064db1369ff
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 32 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.