ETH Price: $3,242.56 (+2.94%)
Gas: 2 Gwei

Contract

0x8C2f976b1f6F5f2867a8B560BdbF244C5e263Ca6
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buy With Financi...182089192023-09-24 23:25:35305 days ago1695597935IN
0x8C2f976b...C5e263Ca6
0.603 ETH0.006628047.11175168
Buy With Financi...180983672023-09-09 10:54:23321 days ago1694256863IN
0x8C2f976b...C5e263Ca6
1.5 ETH0.0093954411.1019472
Buy With Financi...179791032023-08-23 18:09:11337 days ago1692814151IN
0x8C2f976b...C5e263Ca6
0.0025125 ETH0.0491158556.0207519
Buy With Financi...179157012023-08-14 21:14:35346 days ago1692047675IN
0x8C2f976b...C5e263Ca6
0.0002 ETH0.0322843838.29224369
Buy With Financi...179151382023-08-14 19:20:23346 days ago1692040823IN
0x8C2f976b...C5e263Ca6
0.0025125 ETH0.023911426.75156565
Buy With Financi...179146642023-08-14 17:45:11346 days ago1692035111IN
0x8C2f976b...C5e263Ca6
0.0025125 ETH0.0030892837.47587028
Buy With Financi...179146642023-08-14 17:45:11346 days ago1692035111IN
0x8C2f976b...C5e263Ca6
0.0025125 ETH0.0333921937.47587028
Transfer Ownersh...178281842023-08-02 15:24:23358 days ago1690989863IN
0x8C2f976b...C5e263Ca6
0 ETH0.0013970148.75635666
0x60806040178281832023-08-02 15:24:11358 days ago1690989851IN
 Create: MarketplaceIntegration
0 ETH0.0418828147.94530441

Latest 7 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
182089192023-09-24 23:25:35305 days ago1695597935
0x8C2f976b...C5e263Ca6
0.603 ETH
180983672023-09-09 10:54:23321 days ago1694256863
0x8C2f976b...C5e263Ca6
1.5 ETH
179791032023-08-23 18:09:11337 days ago1692814151
0x8C2f976b...C5e263Ca6
0.0025125 ETH
179157012023-08-14 21:14:35346 days ago1692047675
0x8C2f976b...C5e263Ca6
0.0002 ETH
179151382023-08-14 19:20:23346 days ago1692040823
0x8C2f976b...C5e263Ca6
0.0025125 ETH
179146642023-08-14 17:45:11346 days ago1692035111
0x8C2f976b...C5e263Ca6
0.0025125 ETH
179146642023-08-14 17:45:11346 days ago1692035111
0x8C2f976b...C5e263Ca6
0.0025125 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MarketplaceIntegration

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 12 : MarketplaceIntegration.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

import "@openzeppelin-norm/contracts/access/Ownable.sol";
import "@openzeppelin-norm/contracts/security/Pausable.sol";
import "@openzeppelin-norm/contracts/utils/Address.sol";
import "../interfaces/sellerFinancing/ISellerFinancing.sol";
import "../interfaces/sanctions/SanctionsList.sol";

/// @title MarketplaceIntegration
/// @custom:version 1.0
/// @author zishansami102 (zishansami.eth)
/// @custom:contributor captnseagraves (captnseagraves.eth)

contract MarketplaceIntegration is Ownable, Pausable {
    using Address for address payable;

    /// @dev Internal constant address for the Chainalysis OFAC sanctions oracle
    address private constant SANCTIONS_CONTRACT = 0x40C57923924B5c5c5455c48D93317139ADDaC8fb;

    /// @notice The base value for fees in the protocol.
    uint256 private constant BASE_BPS = 10_000;

    /// @dev The status of sanctions checks
    bool internal _sanctionsPause;

    uint256 public marketplaceFeeBps;

    address payable public marketplaceFeeRecipient;

    address public sellerFinancingContractAddress;

    error ZeroAddress();

    error InsufficientMsgValue(uint256 given, uint256 expected);

    error SanctionedAddress(address account);

    constructor(
        address _sellerFinancingContractAddress,
        address _marketplaceFeeRecipient,
        uint256 _marketplaceFeeBps
    ) {
        _requireNonZeroAddress(_sellerFinancingContractAddress);
        _requireNonZeroAddress(_marketplaceFeeRecipient);

        sellerFinancingContractAddress = _sellerFinancingContractAddress;
        marketplaceFeeRecipient = payable(_marketplaceFeeRecipient);
        marketplaceFeeBps = _marketplaceFeeBps;
    }

    /// @param newSellerFinancingContractAddress New address for SellerFinancing contract
    function updateSellerFinancingContractAddress(
        address newSellerFinancingContractAddress
    ) external onlyOwner {
        _requireNonZeroAddress(newSellerFinancingContractAddress);
        sellerFinancingContractAddress = newSellerFinancingContractAddress;
    }

    /// @param newMarketplaceFeeRecipient New address for MarketplaceFeeRecipient
    function updateMarketplaceFeeRecipient(address newMarketplaceFeeRecipient) external onlyOwner {
        _requireNonZeroAddress(newMarketplaceFeeRecipient);
        marketplaceFeeRecipient = payable(newMarketplaceFeeRecipient);
    }

    /// @param newMarketplaceFeeBps New value for marketplaceFeeBps
    function updateMarketplaceFeeBps(uint256 newMarketplaceFeeBps) external onlyOwner {
        marketplaceFeeBps = newMarketplaceFeeBps;
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    function pauseSanctions() external onlyOwner {
        _sanctionsPause = true;
    }

    function unpauseSanctions() external onlyOwner {
        _sanctionsPause = false;
    }

    function buyWithFinancing(
        ISellerFinancing.Offer memory offer,
        bytes calldata signature,
        address buyer,
        uint256 nftId
    ) external payable whenNotPaused {
        _requireIsNotSanctioned(msg.sender);
        _requireIsNotSanctioned(buyer);

        uint256 marketplaceFeeAmount = (offer.price * marketplaceFeeBps) / BASE_BPS;
        if (msg.value < offer.downPaymentAmount + marketplaceFeeAmount) {
            revert InsufficientMsgValue(msg.value, offer.downPaymentAmount + marketplaceFeeAmount);
        }
        marketplaceFeeRecipient.sendValue(marketplaceFeeAmount);

        ISellerFinancing(sellerFinancingContractAddress).buyWithFinancing{
            value: msg.value - marketplaceFeeAmount
        }(offer, signature, buyer, nftId);
    }

    function _requireNonZeroAddress(address given) internal pure {
        if (given == address(0)) {
            revert ZeroAddress();
        }
    }

    function _requireIsNotSanctioned(address addressToCheck) internal view {
        if (!_sanctionsPause) {
            SanctionsList sanctionsList = SanctionsList(SANCTIONS_CONTRACT);
            bool isToSanctioned = sanctionsList.isSanctioned(addressToCheck);
            if (isToSanctioned) {
                revert SanctionedAddress(addressToCheck);
            }
        }
    }
}

File 2 of 12 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 12 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 4 of 12 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 5 of 12 : ISellerFinancing.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

import "./ISellerFinancingAdmin.sol";
import "./ISellerFinancingEvents.sol";
import "./ISellerFinancingStructs.sol";
import "./ISellerFinancingErrors.sol";

/// @title The SellerFinancing interface for NiftyApes
interface ISellerFinancing is
    ISellerFinancingAdmin,
    ISellerFinancingEvents,
    ISellerFinancingStructs,
    ISellerFinancingErrors
{
    /// @notice Returns an EIP712 standard compatible hash for a given offer.
    /// @dev    This hash can be signed to create a valid offer.
    /// @param offer The offer to compute the hash for
    function getOfferHash(Offer memory offer) external view returns (bytes32);

    /// @notice Returns the signer of an offer or throws an error.
    /// @param offer The offer to use for retrieving the signer
    /// @param signature The signature to use for retrieving the signer
    function getOfferSigner(Offer memory offer, bytes memory signature) external returns (address);

    /// @notice Returns true if a given signature has been revoked otherwise false
    /// @param signature The signature to check
    function getOfferSignatureStatus(bytes calldata signature) external view returns (bool status);

    /// @notice Returns the usage count of a given signature
    ///         Only increments for collection offers
    /// @param signature The signature to return a count for
    function getCollectionOfferCount(bytes memory signature) external view returns (uint64 count);

    /// @notice Returns value stored in `royaltiesEngineContractAddress`
    function royaltiesEngineContractAddress() external returns (address);

    /// @notice Returns value stored in `delegateRegistryContractAddress`
    function delegateRegistryContractAddress() external returns (address);

    /// @notice Returns value stored in `seaportContractAddress`
    function seaportContractAddress() external returns (address);

    /// @notice Returns value stored in `wethContractAddress`
    function wethContractAddress() external returns (address);

    /// @notice Withdraw a given offer
    /// @dev    Calling this method allows users to withdraw a given offer by cancelling their signature on chain
    /// @param offer The offer to withdraw
    /// @param signature The signature of the offer
    function withdrawOfferSignature(Offer memory offer, bytes calldata signature) external;

    /// @notice Start a loan as buyer using a signed offer.
    /// @param offer The details of the financing offer
    /// @param signature A signed offerHash
    /// @param buyer The address of the buyer
    /// @dev   buyer provided as param to allow for 3rd party marketplace integrations
    function buyWithFinancing(
        Offer calldata offer,
        bytes memory signature,
        address buyer,
        uint256 nftId
    ) external payable;

    /// @notice Make a partial payment or full repayment of a loan.
    /// @dev Any address may make a payment towards the loan.
    /// @param nftContractAddress The address of the NFT collection
    /// @param nftId The id of a specified NFT
    function makePayment(address nftContractAddress, uint256 nftId) external payable;

    /// @notice Seize an asset from a defaulted loan.
    /// @dev    This function is only callable by the seller address
    /// @param nftContractAddress The address of the NFT collection
    /// @param nftId The id of a specified NFT
    function seizeAsset(address nftContractAddress, uint256 nftId) external;

    /// @notice Sell the underlying nft and repay the loan using the proceeds of the sale.
    ///         Transfer remaining funds to the buyer
    /// @dev    This function is only callable by the buyer address
    /// @dev    This function only supports valid Seaport orders
    /// @param nftContractAddress The address of the NFT collection
    /// @param nftId The id of a specified NFT
    /// @param minProfitAmount Minimum amount to accept for buyer's profit. Provides slippage control.
    /// @param data Order encoded as bytes
    function instantSell(
        address nftContractAddress,
        uint256 nftId,
        uint256 minProfitAmount,
        bytes calldata data
    ) external;

    /// @notice Returns a loan identified by a given nft.
    /// @param nftContractAddress The address of the NFT collection
    /// @param nftId The id of a specified NFT
    function getLoan(address nftContractAddress, uint256 nftId) external view returns (Loan memory);

    /// @notice Returns the underlying nft of a specified a seller financing ticket id.
    /// @param sellerFinancingTicketId The id of a specified seller financing ticket id
    function getUnderlyingNft(
        uint256 sellerFinancingTicketId
    ) external view returns (UnderlyingNft memory);

    /// @notice Returns minimum payment required for the current period and current period interest
    /// @dev    This function calculates a sum of current and late payment values if applicable
    /// @param loan Loan struct details
    /// @return minimumPayment Minimum payment required for the current period
    /// @return periodInterest Unpaid interest amount for the current period
    function calculateMinimumPayment(
        Loan memory loan
    ) external view returns (uint256 minimumPayment, uint256 periodInterest);

    function initialize(
        address newRoyaltiesEngineAddress,
        address newDelegateRegistryAddress,
        address newSeaportContractAddress,
        address newWethContractAddress
    ) external;
}

File 6 of 12 : SanctionsList.sol
pragma solidity 0.8.18;

interface SanctionsList {
    function isSanctioned(address addr) external view returns (bool);
}

File 7 of 12 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 8 of 12 : ISellerFinancingAdmin.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

/// @title NiftyApes interface for the admin role.
interface ISellerFinancingAdmin {
    /// @notice Pauses all interactions with the contract.
    ///         This is intended to be used as an emergency measure to avoid loosing funds.
    function pause() external;

    /// @notice Unpauses all interactions with the contract.
    function unpause() external;

    /// @notice Pauses sanctions checks
    function pauseSanctions() external;

    /// @notice Unpauses sanctions checks
    function unpauseSanctions() external;

    /// @notice Updates royalty engine contract address to new address
    /// @param newRoyaltyEngineContractAddress New royalty engine address
    function updateRoyaltiesEngineContractAddress(address newRoyaltyEngineContractAddress) external;

    /// @notice Updates delegate registry contract address to new address
    /// @param newDelegateRegistryContractAddress New delegate registry address
    function updateDelegateRegistryContractAddress(
        address newDelegateRegistryContractAddress
    ) external;

    /// @notice Updates seaport contract address to new address
    /// @param newSeaportContractAddress New seaport address
    function updateSeaportContractAddress(address newSeaportContractAddress) external;

    /// @notice Updates Weth contract address to new address
    /// @param newWethContractAddress New Weth contract address
    function updateWethContractAddress(address newWethContractAddress) external;
}

File 9 of 12 : ISellerFinancingEvents.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

import "./ISellerFinancingStructs.sol";

/// @title Events emitted by the offers part of the protocol.
interface ISellerFinancingEvents {
    /// @notice Emitted when a offer signature gets has been used
    /// @param nftContractAddress The nft contract address
    /// @param nftId The nft id, this field can be meaningless if the offer is a floor term offer
    /// @param offer The offer details
    /// @param signature The signature that has been revoked
    event OfferSignatureUsed(
        address indexed nftContractAddress,
        uint256 indexed nftId,
        ISellerFinancingStructs.Offer offer,
        bytes signature
    );

    /// @notice Emitted when a new loan is executed
    /// @param nftContractAddress The nft contract address
    /// @param nftId The nft id
    /// @param signature The signature that has been used
    /// @param loan The loan details
    event LoanExecuted(
        address indexed nftContractAddress,
        uint256 indexed nftId,
        bytes signature,
        ISellerFinancingStructs.Loan loan
    );

    /// @notice Emitted when a payment is made toward the loan
    /// @param nftContractAddress The nft contract address
    /// @param nftId The nft id
    /// @param amount The amount paid towards the loan
    /// @param totalRoyaltiesPaid The amount paid in royalties
    /// @param interestPaid the amount paid in interest
    /// @param loan The loan details
    event PaymentMade(
        address indexed nftContractAddress,
        uint256 indexed nftId,
        uint256 amount,
        uint256 totalRoyaltiesPaid,
        uint256 interestPaid,
        ISellerFinancingStructs.Loan loan
    );

    /// @notice Emitted when a loan is fully repaid
    /// @param nftContractAddress The nft contract address
    /// @param nftId The nft id
    /// @param loan The loan details
    event LoanRepaid(
        address indexed nftContractAddress,
        uint256 indexed nftId,
        ISellerFinancingStructs.Loan loan
    );

    /// @notice Emitted when an asset is seized
    /// @param nftContractAddress The nft contract address
    /// @param nftId The nft id
    /// @param loan The loan details
    event AssetSeized(
        address indexed nftContractAddress,
        uint256 indexed nftId,
        ISellerFinancingStructs.Loan loan
    );

    /// @notice Emitted when an NFT is sold instantly on Seaport
    /// @param nftContractAddress The nft contract address
    /// @param nftId The tokenId of the NFT which was put as collateral
    /// @param saleAmount The sale value
    event InstantSell(
        address indexed nftContractAddress,
        uint256 indexed nftId,
        uint256 saleAmount
    );

    /// @notice Emitted when an locked NFT is listed for sale through Seaport
    /// @param nftContractAddress The nft contract address
    /// @param nftId The tokenId of the listed NFT
    /// @param orderHash The hash of the order which listed the NFT
    /// @param loan The loan details at the time of listing
    event ListedOnSeaport(
        address indexed nftContractAddress,
        uint256 indexed nftId,
        bytes32 indexed orderHash,
        ISellerFinancingStructs.Loan loan
    );

    /// @notice Emitted when a seaport NFT listing thorugh NiftyApes is cancelled by the borrower
    /// @param nftContractAddress The nft contract address
    /// @param nftId The tokenId of the listed NFT
    /// @param orderHash The hash of the order which listed the NFT
    /// @param loan The loan details at the time of listing
    event ListingCancelledSeaport(
        address indexed nftContractAddress,
        uint256 indexed nftId,
        bytes32 indexed orderHash,
        ISellerFinancingStructs.Loan loan
    );

    /// @notice Emitted when a flashClaim is executed on an NFT
    /// @param nftContractAddress The address of the NFT collection
    /// @param nftId The id of the specified NFT
    /// @param receiverAddress The address of the external contract that will receive and return the nft
    event FlashClaim(address nftContractAddress, uint256 nftId, address receiverAddress);
}

File 10 of 12 : ISellerFinancingStructs.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

interface ISellerFinancingStructs {
    struct Offer {
        // SLOT 0
        // Full price of NFT
        uint128 price;
        // Down payment for NFT financing
        uint128 downPaymentAmount;
        // SLOT 1 - 128 remaining
        // Minimum amount of total principal to be paid each period
        uint128 minimumPrincipalPerPeriod;
        // SLOT 2
        // Offer NFT ID
        uint256 nftId;
        // SLOT 3 - 32 remaining
        // Offer NFT contract address
        address nftContractAddress;
        // Offer creator
        address creator;
        // Interest rate basis points to be paid against remainingPrincipal per period
        uint32 periodInterestRateBps;
        // Number of seconds per period
        uint32 periodDuration;
        // Timestamp of offer expiration
        uint32 expiration;
        // collection offer usage limit, ignored if nftId is not ~uint256(0)
        uint64 collectionOfferLimit;
    }

    struct Loan {
        // SLOT 0
        // Buyer loan receipt nftId
        uint256 buyerNftId;
        // SLOT 1
        // Seller loan receipt nftId
        uint256 sellerNftId;
        // SLOT 2
        // Remaining principal on loan
        uint128 remainingPrincipal;
        // Minimum amount of total principal to be paid each period
        uint128 minimumPrincipalPerPeriod;
        // SLOT 3 - 128 remaining
        // Interest rate basis points to be paid against remainingPrincipal per period
        uint32 periodInterestRateBps;
        // Number of seconds per period
        uint32 periodDuration;
        // Timestamp of period end
        uint32 periodEndTimestamp;
        // Timestamp of period beginning
        uint32 periodBeginTimestamp;
    }

    struct UnderlyingNft {
        // NFT contract address
        address nftContractAddress;
        // NFT ID
        uint256 nftId;
    }
}

File 11 of 12 : ISellerFinancingErrors.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

import "../seaport/ISeaport.sol";

/// @title The SellerFinancing interface defining custom errors
interface ISellerFinancingErrors {
    error ZeroAddress();

    error SignatureNotAvailable(bytes signature);

    error OfferExpired();

    error SanctionedAddress(address account);

    error NotNftOwner(address nftContractAddress, uint256 nftId, address account);

    error InvalidSigner(address signer, address expected);

    error LoanAlreadyClosed();

    error InvalidCaller(address caller, address expected);

    error CannotBuySellerFinancingTicket();

    error NftIdsMustMatch();

    error CollectionOfferLimitReached();

    error InvalidOffer0ItemType(ISeaport.ItemType given, ISeaport.ItemType expected);

    error InvalidOffer0Token(address given, address expected);

    error InvalidOfferLength(uint256 given, uint256 expected);

    error InvalidConsideration0Identifier(uint256 given, uint256 expected);

    error InvalidConsiderationItemType(
        uint256 index,
        ISeaport.ItemType given,
        ISeaport.ItemType expected
    );

    error InvalidConsiderationToken(uint256 index, address given, address expected);

    error InvalidPeriodDuration();

    error InsufficientMsgValue(uint256 msgValueSent, uint256 minMsgValueExpected);

    error DownPaymentGreaterThanOrEqualToOfferPrice(uint256 downPaymentAmount, uint256 offerPrice);

    error InvalidMinimumPrincipalPerPeriod(
        uint256 givenMinPrincipalPerPeriod,
        uint256 maxMinPrincipalPerPeriod
    );

    error SoftGracePeriodEnded();

    error AmountReceivedLessThanRequiredMinimumPayment(
        uint256 amountReceived,
        uint256 minExpectedAmount
    );

    error LoanNotInDefault();

    error ExecuteOperationFailed();

    error SeaportOrderNotFulfilled();

    error WethConversionFailed();

    error InsufficientAmountReceivedFromSale(
        uint256 saleAmountReceived,
        uint256 minSaleAmountRequired
    );

    error InvalidIndex(uint256 index, uint256 ownerTokenBalance);

    error InsufficientBalance(uint256 amountRequested, uint256 contractBalance);

    error ConditionSendValueFailed(address from, address to, uint256 amount);
}

File 12 of 12 : ISeaport.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

interface ISeaport {
    enum OrderType {
        // 0: no partial fills, anyone can execute
        FULL_OPEN,
        // 1: partial fills supported, anyone can execute
        PARTIAL_OPEN,
        // 2: no partial fills, only offerer or zone can execute
        FULL_RESTRICTED,
        // 3: partial fills supported, only offerer or zone can execute
        PARTIAL_RESTRICTED
    }

    enum ItemType {
        // 0: ETH on mainnet, MATIC on polygon, etc.
        NATIVE,
        // 1: ERC20 items (ERC777 and ERC20 analogues could also technically work)
        ERC20,
        // 2: ERC721 items
        ERC721,
        // 3: ERC1155 items
        ERC1155,
        // 4: ERC721 items where a number of tokenIds are supported
        ERC721_WITH_CRITERIA,
        // 5: ERC1155 items where a number of ids are supported
        ERC1155_WITH_CRITERIA
    }

    /**
     * @dev An offer item has five components: an item type (ETH or other native
     *      tokens, ERC20, ERC721, and ERC1155, as well as criteria-based ERC721 and
     *      ERC1155), a token address, a dual-purpose "identifierOrCriteria"
     *      component that will either represent a tokenId or a merkle root
     *      depending on the item type, and a start and end amount that support
     *      increasing or decreasing amounts over the duration of the respective
     *      order.
     */
    struct OfferItem {
        ItemType itemType;
        address token;
        uint256 identifierOrCriteria;
        uint256 startAmount;
        uint256 endAmount;
    }

    /**
     * @dev A consideration item has the same five components as an offer item and
     *      an additional sixth component designating the required recipient of the
     *      item.
     */
    struct ConsiderationItem {
        ItemType itemType;
        address token;
        uint256 identifierOrCriteria;
        uint256 startAmount;
        uint256 endAmount;
        address payable recipient;
    }

    /**
     * @notice Retrieve the current counter for a given offerer.
     *
     * @param offerer The offerer in question.
     *
     * @return counter The current counter.
     */
    function getCounter(address offerer) external view returns (uint256 counter);

    /**
     * @notice Retrieve the status of a given order by hash, including whether
     *         the order has been cancelled or validated and the fraction of the
     *         order that has been filled.
     *
     * @param orderHash The order hash in question.
     *
     * @return isValidated A boolean indicating whether the order in question
     *                     has been validated (i.e. previously approved or
     *                     partially filled).
     * @return isCancelled A boolean indicating whether the order in question
     *                     has been cancelled.
     * @return totalFilled The total portion of the order that has been filled
     *                     (i.e. the "numerator").
     * @return totalSize   The total size of the order that is either filled or
     *                     unfilled (i.e. the "denominator").
     */
    function getOrderStatus(
        bytes32 orderHash
    )
        external
        view
        returns (bool isValidated, bool isCancelled, uint256 totalFilled, uint256 totalSize);

    /**
     * @notice Retrieve the order hash for a given order.
     *
     * @param order The components of the order.
     *
     * @return orderHash The order hash.
     */
    function getOrderHash(OrderComponents calldata order) external view returns (bytes32 orderHash);

    /**
     * @dev An order contains eleven components: an offerer, a zone (or account that
     *      can cancel the order or restrict who can fulfill the order depending on
     *      the type), the order type (specifying partial fill support as well as
     *      restricted order status), the start and end time, a hash that will be
     *      provided to the zone when validating restricted orders, a salt, a key
     *      corresponding to a given conduit, a counter, and an arbitrary number of
     *      offer items that can be spent along with consideration items that must
     *      be received by their respective recipient.
     */
    struct OrderComponents {
        address offerer;
        address zone;
        OfferItem[] offer;
        ConsiderationItem[] consideration;
        OrderType orderType;
        uint256 startTime;
        uint256 endTime;
        bytes32 zoneHash;
        uint256 salt;
        bytes32 conduitKey;
        uint256 counter;
    }

    /**
     * @dev The full set of order components, with the exception of the counter,
     *      must be supplied when fulfilling more sophisticated orders or groups of
     *      orders. The total number of original consideration items must also be
     *      supplied, as the caller may specify additional consideration items.
     */
    struct OrderParameters {
        address offerer; // 0x00
        address zone; // 0x20
        OfferItem[] offer; // 0x40
        ConsiderationItem[] consideration; // 0x60
        OrderType orderType; // 0x80
        uint256 startTime; // 0xa0
        uint256 endTime; // 0xc0
        bytes32 zoneHash; // 0xe0
        uint256 salt; // 0x100
        bytes32 conduitKey; // 0x120
        uint256 totalOriginalConsiderationItems; // 0x140
        // offer.length                          // 0x160
    }

    /**
     * @dev Orders require a signature in addition to the other order parameters.
     */
    struct Order {
        OrderParameters parameters;
        bytes signature;
    }

    function fulfillOrder(
        Order calldata order,
        bytes32 fulfillerConduitKey
    ) external payable returns (bool fulfilled);

    function validate(Order[] memory orders) external returns (bool validated);

    function cancel(OrderComponents[] memory orders) external returns (bool cancelled);
}

Settings
{
  "remappings": [
    "@openzeppelin-norm/=lib/openzeppelin-contracts/",
    "@openzeppelin/=lib/openzeppelin-contracts-upgradeable/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "lib/forge-std:ds-test/=lib/forge-std/lib/ds-test/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_sellerFinancingContractAddress","type":"address"},{"internalType":"address","name":"_marketplaceFeeRecipient","type":"address"},{"internalType":"uint256","name":"_marketplaceFeeBps","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"given","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"InsufficientMsgValue","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"SanctionedAddress","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"components":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint128","name":"downPaymentAmount","type":"uint128"},{"internalType":"uint128","name":"minimumPrincipalPerPeriod","type":"uint128"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"address","name":"nftContractAddress","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint32","name":"periodInterestRateBps","type":"uint32"},{"internalType":"uint32","name":"periodDuration","type":"uint32"},{"internalType":"uint32","name":"expiration","type":"uint32"},{"internalType":"uint64","name":"collectionOfferLimit","type":"uint64"}],"internalType":"struct ISellerFinancingStructs.Offer","name":"offer","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"buyWithFinancing","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"marketplaceFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketplaceFeeRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseSanctions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellerFinancingContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseSanctions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMarketplaceFeeBps","type":"uint256"}],"name":"updateMarketplaceFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketplaceFeeRecipient","type":"address"}],"name":"updateMarketplaceFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSellerFinancingContractAddress","type":"address"}],"name":"updateSellerFinancingContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50604051610ee1380380610ee183398101604081905261002f91610125565b6100383361008f565b6000805460ff60a01b1916905561004e836100df565b610057826100df565b600380546001600160a01b039485166001600160a01b0319918216179091556002805493909416921691909117909155600155610161565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381166101065760405163d92e233d60e01b815260040160405180910390fd5b50565b80516001600160a01b038116811461012057600080fd5b919050565b60008060006060848603121561013a57600080fd5b61014384610109565b925061015160208501610109565b9150604084015190509250925092565b610d71806101706000396000f3fe6080604052600436106100e85760003560e01c80638da5cb5b1161008a578063d3929c8a11610059578063d3929c8a1461022c578063dccbb5f714610250578063edc754df14610270578063f2fde38b1461029057600080fd5b80638da5cb5b146101a757806391934e92146101d9578063b4276029146101f9578063c49d91de1461020c57600080fd5b80636db7ad43116100c65780636db7ad4314610148578063715018a61461015d5780638456cb591461017257806388bc2ac21461018757600080fd5b80633f4ba83a146100ed57806358112cd3146101045780635c975abb14610119575b600080fd5b3480156100f957600080fd5b506101026102b0565b005b34801561011057600080fd5b506101026102c2565b34801561012557600080fd5b50600054600160a01b900460ff1660405190151581526020015b60405180910390f35b34801561015457600080fd5b506101026102df565b34801561016957600080fd5b506101026102f6565b34801561017e57600080fd5b50610102610308565b34801561019357600080fd5b506101026101a2366004610939565b610318565b3480156101b357600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161013f565b3480156101e557600080fd5b506101026101f436600461095b565b61034b565b610102610207366004610a38565b610358565b34801561021857600080fd5b506002546101c1906001600160a01b031681565b34801561023857600080fd5b5061024260015481565b60405190815260200161013f565b34801561025c57600080fd5b506003546101c1906001600160a01b031681565b34801561027c57600080fd5b5061010261028b366004610939565b61048f565b34801561029c57600080fd5b506101026102ab366004610939565b6104c2565b6102b861053b565b6102c0610595565b565b6102ca61053b565b6000805460ff60a81b1916600160a81b179055565b6102e761053b565b6000805460ff60a81b19169055565b6102fe61053b565b6102c060006105ea565b61031061053b565b6102c061063a565b61032061053b565b6103298161067d565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61035361053b565b600155565b6103606106a4565b610369336106f1565b610372826106f1565b600061271060015487600001516001600160801b03166103929190610b6e565b61039c9190610b8b565b90508086602001516001600160801b03166103b79190610bad565b3410156103ff57348187602001516001600160801b03166103d89190610bad565b604051631f2dda7760e21b8152600481019290925260248201526044015b60405180910390fd5b600254610415906001600160a01b0316826107b4565b6003546001600160a01b031663b42760296104308334610bc0565b88888888886040518763ffffffff1660e01b8152600401610455959493929190610bfc565b6000604051808303818588803b15801561046e57600080fd5b505af1158015610482573d6000803e3d6000fd5b5050505050505050505050565b61049761053b565b6104a08161067d565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6104ca61053b565b6001600160a01b03811661052f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f6565b610538816105ea565b50565b6000546001600160a01b031633146102c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103f6565b61059d6108cd565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106426106a4565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586105cd3390565b6001600160a01b0381166105385760405163d92e233d60e01b815260040160405180910390fd5b600054600160a01b900460ff16156102c05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103f6565b600054600160a81b900460ff166105385760405163df592f7d60e01b81526001600160a01b03821660048201527340c57923924b5c5c5455c48d93317139addac8fb90600090829063df592f7d90602401602060405180830381865afa15801561075f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107839190610d19565b905080156107af57604051638027911160e01b81526001600160a01b03841660048201526024016103f6565b505050565b804710156108045760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016103f6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610851576040519150601f19603f3d011682016040523d82523d6000602084013e610856565b606091505b50509050806107af5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016103f6565b600054600160a01b900460ff166102c05760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103f6565b80356001600160a01b038116811461093457600080fd5b919050565b60006020828403121561094b57600080fd5b6109548261091d565b9392505050565b60006020828403121561096d57600080fd5b5035919050565b604051610140810167ffffffffffffffff811182821017156109a657634e487b7160e01b600052604160045260246000fd5b60405290565b80356001600160801b038116811461093457600080fd5b803563ffffffff8116811461093457600080fd5b803567ffffffffffffffff8116811461093457600080fd5b60008083601f840112610a0157600080fd5b50813567ffffffffffffffff811115610a1957600080fd5b602083019150836020828501011115610a3157600080fd5b9250929050565b60008060008060008587036101a0811215610a5257600080fd5b61014080821215610a6257600080fd5b610a6a610974565b9150610a75886109ac565b8252610a83602089016109ac565b6020830152610a94604089016109ac565b604083015260608801356060830152610aaf6080890161091d565b6080830152610ac060a0890161091d565b60a0830152610ad160c089016109c3565b60c0830152610ae260e089016109c3565b60e0830152610100610af5818a016109c3565b90830152610120610b078982016109d7565b9083015290955086013567ffffffffffffffff811115610b2657600080fd5b610b32888289016109ef565b9095509350610b469050610160870161091d565b94979396509194610180013592915050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b8557610b85610b58565b92915050565b600082610ba857634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610b8557610b85610b58565b81810381811115610b8557610b85610b58565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b85516001600160801b0316815260006101a06020880151610c2860208501826001600160801b03169052565b506040880151610c4360408501826001600160801b03169052565b50606088015160608401526080880151610c6860808501826001600160a01b03169052565b5060a0880151610c8360a08501826001600160a01b03169052565b5060c0880151610c9b60c085018263ffffffff169052565b5060e0880151610cb360e085018263ffffffff169052565b506101008881015163ffffffff16908401526101208089015167ffffffffffffffff16908401526101408301819052610cef8184018789610bd3565b915050610d086101608301856001600160a01b03169052565b826101808301529695505050505050565b600060208284031215610d2b57600080fd5b8151801515811461095457600080fdfea2646970667358221220aab3adcb90988d3cd99648de4baa18c595be9b581e77d95b02ea3424c279566364736f6c634300081200330000000000000000000000001ad9752a86bbdb4b9b33addc00e008d6e0308d03000000000000000000000000be9b799d066a51f77d353fc72e832f38037893620000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106100e85760003560e01c80638da5cb5b1161008a578063d3929c8a11610059578063d3929c8a1461022c578063dccbb5f714610250578063edc754df14610270578063f2fde38b1461029057600080fd5b80638da5cb5b146101a757806391934e92146101d9578063b4276029146101f9578063c49d91de1461020c57600080fd5b80636db7ad43116100c65780636db7ad4314610148578063715018a61461015d5780638456cb591461017257806388bc2ac21461018757600080fd5b80633f4ba83a146100ed57806358112cd3146101045780635c975abb14610119575b600080fd5b3480156100f957600080fd5b506101026102b0565b005b34801561011057600080fd5b506101026102c2565b34801561012557600080fd5b50600054600160a01b900460ff1660405190151581526020015b60405180910390f35b34801561015457600080fd5b506101026102df565b34801561016957600080fd5b506101026102f6565b34801561017e57600080fd5b50610102610308565b34801561019357600080fd5b506101026101a2366004610939565b610318565b3480156101b357600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161013f565b3480156101e557600080fd5b506101026101f436600461095b565b61034b565b610102610207366004610a38565b610358565b34801561021857600080fd5b506002546101c1906001600160a01b031681565b34801561023857600080fd5b5061024260015481565b60405190815260200161013f565b34801561025c57600080fd5b506003546101c1906001600160a01b031681565b34801561027c57600080fd5b5061010261028b366004610939565b61048f565b34801561029c57600080fd5b506101026102ab366004610939565b6104c2565b6102b861053b565b6102c0610595565b565b6102ca61053b565b6000805460ff60a81b1916600160a81b179055565b6102e761053b565b6000805460ff60a81b19169055565b6102fe61053b565b6102c060006105ea565b61031061053b565b6102c061063a565b61032061053b565b6103298161067d565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b61035361053b565b600155565b6103606106a4565b610369336106f1565b610372826106f1565b600061271060015487600001516001600160801b03166103929190610b6e565b61039c9190610b8b565b90508086602001516001600160801b03166103b79190610bad565b3410156103ff57348187602001516001600160801b03166103d89190610bad565b604051631f2dda7760e21b8152600481019290925260248201526044015b60405180910390fd5b600254610415906001600160a01b0316826107b4565b6003546001600160a01b031663b42760296104308334610bc0565b88888888886040518763ffffffff1660e01b8152600401610455959493929190610bfc565b6000604051808303818588803b15801561046e57600080fd5b505af1158015610482573d6000803e3d6000fd5b5050505050505050505050565b61049761053b565b6104a08161067d565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6104ca61053b565b6001600160a01b03811661052f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f6565b610538816105ea565b50565b6000546001600160a01b031633146102c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103f6565b61059d6108cd565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6106426106a4565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586105cd3390565b6001600160a01b0381166105385760405163d92e233d60e01b815260040160405180910390fd5b600054600160a01b900460ff16156102c05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103f6565b600054600160a81b900460ff166105385760405163df592f7d60e01b81526001600160a01b03821660048201527340c57923924b5c5c5455c48d93317139addac8fb90600090829063df592f7d90602401602060405180830381865afa15801561075f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107839190610d19565b905080156107af57604051638027911160e01b81526001600160a01b03841660048201526024016103f6565b505050565b804710156108045760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016103f6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610851576040519150601f19603f3d011682016040523d82523d6000602084013e610856565b606091505b50509050806107af5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016103f6565b600054600160a01b900460ff166102c05760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103f6565b80356001600160a01b038116811461093457600080fd5b919050565b60006020828403121561094b57600080fd5b6109548261091d565b9392505050565b60006020828403121561096d57600080fd5b5035919050565b604051610140810167ffffffffffffffff811182821017156109a657634e487b7160e01b600052604160045260246000fd5b60405290565b80356001600160801b038116811461093457600080fd5b803563ffffffff8116811461093457600080fd5b803567ffffffffffffffff8116811461093457600080fd5b60008083601f840112610a0157600080fd5b50813567ffffffffffffffff811115610a1957600080fd5b602083019150836020828501011115610a3157600080fd5b9250929050565b60008060008060008587036101a0811215610a5257600080fd5b61014080821215610a6257600080fd5b610a6a610974565b9150610a75886109ac565b8252610a83602089016109ac565b6020830152610a94604089016109ac565b604083015260608801356060830152610aaf6080890161091d565b6080830152610ac060a0890161091d565b60a0830152610ad160c089016109c3565b60c0830152610ae260e089016109c3565b60e0830152610100610af5818a016109c3565b90830152610120610b078982016109d7565b9083015290955086013567ffffffffffffffff811115610b2657600080fd5b610b32888289016109ef565b9095509350610b469050610160870161091d565b94979396509194610180013592915050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b8557610b85610b58565b92915050565b600082610ba857634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610b8557610b85610b58565b81810381811115610b8557610b85610b58565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b85516001600160801b0316815260006101a06020880151610c2860208501826001600160801b03169052565b506040880151610c4360408501826001600160801b03169052565b50606088015160608401526080880151610c6860808501826001600160a01b03169052565b5060a0880151610c8360a08501826001600160a01b03169052565b5060c0880151610c9b60c085018263ffffffff169052565b5060e0880151610cb360e085018263ffffffff169052565b506101008881015163ffffffff16908401526101208089015167ffffffffffffffff16908401526101408301819052610cef8184018789610bd3565b915050610d086101608301856001600160a01b03169052565b826101808301529695505050505050565b600060208284031215610d2b57600080fd5b8151801515811461095457600080fdfea2646970667358221220aab3adcb90988d3cd99648de4baa18c595be9b581e77d95b02ea3424c279566364736f6c63430008120033

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

0000000000000000000000001ad9752a86bbdb4b9b33addc00e008d6e0308d03000000000000000000000000be9b799d066a51f77d353fc72e832f38037893620000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _sellerFinancingContractAddress (address): 0x1AD9752A86BBDB4b9B33Addc00e008D6E0308d03
Arg [1] : _marketplaceFeeRecipient (address): 0xbe9B799D066A51F77d353Fc72e832f3803789362
Arg [2] : _marketplaceFeeBps (uint256): 0

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000001ad9752a86bbdb4b9b33addc00e008d6e0308d03
Arg [1] : 000000000000000000000000be9b799d066a51f77d353fc72e832f3803789362
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000


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.