ETH Price: $3,343.46 (-1.00%)

Contract

0x000000000000F10286D9c1c5d4635a25070572b6
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Batch Sale214641412024-12-23 8:58:232 hrs ago1734944303IN
ENS Nameharvest.harv.eth
0.005 ETH0.00206724.36892496
Batch Sale214637632024-12-23 7:41:473 hrs ago1734939707IN
ENS Nameharvest.harv.eth
0.005 ETH0.000718854.93530084
Batch Sale214635882024-12-23 7:06:114 hrs ago1734937571IN
ENS Nameharvest.harv.eth
0.005 ETH0.001526114.32538042
Batch Sale214632432024-12-23 5:56:595 hrs ago1734933419IN
ENS Nameharvest.harv.eth
0.005 ETH0.001108824.36185811
Batch Sale214631692024-12-23 5:42:115 hrs ago1734932531IN
ENS Nameharvest.harv.eth
0.005 ETH0.006277964.50210791
Batch Sale214627492024-12-23 4:17:356 hrs ago1734927455IN
ENS Nameharvest.harv.eth
0.005 ETH0.001034386.71934083
Batch Sale214627112024-12-23 4:09:596 hrs ago1734926999IN
ENS Nameharvest.harv.eth
0.005 ETH0.001188685.97773838
Batch Sale214626342024-12-23 3:54:357 hrs ago1734926075IN
ENS Nameharvest.harv.eth
0.005 ETH0.004362114.54727054
Batch Sale214621712024-12-23 2:20:598 hrs ago1734920459IN
ENS Nameharvest.harv.eth
0.005 ETH0.002728315.10734397
Batch Sale214621622024-12-23 2:19:118 hrs ago1734920351IN
ENS Nameharvest.harv.eth
0.005 ETH0.002415564.9402937
Batch Sale214620912024-12-23 2:04:599 hrs ago1734919499IN
ENS Nameharvest.harv.eth
0.005 ETH0.001121215.17086439
Batch Sale214620542024-12-23 1:57:359 hrs ago1734919055IN
ENS Nameharvest.harv.eth
0.005 ETH0.001879485.83580148
Batch Sale214620382024-12-23 1:54:239 hrs ago1734918863IN
ENS Nameharvest.harv.eth
0.005 ETH0.004317754.94468553
Batch Sale214620212024-12-23 1:50:599 hrs ago1734918659IN
ENS Nameharvest.harv.eth
0.005 ETH0.025325294.57626798
Batch Sale214619852024-12-23 1:43:359 hrs ago1734918215IN
ENS Nameharvest.harv.eth
0.005 ETH0.001343855.45965656
Batch Sale214613432024-12-22 23:33:5911 hrs ago1734910439IN
ENS Nameharvest.harv.eth
0.005 ETH0.000824144.64734186
Batch Sale214612352024-12-22 23:12:1111 hrs ago1734909131IN
ENS Nameharvest.harv.eth
0.005 ETH0.005986665.46939046
Batch Sale214607682024-12-22 21:38:1113 hrs ago1734903491IN
ENS Nameharvest.harv.eth
0.005 ETH0.002389766.80604185
Batch Sale214604722024-12-22 20:38:1114 hrs ago1734899891IN
ENS Nameharvest.harv.eth
0.005 ETH0.00249587.05013584
Batch Sale214604572024-12-22 20:35:1114 hrs ago1734899711IN
ENS Nameharvest.harv.eth
0.005 ETH0.002141398.00595371
Batch Sale214604492024-12-22 20:33:3514 hrs ago1734899615IN
ENS Nameharvest.harv.eth
0.005 ETH0.001152527.75336637
Batch Sale214604392024-12-22 20:31:3514 hrs ago1734899495IN
ENS Nameharvest.harv.eth
0.005 ETH0.001587847.65280738
Batch Sale214604212024-12-22 20:27:5914 hrs ago1734899279IN
ENS Nameharvest.harv.eth
0.005 ETH0.001551687.95258341
Batch Sale214603422024-12-22 20:12:1114 hrs ago1734898331IN
ENS Nameharvest.harv.eth
0.005 ETH0.001989469.41041806
Batch Sale214602542024-12-22 19:54:3515 hrs ago1734897275IN
ENS Nameharvest.harv.eth
0.005 ETH0.001671227.37608909
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
214641412024-12-23 8:58:232 hrs ago1734944303
ENS Nameharvest.harv.eth
0.00499999 ETH
214641412024-12-23 8:58:232 hrs ago1734944303
ENS Nameharvest.harv.eth
0 ETH
214637632024-12-23 7:41:473 hrs ago1734939707
ENS Nameharvest.harv.eth
0.00499999 ETH
214637632024-12-23 7:41:473 hrs ago1734939707
ENS Nameharvest.harv.eth
0 ETH
214635882024-12-23 7:06:114 hrs ago1734937571
ENS Nameharvest.harv.eth
0.00499999 ETH
214635882024-12-23 7:06:114 hrs ago1734937571
ENS Nameharvest.harv.eth
0 ETH
214632432024-12-23 5:56:595 hrs ago1734933419
ENS Nameharvest.harv.eth
0.00499999 ETH
214632432024-12-23 5:56:595 hrs ago1734933419
ENS Nameharvest.harv.eth
0 ETH
214631692024-12-23 5:42:115 hrs ago1734932531
ENS Nameharvest.harv.eth
0.00499997 ETH
214631692024-12-23 5:42:115 hrs ago1734932531
ENS Nameharvest.harv.eth
0.00000003 ETH
214627492024-12-23 4:17:356 hrs ago1734927455
ENS Nameharvest.harv.eth
0.00499999 ETH
214627492024-12-23 4:17:356 hrs ago1734927455
ENS Nameharvest.harv.eth
0 ETH
214627112024-12-23 4:09:596 hrs ago1734926999
ENS Nameharvest.harv.eth
0.00499999 ETH
214627112024-12-23 4:09:596 hrs ago1734926999
ENS Nameharvest.harv.eth
0 ETH
214626342024-12-23 3:54:357 hrs ago1734926075
ENS Nameharvest.harv.eth
0.00499998 ETH
214626342024-12-23 3:54:357 hrs ago1734926075
ENS Nameharvest.harv.eth
0.00000001 ETH
214621712024-12-23 2:20:598 hrs ago1734920459
ENS Nameharvest.harv.eth
0.00499997 ETH
214621712024-12-23 2:20:598 hrs ago1734920459
ENS Nameharvest.harv.eth
0.00000002 ETH
214621622024-12-23 2:19:118 hrs ago1734920351
ENS Nameharvest.harv.eth
0.00499998 ETH
214621622024-12-23 2:19:118 hrs ago1734920351
ENS Nameharvest.harv.eth
0.00000002 ETH
214620912024-12-23 2:04:599 hrs ago1734919499
ENS Nameharvest.harv.eth
0.00499999 ETH
214620912024-12-23 2:04:599 hrs ago1734919499
ENS Nameharvest.harv.eth
0 ETH
214620542024-12-23 1:57:359 hrs ago1734919055
ENS Nameharvest.harv.eth
0.00499998 ETH
214620542024-12-23 1:57:359 hrs ago1734919055
ENS Nameharvest.harv.eth
0.00000001 ETH
214620382024-12-23 1:54:239 hrs ago1734918863
ENS Nameharvest.harv.eth
0.00499997 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Harvest

Compiler Version
v0.8.27+commit.40a35a09

Optimization Enabled:
Yes with 100000 runs

Other Settings:
cancun EvmVersion
File 1 of 10 : Harvest.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.27;

//                            _.-^-._    .--.
//                         .-'   _   '-. |__|
//                        /     |_|     \|  |
//                       /               \  |
//                      /|     _____     |\ |
//                       |    |==|==|    |  |
//   |---|---|---|---|---|    |--|--|    |  |
//   |---|---|---|---|---|    |==|==|    |  |
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//  ____________  Harvest.art v4 _____________

import "./IHarvest.sol";
import "solady/auth/Ownable.sol";
import "solady/utils/ReentrancyGuard.sol";

contract Harvest is IHarvest, Ownable, ReentrancyGuard {
    IBidTicket public bidTicket;
    address public theBarn;
    address public theFarmer;
    uint256 public salePrice = 1 gwei;
    uint256 public serviceFee = 0.001 ether;
    uint256 public maxTokensPerTx = 500;
    uint256 public bidTicketTokenId = 1;
    uint256 public bidTicketMultiplier = 1;

    constructor(
        address owner_,
        address theBarn_,
        address theFarmer_,
        address bidTicket_
    ) {
        _initializeOwner(owner_);
        theBarn = theBarn_;
        theFarmer = theFarmer_;
        bidTicket = IBidTicket(bidTicket_);
    }

    /**
     * batchSale - Sell tokens from one or more contracts in a single transaction
     *
     * @param types The types of tokens to transfer.
     * @param contracts The addresses of the token contracts.
     * @param tokenIds The IDs of the tokens to transfer.
     * @param counts The counts of the tokens to transfer.
     *
     * Protip: for repeated contracts, use address(0) to save a little gas.
     */

    function batchSale(
        TokenType[] calldata types,
        address[] calldata contracts,
        uint256[] calldata tokenIds,
        uint256[] calldata counts,
        bool skipBidTicket
    ) external payable nonReentrant {
        uint256 totalTokens = types.length;
        uint256 totalSalePrice = salePrice * totalTokens;
        address currentContract;
        TokenType currentType;

        require(totalTokens > 0 
            && totalTokens == contracts.length 
            && totalTokens == tokenIds.length 
            && totalTokens == counts.length, 
            InvalidParamsLength());
        require(contracts[0] != address(0), InvalidTokenContract());
        require(totalTokens <= maxTokensPerTx, MaxTokensPerTxReached());
        require(msg.value >= serviceFee, InvalidServiceFee());

        emit Sale(msg.sender, totalSalePrice);

        if (!skipBidTicket) {
            bidTicket.mint(msg.sender, bidTicketTokenId, totalTokens * bidTicketMultiplier);
        }

        for (uint256 i; i < totalTokens; ++i) {
            currentType = types[i];

            if (contracts[i] != address(0)) {
                currentContract = contracts[i];
            }

            if (currentType == TokenType.ERC20) {    
                IERC20(currentContract).transferFrom(msg.sender, theBarn, counts[i]);
            } else if (currentType == TokenType.ERC721) {
                IERC721(currentContract).transferFrom(msg.sender, theBarn, tokenIds[i]);
            } else if (currentType == TokenType.ERC1155) {
                IERC1155(currentContract).safeTransferFrom(msg.sender, theBarn, tokenIds[i], counts[i], "");
            } else {
                revert InvalidTokenType();
            }
        }

        (bool paymentSuccess,) = payable(msg.sender).call{value: totalSalePrice}("");
        require(paymentSuccess, TransferFailed());

        if (msg.value > totalSalePrice) {
            (bool farmerSuccess,) = payable(theFarmer).call{value: msg.value - totalSalePrice}("");
            require(farmerSuccess, TransferFailed());
        }
    }

    /**
     * Owner-only functions
     */

    function setBarn(address theBarn_) external onlyOwner {
        theBarn = theBarn_;
    }

    function setFarmer(address theFarmer_) external onlyOwner {
        theFarmer = theFarmer_;
    }

    function setBidTicketAddress(address bidTicket_) external onlyOwner {
        bidTicket = IBidTicket(bidTicket_);
    }

    function setBidTicketMultiplier(uint256 bidTicketMultiplier_) external onlyOwner {
        bidTicketMultiplier = bidTicketMultiplier_;
    }

    function setBidTicketTokenId(uint256 bidTicketTokenId_) external onlyOwner {
        bidTicketTokenId = bidTicketTokenId_;
    }

    function setMaxTokensPerTx(uint256 maxTokensPerTx_) external onlyOwner {
        maxTokensPerTx = maxTokensPerTx_;
    }

    function setSalePrice(uint256 salePrice_) external onlyOwner {
        salePrice = salePrice_;
    }

    function setServiceFee(uint256 serviceFee_) external onlyOwner {
        serviceFee = serviceFee_;
    }

    /**
     * Emergency withdrawal functions just in case apes don't read
     */

    function withdrawBalance() external onlyOwner {
        (bool success,) = payable(msg.sender).call{value: address(this).balance}("");
        require(success, TransferFailed());
    }

    function withdrawERC20(address tokenAddress, uint256 amount) external onlyOwner {
        IERC20(tokenAddress).transfer(msg.sender, amount);
    }

    function withdrawERC721(address tokenAddress, uint256 tokenId, address to) external onlyOwner {
        IERC721(tokenAddress).safeTransferFrom(address(this), to, tokenId);
    }
    
    receive() external payable {}

    fallback() external payable {}
}

File 2 of 10 : IHarvest.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.27;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "./IBidTicket.sol";

enum TokenType {
    ERC20,
    ERC721,
    ERC1155
}

interface IHarvest {
    event Sale(address indexed user, uint256 indexed salePrice);

    error DuplicateToken();
    error InsufficientBalance();
    error InvalidParamsLength();
    error InvalidServiceFee();
    error InvalidTokenContract();
    error InvalidTokenContractLength();
    error InvalidTokenType();
    error MaxTokensPerTxReached();
    error TransferFailed();
    error SalePriceTooHigh();
    error ServiceFeeTooLow();

    function batchSale(
        TokenType[] calldata types,
        address[] calldata contracts,
        uint256[] calldata tokenIds,
        uint256[] calldata counts,
        bool skipBidTicket
    ) external payable;

    function bidTicket() external view returns (IBidTicket);
    function theBarn() external view returns (address);
    function theFarmer() external view returns (address);
    function salePrice() external view returns (uint256);
    function serviceFee() external view returns (uint256);
    function maxTokensPerTx() external view returns (uint256);
    function bidTicketTokenId() external view returns (uint256);
    function bidTicketMultiplier() external view returns (uint256);

    function setBarn(address _theBarn) external;
    function setBidTicketAddress(address bidTicket_) external;
    function setBidTicketMultiplier(uint256 multiplier) external;
    function setBidTicketTokenId(uint256 bidTicketTokenId_) external;
    function setFarmer(address _theFarmer) external;
    function setMaxTokensPerTx(uint256 _maxTokensPerTx) external;
    function setSalePrice(uint256 _price) external;
    function setServiceFee(uint256 _serviceFee) external;

    function withdrawBalance() external;
    function withdrawERC20(address tokenAddress, uint256 amount) external;
}

File 3 of 10 : Ownable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Simple single owner authorization mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
///
/// @dev Note:
/// This implementation does NOT auto-initialize the owner to `msg.sender`.
/// You MUST call the `_initializeOwner` in the constructor / initializer.
///
/// While the ownable portion follows
/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
/// the nomenclature for the 2-step ownership handover may be unique to this codebase.
abstract contract Ownable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The caller is not authorized to call the function.
    error Unauthorized();

    /// @dev The `newOwner` cannot be the zero address.
    error NewOwnerIsZeroAddress();

    /// @dev The `pendingOwner` does not have a valid handover request.
    error NoHandoverRequest();

    /// @dev Cannot double-initialize.
    error AlreadyInitialized();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The ownership is transferred from `oldOwner` to `newOwner`.
    /// This event is intentionally kept the same as OpenZeppelin's Ownable to be
    /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),
    /// despite it not being as lightweight as a single argument event.
    event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);

    /// @dev An ownership handover to `pendingOwner` has been requested.
    event OwnershipHandoverRequested(address indexed pendingOwner);

    /// @dev The ownership handover to `pendingOwner` has been canceled.
    event OwnershipHandoverCanceled(address indexed pendingOwner);

    /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
    uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
        0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;

    /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
        0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;

    /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
        0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The owner slot is given by:
    /// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`.
    /// It is intentionally chosen to be a high value
    /// to avoid collision with lower slots.
    /// The choice of manual storage layout is to enable compatibility
    /// with both regular and upgradeable contracts.
    bytes32 internal constant _OWNER_SLOT =
        0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927;

    /// The ownership handover slot of `newOwner` is given by:
    /// ```
    ///     mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))
    ///     let handoverSlot := keccak256(0x00, 0x20)
    /// ```
    /// It stores the expiry timestamp of the two-step ownership handover.
    uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     INTERNAL FUNCTIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Override to return true to make `_initializeOwner` prevent double-initialization.
    function _guardInitializeOwner() internal pure virtual returns (bool guard) {}

    /// @dev Initializes the owner directly without authorization guard.
    /// This function must be called upon initialization,
    /// regardless of whether the contract is upgradeable or not.
    /// This is to enable generalization to both regular and upgradeable contracts,
    /// and to save gas in case the initial owner is not the caller.
    /// For performance reasons, this function will not check if there
    /// is an existing owner.
    function _initializeOwner(address newOwner) internal virtual {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                if sload(ownerSlot) {
                    mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`.
                    revert(0x1c, 0x04)
                }
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(_OWNER_SLOT, newOwner)
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        }
    }

    /// @dev Sets the owner directly without authorization guard.
    function _setOwner(address newOwner) internal virtual {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
                // Store the new value.
                sstore(ownerSlot, newOwner)
            }
        }
    }

    /// @dev Throws if the sender is not the owner.
    function _checkOwner() internal view virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // If the caller is not the stored owner, revert.
            if iszero(eq(caller(), sload(_OWNER_SLOT))) {
                mstore(0x00, 0x82b42900) // `Unauthorized()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Returns how long a two-step ownership handover is valid for in seconds.
    /// Override to return a different value if needed.
    /// Made internal to conserve bytecode. Wrap it in a public function if needed.
    function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
        return 48 * 3600;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  PUBLIC UPDATE FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Allows the owner to transfer the ownership to `newOwner`.
    function transferOwnership(address newOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(shl(96, newOwner)) {
                mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
                revert(0x1c, 0x04)
            }
        }
        _setOwner(newOwner);
    }

    /// @dev Allows the owner to renounce their ownership.
    function renounceOwnership() public payable virtual onlyOwner {
        _setOwner(address(0));
    }

    /// @dev Request a two-step ownership handover to the caller.
    /// The request will automatically expire in 48 hours (172800 seconds) by default.
    function requestOwnershipHandover() public payable virtual {
        unchecked {
            uint256 expires = block.timestamp + _ownershipHandoverValidFor();
            /// @solidity memory-safe-assembly
            assembly {
                // Compute and set the handover slot to `expires`.
                mstore(0x0c, _HANDOVER_SLOT_SEED)
                mstore(0x00, caller())
                sstore(keccak256(0x0c, 0x20), expires)
                // Emit the {OwnershipHandoverRequested} event.
                log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
            }
        }
    }

    /// @dev Cancels the two-step ownership handover to the caller, if any.
    function cancelOwnershipHandover() public payable virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x20), 0)
            // Emit the {OwnershipHandoverCanceled} event.
            log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
        }
    }

    /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`.
    /// Reverts if there is no existing ownership handover requested by `pendingOwner`.
    function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            let handoverSlot := keccak256(0x0c, 0x20)
            // If the handover does not exist, or has expired.
            if gt(timestamp(), sload(handoverSlot)) {
                mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.
                revert(0x1c, 0x04)
            }
            // Set the handover slot to 0.
            sstore(handoverSlot, 0)
        }
        _setOwner(pendingOwner);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   PUBLIC READ FUNCTIONS                    */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the owner of the contract.
    function owner() public view virtual returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(_OWNER_SLOT)
        }
    }

    /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
    function ownershipHandoverExpiresAt(address pendingOwner)
        public
        view
        virtual
        returns (uint256 result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the handover slot.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            // Load the handover slot.
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         MODIFIERS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Marks a function as only callable by the owner.
    modifier onlyOwner() virtual {
        _checkOwner();
        _;
    }
}

File 4 of 10 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Reentrancy guard mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ReentrancyGuard.sol)
abstract contract ReentrancyGuard {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Unauthorized reentrant call.
    error Reentrancy();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Equivalent to: `uint72(bytes9(keccak256("_REENTRANCY_GUARD_SLOT")))`.
    /// 9 bytes is large enough to avoid collisions with lower slots,
    /// but not too large to result in excessive bytecode bloat.
    uint256 private constant _REENTRANCY_GUARD_SLOT = 0x929eee149b4bd21268;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      REENTRANCY GUARD                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Guards a function from reentrancy.
    modifier nonReentrant() virtual {
        /// @solidity memory-safe-assembly
        assembly {
            if eq(sload(_REENTRANCY_GUARD_SLOT), address()) {
                mstore(0x00, 0xab143c06) // `Reentrancy()`.
                revert(0x1c, 0x04)
            }
            sstore(_REENTRANCY_GUARD_SLOT, address())
        }
        _;
        /// @solidity memory-safe-assembly
        assembly {
            sstore(_REENTRANCY_GUARD_SLOT, codesize())
        }
    }

    /// @dev Guards a view function from read-only reentrancy.
    modifier nonReadReentrant() virtual {
        /// @solidity memory-safe-assembly
        assembly {
            if eq(sload(_REENTRANCY_GUARD_SLOT), address()) {
                mstore(0x00, 0xab143c06) // `Reentrancy()`.
                revert(0x1c, 0x04)
            }
        }
        _;
    }
}

File 5 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

File 6 of 10 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.20;

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);
}

File 7 of 10 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.20;

import {IERC165} from "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC-1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[ERC].
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the value of tokens of token type `id` owned by `account`.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(
        address[] calldata accounts,
        uint256[] calldata ids
    ) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the zero address.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`.
     *
     * WARNING: This function can potentially allow a reentrancy attack when transferring tokens
     * to an untrusted contract, when invoking {onERC1155Received} on the receiver.
     * Ensure to follow the checks-effects-interactions pattern and consider employing
     * reentrancy guards when interacting with untrusted contracts.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `value` amount.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * WARNING: This function can potentially allow a reentrancy attack when transferring tokens
     * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver.
     * Ensure to follow the checks-effects-interactions pattern and consider employing
     * reentrancy guards when interacting with untrusted contracts.
     *
     * Emits either a {TransferSingle} or a {TransferBatch} event, depending on the length of the array arguments.
     *
     * Requirements:
     *
     * - `ids` and `values` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external;
}

File 8 of 10 : IBidTicket.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.27;

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;
}

File 9 of 10 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @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);
}

File 10 of 10 : IERC1155P.sol
// SPDX-License-Identifier: MIT
// ERC721P Contracts v1.1

pragma solidity ^0.8.20;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155P {

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Arrays cannot be different lengths.
     */
    error ArrayLengthMismatch();

    /**
     * Cannot burn from the zero address.
     */
    error BurnFromZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The quantity of tokens being burned is greater than account balance.
     */
    error BurnExceedsBalance();

    /**
     * The quantity of tokens being transferred is greater than account balance.
     */
    error TransferExceedsBalance();

    /**
     * The resulting token balance exceeds the maximum storable by ERC1155P
     */
    error ExceedsMaximumBalance();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC1155Receiver interface.
     */
    error TransferToNonERC1155ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * Exceeds max token ID
     */
    error ExceedsMaximumTokenId();
    
    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(
        address[] calldata accounts,
        uint256[] calldata ids
    ) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "ERC1155P/=lib/ERC1155P/",
    "solady/=lib/solady/src/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 100000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"theBarn_","type":"address"},{"internalType":"address","name":"theFarmer_","type":"address"},{"internalType":"address","name":"bidTicket_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"DuplicateToken","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidParamsLength","type":"error"},{"inputs":[],"name":"InvalidServiceFee","type":"error"},{"inputs":[],"name":"InvalidTokenContract","type":"error"},{"inputs":[],"name":"InvalidTokenContractLength","type":"error"},{"inputs":[],"name":"InvalidTokenType","type":"error"},{"inputs":[],"name":"MaxTokensPerTxReached","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"Reentrancy","type":"error"},{"inputs":[],"name":"SalePriceTooHigh","type":"error"},{"inputs":[],"name":"ServiceFeeTooLow","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"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":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"Sale","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"enum TokenType[]","name":"types","type":"uint8[]"},{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"counts","type":"uint256[]"},{"internalType":"bool","name":"skipBidTicket","type":"bool"}],"name":"batchSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"bidTicket","outputs":[{"internalType":"contract IBidTicket","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bidTicketMultiplier","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":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"maxTokensPerTx","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serviceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"theBarn_","type":"address"}],"name":"setBarn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bidTicket_","type":"address"}],"name":"setBidTicketAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bidTicketMultiplier_","type":"uint256"}],"name":"setBidTicketMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bidTicketTokenId_","type":"uint256"}],"name":"setBidTicketTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"theFarmer_","type":"address"}],"name":"setFarmer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTokensPerTx_","type":"uint256"}],"name":"setMaxTokensPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"salePrice_","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"serviceFee_","type":"uint256"}],"name":"setServiceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"theBarn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"theFarmer","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":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60803461011457601f61168b38819003918201601f19168301916001600160401b0383118484101761011857808492608094604052833981010312610114576100478161012c565b906100546020820161012c565b61006c60606100656040850161012c565b930161012c565b633b9aca0060035566038d7ea4c680006004556101f4600555600160068190556007556001600160a01b03909316638b78c6d8198190555f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600180546001600160a01b03199081166001600160a01b0393841617909155600280548216938316939093179092555f8054909216921691909117905560405161154a90816101418239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101145756fe6080806040526004361015610011575b005b5f905f3560e01c9081630b45c68b1461123a575080631919fed7146111fb57806325692962146111945780633b342a8514611112578063481eb12b146110d35780634da2bda11461108257806354d1f13d1461102057806358da22dc14610fe15780635cdf76f814610fa25780635e307a4814610f675780635fd8c71014610ef1578063715018a614610e545780637b9f76b514610d4b57806386898b0f14610d0f5780638abdf5aa14610cd35780638da5cb5b14610c6257806394bc8be61461054657806395723b991461050a578063a1db97821461042f578063b18786f1146103dd578063b9bed05e1461039c578063e2ed781c1461031a578063e5f96b741461029a578063f04e283e1461022e578063f2fde38b146101d1578063f51f96dd146101955763fee81cf40361000f57346101925760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019257610179611287565b9063389a75e1600c5252602080600c2054604051908152f35b80fd5b503461019257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610192576020600354604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019257610204611287565b61020c61145c565b8060601b156102215761021e90611493565b80f35b637448fbae82526004601cfd5b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019257610261611287565b61026961145c565b63389a75e1600c528082526020600c208054421161028d57908261021e9255611493565b636f5e881883526004601cfd5b50346101925760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101925773ffffffffffffffffffffffffffffffffffffffff6102e7611287565b6102ef61145c565b167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617815580f35b50346101925760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101925773ffffffffffffffffffffffffffffffffffffffff610367611287565b61036f61145c565b167fffffffffffffffffffffffff0000000000000000000000000000000000000000600254161760025580f35b50346101925760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610192576103d461145c565b60043560055580f35b503461019257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019257602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346101925760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101925780602073ffffffffffffffffffffffffffffffffffffffff6044610481611287565b61048961145c565b60405194859384927fa9059cbb0000000000000000000000000000000000000000000000000000000084523360048501526024356024850152165af180156104ff576104d3575080f35b6104f49060203d6020116104f8575b6104ec81836112db565b810190611444565b5080f35b503d6104e2565b6040513d84823e3d90fd5b503461019257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610192576020600654604051908152f35b5060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101925760043567ffffffffffffffff8111610c5e576105919036906004016112aa565b9060243567ffffffffffffffff811161099d576105b29036906004016112aa565b9060443567ffffffffffffffff8111610b61576105d39036906004016112aa565b909160643567ffffffffffffffff8111610a72576105f59036906004016112aa565b909360843593841594851503610c5a573068929eee149b4bd212685414610c4d573068929eee149b4bd212685561062e896003546113a6565b988a9581151580610c44575b80610c3b575b80610c32575b15610c0a578815610bdd5773ffffffffffffffffffffffffffffffffffffffff61066f87611423565b1615610bb5576005548211610b8d576004543410610b6557908b92918b337fc6851889326b4ff916523ef06f539b4cf0b81d78fc6e0f97c30e6223d18319908680a3610ab8575b825b8181106107ac57838c8180808084335af16106d1611349565b5015610784578034116106ef575b503868929eee149b4bd212685580f35b73ffffffffffffffffffffffffffffffffffffffff6002541690340390348211610757578280809381935af1610723611349565b501561072f57816106df565b807f90b8ec180000000000000000000000000000000000000000000000000000000060049252fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6004827f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b6107b781838d6113e6565b356003811015610ab45773ffffffffffffffffffffffffffffffffffffffff6107e96107e4848e8c6113e6565b611423565b16610a9e575b806108c757508060208a8a610821610882958b73ffffffffffffffffffffffffffffffffffffffff60015416946113e6565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff93841660248201529035604482015294859283918a919083906064820190565b0393165af19182156108bc5760019261089e575b505b016106b8565b6108b59060203d81116104f8576104ec81836112db565b505f610896565b6040513d87823e3d90fd5b600181036109a5575073ffffffffffffffffffffffffffffffffffffffff881673ffffffffffffffffffffffffffffffffffffffff6001541661090b8386896113e6565b35823b156109a1576040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff92909216602483015260448201529085908290606490829084905af19081156108bc578591610988575b5050600190610898565b81610992916112db565b61099d57835f61097e565b8380fd5b8680fd5b9293509091600203610a7657908b929173ffffffffffffffffffffffffffffffffffffffff881673ffffffffffffffffffffffffffffffffffffffff600154168a6109fd848a6109f6828a8d6113e6565b35936113e6565b3592803b15610a725787928360c49260405196879586947ff242432a00000000000000000000000000000000000000000000000000000000865233600487015260248601526044850152606484015260a060848401528160a48401525af19081156108bc578591610988575050600190610898565b8780fd5b60048c7fa1e9dd9d000000000000000000000000000000000000000000000000000000008152fd5b9750610aae6107e4828c8a6113e6565b976107ef565b8480fd5b73ffffffffffffffffffffffffffffffffffffffff835416600654610adf600754846113a6565b823b15610b6157606486928360405195869485937f156e29f6000000000000000000000000000000000000000000000000000000008552336004860152602485015260448401525af1908115610b56578491610b3d575b50506106b6565b81610b47916112db565b610b5257825f610b36565b8280fd5b6040513d86823e3d90fd5b8580fd5b60048c7fab44c461000000000000000000000000000000000000000000000000000000008152fd5b60048c7fbb8eb9c4000000000000000000000000000000000000000000000000000000008152fd5b60048c7f29bdfb34000000000000000000000000000000000000000000000000000000008152fd5b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b60048c7ff950c6c4000000000000000000000000000000000000000000000000000000008152fd5b50848214610646565b50828214610640565b5088821461063a565b63ab143c068a526004601cfd5b8980fd5b5080fd5b503461019257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101925760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275473ffffffffffffffffffffffffffffffffffffffff60405191168152f35b503461019257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610192576020600454604051908152f35b503461019257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610192576020600754604051908152f35b5034610e505760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e5057610d83611287565b6044359073ffffffffffffffffffffffffffffffffffffffff82168203610e505773ffffffffffffffffffffffffffffffffffffffff90610dc261145c565b16803b15610e50576040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff929092166024808401919091523560448301525f908290606490829084905af18015610e4557610e39575080f35b61000f91505f906112db565b6040513d5f823e3d90fd5b5f80fd5b5f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e5057610e8561145c565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392755005b34610e50575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e5057610f2761145c565b5f80808047335af1610f37611349565b5015610f3f57005b7f90b8ec18000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610e50575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e50576020600554604051908152f35b34610e505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e5057610fd961145c565b600480359055005b34610e505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505761101861145c565b600435600755005b5f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505763389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f80a2005b34610e50575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e5057602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b34610e505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505761110a61145c565b600435600655005b34610e505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505773ffffffffffffffffffffffffffffffffffffffff61115e611287565b61116661145c565b167fffffffffffffffffffffffff000000000000000000000000000000000000000060015416176001555f80f35b5f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505763389a75e1600c52335f526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f80a2005b34610e505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505761123261145c565b600435600355005b34610e50575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505760209073ffffffffffffffffffffffffffffffffffffffff5f54168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610e5057565b9181601f84011215610e505782359167ffffffffffffffff8311610e50576020808501948460051b010111610e5057565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761131c57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b3d156113a1573d9067ffffffffffffffff821161131c576040519161139660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846112db565b82523d5f602084013e565b606090565b818102929181159184041417156113b957565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b91908110156113f65760051b0190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b3573ffffffffffffffffffffffffffffffffffffffff81168103610e505790565b90816020910312610e5057518015158103610e505790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330361148657565b6382b429005f526004601cfd5b73ffffffffffffffffffffffffffffffffffffffff16807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275556fea2646970667358221220f599e037482efa8e05f6b1069423dc8d45178f1594c1f26d5f299ca0c4ebfac764736f6c634300081b003300000000000000000000000069b1a9f37ffee30a992388a46883c6880527b818000000000000000000000000996e1d4ce3e1e558889832832004b2466153adbe000000000000000000000000d3f9340cbc7c1109fc15aa8687bfb7bec06eea6c00000000000000000000000062613aa9594d0116b5ca23acd37dddac90c67e5c

Deployed Bytecode

0x6080806040526004361015610011575b005b5f905f3560e01c9081630b45c68b1461123a575080631919fed7146111fb57806325692962146111945780633b342a8514611112578063481eb12b146110d35780634da2bda11461108257806354d1f13d1461102057806358da22dc14610fe15780635cdf76f814610fa25780635e307a4814610f675780635fd8c71014610ef1578063715018a614610e545780637b9f76b514610d4b57806386898b0f14610d0f5780638abdf5aa14610cd35780638da5cb5b14610c6257806394bc8be61461054657806395723b991461050a578063a1db97821461042f578063b18786f1146103dd578063b9bed05e1461039c578063e2ed781c1461031a578063e5f96b741461029a578063f04e283e1461022e578063f2fde38b146101d1578063f51f96dd146101955763fee81cf40361000f57346101925760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019257610179611287565b9063389a75e1600c5252602080600c2054604051908152f35b80fd5b503461019257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610192576020600354604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019257610204611287565b61020c61145c565b8060601b156102215761021e90611493565b80f35b637448fbae82526004601cfd5b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019257610261611287565b61026961145c565b63389a75e1600c528082526020600c208054421161028d57908261021e9255611493565b636f5e881883526004601cfd5b50346101925760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101925773ffffffffffffffffffffffffffffffffffffffff6102e7611287565b6102ef61145c565b167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617815580f35b50346101925760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101925773ffffffffffffffffffffffffffffffffffffffff610367611287565b61036f61145c565b167fffffffffffffffffffffffff0000000000000000000000000000000000000000600254161760025580f35b50346101925760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610192576103d461145c565b60043560055580f35b503461019257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019257602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346101925760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101925780602073ffffffffffffffffffffffffffffffffffffffff6044610481611287565b61048961145c565b60405194859384927fa9059cbb0000000000000000000000000000000000000000000000000000000084523360048501526024356024850152165af180156104ff576104d3575080f35b6104f49060203d6020116104f8575b6104ec81836112db565b810190611444565b5080f35b503d6104e2565b6040513d84823e3d90fd5b503461019257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610192576020600654604051908152f35b5060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101925760043567ffffffffffffffff8111610c5e576105919036906004016112aa565b9060243567ffffffffffffffff811161099d576105b29036906004016112aa565b9060443567ffffffffffffffff8111610b61576105d39036906004016112aa565b909160643567ffffffffffffffff8111610a72576105f59036906004016112aa565b909360843593841594851503610c5a573068929eee149b4bd212685414610c4d573068929eee149b4bd212685561062e896003546113a6565b988a9581151580610c44575b80610c3b575b80610c32575b15610c0a578815610bdd5773ffffffffffffffffffffffffffffffffffffffff61066f87611423565b1615610bb5576005548211610b8d576004543410610b6557908b92918b337fc6851889326b4ff916523ef06f539b4cf0b81d78fc6e0f97c30e6223d18319908680a3610ab8575b825b8181106107ac57838c8180808084335af16106d1611349565b5015610784578034116106ef575b503868929eee149b4bd212685580f35b73ffffffffffffffffffffffffffffffffffffffff6002541690340390348211610757578280809381935af1610723611349565b501561072f57816106df565b807f90b8ec180000000000000000000000000000000000000000000000000000000060049252fd5b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6004827f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b6107b781838d6113e6565b356003811015610ab45773ffffffffffffffffffffffffffffffffffffffff6107e96107e4848e8c6113e6565b611423565b16610a9e575b806108c757508060208a8a610821610882958b73ffffffffffffffffffffffffffffffffffffffff60015416946113e6565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff93841660248201529035604482015294859283918a919083906064820190565b0393165af19182156108bc5760019261089e575b505b016106b8565b6108b59060203d81116104f8576104ec81836112db565b505f610896565b6040513d87823e3d90fd5b600181036109a5575073ffffffffffffffffffffffffffffffffffffffff881673ffffffffffffffffffffffffffffffffffffffff6001541661090b8386896113e6565b35823b156109a1576040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff92909216602483015260448201529085908290606490829084905af19081156108bc578591610988575b5050600190610898565b81610992916112db565b61099d57835f61097e565b8380fd5b8680fd5b9293509091600203610a7657908b929173ffffffffffffffffffffffffffffffffffffffff881673ffffffffffffffffffffffffffffffffffffffff600154168a6109fd848a6109f6828a8d6113e6565b35936113e6565b3592803b15610a725787928360c49260405196879586947ff242432a00000000000000000000000000000000000000000000000000000000865233600487015260248601526044850152606484015260a060848401528160a48401525af19081156108bc578591610988575050600190610898565b8780fd5b60048c7fa1e9dd9d000000000000000000000000000000000000000000000000000000008152fd5b9750610aae6107e4828c8a6113e6565b976107ef565b8480fd5b73ffffffffffffffffffffffffffffffffffffffff835416600654610adf600754846113a6565b823b15610b6157606486928360405195869485937f156e29f6000000000000000000000000000000000000000000000000000000008552336004860152602485015260448401525af1908115610b56578491610b3d575b50506106b6565b81610b47916112db565b610b5257825f610b36565b8280fd5b6040513d86823e3d90fd5b8580fd5b60048c7fab44c461000000000000000000000000000000000000000000000000000000008152fd5b60048c7fbb8eb9c4000000000000000000000000000000000000000000000000000000008152fd5b60048c7f29bdfb34000000000000000000000000000000000000000000000000000000008152fd5b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b60048c7ff950c6c4000000000000000000000000000000000000000000000000000000008152fd5b50848214610646565b50828214610640565b5088821461063a565b63ab143c068a526004601cfd5b8980fd5b5080fd5b503461019257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101925760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275473ffffffffffffffffffffffffffffffffffffffff60405191168152f35b503461019257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610192576020600454604051908152f35b503461019257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610192576020600754604051908152f35b5034610e505760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e5057610d83611287565b6044359073ffffffffffffffffffffffffffffffffffffffff82168203610e505773ffffffffffffffffffffffffffffffffffffffff90610dc261145c565b16803b15610e50576040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff929092166024808401919091523560448301525f908290606490829084905af18015610e4557610e39575080f35b61000f91505f906112db565b6040513d5f823e3d90fd5b5f80fd5b5f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e5057610e8561145c565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392755005b34610e50575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e5057610f2761145c565b5f80808047335af1610f37611349565b5015610f3f57005b7f90b8ec18000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610e50575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e50576020600554604051908152f35b34610e505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e5057610fd961145c565b600480359055005b34610e505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505761101861145c565b600435600755005b5f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505763389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f80a2005b34610e50575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e5057602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b34610e505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505761110a61145c565b600435600655005b34610e505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505773ffffffffffffffffffffffffffffffffffffffff61115e611287565b61116661145c565b167fffffffffffffffffffffffff000000000000000000000000000000000000000060015416176001555f80f35b5f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505763389a75e1600c52335f526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f80a2005b34610e505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505761123261145c565b600435600355005b34610e50575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e505760209073ffffffffffffffffffffffffffffffffffffffff5f54168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610e5057565b9181601f84011215610e505782359167ffffffffffffffff8311610e50576020808501948460051b010111610e5057565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761131c57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b3d156113a1573d9067ffffffffffffffff821161131c576040519161139660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601846112db565b82523d5f602084013e565b606090565b818102929181159184041417156113b957565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b91908110156113f65760051b0190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b3573ffffffffffffffffffffffffffffffffffffffff81168103610e505790565b90816020910312610e5057518015158103610e505790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330361148657565b6382b429005f526004601cfd5b73ffffffffffffffffffffffffffffffffffffffff16807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739275556fea2646970667358221220f599e037482efa8e05f6b1069423dc8d45178f1594c1f26d5f299ca0c4ebfac764736f6c634300081b0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000069b1a9f37ffee30a992388a46883c6880527b818000000000000000000000000996e1d4ce3e1e558889832832004b2466153adbe000000000000000000000000d3f9340cbc7c1109fc15aa8687bfb7bec06eea6c00000000000000000000000062613aa9594d0116b5ca23acd37dddac90c67e5c

-----Decoded View---------------
Arg [0] : owner_ (address): 0x69B1A9f37fFEe30a992388A46883c6880527B818
Arg [1] : theBarn_ (address): 0x996e1d4ce3e1e558889832832004B2466153adbe
Arg [2] : theFarmer_ (address): 0xd3F9340Cbc7c1109fc15aa8687bFB7Bec06eeA6c
Arg [3] : bidTicket_ (address): 0x62613AA9594D0116b5CA23aCd37dDDAc90c67E5c

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000069b1a9f37ffee30a992388a46883c6880527b818
Arg [1] : 000000000000000000000000996e1d4ce3e1e558889832832004b2466153adbe
Arg [2] : 000000000000000000000000d3f9340cbc7c1109fc15aa8687bfb7bec06eea6c
Arg [3] : 00000000000000000000000062613aa9594d0116b5ca23acd37dddac90c67e5c


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.