BERA Price: $3.61 (-1.95%)

Contract

0xaa04F13994A7fCd86F3BbbF4054d239b88F2744d

Overview

BERA Balance

Berachain LogoBerachain LogoBerachain Logo0 BERA

BERA Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Purchase Item40600882025-04-22 22:10:3616 hrs ago1745359836IN
0xaa04F139...b88F2744d
0 BERA0.0010211410.00100003
Redeem Item40600792025-04-22 22:10:1716 hrs ago1745359817IN
0xaa04F139...b88F2744d
0 BERA0.0016538610.00100002
Purchase Item40598932025-04-22 22:04:0816 hrs ago1745359448IN
0xaa04F139...b88F2744d
0 BERA0.0010211410.00100003
Backing Loan Exp...40598802025-04-22 22:03:4216 hrs ago1745359422IN
0xaa04F139...b88F2744d
0 BERA0.0010852210.00100004
Receive Loan40598702025-04-22 22:03:2416 hrs ago1745359404IN
0xaa04F139...b88F2744d
0 BERA0.003249410.00100004
Purchase Item40597142025-04-22 21:58:1517 hrs ago1745359095IN
0xaa04F139...b88F2744d
0 BERA0.0010211410.00100001
Purchase Item40596882025-04-22 21:57:2517 hrs ago1745359045IN
0xaa04F139...b88F2744d
0 BERA0.0006885510.00100001
Purchase Item40596842025-04-22 21:57:1617 hrs ago1745359036IN
0xaa04F139...b88F2744d
0 BERA0.0006885510.00100001
Backing Loan Exp...40596762025-04-22 21:57:0117 hrs ago1745359021IN
0xaa04F139...b88F2744d
0 BERA0.0010628210.00100001
Receive Loan40596602025-04-22 21:56:2917 hrs ago1745358989IN
0xaa04F139...b88F2744d
0 BERA0.0030501410.00100001
Purchase Item40594312025-04-22 21:48:5817 hrs ago1745358538IN
0xaa04F139...b88F2744d
0 BERA0.0010211410.001
Backing Loan Exp...40594222025-04-22 21:48:3917 hrs ago1745358519IN
0xaa04F139...b88F2744d
0 BERA0.0010628210.001
Receive Loan40594112025-04-22 21:48:1817 hrs ago1745358498IN
0xaa04F139...b88F2744d
0 BERA0.0030501410.00100001
Purchase Item40558802025-04-22 19:52:3919 hrs ago1745351559IN
0xaa04F139...b88F2744d
0 BERA0.0003611910.001
Pay Loan Back40263932025-04-22 3:54:3335 hrs ago1745294073IN
0xaa04F139...b88F2744d
0 BERA0.0013880910.00100001
Receive Loan40263872025-04-22 3:54:2235 hrs ago1745294062IN
0xaa04F139...b88F2744d
0 BERA0.0039048910.00100001
Pay Loan Back40263682025-04-22 3:53:4535 hrs ago1745294025IN
0xaa04F139...b88F2744d
0 BERA0.0013880910.00100001
Receive Loan40263532025-04-22 3:53:1535 hrs ago1745293995IN
0xaa04F139...b88F2744d
0 BERA0.0039048910.00100001
Pay Loan Back40263012025-04-22 3:51:3435 hrs ago1745293894IN
0xaa04F139...b88F2744d
0 BERA0.0013880910.001
Receive Loan40261872025-04-22 3:47:5535 hrs ago1745293675IN
0xaa04F139...b88F2744d
0 BERA0.0039048910.00100001
Pay Loan Back40261492025-04-22 3:46:4335 hrs ago1745293603IN
0xaa04F139...b88F2744d
0 BERA0.0011813510.001
Pay Loan Back40260792025-04-22 3:44:2835 hrs ago1745293468IN
0xaa04F139...b88F2744d
0 BERA0.0018015810.001
Receive Loan40260072025-04-22 3:42:1035 hrs ago1745293330IN
0xaa04F139...b88F2744d
0 BERA0.0029078510.00100001
Receive Loan40257882025-04-22 3:35:0535 hrs ago1745292905IN
0xaa04F139...b88F2744d
0 BERA0.0052146610.00100001
Pay Loan Back40247562025-04-22 3:01:2936 hrs ago1745290889IN
0xaa04F139...b88F2744d
0 BERA0.0013181710.00100001
View all transactions

Latest 9 internal transactions

Parent Transaction Hash Block From To
40898422025-04-23 14:30:1832 mins ago1745418618
0xaa04F139...b88F2744d
1,347.95884236 BERA
40898422025-04-23 14:30:1832 mins ago1745418618
0xaa04F139...b88F2744d
1,347.95884236 BERA
40100152025-04-21 18:56:2544 hrs ago1745261785
0xaa04F139...b88F2744d
3,425.77824 BERA
40100152025-04-21 18:56:2544 hrs ago1745261785
0xaa04F139...b88F2744d
3,425.77824 BERA
40092882025-04-21 18:32:1444 hrs ago1745260334
0xaa04F139...b88F2744d
69 BERA
40092882025-04-21 18:32:1444 hrs ago1745260334
0xaa04F139...b88F2744d
69 BERA
40081142025-04-21 17:53:2245 hrs ago1745258002
0xaa04F139...b88F2744d
0.69 BERA
40081142025-04-21 17:53:2245 hrs ago1745258002
0xaa04F139...b88F2744d
0.69 BERA
39844442025-04-21 4:54:592 days ago1745211299
0xaa04F139...b88F2744d
1 BERA
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Treasury

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion
File 1 of 9 : Treasury.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import { Ownable, Ownable2Step } from "@oz-new/contracts/access/Ownable2Step.sol";
import { IERC721Enumerable } from "@oz-new/contracts/token/ERC721/extensions/IERC721Enumerable.sol";

import { IMinter } from "./interface/IMinter.sol";
import { IWETH } from "./interface/IWETH.sol";

/// @title   Treasury
/// @notice  Individual Treasury a collection will deploy
contract Treasury is Ownable2Step {
    /// EVENTS ///

    /// @notice        Emitted after RFV has been updated
    /// @param newRFV  New RFV of collection
    event RFVChanged(uint256 indexed newRFV);

    /// @notice                 Emitted after backing has been added
    /// @param backingAdded     Amount of backing added
    /// @param newTotalBacking  New total backing
    event BackingAdded(uint256 backingAdded, uint256 newTotalBacking);

    /// @notice                 Emitted after item has been redeemed
    /// @param itemId           Id of item redeemed
    /// @param newTotalBacking  New total backing
    event ItemRedeemed(uint256 itemId, uint256 newTotalBacking);

    /// @notice                 Emitted after item has been purchased
    /// @param itemId           Id of item purchased
    /// @param newTotalBacking  New total backing
    event ItemPurchased(uint256 itemId, uint256 newTotalBacking);

    /// @notice        Emitted after backing loan has been received
    /// @param loanId  Loan id
    /// @param ids     Ids of items receiving loan for
    /// @param amount  Amount loan taken
    /// @param expiry  Timestamp loan expires
    event LoanReceived(uint256 loanId, uint256[] ids, uint256 amount, uint256 expiry);

    /// @notice                 Emitted after backing loan has expired
    /// @param loanId           Loan id of expired backing loan
    /// @param newTotalBacking  New total backing
    event BackingLoanExpired(uint256 loanId, uint256 newTotalBacking);

    /// @notice                 Emitted after backing loan has been payed back
    /// @param loanId           Loan id of payed back backing loan
    /// @param newTotalBacking  New total backing
    event BackingLoanPayedBack(uint256 loanId, uint256 newTotalBacking);

    /// @notice        Emitted after item loan has been received
    /// @param loanId  Loan id
    /// @param itemId  Id of item received for loan
    /// @param expiry  Timestamp loan expires
    event ItemLoaned(uint256 loanId, uint256 itemId, uint256 expiry);

    /// @notice                 Emitted after item loan has been payed back
    /// @param loanId           Loan id of payed back item loan
    /// @param newTotalBacking  New total backing
    event LoanItemSentBack(uint256 loanId, uint256 newTotalBacking);

    /// @notice                 Emitted after item loan has expired
    /// @param loanId           Loan id of expired item loan
    /// @param newTotalBacking  New total backing
    event ItemLoanExpired(uint256 loanId, uint256 newTotalBacking);

    /// @notice              Emitted after Term limit has been set
    /// @param oldTermLimit  Old term limit
    /// @param newTermLimit  New term limit
    event TermLimitSet(uint256 oldTermLimit, uint256 newTermLimit);

    /// ERRORS ///
    /// @notice Error for if invalid input
    error InvalidInput();
    /// @notice Error for if address is already set
    error AddressAlreadySet();
    /// @notice Error for if NFT is not treasury owned
    error NotTreasuryOwned();
    /// @notice Error for if not owner
    error NotOwner();
    /// @notice Error for if value is too low
    error NotEnoughValue();
    /// @notice Error for if loan is inactive
    error InactiveLoan();
    /// @notice Error for if loan is active
    error ActiveLoan();
    /// @notice Error for if invalid amount
    error InvalidAmount();
    /// @notice Error for if invalid loan id
    error InvalidLoanId();
    /// @notice Error for if no float value is 0
    error NoFloatValueZero();

    /// STRUCTS ///

    /// @notice                    Details of item loan
    /// @param id                  Id of item that is loaned
    /// @param timestampDue        Timestamp loan is due back
    /// @param collateralGiven     Amount of collateral given
    /// @param paidBackCreatorFee  Creator fee for when item is paid back
    /// @param defaultCreatorFee   Amount creator fee if defaulted
    struct ItemLoan {
        uint256 id;
        uint256 timestampDue;
        uint256 collateralGiven;
        uint256 paidBackCreatorFee;
        uint256 defaultCreatorFee;
    }

    /// @notice                   Details of backing loan
    /// @param loanedTo           Address of who ETH has been loaned to
    /// @param ids                Array of ids that have been loaned
    /// @param timestampDue       Timestamp when loan is due back
    /// @param interestOwed       Interest of loan owed
    /// @param backingOwed        Amount of backing that is owed
    /// @param defaultCreatorFee  Amount creator fee if defaulted
    struct BackingLoan {
        address loanedTo;
        uint256[] ids;
        uint256 timestampDue;
        uint256 interestOwed;
        uint256 backingOwed;
        uint256 defaultCreatorFee;
    }

    /// STATE VARIABLES ///

    /// @notice One year in seconds
    uint256 private constant ONE_YEAR = 31_536_000;
    /// @notice Current backing loan id
    uint256 public backingLoanId;
    /// @notice Current item loan id
    uint256 public itemLoanId;
    /// @notice Value to sell first NFT if float is 0
    uint256 public noFloatValue;

    /// @notice Address of WETH
    address private immutable WETH;
    /// @notice Address of Bera market minter
    address private immutable BERA_MARKET_MINTER;
    /// @notice Address of collection
    IERC721Enumerable private collection;

    /// @notice Fee percent for purchasing or redeeming through treasury
    uint256 public immutable ROYALTY_PERCENT;
    /// @notice Percent creator receives of fess
    uint256 public immutable CREATOR_PERCENT;
    /// @notice Bera market fee percent
    uint256 public immutable BERA_MARKET_FEE_PERCENT;
    /// @notice Interest rate on loans
    uint256 public immutable INTEREST_RATE;

    /// @notice Current fees that creator can withdraw
    uint256 public feesToWithdraw;
    /// @notice Current backing of the treasury
    uint256 public backing;
    /// @notice Amount of backing that is loaned out from treasury
    uint256 public backingLoanedOut;
    /// @notice Amount of collateral held by the treasury
    uint256 public collateralHeld;
    /// @notice Number of items treasury owns
    uint256 public itemsTreasuryOwns;
    /// @notice Max term limit on loan
    uint256 public termLimit;

    /// @notice Details of backing loan of id
    mapping(uint256 id => BackingLoan backingLoan) public backingLoanDetails;
    /// @notice Details of item loan of id
    mapping(uint256 id => ItemLoan itemLoan) public itemLoanDetails;
    /// @notice Bool if loan is on item id
    mapping(uint256 id => bool hasLoan) public loanOnItem;
    /// @notice Bool if item id has been loaned from treasury
    mapping(uint256 id => bool isLoaned) public itemLoaned;
    /// @notice Bool if item id is treasury owned
    mapping(uint256 id => bool isTreasuryOwned) public treasuryOwned;

    /// CONSTRUCTOR ///

    /// @param beraMarketMinter_      Address of bera market minter contract
    /// @param beraMarketFeePercent_  Bera market fee percent
    /// @param creatorPercent_        Percent of royalty that goes to creator
    /// @param royaltyPercent_        Royalty percent
    /// @param interestRate_          Annual interest rate for loans
    constructor(
        address beraMarketMinter_,
        uint256 beraMarketFeePercent_,
        uint256 creatorPercent_,
        uint256 royaltyPercent_,
        uint256 interestRate_
    )
        Ownable(msg.sender)
    {
        WETH = IMinter(beraMarketMinter_).WETH();
        BERA_MARKET_MINTER = beraMarketMinter_;
        BERA_MARKET_FEE_PERCENT = beraMarketFeePercent_;
        CREATOR_PERCENT = creatorPercent_;
        ROYALTY_PERCENT = royaltyPercent_;
        INTEREST_RATE = interestRate_;
    }

    /// @notice             Function that allows owner to set collection of treasury
    /// @param collection_  Address of collection for treasury
    function setCollection(address collection_) external onlyOwner {
        if (address(collection) != address(0)) revert AddressAlreadySet();

        collection = IERC721Enumerable(collection_);
    }

    /// OWNER FUNCTIONS ///

    /// @notice            Set max term limit for loans
    /// @param termLimit_  Max term limit on a loan
    function setTermLimit(uint256 termLimit_) external onlyOwner {
        uint256 oldTermLimit = termLimit;
        termLimit = termLimit_;
        emit TermLimitSet(oldTermLimit, termLimit_);
    }

    /// EXTERNAL FUNCTIONS ///

    /// @notice         Function that adds wETH to backing
    /// @param amount_  Amount of wETH to add to backing
    function addToBacking(uint256 amount_) external {
        if (amount_ == 0) revert InvalidInput();
        backing += amount_;
        IWETH(WETH).transferFrom(msg.sender, address(this), amount_);

        emit BackingAdded(amount_, backing);
        emit RFVChanged(realFloorValue());
    }

    /// @notice       Function that redeems item to treasury to receive backing
    /// @param id_    Item id to redeem
    function redeemItem(uint256 id_) external {
        if (itemLoaned[id_] || treasuryOwned[id_]) revert NotOwner();

        uint256 rfv_ = realFloorValue();
        uint256 creatorFee_;

        uint256 fee_ = (ROYALTY_PERCENT * rfv_) / 100;
        creatorFee_ = (CREATOR_PERCENT * fee_) / 100;
        feesToWithdraw += creatorFee_;
        uint256 toReceive_ = rfv_ - fee_;

        backing -= (toReceive_ + creatorFee_);

        ++itemsTreasuryOwns;

        treasuryOwned[id_] = true;

        collection.transferFrom(msg.sender, address(this), id_);
        IWETH(WETH).transfer(msg.sender, toReceive_);

        emit ItemRedeemed(id_, backing);
        emit RFVChanged(realFloorValue());
    }

    /// @notice       Function that purchases item from treasury
    /// @param id_    Item id to purchase
    function purchaseItem(uint256 id_) external {
        if (float() == 0 && noFloatValue == 0) revert NoFloatValueZero();
        if (loanOnItem[id_] || !treasuryOwned[id_]) revert NotTreasuryOwned();

        uint256 rfv_ = realFloorValue();
        uint256 fee_ = (ROYALTY_PERCENT * rfv_) / 100;
        uint256 toPay_ = rfv_ + fee_;
        uint256 creatorFee_ = (CREATOR_PERCENT * fee_) / 100;
        feesToWithdraw += creatorFee_;
        uint256 toBacking_ = toPay_ - creatorFee_;

        backing += toBacking_;

        --itemsTreasuryOwns;

        treasuryOwned[id_] = false;

        IWETH(WETH).transferFrom(msg.sender, address(this), toPay_);
        collection.transferFrom(address(this), msg.sender, id_);

        emit ItemPurchased(id_, backing);
        emit RFVChanged(realFloorValue());
    }

    /// @notice           Function that allows user to receive a loan on backing of `id_`
    /// @param id_        Array of items to use as collateral
    /// @param amount_    Amount of wETH to receive for loan
    /// @param duration_  Duration loan will be active
    function receiveLoan(uint256[] calldata id_, uint256 amount_, uint256 duration_) external {
        if (id_.length == 0 || amount_ == 0 || duration_ == 0 || duration_ > termLimit) revert InvalidInput();
        uint256 rfv_ = realFloorValue();
        uint256 totalBacking_ = rfv_ * id_.length;
        uint256 totalAccessible_ = ((100 - ROYALTY_PERCENT) * totalBacking_) / 100;
        uint256 interest_ = (duration_ * amount_ * INTEREST_RATE) / ONE_YEAR / 10_000;
        uint256 totalOwed_ = amount_ + interest_;

        for (uint256 i; i < id_.length; ++i) {
            if (itemLoaned[id_[i]] || treasuryOwned[id_[i]]) revert NotOwner();
            loanOnItem[id_[i]] = true;
            collection.transferFrom(msg.sender, address(this), id_[i]);
        }

        if (totalOwed_ > totalAccessible_) revert NotEnoughValue();

        uint256 _loanId = backingLoanId;
        BackingLoan storage loan = backingLoanDetails[_loanId];
        ++backingLoanId;

        loan.loanedTo = msg.sender;
        loan.ids = id_;
        loan.timestampDue = block.timestamp + duration_;
        loan.interestOwed = interest_;
        loan.backingOwed = amount_;
        loan.defaultCreatorFee = ((CREATOR_PERCENT) * (totalBacking_ - totalAccessible_)) / 100;

        backing -= amount_;
        backingLoanedOut += amount_;

        IWETH(WETH).transfer(msg.sender, amount_);

        emit LoanReceived(_loanId, id_, amount_, loan.timestampDue);
    }

    /// @notice         Function that adjusts backing if loan expired
    /// @param loanId_  Loan id that has expired
    function backingLoanExpired(uint256 loanId_) external {
        BackingLoan memory loan = backingLoanDetails[loanId_];
        delete backingLoanDetails[loanId_];
        if (loan.timestampDue == 0) revert InvalidLoanId();
        if (block.timestamp <= loan.timestampDue) revert ActiveLoan();

        for (uint256 i; i < loan.ids.length; ++i) {
            loanOnItem[loan.ids[i]] = false;
            treasuryOwned[loan.ids[i]] = true;
        }

        backingLoanedOut -= loan.backingOwed;
        itemsTreasuryOwns += loan.ids.length;

        loan.defaultCreatorFee = loan.defaultCreatorFee > backing ? backing : loan.defaultCreatorFee;
        feesToWithdraw += loan.defaultCreatorFee;
        backing -= loan.defaultCreatorFee;

        emit BackingLoanExpired(loanId_, backing);
        emit RFVChanged(realFloorValue());
    }

    /// @notice         Function that pays `loanId_` back
    /// @param loanId_  Loan id to pay back for
    /// @param amount_  Amount paying back
    function payLoanBack(uint256 loanId_, uint256 amount_) external {
        if (amount_ == 0) revert InvalidInput();
        BackingLoan memory loan = backingLoanDetails[loanId_];

        if (block.timestamp > loan.timestampDue) revert InactiveLoan();

        uint256 totalOwed_ = loan.interestOwed + loan.backingOwed;
        if (amount_ > totalOwed_) revert InvalidAmount();

        IWETH(WETH).transferFrom(msg.sender, address(this), amount_);

        uint256 toBacking_ = amount_;
        uint256 creatorFee_;
        if (amount_ == totalOwed_) {
            delete backingLoanDetails[loanId_];
            creatorFee_ = (CREATOR_PERCENT * loan.interestOwed) / 100;
            feesToWithdraw += creatorFee_;
            toBacking_ = totalOwed_ - creatorFee_;
            backing += toBacking_;
            backingLoanedOut -= loan.backingOwed;
            for (uint256 i; i < loan.ids.length; ++i) {
                loanOnItem[loan.ids[i]] = false;
                collection.transferFrom(address(this), loan.loanedTo, loan.ids[i]);
            }

            emit BackingLoanPayedBack(loanId_, backing);
            emit RFVChanged(realFloorValue());

            return;
        }

        if (loan.interestOwed > 0) {
            if (amount_ > loan.interestOwed) {
                creatorFee_ = (CREATOR_PERCENT * loan.interestOwed) / 100;
                backingLoanDetails[loanId_].interestOwed = 0;
                feesToWithdraw += creatorFee_;
                toBacking_ -= creatorFee_;
                amount_ -= loan.interestOwed;
            } else {
                creatorFee_ = (CREATOR_PERCENT * amount_) / 100;
                feesToWithdraw += creatorFee_;
                toBacking_ -= creatorFee_;
                backingLoanDetails[loanId_].interestOwed -= amount_;
                backing += toBacking_;
                emit RFVChanged(realFloorValue());
                return;
            }
        }

        backing += toBacking_;
        backingLoanedOut -= amount_;
        backingLoanDetails[loanId_].backingOwed -= amount_;
        emit RFVChanged(realFloorValue());
    }

    /// @notice           Function that loan `id_` from treasury
    /// @param id_        Id of item of loan
    /// @param duration_  Duration loan will be active
    function loanItem(uint256 id_, uint256 duration_) external {
        if (duration_ == 0 || duration_ > termLimit) revert InvalidInput();
        if (loanOnItem[id_] || !treasuryOwned[id_] || itemLoaned[id_]) revert NotTreasuryOwned();
        if (float() == 0 && noFloatValue == 0) revert NoFloatValueZero();

        uint256 rfv_ = realFloorValue();
        uint256 fee_ = (ROYALTY_PERCENT * rfv_) / 100;
        uint256 cost_ = rfv_ + fee_;
        uint256 interest_ = (duration_ * cost_ * INTEREST_RATE) / ONE_YEAR / 10_000;
        uint256 costWithInterest_ = cost_ + interest_;

        uint256 _loanId = itemLoanId;
        ItemLoan storage loan = itemLoanDetails[_loanId];
        itemLoaned[id_] = true;
        ++itemLoanId;

        loan.id = id_;
        loan.timestampDue = block.timestamp + duration_;
        loan.collateralGiven = cost_;
        loan.paidBackCreatorFee = (CREATOR_PERCENT * interest_) / 100;
        loan.defaultCreatorFee = (CREATOR_PERCENT * fee_) / 100;

        backing += costWithInterest_;
        collateralHeld += cost_;

        IWETH(WETH).transferFrom(msg.sender, address(this), costWithInterest_);
        collection.transferFrom(address(this), msg.sender, id_);

        emit ItemLoaned(_loanId, id_, loan.timestampDue);
        emit RFVChanged(realFloorValue());
    }

    /// @notice         Function that transfers loaned item back to treasury
    /// @param loanId_  Loan id to send item back for
    function sendLoanedItemBack(uint256 loanId_) external {
        ItemLoan memory loan = itemLoanDetails[loanId_];
        delete itemLoanDetails[loanId_];

        if (block.timestamp > loan.timestampDue) revert InactiveLoan();

        collection.transferFrom(msg.sender, address(this), loan.id);

        backing -= loan.collateralGiven;
        collateralHeld -= loan.collateralGiven;

        loan.paidBackCreatorFee = loan.paidBackCreatorFee > backing ? backing : loan.paidBackCreatorFee;
        feesToWithdraw += loan.paidBackCreatorFee;

        backing -= loan.paidBackCreatorFee;

        itemLoaned[loan.id] = false;

        IWETH(WETH).transfer(msg.sender, loan.collateralGiven);

        emit LoanItemSentBack(loanId_, backing);
        emit RFVChanged(realFloorValue());
    }

    /// @notice         Function that adjust backing if item loan has expired
    /// @param loanId_  Id of of item loan that has expierd
    function itemLoanExpired(uint256 loanId_) external {
        ItemLoan memory loan = itemLoanDetails[loanId_];
        delete itemLoanDetails[loanId_];
        if (loan.timestampDue == 0) revert InvalidLoanId();
        if (block.timestamp <= loan.timestampDue) revert ActiveLoan();

        itemLoaned[loan.id] = false;
        --itemsTreasuryOwns;
        collateralHeld -= loan.collateralGiven;

        loan.defaultCreatorFee = loan.defaultCreatorFee > backing ? backing : loan.defaultCreatorFee;
        feesToWithdraw += loan.defaultCreatorFee;
        backing -= loan.defaultCreatorFee;
        treasuryOwned[loan.id] = false;

        emit ItemLoanExpired(loanId_, backing);
        emit RFVChanged(realFloorValue());
    }

    /// EXTERNAL VIEW FUNCTIONS ///

    /// @notice         Function that returns RFV of items in collection
    /// @return value_  RFV of item in collection
    function realFloorValue() public view returns (uint256 value_) {
        uint256 backing_ = backing;
        uint256 backingLoanedOut_ = backingLoanedOut;
        uint256 collateralHeld_ = collateralHeld;
        uint256 float_ = float();

        if (float_ > 0) value_ = (backing_ + backingLoanedOut_ - collateralHeld_) / float_;
        else value_ = (backing_ + backingLoanedOut_ - collateralHeld_) + noFloatValue;
    }

    /// @notice         Function that returns float of collection
    /// @return float_  Number of supply not treasury owned
    function float() public view returns (uint256 float_) {
        uint256 totalSupply_ = collection.totalSupply();
        uint256 treasuryOwns_ = itemsTreasuryOwns;

        float_ = totalSupply_ - treasuryOwns_;
    }

    /// OWNER FUNCTIONS ///

    /// @notice  Function sends accumulated fees to owner and bera market treasury
    function withdrawFees() external {
        if (msg.sender != owner() && msg.sender != IMinter(BERA_MARKET_MINTER).owner()) revert NotOwner();
        uint256 total_ = feesToWithdraw;

        feesToWithdraw = 0;
        uint256 beraMarketFee_ = (total_ * BERA_MARKET_FEE_PERCENT) / 100;
        uint256 remainingHarvest_ = total_ - beraMarketFee_;

        IWETH(WETH).transfer(IMinter(BERA_MARKET_MINTER).beraMarketTreasury(), beraMarketFee_);
        IWETH(WETH).transfer(owner(), remainingHarvest_);
    }

    /// @notice  Function that sets purchase price if float is 0
    function setNoFloatValue(uint256 value_) external onlyOwner {
        if (value_ == 0) revert NoFloatValueZero();
        noFloatValue = value_;

        emit RFVChanged(realFloorValue());
    }

    /// RECEIVE ///

    /// @notice  Deposit and add to backing
    receive() external payable {
        uint256 value_ = msg.value;
        IWETH(WETH).deposit{ value: value_ }();
        backing += value_;

        emit BackingAdded(value_, backing);
        emit RFVChanged(realFloorValue());
    }
}

File 2 of 9 : Ownable2Step.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.20;

import {Ownable} from "./Ownable.sol";

/**
 * @dev Contract module which provides access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This extension of the {Ownable} contract includes a two-step mechanism to transfer
 * ownership, where the new owner must call {acceptOwnership} in order to replace the
 * old one. This can help prevent common mistakes, such as transfers of ownership to
 * incorrect accounts, or to contracts that are unable to interact with the
 * permission system.
 *
 * The initial owner is specified at deployment time in the constructor for `Ownable`. This
 * can later be changed with {transferOwnership} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

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

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

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     *
     * Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        if (pendingOwner() != sender) {
            revert OwnableUnauthorizedAccount(sender);
        }
        _transferOwnership(sender);
    }
}

File 3 of 9 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.20;

import {IERC721} from "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 4 of 9 : IMinter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

interface IMinter {
    function BLUR() external view returns (address);

    function WETH() external view returns (address);

    function owner() external view returns (address);

    function beraMarketTreasury() external view returns (address);

    function beraMarketFeePercent() external view returns (uint256);

    function collection(address collection_) external view returns (bool);
}

File 5 of 9 : IWETH.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

interface IWETH {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}

File 6 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

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

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

File 7 of 9 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.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 8 of 9 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 9 of 9 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.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);
}

Settings
{
  "remappings": [
    "@oz-new/=lib/oz-new/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "@openzeppelin-old/=lib/creator-token-standards/lib/openzeppelin-contracts/",
    "erc721a/=lib/ERC721A/",
    "solady/=lib/solady/",
    "@limitbreak/permit-c/=lib/creator-token-standards/lib/PermitC/src/",
    "@opensea/tstorish/=lib/creator-token-standards/lib/tstorish/src/",
    "@rari-capital/solmate/=lib/creator-token-standards/lib/PermitC/lib/solmate/",
    "ERC721A/=lib/ERC721A/contracts/",
    "PermitC/=lib/creator-token-standards/lib/PermitC/",
    "creator-token-standards/=lib/creator-token-standards/",
    "ds-test/=lib/solarray/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/oz-new/lib/erc4626-tests/",
    "forge-gas-metering/=lib/creator-token-standards/lib/PermitC/lib/forge-gas-metering/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/oz-new/lib/halmos-cheatcodes/src/",
    "murky/=lib/murky/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin/=lib/creator-token-standards/lib/PermitC/lib/openzeppelin-contracts/contracts/",
    "oz-new/=lib/oz-new/",
    "solarray/=lib/solarray/src/",
    "solmate/=lib/creator-token-standards/lib/PermitC/lib/solmate/src/",
    "tstorish/=lib/creator-token-standards/lib/tstorish/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "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

API
[{"inputs":[{"internalType":"address","name":"beraMarketMinter_","type":"address"},{"internalType":"uint256","name":"beraMarketFeePercent_","type":"uint256"},{"internalType":"uint256","name":"creatorPercent_","type":"uint256"},{"internalType":"uint256","name":"royaltyPercent_","type":"uint256"},{"internalType":"uint256","name":"interestRate_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ActiveLoan","type":"error"},{"inputs":[],"name":"AddressAlreadySet","type":"error"},{"inputs":[],"name":"InactiveLoan","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidInput","type":"error"},{"inputs":[],"name":"InvalidLoanId","type":"error"},{"inputs":[],"name":"NoFloatValueZero","type":"error"},{"inputs":[],"name":"NotEnoughValue","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"NotTreasuryOwned","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"backingAdded","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalBacking","type":"uint256"}],"name":"BackingAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"loanId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalBacking","type":"uint256"}],"name":"BackingLoanExpired","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"loanId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalBacking","type":"uint256"}],"name":"BackingLoanPayedBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"loanId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalBacking","type":"uint256"}],"name":"ItemLoanExpired","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"loanId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"itemId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expiry","type":"uint256"}],"name":"ItemLoaned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"itemId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalBacking","type":"uint256"}],"name":"ItemPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"itemId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalBacking","type":"uint256"}],"name":"ItemRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"loanId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotalBacking","type":"uint256"}],"name":"LoanItemSentBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"loanId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expiry","type":"uint256"}],"name":"LoanReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newRFV","type":"uint256"}],"name":"RFVChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldTermLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTermLimit","type":"uint256"}],"name":"TermLimitSet","type":"event"},{"inputs":[],"name":"BERA_MARKET_FEE_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CREATOR_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INTEREST_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"addToBacking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"backing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"backingLoanDetails","outputs":[{"internalType":"address","name":"loanedTo","type":"address"},{"internalType":"uint256","name":"timestampDue","type":"uint256"},{"internalType":"uint256","name":"interestOwed","type":"uint256"},{"internalType":"uint256","name":"backingOwed","type":"uint256"},{"internalType":"uint256","name":"defaultCreatorFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"loanId_","type":"uint256"}],"name":"backingLoanExpired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"backingLoanId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"backingLoanedOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralHeld","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesToWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"float","outputs":[{"internalType":"uint256","name":"float_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"itemLoanDetails","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"timestampDue","type":"uint256"},{"internalType":"uint256","name":"collateralGiven","type":"uint256"},{"internalType":"uint256","name":"paidBackCreatorFee","type":"uint256"},{"internalType":"uint256","name":"defaultCreatorFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"loanId_","type":"uint256"}],"name":"itemLoanExpired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"itemLoanId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"itemLoaned","outputs":[{"internalType":"bool","name":"isLoaned","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemsTreasuryOwns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"},{"internalType":"uint256","name":"duration_","type":"uint256"}],"name":"loanItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"loanOnItem","outputs":[{"internalType":"bool","name":"hasLoan","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noFloatValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"loanId_","type":"uint256"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"payLoanBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"purchaseItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"realFloorValue","outputs":[{"internalType":"uint256","name":"value_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"id_","type":"uint256[]"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"duration_","type":"uint256"}],"name":"receiveLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"redeemItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"loanId_","type":"uint256"}],"name":"sendLoanedItemBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"}],"name":"setCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value_","type":"uint256"}],"name":"setNoFloatValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"termLimit_","type":"uint256"}],"name":"setTermLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"termLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"treasuryOwned","outputs":[{"internalType":"bool","name":"isTreasuryOwned","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

610140604081815234620002045760a08262002939803803809162000025828562000232565b83398101031262000204576200003b826200026a565b9060208301519281810151608060608301519201519333156200021b57600180546001600160a01b03199081169091555f80543392811683178255865192602092849260049284926001600160a01b03928316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a36315ab88c960e31b825286165afa90811562000211575f91620001cb575b5060805260a05261010094855260e05260c05261012091825251906126b99283620002808439608051838181601f0152818161052501528181610dbf01528181610f11015281816113070152818161161501528181611b1001528181611dc10152612189015260a051838181610f4801526110ba015260c05183818161044e0152818161082501528181611451015281816119e40152611c51015260e05183818161047d015281816108d10152818161159501528181611a1101528181611d2201528181612269015281816122e10152612378015251828181610b1f0152610ee0015251818181610e78015281816114a30152611c910152f35b90506020813d60201162000208575b81620001e96020938362000232565b810103126200020457620001fd906200026a565b5f620000d1565b5f80fd5b3d9150620001da565b85513d5f823e3d90fd5b8351631e4fbdf760e01b81525f6004820152602490fd5b601f909101601f19168101906001600160401b038211908210176200025657604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b0382168203620002045756fe60c060408181526004918236101561011e575b50361561001d575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b1561011a575f82518092630d0e30db60e41b825281839634905af18015610110576100dd575b507fb14ac547961ad218e3240d8c49c21699914ca33bb6320d4f04f5b8e3c38b24359061009f34600754611f5c565b806007558151903482526020820152a17f5c7deee524a744c0cd3c35815dd464867e8d316f081a13a9378d5192cdc56d4d6100d8612542565b9180a2005b6100e8919250611f77565b5f907fb14ac547961ad218e3240d8c49c21699914ca33bb6320d4f04f5b8e3c38b2435610070565b82513d5f823e3d90fd5b5f80fd5b5f60a0525f3560e01c9081630648674014611bec5750806319376fc814611bb15780631c26dc23146119985780632344cdb81461198157806325f17bea14611951578063290e8441146118fc5780632b149796146118a05780632eff30dd146118805780632fe72884146113c45780633580bf68146111815780633979d343146111635780633ace132f14611143578063449757e914611123578063476343ee14610e9b5780635b72a33a14610e5f5780635e2efbe414610d525780636732357414610d3457806368ccaa5214610d0f5780636f01e2bb14610cb9578063715018a614610c5057806373023f1914610c30578063768b5fd514610bd157806379ba509714610b425780638093e66014610b065780638da5cb5b14610adb5780639963fbc2146108f4578063b0468185146108b8578063c140cdd414610898578063c9503fe214610878578063cce7223e14610848578063cdcd897e1461080c578063d09f12a814610696578063d38ea5bf146103e9578063ddb3e096146103b9578063e30c39781461038f578063f2fde38b14610315578063fa10761e146102f55763fea8f23d146102d0575f610012565b346102ef5760a0513660031901126102ef576020906002549051908152f35b60a05180fd5b50346102ef5760a0513660031901126102ef576020906003549051908152f35b82346102ef5760203660031901126102ef57356001600160a01b03818116918290036102ef57610343612658565b816bffffffffffffffffffffffff60a01b600154161760015560a05154167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060a05160a051a360a05180f35b50346102ef5760a0513660031901126102ef5760015490516001600160a01b039091168152602090f35b50346102ef5760203660031901126102ef576020913560a051526010825260ff8160a05120541690519015158152f35b50346102ef57602091826003193601126102ef578035906104086125cc565b158061068d575b61067f578160a05152600e845260ff8360a051205416801561066b575b61065d57610438612542565b906104bf6104b760646104a161047a82610472887f0000000000000000000000000000000000000000000000000000000000000000611f35565b048097611f5c565b957f0000000000000000000000000000000000000000000000000000000000000000611f35565b046104ae81600654611f5c565b60065584612011565b600754611f5c565b6007556104cd600a5461264c565b600a5560a080518490526010865251849020805460ff1916905583516323b872dd60e01b808252338383019081523060208201526040810194909452926001600160a01b039190879082908190606001038160a051867f0000000000000000000000000000000000000000000000000000000000000000165af1801561065157610624575b506005541691823b156102ef57845190815260a05130928201928352336020840152604083018590529092909183919082908190606001039160a051905af1801561061857610602575b507f82979ce06c1fcf7a090707d8fc7123bfa6b69ba161402b0d6c52e052bd97d04b92600754908351928352820152a16105d4612542565b7f5c7deee524a744c0cd3c35815dd464867e8d316f081a13a9378d5192cdc56d4d60a05160a051a260a05180f35b61060b90611f77565b60a0516102ef575f61059c565b83513d60a051823e3d90fd5b61064390873d891161064a575b61063b8183611fd7565b810190611ff9565b505f610552565b503d610631565b86513d60a051823e3d90fd5b8251632f7fe5a760e11b8152fd5b506010845260ff8360a0512054161561042c565b8251635818684f60e11b8152fd5b5080541561040f565b50346102ef576020806003193601126102ef578235908160a05152600d81528260a0512083516106c581611f9f565b815481526001820154958382019687528060028401549387840194855260038101546060850152015496608083019788528560a05152600d85526107248760a0512060045f918281558260018201558260028201558260038201550155565b8051156107fd57514211156107ef57506107ba7ffb6bcaabcd69983c1cb2aafde251ef3771f4f7304d631657cecf54a504a5bbcc96825160a05152600f855261078d8760a051209460ff1995868154169055610781600a5461264c565b600a5551600954612011565b60095580516007549190828111156107e657506107b0825b808352600654611f5c565b6006555190612011565b6007555160a05152601082528360a05120908154169055600754908351928352820152a16105d4612542565b6107b0906107a5565b855163f16664fd60e01b8152fd5b50855163019595ef60e71b8152fd5b50346102ef5760a0513660031901126102ef57602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102ef5760203660031901126102ef576020913560a05152600f825260ff8160a05120541690519015158152f35b50346102ef5760a0513660031901126102ef576020906007549051908152f35b50346102ef5760a0513660031901126102ef576020906008549051908152f35b50346102ef5760a0513660031901126102ef57602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102ef576020806003193601126102ef578235908160a05152600c81528260a051209383519461092586611fbb565b60018060a01b038154168652600180820192865180858782975493848152019060a051528760a051209260a0515b868a838310610ac6575050505061096c92500385611fd7565b8488019384526002830154878901908152600384015460608a015260a06005838601549560808c01968752015499019889528660a05152600c86526109b48860a0512061201e565b805115610ab75751421115610aa9575060a051815b610a4b575b505094610a13610a3592610a067fb48134fe0eed35b1df75b4a0efd22cb7e63e0eddcd8f507dac03f708b772ef519851600854612011565b6008555151600a54611f5c565b600a5580516007549190828111156107e657506107b082808352600654611f5c565b90816007558351928352820152a16105d4612542565b83518051821015610aa35781610a638493849361206c565b5160a05152600e87528860a0512060ff1990818154169055610a8682885161206c565b5160a0515260108852828a60a051209182541617905501906109c9565b506109ce565b865163f16664fd60e01b8152fd5b50865163019595ef60e71b8152fd5b86548552958101958a95509093019201610953565b50346102ef5760a0513660031901126102ef5760a0515490516001600160a01b039091168152602090f35b50346102ef5760a0513660031901126102ef57602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b50346102ef5760a0513660031901126102ef57600154916001600160a01b03913383851603610bba5750506bffffffffffffffffffffffff60a01b8092166001555f549133908316175f553391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a360a05180f35b60249250519063118cdaa760e01b82523390820152fd5b50346102ef5760203660031901126102ef576001600160a01b038235818116939192908490036102ef57610c03612658565b600554928316610c235750506001600160a01b0319161760055560a05180f35b51637b1616c160e11b8152fd5b50346102ef5760a0513660031901126102ef57602090600b549051908152f35b346102ef5760a0513660031901126102ef57610c6a612658565b600180546001600160a01b03199081169091555f80549182168155906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a360a05180f35b50346102ef5760203660031901126102ef577fa085034933f3e07d30f2c527aeff4cba78d6b74c2fa1a91fafdd7b50fd1737099135610cf6612658565b600b549080600b5582519182526020820152a160a05180f35b50346102ef5760a0513660031901126102ef57602090610d2d6125cc565b9051908152f35b50346102ef5760a0513660031901126102ef57602091549051908152f35b50346102ef5760203660031901126102ef5781358015610e5157602081610db194610d7f82600754611f5c565b60075584516323b872dd60e01b8152339181019182523060208301526040820192909252909485918291606090910190565b038160a05160018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af1928315610e45577fb14ac547961ad218e3240d8c49c21699914ca33bb6320d4f04f5b8e3c38b243593610e26575b5060075482519182526020820152a16105d4612542565b610e3e9060203d60201161064a5761063b8183611fd7565b505f610e0f565b82513d60a051823e3d90fd5b505163b4fa3fb360e01b8152fd5b50346102ef5760a0513660031901126102ef57602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5090346102ef5760a0513660031901126102ef5760a051546001600160a01b0391908216331415806110a6575b611098576006549260a051600655610f0d6064610f057f000000000000000000000000000000000000000000000000000000000000000087611f35565b048095612011565b91837f0000000000000000000000000000000000000000000000000000000000000000168251916314e2fc0360e21b835260209586848381847f0000000000000000000000000000000000000000000000000000000000000000165afa93841561105d57610fb498889160a05196611069575b50865163a9059cbb60e01b8082526001600160a01b039097168582019081526020810192909252998a918291604090910190565b038160a051875af197881561105d57879897959697611040575b5060a051548651948552166001600160a01b03169083019081526020810195909552909384919082908190604001039160a051905af19081156110355750611017575b60a05180f35b8161102d92903d1061064a5761063b8183611fd7565b505f80611011565b513d60a051823e3d90fd5b61105690863d881161064a5761063b8183611fd7565b505f610fce565b85513d60a051823e3d90fd5b61108a919650823d8411611091575b6110828183611fd7565b8101906125ad565b945f610f80565b503d611078565b82516330cd747160e01b8152fd5b508251638da5cb5b60e01b815260208183817f000000000000000000000000000000000000000000000000000000000000000087165afa801561111757839160a051916110f8575b5016331415610ec8565b611111915060203d602011611091576110828183611fd7565b5f6110ee565b84513d60a051823e3d90fd5b50346102ef5760a0513660031901126102ef576020906006549051908152f35b50346102ef5760a0513660031901126102ef57602090600a549051908152f35b50346102ef5760a0513660031901126102ef57602090610d2d612542565b50346102ef576020806003193601126102ef578235908160a05152600d81528260a05120938351946111b286611f9f565b8054865260018101548387019081526002820154908688019182528360038401549360608a01948552015460808901528560a05152600d85526112108760a0512060045f918281558260018201558260028201558260038201550155565b5142116113b45760055487516001600160a01b039391841690813b156102ef5788516323b872dd60e01b815260a0513388830190815230602082015260408101939093529092909183919082908190606001039160a051905af180156113a85761138a575b50906112ff976112ba8695949361128f8451600754612011565b9061129d8551600954612011565b6009558051828111156107e657506107b082808352600654611f5c565b6007555160a0805191909152600f855251879020805460ff1916905551865163a9059cbb60e01b81523393810193845260208401919091529687928391829160400190565b039160a051907f0000000000000000000000000000000000000000000000000000000000000000165af1938415610618577fd61b4444fea8d2e412b33dd81153346b9e37988a63f55768da92a5dd9e62bbdd9461136d575b50600754908351928352820152a16105d4612542565b61138390823d841161064a5761063b8183611fd7565b505f611357565b611398909493929194611f77565b60a0516102ef579091925f611275565b88513d60a051823e3d90fd5b85516367bec58d60e01b81528390fd5b50346102ef5760603660031901126102ef5767ffffffffffffffff9082358281116102ef57366023820112156102ef57808401359283116102ef5760248101906005938060051b9160248336920101116102ef576024356080526044359481158015611876575b801561186e575b8015611863575b6118535761144e82611449612542565b611f35565b967f00000000000000000000000000000000000000000000000000000000000000006064036064811161183c5761148789606492611f35565b0496876127106301e133806114c86114a160805186611f35565b7f000000000000000000000000000000000000000000000000000000000000000090611f35565b0404936114d785608051611f5c565b60a0519091905b8781106117235750501161171457600254978860a05152602099600c8b528860a051209261150b8b611f69565b60025583546001600160a01b03191633178455600184016801000000000000000088116117015780548882558089106116db575b50908c94929593918a9060a051528560a051209060a0515b8a81106116c7575050506115b96115936005936116079861157a60649542611f5c565b9a600288019b8c55600388015560805188880155612011565b7f0000000000000000000000000000000000000000000000000000000000000000611f35565b049101556115cb608051600754612011565b6007556115dc608051600854611f5c565b600855875163a9059cbb60e01b81526080513392820192835260208301529283918291604090910190565b038160a05160018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af180156106515790608092916116aa575b5054855196875296860152608085018190526001600160fb1b03106102ef577fe13fe65264cda10c4019015ca6a4ce84737d5eefc23fb7f64a0db2129de8d6199460a093828694868601376080519084015260608301528101030190a160a05180f35b6116c090893d8b1161064a5761063b8183611fd7565b505f611647565b8135818401558f9790910190600101611557565b815f528d5f20908982015b81830181106116f657505061153f565b5f81556001016116e6565b604186634e487b7160e01b5f525260245ffd5b508551630717c22560e51b8152fd5b9091925061173281888b612532565b3560a051526020600f815260ff808c60a051205416908115611819575b5061180957600e90611762838a8d612532565b3560a05152528960a05120600160ff1982541617905560018060a01b0382541661178d82898c612532565b35813b156102ef578b516323b872dd60e01b815260a0513389830190815230602082015260408101939093529092909183919082908190606001039160a051905af180156117fd576117e7575b50600101908a92916114de565b6117f090611f77565b60a0516102ef575f6117da565b8b513d60a051823e3d90fd5b8a516330cd747160e01b81528690fd5b9050611826838a8d612532565b3560a05152601082528b60a0512054165f61174f565b601182634e487b7160e01b60a0515252602460a051fd5b845163b4fa3fb360e01b81528790fd5b50600b548611611439565b508515611432565b506080511561142b565b50346102ef5760a0513660031901126102ef576020906009549051908152f35b5090346102ef5760203660031901126102ef5760a0918135835152600c60205280835120600180851b03815416926002820154926005600384015492840154930154938151958652602086015284015260608301526080820152f35b5090346102ef5760203660031901126102ef5760a0918135835152600d602052808351208054926001820154926002830154916003840154930154938151958652602086015284015260608301526080820152f35b50346102ef5760203660031901126102ef576020913560a05152600e825260ff8160a05120541690519015158152f35b346102ef5761101161199236611f1f565b90612094565b50346102ef576020806003193601126102ef578235908160a05152600f815260ff8360a0512054168015611b9e575b611b8f576119d3612542565b611a5a611a52611a4b6064611a08857f0000000000000000000000000000000000000000000000000000000000000000611f35565b046064611a35827f0000000000000000000000000000000000000000000000000000000000000000611f35565b0494611a4386600654611f5c565b600655612011565b9283611f5c565b600754612011565b600755611a68600a54611f69565b600a5560a080518490526010835251849020805460ff191660011790556005546001600160a01b0395908616803b156102ef5785516323b872dd60e01b815260a05133848301908152306020820152604081018890529192909183919082908190606001039160a051905af1801561065157611b75575b50845163a9059cbb60e01b815233918101918252602082019290925260a051919583928792839003604001918391907f0000000000000000000000000000000000000000000000000000000000000000165af1938415610618577fba67a4588a1e4022f582e72664173f041eca52d2e23f10c660c23de58aa952a49461136d5750600754908351928352820152a16105d4612542565b611b8190929192611f77565b60a0516102ef57905f611adf565b5050516330cd747160e01b8152fd5b506010815260ff8360a0512054166119c7565b5090346102ef5760203660031901126102ef57803591611bcf612658565b8215611bdf5750556105d4612542565b51635818684f60e11b8152fd5b8391503461011a57611bfd36611f1f565b9182158015611f14575b611f065750805f52602091600e835260ff855f2054168015611ef4575b8015611ee3575b611ed357611c376125cc565b1580611eca575b611eba57611c4a612542565b90611c75827f0000000000000000000000000000000000000000000000000000000000000000611f35565b606490049182611c8491611f5c565b94611c8f8683611f35565b7f0000000000000000000000000000000000000000000000000000000000000000611cb991611f35565b6301e133809004612710900495611cd08782611f5c565b928260035498895f52600d89528a5f2092885f52600f8a528b5f2060ff198154166001179055600354611d0290611f69565b600355888455611d129042611f5c565b96600184019788558460028501557f000000000000000000000000000000000000000000000000000000000000000091611d4c9083611f35565b606490046003850155611d5e91611f35565b606490049101558260075490611d7391611f5c565b60075560095490611d8391611f5c565b60095586516323b872dd60e01b808252338383019081523060208201526040810194909452926001600160a01b0391908790829081906060010381857f0000000000000000000000000000000000000000000000000000000000000000165a905f91f18015611eb057611e93575b506005541691823b1561011a5787519081523091810191825233602083015260408201859052915f9183919082908490829060600103925af18015611e8957916060959493917f5f9fc3b6724eaf6e1d678aa59735eb5dca41b0c46566d1d80a39ef257cecbfab9793611e76575b5054928251948552840152820152a16105d4612542565b611e7f90611f77565b5f60a05287611e5f565b86513d5f823e3d90fd5b611ea990873d891161064a5761063b8183611fd7565b5088611df1565b89513d5f823e3d90fd5b8451635818684f60e11b81528490fd5b50835415611c3e565b8451632f7fe5a760e11b81528490fd5b50600f835260ff855f205416611c2b565b506010835260ff855f20541615611c24565b63b4fa3fb360e01b81528390fd5b50600b548311611c07565b604090600319011261011a576004359060243590565b81810292918115918404141715611f4857565b634e487b7160e01b5f52601160045260245ffd5b91908201809211611f4857565b5f198114611f485760010190565b67ffffffffffffffff8111611f8b57604052565b634e487b7160e01b5f52604160045260245ffd5b60a0810190811067ffffffffffffffff821117611f8b57604052565b60c0810190811067ffffffffffffffff821117611f8b57604052565b90601f8019910116810190811067ffffffffffffffff821117611f8b57604052565b9081602091031261011a5751801515810361011a5790565b91908203918211611f4857565b5f815560018082018054905f81558161204f575b5050506005815f6002819401558260038201558260048201550155565b5f5260205f20908101905b81811015612032575f8155820161205a565b80518210156120805760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b90801561252057815f52602091600c83526040805f20918151926120b784611fbb565b80546001600160a01b0390811685528351600183810180548084525f9182528a8220949892949184918c830191878e5b83831061250957505050506120fe92500383611fd7565b88810191825260028401549687878301526003850154946060830195865260049889820154906080850191825260058093015460a086015242116124f9576121498751825190611f5c565b808c116124e95789516323b872dd60e01b80825233828e01908152306020820152604081018f90529097969594939291908f908290819060600103815f897f0000000000000000000000000000000000000000000000000000000000000000165af180156124df578f90918f9b9a99989796959493926124c1575b5050808a1461233f575050505050505050805180612243575b505094600c916121f36122139697600754611f5c565b60075561220287600854612011565b6008555f52525f2001918254612011565b905561221d612542565b7f5c7deee524a744c0cd3c35815dd464867e8d316f081a13a9378d5192cdc56d4d5f80a2565b909591508111156122c65794600c916121f36122b987986122b1606461228d6122139b517f0000000000000000000000000000000000000000000000000000000000000000611f35565b04855f528787525f60038a822001556122a881600654611f5c565b60065582612011565b995190612011565b97929796508193506121dd565b92509250600361232a91600c6123349661231b6064612305887f0000000000000000000000000000000000000000000000000000000000000000611f35565b0461231281600654611f5c565b60065587612011565b965f52525f2001918254612011565b9055600754611f5c565b60075561221d612542565b879f9e9b9d508a9c99506104b79060648f6123aa949597999b8f6123b6989a9c9f92600c6123759261239c955f52525f2061201e565b517f0000000000000000000000000000000000000000000000000000000000000000611f35565b0490611a4382600654611f5c565b60075551600854612011565b6008555f9b5b612401575b505050505050507fffec0aa0d99176f33d39fe7c559b8b7ba66a711b085f41b1bff822b2b4b9534e939450600754908351928352820152a161221d612542565b839a999897969a5180518d10156124b5578c61241c9161206c565b515f52600e8752885f2060ff198154169055818154169b828451169c61244382875161206c565b519d813b1561011a578b51888152308a82019081526001600160a01b039092166020830152604082019f909f528e90819060600103815a5f948591f180156124ab57908c9d8d999a9b9c9d9261249c575b50019b6123bc565b6124a590611f77565b5f612494565b8a513d5f823e3d90fd5b50869798999a506123c1565b816124d792903d1061064a5761063b8183611fd7565b508e5f6121c4565b8c513d5f823e3d90fd5b895163162908e360e11b81528b90fd5b88516367bec58d60e01b81528a90fd5b86548552958101958895509093019201878e6120e7565b60405163b4fa3fb360e01b8152600490fd5b91908110156120805760051b0190565b600754600854906009546125546125cc565b928315928361258d57612570929161256b91611f5c565b612011565b90612579570490565b634e487b7160e01b5f52601260045260245ffd5b6125aa94506125a193509061256b91611f5c565b60045490611f5c565b90565b9081602091031261011a57516001600160a01b038116810361011a5790565b6005546040516318160ddd60e01b815290602090829060049082906001600160a01b03165afa8015612641575f9061260d575b6125aa9150600a5490612011565b506020813d602011612639575b8161262760209383611fd7565b8101031261011a576125aa90516125ff565b3d915061261a565b6040513d5f823e3d90fd5b8015611f48575f190190565b5f546001600160a01b0316330361266b57565b60405163118cdaa760e01b8152336004820152602490fdfea2646970667358221220461937da20028fcfb7c1ac019ea77751bcfc87301625206dde03493db7e73d1b64736f6c634300081800330000000000000000000000009e1d441285f098d598f4d0c226d9c7f3b224682f000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001a4

Deployed Bytecode

0x60c060408181526004918236101561011e575b50361561001d575f80fd5b7f00000000000000000000000069696969696969696969696969696969696969696001600160a01b031691823b1561011a575f82518092630d0e30db60e41b825281839634905af18015610110576100dd575b507fb14ac547961ad218e3240d8c49c21699914ca33bb6320d4f04f5b8e3c38b24359061009f34600754611f5c565b806007558151903482526020820152a17f5c7deee524a744c0cd3c35815dd464867e8d316f081a13a9378d5192cdc56d4d6100d8612542565b9180a2005b6100e8919250611f77565b5f907fb14ac547961ad218e3240d8c49c21699914ca33bb6320d4f04f5b8e3c38b2435610070565b82513d5f823e3d90fd5b5f80fd5b5f60a0525f3560e01c9081630648674014611bec5750806319376fc814611bb15780631c26dc23146119985780632344cdb81461198157806325f17bea14611951578063290e8441146118fc5780632b149796146118a05780632eff30dd146118805780632fe72884146113c45780633580bf68146111815780633979d343146111635780633ace132f14611143578063449757e914611123578063476343ee14610e9b5780635b72a33a14610e5f5780635e2efbe414610d525780636732357414610d3457806368ccaa5214610d0f5780636f01e2bb14610cb9578063715018a614610c5057806373023f1914610c30578063768b5fd514610bd157806379ba509714610b425780638093e66014610b065780638da5cb5b14610adb5780639963fbc2146108f4578063b0468185146108b8578063c140cdd414610898578063c9503fe214610878578063cce7223e14610848578063cdcd897e1461080c578063d09f12a814610696578063d38ea5bf146103e9578063ddb3e096146103b9578063e30c39781461038f578063f2fde38b14610315578063fa10761e146102f55763fea8f23d146102d0575f610012565b346102ef5760a0513660031901126102ef576020906002549051908152f35b60a05180fd5b50346102ef5760a0513660031901126102ef576020906003549051908152f35b82346102ef5760203660031901126102ef57356001600160a01b03818116918290036102ef57610343612658565b816bffffffffffffffffffffffff60a01b600154161760015560a05154167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060a05160a051a360a05180f35b50346102ef5760a0513660031901126102ef5760015490516001600160a01b039091168152602090f35b50346102ef5760203660031901126102ef576020913560a051526010825260ff8160a05120541690519015158152f35b50346102ef57602091826003193601126102ef578035906104086125cc565b158061068d575b61067f578160a05152600e845260ff8360a051205416801561066b575b61065d57610438612542565b906104bf6104b760646104a161047a82610472887f0000000000000000000000000000000000000000000000000000000000000004611f35565b048097611f5c565b957f0000000000000000000000000000000000000000000000000000000000000004611f35565b046104ae81600654611f5c565b60065584612011565b600754611f5c565b6007556104cd600a5461264c565b600a5560a080518490526010865251849020805460ff1916905583516323b872dd60e01b808252338383019081523060208201526040810194909452926001600160a01b039190879082908190606001038160a051867f0000000000000000000000006969696969696969696969696969696969696969165af1801561065157610624575b506005541691823b156102ef57845190815260a05130928201928352336020840152604083018590529092909183919082908190606001039160a051905af1801561061857610602575b507f82979ce06c1fcf7a090707d8fc7123bfa6b69ba161402b0d6c52e052bd97d04b92600754908351928352820152a16105d4612542565b7f5c7deee524a744c0cd3c35815dd464867e8d316f081a13a9378d5192cdc56d4d60a05160a051a260a05180f35b61060b90611f77565b60a0516102ef575f61059c565b83513d60a051823e3d90fd5b61064390873d891161064a575b61063b8183611fd7565b810190611ff9565b505f610552565b503d610631565b86513d60a051823e3d90fd5b8251632f7fe5a760e11b8152fd5b506010845260ff8360a0512054161561042c565b8251635818684f60e11b8152fd5b5080541561040f565b50346102ef576020806003193601126102ef578235908160a05152600d81528260a0512083516106c581611f9f565b815481526001820154958382019687528060028401549387840194855260038101546060850152015496608083019788528560a05152600d85526107248760a0512060045f918281558260018201558260028201558260038201550155565b8051156107fd57514211156107ef57506107ba7ffb6bcaabcd69983c1cb2aafde251ef3771f4f7304d631657cecf54a504a5bbcc96825160a05152600f855261078d8760a051209460ff1995868154169055610781600a5461264c565b600a5551600954612011565b60095580516007549190828111156107e657506107b0825b808352600654611f5c565b6006555190612011565b6007555160a05152601082528360a05120908154169055600754908351928352820152a16105d4612542565b6107b0906107a5565b855163f16664fd60e01b8152fd5b50855163019595ef60e71b8152fd5b50346102ef5760a0513660031901126102ef57602090517f00000000000000000000000000000000000000000000000000000000000000048152f35b50346102ef5760203660031901126102ef576020913560a05152600f825260ff8160a05120541690519015158152f35b50346102ef5760a0513660031901126102ef576020906007549051908152f35b50346102ef5760a0513660031901126102ef576020906008549051908152f35b50346102ef5760a0513660031901126102ef57602090517f00000000000000000000000000000000000000000000000000000000000000048152f35b50346102ef576020806003193601126102ef578235908160a05152600c81528260a051209383519461092586611fbb565b60018060a01b038154168652600180820192865180858782975493848152019060a051528760a051209260a0515b868a838310610ac6575050505061096c92500385611fd7565b8488019384526002830154878901908152600384015460608a015260a06005838601549560808c01968752015499019889528660a05152600c86526109b48860a0512061201e565b805115610ab75751421115610aa9575060a051815b610a4b575b505094610a13610a3592610a067fb48134fe0eed35b1df75b4a0efd22cb7e63e0eddcd8f507dac03f708b772ef519851600854612011565b6008555151600a54611f5c565b600a5580516007549190828111156107e657506107b082808352600654611f5c565b90816007558351928352820152a16105d4612542565b83518051821015610aa35781610a638493849361206c565b5160a05152600e87528860a0512060ff1990818154169055610a8682885161206c565b5160a0515260108852828a60a051209182541617905501906109c9565b506109ce565b865163f16664fd60e01b8152fd5b50865163019595ef60e71b8152fd5b86548552958101958a95509093019201610953565b50346102ef5760a0513660031901126102ef5760a0515490516001600160a01b039091168152602090f35b50346102ef5760a0513660031901126102ef57602090517f000000000000000000000000000000000000000000000000000000000000000a8152f35b50346102ef5760a0513660031901126102ef57600154916001600160a01b03913383851603610bba5750506bffffffffffffffffffffffff60a01b8092166001555f549133908316175f553391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a360a05180f35b60249250519063118cdaa760e01b82523390820152fd5b50346102ef5760203660031901126102ef576001600160a01b038235818116939192908490036102ef57610c03612658565b600554928316610c235750506001600160a01b0319161760055560a05180f35b51637b1616c160e11b8152fd5b50346102ef5760a0513660031901126102ef57602090600b549051908152f35b346102ef5760a0513660031901126102ef57610c6a612658565b600180546001600160a01b03199081169091555f80549182168155906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a360a05180f35b50346102ef5760203660031901126102ef577fa085034933f3e07d30f2c527aeff4cba78d6b74c2fa1a91fafdd7b50fd1737099135610cf6612658565b600b549080600b5582519182526020820152a160a05180f35b50346102ef5760a0513660031901126102ef57602090610d2d6125cc565b9051908152f35b50346102ef5760a0513660031901126102ef57602091549051908152f35b50346102ef5760203660031901126102ef5781358015610e5157602081610db194610d7f82600754611f5c565b60075584516323b872dd60e01b8152339181019182523060208301526040820192909252909485918291606090910190565b038160a05160018060a01b037f0000000000000000000000006969696969696969696969696969696969696969165af1928315610e45577fb14ac547961ad218e3240d8c49c21699914ca33bb6320d4f04f5b8e3c38b243593610e26575b5060075482519182526020820152a16105d4612542565b610e3e9060203d60201161064a5761063b8183611fd7565b505f610e0f565b82513d60a051823e3d90fd5b505163b4fa3fb360e01b8152fd5b50346102ef5760a0513660031901126102ef57602090517f00000000000000000000000000000000000000000000000000000000000001a48152f35b5090346102ef5760a0513660031901126102ef5760a051546001600160a01b0391908216331415806110a6575b611098576006549260a051600655610f0d6064610f057f000000000000000000000000000000000000000000000000000000000000000a87611f35565b048095612011565b91837f0000000000000000000000006969696969696969696969696969696969696969168251916314e2fc0360e21b835260209586848381847f0000000000000000000000009e1d441285f098d598f4d0c226d9c7f3b224682f165afa93841561105d57610fb498889160a05196611069575b50865163a9059cbb60e01b8082526001600160a01b039097168582019081526020810192909252998a918291604090910190565b038160a051875af197881561105d57879897959697611040575b5060a051548651948552166001600160a01b03169083019081526020810195909552909384919082908190604001039160a051905af19081156110355750611017575b60a05180f35b8161102d92903d1061064a5761063b8183611fd7565b505f80611011565b513d60a051823e3d90fd5b61105690863d881161064a5761063b8183611fd7565b505f610fce565b85513d60a051823e3d90fd5b61108a919650823d8411611091575b6110828183611fd7565b8101906125ad565b945f610f80565b503d611078565b82516330cd747160e01b8152fd5b508251638da5cb5b60e01b815260208183817f0000000000000000000000009e1d441285f098d598f4d0c226d9c7f3b224682f87165afa801561111757839160a051916110f8575b5016331415610ec8565b611111915060203d602011611091576110828183611fd7565b5f6110ee565b84513d60a051823e3d90fd5b50346102ef5760a0513660031901126102ef576020906006549051908152f35b50346102ef5760a0513660031901126102ef57602090600a549051908152f35b50346102ef5760a0513660031901126102ef57602090610d2d612542565b50346102ef576020806003193601126102ef578235908160a05152600d81528260a05120938351946111b286611f9f565b8054865260018101548387019081526002820154908688019182528360038401549360608a01948552015460808901528560a05152600d85526112108760a0512060045f918281558260018201558260028201558260038201550155565b5142116113b45760055487516001600160a01b039391841690813b156102ef5788516323b872dd60e01b815260a0513388830190815230602082015260408101939093529092909183919082908190606001039160a051905af180156113a85761138a575b50906112ff976112ba8695949361128f8451600754612011565b9061129d8551600954612011565b6009558051828111156107e657506107b082808352600654611f5c565b6007555160a0805191909152600f855251879020805460ff1916905551865163a9059cbb60e01b81523393810193845260208401919091529687928391829160400190565b039160a051907f0000000000000000000000006969696969696969696969696969696969696969165af1938415610618577fd61b4444fea8d2e412b33dd81153346b9e37988a63f55768da92a5dd9e62bbdd9461136d575b50600754908351928352820152a16105d4612542565b61138390823d841161064a5761063b8183611fd7565b505f611357565b611398909493929194611f77565b60a0516102ef579091925f611275565b88513d60a051823e3d90fd5b85516367bec58d60e01b81528390fd5b50346102ef5760603660031901126102ef5767ffffffffffffffff9082358281116102ef57366023820112156102ef57808401359283116102ef5760248101906005938060051b9160248336920101116102ef576024356080526044359481158015611876575b801561186e575b8015611863575b6118535761144e82611449612542565b611f35565b967f00000000000000000000000000000000000000000000000000000000000000046064036064811161183c5761148789606492611f35565b0496876127106301e133806114c86114a160805186611f35565b7f00000000000000000000000000000000000000000000000000000000000001a490611f35565b0404936114d785608051611f5c565b60a0519091905b8781106117235750501161171457600254978860a05152602099600c8b528860a051209261150b8b611f69565b60025583546001600160a01b03191633178455600184016801000000000000000088116117015780548882558089106116db575b50908c94929593918a9060a051528560a051209060a0515b8a81106116c7575050506115b96115936005936116079861157a60649542611f5c565b9a600288019b8c55600388015560805188880155612011565b7f0000000000000000000000000000000000000000000000000000000000000004611f35565b049101556115cb608051600754612011565b6007556115dc608051600854611f5c565b600855875163a9059cbb60e01b81526080513392820192835260208301529283918291604090910190565b038160a05160018060a01b037f0000000000000000000000006969696969696969696969696969696969696969165af180156106515790608092916116aa575b5054855196875296860152608085018190526001600160fb1b03106102ef577fe13fe65264cda10c4019015ca6a4ce84737d5eefc23fb7f64a0db2129de8d6199460a093828694868601376080519084015260608301528101030190a160a05180f35b6116c090893d8b1161064a5761063b8183611fd7565b505f611647565b8135818401558f9790910190600101611557565b815f528d5f20908982015b81830181106116f657505061153f565b5f81556001016116e6565b604186634e487b7160e01b5f525260245ffd5b508551630717c22560e51b8152fd5b9091925061173281888b612532565b3560a051526020600f815260ff808c60a051205416908115611819575b5061180957600e90611762838a8d612532565b3560a05152528960a05120600160ff1982541617905560018060a01b0382541661178d82898c612532565b35813b156102ef578b516323b872dd60e01b815260a0513389830190815230602082015260408101939093529092909183919082908190606001039160a051905af180156117fd576117e7575b50600101908a92916114de565b6117f090611f77565b60a0516102ef575f6117da565b8b513d60a051823e3d90fd5b8a516330cd747160e01b81528690fd5b9050611826838a8d612532565b3560a05152601082528b60a0512054165f61174f565b601182634e487b7160e01b60a0515252602460a051fd5b845163b4fa3fb360e01b81528790fd5b50600b548611611439565b508515611432565b506080511561142b565b50346102ef5760a0513660031901126102ef576020906009549051908152f35b5090346102ef5760203660031901126102ef5760a0918135835152600c60205280835120600180851b03815416926002820154926005600384015492840154930154938151958652602086015284015260608301526080820152f35b5090346102ef5760203660031901126102ef5760a0918135835152600d602052808351208054926001820154926002830154916003840154930154938151958652602086015284015260608301526080820152f35b50346102ef5760203660031901126102ef576020913560a05152600e825260ff8160a05120541690519015158152f35b346102ef5761101161199236611f1f565b90612094565b50346102ef576020806003193601126102ef578235908160a05152600f815260ff8360a0512054168015611b9e575b611b8f576119d3612542565b611a5a611a52611a4b6064611a08857f0000000000000000000000000000000000000000000000000000000000000004611f35565b046064611a35827f0000000000000000000000000000000000000000000000000000000000000004611f35565b0494611a4386600654611f5c565b600655612011565b9283611f5c565b600754612011565b600755611a68600a54611f69565b600a5560a080518490526010835251849020805460ff191660011790556005546001600160a01b0395908616803b156102ef5785516323b872dd60e01b815260a05133848301908152306020820152604081018890529192909183919082908190606001039160a051905af1801561065157611b75575b50845163a9059cbb60e01b815233918101918252602082019290925260a051919583928792839003604001918391907f0000000000000000000000006969696969696969696969696969696969696969165af1938415610618577fba67a4588a1e4022f582e72664173f041eca52d2e23f10c660c23de58aa952a49461136d5750600754908351928352820152a16105d4612542565b611b8190929192611f77565b60a0516102ef57905f611adf565b5050516330cd747160e01b8152fd5b506010815260ff8360a0512054166119c7565b5090346102ef5760203660031901126102ef57803591611bcf612658565b8215611bdf5750556105d4612542565b51635818684f60e11b8152fd5b8391503461011a57611bfd36611f1f565b9182158015611f14575b611f065750805f52602091600e835260ff855f2054168015611ef4575b8015611ee3575b611ed357611c376125cc565b1580611eca575b611eba57611c4a612542565b90611c75827f0000000000000000000000000000000000000000000000000000000000000004611f35565b606490049182611c8491611f5c565b94611c8f8683611f35565b7f00000000000000000000000000000000000000000000000000000000000001a4611cb991611f35565b6301e133809004612710900495611cd08782611f5c565b928260035498895f52600d89528a5f2092885f52600f8a528b5f2060ff198154166001179055600354611d0290611f69565b600355888455611d129042611f5c565b96600184019788558460028501557f000000000000000000000000000000000000000000000000000000000000000491611d4c9083611f35565b606490046003850155611d5e91611f35565b606490049101558260075490611d7391611f5c565b60075560095490611d8391611f5c565b60095586516323b872dd60e01b808252338383019081523060208201526040810194909452926001600160a01b0391908790829081906060010381857f0000000000000000000000006969696969696969696969696969696969696969165a905f91f18015611eb057611e93575b506005541691823b1561011a5787519081523091810191825233602083015260408201859052915f9183919082908490829060600103925af18015611e8957916060959493917f5f9fc3b6724eaf6e1d678aa59735eb5dca41b0c46566d1d80a39ef257cecbfab9793611e76575b5054928251948552840152820152a16105d4612542565b611e7f90611f77565b5f60a05287611e5f565b86513d5f823e3d90fd5b611ea990873d891161064a5761063b8183611fd7565b5088611df1565b89513d5f823e3d90fd5b8451635818684f60e11b81528490fd5b50835415611c3e565b8451632f7fe5a760e11b81528490fd5b50600f835260ff855f205416611c2b565b506010835260ff855f20541615611c24565b63b4fa3fb360e01b81528390fd5b50600b548311611c07565b604090600319011261011a576004359060243590565b81810292918115918404141715611f4857565b634e487b7160e01b5f52601160045260245ffd5b91908201809211611f4857565b5f198114611f485760010190565b67ffffffffffffffff8111611f8b57604052565b634e487b7160e01b5f52604160045260245ffd5b60a0810190811067ffffffffffffffff821117611f8b57604052565b60c0810190811067ffffffffffffffff821117611f8b57604052565b90601f8019910116810190811067ffffffffffffffff821117611f8b57604052565b9081602091031261011a5751801515810361011a5790565b91908203918211611f4857565b5f815560018082018054905f81558161204f575b5050506005815f6002819401558260038201558260048201550155565b5f5260205f20908101905b81811015612032575f8155820161205a565b80518210156120805760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b90801561252057815f52602091600c83526040805f20918151926120b784611fbb565b80546001600160a01b0390811685528351600183810180548084525f9182528a8220949892949184918c830191878e5b83831061250957505050506120fe92500383611fd7565b88810191825260028401549687878301526003850154946060830195865260049889820154906080850191825260058093015460a086015242116124f9576121498751825190611f5c565b808c116124e95789516323b872dd60e01b80825233828e01908152306020820152604081018f90529097969594939291908f908290819060600103815f897f0000000000000000000000006969696969696969696969696969696969696969165af180156124df578f90918f9b9a99989796959493926124c1575b5050808a1461233f575050505050505050805180612243575b505094600c916121f36122139697600754611f5c565b60075561220287600854612011565b6008555f52525f2001918254612011565b905561221d612542565b7f5c7deee524a744c0cd3c35815dd464867e8d316f081a13a9378d5192cdc56d4d5f80a2565b909591508111156122c65794600c916121f36122b987986122b1606461228d6122139b517f0000000000000000000000000000000000000000000000000000000000000004611f35565b04855f528787525f60038a822001556122a881600654611f5c565b60065582612011565b995190612011565b97929796508193506121dd565b92509250600361232a91600c6123349661231b6064612305887f0000000000000000000000000000000000000000000000000000000000000004611f35565b0461231281600654611f5c565b60065587612011565b965f52525f2001918254612011565b9055600754611f5c565b60075561221d612542565b879f9e9b9d508a9c99506104b79060648f6123aa949597999b8f6123b6989a9c9f92600c6123759261239c955f52525f2061201e565b517f0000000000000000000000000000000000000000000000000000000000000004611f35565b0490611a4382600654611f5c565b60075551600854612011565b6008555f9b5b612401575b505050505050507fffec0aa0d99176f33d39fe7c559b8b7ba66a711b085f41b1bff822b2b4b9534e939450600754908351928352820152a161221d612542565b839a999897969a5180518d10156124b5578c61241c9161206c565b515f52600e8752885f2060ff198154169055818154169b828451169c61244382875161206c565b519d813b1561011a578b51888152308a82019081526001600160a01b039092166020830152604082019f909f528e90819060600103815a5f948591f180156124ab57908c9d8d999a9b9c9d9261249c575b50019b6123bc565b6124a590611f77565b5f612494565b8a513d5f823e3d90fd5b50869798999a506123c1565b816124d792903d1061064a5761063b8183611fd7565b508e5f6121c4565b8c513d5f823e3d90fd5b895163162908e360e11b81528b90fd5b88516367bec58d60e01b81528a90fd5b86548552958101958895509093019201878e6120e7565b60405163b4fa3fb360e01b8152600490fd5b91908110156120805760051b0190565b600754600854906009546125546125cc565b928315928361258d57612570929161256b91611f5c565b612011565b90612579570490565b634e487b7160e01b5f52601260045260245ffd5b6125aa94506125a193509061256b91611f5c565b60045490611f5c565b90565b9081602091031261011a57516001600160a01b038116810361011a5790565b6005546040516318160ddd60e01b815290602090829060049082906001600160a01b03165afa8015612641575f9061260d575b6125aa9150600a5490612011565b506020813d602011612639575b8161262760209383611fd7565b8101031261011a576125aa90516125ff565b3d915061261a565b6040513d5f823e3d90fd5b8015611f48575f190190565b5f546001600160a01b0316330361266b57565b60405163118cdaa760e01b8152336004820152602490fdfea2646970667358221220461937da20028fcfb7c1ac019ea77751bcfc87301625206dde03493db7e73d1b64736f6c63430008180033

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

0000000000000000000000009e1d441285f098d598f4d0c226d9c7f3b224682f000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001a4

-----Decoded View---------------
Arg [0] : beraMarketMinter_ (address): 0x9e1D441285F098d598F4d0C226d9c7F3b224682F
Arg [1] : beraMarketFeePercent_ (uint256): 10
Arg [2] : creatorPercent_ (uint256): 4
Arg [3] : royaltyPercent_ (uint256): 4
Arg [4] : interestRate_ (uint256): 420

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000009e1d441285f098d598f4d0c226d9c7f3b224682f
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001a4


Block Transaction 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
[ 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.