More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 37 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Purchase Item | 4060088 | 16 hrs ago | IN | 0 BERA | 0.00102114 | ||||
Redeem Item | 4060079 | 16 hrs ago | IN | 0 BERA | 0.00165386 | ||||
Purchase Item | 4059893 | 16 hrs ago | IN | 0 BERA | 0.00102114 | ||||
Backing Loan Exp... | 4059880 | 16 hrs ago | IN | 0 BERA | 0.00108522 | ||||
Receive Loan | 4059870 | 16 hrs ago | IN | 0 BERA | 0.0032494 | ||||
Purchase Item | 4059714 | 17 hrs ago | IN | 0 BERA | 0.00102114 | ||||
Purchase Item | 4059688 | 17 hrs ago | IN | 0 BERA | 0.00068855 | ||||
Purchase Item | 4059684 | 17 hrs ago | IN | 0 BERA | 0.00068855 | ||||
Backing Loan Exp... | 4059676 | 17 hrs ago | IN | 0 BERA | 0.00106282 | ||||
Receive Loan | 4059660 | 17 hrs ago | IN | 0 BERA | 0.00305014 | ||||
Purchase Item | 4059431 | 17 hrs ago | IN | 0 BERA | 0.00102114 | ||||
Backing Loan Exp... | 4059422 | 17 hrs ago | IN | 0 BERA | 0.00106282 | ||||
Receive Loan | 4059411 | 17 hrs ago | IN | 0 BERA | 0.00305014 | ||||
Purchase Item | 4055880 | 19 hrs ago | IN | 0 BERA | 0.00036119 | ||||
Pay Loan Back | 4026393 | 35 hrs ago | IN | 0 BERA | 0.00138809 | ||||
Receive Loan | 4026387 | 35 hrs ago | IN | 0 BERA | 0.00390489 | ||||
Pay Loan Back | 4026368 | 35 hrs ago | IN | 0 BERA | 0.00138809 | ||||
Receive Loan | 4026353 | 35 hrs ago | IN | 0 BERA | 0.00390489 | ||||
Pay Loan Back | 4026301 | 35 hrs ago | IN | 0 BERA | 0.00138809 | ||||
Receive Loan | 4026187 | 35 hrs ago | IN | 0 BERA | 0.00390489 | ||||
Pay Loan Back | 4026149 | 35 hrs ago | IN | 0 BERA | 0.00118135 | ||||
Pay Loan Back | 4026079 | 35 hrs ago | IN | 0 BERA | 0.00180158 | ||||
Receive Loan | 4026007 | 35 hrs ago | IN | 0 BERA | 0.00290785 | ||||
Receive Loan | 4025788 | 35 hrs ago | IN | 0 BERA | 0.00521466 | ||||
Pay Loan Back | 4024756 | 36 hrs ago | IN | 0 BERA | 0.00131817 |
Latest 9 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
4089842 | 32 mins ago | 1,347.95884236 BERA | ||||
4089842 | 32 mins ago | 1,347.95884236 BERA | ||||
4010015 | 44 hrs ago | 3,425.77824 BERA | ||||
4010015 | 44 hrs ago | 3,425.77824 BERA | ||||
4009288 | 44 hrs ago | 69 BERA | ||||
4009288 | 44 hrs ago | 69 BERA | ||||
4008114 | 45 hrs ago | 0.69 BERA | ||||
4008114 | 45 hrs ago | 0.69 BERA | ||||
3984444 | 2 days ago | 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
Contract Source Code (Solidity Standard Json-Input format)
// 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()); } }
// 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); } }
// 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); }
// 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); }
// 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.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); }
{ "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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BERA | 100.00% | $3.61 | 4,845.6007 | $17,492.62 |
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.