编译器
0.8.20+commit.a1b79de6
文件 1 的 7:Auctions.sol
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "solady/src/auth/Ownable.sol";
import "./IBidTicket.sol";
enum Status {
Active,
Claimed,
Refunded,
Abandoned,
Withdrawn
}
struct Auction {
uint8 auctionType;
address tokenAddress;
uint64 endTime;
uint8 tokenCount;
Status status;
address highestBidder;
uint256 highestBid;
mapping(uint256 => uint256) tokenIds;
mapping(uint256 => uint256) amounts;
}
contract Auctions is Ownable {
uint8 private constant AUCTION_TYPE_ERC721 = 0;
uint8 private constant AUCTION_TYPE_ERC1155 = 1;
IBidTicket public bidTicket;
address public theBarn;
uint256 public bidTicketTokenId = 1;
uint256 public bidTicketCostStart = 5;
uint256 public bidTicketCostBid = 1;
uint256 public maxTokens = 10;
uint256 public nextAuctionId = 1;
uint256 public minStartingBid = 0.05 ether;
uint256 public minBidIncrement = 0.01 ether;
uint256 public auctionDuration = 7 days;
uint256 public settlementDuration = 7 days;
uint256 public constant ABANDONMENT_FEE_PERCENT = 20;
mapping(uint256 => Auction) public auctions;
mapping(address => mapping(uint256 => bool)) public auctionTokensERC721;
mapping(address => mapping(uint256 => uint256)) public auctionTokensERC1155;
error AuctionAbandoned();
error AuctionActive();
error AuctionClaimed();
error AuctionEnded();
error AuctionIsApproved();
error AuctionNotClaimed();
error AuctionNotEnded();
error AuctionRefunded();
error AuctionWithdrawn();
error BidTooLow();
error InvalidLengthOfAmounts();
error InvalidLengthOfTokenIds();
error MaxTokensPerTxReached();
error NotEnoughTokensInSupply();
error NotHighestBidder();
error SettlementPeriodNotExpired();
error SettlementPeriodEnded();
error StartPriceTooLow();
error TokenAlreadyInAuction();
error TokenNotOwned();
error TransferFailed();
event Abandoned(uint256 indexed auctionId, address indexed bidder, uint256 indexed fee);
event AuctionStarted(address indexed bidder, address indexed tokenAddress, uint256[] indexed tokenIds);
event Claimed(uint256 indexed auctionId, address indexed winner);
event NewBid(uint256 indexed auctionId, address indexed bidder, uint256 indexed value);
event Refunded(uint256 indexed auctionId, address indexed bidder, uint256 indexed value);
event Withdrawn(uint256 indexed auctionId, address indexed bidder, uint256 indexed value);
constructor(address theBarn_, address bidTicket_) {
_initializeOwner(msg.sender);
theBarn = theBarn_;
bidTicket = IBidTicket(bidTicket_);
}
function startAuctionERC721(address tokenAddress, uint256[] calldata tokenIds) external payable {
if (msg.value < minStartingBid) {
revert StartPriceTooLow();
}
bidTicket.burn(msg.sender, bidTicketTokenId, bidTicketCostStart);
_validateAuctionTokensERC721(tokenAddress, tokenIds);
Auction storage auction = auctions[nextAuctionId];
auction.auctionType = AUCTION_TYPE_ERC721;
auction.tokenAddress = tokenAddress;
auction.endTime = uint64(block.timestamp + auctionDuration);
auction.highestBidder = msg.sender;
auction.highestBid = msg.value;
auction.tokenCount = uint8(tokenIds.length);
mapping(uint256 => uint256) storage tokenMap = auction.tokenIds;
for (uint256 i; i < tokenIds.length;) {
tokenMap[i] = tokenIds[i];
unchecked {
++i;
}
}
unchecked {
++nextAuctionId;
}
emit AuctionStarted(msg.sender, tokenAddress, tokenIds);
}
function startAuctionERC1155(address tokenAddress, uint256[] calldata tokenIds, uint256[] calldata amounts)
external
payable
{
if (msg.value < minStartingBid) {
revert StartPriceTooLow();
}
bidTicket.burn(msg.sender, bidTicketTokenId, bidTicketCostStart);
_validateAuctionTokensERC1155(tokenAddress, tokenIds, amounts);
Auction storage auction = auctions[nextAuctionId];
auction.auctionType = AUCTION_TYPE_ERC1155;
auction.tokenAddress = tokenAddress;
auction.endTime = uint64(block.timestamp + auctionDuration);
auction.highestBidder = msg.sender;
auction.highestBid = msg.value;
auction.tokenCount = uint8(tokenIds.length);
mapping(uint256 => uint256) storage tokenMap = auction.tokenIds;
mapping(uint256 => uint256) storage amountMap = auction.amounts;
for (uint256 i; i < tokenIds.length;) {
tokenMap[i] = tokenIds[i];
amountMap[i] = amounts[i];
unchecked {
++i;
}
}
unchecked {
++nextAuctionId;
}
emit AuctionStarted(msg.sender, tokenAddress, tokenIds);
}
function bid(uint256 auctionId) external payable {
Auction storage auction = auctions[auctionId];
if (block.timestamp > auction.endTime) {
revert AuctionEnded();
}
if (block.timestamp >= auction.endTime - 1 hours) {
auction.endTime += 1 hours;
}
if (msg.value < auction.highestBid + minBidIncrement) {
revert BidTooLow();
}
address prevHighestBidder = auction.highestBidder;
uint256 prevHighestBid = auction.highestBid;
auction.highestBidder = msg.sender;
auction.highestBid = msg.value;
bidTicket.burn(msg.sender, bidTicketTokenId, bidTicketCostBid);
if (prevHighestBidder != address(0)) {
(bool success,) = payable(prevHighestBidder).call{value: prevHighestBid}("");
if (!success) revert TransferFailed();
}
emit NewBid(auctionId, msg.sender, msg.value);
}
function claim(uint256 auctionId) external {
Auction storage auction = auctions[auctionId];
if (block.timestamp < auction.endTime) {
revert AuctionNotEnded();
}
if (msg.sender != auction.highestBidder) {
revert NotHighestBidder();
}
if (auction.status != Status.Active) {
if (auction.status == Status.Refunded) {
revert AuctionRefunded();
} else if (auction.status == Status.Claimed) {
revert AuctionClaimed();
} else if (auction.status == Status.Abandoned) {
revert AuctionAbandoned();
}
}
auction.status = Status.Claimed;
if (auction.auctionType == AUCTION_TYPE_ERC721) {
_transferERC721s(auction);
} else {
_transferERC1155s(auction);
}
emit Claimed(auctionId, msg.sender);
}
function refund(uint256 auctionId) external {
Auction storage auction = auctions[auctionId];
uint256 highestBid = auction.highestBid;
uint256 endTime = auction.endTime;
if (block.timestamp < endTime) {
revert AuctionActive();
}
if (block.timestamp > endTime + settlementDuration) {
revert SettlementPeriodEnded();
}
if (msg.sender != auction.highestBidder) {
revert NotHighestBidder();
}
if (auction.status != Status.Active) {
if (auction.status == Status.Refunded) {
revert AuctionRefunded();
} else if (auction.status == Status.Claimed) {
revert AuctionClaimed();
} else if (auction.status == Status.Withdrawn) {
revert AuctionWithdrawn();
}
}
if (auction.auctionType == AUCTION_TYPE_ERC721) {
_checkAndResetERC721s(auction);
} else {
_checkAndResetERC1155s(auction);
}
auction.status = Status.Refunded;
(bool success,) = payable(msg.sender).call{value: highestBid}("");
if (!success) revert TransferFailed();
emit Refunded(auctionId, msg.sender, highestBid);
}
function abandon(uint256 auctionId) external onlyOwner {
Auction storage auction = auctions[auctionId];
address highestBidder = auction.highestBidder;
uint256 highestBid = auction.highestBid;
if (block.timestamp < auction.endTime + settlementDuration) {
revert SettlementPeriodNotExpired();
}
if (auction.status != Status.Active) {
if (auction.status == Status.Abandoned) {
revert AuctionAbandoned();
} else if (auction.status == Status.Refunded) {
revert AuctionRefunded();
} else if (auction.status == Status.Claimed) {
revert AuctionClaimed();
}
}
auction.status = Status.Abandoned;
if (auction.auctionType == AUCTION_TYPE_ERC721) {
_resetERC721s(auction);
} else {
_resetERC1155s(auction);
}
uint256 fee = highestBid * ABANDONMENT_FEE_PERCENT / 100;
(bool success,) = payable(highestBidder).call{value: highestBid - fee}("");
if (!success) revert TransferFailed();
(success,) = payable(msg.sender).call{value: fee}("");
if (!success) revert TransferFailed();
emit Abandoned(auctionId, highestBidder, fee);
}
function withdraw(uint256[] calldata auctionIds) external onlyOwner {
uint256 totalAmount;
for (uint256 i; i < auctionIds.length;) {
Auction storage auction = auctions[auctionIds[i]];
if (auction.status != Status.Claimed) {
revert AuctionNotClaimed();
}
totalAmount += auction.highestBid;
auction.status = Status.Withdrawn;
unchecked {
++i;
}
}
(bool success,) = payable(msg.sender).call{value: totalAmount}("");
if (!success) revert TransferFailed();
}
function getAuctionTokens(uint256 auctionId) external view returns (uint256[] memory, uint256[] memory) {
Auction storage auction = auctions[auctionId];
uint256[] memory tokenIds = new uint256[](auction.tokenCount);
uint256[] memory amounts = new uint256[](auction.tokenCount);
uint256 tokenCount = auction.tokenCount;
for (uint256 i; i < tokenCount;) {
tokenIds[i] = auction.tokenIds[i];
if (auction.auctionType == AUCTION_TYPE_ERC721) {
amounts[i] = 1;
} else {
amounts[i] = auction.amounts[i];
}
unchecked {
++i;
}
}
return (tokenIds, amounts);
}
function setBarnAddress(address theBarn_) external onlyOwner {
theBarn = theBarn_;
}
function setBidTicketAddress(address bidTicket_) external onlyOwner {
bidTicket = IBidTicket(bidTicket_);
}
function setBidTicketTokenId(uint256 bidTicketTokenId_) external onlyOwner {
bidTicketTokenId = bidTicketTokenId_;
}
function setMaxTokens(uint256 maxTokens_) external onlyOwner {
maxTokens = maxTokens_;
}
function setMinStartingBid(uint256 minStartingBid_) external onlyOwner {
minStartingBid = minStartingBid_;
}
function setMinBidIncrement(uint256 minBidIncrement_) external onlyOwner {
minBidIncrement = minBidIncrement_;
}
function setAuctionDuration(uint256 auctionDuration_) external onlyOwner {
auctionDuration = auctionDuration_;
}
function setSettlementDuration(uint256 settlementDuration_) external onlyOwner {
settlementDuration = settlementDuration_;
}
function _validateAuctionTokensERC721(address tokenAddress, uint256[] calldata tokenIds) internal {
if (tokenIds.length == 0) {
revert InvalidLengthOfTokenIds();
}
IERC721 erc721Contract = IERC721(tokenAddress);
if (tokenIds.length > maxTokens) {
revert MaxTokensPerTxReached();
}
mapping(uint256 => bool) storage auctionTokens = auctionTokensERC721[tokenAddress];
for (uint256 i; i < tokenIds.length;) {
uint256 tokenId = tokenIds[i];
if (auctionTokens[tokenId]) {
revert TokenAlreadyInAuction();
}
auctionTokens[tokenId] = true;
if (erc721Contract.ownerOf(tokenId) != theBarn) {
revert TokenNotOwned();
}
unchecked {
++i;
}
}
}
function _validateAuctionTokensERC1155(
address tokenAddress,
uint256[] calldata tokenIds,
uint256[] calldata amounts
) internal {
if (tokenIds.length == 0) {
revert InvalidLengthOfTokenIds();
}
if (tokenIds.length != amounts.length) {
revert InvalidLengthOfAmounts();
}
IERC1155 erc1155Contract = IERC1155(tokenAddress);
uint256 totalTokens;
uint256 totalNeeded;
uint256 balance;
uint256 tokenId;
uint256 amount;
mapping(uint256 => uint256) storage auctionTokens = auctionTokensERC1155[tokenAddress];
for (uint256 i; i < tokenIds.length;) {
tokenId = tokenIds[i];
amount = amounts[i];
totalTokens += amount;
totalNeeded = auctionTokens[tokenId] + amount;
balance = erc1155Contract.balanceOf(theBarn, tokenId);
if (totalNeeded > balance) {
revert NotEnoughTokensInSupply();
}
unchecked {
auctionTokens[tokenId] += amount;
++i;
}
}
if (totalTokens > maxTokens) {
revert MaxTokensPerTxReached();
}
}
function _transferERC721s(Auction storage auction) internal {
address tokenAddress = auction.tokenAddress;
uint256 tokenCount = auction.tokenCount;
address highestBidder = auction.highestBidder;
IERC721 erc721Contract = IERC721(tokenAddress);
mapping(uint256 => uint256) storage tokenMap = auction.tokenIds;
mapping(uint256 => bool) storage auctionTokens = auctionTokensERC721[tokenAddress];
for (uint256 i; i < tokenCount;) {
uint256 tokenId = tokenMap[i];
auctionTokens[tokenId] = false;
erc721Contract.transferFrom(theBarn, highestBidder, tokenId);
unchecked {
++i;
}
}
}
function _transferERC1155s(Auction storage auction) internal {
address tokenAddress = auction.tokenAddress;
IERC1155 erc1155Contract = IERC1155(tokenAddress);
uint256 tokenCount = auction.tokenCount;
uint256[] memory tokenIds = new uint256[](tokenCount);
uint256[] memory amounts = new uint256[](tokenCount);
mapping(uint256 => uint256) storage tokenMap = auction.tokenIds;
mapping(uint256 => uint256) storage amountMap = auction.amounts;
mapping(uint256 => uint256) storage auctionTokens = auctionTokensERC1155[tokenAddress];
for (uint256 i; i < tokenCount;) {
uint256 tokenId = tokenMap[i];
uint256 amount = amountMap[i];
tokenIds[i] = tokenId;
amounts[i] = amount;
auctionTokens[tokenId] -= amount;
unchecked {
++i;
}
}
erc1155Contract.safeBatchTransferFrom(theBarn, auction.highestBidder, tokenIds, amounts, "");
}
function _resetERC721s(Auction storage auction) internal {
address tokenAddress = auction.tokenAddress;
uint256 tokenCount = auction.tokenCount;
mapping(uint256 => uint256) storage tokenMap = auction.tokenIds;
mapping(uint256 => bool) storage auctionTokens = auctionTokensERC721[tokenAddress];
for (uint256 i; i < tokenCount;) {
uint256 tokenId = tokenMap[i];
auctionTokens[tokenId] = false;
unchecked {
++i;
}
}
}
function _resetERC1155s(Auction storage auction) internal {
address tokenAddress = auction.tokenAddress;
uint256 tokenCount = auction.tokenCount;
uint256[] memory tokenIds = new uint256[](tokenCount);
uint256[] memory amounts = new uint256[](tokenCount);
mapping(uint256 => uint256) storage tokenMap = auction.tokenIds;
mapping(uint256 => uint256) storage amountMap = auction.amounts;
mapping(uint256 => uint256) storage auctionTokens = auctionTokensERC1155[tokenAddress];
for (uint256 i; i < tokenCount;) {
uint256 tokenId = tokenMap[i];
uint256 amount = amountMap[i];
tokenIds[i] = tokenId;
amounts[i] = amount;
auctionTokens[tokenId] -= amount;
unchecked {
++i;
}
}
}
function _checkAndResetERC721s(Auction storage auction) internal {
address tokenAddress = auction.tokenAddress;
uint256 tokenCount = auction.tokenCount;
mapping(uint256 => uint256) storage tokenMap = auction.tokenIds;
mapping(uint256 => bool) storage auctionTokens = auctionTokensERC721[tokenAddress];
bool notRefundable = IERC721(tokenAddress).isApprovedForAll(theBarn, address(this));
for (uint256 i; i < tokenCount;) {
uint256 tokenId = tokenMap[i];
auctionTokens[tokenId] = false;
notRefundable = notRefundable && (IERC721(tokenAddress).ownerOf(tokenId) == theBarn);
unchecked {
++i;
}
}
if (notRefundable) {
revert AuctionIsApproved();
}
}
function _checkAndResetERC1155s(Auction storage auction) internal {
address tokenAddress = auction.tokenAddress;
uint256 tokenCount = auction.tokenCount;
uint256[] memory tokenIds = new uint256[](tokenCount);
uint256[] memory amounts = new uint256[](tokenCount);
mapping(uint256 => uint256) storage tokenMap = auction.tokenIds;
mapping(uint256 => uint256) storage amountMap = auction.amounts;
mapping(uint256 => uint256) storage auctionTokens = auctionTokensERC1155[tokenAddress];
bool notRefundable = IERC1155(tokenAddress).isApprovedForAll(theBarn, address(this));
for (uint256 i; i < tokenCount;) {
uint256 tokenId = tokenMap[i];
uint256 amount = amountMap[i];
tokenIds[i] = tokenId;
amounts[i] = amount;
auctionTokens[tokenId] -= amount;
notRefundable = notRefundable && (IERC1155(tokenAddress).balanceOf(theBarn, tokenId) >= amount);
unchecked {
++i;
}
}
if (notRefundable) {
revert AuctionIsApproved();
}
}
}
文件 2 的 7:IBidTicket.sol
pragma solidity ^0.8.20;
import "ERC1155P/contracts/IERC1155P.sol";
interface IBidTicket is IERC1155P {
function setURI(uint256 tokenId, string calldata tokenURI) external;
function mint(address to, uint256 id, uint256 amount) external;
function mintBatch(address to, uint256[] calldata ids, uint256[] calldata amounts) external;
function burn(address from, uint256 id, uint256 amount) external;
function burnBatch(address from, uint256[] calldata ids, uint256[] calldata amounts) external;
function setHarvestContract(address harvestContract_) external;
function setAuctionsContract(address auctionsContract_) external;
}
文件 3 的 7:IERC1155.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC1155 is IERC165 {
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;
}
文件 4 的 7:IERC1155P.sol
pragma solidity ^0.8.20;
interface IERC1155P {
error BalanceQueryForZeroAddress();
error ArrayLengthMismatch();
error BurnFromZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error BurnExceedsBalance();
error TransferExceedsBalance();
error ExceedsMaximumBalance();
error TransferCallerNotOwnerNorApproved();
error TransferToNonERC1155ReceiverImplementer();
error TransferToZeroAddress();
error ExceedsMaximumTokenId();
function supportsInterface(bytes4 interfaceId) external view returns (bool);
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;
}
文件 5 的 7:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 6 的 7:IERC721.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC721 is IERC165 {
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);
}
文件 7 的 7:Ownable.sol
pragma solidity ^0.8.4;
abstract contract Ownable {
error Unauthorized();
error NewOwnerIsZeroAddress();
error NoHandoverRequest();
event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
event OwnershipHandoverRequested(address indexed pendingOwner);
event OwnershipHandoverCanceled(address indexed pendingOwner);
uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;
uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;
uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;
uint256 private constant _OWNER_SLOT_NOT = 0x8b78c6d8;
uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;
function _initializeOwner(address newOwner) internal virtual {
assembly {
newOwner := shr(96, shl(96, newOwner))
sstore(not(_OWNER_SLOT_NOT), newOwner)
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
}
}
function _setOwner(address newOwner) internal virtual {
assembly {
let ownerSlot := not(_OWNER_SLOT_NOT)
newOwner := shr(96, shl(96, newOwner))
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
sstore(ownerSlot, newOwner)
}
}
function _checkOwner() internal view virtual {
assembly {
if iszero(eq(caller(), sload(not(_OWNER_SLOT_NOT)))) {
mstore(0x00, 0x82b42900)
revert(0x1c, 0x04)
}
}
}
function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
return 48 * 3600;
}
function transferOwnership(address newOwner) public payable virtual onlyOwner {
assembly {
if iszero(shl(96, newOwner)) {
mstore(0x00, 0x7448fbae)
revert(0x1c, 0x04)
}
}
_setOwner(newOwner);
}
function renounceOwnership() public payable virtual onlyOwner {
_setOwner(address(0));
}
function requestOwnershipHandover() public payable virtual {
unchecked {
uint256 expires = block.timestamp + _ownershipHandoverValidFor();
assembly {
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), expires)
log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
}
}
}
function cancelOwnershipHandover() public payable virtual {
assembly {
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), 0)
log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
}
}
function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
assembly {
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
let handoverSlot := keccak256(0x0c, 0x20)
if gt(timestamp(), sload(handoverSlot)) {
mstore(0x00, 0x6f5e8818)
revert(0x1c, 0x04)
}
sstore(handoverSlot, 0)
}
_setOwner(pendingOwner);
}
function owner() public view virtual returns (address result) {
assembly {
result := sload(not(_OWNER_SLOT_NOT))
}
}
function ownershipHandoverExpiresAt(address pendingOwner)
public
view
virtual
returns (uint256 result)
{
assembly {
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
result := sload(keccak256(0x0c, 0x20))
}
}
modifier onlyOwner() virtual {
_checkOwner();
_;
}
}
{
"compilationTarget": {
"src/Auctions.sol": "Auctions"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 10000
},
"remappings": [
":@openzeppelin/=lib/openzeppelin-contracts/",
":ERC1155P/=lib/ERC1155P/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/",
":openzeppelin/=lib/openzeppelin-contracts/contracts/",
":solady/=lib/solady/"
],
"viaIR": true
}
[{"inputs":[{"internalType":"address","name":"theBarn_","type":"address"},{"internalType":"address","name":"bidTicket_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AuctionAbandoned","type":"error"},{"inputs":[],"name":"AuctionActive","type":"error"},{"inputs":[],"name":"AuctionClaimed","type":"error"},{"inputs":[],"name":"AuctionEnded","type":"error"},{"inputs":[],"name":"AuctionIsApproved","type":"error"},{"inputs":[],"name":"AuctionNotClaimed","type":"error"},{"inputs":[],"name":"AuctionNotEnded","type":"error"},{"inputs":[],"name":"AuctionRefunded","type":"error"},{"inputs":[],"name":"AuctionWithdrawn","type":"error"},{"inputs":[],"name":"BidTooLow","type":"error"},{"inputs":[],"name":"InvalidLengthOfAmounts","type":"error"},{"inputs":[],"name":"InvalidLengthOfTokenIds","type":"error"},{"inputs":[],"name":"MaxTokensPerTxReached","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"NotEnoughTokensInSupply","type":"error"},{"inputs":[],"name":"NotHighestBidder","type":"error"},{"inputs":[],"name":"SettlementPeriodEnded","type":"error"},{"inputs":[],"name":"SettlementPeriodNotExpired","type":"error"},{"inputs":[],"name":"StartPriceTooLow","type":"error"},{"inputs":[],"name":"TokenAlreadyInAuction","type":"error"},{"inputs":[],"name":"TokenNotOwned","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"bidder","type":"address"},{"indexed":true,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Abandoned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bidder","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"AuctionStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"winner","type":"address"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"bidder","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"NewBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"bidder","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"bidder","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"ABANDONMENT_FEE_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"abandon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auctionDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionTokensERC1155","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionTokensERC721","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctions","outputs":[{"internalType":"uint8","name":"auctionType","type":"uint8"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint8","name":"tokenCount","type":"uint8"},{"internalType":"enum Status","name":"status","type":"uint8"},{"internalType":"address","name":"highestBidder","type":"address"},{"internalType":"uint256","name":"highestBid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"bidTicket","outputs":[{"internalType":"contract IBidTicket","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bidTicketCostBid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bidTicketCostStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bidTicketTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"getAuctionTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBidIncrement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minStartingBid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextAuctionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionDuration_","type":"uint256"}],"name":"setAuctionDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"theBarn_","type":"address"}],"name":"setBarnAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bidTicket_","type":"address"}],"name":"setBidTicketAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bidTicketTokenId_","type":"uint256"}],"name":"setBidTicketTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTokens_","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minBidIncrement_","type":"uint256"}],"name":"setMinBidIncrement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minStartingBid_","type":"uint256"}],"name":"setMinStartingBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"settlementDuration_","type":"uint256"}],"name":"setSettlementDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settlementDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"startAuctionERC1155","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"startAuctionERC721","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"theBarn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"auctionIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]