From ece8fa1c9eece89f92073510b97bfc98f261da54 Mon Sep 17 00:00:00 2001 From: Jonathan Perkins Date: Mon, 9 Mar 2026 14:45:38 -0400 Subject: [PATCH 1/2] feat: migrate percentages from uint8 to uint16 basis points MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - All percentage fields: uint8 (0-100) → uint16 (0-10000) basis points - All fee math: / 100 → / 10000 - Split ratio arrays: uint8[] → uint16[], sum validation == 10000 - MarketplaceSettings defaults: 0 (protocol base fee; RareAppRegistry handles app fees) - RoyaltyRegistry default: 1000 (10%) - ERC2981, SovereignNFT, LazySovereignNFT: royalty in basis points - Updated interfaces, implementations, tests, and deployment scripts Made-with: Cursor --- .../RareBatchAuctionHouseSeedSepolia.s.sol | 4 +- src/auctionhouse/ISuperRareAuctionHouse.sol | 6 +- src/auctionhouse/SuperRareAuctionHouse.sol | 8 +- src/batchoffer/BatchOffer.sol | 2 +- src/bazaar/ISuperRareBazaar.sol | 12 +-- src/bazaar/SuperRareBazaar.sol | 18 ++-- src/bazaar/SuperRareBazaarBase.sol | 26 +++--- src/bazaar/SuperRareBazaarStorage.sol | 16 ++-- src/collection/IRareCollectionMarket.sol | 6 +- src/collection/IRareMinter.sol | 6 +- src/collection/RareCollectionMarket.sol | 6 +- src/collection/RareMinter.sol | 2 +- src/marketplace/IMarketplaceSettings.sol | 14 +-- src/marketplace/IStakingSettings.sol | 6 +- src/marketplace/ISuperRareMarketplace.sol | 4 +- src/marketplace/MarketplaceSettingsV1.sol | 50 +++++------ src/marketplace/MarketplaceSettingsV2.sol | 26 +++--- src/marketplace/MarketplaceSettingsV3.sol | 36 ++++---- src/marketplace/SuperRareMarketplace.sol | 8 +- src/registry/RoyaltyRegistry.sol | 18 ++-- src/registry/SpaceOperatorRegistry.sol | 6 +- .../interfaces/IRareRoyaltyRegistry.sol | 8 +- .../interfaces/ISpaceOperatorRegistry.sol | 4 +- src/test/batchoffer/BatchOffer.t.sol | 12 +-- src/test/bazaar/BazaarBase.t.sol | 46 +++++----- src/test/bazaar/SuperRareBazaar.t.sol | 46 ++-------- .../collection/RareCollectionMarket.t.sol | 80 ++++++++--------- src/test/collection/RareMinter.t.sol | 58 +++++++------ .../SuperRareBazaarAuctionUpgrade.t.sol | 8 +- .../marketplace/MarketplaceSettingsV2.t.sol | 9 +- src/test/utils/MarketUtils.t.sol | 46 +++++----- .../auctionhouse/RareBatchAuctionHouse.t.sol | 38 ++++---- .../RareBatchListingMarketplace.t.sol | 18 ++-- src/test/v2/utils/MarketUtilsV2.t.sol | 86 +++++++++---------- src/token/ERC721/sovereign/SovereignNFT.sol | 2 +- .../sovereign/lazy/LazySovereignNFT.sol | 2 +- src/token/extensions/ERC2981Upgradeable.sol | 2 +- src/utils/MarketUtils.sol | 26 +++--- .../auctionhouse/IRareBatchAuctionHouse.sol | 16 ++-- src/v2/auctionhouse/RareBatchAuctionHouse.sol | 18 ++-- .../IRareBatchListingMarketplace.sol | 4 +- .../RareBatchListingMarketplace.sol | 2 +- .../ERC721/sovereign/SovereignBatchMint.sol | 2 +- src/v2/utils/MarketUtilsV2.sol | 34 ++++---- 44 files changed, 412 insertions(+), 435 deletions(-) diff --git a/script/auctionhouse/rare-batch-auctionhouse-seed-sepolia/RareBatchAuctionHouseSeedSepolia.s.sol b/script/auctionhouse/rare-batch-auctionhouse-seed-sepolia/RareBatchAuctionHouseSeedSepolia.s.sol index 845fa02..84f6187 100644 --- a/script/auctionhouse/rare-batch-auctionhouse-seed-sepolia/RareBatchAuctionHouseSeedSepolia.s.sol +++ b/script/auctionhouse/rare-batch-auctionhouse-seed-sepolia/RareBatchAuctionHouseSeedSepolia.s.sol @@ -62,8 +62,8 @@ contract RareBatchAuctionHouseSeedSepolia is Script { // Register the Merkle root with the auction house address payable[] memory splitAddresses = new address payable[](1); splitAddresses[0] = payable(deployer); // Set the deployer as the recipient - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; // 100% to the deployer + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; // 100% to the deployer // Register the Merkle root for the auction rareBatchAuctionHouse.registerAuctionMerkleRoot( diff --git a/src/auctionhouse/ISuperRareAuctionHouse.sol b/src/auctionhouse/ISuperRareAuctionHouse.sol index d56028e..5c4c514 100644 --- a/src/auctionhouse/ISuperRareAuctionHouse.sol +++ b/src/auctionhouse/ISuperRareAuctionHouse.sol @@ -23,7 +23,7 @@ interface ISuperRareAuctionHouse { uint256 _lengthOfAuction, uint256 _startTime, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; /// @notice Converts an offer into a coldie auction. @@ -41,7 +41,7 @@ interface ISuperRareAuctionHouse { uint256 _amount, uint256 _lengthOfAuction, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; /// @notice Cancels a configured Auction that has not started. @@ -84,6 +84,6 @@ interface ISuperRareAuctionHouse { uint256, bytes32, address payable[] memory, - uint8[] memory + uint16[] memory ); } \ No newline at end of file diff --git a/src/auctionhouse/SuperRareAuctionHouse.sol b/src/auctionhouse/SuperRareAuctionHouse.sol index 0eb4ec5..797c123 100644 --- a/src/auctionhouse/SuperRareAuctionHouse.sol +++ b/src/auctionhouse/SuperRareAuctionHouse.sol @@ -41,7 +41,7 @@ contract SuperRareAuctionHouse is uint256 _lengthOfAuction, uint256 _startTime, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external override { _checkIfCurrencyIsApproved(_currencyAddress); _senderMustBeTokenOwner(_originContract, _tokenId); @@ -123,7 +123,7 @@ contract SuperRareAuctionHouse is uint256 _amount, uint256 _lengthOfAuction, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external override { require(false, 'convertOfferToAuction::Deprecated'); _senderMustBeTokenOwner(_originContract, _tokenId); @@ -261,7 +261,7 @@ contract SuperRareAuctionHouse is Bid memory currBid = auctionBids[_originContract][_tokenId]; require( - _amount >= currBid.amount + ((currBid.amount * minimumBidIncreasePercentage) / 100), + _amount >= currBid.amount + ((currBid.amount * minimumBidIncreasePercentage) / 10000), "bid::Must be higher than prev bid + min increase." ); @@ -380,7 +380,7 @@ contract SuperRareAuctionHouse is external view override - returns (address, uint256, uint256, uint256, address, uint256, bytes32, address payable[] memory, uint8[] memory) + returns (address, uint256, uint256, uint256, address, uint256, bytes32, address payable[] memory, uint16[] memory) { Auction memory auction = tokenAuctions[_originContract][_tokenId]; diff --git a/src/batchoffer/BatchOffer.sol b/src/batchoffer/BatchOffer.sol index aaeecb4..b841472 100644 --- a/src/batchoffer/BatchOffer.sol +++ b/src/batchoffer/BatchOffer.sol @@ -121,7 +121,7 @@ contract BatchOfferCreator is address _contractAddress, uint256 _tokenId, address payable[] calldata _splitRecipients, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external payable nonReentrant { IERC721 erc721 = IERC721(_contractAddress); address tokenOwner = erc721.ownerOf(_tokenId); diff --git a/src/bazaar/ISuperRareBazaar.sol b/src/bazaar/ISuperRareBazaar.sol index e7bd440..a5c3171 100644 --- a/src/bazaar/ISuperRareBazaar.sol +++ b/src/bazaar/ISuperRareBazaar.sol @@ -54,7 +54,7 @@ interface ISuperRareBazaar { uint256 _listPrice, address _target, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; /// @notice Removes the current sale price of an asset for the given currency. @@ -76,7 +76,7 @@ interface ISuperRareBazaar { address _currencyAddress, uint256 _amount, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; // Auction House @@ -116,7 +116,7 @@ interface ISuperRareBazaar { uint256 _lengthOfAuction, uint256 _startTime, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; /// @notice Cancels a configured Auction that has not started. @@ -139,7 +139,7 @@ interface ISuperRareBazaar { uint256 _amount, uint256 _lengthOfAuction, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; /// @notice Grabs the current auction details for a token. @@ -163,14 +163,14 @@ interface ISuperRareBazaar { uint256, bytes32, address payable[] calldata, - uint8[] calldata + uint16[] calldata ); function getSalePrice( address _originContract, uint256 _tokenId, address _target - ) external view returns (address, address, uint256, address payable[] memory, uint8[] memory); + ) external view returns (address, address, uint256, address payable[] memory, uint16[] memory); // // Merkle Auction Functions diff --git a/src/bazaar/SuperRareBazaar.sol b/src/bazaar/SuperRareBazaar.sol index 1987d72..77afbd8 100644 --- a/src/bazaar/SuperRareBazaar.sol +++ b/src/bazaar/SuperRareBazaar.sol @@ -54,7 +54,7 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar stakingRegistry = _stakingRegistry; networkBeneficiary = _networkBeneficiary; - minimumBidIncreasePercentage = 10; + minimumBidIncreasePercentage = 1000; // 10% in basis points maxAuctionLength = 7 days; auctionLengthExtension = 15 minutes; offerCancelationDelay = 5 minutes; @@ -116,7 +116,7 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar networkBeneficiary = _networkBeneficiary; } - function setMinimumBidIncreasePercentage(uint8 _minimumBidIncreasePercentage) external onlyOwner { + function setMinimumBidIncreasePercentage(uint16 _minimumBidIncreasePercentage) external onlyOwner { minimumBidIncreasePercentage = _minimumBidIncreasePercentage; } @@ -217,7 +217,7 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar uint256 _listPrice, address _target, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external override { (bool success, bytes memory data) = superRareMarketplace.delegatecall( abi.encodeWithSelector( @@ -255,7 +255,7 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar delete tokenSalePrices[_originContract][_tokenId][_target]; - emit SetSalePrice(_originContract, address(0), address(0), 0, _tokenId, new address payable[](0), new uint8[](0)); + emit SetSalePrice(_originContract, address(0), address(0), 0, _tokenId, new address payable[](0), new uint16[](0)); } /// @notice Accept an offer placed on _originContract : _tokenId. @@ -272,7 +272,7 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar address _currencyAddress, uint256 _amount, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external override { (bool success, bytes memory data) = superRareMarketplace.delegatecall( abi.encodeWithSelector( @@ -314,7 +314,7 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar uint256 _lengthOfAuction, uint256 _startTime, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external override { (bool success, bytes memory data) = superRareAuctionHouse.delegatecall( abi.encodeWithSelector( @@ -352,7 +352,7 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar uint256 _amount, uint256 _lengthOfAuction, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external override { (bool success, bytes memory data) = superRareAuctionHouse.delegatecall( abi.encodeWithSelector( @@ -432,7 +432,7 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar uint256, bytes32, address payable[] memory, - uint8[] memory + uint16[] memory ) { Auction memory auction = tokenAuctions[_originContract][_tokenId]; @@ -463,7 +463,7 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar address, uint256, address payable[] memory, - uint8[] memory + uint16[] memory ) { SalePrice memory sp = tokenSalePrices[_originContract][_tokenId][_target]; diff --git a/src/bazaar/SuperRareBazaarBase.sol b/src/bazaar/SuperRareBazaarBase.sol index 011c956..97b1991 100644 --- a/src/bazaar/SuperRareBazaarBase.sol +++ b/src/bazaar/SuperRareBazaarBase.sol @@ -48,10 +48,10 @@ abstract contract SuperRareBazaarBase is SuperRareBazaarStorage { /// @notice Verifies that the splits supplied are valid. /// @dev A valid split has the same number of splits and ratios. /// @dev There can only be a max of 5 parties split with. - /// @dev Total of the ratios should be 100 which is relative. + /// @dev Total of the ratios should be 10000 (basis points) which is relative. /// @param _splits The addresses the amount is being split with. - /// @param _ratios The ratios each address in _splits is getting. - function _checkSplits(address payable[] calldata _splits, uint8[] calldata _ratios) internal pure { + /// @param _ratios The ratios each address in _splits is getting (basis points). + function _checkSplits(address payable[] calldata _splits, uint16[] calldata _ratios) internal pure { require(_splits.length > 0, "checkSplits::Must have at least 1 split"); require(_splits.length <= 5, "checkSplits::Split exceeded max size"); require(_splits.length == _ratios.length, "checkSplits::Splits and ratios must be equal"); @@ -61,7 +61,7 @@ abstract contract SuperRareBazaarBase is SuperRareBazaarStorage { totalRatio += _ratios[i]; } - require(totalRatio == 100, "checkSplits::Total must be equal to 100"); + require(totalRatio == 10000, "checkSplits::Total must be equal to 10000"); } /// @notice Checks to see if the sender has approved the marketplace to move tokens. @@ -120,7 +120,7 @@ abstract contract SuperRareBazaarBase is SuperRareBazaarStorage { return; } - uint256 requiredAmount = _amount + ((_amount * _marketplaceFee) / 100); + uint256 requiredAmount = _amount + ((_amount * _marketplaceFee) / 10000); if (_currencyAddress == address(0)) { (bool success, bytes memory data) = address(payments).call{value: requiredAmount}( @@ -146,7 +146,7 @@ abstract contract SuperRareBazaarBase is SuperRareBazaarStorage { /// @param _amount Total amount to be paid out. /// @param _seller Address of the person selling the asset. /// @param _splitAddrs Addresses that funds need to be split against. - /// @param _splitRatios Ratios for split pertaining to each address. + /// @param _splitRatios Ratios for split pertaining to each address (basis points). function _payout( address _originContract, uint256 _tokenId, @@ -154,7 +154,7 @@ abstract contract SuperRareBazaarBase is SuperRareBazaarStorage { uint256 _amount, address _seller, address payable[] memory _splitAddrs, - uint8[] memory _splitRatios + uint16[] memory _splitRatios ) internal { require(_splitAddrs.length == _splitRatios.length, "Number of split addresses and ratios must be equal."); @@ -194,17 +194,17 @@ abstract contract SuperRareBazaarBase is SuperRareBazaarStorage { if (spaceOperatorRegistry.isApprovedSpaceOperator(_seller)) { uint256 platformCommission = spaceOperatorRegistry.getPlatformCommission(_seller); - remainingAmount = remainingAmount - ((_amount * platformCommission) / 100); + remainingAmount = remainingAmount - ((_amount * platformCommission) / 10000); - platformFee[0] = (_amount * platformCommission) / 100; + platformFee[0] = (_amount * platformCommission) / 10000; _performPayouts(_currencyAddress, platformFee[0], platformRecip, platformFee); } else { uint256 platformCommission = marketplaceSettings.getERC721ContractPrimarySaleFeePercentage(_originContract); - remainingAmount = remainingAmount - ((_amount * platformCommission) / 100); + remainingAmount = remainingAmount - ((_amount * platformCommission) / 10000); - platformFee[0] = (_amount * platformCommission) / 100; + platformFee[0] = (_amount * platformCommission) / 10000; _performPayouts(_currencyAddress, platformFee[0], platformRecip, platformFee); } @@ -230,8 +230,8 @@ abstract contract SuperRareBazaarBase is SuperRareBazaarStorage { uint256 totalSplit = 0; for (uint256 i = 0; i < _splitAddrs.length; i++) { - remainingAmts[i] = (remainingAmount * _splitRatios[i]) / 100; - totalSplit += (remainingAmount * _splitRatios[i]) / 100; + remainingAmts[i] = (remainingAmount * _splitRatios[i]) / 10000; + totalSplit += (remainingAmount * _splitRatios[i]) / 10000; } _performPayouts(_currencyAddress, totalSplit, _splitAddrs, remainingAmts); } diff --git a/src/bazaar/SuperRareBazaarStorage.sol b/src/bazaar/SuperRareBazaarStorage.sol index 080db45..cb67bc9 100644 --- a/src/bazaar/SuperRareBazaarStorage.sol +++ b/src/bazaar/SuperRareBazaarStorage.sol @@ -35,7 +35,7 @@ contract SuperRareBazaarStorage { address payable buyer; uint256 amount; uint256 timestamp; - uint8 marketplaceFee; + uint16 marketplaceFee; bool convertible; } @@ -49,7 +49,7 @@ contract SuperRareBazaarStorage { address currencyAddress; uint256 amount; address payable[] splitRecipients; - uint8[] splitRatios; + uint16[] splitRatios; } // Structure of an Auction: @@ -70,14 +70,14 @@ contract SuperRareBazaarStorage { uint256 minimumBid; bytes32 auctionType; address payable[] splitRecipients; - uint8[] splitRatios; + uint16[] splitRatios; } struct Bid { address payable bidder; address currencyAddress; uint256 amount; - uint8 marketplaceFee; + uint16 marketplaceFee; } ///////////////////////////////////////////////////////////////////////// @@ -99,7 +99,7 @@ contract SuperRareBazaarStorage { uint256 _amount, uint256 _tokenId, address payable[] _splitRecipients, - uint8[] _splitRatios + uint16[] _splitRatios ); event OfferPlaced( @@ -119,7 +119,7 @@ contract SuperRareBazaarStorage { uint256 _amount, uint256 _tokenId, address payable[] _splitAddresses, - uint8[] _splitRatios + uint16[] _splitRatios ); event CancelOffer( @@ -196,8 +196,8 @@ contract SuperRareBazaarStorage { // Address of the network beneficiary address public networkBeneficiary; - // A minimum increase in bid amount when out bidding someone. - uint8 public minimumBidIncreasePercentage; // 10 = 10% + // A minimum increase in bid amount when out bidding someone (basis points, 1000 = 10%). + uint16 public minimumBidIncreasePercentage; // Maximum length that an auction can be. uint256 public maxAuctionLength; diff --git a/src/collection/IRareCollectionMarket.sol b/src/collection/IRareCollectionMarket.sol index 27424e6..8ef2f23 100644 --- a/src/collection/IRareCollectionMarket.sol +++ b/src/collection/IRareCollectionMarket.sol @@ -22,7 +22,7 @@ interface IRareCollectionMarket { address currencyAddress; uint256 amount; address payable[] splitRecipients; - uint8[] splitRatios; + uint16[] splitRatios; } /*////////////////////////////////////////////////////////////////////////// @@ -132,7 +132,7 @@ interface IRareCollectionMarket { address _currencyAddress, uint256 _amount, address payable[] calldata _splitAddrs, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; /// @notice Cancels an existing collection offer the sender has placed. @@ -150,7 +150,7 @@ interface IRareCollectionMarket { address _currencyAddress, uint256 _amount, address payable[] calldata _splitAddrs, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; /// @notice Cancels an existing collection sale price set by the sender. diff --git a/src/collection/IRareMinter.sol b/src/collection/IRareMinter.sol index 8546c77..27565ab 100644 --- a/src/collection/IRareMinter.sol +++ b/src/collection/IRareMinter.sol @@ -16,7 +16,7 @@ interface IRareMinter { uint256 startTime; uint256 maxMints; address payable[] splitRecipients; - uint8[] splitRatios; + uint16[] splitRatios; } /// @notice Allow list config @@ -43,7 +43,7 @@ interface IRareMinter { uint256 _startTime, uint256 _maxMints, address payable[] splitRecipients, - uint8[] splitRatios + uint16[] splitRatios ); /// @notice Event emitted when a contract is prepared for direct sale @@ -127,7 +127,7 @@ interface IRareMinter { uint256 _startTime, uint256 _maxMints, address payable[] calldata _splitRecipients, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; /// @notice Mints a token to the buyer diff --git a/src/collection/RareCollectionMarket.sol b/src/collection/RareCollectionMarket.sol index fc5d8a8..77185ba 100644 --- a/src/collection/RareCollectionMarket.sol +++ b/src/collection/RareCollectionMarket.sol @@ -141,7 +141,7 @@ contract RareCollectionMarket is requiredAmount = 0; } else { // otherwise, set required amount to the difference of what was in the original offer. - requiredAmount = requiredAmount - (offer.amount + ((offer.amount * offer.marketplaceFee) / 100)); + requiredAmount = requiredAmount - (offer.amount + ((offer.amount * offer.marketplaceFee) / 10000)); } } else { // refund whole amount if currencies or fee percentages do not match. @@ -170,7 +170,7 @@ contract RareCollectionMarket is address _currencyAddress, uint256 _amount, address payable[] calldata _splitAddrs, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external override nonReentrant notPaused { MarketUtils.senderMustBeTokenOwner(_originContract, _tokenId); MarketUtils.addressMustHaveMarketplaceApprovedForNFT(msg.sender, _originContract); @@ -215,7 +215,7 @@ contract RareCollectionMarket is address _currencyAddress, uint256 _amount, address payable[] calldata _splitAddrs, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external override notPaused { marketConfig.checkIfCurrencyIsApproved(_currencyAddress); MarketUtils.addressMustHaveMarketplaceApprovedForNFT(msg.sender, _originContract); diff --git a/src/collection/RareMinter.sol b/src/collection/RareMinter.sol index 52a8064..275e030 100644 --- a/src/collection/RareMinter.sol +++ b/src/collection/RareMinter.sol @@ -115,7 +115,7 @@ contract RareMinter is Initializable, IRareMinter, OwnableUpgradeable, Reentranc uint256 _startTime, uint256 _maxMints, address payable[] calldata _splitRecipients, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external { require( OwnableUpgradeable(_contractAddress).owner() == msg.sender, diff --git a/src/marketplace/IMarketplaceSettings.sol b/src/marketplace/IMarketplaceSettings.sol index 4c880ea..1c17c71 100644 --- a/src/marketplace/IMarketplaceSettings.sol +++ b/src/marketplace/IMarketplaceSettings.sol @@ -24,10 +24,10 @@ interface IMarketplaceSettings { // Marketplace Fee ///////////////////////////////////////////////////////////////////////// /** - * @dev Get the marketplace fee percentage. - * @return uint8 wei fee. + * @dev Get the marketplace fee percentage in basis points (0-10000). + * @return uint16 basis points fee. */ - function getMarketplaceFeePercentage() external view returns (uint8); + function getMarketplaceFeePercentage() external view returns (uint16); /** * @dev Utility function for calculating the marketplace fee for given amount of wei. @@ -43,14 +43,14 @@ interface IMarketplaceSettings { // Primary Sale Fee ///////////////////////////////////////////////////////////////////////// /** - * @dev Get the primary sale fee percentage for a specific ERC721 contract. + * @dev Get the primary sale fee percentage for a specific ERC721 contract in basis points (0-10000). * @param _contractAddress address ERC721Contract address. - * @return uint8 wei primary sale fee. + * @return uint16 basis points primary sale fee. */ function getERC721ContractPrimarySaleFeePercentage(address _contractAddress) external view - returns (uint8); + returns (uint16); /** * @dev Utility function for calculating the primary sale fee for given amount of wei @@ -91,6 +91,6 @@ interface IMarketplaceSettings { function setERC721ContractPrimarySaleFeePercentage( address _contractAddress, - uint8 _percentage + uint16 _percentage ) external; } diff --git a/src/marketplace/IStakingSettings.sol b/src/marketplace/IStakingSettings.sol index 1cc7ecb..c68d331 100644 --- a/src/marketplace/IStakingSettings.sol +++ b/src/marketplace/IStakingSettings.sol @@ -6,10 +6,10 @@ pragma solidity ^0.8.0; */ interface IStakingSettings { /** - * @dev Get the staking percentage. - * @return uint8 wei staking fee percentage. + * @dev Get the staking percentage in basis points (0-10000). + * @return uint16 basis points staking fee percentage. */ - function getStakingFeePercentage() external view returns (uint8); + function getStakingFeePercentage() external view returns (uint16); /** * @dev Utility function for calculating the staking fee for given amount of wei. diff --git a/src/marketplace/ISuperRareMarketplace.sol b/src/marketplace/ISuperRareMarketplace.sol index e0aee60..07b7a1c 100644 --- a/src/marketplace/ISuperRareMarketplace.sol +++ b/src/marketplace/ISuperRareMarketplace.sol @@ -56,7 +56,7 @@ interface ISuperRareMarketplace { uint256 _listPrice, address _target, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; /// @notice Removes the current sale price of an asset for _target for the given currency. @@ -82,6 +82,6 @@ interface ISuperRareMarketplace { address _currencyAddress, uint256 _amount, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; } diff --git a/src/marketplace/MarketplaceSettingsV1.sol b/src/marketplace/MarketplaceSettingsV1.sol index 74ec75b..a75f6fc 100644 --- a/src/marketplace/MarketplaceSettingsV1.sol +++ b/src/marketplace/MarketplaceSettingsV1.sol @@ -25,11 +25,11 @@ contract MarketplaceSettingsV1 is Ownable, AccessControl, IMarketplaceSettings { // Min wei value within the marketplace uint256 private minValue; - // Percentage fee for the marketplace, 3 == 3% - uint8 private marketplaceFeePercentage; + // Marketplace fee in basis points (0-10000). 0 = 0%. + uint16 private marketplaceFeePercentage; - // Mapping of ERC721 contract to the primary sale fee. If primary sale fee is 0 for an origin contract then primary sale fee is ignored. 1 == 1% - mapping(address => uint8) private primarySaleFees; + // Mapping of ERC721 contract to the primary sale fee in basis points (0-10000). 0 = ignored. + mapping(address => uint16) private primarySaleFees; // Mapping of ERC721 contract to mapping of token ID to whether the token has been sold before. mapping(address => mapping(uint256 => bool)) private soldTokens; @@ -46,7 +46,7 @@ contract MarketplaceSettingsV1 is Ownable, AccessControl, IMarketplaceSettings { minValue = 1000; // all amounts must be greater than 1000 Wei. - marketplaceFeePercentage = 3; // 3% marketplace fee on all txs. + marketplaceFeePercentage = 0; // Protocol base fee is zero; RareAppRegistry handles app fees. _setupRole(AccessControl.DEFAULT_ADMIN_ROLE, owner()); grantRole(TOKEN_MARK_ROLE, owner()); @@ -115,14 +115,14 @@ contract MarketplaceSettingsV1 is Ownable, AccessControl, IMarketplaceSettings { // getMarketplaceFeePercentage ///////////////////////////////////////////////////////////////////////// /** - * @dev Get the marketplace fee percentage. - * @return uint8 wei fee. + * @dev Get the marketplace fee percentage in basis points (0-10000). + * @return uint16 basis points fee. */ function getMarketplaceFeePercentage() external view override - returns (uint8) + returns (uint16) { return marketplaceFeePercentage; } @@ -131,15 +131,15 @@ contract MarketplaceSettingsV1 is Ownable, AccessControl, IMarketplaceSettings { // setMarketplaceFeePercentage ///////////////////////////////////////////////////////////////////////// /** - * @dev Set the marketplace fee percentage. + * @dev Set the marketplace fee percentage in basis points (0-10000). * Requirements: - * - `_percentage` must be <= 100. - * @param _percentage uint8 percentage fee. + * - `_percentage` must be <= 10000. + * @param _percentage uint16 basis points fee. */ - function setMarketplaceFeePercentage(uint8 _percentage) external onlyOwner { + function setMarketplaceFeePercentage(uint16 _percentage) external onlyOwner { require( - _percentage <= 100, - "setMarketplaceFeePercentage::_percentage must be <= 100" + _percentage <= 10000, + "setMarketplaceFeePercentage::_percentage must be <= 10000" ); marketplaceFeePercentage = _percentage; } @@ -158,22 +158,22 @@ contract MarketplaceSettingsV1 is Ownable, AccessControl, IMarketplaceSettings { override returns (uint256) { - return (_amount * marketplaceFeePercentage) / 100; + return (_amount * marketplaceFeePercentage) / 10000; } ///////////////////////////////////////////////////////////////////////// // getERC721ContractPrimarySaleFeePercentage ///////////////////////////////////////////////////////////////////////// /** - * @dev Get the primary sale fee percentage for a specific ERC721 contract. + * @dev Get the primary sale fee percentage for a specific ERC721 contract in basis points (0-10000). * @param _contractAddress address ERC721Contract address. - * @return uint8 wei primary sale fee. + * @return uint16 basis points primary sale fee. */ function getERC721ContractPrimarySaleFeePercentage(address _contractAddress) external view override - returns (uint8) + returns (uint16) { return primarySaleFees[_contractAddress]; } @@ -182,21 +182,21 @@ contract MarketplaceSettingsV1 is Ownable, AccessControl, IMarketplaceSettings { // setERC721ContractPrimarySaleFeePercentage ///////////////////////////////////////////////////////////////////////// /** - * @dev Set the primary sale fee percentage for a specific ERC721 contract. + * @dev Set the primary sale fee percentage for a specific ERC721 contract in basis points (0-10000). * Requirements: * * - `_contractAddress` cannot be the zero address. - * - `_percentage` must be <= 100. + * - `_percentage` must be <= 10000. * @param _contractAddress address ERC721Contract address. - * @param _percentage uint8 percentage fee for the ERC721 contract. + * @param _percentage uint16 basis points fee for the ERC721 contract. */ function setERC721ContractPrimarySaleFeePercentage( address _contractAddress, - uint8 _percentage + uint16 _percentage ) external override onlyOwner { require( - _percentage <= 100, - "setERC721ContractPrimarySaleFeePercentage::_percentage must be <= 100" + _percentage <= 10000, + "setERC721ContractPrimarySaleFeePercentage::_percentage must be <= 10000" ); primarySaleFees[_contractAddress] = _percentage; } @@ -216,7 +216,7 @@ contract MarketplaceSettingsV1 is Ownable, AccessControl, IMarketplaceSettings { override returns (uint256) { - return (_amount * primarySaleFees[_contractAddress]) / 100; + return (_amount * primarySaleFees[_contractAddress]) / 10000; } ///////////////////////////////////////////////////////////////////////// diff --git a/src/marketplace/MarketplaceSettingsV2.sol b/src/marketplace/MarketplaceSettingsV2.sol index 4afe371..a26dafb 100644 --- a/src/marketplace/MarketplaceSettingsV2.sol +++ b/src/marketplace/MarketplaceSettingsV2.sol @@ -22,14 +22,14 @@ contract MarketplaceSettingsV2 is Ownable, AccessControl, IMarketplaceSettings { uint256 private maxValue; uint256 private minValue; - uint8 private marketplaceFeePercentage; - uint8 private primarySaleFeePercentage; + uint16 private marketplaceFeePercentage; + uint16 private primarySaleFeePercentage; constructor(address newOwner, address oldSettings) { maxValue = 2 ** 254; minValue = 1000; - marketplaceFeePercentage = 3; - primarySaleFeePercentage = 15; + marketplaceFeePercentage = 0; + primarySaleFeePercentage = 0; require( newOwner != address(0), @@ -61,7 +61,7 @@ contract MarketplaceSettingsV2 is Ownable, AccessControl, IMarketplaceSettings { } function setPrimarySaleFeePercentage( - uint8 _primarySaleFeePercentage + uint16 _primarySaleFeePercentage ) external onlyOwner { primarySaleFeePercentage = _primarySaleFeePercentage; } @@ -82,15 +82,15 @@ contract MarketplaceSettingsV2 is Ownable, AccessControl, IMarketplaceSettings { external view override - returns (uint8) + returns (uint16) { return marketplaceFeePercentage; } - function setMarketplaceFeePercentage(uint8 _percentage) external onlyOwner { + function setMarketplaceFeePercentage(uint16 _percentage) external onlyOwner { require( - _percentage <= 100, - "setMarketplaceFeePercentage::_percentage must be <= 100" + _percentage <= 10000, + "setMarketplaceFeePercentage::_percentage must be <= 10000" ); marketplaceFeePercentage = _percentage; } @@ -98,25 +98,25 @@ contract MarketplaceSettingsV2 is Ownable, AccessControl, IMarketplaceSettings { function calculateMarketplaceFee( uint256 _amount ) external view override returns (uint256) { - return (_amount * marketplaceFeePercentage) / 100; + return (_amount * marketplaceFeePercentage) / 10000; } function getERC721ContractPrimarySaleFeePercentage( address - ) external view override returns (uint8) { + ) external view override returns (uint16) { return primarySaleFeePercentage; } function setERC721ContractPrimarySaleFeePercentage( address _contractAddress, - uint8 _percentage + uint16 _percentage ) external override {} function calculatePrimarySaleFee( address, uint256 _amount ) external view override returns (uint256) { - return (_amount * primarySaleFeePercentage) / 100; + return (_amount * primarySaleFeePercentage) / 10000; } function hasERC721TokenSold( diff --git a/src/marketplace/MarketplaceSettingsV3.sol b/src/marketplace/MarketplaceSettingsV3.sol index d527e56..8455186 100644 --- a/src/marketplace/MarketplaceSettingsV3.sol +++ b/src/marketplace/MarketplaceSettingsV3.sol @@ -15,7 +15,7 @@ contract MarketplaceSettingsV3 is IMarketplaceSettings, IStakingSettings { - uint8 private stakingFeePercentage; + uint16 private stakingFeePercentage; bytes32 public constant TOKEN_MARK_ROLE = keccak256("TOKEN_MARK_ROLE"); // This is meant to be the MarketplaceSettings contract located in the V1 folder @@ -30,14 +30,14 @@ contract MarketplaceSettingsV3 is uint256 private maxValue; uint256 private minValue; - uint8 private marketplaceFeePercentage; - uint8 private primarySaleFeePercentage; + uint16 private marketplaceFeePercentage; + uint16 private primarySaleFeePercentage; constructor(address newOwner, address oldSettings) { maxValue = 2**254; minValue = 1000; - marketplaceFeePercentage = 3; - primarySaleFeePercentage = 15; + marketplaceFeePercentage = 0; + primarySaleFeePercentage = 0; stakingFeePercentage = 0; require( @@ -69,7 +69,7 @@ contract MarketplaceSettingsV3 is return maxValue; } - function setPrimarySaleFeePercentage(uint8 _primarySaleFeePercentage) + function setPrimarySaleFeePercentage(uint16 _primarySaleFeePercentage) external onlyOwner { @@ -92,15 +92,15 @@ contract MarketplaceSettingsV3 is external view override - returns (uint8) + returns (uint16) { return marketplaceFeePercentage; } - function setMarketplaceFeePercentage(uint8 _percentage) external onlyOwner { + function setMarketplaceFeePercentage(uint16 _percentage) external onlyOwner { require( - _percentage <= 100, - "setMarketplaceFeePercentage::_percentage must be <= 100" + _percentage <= 10000, + "setMarketplaceFeePercentage::_percentage must be <= 10000" ); marketplaceFeePercentage = _percentage; } @@ -111,21 +111,21 @@ contract MarketplaceSettingsV3 is override returns (uint256) { - return (_amount * marketplaceFeePercentage) / 100; + return (_amount * marketplaceFeePercentage) / 10000; } function getERC721ContractPrimarySaleFeePercentage(address) external view override - returns (uint8) + returns (uint16) { return primarySaleFeePercentage; } function setERC721ContractPrimarySaleFeePercentage( address _contractAddress, - uint8 _percentage + uint16 _percentage ) external override {} function calculatePrimarySaleFee(address, uint256 _amount) @@ -134,7 +134,7 @@ contract MarketplaceSettingsV3 is override returns (uint256) { - return (_amount * primarySaleFeePercentage) / 100; + return (_amount * primarySaleFeePercentage) / 10000; } function hasERC721TokenSold(address _contractAddress, uint256 _tokenId) @@ -201,11 +201,11 @@ contract MarketplaceSettingsV3 is return oldMarketplaceSettings.markContractAsSold(_contractAddress); } - function getStakingFeePercentage() external view override returns (uint8) { + function getStakingFeePercentage() external view override returns (uint16) { return stakingFeePercentage; } - function setStakingFeePercentage(uint8 _percentage) external onlyOwner { + function setStakingFeePercentage(uint16 _percentage) external onlyOwner { require( _percentage <= marketplaceFeePercentage, "setStakingFeePercentage::_percentage must be <= marketplaceFeePercentage" @@ -219,7 +219,7 @@ contract MarketplaceSettingsV3 is override returns (uint256) { - return (_amount * stakingFeePercentage) / 100; + return (_amount * stakingFeePercentage) / 10000; } function calculateMarketplacePayoutFee(uint256 _amount) @@ -229,6 +229,6 @@ contract MarketplaceSettingsV3 is returns (uint256) { return - (_amount * (marketplaceFeePercentage - stakingFeePercentage)) / 100; + (_amount * (marketplaceFeePercentage - stakingFeePercentage)) / 10000; } } diff --git a/src/marketplace/SuperRareMarketplace.sol b/src/marketplace/SuperRareMarketplace.sol index 58f8652..fb3faaa 100644 --- a/src/marketplace/SuperRareMarketplace.sol +++ b/src/marketplace/SuperRareMarketplace.sol @@ -43,7 +43,7 @@ contract SuperRareMarketplace is Offer memory currOffer = tokenCurrentOffers[_originContract][_tokenId][_currencyAddress]; require( - _amount >= currOffer.amount + ((currOffer.amount * minimumBidIncreasePercentage) / 100), + _amount >= currOffer.amount + ((currOffer.amount * minimumBidIncreasePercentage) / 10000), "offer::Must be greater than prev offer + min increase" ); @@ -170,7 +170,7 @@ contract SuperRareMarketplace is uint256 _listPrice, address _target, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external override { _checkIfCurrencyIsApproved(_currencyAddress); _senderMustBeTokenOwner(_originContract, _tokenId); @@ -208,7 +208,7 @@ contract SuperRareMarketplace is delete tokenSalePrices[_originContract][_tokenId][_target]; - emit SetSalePrice(_originContract, address(0), address(0), 0, _tokenId, new address payable[](0), new uint8[](0)); + emit SetSalePrice(_originContract, address(0), address(0), 0, _tokenId, new address payable[](0), new uint16[](0)); } /// @notice Accept an offer placed on _originContract : _tokenId. @@ -225,7 +225,7 @@ contract SuperRareMarketplace is address _currencyAddress, uint256 _amount, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external override nonReentrant { _senderMustBeTokenOwner(_originContract, _tokenId); _ownerMustHaveMarketplaceApprovedForNFT(_originContract, _tokenId); diff --git a/src/registry/RoyaltyRegistry.sol b/src/registry/RoyaltyRegistry.sol index 46ba58b..425b97f 100644 --- a/src/registry/RoyaltyRegistry.sol +++ b/src/registry/RoyaltyRegistry.sol @@ -9,7 +9,7 @@ contract RoyaltyRegistry is Ownable, AccessControl, IRareRoyaltyRegistry { bytes32 public constant ROYALTY_FEE_SETTER_ROLE = keccak256("ROYALTY_FEE_SETTER_ROLE"); - mapping(address => uint8) public contractRoyaltyPercentage; + mapping(address => uint16) public contractRoyaltyPercentage; mapping(address => bool) public contractRoyaltyPercentageSet; @@ -45,35 +45,35 @@ contract RoyaltyRegistry is Ownable, AccessControl, IRareRoyaltyRegistry { function getERC721TokenRoyaltyPercentage( address _contractAddress, uint256 //_tokenId - ) public view override returns (uint8) { + ) public view override returns (uint16) { return contractRoyaltyPercentageSet[_contractAddress] ? contractRoyaltyPercentage[_contractAddress] - : 10; + : 1000; } function getPercentageForSetERC721ContractRoyalty(address _contractAddress) external view - returns (uint8) + returns (uint16) { return contractRoyaltyPercentageSet[_contractAddress] ? contractRoyaltyPercentage[_contractAddress] - : 10; + : 1000; } function setPercentageForSetERC721ContractRoyalty( address _contractAddress, - uint8 _percentage + uint16 _percentage ) external override { require( hasRole(ROYALTY_FEE_SETTER_ROLE, _msgSender()), "setPercentageForSetERC721ContractRoyalty::Caller must have royalty fee setter role" ); require( - _percentage <= 100, - "setPercentageForSetERC721ContractRoyalty::_percentage must be <= 100" + _percentage <= 10000, + "setPercentageForSetERC721ContractRoyalty::_percentage must be <= 10000" ); contractRoyaltyPercentage[_contractAddress] = _percentage; contractRoyaltyPercentageSet[_contractAddress] = true; @@ -87,7 +87,7 @@ contract RoyaltyRegistry is Ownable, AccessControl, IRareRoyaltyRegistry { return (_amount * getERC721TokenRoyaltyPercentage(_contractAddress, _tokenId)) / - 100; + 10000; } function tokenCreator(address _contractAddress, uint256 _tokenId) diff --git a/src/registry/SpaceOperatorRegistry.sol b/src/registry/SpaceOperatorRegistry.sol index f7ba123..7a7b90c 100644 --- a/src/registry/SpaceOperatorRegistry.sol +++ b/src/registry/SpaceOperatorRegistry.sol @@ -29,12 +29,12 @@ contract SpaceOperatorRegistry is external pure override - returns (uint8) + returns (uint16) { - return 5; + return 500; } - function setPlatformCommission(address, uint8) external override {} + function setPlatformCommission(address, uint16) external override {} function isApprovedSpaceOperator(address _operator) external diff --git a/src/registry/interfaces/IRareRoyaltyRegistry.sol b/src/registry/interfaces/IRareRoyaltyRegistry.sol index d7ef1e5..97be2d4 100644 --- a/src/registry/interfaces/IRareRoyaltyRegistry.sol +++ b/src/registry/interfaces/IRareRoyaltyRegistry.sol @@ -8,15 +8,15 @@ import {ICreatorRegistry} from "./ICreatorRegistry.sol"; */ interface IRareRoyaltyRegistry is ICreatorRegistry { /** - * @dev Get the royalty fee percentage for a specific ERC721 contract. + * @dev Get the royalty fee percentage for a specific ERC721 contract in basis points (0-10000). * @param _contractAddress address ERC721Contract address. * @param _tokenId uint256 token ID. - * @return uint8 wei royalty fee. + * @return uint16 basis points royalty fee. */ function getERC721TokenRoyaltyPercentage( address _contractAddress, uint256 _tokenId - ) external view returns (uint8); + ) external view returns (uint16); /** * @dev Utililty function to calculate the royalty fee for a token. @@ -38,6 +38,6 @@ interface IRareRoyaltyRegistry is ICreatorRegistry { */ function setPercentageForSetERC721ContractRoyalty( address _contractAddress, - uint8 _percentage + uint16 _percentage ) external; } diff --git a/src/registry/interfaces/ISpaceOperatorRegistry.sol b/src/registry/interfaces/ISpaceOperatorRegistry.sol index 60d4907..4f12bf6 100644 --- a/src/registry/interfaces/ISpaceOperatorRegistry.sol +++ b/src/registry/interfaces/ISpaceOperatorRegistry.sol @@ -8,9 +8,9 @@ interface ISpaceOperatorRegistry { function getPlatformCommission(address _operator) external view - returns (uint8); + returns (uint16); - function setPlatformCommission(address _operator, uint8 _commission) + function setPlatformCommission(address _operator, uint16 _commission) external; function isApprovedSpaceOperator(address _operator) diff --git a/src/test/batchoffer/BatchOffer.t.sol b/src/test/batchoffer/BatchOffer.t.sol index 52bbeff..abb90c4 100644 --- a/src/test/batchoffer/BatchOffer.t.sol +++ b/src/test/batchoffer/BatchOffer.t.sol @@ -96,9 +96,9 @@ contract TestBatchOffer is Test { testToken.transferOwnership(notryan); address payable[] memory _splitRecipients = new address payable[](1); - uint8[] memory _splitRatios = new uint8[](1); + uint16[] memory _splitRatios = new uint16[](1); _splitRecipients[0] = payable(notryan); - _splitRatios[0] = 100; + _splitRatios[0] = 10000; Merkle m = new Merkle(); bytes32[] memory data = new bytes32[](2); @@ -142,9 +142,9 @@ contract TestBatchOffer is Test { testToken.transferOwnership(notryan); address payable[] memory _splitRecipients = new address payable[](1); - uint8[] memory _splitRatios = new uint8[](1); + uint16[] memory _splitRatios = new uint16[](1); _splitRecipients[0] = payable(notryan); - _splitRatios[0] = 100; + _splitRatios[0] = 10000; Merkle m = new Merkle(); bytes32[] memory data = new bytes32[](2); @@ -216,14 +216,14 @@ contract TestBatchOffer is Test { abi.encode(false) ); - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% + // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector( IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, address(testToken) ), - abi.encode(15) + abi.encode(uint16(1500)) ); } } diff --git a/src/test/bazaar/BazaarBase.t.sol b/src/test/bazaar/BazaarBase.t.sol index baa11d7..8bce6bb 100644 --- a/src/test/bazaar/BazaarBase.t.sol +++ b/src/test/bazaar/BazaarBase.t.sol @@ -50,7 +50,7 @@ contract TestContract is SuperRareBazaarBase { uint256 _amount, address _seller, address payable[] memory _splitAddrs, - uint8[] memory _splitRatios + uint16[] memory _splitRatios ) public payable { _payout(_originContract, _tokenId, _currencyAddress, _amount, _seller, _splitAddrs, _splitRatios); } @@ -133,8 +133,8 @@ contract RareBazaarBaseTest is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call -- 3% @@ -178,11 +178,11 @@ contract RareBazaarBaseTest is Test { abi.encode(false) ); - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% + // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); uint256 balanceBefore = charlie.balance; vm.prank(deployer); @@ -210,8 +210,8 @@ contract RareBazaarBaseTest is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call -- 3% @@ -255,11 +255,11 @@ contract RareBazaarBaseTest is Test { abi.encode(true) ); - // setup getPlatformCommission -- 5% + // setup getPlatformCommission -- 5% (500 bp) vm.mockCall( spaceOperatorRegistry, abi.encodeWithSelector(ISpaceOperatorRegistry.getPlatformCommission.selector, charlie), - abi.encode(5) + abi.encode(uint16(500)) ); uint256 balanceBefore = charlie.balance; vm.prank(deployer); @@ -287,8 +287,8 @@ contract RareBazaarBaseTest is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); address payable[] memory royaltyReceiverAddrs = new address payable[](1); uint256[] memory royaltyAmounts = new uint256[](1); @@ -371,8 +371,8 @@ contract RareBazaarBaseTest is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call -- 3% @@ -416,11 +416,11 @@ contract RareBazaarBaseTest is Test { abi.encode(false) ); - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% + // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); uint256 balanceBefore = rewardPool.balance; vm.prank(deployer); @@ -448,8 +448,8 @@ contract RareBazaarBaseTest is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call -- 3% @@ -493,11 +493,11 @@ contract RareBazaarBaseTest is Test { abi.encode(false) ); - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% + // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); vm.prank(deployer); tc.payout{value: amount + ((amount * 3) / 100)}( @@ -523,8 +523,8 @@ contract RareBazaarBaseTest is Test { address currencyAddress = address(rare); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call -- 3% @@ -568,11 +568,11 @@ contract RareBazaarBaseTest is Test { abi.encode(false) ); - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% + // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); vm.prank(deployer); rare.transfer(address(tc), amount + ((amount * 3) / 100)); diff --git a/src/test/bazaar/SuperRareBazaar.t.sol b/src/test/bazaar/SuperRareBazaar.t.sol index c2a26df..12da0c2 100644 --- a/src/test/bazaar/SuperRareBazaar.t.sol +++ b/src/test/bazaar/SuperRareBazaar.t.sol @@ -98,7 +98,6 @@ contract SuperRareBazaarTest is Test { } function test_convert_offer_currency_exploit() external { - /*/////////////////////////////////////////////////// Mock Calls ///////////////////////////////////////////////////*/ @@ -120,7 +119,7 @@ contract SuperRareBazaarTest is Test { vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getMarketplaceFeePercentage.selector), - abi.encode(3) + abi.encode(uint16(300)) ); vm.mockCall( marketplaceSettings, @@ -150,7 +149,7 @@ contract SuperRareBazaarTest is Test { vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, address(sfn)), - abi.encode(15) + abi.encode(uint16(1500)) ); vm.mockCall( marketplaceSettings, @@ -162,10 +161,6 @@ contract SuperRareBazaarTest is Test { Test ///////////////////////////////////////////////////*/ configureAuction(); - - skip(12); //~about 1 block - vm.expectRevert(); - superRareBazaar.settleAuction(address(sfn), 1); } @@ -178,47 +173,18 @@ contract SuperRareBazaarTest is Test { console2.log("Amount Recieved by Attacker:", msg.value); } - // Configure the auction + // Verify convertOfferToAuction is deprecated and reverts function configureAuction() internal { - // Setup the Offer and convert it to an auction - createOfferAndConvertToAuction(); - - address payable[] memory _splitAddresses = new address payable[](1); - _splitAddresses[0] = payable(address(this)); - - uint8[] memory _splitRatios = new uint8[](1); - _splitRatios[0] = 100; - - //@exploit: Assumes all NFTs follows the ERC-721 spec - vm.prank(exploiter); - IERC721(sfn).transferFrom(exploiter, exploiter1, 1); - - //@exploit: Overwrites previously set auction with a new Currency (ETH). Keeps the same bid - vm.prank(exploiter1); - vm.expectRevert(); - superRareBazaar.configureAuction( - SCHEDULED_AUCTION, - address(sfn), - 1, - TARGET_AMOUNT, - address(0), - _lengthOfAuction, - block.timestamp + 1, - _splitAddresses, - _splitRatios - ); - } - - function createOfferAndConvertToAuction() internal { createOffer(); address payable[] memory _splitAddresses = new address payable[](1); _splitAddresses[0] = payable(address(this)); - uint8[] memory _splitRatios = new uint8[](1); - _splitRatios[0] = 100; + uint16[] memory _splitRatios = new uint16[](1); + _splitRatios[0] = 10000; vm.prank(exploiter); + vm.expectRevert("convertOfferToAuction::Deprecated"); superRareBazaar.convertOfferToAuction( address(sfn), 1, diff --git a/src/test/collection/RareCollectionMarket.t.sol b/src/test/collection/RareCollectionMarket.t.sol index a1d2039..b0e4747 100644 --- a/src/test/collection/RareCollectionMarket.t.sol +++ b/src/test/collection/RareCollectionMarket.t.sol @@ -313,8 +313,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(charlie); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); market.acceptCollectionOffer(charlie, originContract, tokenId, zeroAddress, amount, splitAddrs, splitRatios); vm.stopPrank(); @@ -346,8 +346,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](2); splitAddrs[0] = payable(charlie); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); vm.expectRevert(bytes("checkSplits::Splits and ratios must be equal")); market.acceptCollectionOffer(charlie, originContract, tokenId, zeroAddress, amount, splitAddrs, splitRatios); @@ -375,8 +375,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(charlie); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); vm.expectRevert( abi.encodeWithSelector(IRareCollectionMarket.NoOfferExistsForBuyer.selector, originContract, charlie) @@ -411,8 +411,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(charlie); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); vm.expectRevert(bytes("sender must be the token owner")); market.acceptCollectionOffer(charlie, originContract, tokenId, zeroAddress, amount, splitAddrs, splitRatios); @@ -445,8 +445,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(charlie); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); vm.expectRevert(bytes("owner must have approved contract")); market.acceptCollectionOffer(charlie, originContract, tokenId, zeroAddress, amount, splitAddrs, splitRatios); @@ -479,8 +479,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(charlie); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); vm.expectRevert(abi.encodeWithSelector(IRareCollectionMarket.IncorrectAmount.selector, amount, amount + 1)); market.acceptCollectionOffer(charlie, originContract, tokenId, zeroAddress, amount + 1, splitAddrs, splitRatios); @@ -513,8 +513,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(charlie); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); vm.expectRevert( abi.encodeWithSelector(IRareCollectionMarket.CurrencyMismatch.selector, currencyAddress, zeroAddress) @@ -577,8 +577,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(alice); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); market.setCollectionSalePrice(originContract, zeroAddress, amount, splitAddrs, splitRatios); vm.stopPrank(); @@ -605,8 +605,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(alice); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); vm.expectRevert(bytes("Not approved currency")); market.setCollectionSalePrice(originContract, currencyAddress, amount, splitAddrs, splitRatios); @@ -621,8 +621,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(alice); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); vm.expectRevert(bytes("owner must have approved contract")); market.setCollectionSalePrice(originContract, zeroAddress, amount, splitAddrs, splitRatios); @@ -637,8 +637,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](2); splitAddrs[0] = payable(alice); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); vm.expectRevert(bytes("checkSplits::Splits and ratios must be equal")); market.setCollectionSalePrice(originContract, zeroAddress, amount, splitAddrs, splitRatios); @@ -653,8 +653,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(alice); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); vm.expectRevert(IRareCollectionMarket.AmountCantBeZero.selector); market.setCollectionSalePrice(originContract, zeroAddress, 0, splitAddrs, splitRatios); @@ -669,8 +669,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(alice); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); market.setCollectionSalePrice(originContract, zeroAddress, amount, splitAddrs, splitRatios); @@ -692,8 +692,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(alice); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); market.setCollectionSalePrice(originContract, zeroAddress, amount, splitAddrs, splitRatios); vm.stopPrank(); @@ -733,8 +733,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(alice); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); market.setCollectionSalePrice(originContract, zeroAddress, amount, splitAddrs, splitRatios); @@ -762,8 +762,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(alice); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); // Mocks for: MarketUtils.addressMustHaveMarketplaceApprovedForNFT(msg.sender, _originContract); @@ -803,8 +803,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(alice); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(charlie); vm.expectRevert(abi.encodeWithSelector(IRareCollectionMarket.SalePriceDoesntExist.selector, alice, originContract)); @@ -835,8 +835,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(alice); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); market.setCollectionSalePrice(originContract, zeroAddress, amount, splitAddrs, splitRatios); @@ -871,8 +871,8 @@ contract TestRareCollectionMarket is Test { address payable[] memory splitAddrs = new address payable[](1); splitAddrs[0] = payable(alice); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; vm.startPrank(alice); market.setCollectionSalePrice(originContract, zeroAddress, amount, splitAddrs, splitRatios); @@ -936,11 +936,11 @@ contract TestRareCollectionMarket is Test { abi.encode(false) ); - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% + // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); } diff --git a/src/test/collection/RareMinter.t.sol b/src/test/collection/RareMinter.t.sol index 1260fad..8bc635b 100644 --- a/src/test/collection/RareMinter.t.sol +++ b/src/test/collection/RareMinter.t.sol @@ -64,7 +64,7 @@ contract TestRareMinter is Test { address zeroAddress = address(0); bytes32[] emptyProof = new bytes32[](0); uint256 tokenId = 1; - uint8 marketplaceFeePercentage = 3; + uint16 marketplaceFeePercentage = 300; address currencyAddress; @@ -104,6 +104,13 @@ contract TestRareMinter is Test { vm.etch(spaceOperatorRegistry, address(rareMinter).code); vm.etch(approvedTokenRegistry, address(rareMinter).code); + // Mock approved token for ERC20 currency + vm.mockCall( + approvedTokenRegistry, + abi.encodeWithSelector(IApprovedTokenRegistry.isApprovedToken.selector, currencyAddress), + abi.encode(true) + ); + vm.stopPrank(); } @@ -116,9 +123,9 @@ contract TestRareMinter is Test { // Prep args address payable[] memory splitRecipients = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); + uint16[] memory splitRatios = new uint16[](1); splitRecipients[0] = payable(alice); - splitRatios[0] = 100; + splitRatios[0] = 10000; uint256 startTime = block.timestamp + 60; vm.startPrank(alice); @@ -183,9 +190,9 @@ contract TestRareMinter is Test { currency.approve(address(rareMinter), amount + (amount * 3) / 100); // Prepare the mint address payable[] memory splitRecipients = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); + uint16[] memory splitRatios = new uint16[](1); splitRecipients[0] = payable(alice); - splitRatios[0] = 100; + splitRatios[0] = 10000; uint256 startTime = block.timestamp + 60; vm.startPrank(alice); @@ -250,9 +257,9 @@ contract TestRareMinter is Test { // Prepare the mint address payable[] memory splitRecipients = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); + uint16[] memory splitRatios = new uint16[](1); splitRecipients[0] = payable(alice); - splitRatios[0] = 100; + splitRatios[0] = 10000; uint256 startTime = block.timestamp + 60; vm.startPrank(alice); @@ -326,9 +333,9 @@ contract TestRareMinter is Test { // Prepare the mint address payable[] memory splitRecipients = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); + uint16[] memory splitRatios = new uint16[](1); splitRecipients[0] = payable(alice); - splitRatios[0] = 100; + splitRatios[0] = 10000; uint256 startTime = block.timestamp + 60; vm.startPrank(alice); @@ -385,9 +392,9 @@ contract TestRareMinter is Test { // Prepare the mint address payable[] memory splitRecipients = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); + uint16[] memory splitRatios = new uint16[](1); splitRecipients[0] = payable(alice); - splitRatios[0] = 100; + splitRatios[0] = 10000; uint256 startTime = block.timestamp + 60; vm.startPrank(alice); @@ -444,9 +451,9 @@ contract TestRareMinter is Test { // Prepare the mint address payable[] memory splitRecipients = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); + uint16[] memory splitRatios = new uint16[](1); splitRecipients[0] = payable(alice); - splitRatios[0] = 100; + splitRatios[0] = 10000; uint256 startTime = block.timestamp + 60; vm.startPrank(alice); @@ -487,9 +494,9 @@ contract TestRareMinter is Test { // Prepare the mint address payable[] memory splitRecipients = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); + uint16[] memory splitRatios = new uint16[](1); splitRecipients[0] = payable(alice); - splitRatios[0] = 100; + splitRatios[0] = 10000; uint256 startTime = block.timestamp + 60; vm.startPrank(alice); @@ -514,25 +521,24 @@ contract TestRareMinter is Test { vm.prank(deployer); testErc721.transferOwnership(alice); - // Prepare the mint + // Prepare the mint with ETH (address(0)) address payable[] memory splitRecipients = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); + uint16[] memory splitRatios = new uint16[](1); splitRecipients[0] = payable(alice); - splitRatios[0] = 100; + splitRatios[0] = 10000; uint256 startTime = block.timestamp + 60; vm.startPrank(alice); rareMinter.prepareMintDirectSale(address(testErc721), address(0), price, startTime, 0, splitRecipients, splitRatios); - vm.expectRevert(); vm.stopPrank(); // Warp to start time vm.warp(startTime); - vm.startPrank(charlie); - vm.expectRevert(); + // Try to mint with wrong currency (ERC20 instead of ETH) - should revert + vm.prank(charlie); + vm.expectRevert("mintDirectSale::Currency does not match required currency"); rareMinter.mintDirectSale(address(testErc721), currencyAddress, price, 3, emptyProof); - vm.stopPrank(); } function test_mintDirectSale_fail_unapproved_currency() public { @@ -546,9 +552,9 @@ contract TestRareMinter is Test { // Prepare the mint address payable[] memory splitRecipients = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); + uint16[] memory splitRatios = new uint16[](1); splitRecipients[0] = payable(alice); - splitRatios[0] = 100; + splitRatios[0] = 10000; uint256 startTime = block.timestamp + 60; vm.startPrank(alice); @@ -614,14 +620,14 @@ contract TestRareMinter is Test { abi.encode(false) ); - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% + // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector( IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, address(testErc721) ), - abi.encode(15) + abi.encode(uint16(1500)) ); } } diff --git a/src/test/forks/mainnet/18029585/bazaar/SuperRareBazaarAuctionUpgrade.t.sol b/src/test/forks/mainnet/18029585/bazaar/SuperRareBazaarAuctionUpgrade.t.sol index d915e50..f57794c 100644 --- a/src/test/forks/mainnet/18029585/bazaar/SuperRareBazaarAuctionUpgrade.t.sol +++ b/src/test/forks/mainnet/18029585/bazaar/SuperRareBazaarAuctionUpgrade.t.sol @@ -82,8 +82,8 @@ contract SuperRareBazaarAuctionUpgrade is Test { address payable[] memory splitAddresses = new address payable[](1); splitAddresses[0] = payable(auctionCreator); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; // Create an auction vm.prank(auctionCreator); bazaar.configureAuction( @@ -121,8 +121,8 @@ contract SuperRareBazaarAuctionUpgrade is Test { address payable[] memory splitAddresses = new address payable[](1); splitAddresses[0] = payable(auctionCreator); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; // Create an auction vm.prank(auctionCreator); bazaar.configureAuction( diff --git a/src/test/marketplace/MarketplaceSettingsV2.t.sol b/src/test/marketplace/MarketplaceSettingsV2.t.sol index ac338e1..fddd6b1 100644 --- a/src/test/marketplace/MarketplaceSettingsV2.t.sol +++ b/src/test/marketplace/MarketplaceSettingsV2.t.sol @@ -19,6 +19,11 @@ contract MarketplaceSettingsV2Test is Test { marketplaceV1.grantMarketplaceAccess(address(marketplaceV2)); } + function test_default_fees_are_zero() public { + assertEq(marketplaceV2.getMarketplaceFeePercentage(), 0); + assertEq(marketplaceV2.getERC721ContractPrimarySaleFeePercentage(address(0x1234)), 0); + } + function testMarkTokenSold() public { address _contractAddress = address(0x1234); uint256 _tokenId = 1; @@ -40,13 +45,13 @@ contract MarketplaceSettingsV2Test is Test { ); } - function testFailMarkTokenAsNotAdmin() public { + function test_RevertWhen_MarkTokenAsNotAdmin() public { address _contractAddress = address(0x1234); uint256 _tokenId = 1; bool _hasSold = true; vm.prank(address(0)); + vm.expectRevert(); marketplaceV2.markERC721Token(_contractAddress, _tokenId, _hasSold); - assertTrue(marketplaceV2.markContractAsSold(_contractAddress)); } } diff --git a/src/test/utils/MarketUtils.t.sol b/src/test/utils/MarketUtils.t.sol index 9aedd34..f45e72d 100644 --- a/src/test/utils/MarketUtils.t.sol +++ b/src/test/utils/MarketUtils.t.sol @@ -59,7 +59,7 @@ contract TestContract { uint256 _amount, address _seller, address payable[] memory _splitAddrs, - uint8[] memory _splitRatios + uint16[] memory _splitRatios ) public payable { config.payout(_originContract, _tokenId, _currencyAddress, _amount, _seller, _splitAddrs, _splitRatios); } @@ -145,8 +145,8 @@ contract MarketUtilsTest is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call -- 3% @@ -190,11 +190,11 @@ contract MarketUtilsTest is Test { abi.encode(false) ); - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% + // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); uint256 balanceBefore = charlie.balance; vm.prank(deployer); @@ -222,8 +222,8 @@ contract MarketUtilsTest is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call -- 3% @@ -267,11 +267,11 @@ contract MarketUtilsTest is Test { abi.encode(true) ); - // setup getPlatformCommission -- 5% + // setup getPlatformCommission -- 5% (500 bp) vm.mockCall( spaceOperatorRegistry, abi.encodeWithSelector(ISpaceOperatorRegistry.getPlatformCommission.selector, charlie), - abi.encode(5) + abi.encode(uint16(500)) ); uint256 balanceBefore = charlie.balance; vm.prank(deployer); @@ -299,8 +299,8 @@ contract MarketUtilsTest is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); address payable[] memory royaltyReceiverAddrs = new address payable[](1); uint256[] memory royaltyAmounts = new uint256[](1); @@ -383,8 +383,8 @@ contract MarketUtilsTest is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call -- 3% @@ -428,11 +428,11 @@ contract MarketUtilsTest is Test { abi.encode(false) ); - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% + // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); uint256 balanceBefore = rewardPool.balance; vm.prank(deployer); @@ -460,8 +460,8 @@ contract MarketUtilsTest is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call -- 3% @@ -505,11 +505,11 @@ contract MarketUtilsTest is Test { abi.encode(false) ); - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% + // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); vm.prank(deployer); tc.payout{value: amount + ((amount * 3) / 100)}( @@ -536,8 +536,8 @@ contract MarketUtilsTest is Test { address currencyAddress = address(rare); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call -- 3% @@ -581,11 +581,11 @@ contract MarketUtilsTest is Test { abi.encode(false) ); - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% + // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); vm.prank(deployer); rare.transfer(address(tc), amount + ((amount * 3) / 100)); diff --git a/src/test/v2/auctionhouse/RareBatchAuctionHouse.t.sol b/src/test/v2/auctionhouse/RareBatchAuctionHouse.t.sol index 5e2e201..50d8951 100644 --- a/src/test/v2/auctionhouse/RareBatchAuctionHouse.t.sol +++ b/src/test/v2/auctionhouse/RareBatchAuctionHouse.t.sol @@ -37,7 +37,7 @@ contract RareBatchAuctionHouseTest is Test { address bidder, uint128 amount, address currencyAddress, - uint8 marketplaceFee + uint16 marketplaceFee ); RareBatchAuctionHouse public auctionHouse; @@ -76,7 +76,7 @@ contract RareBatchAuctionHouseTest is Test { // Constants uint64 public constant AUCTION_DURATION = 1 days; uint128 public constant STARTING_AMOUNT = 1 ether; - uint8 public constant SPLIT_RATIO = 100; + uint16 public constant SPLIT_RATIO = 10000; function setUp() public { // Setup test users @@ -129,8 +129,8 @@ contract RareBatchAuctionHouseTest is Test { // Setup auction config address payable[] memory splitAddresses = new address payable[](1); splitAddresses[0] = payable(makeAddr("splitRecipient")); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; auctionConfig = IRareBatchAuctionHouse.MerkleAuctionConfig({ currency: address(currencyContract), @@ -163,7 +163,7 @@ contract RareBatchAuctionHouseTest is Test { vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getMarketplaceFeePercentage.selector), - abi.encode(uint8(3)) + abi.encode(uint16(300)) ); vm.mockCall( marketplaceSettings, @@ -233,7 +233,7 @@ contract RareBatchAuctionHouseTest is Test { vm.mockCall( spaceOperatorRegistry, abi.encodeWithSelector(ISpaceOperatorRegistry.getPlatformCommission.selector), - abi.encode(uint8(0)) + abi.encode(uint16(0)) ); // Mock approved token registry @@ -343,8 +343,8 @@ contract RareBatchAuctionHouseTest is Test { // Setup split addresses and ratios address payable[] memory splitAddresses = new address payable[](1); splitAddresses[0] = payable(makeAddr("splitRecipient")); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; // Mock isApprovedToken to return false for the invalid currency vm.mockCall( @@ -372,8 +372,8 @@ contract RareBatchAuctionHouseTest is Test { // Setup split addresses and ratios address payable[] memory splitAddresses = new address payable[](1); splitAddresses[0] = payable(makeAddr("splitRecipient")); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; // Try to register with zero duration vm.startPrank(auctionCreator); @@ -397,8 +397,8 @@ contract RareBatchAuctionHouseTest is Test { // Setup split addresses and ratios address payable[] memory splitAddresses = new address payable[](1); splitAddresses[0] = payable(makeAddr("splitRecipient")); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; // Register with minimum valid duration (1 second) vm.startPrank(auctionCreator); @@ -821,7 +821,7 @@ contract RareBatchAuctionHouseTest is Test { vm.mockCall( address(spaceOperatorRegistry), abi.encodeWithSelector(ISpaceOperatorRegistry.getPlatformCommission.selector, auctionCreator), - abi.encode(uint8(0)) + abi.encode(uint16(0)) ); vm.mockCall( marketplaceSettings, @@ -1034,7 +1034,7 @@ contract RareBatchAuctionHouseTest is Test { vm.mockCall( address(spaceOperatorRegistry), abi.encodeWithSelector(ISpaceOperatorRegistry.getPlatformCommission.selector, auctionCreator), - abi.encode(uint8(0)) + abi.encode(uint16(0)) ); vm.startPrank(bidder); @@ -1835,8 +1835,8 @@ contract RareBatchAuctionHouseTest is Test { // Setup: Approve the auction house to spend bidder's tokens vm.startPrank(bidder); - uint8 originalFeePercentage = 3; // 3% fee at bid time - uint128 originalMarketplaceFee = uint128((STARTING_AMOUNT * originalFeePercentage) / 100); + uint16 originalFeePercentage = 300; // 3% fee at bid time (300 bp) + uint128 originalMarketplaceFee = uint128((STARTING_AMOUNT * originalFeePercentage) / 10000); uint128 requiredAmount = STARTING_AMOUNT + originalMarketplaceFee; currencyContract.approve(address(erc20ApprovalManager), requiredAmount); @@ -1853,11 +1853,11 @@ contract RareBatchAuctionHouseTest is Test { vm.stopPrank(); // Verify the bid was recorded with the original marketplace fee percentage - (, , , uint8 storedMarketplaceFeeAtTime) = auctionHouse.getCurrentBid(address(nftContract), firstTokenId); + (, , , uint16 storedMarketplaceFeeAtTime) = auctionHouse.getCurrentBid(address(nftContract), firstTokenId); assertEq(storedMarketplaceFeeAtTime, originalFeePercentage, "Stored marketplace fee should be 3%"); // Simulate malicious admin changing marketplace fee to 100% after auction ends - uint8 maliciousNewFeePercentage = 100; // 100% fee - malicious change + uint16 maliciousNewFeePercentage = 10000; // 100% fee - malicious change (10000 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getMarketplaceFeePercentage.selector), @@ -1901,7 +1901,7 @@ contract RareBatchAuctionHouseTest is Test { // Additional verification: Check that the stored marketplace fee is still the original one // This verifies that our fix preserves the original fee percentage in the event - (, , , uint8 finalStoredFee) = auctionHouse.getCurrentBid(address(nftContract), firstTokenId); + (, , , uint16 finalStoredFee) = auctionHouse.getCurrentBid(address(nftContract), firstTokenId); // Note: After settlement, the bid is deleted, so this will return 0 // But the event should have emitted the correct stored fee } diff --git a/src/test/v2/marketplace/RareBatchListingMarketplace.t.sol b/src/test/v2/marketplace/RareBatchListingMarketplace.t.sol index 042a01d..0f424d1 100644 --- a/src/test/v2/marketplace/RareBatchListingMarketplace.t.sol +++ b/src/test/v2/marketplace/RareBatchListingMarketplace.t.sol @@ -64,7 +64,7 @@ contract RareBatchListingMarketplaceTest is Test { // Constants uint256 public constant SALE_PRICE = 1 ether; - uint8 public constant SPLIT_RATIO = 100; + uint16 public constant SPLIT_RATIO = 10000; function setUp() public { // Setup test users @@ -122,8 +122,8 @@ contract RareBatchListingMarketplaceTest is Test { // Setup sale price config address payable[] memory splitAddresses = new address payable[](1); splitAddresses[0] = payable(makeAddr("splitRecipient")); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; salePriceConfig = IRareBatchListingMarketplace.MerkleSalePriceConfig({ currency: address(currencyContract), @@ -155,7 +155,7 @@ contract RareBatchListingMarketplaceTest is Test { vm.mockCall( _marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getMarketplaceFeePercentage.selector), - abi.encode(uint8(3)) + abi.encode(uint16(300)) ); vm.mockCall( _marketplaceSettings, @@ -352,17 +352,17 @@ contract RareBatchListingMarketplaceTest is Test { // Create fresh tokens and Merkle tree (bytes32 root, , , ) = _createFreshMerkleTree(3); - // Create invalid splits (ratios don't sum to 100) + // Create invalid splits (ratios don't sum to 10000) address payable[] memory invalidSplitAddresses = new address payable[](2); invalidSplitAddresses[0] = payable(makeAddr("splitRecipient1")); invalidSplitAddresses[1] = payable(makeAddr("splitRecipient2")); - uint8[] memory invalidSplitRatios = new uint8[](2); - invalidSplitRatios[0] = 60; - invalidSplitRatios[1] = 60; // Total 120%, should fail + uint16[] memory invalidSplitRatios = new uint16[](2); + invalidSplitRatios[0] = 6000; + invalidSplitRatios[1] = 6000; // Total 120%, should fail // Try to register with invalid splits vm.startPrank(creator); - vm.expectRevert("checkSplits::Total must be equal to 100"); + vm.expectRevert("checkSplits::Total must be equal to 10000"); marketplace.registerSalePriceMerkleRoot( root, address(currencyContract), diff --git a/src/test/v2/utils/MarketUtilsV2.t.sol b/src/test/v2/utils/MarketUtilsV2.t.sol index 5e8ac0a..678c097 100644 --- a/src/test/v2/utils/MarketUtilsV2.t.sol +++ b/src/test/v2/utils/MarketUtilsV2.t.sol @@ -78,7 +78,7 @@ contract TestContract { config.addressMustHaveMarketplaceApprovedForNFT(_addr, _originContract, _tokenId); } - function checkSplits(address payable[] calldata _splitAddrs, uint8[] calldata _splitRatios) public pure { + function checkSplits(address payable[] calldata _splitAddrs, uint16[] calldata _splitRatios) public pure { MarketUtilsV2.checkSplits(_splitAddrs, _splitRatios); } @@ -101,7 +101,7 @@ contract TestContract { uint256 _amount, address _seller, address payable[] memory _splitAddrs, - uint8[] memory _splitRatios + uint16[] memory _splitRatios ) public payable { config.payout(_originContract, _tokenId, _currencyAddress, _amount, _seller, _splitAddrs, _splitRatios); } @@ -287,19 +287,19 @@ contract MarketUtilsV2Test is Test { function test_checkSplits_Success() public { address payable[] memory splitAddrs = new address payable[](2); - uint8[] memory splitRatios = new uint8[](2); + uint16[] memory splitRatios = new uint16[](2); splitAddrs[0] = payable(alice); splitAddrs[1] = payable(bob); - splitRatios[0] = 60; - splitRatios[1] = 40; + splitRatios[0] = 6000; + splitRatios[1] = 4000; tc.checkSplits(splitAddrs, splitRatios); } function test_checkSplits_EmptyArrays() public { address payable[] memory splitAddrs = new address payable[](0); - uint8[] memory splitRatios = new uint8[](0); + uint16[] memory splitRatios = new uint16[](0); vm.expectRevert("checkSplits::Must have at least 1 split"); tc.checkSplits(splitAddrs, splitRatios); @@ -307,7 +307,7 @@ contract MarketUtilsV2Test is Test { function test_checkSplits_TooManySplits() public { address payable[] memory splitAddrs = new address payable[](6); - uint8[] memory splitRatios = new uint8[](6); + uint16[] memory splitRatios = new uint16[](6); vm.expectRevert("checkSplits::Split exceeded max size"); tc.checkSplits(splitAddrs, splitRatios); @@ -315,7 +315,7 @@ contract MarketUtilsV2Test is Test { function test_checkSplits_UnequalArrays() public { address payable[] memory splitAddrs = new address payable[](2); - uint8[] memory splitRatios = new uint8[](3); + uint16[] memory splitRatios = new uint16[](3); vm.expectRevert("checkSplits::Splits and ratios must be equal"); tc.checkSplits(splitAddrs, splitRatios); @@ -323,14 +323,14 @@ contract MarketUtilsV2Test is Test { function test_checkSplits_InvalidTotal() public { address payable[] memory splitAddrs = new address payable[](2); - uint8[] memory splitRatios = new uint8[](2); + uint16[] memory splitRatios = new uint16[](2); splitAddrs[0] = payable(alice); splitAddrs[1] = payable(bob); - splitRatios[0] = 60; - splitRatios[1] = 30; + splitRatios[0] = 6000; + splitRatios[1] = 3000; - vm.expectRevert("checkSplits::Total must be equal to 100"); + vm.expectRevert("checkSplits::Total must be equal to 10000"); tc.checkSplits(splitAddrs, splitRatios); } @@ -424,8 +424,8 @@ contract MarketUtilsV2Test is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call @@ -477,11 +477,11 @@ contract MarketUtilsV2Test is Test { abi.encode(false) ); - // setup getERC721ContractPrimarySaleFeePercentage + // setup getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); // Mock royalty engine to return empty arrays for primary sale @@ -513,8 +513,8 @@ contract MarketUtilsV2Test is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); address payable[] memory royaltyReceiverAddrs = new address payable[](1); uint256[] memory royaltyAmounts = new uint256[](1); @@ -600,8 +600,8 @@ contract MarketUtilsV2Test is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call @@ -653,11 +653,11 @@ contract MarketUtilsV2Test is Test { abi.encode(true) ); - // setup getPlatformCommission -- 5% + // setup getPlatformCommission -- 5% (500 bp) vm.mockCall( spaceOperatorRegistry, abi.encodeWithSelector(ISpaceOperatorRegistry.getPlatformCommission.selector, charlie), - abi.encode(5) + abi.encode(uint16(500)) ); // Mock royalty engine to return empty arrays for primary sale with space operator @@ -691,8 +691,8 @@ contract MarketUtilsV2Test is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // Setup multiple royalty receivers @@ -790,11 +790,11 @@ contract MarketUtilsV2Test is Test { // Setup multiple splits address payable[] memory splitAddrs = new address payable[](2); - uint8[] memory splitRatios = new uint8[](2); + uint16[] memory splitRatios = new uint16[](2); splitAddrs[0] = payable(charlie); splitAddrs[1] = payable(bob); - splitRatios[0] = 60; // 60% - splitRatios[1] = 40; // 40% + splitRatios[0] = 6000; // 60% + splitRatios[1] = 4000; // 40% // setup getRewardAccumulatorAddressForUser call vm.mockCall( @@ -845,11 +845,11 @@ contract MarketUtilsV2Test is Test { abi.encode(false) ); - // setup getERC721ContractPrimarySaleFeePercentage + // setup getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); // Mock royalty engine to return empty arrays for primary sale with splits @@ -891,8 +891,8 @@ contract MarketUtilsV2Test is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // Setup TOO MANY royalty receivers (6, when max is 5) @@ -1023,8 +1023,8 @@ contract MarketUtilsV2Test is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // Setup 7 royalty receivers to test truncation preserves order @@ -1137,8 +1137,8 @@ contract MarketUtilsV2Test is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // Setup EXACTLY the maximum royalty receivers (5) @@ -1259,8 +1259,8 @@ contract MarketUtilsV2Test is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call @@ -1312,11 +1312,11 @@ contract MarketUtilsV2Test is Test { abi.encode(false) ); - // setup getERC721ContractPrimarySaleFeePercentage + // setup getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); // Mock royalty engine to return non-empty arrays to verify they are ignored @@ -1363,8 +1363,8 @@ contract MarketUtilsV2Test is Test { address currencyAddress = address(0); uint256 amount = 1 ether; address payable[] memory splitAddrs = new address payable[](1); - uint8[] memory splitRatios = new uint8[](1); - splitRatios[0] = 100; + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); // setup getRewardAccumulatorAddressForUser call @@ -1416,11 +1416,11 @@ contract MarketUtilsV2Test is Test { abi.encode(false) ); - // setup getERC721ContractPrimarySaleFeePercentage - should be ignored + // setup getERC721ContractPrimarySaleFeePercentage - should be ignored (15% = 1500 bp) vm.mockCall( marketplaceSettings, abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(15) + abi.encode(uint16(1500)) ); // Mock royalty engine to return empty arrays to verify primary fees aren't paid diff --git a/src/token/ERC721/sovereign/SovereignNFT.sol b/src/token/ERC721/sovereign/SovereignNFT.sol index 6ebc247..929d6f6 100644 --- a/src/token/ERC721/sovereign/SovereignNFT.sol +++ b/src/token/ERC721/sovereign/SovereignNFT.sol @@ -75,7 +75,7 @@ contract SovereignNFT is uint256 _maxTokens ) public initializer { require(_creator != address(0), "creator cannot be null address"); - _setDefaultRoyaltyPercentage(10); + _setDefaultRoyaltyPercentage(1000); disabled = false; tokenURIsLocked = false; maxTokens = _maxTokens; diff --git a/src/token/ERC721/sovereign/lazy/LazySovereignNFT.sol b/src/token/ERC721/sovereign/lazy/LazySovereignNFT.sol index 18dd70b..e5f8dff 100644 --- a/src/token/ERC721/sovereign/lazy/LazySovereignNFT.sol +++ b/src/token/ERC721/sovereign/lazy/LazySovereignNFT.sol @@ -102,7 +102,7 @@ contract LazySovereignNFT is uint256 _maxTokens ) public initializer { require(_creator != address(0), "creator cannot be null address"); - _setDefaultRoyaltyPercentage(10); + _setDefaultRoyaltyPercentage(1000); disabled = false; maxTokens = _maxTokens; diff --git a/src/token/extensions/ERC2981Upgradeable.sol b/src/token/extensions/ERC2981Upgradeable.sol index 089e186..61fc2ae 100644 --- a/src/token/extensions/ERC2981Upgradeable.sol +++ b/src/token/extensions/ERC2981Upgradeable.sol @@ -41,7 +41,7 @@ abstract contract ERC2981Upgradeable is IERC2981, ERC165Upgradeable { ? royaltyPercentages[_tokenId] : defaultRoyaltyPercentage ) - .div(100); + .div(10000); } function _setDefaultRoyaltyReceiver(address _receiver) internal { diff --git a/src/utils/MarketUtils.sol b/src/utils/MarketUtils.sol index 6ad489f..5988f35 100644 --- a/src/utils/MarketUtils.sol +++ b/src/utils/MarketUtils.sol @@ -38,10 +38,10 @@ library MarketUtils { /// @notice Verifies that the splits supplied are valid. /// @dev A valid split has the same number of splits and ratios. /// @dev There can only be a max of 5 parties split with. - /// @dev Total of the ratios should be 100 which is relative. + /// @dev Total of the ratios should be 10000 (basis points) which is relative. /// @param _splitAddrs The addresses the amount is being split with. - /// @param _splitRatios The ratios each address in _splits is getting. - function checkSplits(address payable[] calldata _splitAddrs, uint8[] calldata _splitRatios) internal pure { + /// @param _splitRatios The ratios each address in _splits is getting (basis points). + function checkSplits(address payable[] calldata _splitAddrs, uint16[] calldata _splitRatios) internal pure { require(_splitAddrs.length > 0, "checkSplits::Must have at least 1 split"); require(_splitAddrs.length <= 5, "checkSplits::Split exceeded max size"); require(_splitAddrs.length == _splitRatios.length, "checkSplits::Splits and ratios must be equal"); @@ -51,7 +51,7 @@ library MarketUtils { totalRatio += _splitRatios[i]; } - require(totalRatio == 100, "checkSplits::Total must be equal to 100"); + require(totalRatio == 10000, "checkSplits::Total must be equal to 10000"); } /// @notice Checks to see if the sender has approved the marketplace to move tokens. @@ -111,7 +111,7 @@ library MarketUtils { return; } - uint256 requiredAmount = _amount + ((_amount * _marketplaceFee) / 100); + uint256 requiredAmount = _amount + ((_amount * _marketplaceFee) / 10000); if (_currencyAddress == address(0)) { (bool success, bytes memory data) = address(_config.payments).call{value: requiredAmount}( @@ -137,7 +137,7 @@ library MarketUtils { /// @param _amount Total amount to be paid out. /// @param _seller Address of the person selling the asset. /// @param _splitAddrs Addresses that funds need to be split against. - /// @param _splitRatios Ratios for split pertaining to each address. + /// @param _splitRatios Ratios for split pertaining to each address (basis points). function payout( MarketConfig.Config storage _config, address _originContract, @@ -146,7 +146,7 @@ library MarketUtils { uint256 _amount, address _seller, address payable[] memory _splitAddrs, - uint8[] memory _splitRatios + uint16[] memory _splitRatios ) internal { require(_splitAddrs.length == _splitRatios.length, "Number of split addresses and ratios must be equal."); @@ -183,9 +183,9 @@ library MarketUtils { if (_config.spaceOperatorRegistry.isApprovedSpaceOperator(_seller)) { uint256 platformCommission = _config.spaceOperatorRegistry.getPlatformCommission(_seller); - remainingAmount = remainingAmount - ((_amount * platformCommission) / 100); + remainingAmount = remainingAmount - ((_amount * platformCommission) / 10000); - platformFee[0] = (_amount * platformCommission) / 100; + platformFee[0] = (_amount * platformCommission) / 10000; performPayouts(_config, _currencyAddress, platformFee[0], platformRecip, platformFee); } else { @@ -193,9 +193,9 @@ library MarketUtils { _originContract ); - remainingAmount = remainingAmount - ((_amount * platformCommission) / 100); + remainingAmount = remainingAmount - ((_amount * platformCommission) / 10000); - platformFee[0] = (_amount * platformCommission) / 100; + platformFee[0] = (_amount * platformCommission) / 10000; performPayouts(_config, _currencyAddress, platformFee[0], platformRecip, platformFee); } @@ -221,8 +221,8 @@ library MarketUtils { uint256 totalSplit = 0; for (uint256 i = 0; i < _splitAddrs.length; i++) { - remainingAmts[i] = (remainingAmount * _splitRatios[i]) / 100; - totalSplit += (remainingAmount * _splitRatios[i]) / 100; + remainingAmts[i] = (remainingAmount * _splitRatios[i]) / 10000; + totalSplit += (remainingAmount * _splitRatios[i]) / 10000; } performPayouts(_config, _currencyAddress, totalSplit, _splitAddrs, remainingAmts); } diff --git a/src/v2/auctionhouse/IRareBatchAuctionHouse.sol b/src/v2/auctionhouse/IRareBatchAuctionHouse.sol index 72358ab..1f898e7 100644 --- a/src/v2/auctionhouse/IRareBatchAuctionHouse.sol +++ b/src/v2/auctionhouse/IRareBatchAuctionHouse.sol @@ -26,7 +26,7 @@ interface IRareBatchAuctionHouse { function getAuctionDetails( address _originContract, uint256 _tokenId - ) external view returns (address, uint32, uint64, uint64, address, uint128, address payable[] memory, uint8[] memory); + ) external view returns (address, uint32, uint64, uint64, address, uint128, address payable[] memory, uint16[] memory); /// @notice Gets the current bid details for a specific token /// @param _originContract Contract address of the asset @@ -38,7 +38,7 @@ interface IRareBatchAuctionHouse { function getCurrentBid( address _originContract, uint256 _tokenId - ) external view returns (address bidder, address currencyAddress, uint128 amount, uint8 marketplaceFeeAtTime); + ) external view returns (address bidder, address currencyAddress, uint128 amount, uint16 marketplaceFeeAtTime); // Merkle Auction Functions @@ -55,7 +55,7 @@ interface IRareBatchAuctionHouse { uint128 _startingAmount, uint64 _duration, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; /// @notice Cancels a previously registered Merkle root @@ -134,14 +134,14 @@ interface IRareBatchAuctionHouse { uint64 lengthOfAuction; // 8 bytes uint128 minimumBid; // 16 bytes address payable[] splitRecipients; // dynamic - uint8[] splitRatios; // dynamic + uint16[] splitRatios; // dynamic } /// @notice Struct for storing bid information struct Bid { address bidder; // 20 bytes uint128 amount; // 16 bytes - uint8 marketplaceFeeAtTime; // 1 byte (percentage or basis points, capped at 255) + uint16 marketplaceFeeAtTime; // 2 bytes (basis points 0-10000) } /// @notice Struct for storing Merkle auction configuration @@ -151,7 +151,7 @@ interface IRareBatchAuctionHouse { uint64 duration; // 8 bytes (e.g., up to ~584 billion years in seconds) uint32 nonce; // 4 bytes (allows 4B Merkle roots per creator) address payable[] splitAddresses; // dynamic - uint8[] splitRatios; // dynamic + uint16[] splitRatios; // dynamic } // Events @@ -162,7 +162,7 @@ interface IRareBatchAuctionHouse { uint256 indexed tokenId, address currencyAddress, uint128 amount, - uint8 marketplaceFee, + uint16 marketplaceFee, address previousBidder ); @@ -174,7 +174,7 @@ interface IRareBatchAuctionHouse { address bidder, uint128 amount, address currencyAddress, - uint8 marketplaceFee + uint16 marketplaceFee ); /// @notice Emitted when a Merkle auction root is registered diff --git a/src/v2/auctionhouse/RareBatchAuctionHouse.sol b/src/v2/auctionhouse/RareBatchAuctionHouse.sol index af5f3f3..b11f0b6 100644 --- a/src/v2/auctionhouse/RareBatchAuctionHouse.sol +++ b/src/v2/auctionhouse/RareBatchAuctionHouse.sol @@ -108,8 +108,8 @@ contract RareBatchAuctionHouse is _erc721ApprovalManager ); - // Initialize auction settings - minimumBidIncreasePercentage = 1; + // Initialize auction settings (100 = 1% in basis points) + minimumBidIncreasePercentage = 100; maxAuctionLength = 7 days; auctionLengthExtension = 15 minutes; @@ -197,9 +197,9 @@ contract RareBatchAuctionHouse is ADMIN FUNCTIONS //////////////////////////////////////////////////////////////*/ - /// @notice Sets the minimum bid increase percentage - /// @param _minimumBidIncreasePercentage The new minimum bid increase percentage - function setMinimumBidIncreasePercentage(uint8 _minimumBidIncreasePercentage) external onlyOwner { + /// @notice Sets the minimum bid increase percentage in basis points (100 = 1%) + /// @param _minimumBidIncreasePercentage The new minimum bid increase in basis points + function setMinimumBidIncreasePercentage(uint16 _minimumBidIncreasePercentage) external onlyOwner { minimumBidIncreasePercentage = _minimumBidIncreasePercentage; } @@ -258,7 +258,7 @@ contract RareBatchAuctionHouse is // If not first bid, verify minimum increase percentage if (previousBidder != address(0)) { - uint256 minBidIncrease = (currentBid.amount * minimumBidIncreasePercentage) / 100; + uint256 minBidIncrease = (currentBid.amount * minimumBidIncreasePercentage) / 10000; require(_amount >= currentBid.amount + minBidIncrease, "Must increase bid by minimum percentage"); } @@ -361,7 +361,7 @@ contract RareBatchAuctionHouse is external view override - returns (address, uint32, uint64, uint64, address, uint128, address payable[] memory, uint8[] memory) + returns (address, uint32, uint64, uint64, address, uint128, address payable[] memory, uint16[] memory) { Auction memory auction = tokenAuctions[_originContract][_tokenId]; @@ -389,7 +389,7 @@ contract RareBatchAuctionHouse is uint128 _startingAmount, uint64 _duration, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external override { // Check if currency is approved marketConfig.checkIfCurrencyIsApproved(_currency); @@ -589,7 +589,7 @@ contract RareBatchAuctionHouse is external view override - returns (address bidder, address currencyAddress, uint128 amount, uint8 marketplaceFeeAtTime) + returns (address bidder, address currencyAddress, uint128 amount, uint16 marketplaceFeeAtTime) { Bid memory auctionBid = auctionBids[_originContract][_tokenId]; Auction memory auction = tokenAuctions[_originContract][_tokenId]; diff --git a/src/v2/marketplace/IRareBatchListingMarketplace.sol b/src/v2/marketplace/IRareBatchListingMarketplace.sol index cfbadcf..975f966 100644 --- a/src/v2/marketplace/IRareBatchListingMarketplace.sol +++ b/src/v2/marketplace/IRareBatchListingMarketplace.sol @@ -15,7 +15,7 @@ interface IRareBatchListingMarketplace { address currency; uint256 amount; address payable[] splitRecipients; - uint8[] splitRatios; + uint16[] splitRatios; uint256 nonce; } @@ -72,7 +72,7 @@ interface IRareBatchListingMarketplace { address _currency, uint256 _amount, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external; /// @notice Cancels a previously registered sale price Merkle root diff --git a/src/v2/marketplace/RareBatchListingMarketplace.sol b/src/v2/marketplace/RareBatchListingMarketplace.sol index 63834b2..c3f0cba 100644 --- a/src/v2/marketplace/RareBatchListingMarketplace.sol +++ b/src/v2/marketplace/RareBatchListingMarketplace.sol @@ -183,7 +183,7 @@ contract RareBatchListingMarketplace is address _currency, uint256 _amount, address payable[] calldata _splitAddresses, - uint8[] calldata _splitRatios + uint16[] calldata _splitRatios ) external override { // Validate currency _marketConfig.checkIfCurrencyIsApproved(_currency); diff --git a/src/v2/token/ERC721/sovereign/SovereignBatchMint.sol b/src/v2/token/ERC721/sovereign/SovereignBatchMint.sol index 278c95f..579044c 100644 --- a/src/v2/token/ERC721/sovereign/SovereignBatchMint.sol +++ b/src/v2/token/ERC721/sovereign/SovereignBatchMint.sol @@ -81,7 +81,7 @@ contract SovereignBatchMint is uint256 _maxTokens ) public initializer { require(_creator != address(0), "creator cannot be null address"); - _setDefaultRoyaltyPercentage(10); + _setDefaultRoyaltyPercentage(1000); disabled = false; tokenURIsLocked = false; maxTokens = _maxTokens; diff --git a/src/v2/utils/MarketUtilsV2.sol b/src/v2/utils/MarketUtilsV2.sol index d2a245b..af3f0ef 100644 --- a/src/v2/utils/MarketUtilsV2.sol +++ b/src/v2/utils/MarketUtilsV2.sol @@ -46,10 +46,10 @@ library MarketUtilsV2 { /// @notice Verifies that the splits supplied are valid. /// @dev A valid split has the same number of splits and ratios. /// @dev There can only be a max of 5 parties split with. - /// @dev Total of the ratios should be 100 which is relative. + /// @dev Total of the ratios should be 10000 (basis points) which is relative. /// @param _splitAddrs The addresses the amount is being split with. - /// @param _splitRatios The ratios each address in _splits is getting. - function checkSplits(address payable[] calldata _splitAddrs, uint8[] calldata _splitRatios) internal pure { + /// @param _splitRatios The ratios each address in _splits is getting (basis points). + function checkSplits(address payable[] calldata _splitAddrs, uint16[] calldata _splitRatios) internal pure { require(_splitAddrs.length > 0, "checkSplits::Must have at least 1 split"); require(_splitAddrs.length <= 5, "checkSplits::Split exceeded max size"); require(_splitAddrs.length == _splitRatios.length, "checkSplits::Splits and ratios must be equal"); @@ -59,7 +59,7 @@ library MarketUtilsV2 { totalRatio += _splitRatios[i]; } - require(totalRatio == 100, "checkSplits::Total must be equal to 100"); + require(totalRatio == 10000, "checkSplits::Total must be equal to 10000"); } /// @notice Checks to see if the approval manager has approval to transfer tokens @@ -130,7 +130,7 @@ library MarketUtilsV2 { return; } - uint256 requiredAmount = _amount + ((_amount * _marketplaceFee) / 100); + uint256 requiredAmount = _amount + ((_amount * _marketplaceFee) / 10000); if (_currencyAddress == address(0)) { (bool success, bytes memory data) = address(_config.payments).call{value: requiredAmount}( @@ -156,7 +156,7 @@ library MarketUtilsV2 { /// @param _amount Total amount to be paid out. /// @param _seller Address of the person selling the asset. /// @param _splitAddrs Addresses that funds need to be split against. - /// @param _splitRatios Ratios for split pertaining to each address. + /// @param _splitRatios Ratios for split pertaining to each address (basis points). function payout( MarketConfigV2.Config storage _config, address _originContract, @@ -165,7 +165,7 @@ library MarketUtilsV2 { uint256 _amount, address _seller, address payable[] memory _splitAddrs, - uint8[] memory _splitRatios + uint16[] memory _splitRatios ) internal { payoutWithMarketplaceFee( _config, @@ -192,7 +192,7 @@ library MarketUtilsV2 { /// @param _seller Address of the person selling the asset. /// @param _splitAddrs Addresses that funds need to be split against. /// @param _splitRatios Ratios for split pertaining to each address. - /// @param _marketplaceFeePercentage The marketplace fee percentage to use for this payout. + /// @param _marketplaceFeePercentage The marketplace fee percentage in basis points to use for this payout. function payoutWithMarketplaceFee( MarketConfigV2.Config storage _config, address _originContract, @@ -201,8 +201,8 @@ library MarketUtilsV2 { uint256 _amount, address _seller, address payable[] memory _splitAddrs, - uint8[] memory _splitRatios, - uint8 _marketplaceFeePercentage + uint16[] memory _splitRatios, + uint16 _marketplaceFeePercentage ) internal { require(_splitAddrs.length == _splitRatios.length, "Number of split addresses and ratios must be equal."); @@ -218,8 +218,8 @@ library MarketUtilsV2 { uint256 remainingAmount = _amount; - // Marketplace fee - use the provided fee percentage instead of current settings - uint256 marketplaceFee = (_amount * _marketplaceFeePercentage) / 100; + // Marketplace fee - use the provided fee percentage (basis points) instead of current settings + uint256 marketplaceFee = (_amount * _marketplaceFeePercentage) / 10000; address payable[] memory mktFeeRecip = new address payable[](2); mktFeeRecip[0] = payable(_config.networkBeneficiary); @@ -243,9 +243,9 @@ library MarketUtilsV2 { if (_config.spaceOperatorRegistry.isApprovedSpaceOperator(_seller)) { uint256 platformCommission = _config.spaceOperatorRegistry.getPlatformCommission(_seller); - remainingAmount = remainingAmount - ((_amount * platformCommission) / 100); + remainingAmount = remainingAmount - ((_amount * platformCommission) / 10000); - platformFee[0] = (_amount * platformCommission) / 100; + platformFee[0] = (_amount * platformCommission) / 10000; performPayouts(_config, _currencyAddress, platformFee[0], platformRecip, platformFee); } else { @@ -253,9 +253,9 @@ library MarketUtilsV2 { _originContract ); - remainingAmount = remainingAmount - ((_amount * platformCommission) / 100); + remainingAmount = remainingAmount - ((_amount * platformCommission) / 10000); - platformFee[0] = (_amount * platformCommission) / 100; + platformFee[0] = (_amount * platformCommission) / 10000; performPayouts(_config, _currencyAddress, platformFee[0], platformRecip, platformFee); } @@ -297,7 +297,7 @@ library MarketUtilsV2 { // Calculate and pay out splits uint256[] memory splitAmounts = new uint256[](_splitRatios.length); for (uint256 i = 0; i < _splitRatios.length; i++) { - splitAmounts[i] = (remainingAmount * _splitRatios[i]) / 100; + splitAmounts[i] = (remainingAmount * _splitRatios[i]) / 10000; } performPayouts(_config, _currencyAddress, remainingAmount, _splitAddrs, splitAmounts); From ad690e80f0e4720e848fceb27a2c49d20eeec1de Mon Sep 17 00:00:00 2001 From: Jonathan Perkins Date: Tue, 10 Mar 2026 07:18:03 -0400 Subject: [PATCH 2/2] feat: configurable fees, Sepolia deployment, and registry components - Add configurable fee support to Bazaar, Marketplace, and AuctionHouse - Add Sepolia deployment script and configuration - Add RareAppRegistry, ManifoldRoyaltyRegistryStub, StakingRegistryStub - Update Bazaar tests and auction upgrade fork test - Add libraries-solidity submodule Made-with: Cursor --- .gitmodules | 3 + abis/SuperRareBazaar.json | 3529 ++++++++++++++++- deployments/sepolia.json | 22 + foundry.lock | 53 + foundry.toml | 5 +- lib/libraries-solidity | 1 + remappings.txt | 4 +- script/DeploySepolia.s.sol | 173 + script/sepolia/deploy.sh | 71 + script/sepolia/env.sample | 22 + src/auctionhouse/ISuperRareAuctionHouse.sol | 4 +- src/auctionhouse/SuperRareAuctionHouse.sol | 37 +- src/bazaar/ISuperRareBazaar.sol | 12 +- src/bazaar/SuperRareBazaar.sol | 32 +- src/bazaar/SuperRareBazaarBase.sol | 117 +- src/bazaar/SuperRareBazaarStorage.sol | 23 +- src/marketplace/ISuperRareMarketplace.sol | 8 +- src/marketplace/MarketplaceSettingsV3.sol | 25 +- src/marketplace/SuperRareMarketplace.sol | 60 +- src/registry/IRareAppRegistry.sol | 24 + src/registry/ManifoldRoyaltyRegistryStub.sol | 32 + src/registry/RareAppRegistry.sol | 79 + src/staking/registry/StakingRegistryStub.sol | 131 + src/test/bazaar/BazaarBase.t.sol | 328 +- src/test/bazaar/SuperRareBazaar.t.sol | 119 +- .../SuperRareBazaarAuctionUpgrade.t.sol | 6 +- src/test/registry/RareAppRegistry.t.sol | 139 + 27 files changed, 4665 insertions(+), 394 deletions(-) create mode 100644 deployments/sepolia.json create mode 100644 foundry.lock create mode 160000 lib/libraries-solidity create mode 100644 script/DeploySepolia.s.sol create mode 100755 script/sepolia/deploy.sh create mode 100644 script/sepolia/env.sample create mode 100644 src/registry/IRareAppRegistry.sol create mode 100644 src/registry/ManifoldRoyaltyRegistryStub.sol create mode 100644 src/registry/RareAppRegistry.sol create mode 100644 src/staking/registry/StakingRegistryStub.sol create mode 100644 src/test/registry/RareAppRegistry.t.sol diff --git a/.gitmodules b/.gitmodules index 8616d33..e9c3dd5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -41,3 +41,6 @@ path = lib/murky url = https://github.com/dmfxyz/murky branch = main +[submodule "lib/libraries-solidity"] + path = lib/libraries-solidity + url = https://github.com/manifoldxyz/libraries-solidity diff --git a/abis/SuperRareBazaar.json b/abis/SuperRareBazaar.json index 6a4ed9d..2de6d23 100644 --- a/abis/SuperRareBazaar.json +++ b/abis/SuperRareBazaar.json @@ -1 +1,3528 @@ -{"abi":[{"type":"function","name":"COLDIE_AUCTION","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"NO_AUCTION","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"SCHEDULED_AUCTION","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"acceptOffer","inputs":[{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_currencyAddress","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_splitAddresses","type":"address[]","internalType":"address payable[]"},{"name":"_splitRatios","type":"uint8[]","internalType":"uint8[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"approvedTokenRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IApprovedTokenRegistry"}],"stateMutability":"view"},{"type":"function","name":"auctionBids","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"bidder","type":"address","internalType":"address payable"},{"name":"currencyAddress","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"marketplaceFee","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"auctionLengthExtension","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bid","inputs":[{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_currencyAddress","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"buy","inputs":[{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_currencyAddress","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"cancelAuction","inputs":[{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"cancelOffer","inputs":[{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_currencyAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"configureAuction","inputs":[{"name":"_auctionType","type":"bytes32","internalType":"bytes32"},{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_startingAmount","type":"uint256","internalType":"uint256"},{"name":"_currencyAddress","type":"address","internalType":"address"},{"name":"_lengthOfAuction","type":"uint256","internalType":"uint256"},{"name":"_startTime","type":"uint256","internalType":"uint256"},{"name":"_splitAddresses","type":"address[]","internalType":"address payable[]"},{"name":"_splitRatios","type":"uint8[]","internalType":"uint8[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"convertOfferToAuction","inputs":[{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_currencyAddress","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_lengthOfAuction","type":"uint256","internalType":"uint256"},{"name":"_splitAddresses","type":"address[]","internalType":"address payable[]"},{"name":"_splitRatios","type":"uint8[]","internalType":"uint8[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getAuctionDetails","inputs":[{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"","type":"address[]","internalType":"address payable[]"},{"name":"","type":"uint8[]","internalType":"uint8[]"}],"stateMutability":"view"},{"type":"function","name":"getSalePrice","inputs":[{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_target","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address[]","internalType":"address payable[]"},{"name":"","type":"uint8[]","internalType":"uint8[]"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_marketplaceSettings","type":"address","internalType":"address"},{"name":"_royaltyRegistry","type":"address","internalType":"address"},{"name":"_royaltyEngine","type":"address","internalType":"address"},{"name":"_superRareMarketplace","type":"address","internalType":"address"},{"name":"_superRareAuctionHouse","type":"address","internalType":"address"},{"name":"_spaceOperatorRegistry","type":"address","internalType":"address"},{"name":"_approvedTokenRegistry","type":"address","internalType":"address"},{"name":"_payments","type":"address","internalType":"address"},{"name":"_stakingRegistry","type":"address","internalType":"address"},{"name":"_networkBeneficiary","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"marketplaceSettings","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IMarketplaceSettings"}],"stateMutability":"view"},{"type":"function","name":"maxAuctionLength","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"minimumBidIncreasePercentage","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"networkBeneficiary","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"offer","inputs":[{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_currencyAddress","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_convertible","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"offerCancelationDelay","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"payments","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IPayments"}],"stateMutability":"view"},{"type":"function","name":"removeSalePrice","inputs":[{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_target","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"royaltyEngine","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IRoyaltyEngineV1"}],"stateMutability":"view"},{"type":"function","name":"royaltyRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IRareRoyaltyRegistry"}],"stateMutability":"view"},{"type":"function","name":"setApprovedTokenRegistry","inputs":[{"name":"_approvedTokenRegistry","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setAuctionLengthExtension","inputs":[{"name":"_auctionLengthExtension","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMarketplaceSettings","inputs":[{"name":"_marketplaceSettings","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMaxAuctionLength","inputs":[{"name":"_maxAuctionLength","type":"uint8","internalType":"uint8"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMinimumBidIncreasePercentage","inputs":[{"name":"_minimumBidIncreasePercentage","type":"uint8","internalType":"uint8"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setNetworkBeneficiary","inputs":[{"name":"_networkBeneficiary","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setOfferCancelationDelay","inputs":[{"name":"_offerCancelationDelay","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setPayments","inputs":[{"name":"_payments","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setRoyaltyEngine","inputs":[{"name":"_royaltyEngine","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setRoyaltyRegistry","inputs":[{"name":"_royaltyRegistry","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setSalePrice","inputs":[{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"},{"name":"_currencyAddress","type":"address","internalType":"address"},{"name":"_listPrice","type":"uint256","internalType":"uint256"},{"name":"_target","type":"address","internalType":"address"},{"name":"_splitAddresses","type":"address[]","internalType":"address payable[]"},{"name":"_splitRatios","type":"uint8[]","internalType":"uint8[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setSpaceOperatorRegistry","inputs":[{"name":"_spaceOperatorRegistry","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setStakingRegistry","inputs":[{"name":"_stakingRegistry","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setSuperRareAuctionHouse","inputs":[{"name":"_superRareAuctionHouse","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setSuperRareMarketplace","inputs":[{"name":"_superRareMarketplace","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"settleAuction","inputs":[{"name":"_originContract","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"spaceOperatorRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ISpaceOperatorRegistry"}],"stateMutability":"view"},{"type":"function","name":"stakingRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"superRareAuctionHouse","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"superRareMarketplace","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"tokenAuctions","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"auctionCreator","type":"address","internalType":"address payable"},{"name":"creationBlock","type":"uint256","internalType":"uint256"},{"name":"startingTime","type":"uint256","internalType":"uint256"},{"name":"lengthOfAuction","type":"uint256","internalType":"uint256"},{"name":"currencyAddress","type":"address","internalType":"address"},{"name":"minimumBid","type":"uint256","internalType":"uint256"},{"name":"auctionType","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"tokenCurrentOffers","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"buyer","type":"address","internalType":"address payable"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"timestamp","type":"uint256","internalType":"uint256"},{"name":"marketplaceFee","type":"uint8","internalType":"uint8"},{"name":"convertible","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"tokenSalePrices","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"seller","type":"address","internalType":"address payable"},{"name":"currencyAddress","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"AcceptOffer","inputs":[{"name":"_originContract","type":"address","indexed":true,"internalType":"address"},{"name":"_bidder","type":"address","indexed":true,"internalType":"address"},{"name":"_seller","type":"address","indexed":true,"internalType":"address"},{"name":"_currencyAddress","type":"address","indexed":false,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_splitAddresses","type":"address[]","indexed":false,"internalType":"address payable[]"},{"name":"_splitRatios","type":"uint8[]","indexed":false,"internalType":"uint8[]"}],"anonymous":false},{"type":"event","name":"AuctionBid","inputs":[{"name":"_contractAddress","type":"address","indexed":true,"internalType":"address"},{"name":"_bidder","type":"address","indexed":true,"internalType":"address"},{"name":"_tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_currencyAddress","type":"address","indexed":false,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_startedAuction","type":"bool","indexed":false,"internalType":"bool"},{"name":"_newAuctionLength","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_previousBidder","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"AuctionSettled","inputs":[{"name":"_contractAddress","type":"address","indexed":true,"internalType":"address"},{"name":"_bidder","type":"address","indexed":true,"internalType":"address"},{"name":"_seller","type":"address","indexed":false,"internalType":"address"},{"name":"_tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_currencyAddress","type":"address","indexed":false,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"CancelAuction","inputs":[{"name":"_contractAddress","type":"address","indexed":true,"internalType":"address"},{"name":"_tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_auctionCreator","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"CancelOffer","inputs":[{"name":"_originContract","type":"address","indexed":true,"internalType":"address"},{"name":"_bidder","type":"address","indexed":true,"internalType":"address"},{"name":"_currencyAddress","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_tokenId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"NewAuction","inputs":[{"name":"_contractAddress","type":"address","indexed":true,"internalType":"address"},{"name":"_tokenId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"_auctionCreator","type":"address","indexed":true,"internalType":"address"},{"name":"_currencyAddress","type":"address","indexed":false,"internalType":"address"},{"name":"_startingTime","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_minimumBid","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_lengthOfAuction","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OfferPlaced","inputs":[{"name":"_originContract","type":"address","indexed":true,"internalType":"address"},{"name":"_bidder","type":"address","indexed":true,"internalType":"address"},{"name":"_currencyAddress","type":"address","indexed":true,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_convertible","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SetSalePrice","inputs":[{"name":"_originContract","type":"address","indexed":true,"internalType":"address"},{"name":"_currencyAddress","type":"address","indexed":true,"internalType":"address"},{"name":"_target","type":"address","indexed":false,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_splitRecipients","type":"address[]","indexed":false,"internalType":"address payable[]"},{"name":"_splitRatios","type":"uint8[]","indexed":false,"internalType":"uint8[]"}],"anonymous":false},{"type":"event","name":"Sold","inputs":[{"name":"_originContract","type":"address","indexed":true,"internalType":"address"},{"name":"_buyer","type":"address","indexed":true,"internalType":"address"},{"name":"_seller","type":"address","indexed":true,"internalType":"address"},{"name":"_currencyAddress","type":"address","indexed":false,"internalType":"address"},{"name":"_amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_tokenId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false}],"bytecode":{"object":"0x60808060405234601557612307908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081629d9aa9146118ee575080630141c590146118c6578063060d9eeb146117ed5780630a5c4ed5146117d05780630bcba09d146117a85780630cd87c681461165b5780630e519ef91461163e5780630f2b2532146115af57806310f797891461158e578063155a56b114611574578063176ab4401461152d5780631a2ac30f146114c857806321ede03214611481578063299a0e1e146114085780632a2a326c146113c15780632c4190531461133f5780632c740844146112f85780633492e5a8146112b1578063369679a4146111aa5780633bc3d9be1461118257806348626b90146111455780634c94c90c1461111d5780635138b08c146110be578063534665e914610fdd5780636240cd1c14610fb55780636b534ed014610f8d5780636fe9f44c14610f6a578063715018a614610f0f5780637a54479214610eee5780637f35823014610ea757806384a608e214610e60578063859b97fe14610e015780638da5cb5b14610dd95780639041a0ec14610cd95780639c883af214610c92578063a11b071214610c6a578063a6d23e1014610c42578063af231a5814610bfb578063b23afc2614610bcc578063b3ffb76014610b6d578063b567858814610b0e578063ba50b63214610ae6578063c306b378146107bb578063c47c35c114610726578063c8f94f4e14610624578063c90b8714146105f8578063daa26499146105db578063dce96bf5146105b2578063e4e87e3b1461056b578063e92f94d1146104fc578063f2fde38b1461046d5763f7cfaad014610257575f80fd5b346104565761026536611a0b565b6040516331a9108f60e11b81526004810183905290926001600160a01b03169190602081602481865afa908115610462575f9161041c575b506001600160a01b031633036103cb575f7fb6039ff1edf80efca6bc48b89f5415ba07fecb2d321058dae9ce6369b2ff964b91819484835260a460205260408320828452602052604083209060018060a01b03168352602052600460408320838155836001820155836002820155600381018054858255806103b1575b505001805483825580610391575b505061038c60209161037e6040516103408582611b16565b85815285368137604051926103558685611b16565b86845286368137604051968796818852870152604086015260a0606086015260a0850190611999565b9083820360808501526119d5565b0390a3005b6103aa918452601f60208520910160051c8101906121bb565b5f80610328565b6103c491865260208620908101906121bb565b5f8061031a565b60405162461bcd60e51b8152602060048201526024808201527f72656d6f766553616c6550726963653a3a4d75737420626520746f6b656e4f776044820152633732b91760e11b6064820152608490fd5b90506020813d60201161045a575b8161043760209383611b16565b8101031261045657516001600160a01b0381168103610456575f61029d565b5f80fd5b3d915061042a565b6040513d5f823e3d90fd5b3461045657602036600319011261045657610486611911565b61048e6121d1565b6001600160a01b038116156104a8576104a690612229565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b34610456576104a65f8061050f36611a0b565b609a5460405163e92f94d160e01b602082019081526001600160a01b0395861660248301526044820194909452918416606480840191909152825290921691610559608482611b16565b51915af4610565611b37565b90611b75565b3461045657602036600319011261045657610584611911565b61058c6121d1565b6001600160a01b03168015610456576001600160601b0360a01b609d541617609d555f80f35b346104565760203660031901126104565760ff6105cd611a45565b6105d56121d1565b1660a155005b34610456575f36600319011261045657602060a254604051908152f35b34610456575f366003190112610456576040516d21a7a62224a2afa0aaa1aa24a7a760911b8152602090f35b346104565760e03660031901126104565761063d611911565b610645611927565b61064d611953565b60a4356001600160401b0381116104565761066c903690600401611969565b909360c435926001600160401b038411610456576105595f956107186104a69861070661069e8a993690600401611969565b609a5460405163647ca7a760e11b602082019081526001600160a01b039b8c16602480840191909152356044830152978b16606480830191909152356084820152988a1660a48a015260e060c48a015290981698949787959193909291610104870191611a93565b8481036023190160e486015291611ad7565b03601f198101835282611b16565b34610456576040366003190112610456576001600160a01b03610747611911565b165f5260a660205260405f206024355f5260205260e060405f2060018060a01b03815416906001810154906002810154600382015460018060a01b03600484015416916006600585015494015494604051968752602087015260408601526060850152608084015260a083015260c0820152f35b3461045657610140366003190112610456576107d5611911565b6107dd61193d565b6107e5611927565b906064356001600160a01b0381169081900361045657610803611953565b9160a4356001600160a01b038116908190036104565760c4356001600160a01b03811692908390036104565760e4356001600160a01b038116949085900361045657610104356001600160a01b038116969087900361045657610124356001600160a01b0381169890899003610456575f549960ff8b60081c16159a8b809c610ad9575b8015610ac2575b15610a665760ff1981166001175f558b610a55575b506001600160a01b0316938415610456576001600160a01b0316908115610456576001600160a01b0316918215610456578315610456576001600160a01b0316938415610456578515610456578615610456578715610456578915610456576001600160601b0360a01b60975416176097556001600160601b0360a01b60985416176098556001600160601b0360a01b60995416176099556001600160601b0360a01b609a541617609a556001600160601b0360a01b609b541617609b556001600160601b0360a01b609c541617609c556001600160601b0360a01b609d541617609d556001600160601b0360a01b609e541617609e556001600160601b0360a01b609f541617609f55600560a11b906affffffffffffffffffffff60a81b60a05416171760a05562093a8060a15561038460a25561012c60a3556109f760ff5f5460081c166109f281612271565b612271565b610a0033612229565b5f5490610a1660ff8360081c166109f281612271565b6001606555610a2157005b61ff0019165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b61ffff1916610101175f558b6108a3565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b15801561088e5750600160ff82161461088e565b50600160ff821610610887565b34610456575f366003190112610456576097546040516001600160a01b039091168152602090f35b6104a65f80610559610b1f36611a55565b609b546040516316acf0b160e31b602082019081526001600160a01b039687166024830152604482019590955292851660648401526084830191909152909216929091908160a48101610718565b6104a65f80610559610b7e36611a55565b609a5460405163059ffdbb60e51b602082019081526001600160a01b039687166024830152604482019590955292851660648401526084830191909152909216929091908160a48101610718565b34610456575f366003190112610456576040517029a1a422a22aa622a22fa0aaa1aa24a7a760791b8152602090f35b3461045657602036600319011261045657610c14611911565b610c1c6121d1565b6001600160a01b03168015610456576001600160601b0360a01b609e541617609e555f80f35b34610456575f36600319011261045657609e546040516001600160a01b039091168152602090f35b34610456575f366003190112610456576098546040516001600160a01b039091168152602090f35b3461045657602036600319011261045657610cab611911565b610cb36121d1565b6001600160a01b03168015610456576001600160601b0360a01b609a541617609a555f80f35b346104565761012036600319011261045657610cf361193d565b610cfb611953565b9060e4356001600160401b03811161045657610d1b903690600401611969565b929061010435926001600160401b038411610456576104a6946105595f9594610718610d4c88973690600401611969565b610dc660018060a01b03609b541698604051978896602088019a632410683b60e21b8c5260043560248a015260018060a01b031660448901526044356064890152606435608489015260018060a01b031660a488015260a43560c488015260c43560e4880152610120610104880152610144870191611a93565b8481036023190161012486015291611ad7565b34610456575f366003190112610456576033546040516001600160a01b039091168152602090f35b34610456576040366003190112610456576104a65f80610e1f611911565b609b546040516342cdcbff60e11b602082019081526001600160a01b0393841660248084019190915235604483015291909216916105598160648101610718565b3461045657602036600319011261045657610e79611911565b610e816121d1565b6001600160a01b03168015610456576001600160601b0360a01b60985416176098555f80f35b3461045657602036600319011261045657610ec0611911565b610ec86121d1565b6001600160a01b03168015610456576001600160601b0360a01b609c541617609c555f80f35b3461045657602036600319011261045657610f076121d1565b60043560a355005b34610456575f36600319011261045657610f276121d1565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610456575f36600319011261045657602060ff60a05460a01c16604051908152f35b34610456575f3660031901126104565760a0546040516001600160a01b039091168152602090f35b34610456575f36600319011261045657609d546040516001600160a01b039091168152602090f35b346104565760c036600319011261045657610ff6611911565b610ffe611927565b906084356001600160401b0381116104565761101e903690600401611969565b929060a435926001600160401b038411610456576104a6946105595f959461071861104e88973690600401611969565b609a5460405163534665e960e01b602082019081526001600160a01b03998a1660248084019190915235604483015295891660648083019190915235608482015260c060a482015297169793969586946110ac9160e4870191611a93565b8481036023190160c486015291611ad7565b34610456576040366003190112610456576104a65f806110dc611911565b609b5460405163144e2c2360e21b602082019081526001600160a01b0393841660248084019190915235604483015291909216916105598160648101610718565b34610456575f366003190112610456576099546040516001600160a01b039091168152602090f35b346104565760203660031901126104565761115e611a45565b6111666121d1565b60a0805460ff60a01b191691811b60ff60a01b16919091179055005b34610456575f36600319011261045657609b546040516001600160a01b039091168152602090f35b34610456576111b836611a0b565b9160018060a01b03165f5260a460205260405f20905f5260205260405f209060018060a01b03165f5260205260405f2060405160a081018181106001600160401b0382111761129d57604090815282546001600160a01b039081168352600184015416602083019081526002840154918301918252909290916112999161037e90611258600461124a60038401611bbc565b926060860193845201611c0f565b608084018190529251945195519051604080516001600160a01b0397881681529790961660208801529486015260a060608601819052859490850190611999565b0390f35b634e487b7160e01b5f52604160045260245ffd5b34610456576020366003190112610456576112ca611911565b6112d26121d1565b6001600160a01b03168015610456576001600160601b0360a01b60a054161760a0555f80f35b3461045657602036600319011261045657611311611911565b6113196121d1565b6001600160a01b03168015610456576001600160601b0360a01b609f541617609f555f80f35b346104565761134d36611a0b565b9160018060a01b03165f5260a560205260405f20905f5260205260405f209060018060a01b03165f5260205260a060405f2060ff600180841b0382541691600181015490600360028201549101549160405194855260208501526040840152818116606084015260081c1615156080820152f35b34610456576020366003190112610456576113da611911565b6113e26121d1565b6001600160a01b03168015610456576001600160601b0360a01b609b541617609b555f80f35b34610456576040366003190112610456576001600160a01b03611429611911565b165f5260a760205260405f206024355f52602052608060405f2060018060a01b038154169060018060a01b036001820154169060ff600360028301549201541691604051938452602084015260408301526060820152f35b346104565760203660031901126104565761149a611911565b6114a26121d1565b6001600160a01b03168015610456576001600160601b0360a01b60995416176099555f80f35b34610456576114d636611a0b565b6001600160a01b039283165f90815260a46020908152604080832094835293815283822092851682529182528290208054600182015460029092015484519186168252919094169184019190915290820152606090f35b3461045657602036600319011261045657611546611911565b61154e6121d1565b6001600160a01b03168015610456576001600160601b0360a01b60975416176097555f80f35b34610456575f3660031901126104565760206040515f8152f35b34610456576020366003190112610456576115a76121d1565b60043560a255005b60a0366003190112610456576115c3611911565b6115cb611927565b906084359182151580930361045657609a54604051630795929960e11b602082019081526001600160a01b0394851660248084019190915235604483015292841660648083019190915235608482015260a4808201959095529384526104a6935f9384939216919061055960c482611b16565b34610456575f36600319011261045657602060a154604051908152f35b34610456576040366003190112610456576001600160a01b0361167c611911565b165f5260a660205260405f206024355f5260205260405f2060405161012081018181106001600160401b0382111761129d5760405260018060a01b03825416815261129960018301549160208101928352611799600285015494604083019586526003810154906060840191825260018060a01b0360048201541660808501908152600582015460a0860190815260068301549160c08701928352611736600861172860078701611bbc565b9560e08a0196875201611c0f565b968761010082015260018060a01b039051169851995194519060018060a01b03905116915192519351946040519a8b9a8b5260208b015260408a01526060890152608088015260a087015260c086015261012060e0860152610120850190611999565b908382036101008501526119d5565b34610456575f36600319011261045657609c546040516001600160a01b039091168152602090f35b34610456575f36600319011261045657602060a354604051908152f35b346104565760e036600319011261045657611806611911565b61180e611927565b9060a4356001600160401b0381116104565761182e903690600401611969565b929060c435926001600160401b038411610456576104a6946105595f959461071861185e88973690600401611969565b61070660018060a01b03609b541698604051978896602088019a63060d9eeb60e01b8c5260018060a01b03166024890152602435604489015260018060a01b03166064880152606435608488015260843560a488015260e060c4880152610104870191611a93565b34610456575f36600319011261045657609a546040516001600160a01b039091168152602090f35b34610456575f36600319011261045657609f546001600160a01b03168152602090f35b600435906001600160a01b038216820361045657565b604435906001600160a01b038216820361045657565b602435906001600160a01b038216820361045657565b608435906001600160a01b038216820361045657565b9181601f84011215610456578235916001600160401b038311610456576020808501948460051b01011161045657565b90602080835192838152019201905f5b8181106119b65750505090565b82516001600160a01b03168452602093840193909201916001016119a9565b90602080835192838152019201905f5b8181106119f25750505090565b825160ff168452602093840193909201916001016119e5565b6060906003190112610456576004356001600160a01b03811681036104565790602435906044356001600160a01b03811681036104565790565b6004359060ff8216820361045657565b6080906003190112610456576004356001600160a01b03811681036104565790602435906044356001600160a01b0381168103610456579060643590565b916020908281520191905f905b808210611aad5750505090565b90919283359060018060a01b03821680920361045657602081600193829352019401920190611aa0565b916020908281520191905f905b808210611af15750505090565b90919283359060ff821680920361045657602081600193829352019401920190611ae4565b90601f801991011681019081106001600160401b0382111761129d57604052565b3d15611b70573d906001600160401b03821161129d5760405191611b65601f8201601f191660200184611b16565b82523d5f602084013e565b606090565b15611b7d5750565b604460209160405192839162461bcd60e51b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fd5b90604051918281549182825260208201905f5260205f20925f5b818110611bed575050611beb92500383611b16565b565b84546001600160a01b0316835260019485019487945060209093019201611bd6565b90604051918281549182825260208201905f5260205f20925f905b80601f83011061201357611beb945491818110611fff575b818110611fe8575b818110611fd1575b818110611fba575b818110611fa4575b818110611f8d575b818110611f76575b818110611f5f575b818110611f48575b818110611f31575b818110611f1a575b818110611f03575b818110611eec575b818110611ed5575b818110611ebe575b818110611ea7575b818110611e90575b818110611e79575b818110611e62575b818110611e4b575b818110611e34575b818110611e1d575b818110611e06575b818110611def575b818110611dd8575b818110611dc1575b818110611daa575b818110611d93575b818110611d7c575b818110611d65575b818110611d4e575b10611d40575b500383611b16565b60f81c81526020015f611d38565b92602060019160ff8560f01c168152019301611d32565b92602060019160ff8560e81c168152019301611d2a565b92602060019160ff8560e01c168152019301611d22565b92602060019160ff8560d81c168152019301611d1a565b92602060019160ff8560d01c168152019301611d12565b92602060019160ff8560c81c168152019301611d0a565b92602060019160ff8560c01c168152019301611d02565b92602060019160ff8560b81c168152019301611cfa565b92602060019160ff8560b01c168152019301611cf2565b92602060019160ff8560a81c168152019301611cea565b92602060019160ff8560a01c168152019301611ce2565b92602060019160ff8560981c168152019301611cda565b92602060019160ff8560901c168152019301611cd2565b92602060019160ff8560881c168152019301611cca565b92602060019160ff8560801c168152019301611cc2565b92602060019160ff8560781c168152019301611cba565b92602060019160ff8560701c168152019301611cb2565b92602060019160ff8560681c168152019301611caa565b92602060019160ff8560601c168152019301611ca2565b92602060019160ff8560581c168152019301611c9a565b92602060019160ff8560501c168152019301611c92565b92602060019160ff8560481c168152019301611c8a565b92602060019160ff8560401c168152019301611c82565b92602060019160ff8560381c168152019301611c7a565b92602060019160ff8560301c168152019301611c72565b92602060019160ff8560281c168152019301611c6a565b92602060019160ff85831c168152019301611c62565b92602060019160ff8560181c168152019301611c5a565b92602060019160ff8560101c168152019301611c52565b92602060019160ff8560081c168152019301611c4a565b92602060019160ff85168152019301611c42565b916020919350610400600191865460ff8116825260ff8160081c168583015260ff8160101c16604083015260ff8160181c16606083015260ff81861c16608083015260ff8160281c1660a083015260ff8160301c1660c083015260ff8160381c1660e083015260ff8160401c1661010083015260ff8160481c1661012083015260ff8160501c1661014083015260ff8160581c1661016083015260ff8160601c1661018083015260ff8160681c166101a083015260ff8160701c166101c083015260ff8160781c166101e083015260ff8160801c1661020083015260ff8160881c1661022083015260ff8160901c1661024083015260ff8160981c1661026083015260ff8160a01c1661028083015260ff8160a81c166102a083015260ff8160b01c166102c083015260ff8160b81c166102e083015260ff8160c01c1661030083015260ff8160c81c1661032083015260ff8160d01c1661034083015260ff8160d81c1661036083015260ff8160e01c1661038083015260ff8160e81c166103a083015260ff8160f01c166103c083015260f81c6103e0820152019401920185929391611c2a565b8181106121c6575050565b5f81556001016121bb565b6033546001600160a01b031633036121e557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b1561227857565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fdfea2646970667358221220bfe0dd338acb4a0c9aceb2013c38237fbb692859441cec083e21b66d04dd95f264736f6c634300081c0033","sourceMap":"1245:17632:60:-:0;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c9081629d9aa9146118ee575080630141c590146118c6578063060d9eeb146117ed5780630a5c4ed5146117d05780630bcba09d146117a85780630cd87c681461165b5780630e519ef91461163e5780630f2b2532146115af57806310f797891461158e578063155a56b114611574578063176ab4401461152d5780631a2ac30f146114c857806321ede03214611481578063299a0e1e146114085780632a2a326c146113c15780632c4190531461133f5780632c740844146112f85780633492e5a8146112b1578063369679a4146111aa5780633bc3d9be1461118257806348626b90146111455780634c94c90c1461111d5780635138b08c146110be578063534665e914610fdd5780636240cd1c14610fb55780636b534ed014610f8d5780636fe9f44c14610f6a578063715018a614610f0f5780637a54479214610eee5780637f35823014610ea757806384a608e214610e60578063859b97fe14610e015780638da5cb5b14610dd95780639041a0ec14610cd95780639c883af214610c92578063a11b071214610c6a578063a6d23e1014610c42578063af231a5814610bfb578063b23afc2614610bcc578063b3ffb76014610b6d578063b567858814610b0e578063ba50b63214610ae6578063c306b378146107bb578063c47c35c114610726578063c8f94f4e14610624578063c90b8714146105f8578063daa26499146105db578063dce96bf5146105b2578063e4e87e3b1461056b578063e92f94d1146104fc578063f2fde38b1461046d5763f7cfaad014610257575f80fd5b346104565761026536611a0b565b6040516331a9108f60e11b81526004810183905290926001600160a01b03169190602081602481865afa908115610462575f9161041c575b506001600160a01b031633036103cb575f7fb6039ff1edf80efca6bc48b89f5415ba07fecb2d321058dae9ce6369b2ff964b91819484835260a460205260408320828452602052604083209060018060a01b03168352602052600460408320838155836001820155836002820155600381018054858255806103b1575b505001805483825580610391575b505061038c60209161037e6040516103408582611b16565b85815285368137604051926103558685611b16565b86845286368137604051968796818852870152604086015260a0606086015260a0850190611999565b9083820360808501526119d5565b0390a3005b6103aa918452601f60208520910160051c8101906121bb565b5f80610328565b6103c491865260208620908101906121bb565b5f8061031a565b60405162461bcd60e51b8152602060048201526024808201527f72656d6f766553616c6550726963653a3a4d75737420626520746f6b656e4f776044820152633732b91760e11b6064820152608490fd5b90506020813d60201161045a575b8161043760209383611b16565b8101031261045657516001600160a01b0381168103610456575f61029d565b5f80fd5b3d915061042a565b6040513d5f823e3d90fd5b3461045657602036600319011261045657610486611911565b61048e6121d1565b6001600160a01b038116156104a8576104a690612229565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b34610456576104a65f8061050f36611a0b565b609a5460405163e92f94d160e01b602082019081526001600160a01b0395861660248301526044820194909452918416606480840191909152825290921691610559608482611b16565b51915af4610565611b37565b90611b75565b3461045657602036600319011261045657610584611911565b61058c6121d1565b6001600160a01b03168015610456576001600160601b0360a01b609d541617609d555f80f35b346104565760203660031901126104565760ff6105cd611a45565b6105d56121d1565b1660a155005b34610456575f36600319011261045657602060a254604051908152f35b34610456575f366003190112610456576040516d21a7a62224a2afa0aaa1aa24a7a760911b8152602090f35b346104565760e03660031901126104565761063d611911565b610645611927565b61064d611953565b60a4356001600160401b0381116104565761066c903690600401611969565b909360c435926001600160401b038411610456576105595f956107186104a69861070661069e8a993690600401611969565b609a5460405163647ca7a760e11b602082019081526001600160a01b039b8c16602480840191909152356044830152978b16606480830191909152356084820152988a1660a48a015260e060c48a015290981698949787959193909291610104870191611a93565b8481036023190160e486015291611ad7565b03601f198101835282611b16565b34610456576040366003190112610456576001600160a01b03610747611911565b165f5260a660205260405f206024355f5260205260e060405f2060018060a01b03815416906001810154906002810154600382015460018060a01b03600484015416916006600585015494015494604051968752602087015260408601526060850152608084015260a083015260c0820152f35b3461045657610140366003190112610456576107d5611911565b6107dd61193d565b6107e5611927565b906064356001600160a01b0381169081900361045657610803611953565b9160a4356001600160a01b038116908190036104565760c4356001600160a01b03811692908390036104565760e4356001600160a01b038116949085900361045657610104356001600160a01b038116969087900361045657610124356001600160a01b0381169890899003610456575f549960ff8b60081c16159a8b809c610ad9575b8015610ac2575b15610a665760ff1981166001175f558b610a55575b506001600160a01b0316938415610456576001600160a01b0316908115610456576001600160a01b0316918215610456578315610456576001600160a01b0316938415610456578515610456578615610456578715610456578915610456576001600160601b0360a01b60975416176097556001600160601b0360a01b60985416176098556001600160601b0360a01b60995416176099556001600160601b0360a01b609a541617609a556001600160601b0360a01b609b541617609b556001600160601b0360a01b609c541617609c556001600160601b0360a01b609d541617609d556001600160601b0360a01b609e541617609e556001600160601b0360a01b609f541617609f55600560a11b906affffffffffffffffffffff60a81b60a05416171760a05562093a8060a15561038460a25561012c60a3556109f760ff5f5460081c166109f281612271565b612271565b610a0033612229565b5f5490610a1660ff8360081c166109f281612271565b6001606555610a2157005b61ff0019165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b61ffff1916610101175f558b6108a3565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b15801561088e5750600160ff82161461088e565b50600160ff821610610887565b34610456575f366003190112610456576097546040516001600160a01b039091168152602090f35b6104a65f80610559610b1f36611a55565b609b546040516316acf0b160e31b602082019081526001600160a01b039687166024830152604482019590955292851660648401526084830191909152909216929091908160a48101610718565b6104a65f80610559610b7e36611a55565b609a5460405163059ffdbb60e51b602082019081526001600160a01b039687166024830152604482019590955292851660648401526084830191909152909216929091908160a48101610718565b34610456575f366003190112610456576040517029a1a422a22aa622a22fa0aaa1aa24a7a760791b8152602090f35b3461045657602036600319011261045657610c14611911565b610c1c6121d1565b6001600160a01b03168015610456576001600160601b0360a01b609e541617609e555f80f35b34610456575f36600319011261045657609e546040516001600160a01b039091168152602090f35b34610456575f366003190112610456576098546040516001600160a01b039091168152602090f35b3461045657602036600319011261045657610cab611911565b610cb36121d1565b6001600160a01b03168015610456576001600160601b0360a01b609a541617609a555f80f35b346104565761012036600319011261045657610cf361193d565b610cfb611953565b9060e4356001600160401b03811161045657610d1b903690600401611969565b929061010435926001600160401b038411610456576104a6946105595f9594610718610d4c88973690600401611969565b610dc660018060a01b03609b541698604051978896602088019a632410683b60e21b8c5260043560248a015260018060a01b031660448901526044356064890152606435608489015260018060a01b031660a488015260a43560c488015260c43560e4880152610120610104880152610144870191611a93565b8481036023190161012486015291611ad7565b34610456575f366003190112610456576033546040516001600160a01b039091168152602090f35b34610456576040366003190112610456576104a65f80610e1f611911565b609b546040516342cdcbff60e11b602082019081526001600160a01b0393841660248084019190915235604483015291909216916105598160648101610718565b3461045657602036600319011261045657610e79611911565b610e816121d1565b6001600160a01b03168015610456576001600160601b0360a01b60985416176098555f80f35b3461045657602036600319011261045657610ec0611911565b610ec86121d1565b6001600160a01b03168015610456576001600160601b0360a01b609c541617609c555f80f35b3461045657602036600319011261045657610f076121d1565b60043560a355005b34610456575f36600319011261045657610f276121d1565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610456575f36600319011261045657602060ff60a05460a01c16604051908152f35b34610456575f3660031901126104565760a0546040516001600160a01b039091168152602090f35b34610456575f36600319011261045657609d546040516001600160a01b039091168152602090f35b346104565760c036600319011261045657610ff6611911565b610ffe611927565b906084356001600160401b0381116104565761101e903690600401611969565b929060a435926001600160401b038411610456576104a6946105595f959461071861104e88973690600401611969565b609a5460405163534665e960e01b602082019081526001600160a01b03998a1660248084019190915235604483015295891660648083019190915235608482015260c060a482015297169793969586946110ac9160e4870191611a93565b8481036023190160c486015291611ad7565b34610456576040366003190112610456576104a65f806110dc611911565b609b5460405163144e2c2360e21b602082019081526001600160a01b0393841660248084019190915235604483015291909216916105598160648101610718565b34610456575f366003190112610456576099546040516001600160a01b039091168152602090f35b346104565760203660031901126104565761115e611a45565b6111666121d1565b60a0805460ff60a01b191691811b60ff60a01b16919091179055005b34610456575f36600319011261045657609b546040516001600160a01b039091168152602090f35b34610456576111b836611a0b565b9160018060a01b03165f5260a460205260405f20905f5260205260405f209060018060a01b03165f5260205260405f2060405160a081018181106001600160401b0382111761129d57604090815282546001600160a01b039081168352600184015416602083019081526002840154918301918252909290916112999161037e90611258600461124a60038401611bbc565b926060860193845201611c0f565b608084018190529251945195519051604080516001600160a01b0397881681529790961660208801529486015260a060608601819052859490850190611999565b0390f35b634e487b7160e01b5f52604160045260245ffd5b34610456576020366003190112610456576112ca611911565b6112d26121d1565b6001600160a01b03168015610456576001600160601b0360a01b60a054161760a0555f80f35b3461045657602036600319011261045657611311611911565b6113196121d1565b6001600160a01b03168015610456576001600160601b0360a01b609f541617609f555f80f35b346104565761134d36611a0b565b9160018060a01b03165f5260a560205260405f20905f5260205260405f209060018060a01b03165f5260205260a060405f2060ff600180841b0382541691600181015490600360028201549101549160405194855260208501526040840152818116606084015260081c1615156080820152f35b34610456576020366003190112610456576113da611911565b6113e26121d1565b6001600160a01b03168015610456576001600160601b0360a01b609b541617609b555f80f35b34610456576040366003190112610456576001600160a01b03611429611911565b165f5260a760205260405f206024355f52602052608060405f2060018060a01b038154169060018060a01b036001820154169060ff600360028301549201541691604051938452602084015260408301526060820152f35b346104565760203660031901126104565761149a611911565b6114a26121d1565b6001600160a01b03168015610456576001600160601b0360a01b60995416176099555f80f35b34610456576114d636611a0b565b6001600160a01b039283165f90815260a46020908152604080832094835293815283822092851682529182528290208054600182015460029092015484519186168252919094169184019190915290820152606090f35b3461045657602036600319011261045657611546611911565b61154e6121d1565b6001600160a01b03168015610456576001600160601b0360a01b60975416176097555f80f35b34610456575f3660031901126104565760206040515f8152f35b34610456576020366003190112610456576115a76121d1565b60043560a255005b60a0366003190112610456576115c3611911565b6115cb611927565b906084359182151580930361045657609a54604051630795929960e11b602082019081526001600160a01b0394851660248084019190915235604483015292841660648083019190915235608482015260a4808201959095529384526104a6935f9384939216919061055960c482611b16565b34610456575f36600319011261045657602060a154604051908152f35b34610456576040366003190112610456576001600160a01b0361167c611911565b165f5260a660205260405f206024355f5260205260405f2060405161012081018181106001600160401b0382111761129d5760405260018060a01b03825416815261129960018301549160208101928352611799600285015494604083019586526003810154906060840191825260018060a01b0360048201541660808501908152600582015460a0860190815260068301549160c08701928352611736600861172860078701611bbc565b9560e08a0196875201611c0f565b968761010082015260018060a01b039051169851995194519060018060a01b03905116915192519351946040519a8b9a8b5260208b015260408a01526060890152608088015260a087015260c086015261012060e0860152610120850190611999565b908382036101008501526119d5565b34610456575f36600319011261045657609c546040516001600160a01b039091168152602090f35b34610456575f36600319011261045657602060a354604051908152f35b346104565760e036600319011261045657611806611911565b61180e611927565b9060a4356001600160401b0381116104565761182e903690600401611969565b929060c435926001600160401b038411610456576104a6946105595f959461071861185e88973690600401611969565b61070660018060a01b03609b541698604051978896602088019a63060d9eeb60e01b8c5260018060a01b03166024890152602435604489015260018060a01b03166064880152606435608488015260843560a488015260e060c4880152610104870191611a93565b34610456575f36600319011261045657609a546040516001600160a01b039091168152602090f35b34610456575f36600319011261045657609f546001600160a01b03168152602090f35b600435906001600160a01b038216820361045657565b604435906001600160a01b038216820361045657565b602435906001600160a01b038216820361045657565b608435906001600160a01b038216820361045657565b9181601f84011215610456578235916001600160401b038311610456576020808501948460051b01011161045657565b90602080835192838152019201905f5b8181106119b65750505090565b82516001600160a01b03168452602093840193909201916001016119a9565b90602080835192838152019201905f5b8181106119f25750505090565b825160ff168452602093840193909201916001016119e5565b6060906003190112610456576004356001600160a01b03811681036104565790602435906044356001600160a01b03811681036104565790565b6004359060ff8216820361045657565b6080906003190112610456576004356001600160a01b03811681036104565790602435906044356001600160a01b0381168103610456579060643590565b916020908281520191905f905b808210611aad5750505090565b90919283359060018060a01b03821680920361045657602081600193829352019401920190611aa0565b916020908281520191905f905b808210611af15750505090565b90919283359060ff821680920361045657602081600193829352019401920190611ae4565b90601f801991011681019081106001600160401b0382111761129d57604052565b3d15611b70573d906001600160401b03821161129d5760405191611b65601f8201601f191660200184611b16565b82523d5f602084013e565b606090565b15611b7d5750565b604460209160405192839162461bcd60e51b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fd5b90604051918281549182825260208201905f5260205f20925f5b818110611bed575050611beb92500383611b16565b565b84546001600160a01b0316835260019485019487945060209093019201611bd6565b90604051918281549182825260208201905f5260205f20925f905b80601f83011061201357611beb945491818110611fff575b818110611fe8575b818110611fd1575b818110611fba575b818110611fa4575b818110611f8d575b818110611f76575b818110611f5f575b818110611f48575b818110611f31575b818110611f1a575b818110611f03575b818110611eec575b818110611ed5575b818110611ebe575b818110611ea7575b818110611e90575b818110611e79575b818110611e62575b818110611e4b575b818110611e34575b818110611e1d575b818110611e06575b818110611def575b818110611dd8575b818110611dc1575b818110611daa575b818110611d93575b818110611d7c575b818110611d65575b818110611d4e575b10611d40575b500383611b16565b60f81c81526020015f611d38565b92602060019160ff8560f01c168152019301611d32565b92602060019160ff8560e81c168152019301611d2a565b92602060019160ff8560e01c168152019301611d22565b92602060019160ff8560d81c168152019301611d1a565b92602060019160ff8560d01c168152019301611d12565b92602060019160ff8560c81c168152019301611d0a565b92602060019160ff8560c01c168152019301611d02565b92602060019160ff8560b81c168152019301611cfa565b92602060019160ff8560b01c168152019301611cf2565b92602060019160ff8560a81c168152019301611cea565b92602060019160ff8560a01c168152019301611ce2565b92602060019160ff8560981c168152019301611cda565b92602060019160ff8560901c168152019301611cd2565b92602060019160ff8560881c168152019301611cca565b92602060019160ff8560801c168152019301611cc2565b92602060019160ff8560781c168152019301611cba565b92602060019160ff8560701c168152019301611cb2565b92602060019160ff8560681c168152019301611caa565b92602060019160ff8560601c168152019301611ca2565b92602060019160ff8560581c168152019301611c9a565b92602060019160ff8560501c168152019301611c92565b92602060019160ff8560481c168152019301611c8a565b92602060019160ff8560401c168152019301611c82565b92602060019160ff8560381c168152019301611c7a565b92602060019160ff8560301c168152019301611c72565b92602060019160ff8560281c168152019301611c6a565b92602060019160ff85831c168152019301611c62565b92602060019160ff8560181c168152019301611c5a565b92602060019160ff8560101c168152019301611c52565b92602060019160ff8560081c168152019301611c4a565b92602060019160ff85168152019301611c42565b916020919350610400600191865460ff8116825260ff8160081c168583015260ff8160101c16604083015260ff8160181c16606083015260ff81861c16608083015260ff8160281c1660a083015260ff8160301c1660c083015260ff8160381c1660e083015260ff8160401c1661010083015260ff8160481c1661012083015260ff8160501c1661014083015260ff8160581c1661016083015260ff8160601c1661018083015260ff8160681c166101a083015260ff8160701c166101c083015260ff8160781c166101e083015260ff8160801c1661020083015260ff8160881c1661022083015260ff8160901c1661024083015260ff8160981c1661026083015260ff8160a01c1661028083015260ff8160a81c166102a083015260ff8160b01c166102c083015260ff8160b81c166102e083015260ff8160c01c1661030083015260ff8160c81c1661032083015260ff8160d01c1661034083015260ff8160d81c1661036083015260ff8160e01c1661038083015260ff8160e81c166103a083015260ff8160f01c166103c083015260f81c6103e0820152019401920185929391611c2a565b8181106121c6575050565b5f81556001016121bb565b6033546001600160a01b031633036121e557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b1561227857565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fdfea2646970667358221220bfe0dd338acb4a0c9aceb2013c38237fbb692859441cec083e21b66d04dd95f264736f6c634300081c0033","sourceMap":"1245:17632:60:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;10978:24:60;;1245:17632;10978:24;;1245:17632;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;10978:24;1245:17632;;10978:24;;;;;;;1245:17632;10978:24;;;1245:17632;-1:-1:-1;;;;;;1245:17632:60;11017:10;:24;1245:17632;;;11159:108;1245:17632;;;;;;11096:15;1245:17632;;;;;;;;;;;;;11096:51;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;11159:108;;;1245:17632;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;;10978:24;1245:17632;;;;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;;10978:24;;;1245:17632;10978:24;;1245:17632;10978:24;;;;;;1245:17632;10978:24;;;:::i;:::-;;;1245:17632;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;10978:24;;;1245:17632;;;;10978:24;;;-1:-1:-1;10978:24:60;;;1245:17632;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;;2402:22:19;1245:17632:60;;2496:8:19;;;:::i;:::-;1245:17632:60;;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;8571:30;1245:17632;;;;;:::i;:::-;8423:20;1245:17632;;;-1:-1:-1;;;8464:94:60;;;;;;-1:-1:-1;;;;;1245:17632:60;;;8464:94;;;1245:17632;;;;;;;;;;;;;;;;;;;8464:94;;1245:17632;;;;8464:94;;1245:17632;8464:94;:::i;:::-;8423:141;;;;;;:::i;:::-;8571:30;;:::i;1245:17632::-;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;4557:36;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;4600:70;1245:17632;;;4600:70;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;1245:17632:60;5422:36;1245:17632;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;6547:37:62;1245:17632:60;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;9973:219;1245:17632;;;10205:30;1245:17632;;;;;;;;;;:::i;:::-;9932:20;1245:17632;;;-1:-1:-1;;;1245:17632:60;9973:219;;;;;-1:-1:-1;;;;;1245:17632:60;;;;9973:219;;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9973:219;;1245:17632;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1245:17632:60;;;;;;;:::i;:::-;9973:219;15297:234;;9973:219;;;;;;:::i;1245:17632::-;;;;;;-1:-1:-1;;1245:17632:60;;;;-1:-1:-1;;;;;1245:17632:60;;:::i;:::-;;;;7097:68:62;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;7097:68:62;1245:17632:60;7097:68:62;;1245:17632:60;7097:68:62;;;;1245:17632:60;7097:68:62;;;1245:17632:60;;;;;;;7097:68:62;;1245:17632:60;;7097:68:62;;;;;1245:17632:60;7097:68:62;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;;;3301:14:25;;;;3347:34;;;1245:17632:60;3346:108:25;;;;1245:17632:60;;;;-1:-1:-1;;1245:17632:60;;3551:1:25;1245:17632:60;;;;3562:65:25;;1245:17632:60;-1:-1:-1;;;;;;1245:17632:60;;1913:34;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;1962:30;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;2007:28;;1245:17632;;2050:35;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;2100:36;;1245:17632;;2151:36;;1245:17632;;2202:36;;1245:17632;;2253:23;;1245:17632;;2291:33;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;2332:64;1245:17632;;;2332:64;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2402:56;1245:17632;;;2402:56;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2464:48;1245:17632;;;2464:48;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2518:44;1245:17632;;;2518:44;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2568:46;1245:17632;;;2568:46;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2620:70;1245:17632;;;2620:70;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2696:70;1245:17632;;;2696:70;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2772:31;1245:17632;;;2772:31;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2809:34;1245:17632;;;2809:34;1245:17632;;;;;;;;;;;;;;;2954:6;2935:25;1245:17632;2991:10;2966:35;1245:17632;3031:9;3007:33;1245:17632;5366:69:25;1245:17632:60;;;;;;5366:69:25;;;:::i;:::-;;:::i;:::-;1195:12:19;929:10:30;1195:12:19;:::i;:::-;1245:17632:60;;;5366:69:25;1245:17632:60;;;;;5366:69:25;;;:::i;:::-;3551:1;2065:22:27;1245:17632:60;3647:99:25;;1245:17632:60;3647:99:25;1245:17632:60;;;;;3721:14:25;1245:17632:60;;;3551:1:25;1245:17632:60;;3721:14:25;1245:17632:60;3562:65:25;-1:-1:-1;;1245:17632:60;;;;;3562:65:25;;;1245:17632:60;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;;3346:108:25;3426:4;;1713:19:29;:23;3387:66:25;;3346:108;3387:66;1245:17632:60;3452:1:25;1245:17632:60;;;3436:17:25;3346:108;;3347:34;1245:17632:60;3380:1:25;1245:17632:60;;;3365:16:25;3347:34;;1245:17632:60;;;;;;-1:-1:-1;;1245:17632:60;;;;5377:47:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;16870:30;1245:17632;;16762:95;1245:17632;;;:::i;:::-;16720:21;1245:17632;;;-1:-1:-1;;;16762:95:60;;;;;;-1:-1:-1;;;;;1245:17632:60;;;16762:95;;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;16762:95;;1245:17632;;;;;16762:95;1245:17632;;7978:30;1245:17632;;7870:95;1245:17632;;;:::i;:::-;7829:20;1245:17632;;;-1:-1:-1;;;7870:95:60;;;;;;-1:-1:-1;;;;;1245:17632:60;;;7870:95;;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;7870:95;;1245:17632;;;;;7870:95;1245:17632;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;4752:23;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;4782:31;1245:17632;;;4782:31;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;6119:25:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;5484:43:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;3945:35;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;3987:44;1245:17632;;;3987:44;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;14204:30;1245:17632;13912:279;1245:17632;;;;;;;;;;;;:::i;:::-;;;;;;;13870:21;1245:17632;;;;;13912:279;;;1245:17632;13912:279;;1245:17632;;;;13912:279;;1245:17632;;;13912:279;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1245:17632:60;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1245:17632:60;;;;1513:6:19;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;16121:30;1245:17632;;;;:::i;:::-;15988:21;1245:17632;;;-1:-1:-1;;;1245:17632:60;16030:78;;;;;-1:-1:-1;;;;;1245:17632:60;;;;16030:78;;;1245:17632;;;;;;;;;;;;;;16030:78;1245:17632;;;;16030:78;1245:17632;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;3571:30;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;3608:56;1245:17632;;;3608:56;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;4336:36;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;4379:70;1245:17632;;;4379:70;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;1303:62:19;;:::i;:::-;1245:17632:60;;5708:46;1245:17632;;;;;;;;-1:-1:-1;;1245:17632:60;;;;1303:62:19;;:::i;:::-;2758:6;1245:17632:60;;-1:-1:-1;;;;;;1245:17632:60;;;;;;;-1:-1:-1;;;;;1245:17632:60;2806:40:19;1245:17632:60;;2806:40:19;1245:17632:60;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;6372:41:62;1245:17632:60;6372:41:62;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;6025:51:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;12398:30;1245:17632;12187:198;1245:17632;;;;;;;;;;;;:::i;:::-;12146:20;1245:17632;;;-1:-1:-1;;;1245:17632:60;12187:198;;;;;-1:-1:-1;;;;;1245:17632:60;;;;12187:198;;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12187:198;;1245:17632;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1245:17632:60;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1245:17632:60;;;;17398:30;1245:17632;;;;:::i;:::-;17265:21;1245:17632;;;-1:-1:-1;;;1245:17632:60;17307:78;;;;;-1:-1:-1;;;;;1245:17632:60;;;;17307:78;;;1245:17632;;;;;;;;;;;;;;17307:78;1245:17632;;;;17307:78;1245:17632;;;;;;;-1:-1:-1;;1245:17632:60;;;;5586:37:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;5274:60:60;1245:17632;;-1:-1:-1;;;;1245:17632:60;;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;5789:36:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18727:15;1245:17632;;;;;;;;;;;;;18727:51;1245:17632;;;;;;-1:-1:-1;1245:17632:60;;;;-1:-1:-1;1245:17632:60;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18835:18;;1245:17632;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;5082:33;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;5122:40;1245:17632;;;5122:40;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;4909:30;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;4946:34;1245:17632;;;4946:34;1245:17632;;;;;;;;;;;:::i;:::-;;;;;;;;;;6940:91:62;1245:17632:60;;;;;;;;;;;;;6940:91:62;1245:17632:60;;;;;;-1:-1:-1;1245:17632:60;;;;;-1:-1:-1;1245:17632:60;;;;;;;;;;6940:91:62;;;;1245:17632:60;6940:91:62;;;;;1245:17632:60;6940:91:62;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;4139:36;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;4182:46;1245:17632;;;4182:46;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;-1:-1:-1;;;;;1245:17632:60;;:::i;:::-;;;;7227:62:62;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7227:62:62;;1245:17632:60;;7227:62:62;1245:17632:60;7227:62:62;;;;1245:17632:60;7227:62:62;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;3756:28;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;3791:48;1245:17632;;;3791:48;1245:17632;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;;;;;;;6745:92:62;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6745:92:62;;1245:17632:60;6745:92:62;;;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;3370:34;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;3411:64;1245:17632;;;3411:64;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;1303:62:19;;:::i;:::-;1245:17632:60;;5560:48;1245:17632;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;6829:20;1245:17632;;;-1:-1:-1;;;1245:17632:60;6870:111;;;;;-1:-1:-1;;;;;1245:17632:60;;;;6870:111;;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6870:111;;;6994:30;;1245:17632;;;;;;;6870:111;;;1245:17632;6870:111;:::i;1245:17632::-;;;;;;-1:-1:-1;;1245:17632:60;;;;;6474:31:62;1245:17632:60;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;-1:-1:-1;;;;;1245:17632:60;;:::i;:::-;;;;18117:13;1245:17632;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18381:23;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1245:17632:60;;;;5892:51:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;6619:36:62;1245:17632:60;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;15544:30;1245:17632;15297:234;1245:17632;;;;;;;;;;;;:::i;:::-;;;;;;;15255:21;1245:17632;;;;;15297:234;;;1245:17632;15297:234;;1245:17632;;;;15297:234;;1245:17632;;;;;;;15297:234;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1245:17632:60;;;;5688:35:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;6195:30:62;1245:17632:60;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;1245:17632:60;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1245:17632:60;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;1245:17632:60;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1245:17632:60;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15297:234;;1245:17632;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;15297:234;1245:17632;;-1:-1:-1;;1245:17632:60;;;;;:::i;:::-;;;;-1:-1:-1;1245:17632:60;;;;:::o;:::-;;;:::o;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1245:17632:60;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1245:17632:60;;-1:-1:-1;1245:17632:60;;-1:-1:-1;1245:17632:60;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;-1:-1:-1;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1245:17632:60;;-1:-1:-1;1245:17632:60;;-1:-1:-1;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;1599:130:19;1513:6;1245:17632:60;-1:-1:-1;;;;;1245:17632:60;929:10:30;1662:23:19;1245:17632:60;;1599:130:19:o;1245:17632:60:-;;;;;;;;;;;;;;;;;;;;;;;;;2666:187:19;2758:6;1245:17632:60;;-1:-1:-1;;;;;1245:17632:60;;;-1:-1:-1;;;;;;1245:17632:60;;;;;;;;;;2806:40:19;-1:-1:-1;;2806:40:19;2666:187::o;1245:17632:60:-;;;;:::o;:::-;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;","linkReferences":{}},"methodIdentifiers":{"COLDIE_AUCTION()":"c90b8714","NO_AUCTION()":"155a56b1","SCHEDULED_AUCTION()":"b23afc26","acceptOffer(address,uint256,address,uint256,address[],uint8[])":"534665e9","approvedTokenRegistry()":"6240cd1c","auctionBids(address,uint256)":"299a0e1e","auctionLengthExtension()":"daa26499","bid(address,uint256,address,uint256)":"b5678588","buy(address,uint256,address,uint256)":"b3ffb760","cancelAuction(address,uint256)":"859b97fe","cancelOffer(address,uint256,address)":"e92f94d1","configureAuction(bytes32,address,uint256,uint256,address,uint256,uint256,address[],uint8[])":"9041a0ec","convertOfferToAuction(address,uint256,address,uint256,uint256,address[],uint8[])":"060d9eeb","getAuctionDetails(address,uint256)":"0cd87c68","getSalePrice(address,uint256,address)":"369679a4","initialize(address,address,address,address,address,address,address,address,address,address)":"c306b378","marketplaceSettings()":"ba50b632","maxAuctionLength()":"0e519ef9","minimumBidIncreasePercentage()":"6fe9f44c","networkBeneficiary()":"6b534ed0","offer(address,uint256,address,uint256,bool)":"0f2b2532","offerCancelationDelay()":"0a5c4ed5","owner()":"8da5cb5b","payments()":"a6d23e10","removeSalePrice(address,uint256,address)":"f7cfaad0","renounceOwnership()":"715018a6","royaltyEngine()":"4c94c90c","royaltyRegistry()":"a11b0712","setApprovedTokenRegistry(address)":"e4e87e3b","setAuctionLengthExtension(uint256)":"10f79789","setMarketplaceSettings(address)":"176ab440","setMaxAuctionLength(uint8)":"dce96bf5","setMinimumBidIncreasePercentage(uint8)":"48626b90","setNetworkBeneficiary(address)":"3492e5a8","setOfferCancelationDelay(uint256)":"7a544792","setPayments(address)":"af231a58","setRoyaltyEngine(address)":"21ede032","setRoyaltyRegistry(address)":"84a608e2","setSalePrice(address,uint256,address,uint256,address,address[],uint8[])":"c8f94f4e","setSpaceOperatorRegistry(address)":"7f358230","setStakingRegistry(address)":"2c740844","setSuperRareAuctionHouse(address)":"2a2a326c","setSuperRareMarketplace(address)":"9c883af2","settleAuction(address,uint256)":"5138b08c","spaceOperatorRegistry()":"0bcba09d","stakingRegistry()":"009d9aa9","superRareAuctionHouse()":"3bc3d9be","superRareMarketplace()":"0141c590","tokenAuctions(address,uint256)":"c47c35c1","tokenCurrentOffers(address,uint256,address)":"2c419053","tokenSalePrices(address,uint256,address)":"1a2ac30f","transferOwnership(address)":"f2fde38b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_seller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address payable[]\",\"name\":\"_splitAddresses\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8[]\",\"name\":\"_splitRatios\",\"type\":\"uint8[]\"}],\"name\":\"AcceptOffer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_contractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_startedAuction\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newAuctionLength\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_previousBidder\",\"type\":\"address\"}],\"name\":\"AuctionBid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_contractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bidder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"AuctionSettled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_contractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_auctionCreator\",\"type\":\"address\"}],\"name\":\"CancelAuction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"CancelOffer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_contractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_auctionCreator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingTime\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_minimumBid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_lengthOfAuction\",\"type\":\"uint256\"}],\"name\":\"NewAuction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_convertible\",\"type\":\"bool\"}],\"name\":\"OfferPlaced\",\"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\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address payable[]\",\"name\":\"_splitRecipients\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8[]\",\"name\":\"_splitRatios\",\"type\":\"uint8[]\"}],\"name\":\"SetSalePrice\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_buyer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_seller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"Sold\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COLDIE_AUCTION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NO_AUCTION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SCHEDULED_AUCTION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"address payable[]\",\"name\":\"_splitAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"_splitRatios\",\"type\":\"uint8[]\"}],\"name\":\"acceptOffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"approvedTokenRegistry\",\"outputs\":[{\"internalType\":\"contract IApprovedTokenRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"auctionBids\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"bidder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"marketplaceFee\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"auctionLengthExtension\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"bid\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"buy\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"cancelAuction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"}],\"name\":\"cancelOffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_auctionType\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_lengthOfAuction\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startTime\",\"type\":\"uint256\"},{\"internalType\":\"address payable[]\",\"name\":\"_splitAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"_splitRatios\",\"type\":\"uint8[]\"}],\"name\":\"configureAuction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_lengthOfAuction\",\"type\":\"uint256\"},{\"internalType\":\"address payable[]\",\"name\":\"_splitAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"_splitRatios\",\"type\":\"uint8[]\"}],\"name\":\"convertOfferToAuction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"getAuctionDetails\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address payable[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"\",\"type\":\"uint8[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"}],\"name\":\"getSalePrice\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address payable[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"\",\"type\":\"uint8[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_marketplaceSettings\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_royaltyRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_royaltyEngine\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_superRareMarketplace\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_superRareAuctionHouse\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_spaceOperatorRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_approvedTokenRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_payments\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_networkBeneficiary\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"marketplaceSettings\",\"outputs\":[{\"internalType\":\"contract IMarketplaceSettings\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxAuctionLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minimumBidIncreasePercentage\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkBeneficiary\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_convertible\",\"type\":\"bool\"}],\"name\":\"offer\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"offerCancelationDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payments\",\"outputs\":[{\"internalType\":\"contract IPayments\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"}],\"name\":\"removeSalePrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"royaltyEngine\",\"outputs\":[{\"internalType\":\"contract IRoyaltyEngineV1\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"royaltyRegistry\",\"outputs\":[{\"internalType\":\"contract IRareRoyaltyRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_approvedTokenRegistry\",\"type\":\"address\"}],\"name\":\"setApprovedTokenRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_auctionLengthExtension\",\"type\":\"uint256\"}],\"name\":\"setAuctionLengthExtension\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_marketplaceSettings\",\"type\":\"address\"}],\"name\":\"setMarketplaceSettings\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_maxAuctionLength\",\"type\":\"uint8\"}],\"name\":\"setMaxAuctionLength\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_minimumBidIncreasePercentage\",\"type\":\"uint8\"}],\"name\":\"setMinimumBidIncreasePercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_networkBeneficiary\",\"type\":\"address\"}],\"name\":\"setNetworkBeneficiary\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_offerCancelationDelay\",\"type\":\"uint256\"}],\"name\":\"setOfferCancelationDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_payments\",\"type\":\"address\"}],\"name\":\"setPayments\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_royaltyEngine\",\"type\":\"address\"}],\"name\":\"setRoyaltyEngine\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_royaltyRegistry\",\"type\":\"address\"}],\"name\":\"setRoyaltyRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_listPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address payable[]\",\"name\":\"_splitAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"_splitRatios\",\"type\":\"uint8[]\"}],\"name\":\"setSalePrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_spaceOperatorRegistry\",\"type\":\"address\"}],\"name\":\"setSpaceOperatorRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_stakingRegistry\",\"type\":\"address\"}],\"name\":\"setStakingRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_superRareAuctionHouse\",\"type\":\"address\"}],\"name\":\"setSuperRareAuctionHouse\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_superRareMarketplace\",\"type\":\"address\"}],\"name\":\"setSuperRareMarketplace\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"settleAuction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"spaceOperatorRegistry\",\"outputs\":[{\"internalType\":\"contract ISpaceOperatorRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakingRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superRareAuctionHouse\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superRareMarketplace\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokenAuctions\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"auctionCreator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"creationBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startingTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lengthOfAuction\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minimumBid\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"auctionType\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"tokenCurrentOffers\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"buyer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"marketplaceFee\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"convertible\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"tokenSalePrices\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"koloz\",\"details\":\"All storage is inherrited and append only (no modifications) to make upgrade compliant.\",\"events\":{\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOffer(address,uint256,address,uint256,address[],uint8[])\":{\"details\":\"Zero address for _currency means that the offer being accepted is in ether.\",\"params\":{\"_amount\":\"Amount the offer was for/and is being accepted.\",\"_currencyAddress\":\"Address of the currency used for the offer.\",\"_originContract\":\"Contract of the asset the offer was made on.\",\"_splitAddresses\":\"Addresses to split the sellers commission with.\",\"_splitRatios\":\"The ratio for the split corresponding to each of the addresses being split with.\",\"_tokenId\":\"TokenId of the asset.\"}},\"bid(address,uint256,address,uint256)\":{\"details\":\"Only the configured currency can be used (Zero address for eth)\",\"params\":{\"_amount\":\"Amount of the currency being used for the bid.\",\"_currencyAddress\":\"Address of currency being used to bid.\",\"_originContract\":\"Contract address of asset being bid on.\",\"_tokenId\":\"Token Id of the asset.\"}},\"buy(address,uint256,address,uint256)\":{\"details\":\"Covers use of any currency (0 address is eth).Need to verify that the buyer (if not using eth) has the marketplace approved for _currencyContract.Need to verify that the seller has the marketplace approved for _originContract.\",\"params\":{\"_amount\":\"Amount the piece if being bought for (including marketplace fee).\",\"_currencyAddress\":\"Currency address of asset being used to buy.\",\"_originContract\":\"Contract address for asset being bought.\",\"_tokenId\":\"TokenId of asset being bought.\"}},\"cancelAuction(address,uint256)\":{\"details\":\"Requires the person sending the message to be the auction creator or token owner.\",\"params\":{\"_originContract\":\"Contract address of the asset pending auction.\",\"_tokenId\":\"Token Id of the asset.\"}},\"cancelOffer(address,uint256,address)\":{\"params\":{\"_currencyAddress\":\"Currency address of the offer.\",\"_originContract\":\"Contract address of token.\",\"_tokenId\":\"TokenId that has an offer.\"}},\"configureAuction(bytes32,address,uint256,uint256,address,uint256,uint256,address[],uint8[])\":{\"details\":\"If auction type is coldie (reserve) then _startingAmount cant be 0._currencyAddress equal to the zero address denotes eth.All time related params are unix epoch timestamps.\",\"params\":{\"_auctionType\":\"The type of auction being configured.\",\"_currencyAddress\":\"The currency the auction is being conducted in.\",\"_lengthOfAuction\":\"The amount of time in seconds that the auction is configured for.\",\"_originContract\":\"Contract address of the asset being put up for auction.\",\"_splitAddresses\":\"Addresses to split the sellers commission with.\",\"_splitRatios\":\"The ratio for the split corresponding to each of the addresses being split with.\",\"_startingAmount\":\"The reserve price or min bid of an auction.\",\"_tokenId\":\"Token Id of the asset.\"}},\"convertOfferToAuction(address,uint256,address,uint256,uint256,address[],uint8[])\":{\"details\":\"Covers use of any currency (0 address is eth).Only covers converting an offer to a coldie auction.Cant convert offer if an auction currently exists.\",\"params\":{\"_amount\":\"Amount being converted into an auction.\",\"_currencyAddress\":\"Address of the currency being converted.\",\"_lengthOfAuction\":\"Number of seconds the auction will last.\",\"_originContract\":\"Contract address of the asset.\",\"_splitAddresses\":\"Addresses that the sellers take in will be split amongst.\",\"_splitRatios\":\"Ratios that the take in will be split by.\",\"_tokenId\":\"Token Id of the asset.\"}},\"getAuctionDetails(address,uint256)\":{\"returns\":{\"_0\":\"Auction Struct: creatorAddress, creationTime, startingTime, lengthOfAuction, currencyAddress, minimumBid, auctionType, splitRecipients array, and splitRatios array.\"}},\"offer(address,uint256,address,uint256,bool)\":{\"details\":\"Notice we need to verify that the msg sender has approved us to move funds on their behalf.Covers use of any currency (0 address is eth)._amount is the amount of the offer excluding the marketplace fee.There can be multiple offers of different currencies, but only 1 per currency.\",\"params\":{\"_amount\":\"Amount being offered.\",\"_convertible\":\"If the offer can be converted into an auction\",\"_currencyAddress\":\"Address of the token being offered.\",\"_originContract\":\"Contract address of the asset being listed.\",\"_tokenId\":\"Token Id of the asset.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"removeSalePrice(address,uint256,address)\":{\"details\":\"Sale prices could still exist for different currencies.Sale prices could still exist for different targets.Zero address for _currency means that its listed in ether._target of zero address is the general sale price.\",\"params\":{\"_originContract\":\"The origin contract of the asset.\",\"_target\":\"The address of the person\",\"_tokenId\":\"The tokenId of the asset within the _originContract.\"}},\"renounceOwnership()\":{\"details\":\"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.\"},\"setSalePrice(address,uint256,address,uint256,address,address[],uint8[])\":{\"details\":\"Covers use of any currency (0 address is eth).Sale price for everyone is denoted as the 0 address.Only 1 currency can be used for the sale price directed at a speicific target._listPrice of 0 signifies removing the list price for the provided currency.This function can be used for counter offers as well.\",\"params\":{\"_currencyAddress\":\"Contract address of the currency asset is being listed for.\",\"_listPrice\":\"Amount of the currency the asset is being listed for (including all decimal points).\",\"_originContract\":\"Contract address of the asset being listed.\",\"_splitAddresses\":\"Addresses to split the sellers commission with.\",\"_splitRatios\":\"The ratio for the split corresponding to each of the addresses being split with.\",\"_target\":\"Address of the person this sale price is target to.\",\"_tokenId\":\"Token Id of the asset.\"}},\"settleAuction(address,uint256)\":{\"details\":\"Anyone is able to settle an auction since non-input params are used.\",\"params\":{\"_originContract\":\"Contract address of asset.\",\"_tokenId\":\"Token Id of the asset.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"SuperRareBazaar\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"acceptOffer(address,uint256,address,uint256,address[],uint8[])\":{\"notice\":\"Accept an offer placed on _originContract : _tokenId.\"},\"bid(address,uint256,address,uint256)\":{\"notice\":\"Places a bid on a valid auction.\"},\"buy(address,uint256,address,uint256)\":{\"notice\":\"Purchases the token for the current sale price.\"},\"cancelAuction(address,uint256)\":{\"notice\":\"Cancels a configured Auction that has not started.\"},\"cancelOffer(address,uint256,address)\":{\"notice\":\"Cancels an existing offer the sender has placed on a piece.\"},\"configureAuction(bytes32,address,uint256,uint256,address,uint256,uint256,address[],uint8[])\":{\"notice\":\"Configures an Auction for a given asset.\"},\"convertOfferToAuction(address,uint256,address,uint256,uint256,address[],uint8[])\":{\"notice\":\"Converts an offer into a coldie auction.\"},\"offer(address,uint256,address,uint256,bool)\":{\"notice\":\"Place an offer for a given asset\"},\"removeSalePrice(address,uint256,address)\":{\"notice\":\"Removes the current sale price of an asset for _target for the given currency.\"},\"setSalePrice(address,uint256,address,uint256,address,address[],uint8[])\":{\"notice\":\"Sets a sale price for the given asset(s) directed at the _target address.\"},\"settleAuction(address,uint256)\":{\"notice\":\"Settles an auction that has ended.\"}},\"notice\":\"The unified contract for the bazaar logic (Marketplace and Auction House).\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/bazaar/SuperRareBazaar.sol\":\"SuperRareBazaar\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@ensdomains/buffer/=lib/buffer/\",\":@ensdomains/ens-contracts/=lib/ens-contracts/contracts/\",\":@ensdomains/governance/=lib/governance-contracts/contracts/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@uniswap/v3-core/=lib/v3-core/contracts/\",\":@uniswap/v3-core/contracts/=lib/v3-core/contracts/\",\":@uniswap/v3-periphery/=lib/v3-periphery/contracts/\",\":arachnid/solidity-stringutils/=lib/solidity-stringutils/\",\":ds-test/=lib/ds-test/src/\",\":ensdomains/ens-contracts/=lib/ensdomains/ens-contracts/contracts/\",\":ensdomains/governance/=lib/governance-contracts/contracts/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/\",\":rareprotocol/assets/=lib/assets/src/\",\":rareprotocol/aux/=src/\",\":royalty-guard/=lib/royalty-guard/src/royalty-guard/\",\":royalty-registry-solidity/=lib/royalty-registry-solidity/contracts/\",\":royalty-registry/=lib/royalty-registry-solidity/contracts/\",\":solmate/=lib/solmate/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8\",\"dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol\":{\"keccak256\":\"0xb82ef33f43b6b96109687d91b39c94573fdccaaa423fe28e8ba0977b31c023e0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec9c629f63e66379f9c868a74f971064701cc6e30583872aa653f8b932518025\",\"dweb:/ipfs/QmY4MnZF2VMFwJkAwpdQwxEWA3KcGbNBKEmAVYePMVQWUR\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x41bbb2c41036ca64b2f6c9e973e8cfaa113ebc42af86702cd0d267f915a7e886\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6bf6699c55e82c7af6ae90b61ea9643ca0c905097da9a31269319f1b5a2a696a\",\"dweb:/ipfs/QmRJZa2UmWcRo6W8JnuomwzfjVtAS21QC8HKggxBhoPsU4\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"lib/royalty-registry-solidity/contracts/IRoyaltyEngineV1.sol\":{\"keccak256\":\"0xc66561df4db1dd5bc3d14e2ec1c5cf393db682b18989779acc41b3a4834d9d27\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c342b761cb6656f04bc4cb40e4593aed5484efee9594a806dbd3a95fd6d757a9\",\"dweb:/ipfs/QmWsz6C36AhhSfBhfdfX3LhPabLkqGxa23s5iNfN4yJq7r\"]},\"src/bazaar/ISuperRareBazaar.sol\":{\"keccak256\":\"0xb75cb39f8c63e813a2891b41ae6c835903c975b2646b689936c51bc6d3a74546\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://616f9aa0a4ae90da19f46b62041eadeef64b13a9e1870ac9791cb94f85c62805\",\"dweb:/ipfs/QmeqhUs6pzfsTUoarSArUMrtmHvvMYnTD4XiFLAj6KwaWk\"]},\"src/bazaar/SuperRareBazaar.sol\":{\"keccak256\":\"0x18a2c74610adf65f8a7556133a73ee5fbb22a321439c066f0062bb2b47700898\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4b22a2e8ffb544c2cc822e0f1cf09dd162487f435a1395b6816b8ced48f7c4ff\",\"dweb:/ipfs/QmNjEFq94276Ca96xmucb2pWPahLJwqcUgG3KUZZrRPtpA\"]},\"src/bazaar/SuperRareBazaarStorage.sol\":{\"keccak256\":\"0x07b013f4ed5ca846af48f74faae20547b1f806d98093eef050d2ac6e838f3714\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a0dc91b04769e552b01efd38a796df6f20694a9e478c582b37fdd103894195a\",\"dweb:/ipfs/QmUM79e82SXrAp9oHQZRmhXS3BjtUhsKZ5rQMwUcT6FTgc\"]},\"src/marketplace/IMarketplaceSettings.sol\":{\"keccak256\":\"0xa42b0f448c52cc04ca1c3b013ecbf99b9b5d857e7ed37a8fe178669fab933083\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://00f697de6e1de92ccd4fd260ce9bde6fca290121f5f7e2b7d9cee8f718670ff0\",\"dweb:/ipfs/Qmbt7gXsaTG8WmeFaLSCeNy3ViZgLRgeNfwHpRwL1hia13\"]},\"src/payments/IPayments.sol\":{\"keccak256\":\"0xd5370fe954b457c13045901acfe5aa8c4dc66885f913d2729aa7c65975e7fbbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9da9318f1b4585578ca5606c320f093bb86682594c6cd8244f9be59650efcd38\",\"dweb:/ipfs/Qmaq1QFA45ZkPjqn1idCVGrUzCd5pbuUuw18N3Xk1Sewdc\"]},\"src/registry/interfaces/IApprovedTokenRegistry.sol\":{\"keccak256\":\"0xdb86d418bedb954ea79129631d734b42749d4a0ca00635ecdf3dfeb8e81fb60a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad677939c49f8a55f7a1c1e78b0abbe722744abc5c26b81eef5a20a578d415d2\",\"dweb:/ipfs/QmZL6aHq79B8TFPrc5Zrt7iLxuqkoJikhEJtq8hgk1aKMC\"]},\"src/registry/interfaces/ICreatorRegistry.sol\":{\"keccak256\":\"0xcaeba1e630efa2ce901d39632fa5760cfbfd8647bf8657a137f4cece2d714ed8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://161e5d0d9f9b27e97cbdb4fc10134254fe329fcd549fdb07900bb553d2a1ccc1\",\"dweb:/ipfs/QmNtKFgVqB28YwLJg6TWgXWHEJybrXFXEWbU5gep99HEcP\"]},\"src/registry/interfaces/IRareRoyaltyRegistry.sol\":{\"keccak256\":\"0xd6b673182b9c6453e38fcd29bd85a788b3734f82202a77cd64d15422e98ffac9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://70fd1ef8d3a5d44f2e984e969528c8a0ab25eefc92a3b19cfa63b6394bc798e3\",\"dweb:/ipfs/QmTDCPVfxqAcXDzdYfHQbm1f4nYJSBeRz91oqjfE8fxk2r\"]},\"src/registry/interfaces/ISpaceOperatorRegistry.sol\":{\"keccak256\":\"0x2b0899fa39f324d105f5b3b7fe6d0020374c5065d19aa87b74fd042f368b4ade\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://88aaf406edb29325f05024f8f94b0eab31de5f08c02c9cdea053da6671df1d33\",\"dweb:/ipfs/QmSPXe7U4aCaLew2xJ3gmQqBWTf3QMvpxYV2XNq3e41gGT\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_originContract","type":"address","indexed":true},{"internalType":"address","name":"_bidder","type":"address","indexed":true},{"internalType":"address","name":"_seller","type":"address","indexed":true},{"internalType":"address","name":"_currencyAddress","type":"address","indexed":false},{"internalType":"uint256","name":"_amount","type":"uint256","indexed":false},{"internalType":"uint256","name":"_tokenId","type":"uint256","indexed":false},{"internalType":"address payable[]","name":"_splitAddresses","type":"address[]","indexed":false},{"internalType":"uint8[]","name":"_splitRatios","type":"uint8[]","indexed":false}],"type":"event","name":"AcceptOffer","anonymous":false},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address","indexed":true},{"internalType":"address","name":"_bidder","type":"address","indexed":true},{"internalType":"uint256","name":"_tokenId","type":"uint256","indexed":true},{"internalType":"address","name":"_currencyAddress","type":"address","indexed":false},{"internalType":"uint256","name":"_amount","type":"uint256","indexed":false},{"internalType":"bool","name":"_startedAuction","type":"bool","indexed":false},{"internalType":"uint256","name":"_newAuctionLength","type":"uint256","indexed":false},{"internalType":"address","name":"_previousBidder","type":"address","indexed":false}],"type":"event","name":"AuctionBid","anonymous":false},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address","indexed":true},{"internalType":"address","name":"_bidder","type":"address","indexed":true},{"internalType":"address","name":"_seller","type":"address","indexed":false},{"internalType":"uint256","name":"_tokenId","type":"uint256","indexed":true},{"internalType":"address","name":"_currencyAddress","type":"address","indexed":false},{"internalType":"uint256","name":"_amount","type":"uint256","indexed":false}],"type":"event","name":"AuctionSettled","anonymous":false},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address","indexed":true},{"internalType":"uint256","name":"_tokenId","type":"uint256","indexed":true},{"internalType":"address","name":"_auctionCreator","type":"address","indexed":true}],"type":"event","name":"CancelAuction","anonymous":false},{"inputs":[{"internalType":"address","name":"_originContract","type":"address","indexed":true},{"internalType":"address","name":"_bidder","type":"address","indexed":true},{"internalType":"address","name":"_currencyAddress","type":"address","indexed":true},{"internalType":"uint256","name":"_amount","type":"uint256","indexed":false},{"internalType":"uint256","name":"_tokenId","type":"uint256","indexed":false}],"type":"event","name":"CancelOffer","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address","indexed":true},{"internalType":"uint256","name":"_tokenId","type":"uint256","indexed":true},{"internalType":"address","name":"_auctionCreator","type":"address","indexed":true},{"internalType":"address","name":"_currencyAddress","type":"address","indexed":false},{"internalType":"uint256","name":"_startingTime","type":"uint256","indexed":false},{"internalType":"uint256","name":"_minimumBid","type":"uint256","indexed":false},{"internalType":"uint256","name":"_lengthOfAuction","type":"uint256","indexed":false}],"type":"event","name":"NewAuction","anonymous":false},{"inputs":[{"internalType":"address","name":"_originContract","type":"address","indexed":true},{"internalType":"address","name":"_bidder","type":"address","indexed":true},{"internalType":"address","name":"_currencyAddress","type":"address","indexed":true},{"internalType":"uint256","name":"_amount","type":"uint256","indexed":false},{"internalType":"uint256","name":"_tokenId","type":"uint256","indexed":false},{"internalType":"bool","name":"_convertible","type":"bool","indexed":false}],"type":"event","name":"OfferPlaced","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"_originContract","type":"address","indexed":true},{"internalType":"address","name":"_currencyAddress","type":"address","indexed":true},{"internalType":"address","name":"_target","type":"address","indexed":false},{"internalType":"uint256","name":"_amount","type":"uint256","indexed":false},{"internalType":"uint256","name":"_tokenId","type":"uint256","indexed":false},{"internalType":"address payable[]","name":"_splitRecipients","type":"address[]","indexed":false},{"internalType":"uint8[]","name":"_splitRatios","type":"uint8[]","indexed":false}],"type":"event","name":"SetSalePrice","anonymous":false},{"inputs":[{"internalType":"address","name":"_originContract","type":"address","indexed":true},{"internalType":"address","name":"_buyer","type":"address","indexed":true},{"internalType":"address","name":"_seller","type":"address","indexed":true},{"internalType":"address","name":"_currencyAddress","type":"address","indexed":false},{"internalType":"uint256","name":"_amount","type":"uint256","indexed":false},{"internalType":"uint256","name":"_tokenId","type":"uint256","indexed":false}],"type":"event","name":"Sold","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"COLDIE_AUCTION","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"NO_AUCTION","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"SCHEDULED_AUCTION","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_currencyAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable[]","name":"_splitAddresses","type":"address[]"},{"internalType":"uint8[]","name":"_splitRatios","type":"uint8[]"}],"stateMutability":"nonpayable","type":"function","name":"acceptOffer"},{"inputs":[],"stateMutability":"view","type":"function","name":"approvedTokenRegistry","outputs":[{"internalType":"contract IApprovedTokenRegistry","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"auctionBids","outputs":[{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"address","name":"currencyAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"marketplaceFee","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"auctionLengthExtension","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_currencyAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"payable","type":"function","name":"bid"},{"inputs":[{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_currencyAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"payable","type":"function","name":"buy"},{"inputs":[{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"cancelAuction"},{"inputs":[{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_currencyAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"cancelOffer"},{"inputs":[{"internalType":"bytes32","name":"_auctionType","type":"bytes32"},{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_startingAmount","type":"uint256"},{"internalType":"address","name":"_currencyAddress","type":"address"},{"internalType":"uint256","name":"_lengthOfAuction","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"address payable[]","name":"_splitAddresses","type":"address[]"},{"internalType":"uint8[]","name":"_splitRatios","type":"uint8[]"}],"stateMutability":"nonpayable","type":"function","name":"configureAuction"},{"inputs":[{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_currencyAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_lengthOfAuction","type":"uint256"},{"internalType":"address payable[]","name":"_splitAddresses","type":"address[]"},{"internalType":"uint8[]","name":"_splitRatios","type":"uint8[]"}],"stateMutability":"nonpayable","type":"function","name":"convertOfferToAuction"},{"inputs":[{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"view","type":"function","name":"getAuctionDetails","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address payable[]","name":"","type":"address[]"},{"internalType":"uint8[]","name":"","type":"uint8[]"}]},{"inputs":[{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_target","type":"address"}],"stateMutability":"view","type":"function","name":"getSalePrice","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address payable[]","name":"","type":"address[]"},{"internalType":"uint8[]","name":"","type":"uint8[]"}]},{"inputs":[{"internalType":"address","name":"_marketplaceSettings","type":"address"},{"internalType":"address","name":"_royaltyRegistry","type":"address"},{"internalType":"address","name":"_royaltyEngine","type":"address"},{"internalType":"address","name":"_superRareMarketplace","type":"address"},{"internalType":"address","name":"_superRareAuctionHouse","type":"address"},{"internalType":"address","name":"_spaceOperatorRegistry","type":"address"},{"internalType":"address","name":"_approvedTokenRegistry","type":"address"},{"internalType":"address","name":"_payments","type":"address"},{"internalType":"address","name":"_stakingRegistry","type":"address"},{"internalType":"address","name":"_networkBeneficiary","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"marketplaceSettings","outputs":[{"internalType":"contract IMarketplaceSettings","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"maxAuctionLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"minimumBidIncreasePercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"networkBeneficiary","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_currencyAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_convertible","type":"bool"}],"stateMutability":"payable","type":"function","name":"offer"},{"inputs":[],"stateMutability":"view","type":"function","name":"offerCancelationDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"payments","outputs":[{"internalType":"contract IPayments","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_target","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeSalePrice"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[],"stateMutability":"view","type":"function","name":"royaltyEngine","outputs":[{"internalType":"contract IRoyaltyEngineV1","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"royaltyRegistry","outputs":[{"internalType":"contract IRareRoyaltyRegistry","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"_approvedTokenRegistry","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setApprovedTokenRegistry"},{"inputs":[{"internalType":"uint256","name":"_auctionLengthExtension","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setAuctionLengthExtension"},{"inputs":[{"internalType":"address","name":"_marketplaceSettings","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setMarketplaceSettings"},{"inputs":[{"internalType":"uint8","name":"_maxAuctionLength","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"setMaxAuctionLength"},{"inputs":[{"internalType":"uint8","name":"_minimumBidIncreasePercentage","type":"uint8"}],"stateMutability":"nonpayable","type":"function","name":"setMinimumBidIncreasePercentage"},{"inputs":[{"internalType":"address","name":"_networkBeneficiary","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setNetworkBeneficiary"},{"inputs":[{"internalType":"uint256","name":"_offerCancelationDelay","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setOfferCancelationDelay"},{"inputs":[{"internalType":"address","name":"_payments","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setPayments"},{"inputs":[{"internalType":"address","name":"_royaltyEngine","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setRoyaltyEngine"},{"inputs":[{"internalType":"address","name":"_royaltyRegistry","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setRoyaltyRegistry"},{"inputs":[{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_currencyAddress","type":"address"},{"internalType":"uint256","name":"_listPrice","type":"uint256"},{"internalType":"address","name":"_target","type":"address"},{"internalType":"address payable[]","name":"_splitAddresses","type":"address[]"},{"internalType":"uint8[]","name":"_splitRatios","type":"uint8[]"}],"stateMutability":"nonpayable","type":"function","name":"setSalePrice"},{"inputs":[{"internalType":"address","name":"_spaceOperatorRegistry","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setSpaceOperatorRegistry"},{"inputs":[{"internalType":"address","name":"_stakingRegistry","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setStakingRegistry"},{"inputs":[{"internalType":"address","name":"_superRareAuctionHouse","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setSuperRareAuctionHouse"},{"inputs":[{"internalType":"address","name":"_superRareMarketplace","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setSuperRareMarketplace"},{"inputs":[{"internalType":"address","name":"_originContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"settleAuction"},{"inputs":[],"stateMutability":"view","type":"function","name":"spaceOperatorRegistry","outputs":[{"internalType":"contract ISpaceOperatorRegistry","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"stakingRegistry","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"superRareAuctionHouse","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"superRareMarketplace","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"tokenAuctions","outputs":[{"internalType":"address payable","name":"auctionCreator","type":"address"},{"internalType":"uint256","name":"creationBlock","type":"uint256"},{"internalType":"uint256","name":"startingTime","type":"uint256"},{"internalType":"uint256","name":"lengthOfAuction","type":"uint256"},{"internalType":"address","name":"currencyAddress","type":"address"},{"internalType":"uint256","name":"minimumBid","type":"uint256"},{"internalType":"bytes32","name":"auctionType","type":"bytes32"}]},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"tokenCurrentOffers","outputs":[{"internalType":"address payable","name":"buyer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint8","name":"marketplaceFee","type":"uint8"},{"internalType":"bool","name":"convertible","type":"bool"}]},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"tokenSalePrices","outputs":[{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"address","name":"currencyAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"}],"devdoc":{"kind":"dev","methods":{"acceptOffer(address,uint256,address,uint256,address[],uint8[])":{"details":"Zero address for _currency means that the offer being accepted is in ether.","params":{"_amount":"Amount the offer was for/and is being accepted.","_currencyAddress":"Address of the currency used for the offer.","_originContract":"Contract of the asset the offer was made on.","_splitAddresses":"Addresses to split the sellers commission with.","_splitRatios":"The ratio for the split corresponding to each of the addresses being split with.","_tokenId":"TokenId of the asset."}},"bid(address,uint256,address,uint256)":{"details":"Only the configured currency can be used (Zero address for eth)","params":{"_amount":"Amount of the currency being used for the bid.","_currencyAddress":"Address of currency being used to bid.","_originContract":"Contract address of asset being bid on.","_tokenId":"Token Id of the asset."}},"buy(address,uint256,address,uint256)":{"details":"Covers use of any currency (0 address is eth).Need to verify that the buyer (if not using eth) has the marketplace approved for _currencyContract.Need to verify that the seller has the marketplace approved for _originContract.","params":{"_amount":"Amount the piece if being bought for (including marketplace fee).","_currencyAddress":"Currency address of asset being used to buy.","_originContract":"Contract address for asset being bought.","_tokenId":"TokenId of asset being bought."}},"cancelAuction(address,uint256)":{"details":"Requires the person sending the message to be the auction creator or token owner.","params":{"_originContract":"Contract address of the asset pending auction.","_tokenId":"Token Id of the asset."}},"cancelOffer(address,uint256,address)":{"params":{"_currencyAddress":"Currency address of the offer.","_originContract":"Contract address of token.","_tokenId":"TokenId that has an offer."}},"configureAuction(bytes32,address,uint256,uint256,address,uint256,uint256,address[],uint8[])":{"details":"If auction type is coldie (reserve) then _startingAmount cant be 0._currencyAddress equal to the zero address denotes eth.All time related params are unix epoch timestamps.","params":{"_auctionType":"The type of auction being configured.","_currencyAddress":"The currency the auction is being conducted in.","_lengthOfAuction":"The amount of time in seconds that the auction is configured for.","_originContract":"Contract address of the asset being put up for auction.","_splitAddresses":"Addresses to split the sellers commission with.","_splitRatios":"The ratio for the split corresponding to each of the addresses being split with.","_startingAmount":"The reserve price or min bid of an auction.","_tokenId":"Token Id of the asset."}},"convertOfferToAuction(address,uint256,address,uint256,uint256,address[],uint8[])":{"details":"Covers use of any currency (0 address is eth).Only covers converting an offer to a coldie auction.Cant convert offer if an auction currently exists.","params":{"_amount":"Amount being converted into an auction.","_currencyAddress":"Address of the currency being converted.","_lengthOfAuction":"Number of seconds the auction will last.","_originContract":"Contract address of the asset.","_splitAddresses":"Addresses that the sellers take in will be split amongst.","_splitRatios":"Ratios that the take in will be split by.","_tokenId":"Token Id of the asset."}},"getAuctionDetails(address,uint256)":{"returns":{"_0":"Auction Struct: creatorAddress, creationTime, startingTime, lengthOfAuction, currencyAddress, minimumBid, auctionType, splitRecipients array, and splitRatios array."}},"offer(address,uint256,address,uint256,bool)":{"details":"Notice we need to verify that the msg sender has approved us to move funds on their behalf.Covers use of any currency (0 address is eth)._amount is the amount of the offer excluding the marketplace fee.There can be multiple offers of different currencies, but only 1 per currency.","params":{"_amount":"Amount being offered.","_convertible":"If the offer can be converted into an auction","_currencyAddress":"Address of the token being offered.","_originContract":"Contract address of the asset being listed.","_tokenId":"Token Id of the asset."}},"owner()":{"details":"Returns the address of the current owner."},"removeSalePrice(address,uint256,address)":{"details":"Sale prices could still exist for different currencies.Sale prices could still exist for different targets.Zero address for _currency means that its listed in ether._target of zero address is the general sale price.","params":{"_originContract":"The origin contract of the asset.","_target":"The address of the person","_tokenId":"The tokenId of the asset within the _originContract."}},"renounceOwnership()":{"details":"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."},"setSalePrice(address,uint256,address,uint256,address,address[],uint8[])":{"details":"Covers use of any currency (0 address is eth).Sale price for everyone is denoted as the 0 address.Only 1 currency can be used for the sale price directed at a speicific target._listPrice of 0 signifies removing the list price for the provided currency.This function can be used for counter offers as well.","params":{"_currencyAddress":"Contract address of the currency asset is being listed for.","_listPrice":"Amount of the currency the asset is being listed for (including all decimal points).","_originContract":"Contract address of the asset being listed.","_splitAddresses":"Addresses to split the sellers commission with.","_splitRatios":"The ratio for the split corresponding to each of the addresses being split with.","_target":"Address of the person this sale price is target to.","_tokenId":"Token Id of the asset."}},"settleAuction(address,uint256)":{"details":"Anyone is able to settle an auction since non-input params are used.","params":{"_originContract":"Contract address of asset.","_tokenId":"Token Id of the asset."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{"acceptOffer(address,uint256,address,uint256,address[],uint8[])":{"notice":"Accept an offer placed on _originContract : _tokenId."},"bid(address,uint256,address,uint256)":{"notice":"Places a bid on a valid auction."},"buy(address,uint256,address,uint256)":{"notice":"Purchases the token for the current sale price."},"cancelAuction(address,uint256)":{"notice":"Cancels a configured Auction that has not started."},"cancelOffer(address,uint256,address)":{"notice":"Cancels an existing offer the sender has placed on a piece."},"configureAuction(bytes32,address,uint256,uint256,address,uint256,uint256,address[],uint8[])":{"notice":"Configures an Auction for a given asset."},"convertOfferToAuction(address,uint256,address,uint256,uint256,address[],uint8[])":{"notice":"Converts an offer into a coldie auction."},"offer(address,uint256,address,uint256,bool)":{"notice":"Place an offer for a given asset"},"removeSalePrice(address,uint256,address)":{"notice":"Removes the current sale price of an asset for _target for the given currency."},"setSalePrice(address,uint256,address,uint256,address,address[],uint8[])":{"notice":"Sets a sale price for the given asset(s) directed at the _target address."},"settleAuction(address,uint256)":{"notice":"Settles an auction that has ended."}},"version":1}},"settings":{"remappings":["@ensdomains/buffer/=lib/buffer/","@ensdomains/ens-contracts/=lib/ens-contracts/contracts/","@ensdomains/governance/=lib/governance-contracts/contracts/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@uniswap/v3-core/=lib/v3-core/contracts/","@uniswap/v3-core/contracts/=lib/v3-core/contracts/","@uniswap/v3-periphery/=lib/v3-periphery/contracts/","arachnid/solidity-stringutils/=lib/solidity-stringutils/","ds-test/=lib/ds-test/src/","ensdomains/ens-contracts/=lib/ensdomains/ens-contracts/contracts/","ensdomains/governance/=lib/governance-contracts/contracts/","forge-std/=lib/forge-std/src/","murky/=lib/murky/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/","rareprotocol/assets/=lib/assets/src/","rareprotocol/aux/=src/","royalty-guard/=lib/royalty-guard/src/royalty-guard/","royalty-registry-solidity/=lib/royalty-registry-solidity/contracts/","royalty-registry/=lib/royalty-registry-solidity/contracts/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/bazaar/SuperRareBazaar.sol":"SuperRareBazaar"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol":{"keccak256":"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98","urls":["bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8","dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794","urls":["bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e","dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol":{"keccak256":"0xb82ef33f43b6b96109687d91b39c94573fdccaaa423fe28e8ba0977b31c023e0","urls":["bzz-raw://ec9c629f63e66379f9c868a74f971064701cc6e30583872aa653f8b932518025","dweb:/ipfs/QmY4MnZF2VMFwJkAwpdQwxEWA3KcGbNBKEmAVYePMVQWUR"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422","urls":["bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b","dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149","urls":["bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c","dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x41bbb2c41036ca64b2f6c9e973e8cfaa113ebc42af86702cd0d267f915a7e886","urls":["bzz-raw://6bf6699c55e82c7af6ae90b61ea9643ca0c905097da9a31269319f1b5a2a696a","dweb:/ipfs/QmRJZa2UmWcRo6W8JnuomwzfjVtAS21QC8HKggxBhoPsU4"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1","urls":["bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f","dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy"],"license":"MIT"},"lib/royalty-registry-solidity/contracts/IRoyaltyEngineV1.sol":{"keccak256":"0xc66561df4db1dd5bc3d14e2ec1c5cf393db682b18989779acc41b3a4834d9d27","urls":["bzz-raw://c342b761cb6656f04bc4cb40e4593aed5484efee9594a806dbd3a95fd6d757a9","dweb:/ipfs/QmWsz6C36AhhSfBhfdfX3LhPabLkqGxa23s5iNfN4yJq7r"],"license":"MIT"},"src/bazaar/ISuperRareBazaar.sol":{"keccak256":"0xb75cb39f8c63e813a2891b41ae6c835903c975b2646b689936c51bc6d3a74546","urls":["bzz-raw://616f9aa0a4ae90da19f46b62041eadeef64b13a9e1870ac9791cb94f85c62805","dweb:/ipfs/QmeqhUs6pzfsTUoarSArUMrtmHvvMYnTD4XiFLAj6KwaWk"],"license":"MIT"},"src/bazaar/SuperRareBazaar.sol":{"keccak256":"0x18a2c74610adf65f8a7556133a73ee5fbb22a321439c066f0062bb2b47700898","urls":["bzz-raw://4b22a2e8ffb544c2cc822e0f1cf09dd162487f435a1395b6816b8ced48f7c4ff","dweb:/ipfs/QmNjEFq94276Ca96xmucb2pWPahLJwqcUgG3KUZZrRPtpA"],"license":"MIT"},"src/bazaar/SuperRareBazaarStorage.sol":{"keccak256":"0x07b013f4ed5ca846af48f74faae20547b1f806d98093eef050d2ac6e838f3714","urls":["bzz-raw://8a0dc91b04769e552b01efd38a796df6f20694a9e478c582b37fdd103894195a","dweb:/ipfs/QmUM79e82SXrAp9oHQZRmhXS3BjtUhsKZ5rQMwUcT6FTgc"],"license":"MIT"},"src/marketplace/IMarketplaceSettings.sol":{"keccak256":"0xa42b0f448c52cc04ca1c3b013ecbf99b9b5d857e7ed37a8fe178669fab933083","urls":["bzz-raw://00f697de6e1de92ccd4fd260ce9bde6fca290121f5f7e2b7d9cee8f718670ff0","dweb:/ipfs/Qmbt7gXsaTG8WmeFaLSCeNy3ViZgLRgeNfwHpRwL1hia13"],"license":"MIT"},"src/payments/IPayments.sol":{"keccak256":"0xd5370fe954b457c13045901acfe5aa8c4dc66885f913d2729aa7c65975e7fbbd","urls":["bzz-raw://9da9318f1b4585578ca5606c320f093bb86682594c6cd8244f9be59650efcd38","dweb:/ipfs/Qmaq1QFA45ZkPjqn1idCVGrUzCd5pbuUuw18N3Xk1Sewdc"],"license":"MIT"},"src/registry/interfaces/IApprovedTokenRegistry.sol":{"keccak256":"0xdb86d418bedb954ea79129631d734b42749d4a0ca00635ecdf3dfeb8e81fb60a","urls":["bzz-raw://ad677939c49f8a55f7a1c1e78b0abbe722744abc5c26b81eef5a20a578d415d2","dweb:/ipfs/QmZL6aHq79B8TFPrc5Zrt7iLxuqkoJikhEJtq8hgk1aKMC"],"license":"MIT"},"src/registry/interfaces/ICreatorRegistry.sol":{"keccak256":"0xcaeba1e630efa2ce901d39632fa5760cfbfd8647bf8657a137f4cece2d714ed8","urls":["bzz-raw://161e5d0d9f9b27e97cbdb4fc10134254fe329fcd549fdb07900bb553d2a1ccc1","dweb:/ipfs/QmNtKFgVqB28YwLJg6TWgXWHEJybrXFXEWbU5gep99HEcP"],"license":"MIT"},"src/registry/interfaces/IRareRoyaltyRegistry.sol":{"keccak256":"0xd6b673182b9c6453e38fcd29bd85a788b3734f82202a77cd64d15422e98ffac9","urls":["bzz-raw://70fd1ef8d3a5d44f2e984e969528c8a0ab25eefc92a3b19cfa63b6394bc798e3","dweb:/ipfs/QmTDCPVfxqAcXDzdYfHQbm1f4nYJSBeRz91oqjfE8fxk2r"],"license":"MIT"},"src/registry/interfaces/ISpaceOperatorRegistry.sol":{"keccak256":"0x2b0899fa39f324d105f5b3b7fe6d0020374c5065d19aa87b74fd042f368b4ade","urls":["bzz-raw://88aaf406edb29325f05024f8f94b0eab31de5f08c02c9cdea053da6671df1d33","dweb:/ipfs/QmSPXe7U4aCaLew2xJ3gmQqBWTf3QMvpxYV2XNq3e41gGT"],"license":"MIT"}},"version":1},"id":60} \ No newline at end of file +{ + "abi": [ + { + "type": "function", + "name": "COLDIE_AUCTION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "NO_AUCTION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "SCHEDULED_AUCTION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "acceptOffer", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_currencyAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_splitAddresses", + "type": "address[]", + "internalType": "address payable[]" + }, + { + "name": "_splitRatios", + "type": "uint8[]", + "internalType": "uint8[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "approvedTokenRegistry", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract IApprovedTokenRegistry" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "auctionBids", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "bidder", + "type": "address", + "internalType": "address payable" + }, + { + "name": "currencyAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "marketplaceFee", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "auctionLengthExtension", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "bid", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_currencyAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "buy", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_currencyAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "cancelAuction", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "cancelOffer", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_currencyAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "configureAuction", + "inputs": [ + { + "name": "_auctionType", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_startingAmount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_currencyAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "_lengthOfAuction", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_startTime", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_splitAddresses", + "type": "address[]", + "internalType": "address payable[]" + }, + { + "name": "_splitRatios", + "type": "uint8[]", + "internalType": "uint8[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "convertOfferToAuction", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_currencyAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_lengthOfAuction", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_splitAddresses", + "type": "address[]", + "internalType": "address payable[]" + }, + { + "name": "_splitRatios", + "type": "uint8[]", + "internalType": "uint8[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getAuctionDetails", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "", + "type": "address[]", + "internalType": "address payable[]" + }, + { + "name": "", + "type": "uint16[]", + "internalType": "uint16[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getSalePrice", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_target", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "", + "type": "address[]", + "internalType": "address payable[]" + }, + { + "name": "", + "type": "uint8[]", + "internalType": "uint8[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_marketplaceSettings", + "type": "address", + "internalType": "address" + }, + { + "name": "_royaltyRegistry", + "type": "address", + "internalType": "address" + }, + { + "name": "_royaltyEngine", + "type": "address", + "internalType": "address" + }, + { + "name": "_superRareMarketplace", + "type": "address", + "internalType": "address" + }, + { + "name": "_superRareAuctionHouse", + "type": "address", + "internalType": "address" + }, + { + "name": "_spaceOperatorRegistry", + "type": "address", + "internalType": "address" + }, + { + "name": "_approvedTokenRegistry", + "type": "address", + "internalType": "address" + }, + { + "name": "_payments", + "type": "address", + "internalType": "address" + }, + { + "name": "_stakingRegistry", + "type": "address", + "internalType": "address" + }, + { + "name": "_networkBeneficiary", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "marketplaceSettings", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract IMarketplaceSettings" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "maxAuctionLength", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "minimumBidIncreasePercentage", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "networkBeneficiary", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "offer", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_currencyAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_convertible", + "type": "bool", + "internalType": "bool" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "offerCancelationDelay", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "payments", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract IPayments" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "removeSalePrice", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_target", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "royaltyEngine", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract IRoyaltyEngineV1" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "royaltyRegistry", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract IRareRoyaltyRegistry" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setApprovedTokenRegistry", + "inputs": [ + { + "name": "_approvedTokenRegistry", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setAuctionLengthExtension", + "inputs": [ + { + "name": "_auctionLengthExtension", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMarketplaceSettings", + "inputs": [ + { + "name": "_marketplaceSettings", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMaxAuctionLength", + "inputs": [ + { + "name": "_maxAuctionLength", + "type": "uint8", + "internalType": "uint8" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMinimumBidIncreasePercentage", + "inputs": [ + { + "name": "_minimumBidIncreasePercentage", + "type": "uint8", + "internalType": "uint8" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setNetworkBeneficiary", + "inputs": [ + { + "name": "_networkBeneficiary", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setOfferCancelationDelay", + "inputs": [ + { + "name": "_offerCancelationDelay", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setPayments", + "inputs": [ + { + "name": "_payments", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setRoyaltyEngine", + "inputs": [ + { + "name": "_royaltyEngine", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setRoyaltyRegistry", + "inputs": [ + { + "name": "_royaltyRegistry", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setSalePrice", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_currencyAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "_listPrice", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_target", + "type": "address", + "internalType": "address" + }, + { + "name": "_splitAddresses", + "type": "address[]", + "internalType": "address payable[]" + }, + { + "name": "_splitRatios", + "type": "uint8[]", + "internalType": "uint8[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setSpaceOperatorRegistry", + "inputs": [ + { + "name": "_spaceOperatorRegistry", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStakingRegistry", + "inputs": [ + { + "name": "_stakingRegistry", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setSuperRareAuctionHouse", + "inputs": [ + { + "name": "_superRareAuctionHouse", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setSuperRareMarketplace", + "inputs": [ + { + "name": "_superRareMarketplace", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "settleAuction", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "spaceOperatorRegistry", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract ISpaceOperatorRegistry" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "stakingRegistry", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "superRareAuctionHouse", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "superRareMarketplace", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenAuctions", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "auctionCreator", + "type": "address", + "internalType": "address payable" + }, + { + "name": "creationBlock", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "startingTime", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "lengthOfAuction", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "currencyAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "minimumBid", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "auctionType", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenCurrentOffers", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "buyer", + "type": "address", + "internalType": "address payable" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "timestamp", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "marketplaceFee", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "convertible", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenSalePrices", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "seller", + "type": "address", + "internalType": "address payable" + }, + { + "name": "currencyAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "AcceptOffer", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_bidder", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_seller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_currencyAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "_tokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "_splitAddresses", + "type": "address[]", + "indexed": false, + "internalType": "address payable[]" + }, + { + "name": "_splitRatios", + "type": "uint8[]", + "indexed": false, + "internalType": "uint8[]" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "AuctionBid", + "inputs": [ + { + "name": "_contractAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_bidder", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "_currencyAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "_startedAuction", + "type": "bool", + "indexed": false, + "internalType": "bool" + }, + { + "name": "_newAuctionLength", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "_previousBidder", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "AuctionSettled", + "inputs": [ + { + "name": "_contractAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_bidder", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_seller", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "_currencyAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "CancelAuction", + "inputs": [ + { + "name": "_contractAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "_auctionCreator", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "CancelOffer", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_bidder", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_currencyAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "_tokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint8", + "indexed": false, + "internalType": "uint8" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "NewAuction", + "inputs": [ + { + "name": "_contractAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_tokenId", + "type": "uint256", + "indexed": true, + "internalType": "uint256" + }, + { + "name": "_auctionCreator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_currencyAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "_startingTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "_minimumBid", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "_lengthOfAuction", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OfferPlaced", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_bidder", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_currencyAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "_tokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "_convertible", + "type": "bool", + "indexed": false, + "internalType": "bool" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SetSalePrice", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_currencyAddress", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_target", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "_tokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "_splitRecipients", + "type": "address[]", + "indexed": false, + "internalType": "address payable[]" + }, + { + "name": "_splitRatios", + "type": "uint8[]", + "indexed": false, + "internalType": "uint8[]" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Sold", + "inputs": [ + { + "name": "_originContract", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_buyer", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_seller", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "_currencyAddress", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "_tokenId", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + } + ], + "bytecode": { + "object": "0x60808060405234601557612307908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081629d9aa9146118ee575080630141c590146118c6578063060d9eeb146117ed5780630a5c4ed5146117d05780630bcba09d146117a85780630cd87c681461165b5780630e519ef91461163e5780630f2b2532146115af57806310f797891461158e578063155a56b114611574578063176ab4401461152d5780631a2ac30f146114c857806321ede03214611481578063299a0e1e146114085780632a2a326c146113c15780632c4190531461133f5780632c740844146112f85780633492e5a8146112b1578063369679a4146111aa5780633bc3d9be1461118257806348626b90146111455780634c94c90c1461111d5780635138b08c146110be578063534665e914610fdd5780636240cd1c14610fb55780636b534ed014610f8d5780636fe9f44c14610f6a578063715018a614610f0f5780637a54479214610eee5780637f35823014610ea757806384a608e214610e60578063859b97fe14610e015780638da5cb5b14610dd95780639041a0ec14610cd95780639c883af214610c92578063a11b071214610c6a578063a6d23e1014610c42578063af231a5814610bfb578063b23afc2614610bcc578063b3ffb76014610b6d578063b567858814610b0e578063ba50b63214610ae6578063c306b378146107bb578063c47c35c114610726578063c8f94f4e14610624578063c90b8714146105f8578063daa26499146105db578063dce96bf5146105b2578063e4e87e3b1461056b578063e92f94d1146104fc578063f2fde38b1461046d5763f7cfaad014610257575f80fd5b346104565761026536611a0b565b6040516331a9108f60e11b81526004810183905290926001600160a01b03169190602081602481865afa908115610462575f9161041c575b506001600160a01b031633036103cb575f7fb6039ff1edf80efca6bc48b89f5415ba07fecb2d321058dae9ce6369b2ff964b91819484835260a460205260408320828452602052604083209060018060a01b03168352602052600460408320838155836001820155836002820155600381018054858255806103b1575b505001805483825580610391575b505061038c60209161037e6040516103408582611b16565b85815285368137604051926103558685611b16565b86845286368137604051968796818852870152604086015260a0606086015260a0850190611999565b9083820360808501526119d5565b0390a3005b6103aa918452601f60208520910160051c8101906121bb565b5f80610328565b6103c491865260208620908101906121bb565b5f8061031a565b60405162461bcd60e51b8152602060048201526024808201527f72656d6f766553616c6550726963653a3a4d75737420626520746f6b656e4f776044820152633732b91760e11b6064820152608490fd5b90506020813d60201161045a575b8161043760209383611b16565b8101031261045657516001600160a01b0381168103610456575f61029d565b5f80fd5b3d915061042a565b6040513d5f823e3d90fd5b3461045657602036600319011261045657610486611911565b61048e6121d1565b6001600160a01b038116156104a8576104a690612229565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b34610456576104a65f8061050f36611a0b565b609a5460405163e92f94d160e01b602082019081526001600160a01b0395861660248301526044820194909452918416606480840191909152825290921691610559608482611b16565b51915af4610565611b37565b90611b75565b3461045657602036600319011261045657610584611911565b61058c6121d1565b6001600160a01b03168015610456576001600160601b0360a01b609d541617609d555f80f35b346104565760203660031901126104565760ff6105cd611a45565b6105d56121d1565b1660a155005b34610456575f36600319011261045657602060a254604051908152f35b34610456575f366003190112610456576040516d21a7a62224a2afa0aaa1aa24a7a760911b8152602090f35b346104565760e03660031901126104565761063d611911565b610645611927565b61064d611953565b60a4356001600160401b0381116104565761066c903690600401611969565b909360c435926001600160401b038411610456576105595f956107186104a69861070661069e8a993690600401611969565b609a5460405163647ca7a760e11b602082019081526001600160a01b039b8c16602480840191909152356044830152978b16606480830191909152356084820152988a1660a48a015260e060c48a015290981698949787959193909291610104870191611a93565b8481036023190160e486015291611ad7565b03601f198101835282611b16565b34610456576040366003190112610456576001600160a01b03610747611911565b165f5260a660205260405f206024355f5260205260e060405f2060018060a01b03815416906001810154906002810154600382015460018060a01b03600484015416916006600585015494015494604051968752602087015260408601526060850152608084015260a083015260c0820152f35b3461045657610140366003190112610456576107d5611911565b6107dd61193d565b6107e5611927565b906064356001600160a01b0381169081900361045657610803611953565b9160a4356001600160a01b038116908190036104565760c4356001600160a01b03811692908390036104565760e4356001600160a01b038116949085900361045657610104356001600160a01b038116969087900361045657610124356001600160a01b0381169890899003610456575f549960ff8b60081c16159a8b809c610ad9575b8015610ac2575b15610a665760ff1981166001175f558b610a55575b506001600160a01b0316938415610456576001600160a01b0316908115610456576001600160a01b0316918215610456578315610456576001600160a01b0316938415610456578515610456578615610456578715610456578915610456576001600160601b0360a01b60975416176097556001600160601b0360a01b60985416176098556001600160601b0360a01b60995416176099556001600160601b0360a01b609a541617609a556001600160601b0360a01b609b541617609b556001600160601b0360a01b609c541617609c556001600160601b0360a01b609d541617609d556001600160601b0360a01b609e541617609e556001600160601b0360a01b609f541617609f55600560a11b906affffffffffffffffffffff60a81b60a05416171760a05562093a8060a15561038460a25561012c60a3556109f760ff5f5460081c166109f281612271565b612271565b610a0033612229565b5f5490610a1660ff8360081c166109f281612271565b6001606555610a2157005b61ff0019165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b61ffff1916610101175f558b6108a3565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b15801561088e5750600160ff82161461088e565b50600160ff821610610887565b34610456575f366003190112610456576097546040516001600160a01b039091168152602090f35b6104a65f80610559610b1f36611a55565b609b546040516316acf0b160e31b602082019081526001600160a01b039687166024830152604482019590955292851660648401526084830191909152909216929091908160a48101610718565b6104a65f80610559610b7e36611a55565b609a5460405163059ffdbb60e51b602082019081526001600160a01b039687166024830152604482019590955292851660648401526084830191909152909216929091908160a48101610718565b34610456575f366003190112610456576040517029a1a422a22aa622a22fa0aaa1aa24a7a760791b8152602090f35b3461045657602036600319011261045657610c14611911565b610c1c6121d1565b6001600160a01b03168015610456576001600160601b0360a01b609e541617609e555f80f35b34610456575f36600319011261045657609e546040516001600160a01b039091168152602090f35b34610456575f366003190112610456576098546040516001600160a01b039091168152602090f35b3461045657602036600319011261045657610cab611911565b610cb36121d1565b6001600160a01b03168015610456576001600160601b0360a01b609a541617609a555f80f35b346104565761012036600319011261045657610cf361193d565b610cfb611953565b9060e4356001600160401b03811161045657610d1b903690600401611969565b929061010435926001600160401b038411610456576104a6946105595f9594610718610d4c88973690600401611969565b610dc660018060a01b03609b541698604051978896602088019a632410683b60e21b8c5260043560248a015260018060a01b031660448901526044356064890152606435608489015260018060a01b031660a488015260a43560c488015260c43560e4880152610120610104880152610144870191611a93565b8481036023190161012486015291611ad7565b34610456575f366003190112610456576033546040516001600160a01b039091168152602090f35b34610456576040366003190112610456576104a65f80610e1f611911565b609b546040516342cdcbff60e11b602082019081526001600160a01b0393841660248084019190915235604483015291909216916105598160648101610718565b3461045657602036600319011261045657610e79611911565b610e816121d1565b6001600160a01b03168015610456576001600160601b0360a01b60985416176098555f80f35b3461045657602036600319011261045657610ec0611911565b610ec86121d1565b6001600160a01b03168015610456576001600160601b0360a01b609c541617609c555f80f35b3461045657602036600319011261045657610f076121d1565b60043560a355005b34610456575f36600319011261045657610f276121d1565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610456575f36600319011261045657602060ff60a05460a01c16604051908152f35b34610456575f3660031901126104565760a0546040516001600160a01b039091168152602090f35b34610456575f36600319011261045657609d546040516001600160a01b039091168152602090f35b346104565760c036600319011261045657610ff6611911565b610ffe611927565b906084356001600160401b0381116104565761101e903690600401611969565b929060a435926001600160401b038411610456576104a6946105595f959461071861104e88973690600401611969565b609a5460405163534665e960e01b602082019081526001600160a01b03998a1660248084019190915235604483015295891660648083019190915235608482015260c060a482015297169793969586946110ac9160e4870191611a93565b8481036023190160c486015291611ad7565b34610456576040366003190112610456576104a65f806110dc611911565b609b5460405163144e2c2360e21b602082019081526001600160a01b0393841660248084019190915235604483015291909216916105598160648101610718565b34610456575f366003190112610456576099546040516001600160a01b039091168152602090f35b346104565760203660031901126104565761115e611a45565b6111666121d1565b60a0805460ff60a01b191691811b60ff60a01b16919091179055005b34610456575f36600319011261045657609b546040516001600160a01b039091168152602090f35b34610456576111b836611a0b565b9160018060a01b03165f5260a460205260405f20905f5260205260405f209060018060a01b03165f5260205260405f2060405160a081018181106001600160401b0382111761129d57604090815282546001600160a01b039081168352600184015416602083019081526002840154918301918252909290916112999161037e90611258600461124a60038401611bbc565b926060860193845201611c0f565b608084018190529251945195519051604080516001600160a01b0397881681529790961660208801529486015260a060608601819052859490850190611999565b0390f35b634e487b7160e01b5f52604160045260245ffd5b34610456576020366003190112610456576112ca611911565b6112d26121d1565b6001600160a01b03168015610456576001600160601b0360a01b60a054161760a0555f80f35b3461045657602036600319011261045657611311611911565b6113196121d1565b6001600160a01b03168015610456576001600160601b0360a01b609f541617609f555f80f35b346104565761134d36611a0b565b9160018060a01b03165f5260a560205260405f20905f5260205260405f209060018060a01b03165f5260205260a060405f2060ff600180841b0382541691600181015490600360028201549101549160405194855260208501526040840152818116606084015260081c1615156080820152f35b34610456576020366003190112610456576113da611911565b6113e26121d1565b6001600160a01b03168015610456576001600160601b0360a01b609b541617609b555f80f35b34610456576040366003190112610456576001600160a01b03611429611911565b165f5260a760205260405f206024355f52602052608060405f2060018060a01b038154169060018060a01b036001820154169060ff600360028301549201541691604051938452602084015260408301526060820152f35b346104565760203660031901126104565761149a611911565b6114a26121d1565b6001600160a01b03168015610456576001600160601b0360a01b60995416176099555f80f35b34610456576114d636611a0b565b6001600160a01b039283165f90815260a46020908152604080832094835293815283822092851682529182528290208054600182015460029092015484519186168252919094169184019190915290820152606090f35b3461045657602036600319011261045657611546611911565b61154e6121d1565b6001600160a01b03168015610456576001600160601b0360a01b60975416176097555f80f35b34610456575f3660031901126104565760206040515f8152f35b34610456576020366003190112610456576115a76121d1565b60043560a255005b60a0366003190112610456576115c3611911565b6115cb611927565b906084359182151580930361045657609a54604051630795929960e11b602082019081526001600160a01b0394851660248084019190915235604483015292841660648083019190915235608482015260a4808201959095529384526104a6935f9384939216919061055960c482611b16565b34610456575f36600319011261045657602060a154604051908152f35b34610456576040366003190112610456576001600160a01b0361167c611911565b165f5260a660205260405f206024355f5260205260405f2060405161012081018181106001600160401b0382111761129d5760405260018060a01b03825416815261129960018301549160208101928352611799600285015494604083019586526003810154906060840191825260018060a01b0360048201541660808501908152600582015460a0860190815260068301549160c08701928352611736600861172860078701611bbc565b9560e08a0196875201611c0f565b968761010082015260018060a01b039051169851995194519060018060a01b03905116915192519351946040519a8b9a8b5260208b015260408a01526060890152608088015260a087015260c086015261012060e0860152610120850190611999565b908382036101008501526119d5565b34610456575f36600319011261045657609c546040516001600160a01b039091168152602090f35b34610456575f36600319011261045657602060a354604051908152f35b346104565760e036600319011261045657611806611911565b61180e611927565b9060a4356001600160401b0381116104565761182e903690600401611969565b929060c435926001600160401b038411610456576104a6946105595f959461071861185e88973690600401611969565b61070660018060a01b03609b541698604051978896602088019a63060d9eeb60e01b8c5260018060a01b03166024890152602435604489015260018060a01b03166064880152606435608488015260843560a488015260e060c4880152610104870191611a93565b34610456575f36600319011261045657609a546040516001600160a01b039091168152602090f35b34610456575f36600319011261045657609f546001600160a01b03168152602090f35b600435906001600160a01b038216820361045657565b604435906001600160a01b038216820361045657565b602435906001600160a01b038216820361045657565b608435906001600160a01b038216820361045657565b9181601f84011215610456578235916001600160401b038311610456576020808501948460051b01011161045657565b90602080835192838152019201905f5b8181106119b65750505090565b82516001600160a01b03168452602093840193909201916001016119a9565b90602080835192838152019201905f5b8181106119f25750505090565b825160ff168452602093840193909201916001016119e5565b6060906003190112610456576004356001600160a01b03811681036104565790602435906044356001600160a01b03811681036104565790565b6004359060ff8216820361045657565b6080906003190112610456576004356001600160a01b03811681036104565790602435906044356001600160a01b0381168103610456579060643590565b916020908281520191905f905b808210611aad5750505090565b90919283359060018060a01b03821680920361045657602081600193829352019401920190611aa0565b916020908281520191905f905b808210611af15750505090565b90919283359060ff821680920361045657602081600193829352019401920190611ae4565b90601f801991011681019081106001600160401b0382111761129d57604052565b3d15611b70573d906001600160401b03821161129d5760405191611b65601f8201601f191660200184611b16565b82523d5f602084013e565b606090565b15611b7d5750565b604460209160405192839162461bcd60e51b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fd5b90604051918281549182825260208201905f5260205f20925f5b818110611bed575050611beb92500383611b16565b565b84546001600160a01b0316835260019485019487945060209093019201611bd6565b90604051918281549182825260208201905f5260205f20925f905b80601f83011061201357611beb945491818110611fff575b818110611fe8575b818110611fd1575b818110611fba575b818110611fa4575b818110611f8d575b818110611f76575b818110611f5f575b818110611f48575b818110611f31575b818110611f1a575b818110611f03575b818110611eec575b818110611ed5575b818110611ebe575b818110611ea7575b818110611e90575b818110611e79575b818110611e62575b818110611e4b575b818110611e34575b818110611e1d575b818110611e06575b818110611def575b818110611dd8575b818110611dc1575b818110611daa575b818110611d93575b818110611d7c575b818110611d65575b818110611d4e575b10611d40575b500383611b16565b60f81c81526020015f611d38565b92602060019160ff8560f01c168152019301611d32565b92602060019160ff8560e81c168152019301611d2a565b92602060019160ff8560e01c168152019301611d22565b92602060019160ff8560d81c168152019301611d1a565b92602060019160ff8560d01c168152019301611d12565b92602060019160ff8560c81c168152019301611d0a565b92602060019160ff8560c01c168152019301611d02565b92602060019160ff8560b81c168152019301611cfa565b92602060019160ff8560b01c168152019301611cf2565b92602060019160ff8560a81c168152019301611cea565b92602060019160ff8560a01c168152019301611ce2565b92602060019160ff8560981c168152019301611cda565b92602060019160ff8560901c168152019301611cd2565b92602060019160ff8560881c168152019301611cca565b92602060019160ff8560801c168152019301611cc2565b92602060019160ff8560781c168152019301611cba565b92602060019160ff8560701c168152019301611cb2565b92602060019160ff8560681c168152019301611caa565b92602060019160ff8560601c168152019301611ca2565b92602060019160ff8560581c168152019301611c9a565b92602060019160ff8560501c168152019301611c92565b92602060019160ff8560481c168152019301611c8a565b92602060019160ff8560401c168152019301611c82565b92602060019160ff8560381c168152019301611c7a565b92602060019160ff8560301c168152019301611c72565b92602060019160ff8560281c168152019301611c6a565b92602060019160ff85831c168152019301611c62565b92602060019160ff8560181c168152019301611c5a565b92602060019160ff8560101c168152019301611c52565b92602060019160ff8560081c168152019301611c4a565b92602060019160ff85168152019301611c42565b916020919350610400600191865460ff8116825260ff8160081c168583015260ff8160101c16604083015260ff8160181c16606083015260ff81861c16608083015260ff8160281c1660a083015260ff8160301c1660c083015260ff8160381c1660e083015260ff8160401c1661010083015260ff8160481c1661012083015260ff8160501c1661014083015260ff8160581c1661016083015260ff8160601c1661018083015260ff8160681c166101a083015260ff8160701c166101c083015260ff8160781c166101e083015260ff8160801c1661020083015260ff8160881c1661022083015260ff8160901c1661024083015260ff8160981c1661026083015260ff8160a01c1661028083015260ff8160a81c166102a083015260ff8160b01c166102c083015260ff8160b81c166102e083015260ff8160c01c1661030083015260ff8160c81c1661032083015260ff8160d01c1661034083015260ff8160d81c1661036083015260ff8160e01c1661038083015260ff8160e81c166103a083015260ff8160f01c166103c083015260f81c6103e0820152019401920185929391611c2a565b8181106121c6575050565b5f81556001016121bb565b6033546001600160a01b031633036121e557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b1561227857565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fdfea2646970667358221220bfe0dd338acb4a0c9aceb2013c38237fbb692859441cec083e21b66d04dd95f264736f6c634300081c0033", + "sourceMap": "1245:17632:60:-:0;;;;;;;;;;;;;;;;;", + "linkReferences": {} + }, + "deployedBytecode": { + "object": "0x6080806040526004361015610012575f80fd5b5f3560e01c9081629d9aa9146118ee575080630141c590146118c6578063060d9eeb146117ed5780630a5c4ed5146117d05780630bcba09d146117a85780630cd87c681461165b5780630e519ef91461163e5780630f2b2532146115af57806310f797891461158e578063155a56b114611574578063176ab4401461152d5780631a2ac30f146114c857806321ede03214611481578063299a0e1e146114085780632a2a326c146113c15780632c4190531461133f5780632c740844146112f85780633492e5a8146112b1578063369679a4146111aa5780633bc3d9be1461118257806348626b90146111455780634c94c90c1461111d5780635138b08c146110be578063534665e914610fdd5780636240cd1c14610fb55780636b534ed014610f8d5780636fe9f44c14610f6a578063715018a614610f0f5780637a54479214610eee5780637f35823014610ea757806384a608e214610e60578063859b97fe14610e015780638da5cb5b14610dd95780639041a0ec14610cd95780639c883af214610c92578063a11b071214610c6a578063a6d23e1014610c42578063af231a5814610bfb578063b23afc2614610bcc578063b3ffb76014610b6d578063b567858814610b0e578063ba50b63214610ae6578063c306b378146107bb578063c47c35c114610726578063c8f94f4e14610624578063c90b8714146105f8578063daa26499146105db578063dce96bf5146105b2578063e4e87e3b1461056b578063e92f94d1146104fc578063f2fde38b1461046d5763f7cfaad014610257575f80fd5b346104565761026536611a0b565b6040516331a9108f60e11b81526004810183905290926001600160a01b03169190602081602481865afa908115610462575f9161041c575b506001600160a01b031633036103cb575f7fb6039ff1edf80efca6bc48b89f5415ba07fecb2d321058dae9ce6369b2ff964b91819484835260a460205260408320828452602052604083209060018060a01b03168352602052600460408320838155836001820155836002820155600381018054858255806103b1575b505001805483825580610391575b505061038c60209161037e6040516103408582611b16565b85815285368137604051926103558685611b16565b86845286368137604051968796818852870152604086015260a0606086015260a0850190611999565b9083820360808501526119d5565b0390a3005b6103aa918452601f60208520910160051c8101906121bb565b5f80610328565b6103c491865260208620908101906121bb565b5f8061031a565b60405162461bcd60e51b8152602060048201526024808201527f72656d6f766553616c6550726963653a3a4d75737420626520746f6b656e4f776044820152633732b91760e11b6064820152608490fd5b90506020813d60201161045a575b8161043760209383611b16565b8101031261045657516001600160a01b0381168103610456575f61029d565b5f80fd5b3d915061042a565b6040513d5f823e3d90fd5b3461045657602036600319011261045657610486611911565b61048e6121d1565b6001600160a01b038116156104a8576104a690612229565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b34610456576104a65f8061050f36611a0b565b609a5460405163e92f94d160e01b602082019081526001600160a01b0395861660248301526044820194909452918416606480840191909152825290921691610559608482611b16565b51915af4610565611b37565b90611b75565b3461045657602036600319011261045657610584611911565b61058c6121d1565b6001600160a01b03168015610456576001600160601b0360a01b609d541617609d555f80f35b346104565760203660031901126104565760ff6105cd611a45565b6105d56121d1565b1660a155005b34610456575f36600319011261045657602060a254604051908152f35b34610456575f366003190112610456576040516d21a7a62224a2afa0aaa1aa24a7a760911b8152602090f35b346104565760e03660031901126104565761063d611911565b610645611927565b61064d611953565b60a4356001600160401b0381116104565761066c903690600401611969565b909360c435926001600160401b038411610456576105595f956107186104a69861070661069e8a993690600401611969565b609a5460405163647ca7a760e11b602082019081526001600160a01b039b8c16602480840191909152356044830152978b16606480830191909152356084820152988a1660a48a015260e060c48a015290981698949787959193909291610104870191611a93565b8481036023190160e486015291611ad7565b03601f198101835282611b16565b34610456576040366003190112610456576001600160a01b03610747611911565b165f5260a660205260405f206024355f5260205260e060405f2060018060a01b03815416906001810154906002810154600382015460018060a01b03600484015416916006600585015494015494604051968752602087015260408601526060850152608084015260a083015260c0820152f35b3461045657610140366003190112610456576107d5611911565b6107dd61193d565b6107e5611927565b906064356001600160a01b0381169081900361045657610803611953565b9160a4356001600160a01b038116908190036104565760c4356001600160a01b03811692908390036104565760e4356001600160a01b038116949085900361045657610104356001600160a01b038116969087900361045657610124356001600160a01b0381169890899003610456575f549960ff8b60081c16159a8b809c610ad9575b8015610ac2575b15610a665760ff1981166001175f558b610a55575b506001600160a01b0316938415610456576001600160a01b0316908115610456576001600160a01b0316918215610456578315610456576001600160a01b0316938415610456578515610456578615610456578715610456578915610456576001600160601b0360a01b60975416176097556001600160601b0360a01b60985416176098556001600160601b0360a01b60995416176099556001600160601b0360a01b609a541617609a556001600160601b0360a01b609b541617609b556001600160601b0360a01b609c541617609c556001600160601b0360a01b609d541617609d556001600160601b0360a01b609e541617609e556001600160601b0360a01b609f541617609f55600560a11b906affffffffffffffffffffff60a81b60a05416171760a05562093a8060a15561038460a25561012c60a3556109f760ff5f5460081c166109f281612271565b612271565b610a0033612229565b5f5490610a1660ff8360081c166109f281612271565b6001606555610a2157005b61ff0019165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b61ffff1916610101175f558b6108a3565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b15801561088e5750600160ff82161461088e565b50600160ff821610610887565b34610456575f366003190112610456576097546040516001600160a01b039091168152602090f35b6104a65f80610559610b1f36611a55565b609b546040516316acf0b160e31b602082019081526001600160a01b039687166024830152604482019590955292851660648401526084830191909152909216929091908160a48101610718565b6104a65f80610559610b7e36611a55565b609a5460405163059ffdbb60e51b602082019081526001600160a01b039687166024830152604482019590955292851660648401526084830191909152909216929091908160a48101610718565b34610456575f366003190112610456576040517029a1a422a22aa622a22fa0aaa1aa24a7a760791b8152602090f35b3461045657602036600319011261045657610c14611911565b610c1c6121d1565b6001600160a01b03168015610456576001600160601b0360a01b609e541617609e555f80f35b34610456575f36600319011261045657609e546040516001600160a01b039091168152602090f35b34610456575f366003190112610456576098546040516001600160a01b039091168152602090f35b3461045657602036600319011261045657610cab611911565b610cb36121d1565b6001600160a01b03168015610456576001600160601b0360a01b609a541617609a555f80f35b346104565761012036600319011261045657610cf361193d565b610cfb611953565b9060e4356001600160401b03811161045657610d1b903690600401611969565b929061010435926001600160401b038411610456576104a6946105595f9594610718610d4c88973690600401611969565b610dc660018060a01b03609b541698604051978896602088019a632410683b60e21b8c5260043560248a015260018060a01b031660448901526044356064890152606435608489015260018060a01b031660a488015260a43560c488015260c43560e4880152610120610104880152610144870191611a93565b8481036023190161012486015291611ad7565b34610456575f366003190112610456576033546040516001600160a01b039091168152602090f35b34610456576040366003190112610456576104a65f80610e1f611911565b609b546040516342cdcbff60e11b602082019081526001600160a01b0393841660248084019190915235604483015291909216916105598160648101610718565b3461045657602036600319011261045657610e79611911565b610e816121d1565b6001600160a01b03168015610456576001600160601b0360a01b60985416176098555f80f35b3461045657602036600319011261045657610ec0611911565b610ec86121d1565b6001600160a01b03168015610456576001600160601b0360a01b609c541617609c555f80f35b3461045657602036600319011261045657610f076121d1565b60043560a355005b34610456575f36600319011261045657610f276121d1565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610456575f36600319011261045657602060ff60a05460a01c16604051908152f35b34610456575f3660031901126104565760a0546040516001600160a01b039091168152602090f35b34610456575f36600319011261045657609d546040516001600160a01b039091168152602090f35b346104565760c036600319011261045657610ff6611911565b610ffe611927565b906084356001600160401b0381116104565761101e903690600401611969565b929060a435926001600160401b038411610456576104a6946105595f959461071861104e88973690600401611969565b609a5460405163534665e960e01b602082019081526001600160a01b03998a1660248084019190915235604483015295891660648083019190915235608482015260c060a482015297169793969586946110ac9160e4870191611a93565b8481036023190160c486015291611ad7565b34610456576040366003190112610456576104a65f806110dc611911565b609b5460405163144e2c2360e21b602082019081526001600160a01b0393841660248084019190915235604483015291909216916105598160648101610718565b34610456575f366003190112610456576099546040516001600160a01b039091168152602090f35b346104565760203660031901126104565761115e611a45565b6111666121d1565b60a0805460ff60a01b191691811b60ff60a01b16919091179055005b34610456575f36600319011261045657609b546040516001600160a01b039091168152602090f35b34610456576111b836611a0b565b9160018060a01b03165f5260a460205260405f20905f5260205260405f209060018060a01b03165f5260205260405f2060405160a081018181106001600160401b0382111761129d57604090815282546001600160a01b039081168352600184015416602083019081526002840154918301918252909290916112999161037e90611258600461124a60038401611bbc565b926060860193845201611c0f565b608084018190529251945195519051604080516001600160a01b0397881681529790961660208801529486015260a060608601819052859490850190611999565b0390f35b634e487b7160e01b5f52604160045260245ffd5b34610456576020366003190112610456576112ca611911565b6112d26121d1565b6001600160a01b03168015610456576001600160601b0360a01b60a054161760a0555f80f35b3461045657602036600319011261045657611311611911565b6113196121d1565b6001600160a01b03168015610456576001600160601b0360a01b609f541617609f555f80f35b346104565761134d36611a0b565b9160018060a01b03165f5260a560205260405f20905f5260205260405f209060018060a01b03165f5260205260a060405f2060ff600180841b0382541691600181015490600360028201549101549160405194855260208501526040840152818116606084015260081c1615156080820152f35b34610456576020366003190112610456576113da611911565b6113e26121d1565b6001600160a01b03168015610456576001600160601b0360a01b609b541617609b555f80f35b34610456576040366003190112610456576001600160a01b03611429611911565b165f5260a760205260405f206024355f52602052608060405f2060018060a01b038154169060018060a01b036001820154169060ff600360028301549201541691604051938452602084015260408301526060820152f35b346104565760203660031901126104565761149a611911565b6114a26121d1565b6001600160a01b03168015610456576001600160601b0360a01b60995416176099555f80f35b34610456576114d636611a0b565b6001600160a01b039283165f90815260a46020908152604080832094835293815283822092851682529182528290208054600182015460029092015484519186168252919094169184019190915290820152606090f35b3461045657602036600319011261045657611546611911565b61154e6121d1565b6001600160a01b03168015610456576001600160601b0360a01b60975416176097555f80f35b34610456575f3660031901126104565760206040515f8152f35b34610456576020366003190112610456576115a76121d1565b60043560a255005b60a0366003190112610456576115c3611911565b6115cb611927565b906084359182151580930361045657609a54604051630795929960e11b602082019081526001600160a01b0394851660248084019190915235604483015292841660648083019190915235608482015260a4808201959095529384526104a6935f9384939216919061055960c482611b16565b34610456575f36600319011261045657602060a154604051908152f35b34610456576040366003190112610456576001600160a01b0361167c611911565b165f5260a660205260405f206024355f5260205260405f2060405161012081018181106001600160401b0382111761129d5760405260018060a01b03825416815261129960018301549160208101928352611799600285015494604083019586526003810154906060840191825260018060a01b0360048201541660808501908152600582015460a0860190815260068301549160c08701928352611736600861172860078701611bbc565b9560e08a0196875201611c0f565b968761010082015260018060a01b039051169851995194519060018060a01b03905116915192519351946040519a8b9a8b5260208b015260408a01526060890152608088015260a087015260c086015261012060e0860152610120850190611999565b908382036101008501526119d5565b34610456575f36600319011261045657609c546040516001600160a01b039091168152602090f35b34610456575f36600319011261045657602060a354604051908152f35b346104565760e036600319011261045657611806611911565b61180e611927565b9060a4356001600160401b0381116104565761182e903690600401611969565b929060c435926001600160401b038411610456576104a6946105595f959461071861185e88973690600401611969565b61070660018060a01b03609b541698604051978896602088019a63060d9eeb60e01b8c5260018060a01b03166024890152602435604489015260018060a01b03166064880152606435608488015260843560a488015260e060c4880152610104870191611a93565b34610456575f36600319011261045657609a546040516001600160a01b039091168152602090f35b34610456575f36600319011261045657609f546001600160a01b03168152602090f35b600435906001600160a01b038216820361045657565b604435906001600160a01b038216820361045657565b602435906001600160a01b038216820361045657565b608435906001600160a01b038216820361045657565b9181601f84011215610456578235916001600160401b038311610456576020808501948460051b01011161045657565b90602080835192838152019201905f5b8181106119b65750505090565b82516001600160a01b03168452602093840193909201916001016119a9565b90602080835192838152019201905f5b8181106119f25750505090565b825160ff168452602093840193909201916001016119e5565b6060906003190112610456576004356001600160a01b03811681036104565790602435906044356001600160a01b03811681036104565790565b6004359060ff8216820361045657565b6080906003190112610456576004356001600160a01b03811681036104565790602435906044356001600160a01b0381168103610456579060643590565b916020908281520191905f905b808210611aad5750505090565b90919283359060018060a01b03821680920361045657602081600193829352019401920190611aa0565b916020908281520191905f905b808210611af15750505090565b90919283359060ff821680920361045657602081600193829352019401920190611ae4565b90601f801991011681019081106001600160401b0382111761129d57604052565b3d15611b70573d906001600160401b03821161129d5760405191611b65601f8201601f191660200184611b16565b82523d5f602084013e565b606090565b15611b7d5750565b604460209160405192839162461bcd60e51b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fd5b90604051918281549182825260208201905f5260205f20925f5b818110611bed575050611beb92500383611b16565b565b84546001600160a01b0316835260019485019487945060209093019201611bd6565b90604051918281549182825260208201905f5260205f20925f905b80601f83011061201357611beb945491818110611fff575b818110611fe8575b818110611fd1575b818110611fba575b818110611fa4575b818110611f8d575b818110611f76575b818110611f5f575b818110611f48575b818110611f31575b818110611f1a575b818110611f03575b818110611eec575b818110611ed5575b818110611ebe575b818110611ea7575b818110611e90575b818110611e79575b818110611e62575b818110611e4b575b818110611e34575b818110611e1d575b818110611e06575b818110611def575b818110611dd8575b818110611dc1575b818110611daa575b818110611d93575b818110611d7c575b818110611d65575b818110611d4e575b10611d40575b500383611b16565b60f81c81526020015f611d38565b92602060019160ff8560f01c168152019301611d32565b92602060019160ff8560e81c168152019301611d2a565b92602060019160ff8560e01c168152019301611d22565b92602060019160ff8560d81c168152019301611d1a565b92602060019160ff8560d01c168152019301611d12565b92602060019160ff8560c81c168152019301611d0a565b92602060019160ff8560c01c168152019301611d02565b92602060019160ff8560b81c168152019301611cfa565b92602060019160ff8560b01c168152019301611cf2565b92602060019160ff8560a81c168152019301611cea565b92602060019160ff8560a01c168152019301611ce2565b92602060019160ff8560981c168152019301611cda565b92602060019160ff8560901c168152019301611cd2565b92602060019160ff8560881c168152019301611cca565b92602060019160ff8560801c168152019301611cc2565b92602060019160ff8560781c168152019301611cba565b92602060019160ff8560701c168152019301611cb2565b92602060019160ff8560681c168152019301611caa565b92602060019160ff8560601c168152019301611ca2565b92602060019160ff8560581c168152019301611c9a565b92602060019160ff8560501c168152019301611c92565b92602060019160ff8560481c168152019301611c8a565b92602060019160ff8560401c168152019301611c82565b92602060019160ff8560381c168152019301611c7a565b92602060019160ff8560301c168152019301611c72565b92602060019160ff8560281c168152019301611c6a565b92602060019160ff85831c168152019301611c62565b92602060019160ff8560181c168152019301611c5a565b92602060019160ff8560101c168152019301611c52565b92602060019160ff8560081c168152019301611c4a565b92602060019160ff85168152019301611c42565b916020919350610400600191865460ff8116825260ff8160081c168583015260ff8160101c16604083015260ff8160181c16606083015260ff81861c16608083015260ff8160281c1660a083015260ff8160301c1660c083015260ff8160381c1660e083015260ff8160401c1661010083015260ff8160481c1661012083015260ff8160501c1661014083015260ff8160581c1661016083015260ff8160601c1661018083015260ff8160681c166101a083015260ff8160701c166101c083015260ff8160781c166101e083015260ff8160801c1661020083015260ff8160881c1661022083015260ff8160901c1661024083015260ff8160981c1661026083015260ff8160a01c1661028083015260ff8160a81c166102a083015260ff8160b01c166102c083015260ff8160b81c166102e083015260ff8160c01c1661030083015260ff8160c81c1661032083015260ff8160d01c1661034083015260ff8160d81c1661036083015260ff8160e01c1661038083015260ff8160e81c166103a083015260ff8160f01c166103c083015260f81c6103e0820152019401920185929391611c2a565b8181106121c6575050565b5f81556001016121bb565b6033546001600160a01b031633036121e557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b1561227857565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fdfea2646970667358221220bfe0dd338acb4a0c9aceb2013c38237fbb692859441cec083e21b66d04dd95f264736f6c634300081c0033", + "sourceMap": "1245:17632:60:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;10978:24:60;;1245:17632;10978:24;;1245:17632;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;10978:24;1245:17632;;10978:24;;;;;;;1245:17632;10978:24;;;1245:17632;-1:-1:-1;;;;;;1245:17632:60;11017:10;:24;1245:17632;;;11159:108;1245:17632;;;;;;11096:15;1245:17632;;;;;;;;;;;;;11096:51;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;11159:108;;;1245:17632;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;;10978:24;1245:17632;;;;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;;10978:24;;;1245:17632;10978:24;;1245:17632;10978:24;;;;;;1245:17632;10978:24;;;:::i;:::-;;;1245:17632;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;10978:24;;;1245:17632;;;;10978:24;;;-1:-1:-1;10978:24:60;;;1245:17632;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;;2402:22:19;1245:17632:60;;2496:8:19;;;:::i;:::-;1245:17632:60;;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;8571:30;1245:17632;;;;;:::i;:::-;8423:20;1245:17632;;;-1:-1:-1;;;8464:94:60;;;;;;-1:-1:-1;;;;;1245:17632:60;;;8464:94;;;1245:17632;;;;;;;;;;;;;;;;;;;8464:94;;1245:17632;;;;8464:94;;1245:17632;8464:94;:::i;:::-;8423:141;;;;;;:::i;:::-;8571:30;;:::i;1245:17632::-;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;4557:36;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;4600:70;1245:17632;;;4600:70;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;1245:17632:60;5422:36;1245:17632;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;6547:37:62;1245:17632:60;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;9973:219;1245:17632;;;10205:30;1245:17632;;;;;;;;;;:::i;:::-;9932:20;1245:17632;;;-1:-1:-1;;;1245:17632:60;9973:219;;;;;-1:-1:-1;;;;;1245:17632:60;;;;9973:219;;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9973:219;;1245:17632;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1245:17632:60;;;;;;;:::i;:::-;9973:219;15297:234;;9973:219;;;;;;:::i;1245:17632::-;;;;;;-1:-1:-1;;1245:17632:60;;;;-1:-1:-1;;;;;1245:17632:60;;:::i;:::-;;;;7097:68:62;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;7097:68:62;1245:17632:60;7097:68:62;;1245:17632:60;7097:68:62;;;;1245:17632:60;7097:68:62;;;1245:17632:60;;;;;;;7097:68:62;;1245:17632:60;;7097:68:62;;;;;1245:17632:60;7097:68:62;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;;;3301:14:25;;;;3347:34;;;1245:17632:60;3346:108:25;;;;1245:17632:60;;;;-1:-1:-1;;1245:17632:60;;3551:1:25;1245:17632:60;;;;3562:65:25;;1245:17632:60;-1:-1:-1;;;;;;1245:17632:60;;1913:34;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;1962:30;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;2007:28;;1245:17632;;2050:35;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;2100:36;;1245:17632;;2151:36;;1245:17632;;2202:36;;1245:17632;;2253:23;;1245:17632;;2291:33;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;2332:64;1245:17632;;;2332:64;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2402:56;1245:17632;;;2402:56;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2464:48;1245:17632;;;2464:48;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2518:44;1245:17632;;;2518:44;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2568:46;1245:17632;;;2568:46;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2620:70;1245:17632;;;2620:70;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2696:70;1245:17632;;;2696:70;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2772:31;1245:17632;;;2772:31;1245:17632;-1:-1:-1;;;;;1245:17632:60;;2809:34;1245:17632;;;2809:34;1245:17632;;;;;;;;;;;;;;;2954:6;2935:25;1245:17632;2991:10;2966:35;1245:17632;3031:9;3007:33;1245:17632;5366:69:25;1245:17632:60;;;;;;5366:69:25;;;:::i;:::-;;:::i;:::-;1195:12:19;929:10:30;1195:12:19;:::i;:::-;1245:17632:60;;;5366:69:25;1245:17632:60;;;;;5366:69:25;;;:::i;:::-;3551:1;2065:22:27;1245:17632:60;3647:99:25;;1245:17632:60;3647:99:25;1245:17632:60;;;;;3721:14:25;1245:17632:60;;;3551:1:25;1245:17632:60;;3721:14:25;1245:17632:60;3562:65:25;-1:-1:-1;;1245:17632:60;;;;;3562:65:25;;;1245:17632:60;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;;3346:108:25;3426:4;;1713:19:29;:23;3387:66:25;;3346:108;3387:66;1245:17632:60;3452:1:25;1245:17632:60;;;3436:17:25;3346:108;;3347:34;1245:17632:60;3380:1:25;1245:17632:60;;;3365:16:25;3347:34;;1245:17632:60;;;;;;-1:-1:-1;;1245:17632:60;;;;5377:47:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;16870:30;1245:17632;;16762:95;1245:17632;;;:::i;:::-;16720:21;1245:17632;;;-1:-1:-1;;;16762:95:60;;;;;;-1:-1:-1;;;;;1245:17632:60;;;16762:95;;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;16762:95;;1245:17632;;;;;16762:95;1245:17632;;7978:30;1245:17632;;7870:95;1245:17632;;;:::i;:::-;7829:20;1245:17632;;;-1:-1:-1;;;7870:95:60;;;;;;-1:-1:-1;;;;;1245:17632:60;;;7870:95;;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;7870:95;;1245:17632;;;;;7870:95;1245:17632;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;4752:23;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;4782:31;1245:17632;;;4782:31;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;6119:25:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;5484:43:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;3945:35;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;3987:44;1245:17632;;;3987:44;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;14204:30;1245:17632;13912:279;1245:17632;;;;;;;;;;;;:::i;:::-;;;;;;;13870:21;1245:17632;;;;;13912:279;;;1245:17632;13912:279;;1245:17632;;;;13912:279;;1245:17632;;;13912:279;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1245:17632:60;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1245:17632:60;;;;1513:6:19;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;16121:30;1245:17632;;;;:::i;:::-;15988:21;1245:17632;;;-1:-1:-1;;;1245:17632:60;16030:78;;;;;-1:-1:-1;;;;;1245:17632:60;;;;16030:78;;;1245:17632;;;;;;;;;;;;;;16030:78;1245:17632;;;;16030:78;1245:17632;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;3571:30;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;3608:56;1245:17632;;;3608:56;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;4336:36;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;4379:70;1245:17632;;;4379:70;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;1303:62:19;;:::i;:::-;1245:17632:60;;5708:46;1245:17632;;;;;;;;-1:-1:-1;;1245:17632:60;;;;1303:62:19;;:::i;:::-;2758:6;1245:17632:60;;-1:-1:-1;;;;;;1245:17632:60;;;;;;;-1:-1:-1;;;;;1245:17632:60;2806:40:19;1245:17632:60;;2806:40:19;1245:17632:60;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;6372:41:62;1245:17632:60;6372:41:62;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;6025:51:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;12398:30;1245:17632;12187:198;1245:17632;;;;;;;;;;;;:::i;:::-;12146:20;1245:17632;;;-1:-1:-1;;;1245:17632:60;12187:198;;;;;-1:-1:-1;;;;;1245:17632:60;;;;12187:198;;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12187:198;;1245:17632;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1245:17632:60;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1245:17632:60;;;;17398:30;1245:17632;;;;:::i;:::-;17265:21;1245:17632;;;-1:-1:-1;;;1245:17632:60;17307:78;;;;;-1:-1:-1;;;;;1245:17632:60;;;;17307:78;;;1245:17632;;;;;;;;;;;;;;17307:78;1245:17632;;;;17307:78;1245:17632;;;;;;;-1:-1:-1;;1245:17632:60;;;;5586:37:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;5274:60:60;1245:17632;;-1:-1:-1;;;;1245:17632:60;;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;5789:36:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18727:15;1245:17632;;;;;;;;;;;;;18727:51;1245:17632;;;;;;-1:-1:-1;1245:17632:60;;;;-1:-1:-1;1245:17632:60;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18835:18;;1245:17632;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;5082:33;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;5122:40;1245:17632;;;5122:40;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;4909:30;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;4946:34;1245:17632;;;4946:34;1245:17632;;;;;;;;;;;:::i;:::-;;;;;;;;;;6940:91:62;1245:17632:60;;;;;;;;;;;;;6940:91:62;1245:17632:60;;;;;;-1:-1:-1;1245:17632:60;;;;;-1:-1:-1;1245:17632:60;;;;;;;;;;6940:91:62;;;;1245:17632:60;6940:91:62;;;;;1245:17632:60;6940:91:62;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;4139:36;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;4182:46;1245:17632;;;4182:46;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;-1:-1:-1;;;;;1245:17632:60;;:::i;:::-;;;;7227:62:62;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7227:62:62;;1245:17632:60;;7227:62:62;1245:17632:60;7227:62:62;;;;1245:17632:60;7227:62:62;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;3756:28;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;3791:48;1245:17632;;;3791:48;1245:17632;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;;;;;;;6745:92:62;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6745:92:62;;1245:17632:60;6745:92:62;;;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;1303:62:19;;:::i;:::-;-1:-1:-1;;;;;1245:17632:60;3370:34;;1245:17632;;-1:-1:-1;;;;;1245:17632:60;;3411:64;1245:17632;;;3411:64;1245:17632;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;1303:62:19;;:::i;:::-;1245:17632:60;;5560:48;1245:17632;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;6829:20;1245:17632;;;-1:-1:-1;;;1245:17632:60;6870:111;;;;;-1:-1:-1;;;;;1245:17632:60;;;;6870:111;;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6870:111;;;6994:30;;1245:17632;;;;;;;6870:111;;;1245:17632;6870:111;:::i;1245:17632::-;;;;;;-1:-1:-1;;1245:17632:60;;;;;6474:31:62;1245:17632:60;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;-1:-1:-1;;;;;1245:17632:60;;:::i;:::-;;;;18117:13;1245:17632;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18381:23;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1245:17632:60;;;;5892:51:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;6619:36:62;1245:17632:60;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;:::i;:::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;15544:30;1245:17632;15297:234;1245:17632;;;;;;;;;;;;:::i;:::-;;;;;;;15255:21;1245:17632;;;;;15297:234;;;1245:17632;15297:234;;1245:17632;;;;15297:234;;1245:17632;;;;;;;15297:234;;1245:17632;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;1245:17632:60;;;;5688:35:62;1245:17632:60;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;-1:-1:-1;;1245:17632:60;;;;6195:30:62;1245:17632:60;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;1245:17632:60;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1245:17632:60;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;1245:17632:60;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1245:17632:60;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15297:234;;1245:17632;;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;15297:234;1245:17632;;-1:-1:-1;;1245:17632:60;;;;;:::i;:::-;;;;-1:-1:-1;1245:17632:60;;;;:::o;:::-;;;:::o;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1245:17632:60;;;;;;;;-1:-1:-1;;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1245:17632:60;;-1:-1:-1;1245:17632:60;;-1:-1:-1;1245:17632:60;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;;;;;1245:17632:60;;;;;;;;;;-1:-1:-1;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1245:17632:60;;-1:-1:-1;1245:17632:60;;-1:-1:-1;1245:17632:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;1599:130:19;1513:6;1245:17632:60;-1:-1:-1;;;;;1245:17632:60;929:10:30;1662:23:19;1245:17632:60;;1599:130:19:o;1245:17632:60:-;;;;;;;;;;;;;;;;;;;;;;;;;2666:187:19;2758:6;1245:17632:60;;-1:-1:-1;;;;;1245:17632:60;;;-1:-1:-1;;;;;;1245:17632:60;;;;;;;;;;2806:40:19;-1:-1:-1;;2806:40:19;2666:187::o;1245:17632:60:-;;;;:::o;:::-;;;-1:-1:-1;;;1245:17632:60;;;;;;;;;;;;;;;;;-1:-1:-1;;;1245:17632:60;;;;;;", + "linkReferences": {} + }, + "methodIdentifiers": { + "COLDIE_AUCTION()": "c90b8714", + "NO_AUCTION()": "155a56b1", + "SCHEDULED_AUCTION()": "b23afc26", + "acceptOffer(address,uint256,address,uint256,address[],uint8[])": "534665e9", + "approvedTokenRegistry()": "6240cd1c", + "auctionBids(address,uint256)": "299a0e1e", + "auctionLengthExtension()": "daa26499", + "bid(address,uint256,address,uint256)": "b5678588", + "buy(address,uint256,address,uint256)": "b3ffb760", + "cancelAuction(address,uint256)": "859b97fe", + "cancelOffer(address,uint256,address)": "e92f94d1", + "configureAuction(bytes32,address,uint256,uint256,address,uint256,uint256,address[],uint8[])": "9041a0ec", + "convertOfferToAuction(address,uint256,address,uint256,uint256,address[],uint8[])": "060d9eeb", + "getAuctionDetails(address,uint256)": "0cd87c68", + "getSalePrice(address,uint256,address)": "369679a4", + "initialize(address,address,address,address,address,address,address,address,address,address)": "c306b378", + "marketplaceSettings()": "ba50b632", + "maxAuctionLength()": "0e519ef9", + "minimumBidIncreasePercentage()": "6fe9f44c", + "networkBeneficiary()": "6b534ed0", + "offer(address,uint256,address,uint256,bool)": "0f2b2532", + "offerCancelationDelay()": "0a5c4ed5", + "owner()": "8da5cb5b", + "payments()": "a6d23e10", + "removeSalePrice(address,uint256,address)": "f7cfaad0", + "renounceOwnership()": "715018a6", + "royaltyEngine()": "4c94c90c", + "royaltyRegistry()": "a11b0712", + "setApprovedTokenRegistry(address)": "e4e87e3b", + "setAuctionLengthExtension(uint256)": "10f79789", + "setMarketplaceSettings(address)": "176ab440", + "setMaxAuctionLength(uint8)": "dce96bf5", + "setMinimumBidIncreasePercentage(uint8)": "48626b90", + "setNetworkBeneficiary(address)": "3492e5a8", + "setOfferCancelationDelay(uint256)": "7a544792", + "setPayments(address)": "af231a58", + "setRoyaltyEngine(address)": "21ede032", + "setRoyaltyRegistry(address)": "84a608e2", + "setSalePrice(address,uint256,address,uint256,address,address[],uint8[])": "c8f94f4e", + "setSpaceOperatorRegistry(address)": "7f358230", + "setStakingRegistry(address)": "2c740844", + "setSuperRareAuctionHouse(address)": "2a2a326c", + "setSuperRareMarketplace(address)": "9c883af2", + "settleAuction(address,uint256)": "5138b08c", + "spaceOperatorRegistry()": "0bcba09d", + "stakingRegistry()": "009d9aa9", + "superRareAuctionHouse()": "3bc3d9be", + "superRareMarketplace()": "0141c590", + "tokenAuctions(address,uint256)": "c47c35c1", + "tokenCurrentOffers(address,uint256,address)": "2c419053", + "tokenSalePrices(address,uint256,address)": "1a2ac30f", + "transferOwnership(address)": "f2fde38b" + }, + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_seller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address payable[]\",\"name\":\"_splitAddresses\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8[]\",\"name\":\"_splitRatios\",\"type\":\"uint8[]\"}],\"name\":\"AcceptOffer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_contractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_startedAuction\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newAuctionLength\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_previousBidder\",\"type\":\"address\"}],\"name\":\"AuctionBid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_contractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bidder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"AuctionSettled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_contractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_auctionCreator\",\"type\":\"address\"}],\"name\":\"CancelAuction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"CancelOffer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_contractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_auctionCreator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingTime\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_minimumBid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_lengthOfAuction\",\"type\":\"uint256\"}],\"name\":\"NewAuction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_convertible\",\"type\":\"bool\"}],\"name\":\"OfferPlaced\",\"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\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address payable[]\",\"name\":\"_splitRecipients\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8[]\",\"name\":\"_splitRatios\",\"type\":\"uint8[]\"}],\"name\":\"SetSalePrice\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_buyer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_seller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"Sold\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COLDIE_AUCTION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NO_AUCTION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SCHEDULED_AUCTION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"address payable[]\",\"name\":\"_splitAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"_splitRatios\",\"type\":\"uint8[]\"}],\"name\":\"acceptOffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"approvedTokenRegistry\",\"outputs\":[{\"internalType\":\"contract IApprovedTokenRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"auctionBids\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"bidder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"marketplaceFee\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"auctionLengthExtension\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"bid\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"buy\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"cancelAuction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"}],\"name\":\"cancelOffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_auctionType\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_lengthOfAuction\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startTime\",\"type\":\"uint256\"},{\"internalType\":\"address payable[]\",\"name\":\"_splitAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"_splitRatios\",\"type\":\"uint8[]\"}],\"name\":\"configureAuction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_lengthOfAuction\",\"type\":\"uint256\"},{\"internalType\":\"address payable[]\",\"name\":\"_splitAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"_splitRatios\",\"type\":\"uint8[]\"}],\"name\":\"convertOfferToAuction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"getAuctionDetails\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address payable[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"\",\"type\":\"uint8[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"}],\"name\":\"getSalePrice\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address payable[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"\",\"type\":\"uint8[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_marketplaceSettings\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_royaltyRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_royaltyEngine\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_superRareMarketplace\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_superRareAuctionHouse\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_spaceOperatorRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_approvedTokenRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_payments\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_stakingRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_networkBeneficiary\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"marketplaceSettings\",\"outputs\":[{\"internalType\":\"contract IMarketplaceSettings\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxAuctionLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minimumBidIncreasePercentage\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkBeneficiary\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_convertible\",\"type\":\"bool\"}],\"name\":\"offer\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"offerCancelationDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payments\",\"outputs\":[{\"internalType\":\"contract IPayments\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"}],\"name\":\"removeSalePrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"royaltyEngine\",\"outputs\":[{\"internalType\":\"contract IRoyaltyEngineV1\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"royaltyRegistry\",\"outputs\":[{\"internalType\":\"contract IRareRoyaltyRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_approvedTokenRegistry\",\"type\":\"address\"}],\"name\":\"setApprovedTokenRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_auctionLengthExtension\",\"type\":\"uint256\"}],\"name\":\"setAuctionLengthExtension\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_marketplaceSettings\",\"type\":\"address\"}],\"name\":\"setMarketplaceSettings\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_maxAuctionLength\",\"type\":\"uint8\"}],\"name\":\"setMaxAuctionLength\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_minimumBidIncreasePercentage\",\"type\":\"uint8\"}],\"name\":\"setMinimumBidIncreasePercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_networkBeneficiary\",\"type\":\"address\"}],\"name\":\"setNetworkBeneficiary\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_offerCancelationDelay\",\"type\":\"uint256\"}],\"name\":\"setOfferCancelationDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_payments\",\"type\":\"address\"}],\"name\":\"setPayments\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_royaltyEngine\",\"type\":\"address\"}],\"name\":\"setRoyaltyEngine\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_royaltyRegistry\",\"type\":\"address\"}],\"name\":\"setRoyaltyRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_listPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"address payable[]\",\"name\":\"_splitAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8[]\",\"name\":\"_splitRatios\",\"type\":\"uint8[]\"}],\"name\":\"setSalePrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_spaceOperatorRegistry\",\"type\":\"address\"}],\"name\":\"setSpaceOperatorRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_stakingRegistry\",\"type\":\"address\"}],\"name\":\"setStakingRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_superRareAuctionHouse\",\"type\":\"address\"}],\"name\":\"setSuperRareAuctionHouse\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_superRareMarketplace\",\"type\":\"address\"}],\"name\":\"setSuperRareMarketplace\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_originContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"settleAuction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"spaceOperatorRegistry\",\"outputs\":[{\"internalType\":\"contract ISpaceOperatorRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakingRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superRareAuctionHouse\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superRareMarketplace\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokenAuctions\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"auctionCreator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"creationBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startingTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lengthOfAuction\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minimumBid\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"auctionType\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"tokenCurrentOffers\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"buyer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"marketplaceFee\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"convertible\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"tokenSalePrices\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"currencyAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"koloz\",\"details\":\"All storage is inherrited and append only (no modifications) to make upgrade compliant.\",\"events\":{\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOffer(address,uint256,address,uint256,address[],uint8[])\":{\"details\":\"Zero address for _currency means that the offer being accepted is in ether.\",\"params\":{\"_amount\":\"Amount the offer was for/and is being accepted.\",\"_currencyAddress\":\"Address of the currency used for the offer.\",\"_originContract\":\"Contract of the asset the offer was made on.\",\"_splitAddresses\":\"Addresses to split the sellers commission with.\",\"_splitRatios\":\"The ratio for the split corresponding to each of the addresses being split with.\",\"_tokenId\":\"TokenId of the asset.\"}},\"bid(address,uint256,address,uint256)\":{\"details\":\"Only the configured currency can be used (Zero address for eth)\",\"params\":{\"_amount\":\"Amount of the currency being used for the bid.\",\"_currencyAddress\":\"Address of currency being used to bid.\",\"_originContract\":\"Contract address of asset being bid on.\",\"_tokenId\":\"Token Id of the asset.\"}},\"buy(address,uint256,address,uint256)\":{\"details\":\"Covers use of any currency (0 address is eth).Need to verify that the buyer (if not using eth) has the marketplace approved for _currencyContract.Need to verify that the seller has the marketplace approved for _originContract.\",\"params\":{\"_amount\":\"Amount the piece if being bought for (including marketplace fee).\",\"_currencyAddress\":\"Currency address of asset being used to buy.\",\"_originContract\":\"Contract address for asset being bought.\",\"_tokenId\":\"TokenId of asset being bought.\"}},\"cancelAuction(address,uint256)\":{\"details\":\"Requires the person sending the message to be the auction creator or token owner.\",\"params\":{\"_originContract\":\"Contract address of the asset pending auction.\",\"_tokenId\":\"Token Id of the asset.\"}},\"cancelOffer(address,uint256,address)\":{\"params\":{\"_currencyAddress\":\"Currency address of the offer.\",\"_originContract\":\"Contract address of token.\",\"_tokenId\":\"TokenId that has an offer.\"}},\"configureAuction(bytes32,address,uint256,uint256,address,uint256,uint256,address[],uint8[])\":{\"details\":\"If auction type is coldie (reserve) then _startingAmount cant be 0._currencyAddress equal to the zero address denotes eth.All time related params are unix epoch timestamps.\",\"params\":{\"_auctionType\":\"The type of auction being configured.\",\"_currencyAddress\":\"The currency the auction is being conducted in.\",\"_lengthOfAuction\":\"The amount of time in seconds that the auction is configured for.\",\"_originContract\":\"Contract address of the asset being put up for auction.\",\"_splitAddresses\":\"Addresses to split the sellers commission with.\",\"_splitRatios\":\"The ratio for the split corresponding to each of the addresses being split with.\",\"_startingAmount\":\"The reserve price or min bid of an auction.\",\"_tokenId\":\"Token Id of the asset.\"}},\"convertOfferToAuction(address,uint256,address,uint256,uint256,address[],uint8[])\":{\"details\":\"Covers use of any currency (0 address is eth).Only covers converting an offer to a coldie auction.Cant convert offer if an auction currently exists.\",\"params\":{\"_amount\":\"Amount being converted into an auction.\",\"_currencyAddress\":\"Address of the currency being converted.\",\"_lengthOfAuction\":\"Number of seconds the auction will last.\",\"_originContract\":\"Contract address of the asset.\",\"_splitAddresses\":\"Addresses that the sellers take in will be split amongst.\",\"_splitRatios\":\"Ratios that the take in will be split by.\",\"_tokenId\":\"Token Id of the asset.\"}},\"getAuctionDetails(address,uint256)\":{\"returns\":{\"_0\":\"Auction Struct: creatorAddress, creationTime, startingTime, lengthOfAuction, currencyAddress, minimumBid, auctionType, splitRecipients array, and splitRatios array.\"}},\"offer(address,uint256,address,uint256,bool)\":{\"details\":\"Notice we need to verify that the msg sender has approved us to move funds on their behalf.Covers use of any currency (0 address is eth)._amount is the amount of the offer excluding the marketplace fee.There can be multiple offers of different currencies, but only 1 per currency.\",\"params\":{\"_amount\":\"Amount being offered.\",\"_convertible\":\"If the offer can be converted into an auction\",\"_currencyAddress\":\"Address of the token being offered.\",\"_originContract\":\"Contract address of the asset being listed.\",\"_tokenId\":\"Token Id of the asset.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"removeSalePrice(address,uint256,address)\":{\"details\":\"Sale prices could still exist for different currencies.Sale prices could still exist for different targets.Zero address for _currency means that its listed in ether._target of zero address is the general sale price.\",\"params\":{\"_originContract\":\"The origin contract of the asset.\",\"_target\":\"The address of the person\",\"_tokenId\":\"The tokenId of the asset within the _originContract.\"}},\"renounceOwnership()\":{\"details\":\"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.\"},\"setSalePrice(address,uint256,address,uint256,address,address[],uint8[])\":{\"details\":\"Covers use of any currency (0 address is eth).Sale price for everyone is denoted as the 0 address.Only 1 currency can be used for the sale price directed at a speicific target._listPrice of 0 signifies removing the list price for the provided currency.This function can be used for counter offers as well.\",\"params\":{\"_currencyAddress\":\"Contract address of the currency asset is being listed for.\",\"_listPrice\":\"Amount of the currency the asset is being listed for (including all decimal points).\",\"_originContract\":\"Contract address of the asset being listed.\",\"_splitAddresses\":\"Addresses to split the sellers commission with.\",\"_splitRatios\":\"The ratio for the split corresponding to each of the addresses being split with.\",\"_target\":\"Address of the person this sale price is target to.\",\"_tokenId\":\"Token Id of the asset.\"}},\"settleAuction(address,uint256)\":{\"details\":\"Anyone is able to settle an auction since non-input params are used.\",\"params\":{\"_originContract\":\"Contract address of asset.\",\"_tokenId\":\"Token Id of the asset.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"SuperRareBazaar\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"acceptOffer(address,uint256,address,uint256,address[],uint8[])\":{\"notice\":\"Accept an offer placed on _originContract : _tokenId.\"},\"bid(address,uint256,address,uint256)\":{\"notice\":\"Places a bid on a valid auction.\"},\"buy(address,uint256,address,uint256)\":{\"notice\":\"Purchases the token for the current sale price.\"},\"cancelAuction(address,uint256)\":{\"notice\":\"Cancels a configured Auction that has not started.\"},\"cancelOffer(address,uint256,address)\":{\"notice\":\"Cancels an existing offer the sender has placed on a piece.\"},\"configureAuction(bytes32,address,uint256,uint256,address,uint256,uint256,address[],uint8[])\":{\"notice\":\"Configures an Auction for a given asset.\"},\"convertOfferToAuction(address,uint256,address,uint256,uint256,address[],uint8[])\":{\"notice\":\"Converts an offer into a coldie auction.\"},\"offer(address,uint256,address,uint256,bool)\":{\"notice\":\"Place an offer for a given asset\"},\"removeSalePrice(address,uint256,address)\":{\"notice\":\"Removes the current sale price of an asset for _target for the given currency.\"},\"setSalePrice(address,uint256,address,uint256,address,address[],uint8[])\":{\"notice\":\"Sets a sale price for the given asset(s) directed at the _target address.\"},\"settleAuction(address,uint256)\":{\"notice\":\"Settles an auction that has ended.\"}},\"notice\":\"The unified contract for the bazaar logic (Marketplace and Auction House).\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/bazaar/SuperRareBazaar.sol\":\"SuperRareBazaar\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@ensdomains/buffer/=lib/buffer/\",\":@ensdomains/ens-contracts/=lib/ens-contracts/contracts/\",\":@ensdomains/governance/=lib/governance-contracts/contracts/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@uniswap/v3-core/=lib/v3-core/contracts/\",\":@uniswap/v3-core/contracts/=lib/v3-core/contracts/\",\":@uniswap/v3-periphery/=lib/v3-periphery/contracts/\",\":arachnid/solidity-stringutils/=lib/solidity-stringutils/\",\":ds-test/=lib/ds-test/src/\",\":ensdomains/ens-contracts/=lib/ensdomains/ens-contracts/contracts/\",\":ensdomains/governance/=lib/governance-contracts/contracts/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/\",\":rareprotocol/assets/=lib/assets/src/\",\":rareprotocol/aux/=src/\",\":royalty-guard/=lib/royalty-guard/src/royalty-guard/\",\":royalty-registry-solidity/=lib/royalty-registry-solidity/contracts/\",\":royalty-registry/=lib/royalty-registry-solidity/contracts/\",\":solmate/=lib/solmate/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8\",\"dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol\":{\"keccak256\":\"0xb82ef33f43b6b96109687d91b39c94573fdccaaa423fe28e8ba0977b31c023e0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec9c629f63e66379f9c868a74f971064701cc6e30583872aa653f8b932518025\",\"dweb:/ipfs/QmY4MnZF2VMFwJkAwpdQwxEWA3KcGbNBKEmAVYePMVQWUR\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x41bbb2c41036ca64b2f6c9e973e8cfaa113ebc42af86702cd0d267f915a7e886\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6bf6699c55e82c7af6ae90b61ea9643ca0c905097da9a31269319f1b5a2a696a\",\"dweb:/ipfs/QmRJZa2UmWcRo6W8JnuomwzfjVtAS21QC8HKggxBhoPsU4\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"lib/royalty-registry-solidity/contracts/IRoyaltyEngineV1.sol\":{\"keccak256\":\"0xc66561df4db1dd5bc3d14e2ec1c5cf393db682b18989779acc41b3a4834d9d27\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c342b761cb6656f04bc4cb40e4593aed5484efee9594a806dbd3a95fd6d757a9\",\"dweb:/ipfs/QmWsz6C36AhhSfBhfdfX3LhPabLkqGxa23s5iNfN4yJq7r\"]},\"src/bazaar/ISuperRareBazaar.sol\":{\"keccak256\":\"0xb75cb39f8c63e813a2891b41ae6c835903c975b2646b689936c51bc6d3a74546\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://616f9aa0a4ae90da19f46b62041eadeef64b13a9e1870ac9791cb94f85c62805\",\"dweb:/ipfs/QmeqhUs6pzfsTUoarSArUMrtmHvvMYnTD4XiFLAj6KwaWk\"]},\"src/bazaar/SuperRareBazaar.sol\":{\"keccak256\":\"0x18a2c74610adf65f8a7556133a73ee5fbb22a321439c066f0062bb2b47700898\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4b22a2e8ffb544c2cc822e0f1cf09dd162487f435a1395b6816b8ced48f7c4ff\",\"dweb:/ipfs/QmNjEFq94276Ca96xmucb2pWPahLJwqcUgG3KUZZrRPtpA\"]},\"src/bazaar/SuperRareBazaarStorage.sol\":{\"keccak256\":\"0x07b013f4ed5ca846af48f74faae20547b1f806d98093eef050d2ac6e838f3714\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a0dc91b04769e552b01efd38a796df6f20694a9e478c582b37fdd103894195a\",\"dweb:/ipfs/QmUM79e82SXrAp9oHQZRmhXS3BjtUhsKZ5rQMwUcT6FTgc\"]},\"src/marketplace/IMarketplaceSettings.sol\":{\"keccak256\":\"0xa42b0f448c52cc04ca1c3b013ecbf99b9b5d857e7ed37a8fe178669fab933083\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://00f697de6e1de92ccd4fd260ce9bde6fca290121f5f7e2b7d9cee8f718670ff0\",\"dweb:/ipfs/Qmbt7gXsaTG8WmeFaLSCeNy3ViZgLRgeNfwHpRwL1hia13\"]},\"src/payments/IPayments.sol\":{\"keccak256\":\"0xd5370fe954b457c13045901acfe5aa8c4dc66885f913d2729aa7c65975e7fbbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9da9318f1b4585578ca5606c320f093bb86682594c6cd8244f9be59650efcd38\",\"dweb:/ipfs/Qmaq1QFA45ZkPjqn1idCVGrUzCd5pbuUuw18N3Xk1Sewdc\"]},\"src/registry/interfaces/IApprovedTokenRegistry.sol\":{\"keccak256\":\"0xdb86d418bedb954ea79129631d734b42749d4a0ca00635ecdf3dfeb8e81fb60a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ad677939c49f8a55f7a1c1e78b0abbe722744abc5c26b81eef5a20a578d415d2\",\"dweb:/ipfs/QmZL6aHq79B8TFPrc5Zrt7iLxuqkoJikhEJtq8hgk1aKMC\"]},\"src/registry/interfaces/ICreatorRegistry.sol\":{\"keccak256\":\"0xcaeba1e630efa2ce901d39632fa5760cfbfd8647bf8657a137f4cece2d714ed8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://161e5d0d9f9b27e97cbdb4fc10134254fe329fcd549fdb07900bb553d2a1ccc1\",\"dweb:/ipfs/QmNtKFgVqB28YwLJg6TWgXWHEJybrXFXEWbU5gep99HEcP\"]},\"src/registry/interfaces/IRareRoyaltyRegistry.sol\":{\"keccak256\":\"0xd6b673182b9c6453e38fcd29bd85a788b3734f82202a77cd64d15422e98ffac9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://70fd1ef8d3a5d44f2e984e969528c8a0ab25eefc92a3b19cfa63b6394bc798e3\",\"dweb:/ipfs/QmTDCPVfxqAcXDzdYfHQbm1f4nYJSBeRz91oqjfE8fxk2r\"]},\"src/registry/interfaces/ISpaceOperatorRegistry.sol\":{\"keccak256\":\"0x2b0899fa39f324d105f5b3b7fe6d0020374c5065d19aa87b74fd042f368b4ade\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://88aaf406edb29325f05024f8f94b0eab31de5f08c02c9cdea053da6671df1d33\",\"dweb:/ipfs/QmSPXe7U4aCaLew2xJ3gmQqBWTf3QMvpxYV2XNq3e41gGT\"]}},\"version\":1}", + "metadata": { + "compiler": { + "version": "0.8.28+commit.7893614a" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_bidder", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_seller", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address payable[]", + "name": "_splitAddresses", + "type": "address[]", + "indexed": false + }, + { + "internalType": "uint8[]", + "name": "_splitRatios", + "type": "uint8[]", + "indexed": false + } + ], + "type": "event", + "name": "AcceptOffer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_contractAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_bidder", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256", + "indexed": false + }, + { + "internalType": "bool", + "name": "_startedAuction", + "type": "bool", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_newAuctionLength", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address", + "name": "_previousBidder", + "type": "address", + "indexed": false + } + ], + "type": "event", + "name": "AuctionBid", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_contractAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_bidder", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_seller", + "type": "address", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "AuctionSettled", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_contractAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "address", + "name": "_auctionCreator", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "CancelAuction", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_bidder", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "CancelOffer", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "version", + "type": "uint8", + "indexed": false + } + ], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_contractAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256", + "indexed": true + }, + { + "internalType": "address", + "name": "_auctionCreator", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_startingTime", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_minimumBid", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_lengthOfAuction", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "NewAuction", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_bidder", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "bool", + "name": "_convertible", + "type": "bool", + "indexed": false + } + ], + "type": "event", + "name": "OfferPlaced", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "previousOwner", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_target", + "type": "address", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256", + "indexed": false + }, + { + "internalType": "address payable[]", + "name": "_splitRecipients", + "type": "address[]", + "indexed": false + }, + { + "internalType": "uint8[]", + "name": "_splitRatios", + "type": "uint8[]", + "indexed": false + } + ], + "type": "event", + "name": "SetSalePrice", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_buyer", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_seller", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256", + "indexed": false + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256", + "indexed": false + } + ], + "type": "event", + "name": "Sold", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "COLDIE_AUCTION", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "NO_AUCTION", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "SCHEDULED_AUCTION", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address payable[]", + "name": "_splitAddresses", + "type": "address[]" + }, + { + "internalType": "uint8[]", + "name": "_splitRatios", + "type": "uint8[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "acceptOffer" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "approvedTokenRegistry", + "outputs": [ + { + "internalType": "contract IApprovedTokenRegistry", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "auctionBids", + "outputs": [ + { + "internalType": "address payable", + "name": "bidder", + "type": "address" + }, + { + "internalType": "address", + "name": "currencyAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "marketplaceFee", + "type": "uint8" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "auctionLengthExtension", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "bid" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "buy" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "cancelAuction" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "cancelOffer" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_auctionType", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_startingAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lengthOfAuction", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_startTime", + "type": "uint256" + }, + { + "internalType": "address payable[]", + "name": "_splitAddresses", + "type": "address[]" + }, + { + "internalType": "uint8[]", + "name": "_splitRatios", + "type": "uint8[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "configureAuction" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_lengthOfAuction", + "type": "uint256" + }, + { + "internalType": "address payable[]", + "name": "_splitAddresses", + "type": "address[]" + }, + { + "internalType": "uint8[]", + "name": "_splitRatios", + "type": "uint8[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "convertOfferToAuction" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getAuctionDetails", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "address payable[]", + "name": "", + "type": "address[]" + }, + { + "internalType": "uint8[]", + "name": "", + "type": "uint8[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_target", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getSalePrice", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address payable[]", + "name": "", + "type": "address[]" + }, + { + "internalType": "uint8[]", + "name": "", + "type": "uint8[]" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_marketplaceSettings", + "type": "address" + }, + { + "internalType": "address", + "name": "_royaltyRegistry", + "type": "address" + }, + { + "internalType": "address", + "name": "_royaltyEngine", + "type": "address" + }, + { + "internalType": "address", + "name": "_superRareMarketplace", + "type": "address" + }, + { + "internalType": "address", + "name": "_superRareAuctionHouse", + "type": "address" + }, + { + "internalType": "address", + "name": "_spaceOperatorRegistry", + "type": "address" + }, + { + "internalType": "address", + "name": "_approvedTokenRegistry", + "type": "address" + }, + { + "internalType": "address", + "name": "_payments", + "type": "address" + }, + { + "internalType": "address", + "name": "_stakingRegistry", + "type": "address" + }, + { + "internalType": "address", + "name": "_networkBeneficiary", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "marketplaceSettings", + "outputs": [ + { + "internalType": "contract IMarketplaceSettings", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "maxAuctionLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "minimumBidIncreasePercentage", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "networkBeneficiary", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_convertible", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "offer" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "offerCancelationDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "payments", + "outputs": [ + { + "internalType": "contract IPayments", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_target", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "removeSalePrice" + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "renounceOwnership" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "royaltyEngine", + "outputs": [ + { + "internalType": "contract IRoyaltyEngineV1", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "royaltyRegistry", + "outputs": [ + { + "internalType": "contract IRareRoyaltyRegistry", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_approvedTokenRegistry", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setApprovedTokenRegistry" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_auctionLengthExtension", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setAuctionLengthExtension" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_marketplaceSettings", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMarketplaceSettings" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_maxAuctionLength", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMaxAuctionLength" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_minimumBidIncreasePercentage", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setMinimumBidIncreasePercentage" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_networkBeneficiary", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setNetworkBeneficiary" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_offerCancelationDelay", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setOfferCancelationDelay" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_payments", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setPayments" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_royaltyEngine", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setRoyaltyEngine" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_royaltyRegistry", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setRoyaltyRegistry" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_currencyAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_listPrice", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_target", + "type": "address" + }, + { + "internalType": "address payable[]", + "name": "_splitAddresses", + "type": "address[]" + }, + { + "internalType": "uint8[]", + "name": "_splitRatios", + "type": "uint8[]" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setSalePrice" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_spaceOperatorRegistry", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setSpaceOperatorRegistry" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_stakingRegistry", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setStakingRegistry" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_superRareAuctionHouse", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setSuperRareAuctionHouse" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_superRareMarketplace", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setSuperRareMarketplace" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_originContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "settleAuction" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "spaceOperatorRegistry", + "outputs": [ + { + "internalType": "contract ISpaceOperatorRegistry", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "stakingRegistry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "superRareAuctionHouse", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "superRareMarketplace", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokenAuctions", + "outputs": [ + { + "internalType": "address payable", + "name": "auctionCreator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "creationBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "startingTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lengthOfAuction", + "type": "uint256" + }, + { + "internalType": "address", + "name": "currencyAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "minimumBid", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "auctionType", + "type": "bytes32" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokenCurrentOffers", + "outputs": [ + { + "internalType": "address payable", + "name": "buyer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "marketplaceFee", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "convertible", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function", + "name": "tokenSalePrices", + "outputs": [ + { + "internalType": "address payable", + "name": "seller", + "type": "address" + }, + { + "internalType": "address", + "name": "currencyAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferOwnership" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "acceptOffer(address,uint256,address,uint256,address[],uint8[])": { + "details": "Zero address for _currency means that the offer being accepted is in ether.", + "params": { + "_amount": "Amount the offer was for/and is being accepted.", + "_currencyAddress": "Address of the currency used for the offer.", + "_originContract": "Contract of the asset the offer was made on.", + "_splitAddresses": "Addresses to split the sellers commission with.", + "_splitRatios": "The ratio for the split corresponding to each of the addresses being split with.", + "_tokenId": "TokenId of the asset." + } + }, + "bid(address,uint256,address,uint256)": { + "details": "Only the configured currency can be used (Zero address for eth)", + "params": { + "_amount": "Amount of the currency being used for the bid.", + "_currencyAddress": "Address of currency being used to bid.", + "_originContract": "Contract address of asset being bid on.", + "_tokenId": "Token Id of the asset." + } + }, + "buy(address,uint256,address,uint256)": { + "details": "Covers use of any currency (0 address is eth).Need to verify that the buyer (if not using eth) has the marketplace approved for _currencyContract.Need to verify that the seller has the marketplace approved for _originContract.", + "params": { + "_amount": "Amount the piece if being bought for (including marketplace fee).", + "_currencyAddress": "Currency address of asset being used to buy.", + "_originContract": "Contract address for asset being bought.", + "_tokenId": "TokenId of asset being bought." + } + }, + "cancelAuction(address,uint256)": { + "details": "Requires the person sending the message to be the auction creator or token owner.", + "params": { + "_originContract": "Contract address of the asset pending auction.", + "_tokenId": "Token Id of the asset." + } + }, + "cancelOffer(address,uint256,address)": { + "params": { + "_currencyAddress": "Currency address of the offer.", + "_originContract": "Contract address of token.", + "_tokenId": "TokenId that has an offer." + } + }, + "configureAuction(bytes32,address,uint256,uint256,address,uint256,uint256,address[],uint8[])": { + "details": "If auction type is coldie (reserve) then _startingAmount cant be 0._currencyAddress equal to the zero address denotes eth.All time related params are unix epoch timestamps.", + "params": { + "_auctionType": "The type of auction being configured.", + "_currencyAddress": "The currency the auction is being conducted in.", + "_lengthOfAuction": "The amount of time in seconds that the auction is configured for.", + "_originContract": "Contract address of the asset being put up for auction.", + "_splitAddresses": "Addresses to split the sellers commission with.", + "_splitRatios": "The ratio for the split corresponding to each of the addresses being split with.", + "_startingAmount": "The reserve price or min bid of an auction.", + "_tokenId": "Token Id of the asset." + } + }, + "convertOfferToAuction(address,uint256,address,uint256,uint256,address[],uint8[])": { + "details": "Covers use of any currency (0 address is eth).Only covers converting an offer to a coldie auction.Cant convert offer if an auction currently exists.", + "params": { + "_amount": "Amount being converted into an auction.", + "_currencyAddress": "Address of the currency being converted.", + "_lengthOfAuction": "Number of seconds the auction will last.", + "_originContract": "Contract address of the asset.", + "_splitAddresses": "Addresses that the sellers take in will be split amongst.", + "_splitRatios": "Ratios that the take in will be split by.", + "_tokenId": "Token Id of the asset." + } + }, + "getAuctionDetails(address,uint256)": { + "returns": { + "_0": "Auction Struct: creatorAddress, creationTime, startingTime, lengthOfAuction, currencyAddress, minimumBid, auctionType, splitRecipients array, and splitRatios array." + } + }, + "offer(address,uint256,address,uint256,bool)": { + "details": "Notice we need to verify that the msg sender has approved us to move funds on their behalf.Covers use of any currency (0 address is eth)._amount is the amount of the offer excluding the marketplace fee.There can be multiple offers of different currencies, but only 1 per currency.", + "params": { + "_amount": "Amount being offered.", + "_convertible": "If the offer can be converted into an auction", + "_currencyAddress": "Address of the token being offered.", + "_originContract": "Contract address of the asset being listed.", + "_tokenId": "Token Id of the asset." + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "removeSalePrice(address,uint256,address)": { + "details": "Sale prices could still exist for different currencies.Sale prices could still exist for different targets.Zero address for _currency means that its listed in ether._target of zero address is the general sale price.", + "params": { + "_originContract": "The origin contract of the asset.", + "_target": "The address of the person", + "_tokenId": "The tokenId of the asset within the _originContract." + } + }, + "renounceOwnership()": { + "details": "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." + }, + "setSalePrice(address,uint256,address,uint256,address,address[],uint8[])": { + "details": "Covers use of any currency (0 address is eth).Sale price for everyone is denoted as the 0 address.Only 1 currency can be used for the sale price directed at a speicific target._listPrice of 0 signifies removing the list price for the provided currency.This function can be used for counter offers as well.", + "params": { + "_currencyAddress": "Contract address of the currency asset is being listed for.", + "_listPrice": "Amount of the currency the asset is being listed for (including all decimal points).", + "_originContract": "Contract address of the asset being listed.", + "_splitAddresses": "Addresses to split the sellers commission with.", + "_splitRatios": "The ratio for the split corresponding to each of the addresses being split with.", + "_target": "Address of the person this sale price is target to.", + "_tokenId": "Token Id of the asset." + } + }, + "settleAuction(address,uint256)": { + "details": "Anyone is able to settle an auction since non-input params are used.", + "params": { + "_originContract": "Contract address of asset.", + "_tokenId": "Token Id of the asset." + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "acceptOffer(address,uint256,address,uint256,address[],uint8[])": { + "notice": "Accept an offer placed on _originContract : _tokenId." + }, + "bid(address,uint256,address,uint256)": { + "notice": "Places a bid on a valid auction." + }, + "buy(address,uint256,address,uint256)": { + "notice": "Purchases the token for the current sale price." + }, + "cancelAuction(address,uint256)": { + "notice": "Cancels a configured Auction that has not started." + }, + "cancelOffer(address,uint256,address)": { + "notice": "Cancels an existing offer the sender has placed on a piece." + }, + "configureAuction(bytes32,address,uint256,uint256,address,uint256,uint256,address[],uint8[])": { + "notice": "Configures an Auction for a given asset." + }, + "convertOfferToAuction(address,uint256,address,uint256,uint256,address[],uint8[])": { + "notice": "Converts an offer into a coldie auction." + }, + "offer(address,uint256,address,uint256,bool)": { + "notice": "Place an offer for a given asset" + }, + "removeSalePrice(address,uint256,address)": { + "notice": "Removes the current sale price of an asset for _target for the given currency." + }, + "setSalePrice(address,uint256,address,uint256,address,address[],uint8[])": { + "notice": "Sets a sale price for the given asset(s) directed at the _target address." + }, + "settleAuction(address,uint256)": { + "notice": "Settles an auction that has ended." + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@ensdomains/buffer/=lib/buffer/", + "@ensdomains/ens-contracts/=lib/ens-contracts/contracts/", + "@ensdomains/governance/=lib/governance-contracts/contracts/", + "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", + "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", + "@uniswap/v3-core/=lib/v3-core/contracts/", + "@uniswap/v3-core/contracts/=lib/v3-core/contracts/", + "@uniswap/v3-periphery/=lib/v3-periphery/contracts/", + "arachnid/solidity-stringutils/=lib/solidity-stringutils/", + "ds-test/=lib/ds-test/src/", + "ensdomains/ens-contracts/=lib/ensdomains/ens-contracts/contracts/", + "ensdomains/governance/=lib/governance-contracts/contracts/", + "forge-std/=lib/forge-std/src/", + "murky/=lib/murky/src/", + "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/", + "rareprotocol/assets/=lib/assets/src/", + "rareprotocol/aux/=src/", + "royalty-guard/=lib/royalty-guard/src/royalty-guard/", + "royalty-registry-solidity/=lib/royalty-registry-solidity/contracts/", + "royalty-registry/=lib/royalty-registry-solidity/contracts/", + "solmate/=lib/solmate/src/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "ipfs" + }, + "compilationTarget": { + "src/bazaar/SuperRareBazaar.sol": "SuperRareBazaar" + }, + "evmVersion": "cancun", + "libraries": {}, + "viaIR": true + }, + "sources": { + "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol": { + "keccak256": "0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98", + "urls": [ + "bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8", + "dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol": { + "keccak256": "0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794", + "urls": [ + "bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e", + "dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol": { + "keccak256": "0xb82ef33f43b6b96109687d91b39c94573fdccaaa423fe28e8ba0977b31c023e0", + "urls": [ + "bzz-raw://ec9c629f63e66379f9c868a74f971064701cc6e30583872aa653f8b932518025", + "dweb:/ipfs/QmY4MnZF2VMFwJkAwpdQwxEWA3KcGbNBKEmAVYePMVQWUR" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol": { + "keccak256": "0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422", + "urls": [ + "bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b", + "dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol": { + "keccak256": "0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149", + "urls": [ + "bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c", + "dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol": { + "keccak256": "0x41bbb2c41036ca64b2f6c9e973e8cfaa113ebc42af86702cd0d267f915a7e886", + "urls": [ + "bzz-raw://6bf6699c55e82c7af6ae90b61ea9643ca0c905097da9a31269319f1b5a2a696a", + "dweb:/ipfs/QmRJZa2UmWcRo6W8JnuomwzfjVtAS21QC8HKggxBhoPsU4" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1", + "urls": [ + "bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f", + "dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy" + ], + "license": "MIT" + }, + "lib/royalty-registry-solidity/contracts/IRoyaltyEngineV1.sol": { + "keccak256": "0xc66561df4db1dd5bc3d14e2ec1c5cf393db682b18989779acc41b3a4834d9d27", + "urls": [ + "bzz-raw://c342b761cb6656f04bc4cb40e4593aed5484efee9594a806dbd3a95fd6d757a9", + "dweb:/ipfs/QmWsz6C36AhhSfBhfdfX3LhPabLkqGxa23s5iNfN4yJq7r" + ], + "license": "MIT" + }, + "src/bazaar/ISuperRareBazaar.sol": { + "keccak256": "0xb75cb39f8c63e813a2891b41ae6c835903c975b2646b689936c51bc6d3a74546", + "urls": [ + "bzz-raw://616f9aa0a4ae90da19f46b62041eadeef64b13a9e1870ac9791cb94f85c62805", + "dweb:/ipfs/QmeqhUs6pzfsTUoarSArUMrtmHvvMYnTD4XiFLAj6KwaWk" + ], + "license": "MIT" + }, + "src/bazaar/SuperRareBazaar.sol": { + "keccak256": "0x18a2c74610adf65f8a7556133a73ee5fbb22a321439c066f0062bb2b47700898", + "urls": [ + "bzz-raw://4b22a2e8ffb544c2cc822e0f1cf09dd162487f435a1395b6816b8ced48f7c4ff", + "dweb:/ipfs/QmNjEFq94276Ca96xmucb2pWPahLJwqcUgG3KUZZrRPtpA" + ], + "license": "MIT" + }, + "src/bazaar/SuperRareBazaarStorage.sol": { + "keccak256": "0x07b013f4ed5ca846af48f74faae20547b1f806d98093eef050d2ac6e838f3714", + "urls": [ + "bzz-raw://8a0dc91b04769e552b01efd38a796df6f20694a9e478c582b37fdd103894195a", + "dweb:/ipfs/QmUM79e82SXrAp9oHQZRmhXS3BjtUhsKZ5rQMwUcT6FTgc" + ], + "license": "MIT" + }, + "src/marketplace/IMarketplaceSettings.sol": { + "keccak256": "0xa42b0f448c52cc04ca1c3b013ecbf99b9b5d857e7ed37a8fe178669fab933083", + "urls": [ + "bzz-raw://00f697de6e1de92ccd4fd260ce9bde6fca290121f5f7e2b7d9cee8f718670ff0", + "dweb:/ipfs/Qmbt7gXsaTG8WmeFaLSCeNy3ViZgLRgeNfwHpRwL1hia13" + ], + "license": "MIT" + }, + "src/payments/IPayments.sol": { + "keccak256": "0xd5370fe954b457c13045901acfe5aa8c4dc66885f913d2729aa7c65975e7fbbd", + "urls": [ + "bzz-raw://9da9318f1b4585578ca5606c320f093bb86682594c6cd8244f9be59650efcd38", + "dweb:/ipfs/Qmaq1QFA45ZkPjqn1idCVGrUzCd5pbuUuw18N3Xk1Sewdc" + ], + "license": "MIT" + }, + "src/registry/interfaces/IApprovedTokenRegistry.sol": { + "keccak256": "0xdb86d418bedb954ea79129631d734b42749d4a0ca00635ecdf3dfeb8e81fb60a", + "urls": [ + "bzz-raw://ad677939c49f8a55f7a1c1e78b0abbe722744abc5c26b81eef5a20a578d415d2", + "dweb:/ipfs/QmZL6aHq79B8TFPrc5Zrt7iLxuqkoJikhEJtq8hgk1aKMC" + ], + "license": "MIT" + }, + "src/registry/interfaces/ICreatorRegistry.sol": { + "keccak256": "0xcaeba1e630efa2ce901d39632fa5760cfbfd8647bf8657a137f4cece2d714ed8", + "urls": [ + "bzz-raw://161e5d0d9f9b27e97cbdb4fc10134254fe329fcd549fdb07900bb553d2a1ccc1", + "dweb:/ipfs/QmNtKFgVqB28YwLJg6TWgXWHEJybrXFXEWbU5gep99HEcP" + ], + "license": "MIT" + }, + "src/registry/interfaces/IRareRoyaltyRegistry.sol": { + "keccak256": "0xd6b673182b9c6453e38fcd29bd85a788b3734f82202a77cd64d15422e98ffac9", + "urls": [ + "bzz-raw://70fd1ef8d3a5d44f2e984e969528c8a0ab25eefc92a3b19cfa63b6394bc798e3", + "dweb:/ipfs/QmTDCPVfxqAcXDzdYfHQbm1f4nYJSBeRz91oqjfE8fxk2r" + ], + "license": "MIT" + }, + "src/registry/interfaces/ISpaceOperatorRegistry.sol": { + "keccak256": "0x2b0899fa39f324d105f5b3b7fe6d0020374c5065d19aa87b74fd042f368b4ade", + "urls": [ + "bzz-raw://88aaf406edb29325f05024f8f94b0eab31de5f08c02c9cdea053da6671df1d33", + "dweb:/ipfs/QmSPXe7U4aCaLew2xJ3gmQqBWTf3QMvpxYV2XNq3e41gGT" + ], + "license": "MIT" + } + }, + "version": 1 + }, + "id": 60 +} \ No newline at end of file diff --git a/deployments/sepolia.json b/deployments/sepolia.json new file mode 100644 index 0000000..406e498 --- /dev/null +++ b/deployments/sepolia.json @@ -0,0 +1,22 @@ +{ + "approvedTokenRegistry": "0x861bB2EB55A1604F288fAa45667C7d2ccb903495", + "chainId": 11155111, + "creatorRegistry": "0xaBf7837627537cCe9a8C42DC9b87ff3C435eb109", + "deployer": "0x3B9C3C5EA16E7d3c9C0bb293a549aFa4066dc162", + "marketplaceSettingsV3": "0x11309daFfD91F822b08809F89814361Dd7E3Ccad", + "payments": "0x18cf9dcdadDaf03E1D4Bdcf6833d8a2e8cf88146", + "rareAppRegistry": "0x3ad7694F899804206076F9A8E6F06719E360A90b", + "rareMinter": "0xf689b3344090DdE8b7a2C6b942730fF05De29451", + "rareMinterImpl": "0x695be76C315108fAb8D03f88a19d8e077D8df037", + "rareRoyaltyRegistry": "0x4B2B0b2807d5bD24be254cccccfD3282a689d29A", + "rareToken": "0x197FaeF3f59eC80113e773Bb6206a17d183F97CB", + "royaltyEngineV1": "0xbb503BE3a7c457566Cc3d806F54Cd0c1fB654e23", + "sovereignNFTContractFactory": "0xeF4aac03af2684bE0BE2B07c451949CC4246085F", + "spaceOperatorRegistry": "0xeE6440256d31cD009BA1A1d32e986A33A5a1603C", + "stakingRegistryStub": "0xDfF2f86F2C7A48b73E87f7938C79e924807d43bb", + "superRareAdmin": "0x3D2f4EDdB7F8A63C68BaB6Ed46DCFD97FF12a36A", + "superRareAuctionHouse": "0xA40024deeaB7Dc6089cBa91f8c7e7EbB7932A7a9", + "superRareBazaar": "0xCE999aeF38E1316A510615b80713b494658807c6", + "superRareBazaarImpl": "0xE145336615decc8dB40CF27B102fBe84E9b32094", + "superRareMarketplace": "0xA1194D90522334E01cb5192f7c758B2EdA2773a4" +} \ No newline at end of file diff --git a/foundry.lock b/foundry.lock new file mode 100644 index 0000000..6a092a3 --- /dev/null +++ b/foundry.lock @@ -0,0 +1,53 @@ +{ + "lib/buffer": { + "rev": "c3a2e0aed8c07baee3d837f7e92532d28f249132" + }, + "lib/ds-test": { + "rev": "e282159d5170298eb2455a6c05280ab5a73a4ef0" + }, + "lib/ens-contracts": { + "rev": "f5f2ededccbb7e52be44925c0050620d71762e32" + }, + "lib/forge-std": { + "rev": "e8a047e3f40f13fa37af6fe14e6e06283d9a060e" + }, + "lib/governance-contracts": { + "rev": "30a1989d89ab6b859b23db5430d345ef84208616" + }, + "lib/libraries-solidity": { + "tag": { + "name": "v1.0.5", + "rev": "c0fc1d47493e8abf33717e082bde0dad48a74a32" + } + }, + "lib/murky": { + "branch": { + "name": "main", + "rev": "5feccd1253d7da820f7cccccdedf64471025455d" + } + }, + "lib/openzeppelin-contracts": { + "rev": "dfef6a68ee18dbd2e1f5a099061a3b8a0e404485" + }, + "lib/openzeppelin-contracts-upgradeable": { + "rev": "f6febd79e2a3a17e26969dd0d450c6ebd64bf459" + }, + "lib/royalty-guard": { + "rev": "043a8bc0cdb215502470ab04b232636c5b7b3697" + }, + "lib/royalty-registry-solidity": { + "rev": "c4ca8faf12e55e357a945bd65406dff9f32c8692" + }, + "lib/solidity-stringutils": { + "rev": "46983c6d9462a80229cf0d5bab8ea3b3ee31066c" + }, + "lib/solmate": { + "rev": "2001af43aedb46fdc2335d2a7714fb2dae7cfcd1" + }, + "lib/v3-core": { + "rev": "ab80c076b3d7122eda2731303a346aa079d16c19" + }, + "lib/v3-periphery": { + "rev": "b46983053823829c7a8dfbce39a26e0bfb48c76a" + } +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index 8eb3f95..bea34b9 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,4 +3,7 @@ auto_detect_remappings = false viaIR = true optimizer = true optimizer_runs = 100 -fs_permissions = [{ access = "read", path = "./"}] \ No newline at end of file +fs_permissions = [ + { access = "read", path = "./" }, + { access = "read-write", path = "./deployments" } +] \ No newline at end of file diff --git a/lib/libraries-solidity b/lib/libraries-solidity new file mode 160000 index 0000000..c0fc1d4 --- /dev/null +++ b/lib/libraries-solidity @@ -0,0 +1 @@ +Subproject commit c0fc1d47493e8abf33717e082bde0dad48a74a32 diff --git a/remappings.txt b/remappings.txt index 51bdcc2..4b4dc94 100644 --- a/remappings.txt +++ b/remappings.txt @@ -19,4 +19,6 @@ ensdomains/ens-contracts/=lib/ensdomains/ens-contracts/contracts/ arachnid/solidity-stringutils/=lib/solidity-stringutils/ @uniswap/v3-core/contracts=lib/v3-core/contracts/ @uniswap/v3-core/=lib/v3-core/contracts/ -@uniswap/v3-periphery/=lib/v3-periphery/contracts/ \ No newline at end of file +@uniswap/v3-periphery/=lib/v3-periphery/contracts/ +@manifoldxyz/libraries-solidity/=lib/libraries-solidity/ +openzeppelin/=lib/openzeppelin-contracts/contracts/ \ No newline at end of file diff --git a/script/DeploySepolia.s.sol b/script/DeploySepolia.s.sol new file mode 100644 index 0000000..7a59f94 --- /dev/null +++ b/script/DeploySepolia.s.sol @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Script.sol"; +import {ERC1967Proxy} from "openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +import "../src/utils/SuperRareAdmin.sol"; +import "../src/marketplace/MarketplaceSettingsV1.sol"; +import "../src/marketplace/MarketplaceSettingsV2.sol"; +import "../src/marketplace/MarketplaceSettingsV3.sol"; +import "../src/registry/RareAppRegistry.sol"; +import "../src/registry/CreatorRegistry.sol"; +import "../src/registry/RoyaltyRegistry.sol"; +import "../src/registry/SpaceOperatorRegistry.sol"; +import "../src/registry/ApprovedTokenRegistry.sol"; +import "../src/payments/Payments.sol"; +import "../src/token/ERC721/superrare/SuperRareV2.sol"; +import "../src/token/ERC721/sovereign/SovereignNFTContractFactory.sol"; +import "../src/collection/RareMinter.sol"; +import "../src/marketplace/SuperRareMarketplace.sol"; +import "../src/auctionhouse/SuperRareAuctionHouse.sol"; +import "../src/bazaar/SuperRareBazaar.sol"; +import "../src/staking/registry/StakingRegistryStub.sol"; + +import {FallbackRegistry} from "royalty-registry/FallbackRegistry.sol"; +import {ManifoldRoyaltyRegistryStub} from "../src/registry/ManifoldRoyaltyRegistryStub.sol"; +import {RoyaltyEngineV1} from "royalty-registry/RoyaltyEngineV1.sol"; + +/// @title DeploySepolia +/// @notice Deployment script for the full Rare Protocol stack on Sepolia testnet. +contract DeploySepolia is Script { + function run() external { + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + address deployer = vm.addr(deployerPrivateKey); + address rareToken = vm.envAddress("RARE_ADDRESS"); + + vm.startBroadcast(deployerPrivateKey); + + // 1. SuperRareV2 (for SuperRareAdmin) + SuperRareV2 superRareV2 = new SuperRareV2("SuperRareV2", "SUPR"); + + // 2. SuperRareAdmin + SuperRareAdmin admin = new SuperRareAdmin(address(superRareV2)); + + // 3. MarketplaceSettings V1 -> V2 -> V3 + MarketplaceSettingsV1 settingsV1 = new MarketplaceSettingsV1(); + MarketplaceSettingsV2 settingsV2 = new MarketplaceSettingsV2(deployer, address(settingsV1)); + MarketplaceSettingsV3 settingsV3 = new MarketplaceSettingsV3(deployer, address(settingsV2)); + + // 4. RareAppRegistry + RareAppRegistry appRegistry = new RareAppRegistry(deployer); + + // 5. SovereignNFTContractFactory (deploy first for CreatorRegistry) + SovereignNFTContractFactory sovFactory = new SovereignNFTContractFactory(); + + // 6. CreatorRegistry, Rare RoyaltyRegistry + address[] memory creatorImplementations = new address[](1); + creatorImplementations[0] = sovFactory.sovereignNFT(); + CreatorRegistry creatorRegistry = new CreatorRegistry(creatorImplementations); + RoyaltyRegistry rareRoyaltyRegistry = new RoyaltyRegistry(address(creatorRegistry)); + + // 7. Royalty stack (Manifold) + FallbackRegistry fallbackRegistry = new FallbackRegistry(deployer); + ManifoldRoyaltyRegistryStub manifoldRoyaltyRegistry = new ManifoldRoyaltyRegistryStub(); + RoyaltyEngineV1 royaltyEngine = new RoyaltyEngineV1(address(fallbackRegistry)); + royaltyEngine.initialize(deployer, address(manifoldRoyaltyRegistry)); + + // 8. StakingRegistryStub + StakingRegistryStub stakingStub = new StakingRegistryStub(); + + // 9. Payments, ApprovedTokenRegistry, SpaceOperatorRegistry + Payments payments = new Payments(); + ApprovedTokenRegistry approvedTokenRegistry = new ApprovedTokenRegistry(); + SpaceOperatorRegistry spaceOperatorRegistry = new SpaceOperatorRegistry(); + spaceOperatorRegistry.initialize(); + + // 10. RareMinter (impl + proxy) + RareMinter rareMinterImpl = new RareMinter(); + ERC1967Proxy rareMinterProxy = new ERC1967Proxy( + address(rareMinterImpl), + abi.encodeWithSelector( + RareMinter.initialize.selector, + deployer, + address(settingsV3), + address(spaceOperatorRegistry), + address(royaltyEngine), + address(payments), + address(approvedTokenRegistry), + address(settingsV3), + address(stakingStub) + ) + ); + RareMinter rareMinter = RareMinter(payable(address(rareMinterProxy))); + + // 11. SuperRareMarketplace, SuperRareAuctionHouse, SuperRareBazaar + SuperRareMarketplace bazaarMarketplace = new SuperRareMarketplace(); + SuperRareAuctionHouse bazaarAuctionHouse = new SuperRareAuctionHouse(); + SuperRareBazaar bazaarImpl = new SuperRareBazaar(); + + ERC1967Proxy bazaarProxy = new ERC1967Proxy( + address(bazaarImpl), + abi.encodeWithSelector( + SuperRareBazaar.initialize.selector, + address(settingsV3), + address(rareRoyaltyRegistry), + address(royaltyEngine), + address(bazaarMarketplace), + address(bazaarAuctionHouse), + address(spaceOperatorRegistry), + address(approvedTokenRegistry), + address(payments), + address(stakingStub), + deployer + ) + ); + SuperRareBazaar bazaar = SuperRareBazaar(payable(address(bazaarProxy))); + + // 12. Wire: setAppRegistry, grantMarketplaceAccess, addApprovedToken(RARE) + bazaar.setAppRegistry(address(appRegistry)); + settingsV3.grantMarketplaceAccess(address(bazaar)); + approvedTokenRegistry.addApprovedToken(rareToken); + + vm.stopBroadcast(); + + // 13. Write deployment addresses to JSON + string memory root = "sepolia"; + string memory json = vm.serializeUint(root, "chainId", 11155111); + json = vm.serializeAddress(root, "rareToken", rareToken); + json = vm.serializeAddress(root, "superRareAdmin", address(admin)); + json = vm.serializeAddress(root, "marketplaceSettingsV3", address(settingsV3)); + json = vm.serializeAddress(root, "rareAppRegistry", address(appRegistry)); + json = vm.serializeAddress(root, "creatorRegistry", address(creatorRegistry)); + json = vm.serializeAddress(root, "rareRoyaltyRegistry", address(rareRoyaltyRegistry)); + json = vm.serializeAddress(root, "royaltyEngineV1", address(royaltyEngine)); + json = vm.serializeAddress(root, "stakingRegistryStub", address(stakingStub)); + json = vm.serializeAddress(root, "sovereignNFTContractFactory", address(sovFactory)); + json = vm.serializeAddress(root, "rareMinter", address(rareMinterProxy)); + json = vm.serializeAddress(root, "rareMinterImpl", address(rareMinterImpl)); + json = vm.serializeAddress(root, "payments", address(payments)); + json = vm.serializeAddress(root, "approvedTokenRegistry", address(approvedTokenRegistry)); + json = vm.serializeAddress(root, "spaceOperatorRegistry", address(spaceOperatorRegistry)); + json = vm.serializeAddress(root, "superRareMarketplace", address(bazaarMarketplace)); + json = vm.serializeAddress(root, "superRareAuctionHouse", address(bazaarAuctionHouse)); + json = vm.serializeAddress(root, "superRareBazaar", address(bazaarProxy)); + json = vm.serializeAddress(root, "superRareBazaarImpl", address(bazaarImpl)); + json = vm.serializeAddress(root, "deployer", deployer); + vm.writeJson(json, "deployments/sepolia.json"); + + // Log all addresses + console.log("=== Deployed Addresses ==="); + console.log("RARE Token:", rareToken); + console.log("SuperRareAdmin:", address(admin)); + console.log("MarketplaceSettingsV3:", address(settingsV3)); + console.log("RareAppRegistry:", address(appRegistry)); + console.log("CreatorRegistry:", address(creatorRegistry)); + console.log("Rare RoyaltyRegistry:", address(rareRoyaltyRegistry)); + console.log("RoyaltyEngineV1:", address(royaltyEngine)); + console.log("StakingRegistryStub:", address(stakingStub)); + console.log("SovereignNFTContractFactory:", address(sovFactory)); + console.log("RareMinter:", address(rareMinterProxy)); + console.log("RareMinter impl:", address(rareMinterImpl)); + console.log("Payments:", address(payments)); + console.log("ApprovedTokenRegistry:", address(approvedTokenRegistry)); + console.log("SpaceOperatorRegistry:", address(spaceOperatorRegistry)); + console.log("SuperRareMarketplace:", address(bazaarMarketplace)); + console.log("SuperRareAuctionHouse:", address(bazaarAuctionHouse)); + console.log("SuperRareBazaar:", address(bazaarProxy)); + console.log("SuperRareBazaar impl:", address(bazaarImpl)); + console.log("Deployer:", deployer); + console.log(""); + console.log("Addresses written to deployments/sepolia.json"); + } +} diff --git a/script/sepolia/deploy.sh b/script/sepolia/deploy.sh new file mode 100755 index 0000000..665a17a --- /dev/null +++ b/script/sepolia/deploy.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +# Sepolia Deployment Script - Rare Protocol +# Usage: ./script/sepolia/deploy.sh [--broadcast] [--verify] + +BROADCAST=false +VERIFY=false + +while [[ $# -gt 0 ]]; do + case $1 in + --broadcast) + BROADCAST=true + shift + ;; + --verify) + VERIFY=true + shift + ;; + *) + echo "Unknown parameter: $1" + echo "Usage: $0 [--broadcast] [--verify]" + exit 1 + ;; + esac +done + +# Load .env from project root +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +ENV_FILE="$PROJECT_ROOT/.env" + +if [ -f "$ENV_FILE" ]; then + echo "Loading environment from .env" + set -o allexport + source "$ENV_FILE" + set +o allexport +fi + +if [ -z "$RPC_URL" ]; then + echo "RPC_URL not set. Using default Sepolia RPC." + export RPC_URL="https://rpc.sepolia.org" +fi + +if [ -z "$RARE_ADDRESS" ]; then + echo "ERROR: RARE_ADDRESS must be set in .env" + exit 1 +fi + +if [ -z "$PRIVATE_KEY" ]; then + echo "ERROR: PRIVATE_KEY must be set in .env" + exit 1 +fi + +# Create deployments directory for JSON output +mkdir -p "$PROJECT_ROOT/deployments" + +cd "$PROJECT_ROOT" + +FORGE_CMD="forge script script/DeploySepolia.s.sol:DeploySepolia --rpc-url ${RPC_URL} -vvv" + +if [ "$BROADCAST" = true ]; then + echo "Broadcasting transactions to Sepolia..." + FORGE_CMD="${FORGE_CMD} --broadcast --chain-id ${CHAIN_ID:-11155111}" + if [ "$VERIFY" = true ] && [ -n "$ETHERSCAN_API_KEY" ]; then + FORGE_CMD="${FORGE_CMD} --verify --etherscan-api-key ${ETHERSCAN_API_KEY}" + fi +else + echo "Running in simulation mode (no broadcasting)..." +fi + +eval "${FORGE_CMD}" diff --git a/script/sepolia/env.sample b/script/sepolia/env.sample new file mode 100644 index 0000000..6b3a3c6 --- /dev/null +++ b/script/sepolia/env.sample @@ -0,0 +1,22 @@ +# Sepolia Deployment - Rare Protocol +# Copy this file to .env in the project root and update the values. +# Never commit .env to version control. + +# Network Configuration +# ------------------- +RPC_URL=https://eth-sepolia.g.alchemy.com/v2/YOUR-API-KEY +CHAIN_ID=11155111 + +# Deployment Account +# ------------------ +# Private key (with or without 0x prefix; forge accepts both) +PRIVATE_KEY=your_private_key_here + +# Contract Dependencies +# -------------------- +# Sepolia $RARE token (existing) +RARE_ADDRESS=0x197FaeF3f59eC80113e773Bb6206a17d183F97CB + +# Verification (optional - for --verify flag) +# ------------------------------------------ +ETHERSCAN_API_KEY=your_etherscan_api_key diff --git a/src/auctionhouse/ISuperRareAuctionHouse.sol b/src/auctionhouse/ISuperRareAuctionHouse.sol index 5c4c514..105b89f 100644 --- a/src/auctionhouse/ISuperRareAuctionHouse.sol +++ b/src/auctionhouse/ISuperRareAuctionHouse.sol @@ -14,6 +14,7 @@ interface ISuperRareAuctionHouse { /// @param _lengthOfAuction The amount of time in seconds that the auction is configured for. /// @param _splitAddresses Addresses to split the sellers commission with. /// @param _splitRatios The ratio for the split corresponding to each of the addresses being split with. + /// @param _app App facilitating the auction; address(0) = no app fee on settlement function configureAuction( bytes32 _auctionType, address _originContract, @@ -23,7 +24,8 @@ interface ISuperRareAuctionHouse { uint256 _lengthOfAuction, uint256 _startTime, address payable[] calldata _splitAddresses, - uint16[] calldata _splitRatios + uint16[] calldata _splitRatios, + address _app ) external; /// @notice Converts an offer into a coldie auction. diff --git a/src/auctionhouse/SuperRareAuctionHouse.sol b/src/auctionhouse/SuperRareAuctionHouse.sol index 797c123..6c2e6fc 100644 --- a/src/auctionhouse/SuperRareAuctionHouse.sol +++ b/src/auctionhouse/SuperRareAuctionHouse.sol @@ -8,6 +8,7 @@ import {IERC20} from "openzeppelin-contracts/token/ERC20/IERC20.sol"; import {IERC721} from "openzeppelin-contracts/token/ERC721/IERC721.sol"; import {SuperRareBazaarBase} from "../bazaar/SuperRareBazaarBase.sol"; import {ISuperRareAuctionHouse} from "./ISuperRareAuctionHouse.sol"; +import {IRareAppRegistry} from "../registry/IRareAppRegistry.sol"; /// @author koloz /// @title SuperRareAuctionHouse @@ -32,6 +33,7 @@ contract SuperRareAuctionHouse is /// @param _lengthOfAuction The amount of time in seconds that the auction is configured for. /// @param _splitAddresses Addresses to split the sellers commission with. /// @param _splitRatios The ratio for the split corresponding to each of the addresses being split with. + /// @param _app App facilitating the auction; address(0) = no app fee on settlement function configureAuction( bytes32 _auctionType, address _originContract, @@ -41,7 +43,8 @@ contract SuperRareAuctionHouse is uint256 _lengthOfAuction, uint256 _startTime, address payable[] calldata _splitAddresses, - uint16[] calldata _splitRatios + uint16[] calldata _splitRatios, + address _app ) external override { _checkIfCurrencyIsApproved(_currencyAddress); _senderMustBeTokenOwner(_originContract, _tokenId); @@ -86,7 +89,8 @@ contract SuperRareAuctionHouse is _startingAmount, _auctionType, _splitAddresses, - _splitRatios + _splitRatios, + _app ); if (_auctionType == SCHEDULED_AUCTION) { @@ -161,7 +165,8 @@ contract SuperRareAuctionHouse is currOffer.amount, COLDIE_AUCTION, _splitAddresses, - _splitRatios + _splitRatios, + address(0) // deprecated path, no app ); delete tokenCurrentOffers[_originContract][_tokenId][_currencyAddress]; @@ -170,7 +175,7 @@ contract SuperRareAuctionHouse is currOffer.buyer, _currencyAddress, _amount, - marketplaceSettings.getMarketplaceFeePercentage() + 0 // marketplaceFee deprecated ); IERC721 erc721 = IERC721(_originContract); @@ -233,7 +238,7 @@ contract SuperRareAuctionHouse is address _currencyAddress, uint256 _amount ) external payable override nonReentrant { - uint256 requiredAmount = _amount + marketplaceSettings.calculateMarketplaceFee(_amount); + uint256 requiredAmount = _amount; _senderMustHaveMarketplaceApproved(_currencyAddress, requiredAmount); @@ -282,7 +287,7 @@ contract SuperRareAuctionHouse is payable(msg.sender), _currencyAddress, _amount, - marketplaceSettings.getMarketplaceFeePercentage() + 0 // marketplaceFee deprecated ); bool startedAuction = false; @@ -349,13 +354,26 @@ contract SuperRareAuctionHouse is currBid.amount, auction.auctionCreator, auction.splitRecipients, - auction.splitRatios + auction.splitRatios, + auction.app ); marketplaceSettings.markERC721Token(_originContract, _tokenId, true); require(erc721.ownerOf(_tokenId) == currBid.bidder , "settleAuction::Failed to transfer to auction winner"); } + uint256 appFee; + uint256 protocolFee; + if (appRegistry != address(0) && auction.app != address(0)) { + (, uint256[] memory royalties) = + royaltyEngine.getRoyalty(_originContract, _tokenId, currBid.amount); + uint256 totalRoyalties; + for (uint256 i = 0; i < royalties.length; i++) { + totalRoyalties += royalties[i]; + } + uint256 amountAfterRoyalty = currBid.amount - totalRoyalties; + (appFee, protocolFee,) = IRareAppRegistry(appRegistry).calculateFeeSplit(auction.app, amountAfterRoyalty); + } emit AuctionSettled( _originContract, @@ -363,7 +381,10 @@ contract SuperRareAuctionHouse is auction.auctionCreator, _tokenId, auction.currencyAddress, - currBid.amount + currBid.amount, + auction.app, + appFee, + protocolFee ); } diff --git a/src/bazaar/ISuperRareBazaar.sol b/src/bazaar/ISuperRareBazaar.sol index a5c3171..aa5ef4c 100644 --- a/src/bazaar/ISuperRareBazaar.sol +++ b/src/bazaar/ISuperRareBazaar.sol @@ -16,12 +16,14 @@ interface ISuperRareBazaar { /// @param _currencyAddress Address of the token being offered. /// @param _amount Amount being offered. /// @param _convertible If the offer can be converted into an auction + /// @param _app App facilitating the offer; address(0) = no app fee on acceptance function offer( address _originContract, uint256 _tokenId, address _currencyAddress, uint256 _amount, - bool _convertible + bool _convertible, + address _app ) external payable; /// @notice Purchases the token for the current sale price. @@ -47,6 +49,7 @@ interface ISuperRareBazaar { /// @param _target Address of the person this sale price is target to. /// @param _splitAddresses Addresses to split the sellers commission with. /// @param _splitRatios The ratio for the split corresponding to each of the addresses being split with. + /// @param _app App facilitating the listing; address(0) = no app fee on buy function setSalePrice( address _originContract, uint256 _tokenId, @@ -54,7 +57,8 @@ interface ISuperRareBazaar { uint256 _listPrice, address _target, address payable[] calldata _splitAddresses, - uint16[] calldata _splitRatios + uint16[] calldata _splitRatios, + address _app ) external; /// @notice Removes the current sale price of an asset for the given currency. @@ -107,6 +111,7 @@ interface ISuperRareBazaar { /// @param _lengthOfAuction The amount of time in seconds that the auction is configured for. /// @param _splitAddresses Addresses to split the sellers commission with. /// @param _splitRatios The ratio for the split corresponding to each of the addresses being split with. + /// @param _app App facilitating the auction; address(0) = no app fee on settlement function configureAuction( bytes32 _auctionType, address _originContract, @@ -116,7 +121,8 @@ interface ISuperRareBazaar { uint256 _lengthOfAuction, uint256 _startTime, address payable[] calldata _splitAddresses, - uint16[] calldata _splitRatios + uint16[] calldata _splitRatios, + address _app ) external; /// @notice Cancels a configured Auction that has not started. diff --git a/src/bazaar/SuperRareBazaar.sol b/src/bazaar/SuperRareBazaar.sol index 77afbd8..ec9fc68 100644 --- a/src/bazaar/SuperRareBazaar.sol +++ b/src/bazaar/SuperRareBazaar.sol @@ -132,6 +132,10 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar offerCancelationDelay = _offerCancelationDelay; } + function setAppRegistry(address _appRegistry) external onlyOwner { + appRegistry = _appRegistry; + } + ///////////////////////////////////////////////////////////////////////// // Marketplace Functions ///////////////////////////////////////////////////////////////////////// @@ -146,15 +150,25 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar /// @param _currencyAddress Address of the token being offered. /// @param _amount Amount being offered. /// @param _convertible If the offer can be converted into an auction + /// @param _app App facilitating the offer; address(0) = no app fee on acceptance function offer( address _originContract, uint256 _tokenId, address _currencyAddress, uint256 _amount, - bool _convertible + bool _convertible, + address _app ) external payable override { (bool success, bytes memory data) = superRareMarketplace.delegatecall( - abi.encodeWithSelector(this.offer.selector, _originContract, _tokenId, _currencyAddress, _amount, _convertible) + abi.encodeWithSelector( + this.offer.selector, + _originContract, + _tokenId, + _currencyAddress, + _amount, + _convertible, + _app + ) ); require(success, string(data)); @@ -210,6 +224,7 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar /// @param _target Address of the person this sale price is target to. /// @param _splitAddresses Addresses to split the sellers commission with. /// @param _splitRatios The ratio for the split corresponding to each of the addresses being split with. + /// @param _app App facilitating the listing; address(0) = no app fee on buy function setSalePrice( address _originContract, uint256 _tokenId, @@ -217,7 +232,8 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar uint256 _listPrice, address _target, address payable[] calldata _splitAddresses, - uint16[] calldata _splitRatios + uint16[] calldata _splitRatios, + address _app ) external override { (bool success, bytes memory data) = superRareMarketplace.delegatecall( abi.encodeWithSelector( @@ -228,7 +244,8 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar _listPrice, _target, _splitAddresses, - _splitRatios + _splitRatios, + _app ) ); @@ -305,6 +322,7 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar /// @param _lengthOfAuction The amount of time in seconds that the auction is configured for. /// @param _splitAddresses Addresses to split the sellers commission with. /// @param _splitRatios The ratio for the split corresponding to each of the addresses being split with. + /// @param _app App facilitating the auction; address(0) = no app fee on settlement function configureAuction( bytes32 _auctionType, address _originContract, @@ -314,7 +332,8 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar uint256 _lengthOfAuction, uint256 _startTime, address payable[] calldata _splitAddresses, - uint16[] calldata _splitRatios + uint16[] calldata _splitRatios, + address _app ) external override { (bool success, bytes memory data) = superRareAuctionHouse.delegatecall( abi.encodeWithSelector( @@ -327,7 +346,8 @@ contract SuperRareBazaar is ISuperRareBazaar, OwnableUpgradeable, ReentrancyGuar _lengthOfAuction, _startTime, _splitAddresses, - _splitRatios + _splitRatios, + _app ) ); diff --git a/src/bazaar/SuperRareBazaarBase.sol b/src/bazaar/SuperRareBazaarBase.sol index 97b1991..2f0fd6d 100644 --- a/src/bazaar/SuperRareBazaarBase.sol +++ b/src/bazaar/SuperRareBazaarBase.sol @@ -6,8 +6,7 @@ import {IERC20} from "openzeppelin-contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "openzeppelin-contracts/token/ERC20/utils/SafeERC20.sol"; import {IPayments} from "rareprotocol/aux/payments/IPayments.sol"; import {SuperRareBazaarStorage} from "./SuperRareBazaarStorage.sol"; -import {IStakingSettings} from "rareprotocol/aux/marketplace/IStakingSettings.sol"; -import {IRareStakingRegistry} from "../staking/registry/IRareStakingRegistry.sol"; +import {IRareAppRegistry} from "../registry/IRareAppRegistry.sol"; /// @author koloz /// @title SuperRareBazaarBase @@ -136,10 +135,9 @@ abstract contract SuperRareBazaarBase is SuperRareBazaarStorage { } /// @notice Sends a payout to all the necessary parties. - /// @dev Note that _splitAddrs and _splitRatios are not checked for validity. Make sure supplied values are correct by using _checkSplits. - /// @dev Sends payments to the network, royalty if applicable, and splits for the rest. - /// @dev Forwards payments to the payment contract if payout is happening in eth. - /// @dev Total amount of ratios should be 100 and is relative to the total ratio left. + /// @dev Note that _splitAddrs and _splitRatios are not checked for validity. Make sure supplied values are correct by using _checkSplits. + /// @dev Flow: 1) Royalty, 2) App fee (if _app and appRegistry set), 3) Seller splits. + /// @dev Protocol share of app fee goes to networkBeneficiary. /// @param _originContract Contract address of asset triggering a payout. /// @param _tokenId Token Id of the asset. /// @param _currencyAddress Address of currency being paid out. @@ -147,6 +145,7 @@ abstract contract SuperRareBazaarBase is SuperRareBazaarStorage { /// @param _seller Address of the person selling the asset. /// @param _splitAddrs Addresses that funds need to be split against. /// @param _splitRatios Ratios for split pertaining to each address (basis points). + /// @param _app App that facilitated the trade; address(0) = no app fee. function _payout( address _originContract, uint256 _tokenId, @@ -154,81 +153,61 @@ abstract contract SuperRareBazaarBase is SuperRareBazaarStorage { uint256 _amount, address _seller, address payable[] memory _splitAddrs, - uint16[] memory _splitRatios + uint16[] memory _splitRatios, + address _app ) internal { require(_splitAddrs.length == _splitRatios.length, "Number of split addresses and ratios must be equal."); - /* - The overall flow for payouts is: - 1. Payout marketplace fee - 2. Primary/Secondary Payouts - a. Primary -> If space sale, query space operator registry for platform comission and payout - Else query marketplace setting for primary sale comission and payout - b. Secondary -> Query global royalty registry for recipients and amounts and payout - 3. Calculate the amount for each _splitAddr based on remaining amount and payout - */ - - // Recipients of marketplace fee uint256 remainingAmount = _amount; - // Marketplace fee - - // Amounts for recipients of marketplace fee - uint256 marketplaceFee = marketplaceSettings.calculateMarketplaceFee(_amount); - - address payable[] memory mktFeeRecip = new address payable[](2); - mktFeeRecip[0] = payable(networkBeneficiary); - mktFeeRecip[1] = payable(IRareStakingRegistry(stakingRegistry).getRewardAccumulatorAddressForUser(_seller)); - mktFeeRecip[1] = mktFeeRecip[1] == address(0) ? payable(networkBeneficiary) : mktFeeRecip[1]; - uint256[] memory mktFee = new uint256[](2); - mktFee[0] = IStakingSettings(address(marketplaceSettings)).calculateMarketplacePayoutFee(_amount); - mktFee[1] = IStakingSettings(address(marketplaceSettings)).calculateStakingFee(_amount); - - _performPayouts(_currencyAddress, marketplaceFee, mktFeeRecip, mktFee); - - if (!marketplaceSettings.hasERC721TokenSold(_originContract, _tokenId)) { - uint256[] memory platformFee = new uint256[](1); - address payable[] memory platformRecip = new address payable[](1); - platformRecip[0] = mktFeeRecip[0]; - - if (spaceOperatorRegistry.isApprovedSpaceOperator(_seller)) { - uint256 platformCommission = spaceOperatorRegistry.getPlatformCommission(_seller); - - remainingAmount = remainingAmount - ((_amount * platformCommission) / 10000); - - platformFee[0] = (_amount * platformCommission) / 10000; - - _performPayouts(_currencyAddress, platformFee[0], platformRecip, platformFee); - } else { - uint256 platformCommission = marketplaceSettings.getERC721ContractPrimarySaleFeePercentage(_originContract); - - remainingAmount = remainingAmount - ((_amount * platformCommission) / 10000); - - platformFee[0] = (_amount * platformCommission) / 10000; - - _performPayouts(_currencyAddress, platformFee[0], platformRecip, platformFee); - } - } else { - (address payable[] memory receivers, uint256[] memory royalties) = royaltyEngine.getRoyalty( - _originContract, - _tokenId, - _amount - ); + // 1. Royalty first + (address payable[] memory receivers, uint256[] memory royalties) = royaltyEngine.getRoyalty( + _originContract, + _tokenId, + _amount + ); - uint256 totalRoyalties = 0; + uint256 totalRoyalties = 0; + for (uint256 i = 0; i < royalties.length; i++) { + totalRoyalties += royalties[i]; + } + remainingAmount -= totalRoyalties; + if (totalRoyalties > 0) { + _performPayouts(_currencyAddress, totalRoyalties, receivers, royalties); + } - for (uint256 i = 0; i < royalties.length; i++) { - totalRoyalties += royalties[i]; + // 2. App fee (if any) — registry calculates amounts; Bazaar routes protocol share to networkBeneficiary + address effectiveApp = (appRegistry != address(0)) ? _app : address(0); + if (effectiveApp != address(0)) { + (uint256 appShare, uint256 protocolShare, uint256 totalFee) = + IRareAppRegistry(appRegistry).calculateFeeSplit(effectiveApp, remainingAmount); + + if (totalFee > 0) { + remainingAmount -= totalFee; + + (, , address appFeeRecipient) = IRareAppRegistry(appRegistry).apps(effectiveApp); + + if (appShare > 0) { + address payable[] memory appRecip = new address payable[](1); + uint256[] memory appAmts = new uint256[](1); + appRecip[0] = payable(appFeeRecipient); + appAmts[0] = appShare; + _performPayouts(_currencyAddress, appShare, appRecip, appAmts); + } + + if (protocolShare > 0) { + address payable[] memory protocolRecip = new address payable[](1); + uint256[] memory protocolAmts = new uint256[](1); + protocolRecip[0] = payable(networkBeneficiary); + protocolAmts[0] = protocolShare; + _performPayouts(_currencyAddress, protocolShare, protocolRecip, protocolAmts); + } } - - remainingAmount -= totalRoyalties; - _performPayouts(_currencyAddress, totalRoyalties, receivers, royalties); } + // 3. Seller splits uint256[] memory remainingAmts = new uint256[](_splitAddrs.length); - uint256 totalSplit = 0; - for (uint256 i = 0; i < _splitAddrs.length; i++) { remainingAmts[i] = (remainingAmount * _splitRatios[i]) / 10000; totalSplit += (remainingAmount * _splitRatios[i]) / 10000; diff --git a/src/bazaar/SuperRareBazaarStorage.sol b/src/bazaar/SuperRareBazaarStorage.sol index cb67bc9..17f3f9f 100644 --- a/src/bazaar/SuperRareBazaarStorage.sol +++ b/src/bazaar/SuperRareBazaarStorage.sol @@ -37,6 +37,7 @@ contract SuperRareBazaarStorage { uint256 timestamp; uint16 marketplaceFee; bool convertible; + address app; // app the buyer used when placing offer; address(0) = no app fee } // The Sale Price struct for a given token: @@ -50,6 +51,7 @@ contract SuperRareBazaarStorage { uint256 amount; address payable[] splitRecipients; uint16[] splitRatios; + address app; // app that facilitated the listing; address(0) = no app fee } // Structure of an Auction: @@ -71,6 +73,7 @@ contract SuperRareBazaarStorage { bytes32 auctionType; address payable[] splitRecipients; uint16[] splitRatios; + address app; // app that facilitated the auction; address(0) = no app fee on settlement } struct Bid { @@ -89,7 +92,10 @@ contract SuperRareBazaarStorage { address indexed _seller, address _currencyAddress, uint256 _amount, - uint256 _tokenId + uint256 _tokenId, + address _app, + uint256 _appFee, + uint256 _protocolFee ); event SetSalePrice( @@ -119,7 +125,10 @@ contract SuperRareBazaarStorage { uint256 _amount, uint256 _tokenId, address payable[] _splitAddresses, - uint16[] _splitRatios + uint16[] _splitRatios, + address _app, + uint256 _appFee, + uint256 _protocolFee ); event CancelOffer( @@ -159,7 +168,10 @@ contract SuperRareBazaarStorage { address _seller, uint256 indexed _tokenId, address _currencyAddress, - uint256 _amount + uint256 _amount, + address _app, + uint256 _appFee, + uint256 _protocolFee ); ///////////////////////////////////////////////////////////////////////// @@ -220,6 +232,9 @@ contract SuperRareBazaarStorage { // Mapping from contract to mapping of tokenId to Bid. mapping(address => mapping(uint256 => Bid)) public auctionBids; - uint256[50] private __gap; + // Reference to the app registry + address public appRegistry; + + uint256[49] private __gap; /// ALL NEW STORAGE MUST COME AFTER THIS } \ No newline at end of file diff --git a/src/marketplace/ISuperRareMarketplace.sol b/src/marketplace/ISuperRareMarketplace.sol index 07b7a1c..458d3ee 100644 --- a/src/marketplace/ISuperRareMarketplace.sol +++ b/src/marketplace/ISuperRareMarketplace.sol @@ -11,12 +11,14 @@ interface ISuperRareMarketplace { /// @param _currencyAddress Address of the token being offered. /// @param _amount Amount being offered (excluding marketplace fee). /// @param _convertible If the offer can be converted into an auction + /// @param _app App facilitating the offer; address(0) = no app fee on acceptance function offer( address _originContract, uint256 _tokenId, address _currencyAddress, uint256 _amount, - bool _convertible + bool _convertible, + address _app ) external payable; /// @notice Purchases the token for the current sale price. @@ -49,6 +51,7 @@ interface ISuperRareMarketplace { /// @param _target Address of the person this sale price is target to. /// @param _splitAddresses Addresses to split the sellers commission with. /// @param _splitRatios The ratio for the split corresponding to each of the addresses being split with. + /// @param _app App facilitating the listing; address(0) = no app fee on buy function setSalePrice( address _originContract, uint256 _tokenId, @@ -56,7 +59,8 @@ interface ISuperRareMarketplace { uint256 _listPrice, address _target, address payable[] calldata _splitAddresses, - uint16[] calldata _splitRatios + uint16[] calldata _splitRatios, + address _app ) external; /// @notice Removes the current sale price of an asset for _target for the given currency. diff --git a/src/marketplace/MarketplaceSettingsV3.sol b/src/marketplace/MarketplaceSettingsV3.sol index 8455186..b7dad0d 100644 --- a/src/marketplace/MarketplaceSettingsV3.sol +++ b/src/marketplace/MarketplaceSettingsV3.sol @@ -88,13 +88,14 @@ contract MarketplaceSettingsV3 is minValue = _minValue; } + /// @dev Deprecated: RareAppRegistry handles fees. Returns 0 for interface compatibility. function getMarketplaceFeePercentage() external view override returns (uint16) { - return marketplaceFeePercentage; + return 0; } function setMarketplaceFeePercentage(uint16 _percentage) external onlyOwner { @@ -105,13 +106,14 @@ contract MarketplaceSettingsV3 is marketplaceFeePercentage = _percentage; } - function calculateMarketplaceFee(uint256 _amount) + /// @dev Deprecated: RareAppRegistry handles fees. Returns 0 for interface compatibility. + function calculateMarketplaceFee(uint256) external - view + pure override returns (uint256) { - return (_amount * marketplaceFeePercentage) / 10000; + return 0; } function getERC721ContractPrimarySaleFeePercentage(address) @@ -213,22 +215,23 @@ contract MarketplaceSettingsV3 is stakingFeePercentage = _percentage; } - function calculateStakingFee(uint256 _amount) + /// @dev Deprecated: RareAppRegistry handles fees. Returns 0 for interface compatibility. + function calculateStakingFee(uint256) external - view + pure override returns (uint256) { - return (_amount * stakingFeePercentage) / 10000; + return 0; } - function calculateMarketplacePayoutFee(uint256 _amount) + /// @dev Deprecated: RareAppRegistry handles fees. Returns 0 for interface compatibility. + function calculateMarketplacePayoutFee(uint256) external - view + pure override returns (uint256) { - return - (_amount * (marketplaceFeePercentage - stakingFeePercentage)) / 10000; + return 0; } } diff --git a/src/marketplace/SuperRareMarketplace.sol b/src/marketplace/SuperRareMarketplace.sol index fb3faaa..858f02a 100644 --- a/src/marketplace/SuperRareMarketplace.sol +++ b/src/marketplace/SuperRareMarketplace.sol @@ -8,6 +8,7 @@ import {IERC20} from "openzeppelin-contracts/token/ERC20/IERC20.sol"; import {IERC721} from "openzeppelin-contracts/token/ERC721/IERC721.sol"; import {ISuperRareMarketplace} from "./ISuperRareMarketplace.sol"; import {SuperRareBazaarBase} from "../bazaar/SuperRareBazaarBase.sol"; +import {IRareAppRegistry} from "../registry/IRareAppRegistry.sol"; /// @author koloz /// @title SuperRareMarketplace @@ -30,12 +31,14 @@ contract SuperRareMarketplace is /// @param _currencyAddress Address of the token being offered. /// @param _amount Amount being offered (excluding marketplace fee). /// @param _convertible If the offer can be converted into an auction + /// @param _app App facilitating the offer; address(0) = no app fee on acceptance function offer( address _originContract, uint256 _tokenId, address _currencyAddress, uint256 _amount, - bool _convertible + bool _convertible, + address _app ) external payable override nonReentrant { _checkIfCurrencyIsApproved(_currencyAddress); require(_amount > 0, "offer::Amount cannot be 0"); @@ -47,7 +50,7 @@ contract SuperRareMarketplace is "offer::Must be greater than prev offer + min increase" ); - uint256 requiredAmount = _amount + marketplaceSettings.calculateMarketplaceFee(_amount); + uint256 requiredAmount = _amount; _senderMustHaveMarketplaceApproved(_currencyAddress, requiredAmount); @@ -60,8 +63,9 @@ contract SuperRareMarketplace is payable(msg.sender), _amount, block.timestamp, - marketplaceSettings.getMarketplaceFeePercentage(), - _convertible + 0, // marketplaceFee deprecated + _convertible, + _app ); _refund(_currencyAddress, currOffer.amount, currOffer.marketplaceFee, currOffer.buyer); @@ -76,7 +80,7 @@ contract SuperRareMarketplace is /// @param _originContract Contract address for asset being bought. /// @param _tokenId TokenId of asset being bought. /// @param _currencyAddress Currency address of asset being used to buy. - /// @param _amount Amount the piece if being bought for (excluding marketplace fee). + /// @param _amount Amount the piece if being bought for. function buy( address _originContract, uint256 _tokenId, @@ -87,7 +91,7 @@ contract SuperRareMarketplace is _ownerMustHaveMarketplaceApprovedForNFT(_originContract, _tokenId); - uint256 requiredAmount = _amount + marketplaceSettings.calculateMarketplaceFee(_amount); + uint256 requiredAmount = _amount; mapping(address => SalePrice) storage salePrices = tokenSalePrices[_originContract][_tokenId]; @@ -119,11 +123,24 @@ contract SuperRareMarketplace is erc721.transferFrom(tokenOwner, msg.sender, _tokenId); - _payout(_originContract, _tokenId, _currencyAddress, _amount, sp.seller, sp.splitRecipients, sp.splitRatios); + _payout(_originContract, _tokenId, _currencyAddress, _amount, sp.seller, sp.splitRecipients, sp.splitRatios, sp.app); + + uint256 appFee; + uint256 protocolFee; + if (appRegistry != address(0) && sp.app != address(0)) { + (, uint256[] memory royalties) = + royaltyEngine.getRoyalty(_originContract, _tokenId, _amount); + uint256 totalRoyalties; + for (uint256 i = 0; i < royalties.length; i++) { + totalRoyalties += royalties[i]; + } + uint256 amountAfterRoyalty = _amount - totalRoyalties; + (appFee, protocolFee,) = IRareAppRegistry(appRegistry).calculateFeeSplit(sp.app, amountAfterRoyalty); + } marketplaceSettings.markERC721Token(_originContract, _tokenId, true); - emit Sold(_originContract, msg.sender, sp.seller, _currencyAddress, _amount, _tokenId); + emit Sold(_originContract, msg.sender, sp.seller, _currencyAddress, _amount, _tokenId, sp.app, appFee, protocolFee); } /// @notice Cancels an existing offer the sender has placed on a piece. @@ -163,6 +180,7 @@ contract SuperRareMarketplace is /// @param _target Address of the person this sale price is target to. /// @param _splitAddresses Addresses to split the sellers commission with. /// @param _splitRatios The ratio for the split corresponding to each of the addresses being split with. + /// @param _app App facilitating the listing; address(0) = no app fee on buy function setSalePrice( address _originContract, uint256 _tokenId, @@ -170,7 +188,8 @@ contract SuperRareMarketplace is uint256 _listPrice, address _target, address payable[] calldata _splitAddresses, - uint16[] calldata _splitRatios + uint16[] calldata _splitRatios, + address _app ) external override { _checkIfCurrencyIsApproved(_currencyAddress); _senderMustBeTokenOwner(_originContract, _tokenId); @@ -182,7 +201,8 @@ contract SuperRareMarketplace is _currencyAddress, _listPrice, _splitAddresses, - _splitRatios + _splitRatios, + _app ); emit SetSalePrice(_originContract, _currencyAddress, _target, _listPrice, _tokenId, _splitAddresses, _splitRatios); @@ -244,7 +264,20 @@ contract SuperRareMarketplace is IERC721 erc721 = IERC721(_originContract); erc721.transferFrom(msg.sender, currOffer.buyer, _tokenId); - _payout(_originContract, _tokenId, _currencyAddress, _amount, msg.sender, _splitAddresses, _splitRatios); + _payout(_originContract, _tokenId, _currencyAddress, _amount, msg.sender, _splitAddresses, _splitRatios, currOffer.app); + + uint256 appFee; + uint256 protocolFee; + if (appRegistry != address(0) && currOffer.app != address(0)) { + (, uint256[] memory royalties) = + royaltyEngine.getRoyalty(_originContract, _tokenId, _amount); + uint256 totalRoyalties; + for (uint256 i = 0; i < royalties.length; i++) { + totalRoyalties += royalties[i]; + } + uint256 amountAfterRoyalty = _amount - totalRoyalties; + (appFee, protocolFee,) = IRareAppRegistry(appRegistry).calculateFeeSplit(currOffer.app, amountAfterRoyalty); + } marketplaceSettings.markERC721Token(_originContract, _tokenId, true); @@ -256,7 +289,10 @@ contract SuperRareMarketplace is _amount, _tokenId, _splitAddresses, - _splitRatios + _splitRatios, + currOffer.app, + appFee, + protocolFee ); } } diff --git a/src/registry/IRareAppRegistry.sol b/src/registry/IRareAppRegistry.sol new file mode 100644 index 0000000..97a55b7 --- /dev/null +++ b/src/registry/IRareAppRegistry.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title IRareAppRegistry +/// @notice Interface for the RareAppRegistry contract +interface IRareAppRegistry { + struct AppInfo { + bool registered; + uint16 feeBp; + address feeRecipient; + } + + /// @notice Get app info for an address + function apps(address) external view returns (bool registered, uint16 feeBp, address feeRecipient); + + /// @notice Calculate fee split for a given sale amount and app + /// @return appShare amount going to the app's feeRecipient + /// @return protocolShare amount going to the protocol + /// @return totalFee appShare + protocolShare + function calculateFeeSplit(address _app, uint256 _amount) + external + view + returns (uint256 appShare, uint256 protocolShare, uint256 totalFee); +} diff --git a/src/registry/ManifoldRoyaltyRegistryStub.sol b/src/registry/ManifoldRoyaltyRegistryStub.sol new file mode 100644 index 0000000..b915aee --- /dev/null +++ b/src/registry/ManifoldRoyaltyRegistryStub.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IERC165} from "openzeppelin-contracts/utils/introspection/IERC165.sol"; +import {ERC165} from "openzeppelin-contracts/utils/introspection/ERC165.sol"; +import {IRoyaltyRegistry} from "royalty-registry/IRoyaltyRegistry.sol"; + +/// @notice Minimal stub implementing IRoyaltyRegistry (Manifold) for RoyaltyEngineV1. +/// @dev Returns tokenAddress for getRoyaltyLookupAddress (no overrides). Used when full Manifold RoyaltyRegistry is not needed. +contract ManifoldRoyaltyRegistryStub is ERC165, IRoyaltyRegistry { + function setRoyaltyLookupAddress(address, address) external pure override returns (bool) { + return true; + } + + function getRoyaltyLookupAddress(address tokenAddress) external pure override returns (address) { + return tokenAddress; + } + + function getOverrideLookupTokenAddress(address) external pure override returns (address) { + return address(0); + } + + function overrideAllowed(address) external pure override returns (bool) { + return false; + } + + function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { + return + interfaceId == type(IRoyaltyRegistry).interfaceId || + super.supportsInterface(interfaceId); + } +} diff --git a/src/registry/RareAppRegistry.sol b/src/registry/RareAppRegistry.sol new file mode 100644 index 0000000..4aee456 --- /dev/null +++ b/src/registry/RareAppRegistry.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Ownable} from "openzeppelin-contracts/access/Ownable.sol"; + +/// @title RareAppRegistry +/// @notice Registry for apps to register and set their own fee (in basis points). +/// @dev Protocol fee routing is handled by the Bazaar (networkBeneficiary); this contract calculates amounts only. +contract RareAppRegistry is Ownable { + struct AppInfo { + bool registered; + uint16 feeBp; // app-chosen fee in basis points (0–10000) + address feeRecipient; // where the app's share goes + } + + mapping(address => AppInfo) public apps; + + // Protocol's share of every app fee, in bp of the app fee. + // e.g., 2000 = protocol keeps 20% of the app's fee. + uint16 public protocolShareBp = 2000; + + event AppRegistered(address indexed app, uint16 feeBp, address feeRecipient); + event AppUpdated(address indexed app, uint16 feeBp, address feeRecipient); + event AppDeregistered(address indexed app); + event ProtocolShareUpdated(uint16 oldShare, uint16 newShare); + + constructor(address _owner) { + _transferOwnership(_owner); + } + + /// @notice Register the caller as an app with a fee + function registerApp(uint16 _feeBp, address _feeRecipient) external { + require(!apps[msg.sender].registered, "already registered"); + require(_feeRecipient != address(0), "zero address"); + apps[msg.sender] = AppInfo(true, _feeBp, _feeRecipient); + emit AppRegistered(msg.sender, _feeBp, _feeRecipient); + } + + /// @notice Update fee or recipient (app only) + function updateApp(uint16 _feeBp, address _feeRecipient) external { + require(apps[msg.sender].registered, "not registered"); + require(_feeRecipient != address(0), "zero address"); + apps[msg.sender].feeBp = _feeBp; + apps[msg.sender].feeRecipient = _feeRecipient; + emit AppUpdated(msg.sender, _feeBp, _feeRecipient); + } + + /// @notice Deregister (app only) + function deregisterApp() external { + require(apps[msg.sender].registered, "not registered"); + delete apps[msg.sender]; + emit AppDeregistered(msg.sender); + } + + /// @notice Calculate fee split for a given sale amount and app + /// @return appShare amount going to the app's feeRecipient + /// @return protocolShare amount going to the protocol + /// @return totalFee appShare + protocolShare + function calculateFeeSplit(address _app, uint256 _amount) + external + view + returns (uint256 appShare, uint256 protocolShare, uint256 totalFee) + { + if (_app == address(0)) return (0, 0, 0); + AppInfo memory info = apps[_app]; + if (!info.registered) return (0, 0, 0); + + totalFee = (_amount * info.feeBp) / 10000; + protocolShare = (totalFee * protocolShareBp) / 10000; + appShare = totalFee - protocolShare; + } + + /// @notice Protocol admin: update the protocol's share of app fees + function setProtocolShareBp(uint16 _shareBp) external onlyOwner { + require(_shareBp <= 10000, "exceeds max"); + emit ProtocolShareUpdated(protocolShareBp, _shareBp); + protocolShareBp = _shareBp; + } +} diff --git a/src/staking/registry/StakingRegistryStub.sol b/src/staking/registry/StakingRegistryStub.sol new file mode 100644 index 0000000..3b02c7f --- /dev/null +++ b/src/staking/registry/StakingRegistryStub.sol @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IRareStakingRegistry} from "./IRareStakingRegistry.sol"; + +/// @title StakingRegistryStub +/// @notice Minimal stub implementing IRareStakingRegistry for deployments without full staking. +/// @dev All view functions return safe defaults; write functions revert. +/// Used by Bazaar (redirects staking fees to networkBeneficiary when getRewardAccumulatorAddressForUser returns address(0)) +/// and RareMinter (works if setContractSellerStakingMinimum is never used). +contract StakingRegistryStub is IRareStakingRegistry { + function increaseAmountStaked(address, address, uint256) external pure override { + revert("StakingRegistryStub: write disabled"); + } + + function decreaseAmountStaked(address, address, uint256) external pure override { + revert("StakingRegistryStub: write disabled"); + } + + function setStakingAddresses(address, address, address) external pure override { + revert("StakingRegistryStub: write disabled"); + } + + function setDefaultPayee(address) external pure override { + revert("StakingRegistryStub: write disabled"); + } + + function setDiscountPercentage(uint256) external pure override { + revert("StakingRegistryStub: write disabled"); + } + + function setDeflationaryPercentage(uint256) external pure override { + revert("StakingRegistryStub: write disabled"); + } + + function setPeriodLength(uint256) external pure override { + revert("StakingRegistryStub: write disabled"); + } + + function setReverseRegistrar(address) external pure override { + revert("StakingRegistryStub: write disabled"); + } + + function setResolver(address) external pure override { + revert("StakingRegistryStub: write disabled"); + } + + function setSwapPool(address, address) external pure override { + revert("StakingRegistryStub: write disabled"); + } + + function transferRareFrom(address, address, uint256) external pure override { + revert("StakingRegistryStub: write disabled"); + } + + function getDefaultPayee() external pure override returns (address) { + return address(0); + } + + function getSwapPool(address) external pure override returns (address) { + return address(0); + } + + function getRareAddress() external pure override returns (address) { + return address(0); + } + + function getWethAddress() external pure override returns (address) { + return address(0); + } + + function getDiscountPercentage() external pure override returns (uint256) { + return 0; + } + + function getDeflationaryPercentage() external pure override returns (uint256) { + return 0; + } + + function getPeriodLength() external pure override returns (uint256) { + return 0; + } + + function getStakingInfoForUser(address) external pure override returns (Info memory) { + return Info("", "", address(0), address(0)); + } + + function getStakingAddressForUser(address) external pure override returns (address) { + return address(0); + } + + function getRewardAccumulatorAddressForUser(address) external pure override returns (address) { + return address(0); + } + + function getTotalAmountStakedByUser(address) external pure override returns (uint256) { + return 0; + } + + function getTotalAmountStakedOnUser(address) external pure override returns (uint256) { + return 0; + } + + function getUsersForStakingAddresses(address[] calldata) external pure override returns (address[] memory) { + return new address[](0); + } + + function STAKING_INFO_SETTER_ROLE() external pure override returns (bytes32) { + return bytes32(0); + } + + function STAKING_STAT_SETTER_ADMIN_ROLE() external pure override returns (bytes32) { + return bytes32(0); + } + + function STAKING_STAT_SETTER_ROLE() external pure override returns (bytes32) { + return bytes32(0); + } + + function STAKING_CONFIG_SETTER_ROLE() external pure override returns (bytes32) { + return bytes32(0); + } + + function ENS_SETTER_ROLE() external pure override returns (bytes32) { + return bytes32(0); + } + + function SWAP_POOL_SETTER_ROLE() external pure override returns (bytes32) { + return bytes32(0); + } +} diff --git a/src/test/bazaar/BazaarBase.t.sol b/src/test/bazaar/BazaarBase.t.sol index 8bce6bb..456129d 100644 --- a/src/test/bazaar/BazaarBase.t.sol +++ b/src/test/bazaar/BazaarBase.t.sol @@ -50,9 +50,10 @@ contract TestContract is SuperRareBazaarBase { uint256 _amount, address _seller, address payable[] memory _splitAddrs, - uint16[] memory _splitRatios + uint16[] memory _splitRatios, + address _app ) public payable { - _payout(_originContract, _tokenId, _currencyAddress, _amount, _seller, _splitAddrs, _splitRatios); + _payout(_originContract, _tokenId, _currencyAddress, _amount, _seller, _splitAddrs, _splitRatios, _app); } } @@ -165,38 +166,26 @@ contract RareBazaarBaseTest is Test { abi.encode((amount * 3) / 100) ); - // setup has hasERC721TokenSold -- false + // setup getRoyalty -- empty (new payout uses royalty engine only) vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.hasERC721TokenSold.selector, originContract, 1), - abi.encode(false) - ); - // setup has isApprovedSpaceOperator -- false - vm.mockCall( - spaceOperatorRegistry, - abi.encodeWithSelector(ISpaceOperatorRegistry.isApprovedSpaceOperator.selector, charlie), - abi.encode(false) - ); - - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(uint16(1500)) + royaltyEngine, + abi.encodeWithSelector(IRoyaltyEngineV1.getRoyalty.selector, originContract, 1, amount), + abi.encode(new address payable[](0), new uint256[](0)) ); uint256 balanceBefore = charlie.balance; vm.prank(deployer); - tc.payout{value: amount + ((amount * 3) / 100)}( + tc.payout{value: amount}( originContract, tokenId, currencyAddress, amount, charlie, splitAddrs, - splitRatios + splitRatios, + address(0) ); uint256 balanceAfter = charlie.balance; - uint256 expectedBalance = balanceBefore + ((amount * 85) / 100); + uint256 expectedBalance = balanceBefore + amount; // new payout: royalty only, no primary sale commission if (balanceAfter != expectedBalance) { emit log_named_uint("Expected: balanceAfter", expectedBalance); emit log_named_uint("Actual: balanceAfter", balanceAfter); @@ -214,66 +203,26 @@ contract RareBazaarBaseTest is Test { splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); - // setup getRewardAccumulatorAddressForUser call -- 3% + // setup getRoyalty -- empty (new payout: spaces deprecated) vm.mockCall( - stakingRegistry, - abi.encodeWithSelector(IRareStakingRegistry.getRewardAccumulatorAddressForUser.selector, charlie), - abi.encode(address(0)) - ); - - // setup calculateMarketplacePayoutFee call -- 3% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IStakingSettings.calculateMarketplacePayoutFee.selector, amount), - abi.encode((amount * 3) / 100) - ); - - // setup calculateStakingFee call -- 0% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IStakingSettings.calculateStakingFee.selector, amount), - abi.encode(0) - ); - - // setup calculateMarketplaceFee call -- 3% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.calculateMarketplaceFee.selector, amount), - abi.encode((amount * 3) / 100) - ); - - // setup hasERC721TokenSold -- false - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.hasERC721TokenSold.selector, originContract, 1), - abi.encode(false) - ); - // setup isApprovedSpaceOperator -- true - vm.mockCall( - spaceOperatorRegistry, - abi.encodeWithSelector(ISpaceOperatorRegistry.isApprovedSpaceOperator.selector, charlie), - abi.encode(true) - ); - - // setup getPlatformCommission -- 5% (500 bp) - vm.mockCall( - spaceOperatorRegistry, - abi.encodeWithSelector(ISpaceOperatorRegistry.getPlatformCommission.selector, charlie), - abi.encode(uint16(500)) + royaltyEngine, + abi.encodeWithSelector(IRoyaltyEngineV1.getRoyalty.selector, originContract, 1, amount), + abi.encode(new address payable[](0), new uint256[](0)) ); uint256 balanceBefore = charlie.balance; vm.prank(deployer); - tc.payout{value: amount + ((amount * 3) / 100)}( + tc.payout{value: amount}( originContract, tokenId, currencyAddress, amount, charlie, splitAddrs, - splitRatios + splitRatios, + address(0) ); uint256 balanceAfter = charlie.balance; - uint256 expectedBalance = balanceBefore + ((amount * 95) / 100); + uint256 expectedBalance = balanceBefore + amount; if (balanceAfter != expectedBalance) { emit log_named_uint("Expected: balanceAfter", expectedBalance); emit log_named_uint("Actual: balanceAfter", balanceAfter); @@ -295,42 +244,7 @@ contract RareBazaarBaseTest is Test { royaltyReceiverAddrs[0] = payable(alice); royaltyAmounts[0] = (amount * 10) / 100; - // setup calculateMarketplaceFee call -- 3% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.calculateMarketplaceFee.selector, amount), - abi.encode((amount * 3) / 100) - ); - - // setup getRewardAccumulatorAddressForUser call -- 3% - vm.mockCall( - stakingRegistry, - abi.encodeWithSelector(IRareStakingRegistry.getRewardAccumulatorAddressForUser.selector, charlie), - abi.encode(address(0)) - ); - - // setup calculateMarketplacePayoutFee call -- 3% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IStakingSettings.calculateMarketplacePayoutFee.selector, amount), - abi.encode((amount * 3) / 100) - ); - - // setup calculateStakingFee call -- 3% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IStakingSettings.calculateStakingFee.selector, amount), - abi.encode(0) - ); - - // setup has hasERC721TokenSold -- false - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.hasERC721TokenSold.selector, originContract, 1), - abi.encode(true) - ); - - // setup has getRoyalty -- 10% + // setup getRoyalty -- 10% to alice vm.mockCall( royaltyEngine, abi.encodeWithSelector(IRoyaltyEngineV1.getRoyalty.selector, originContract, 1, amount), @@ -340,14 +254,15 @@ contract RareBazaarBaseTest is Test { uint256 balanceBefore = charlie.balance; uint256 aliceBalanceBefore = alice.balance; vm.prank(deployer); - tc.payout{value: amount + ((amount * 3) / 100)}( + tc.payout{value: amount}( originContract, tokenId, currencyAddress, amount, charlie, splitAddrs, - splitRatios + splitRatios, + address(0) ); uint256 balanceAfter = charlie.balance; uint256 expectedBalance = balanceBefore + ((amount * 90) / 100); @@ -358,7 +273,7 @@ contract RareBazaarBaseTest is Test { emit log_named_uint("Actual: balanceAfter", balanceAfter); revert("incorrect balance after on payout"); } - if (balanceAfter != expectedBalance) { + if (aliceBalanceAfter != aliceExpectedBalance) { emit log_named_uint("Expected: aliceExpectedBalance", aliceExpectedBalance); emit log_named_uint("Actual: aliceBalanceAfter", aliceBalanceAfter); revert("incorrect balance after on payout"); @@ -375,66 +290,26 @@ contract RareBazaarBaseTest is Test { splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); - // setup getRewardAccumulatorAddressForUser call -- 3% - vm.mockCall( - stakingRegistry, - abi.encodeWithSelector(IRareStakingRegistry.getRewardAccumulatorAddressForUser.selector, charlie), - abi.encode(rewardPool) - ); - - // setup calculateMarketplacePayoutFee call -- 3% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IStakingSettings.calculateMarketplacePayoutFee.selector, amount), - abi.encode((amount * 2) / 100) - ); - - // setup calculateStakingFee call -- 1% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IStakingSettings.calculateStakingFee.selector, amount), - abi.encode(amount / 100) - ); - - // setup calculateMarketplaceFee call -- 3% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.calculateMarketplaceFee.selector, amount), - abi.encode((amount * 3) / 100) - ); - - // setup has hasERC721TokenSold -- false + // setup getRoyalty -- empty (new payout: no staking, charlie gets full amount) vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.hasERC721TokenSold.selector, originContract, 1), - abi.encode(false) - ); - // setup has isApprovedSpaceOperator -- false - vm.mockCall( - spaceOperatorRegistry, - abi.encodeWithSelector(ISpaceOperatorRegistry.isApprovedSpaceOperator.selector, charlie), - abi.encode(false) - ); - - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(uint16(1500)) + royaltyEngine, + abi.encodeWithSelector(IRoyaltyEngineV1.getRoyalty.selector, originContract, 1, amount), + abi.encode(new address payable[](0), new uint256[](0)) ); - uint256 balanceBefore = rewardPool.balance; + uint256 balanceBefore = charlie.balance; vm.prank(deployer); - tc.payout{value: amount + ((amount * 3) / 100)}( + tc.payout{value: amount}( originContract, tokenId, currencyAddress, amount, charlie, splitAddrs, - splitRatios + splitRatios, + address(0) ); - uint256 balanceAfter = rewardPool.balance; - uint256 expectedBalance = balanceBefore + (amount / 100); + uint256 balanceAfter = charlie.balance; + uint256 expectedBalance = balanceBefore + amount; if (balanceAfter != expectedBalance) { emit log_named_uint("Expected: balanceAfter", expectedBalance); emit log_named_uint("Actual: balanceAfter", balanceAfter); @@ -452,65 +327,26 @@ contract RareBazaarBaseTest is Test { splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); - // setup getRewardAccumulatorAddressForUser call -- 3% + // setup getRoyalty -- empty (new payout: charlie gets full amount) vm.mockCall( - stakingRegistry, - abi.encodeWithSelector(IRareStakingRegistry.getRewardAccumulatorAddressForUser.selector, charlie), - abi.encode(address(0)) - ); - - // setup calculateMarketplacePayoutFee call -- 3% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IStakingSettings.calculateMarketplacePayoutFee.selector, amount), - abi.encode((amount * 2) / 100) - ); - - // setup calculateStakingFee call -- 1% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IStakingSettings.calculateStakingFee.selector, amount), - abi.encode(amount / 100) - ); - - // setup calculateMarketplaceFee call -- 3% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.calculateMarketplaceFee.selector, amount), - abi.encode((amount * 3) / 100) - ); - - // setup has hasERC721TokenSold -- false - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.hasERC721TokenSold.selector, originContract, 1), - abi.encode(false) - ); - // setup has isApprovedSpaceOperator -- false - vm.mockCall( - spaceOperatorRegistry, - abi.encodeWithSelector(ISpaceOperatorRegistry.isApprovedSpaceOperator.selector, charlie), - abi.encode(false) - ); - - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(uint16(1500)) + royaltyEngine, + abi.encodeWithSelector(IRoyaltyEngineV1.getRoyalty.selector, originContract, 1, amount), + abi.encode(new address payable[](0), new uint256[](0)) ); + uint256 balanceBefore = charlie.balance; vm.prank(deployer); - tc.payout{value: amount + ((amount * 3) / 100)}( + tc.payout{value: amount}( originContract, tokenId, currencyAddress, amount, charlie, splitAddrs, - splitRatios + splitRatios, + address(0) ); - uint256 balanceAfter = rewardPool.balance; - uint256 expectedBalance = balanceAfter; + uint256 balanceAfter = charlie.balance; + uint256 expectedBalance = balanceBefore + amount; if (balanceAfter != expectedBalance) { emit log_named_uint("Expected: balanceAfter", expectedBalance); emit log_named_uint("Actual: balanceAfter", balanceAfter); @@ -527,56 +363,15 @@ contract RareBazaarBaseTest is Test { splitRatios[0] = 10000; splitAddrs[0] = payable(charlie); - // setup getRewardAccumulatorAddressForUser call -- 3% - vm.mockCall( - stakingRegistry, - abi.encodeWithSelector(IRareStakingRegistry.getRewardAccumulatorAddressForUser.selector, charlie), - abi.encode(address(0)) - ); - - // setup calculateMarketplacePayoutFee call -- 3% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IStakingSettings.calculateMarketplacePayoutFee.selector, amount), - abi.encode((amount * 2) / 100) - ); - - // setup calculateStakingFee call -- 1% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IStakingSettings.calculateStakingFee.selector, amount), - abi.encode(amount / 100) - ); - - // setup calculateMarketplaceFee call -- 3% - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.calculateMarketplaceFee.selector, amount), - abi.encode((amount * 3) / 100) - ); - - // setup has hasERC721TokenSold -- false - vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.hasERC721TokenSold.selector, originContract, 1), - abi.encode(false) - ); - // setup has isApprovedSpaceOperator -- false - vm.mockCall( - spaceOperatorRegistry, - abi.encodeWithSelector(ISpaceOperatorRegistry.isApprovedSpaceOperator.selector, charlie), - abi.encode(false) - ); - - // setup has getERC721ContractPrimarySaleFeePercentage -- 15% (1500 bp) + // setup getRoyalty -- empty (new payout: charlie gets full amount, no network beneficiary fee) vm.mockCall( - marketplaceSettings, - abi.encodeWithSelector(IMarketplaceSettings.getERC721ContractPrimarySaleFeePercentage.selector, originContract), - abi.encode(uint16(1500)) + royaltyEngine, + abi.encodeWithSelector(IRoyaltyEngineV1.getRoyalty.selector, originContract, 1, amount), + abi.encode(new address payable[](0), new uint256[](0)) ); vm.prank(deployer); - rare.transfer(address(tc), amount + ((amount * 3) / 100)); - uint256 nbBalanceBefore = rare.balanceOf(networkBeneficiary); + rare.transfer(address(tc), amount); + uint256 charlieBalanceBefore = rare.balanceOf(charlie); tc.payout( originContract, tokenId, @@ -584,22 +379,15 @@ contract RareBazaarBaseTest is Test { amount, charlie, splitAddrs, - splitRatios - ); - uint256 balanceAfter = rewardPool.balance; - uint256 expectedBalance = balanceAfter; - if (balanceAfter != expectedBalance) { - emit log_named_uint("Expected: balanceAfter", expectedBalance); - emit log_named_uint("Actual: balanceAfter", balanceAfter); + splitRatios, + address(0) + ); + uint256 charlieBalanceAfter = rare.balanceOf(charlie); + uint256 expectedBalance = charlieBalanceBefore + amount; + if (charlieBalanceAfter != expectedBalance) { + emit log_named_uint("Expected: charlieBalanceAfter", expectedBalance); + emit log_named_uint("Actual: charlieBalanceAfter", charlieBalanceAfter); revert("incorrect balance after on payout"); } - - uint256 nbBalanceAfter = rare.balanceOf(networkBeneficiary); - uint256 nbExpectedBalance = nbBalanceBefore + ((amount * (15 + 3)) / 100); - if (nbBalanceAfter != nbExpectedBalance) { - emit log_named_uint("Expected: nbBalanceAfter", nbExpectedBalance); - emit log_named_uint("Actual: nbBalanceAfter", nbBalanceAfter); - revert("incorrect balance for network beneficiary after on payout"); - } } } diff --git a/src/test/bazaar/SuperRareBazaar.t.sol b/src/test/bazaar/SuperRareBazaar.t.sol index 12da0c2..f2af153 100644 --- a/src/test/bazaar/SuperRareBazaar.t.sol +++ b/src/test/bazaar/SuperRareBazaar.t.sol @@ -20,8 +20,7 @@ import {IERC721} from "openzeppelin-contracts/token/ERC721/IERC721.sol"; import {IERC20} from "openzeppelin-contracts/token/ERC20/IERC20.sol"; import {SuperFakeNFT} from "../../test/utils/SuperFakeNFT.sol"; import {TestRare} from "../../test/utils/TestRare.sol"; - - +import {RareAppRegistry} from "../../registry/RareAppRegistry.sol"; contract SuperRareBazaarTest is Test { TestRare private superRareToken; @@ -201,8 +200,122 @@ contract SuperRareBazaarTest is Test { //@exploit: Create an Offer using a custom NFT and the superRareToken as Currency vm.prank(bidder); - superRareBazaar.offer(address(sfn), 1, address(superRareToken), TARGET_AMOUNT, true); + superRareBazaar.offer(address(sfn), 1, address(superRareToken), TARGET_AMOUNT, true, address(0)); + } + + function test_buy_with_app_zero_no_fees() public { + RareAppRegistry appRegistry = new RareAppRegistry(address(this)); + superRareBazaar.setAppRegistry(address(appRegistry)); + + vm.mockCall( + royaltyEngine, + abi.encodeWithSelector(IRoyaltyEngineV1.getRoyalty.selector, address(sfn), 1, TARGET_AMOUNT), + abi.encode(new address payable[](0), new uint256[](0)) + ); + vm.mockCall( + marketplaceSettings, + abi.encodeWithSelector(IMarketplaceSettings.hasERC721TokenSold.selector, address(sfn), 1), + abi.encode(false) + ); + vm.mockCall( + marketplaceSettings, + abi.encodeWithSelector(IMarketplaceSettings.markERC721Token.selector, address(sfn), 1, true), + abi.encode() + ); + vm.mockCall( + approvedTokenRegistry, + abi.encodeWithSelector(IApprovedTokenRegistry.isApprovedToken.selector, address(superRareToken)), + abi.encode(true) + ); + + address payable[] memory splitAddresses = new address payable[](1); + splitAddresses[0] = payable(exploiter); + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; + + vm.prank(exploiter); + superRareBazaar.setSalePrice( + address(sfn), + 1, + address(superRareToken), + TARGET_AMOUNT, + address(0), + splitAddresses, + splitRatios, + address(0) // _app = 0, no fees + ); + + uint256 sellerBalanceBefore = superRareToken.balanceOf(exploiter); + vm.prank(bidder); + superRareBazaar.buy(address(sfn), 1, address(superRareToken), TARGET_AMOUNT); + uint256 sellerBalanceAfter = superRareToken.balanceOf(exploiter); + + assertEq(sellerBalanceAfter - sellerBalanceBefore, TARGET_AMOUNT, "Seller should get full amount when _app is 0"); } + function test_buy_with_registered_app_fee_split() public { + RareAppRegistry appRegistry = new RareAppRegistry(address(this)); + address appAddr = address(0x999); + address appFeeRecipient = address(0x888); + vm.prank(appAddr); + appRegistry.registerApp(250, appFeeRecipient); // 2.5% + superRareBazaar.setAppRegistry(address(appRegistry)); + + vm.mockCall( + royaltyEngine, + abi.encodeWithSelector(IRoyaltyEngineV1.getRoyalty.selector, address(sfn), 1, TARGET_AMOUNT), + abi.encode(new address payable[](0), new uint256[](0)) + ); + vm.mockCall( + marketplaceSettings, + abi.encodeWithSelector(IMarketplaceSettings.hasERC721TokenSold.selector, address(sfn), 1), + abi.encode(false) + ); + vm.mockCall( + marketplaceSettings, + abi.encodeWithSelector(IMarketplaceSettings.markERC721Token.selector, address(sfn), 1, true), + abi.encode() + ); + vm.mockCall( + approvedTokenRegistry, + abi.encodeWithSelector(IApprovedTokenRegistry.isApprovedToken.selector, address(superRareToken)), + abi.encode(true) + ); + + address payable[] memory splitAddresses = new address payable[](1); + splitAddresses[0] = payable(exploiter); + uint16[] memory splitRatios = new uint16[](1); + splitRatios[0] = 10000; + + vm.prank(exploiter); + superRareBazaar.setSalePrice( + address(sfn), + 1, + address(superRareToken), + TARGET_AMOUNT, + address(0), + splitAddresses, + splitRatios, + appAddr // registered app + ); + + uint256 sellerBalanceBefore = superRareToken.balanceOf(exploiter); + uint256 appBalanceBefore = superRareToken.balanceOf(appFeeRecipient); + uint256 protocolBalanceBefore = superRareToken.balanceOf(networkBeneficiary); + + vm.prank(bidder); + superRareBazaar.buy(address(sfn), 1, address(superRareToken), TARGET_AMOUNT); + + (uint256 appShare, uint256 protocolShare, uint256 totalFee) = + appRegistry.calculateFeeSplit(appAddr, TARGET_AMOUNT); + + uint256 sellerBalanceAfter = superRareToken.balanceOf(exploiter); + uint256 appBalanceAfter = superRareToken.balanceOf(appFeeRecipient); + uint256 protocolBalanceAfter = superRareToken.balanceOf(networkBeneficiary); + + assertEq(appBalanceAfter - appBalanceBefore, appShare, "App should receive appShare"); + assertEq(protocolBalanceAfter - protocolBalanceBefore, protocolShare, "Protocol should receive protocolShare"); + assertEq(sellerBalanceAfter - sellerBalanceBefore, TARGET_AMOUNT - totalFee, "Seller should get amount minus fee"); + } } \ No newline at end of file diff --git a/src/test/forks/mainnet/18029585/bazaar/SuperRareBazaarAuctionUpgrade.t.sol b/src/test/forks/mainnet/18029585/bazaar/SuperRareBazaarAuctionUpgrade.t.sol index f57794c..1fd5b37 100644 --- a/src/test/forks/mainnet/18029585/bazaar/SuperRareBazaarAuctionUpgrade.t.sol +++ b/src/test/forks/mainnet/18029585/bazaar/SuperRareBazaarAuctionUpgrade.t.sol @@ -95,7 +95,8 @@ contract SuperRareBazaarAuctionUpgrade is Test { LENGTH_OF_AUCTION, block.timestamp + 1, splitAddresses, - splitRatios + splitRatios, + address(0) ); // Auction begins @@ -134,7 +135,8 @@ contract SuperRareBazaarAuctionUpgrade is Test { LENGTH_OF_AUCTION, block.timestamp + 1, splitAddresses, - splitRatios + splitRatios, + address(0) ); // Auction begins diff --git a/src/test/registry/RareAppRegistry.t.sol b/src/test/registry/RareAppRegistry.t.sol new file mode 100644 index 0000000..01daf5c --- /dev/null +++ b/src/test/registry/RareAppRegistry.t.sol @@ -0,0 +1,139 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Test} from "forge-std/Test.sol"; +import {RareAppRegistry} from "../../registry/RareAppRegistry.sol"; +import {IRareAppRegistry} from "../../registry/IRareAppRegistry.sol"; + +contract RareAppRegistryTest is Test { + RareAppRegistry public registry; + + address public owner; + address public app1; + address public feeRecipient1; + + function setUp() public { + owner = address(0x1); + app1 = address(0x2); + feeRecipient1 = address(0x3); + + vm.prank(owner); + registry = new RareAppRegistry(owner); + } + + function test_registerApp() public { + vm.prank(app1); + registry.registerApp(250, feeRecipient1); // 2.5% + + (bool registered, uint16 feeBp, address feeRecipient) = registry.apps(app1); + assertTrue(registered); + assertEq(feeBp, 250); + assertEq(feeRecipient, feeRecipient1); + } + + function test_registerApp_revertAlreadyRegistered() public { + vm.prank(app1); + registry.registerApp(250, feeRecipient1); + + vm.prank(app1); + vm.expectRevert("already registered"); + registry.registerApp(500, feeRecipient1); + } + + function test_registerApp_revertZeroAddress() public { + vm.prank(app1); + vm.expectRevert("zero address"); + registry.registerApp(250, address(0)); + } + + function test_updateApp() public { + vm.prank(app1); + registry.registerApp(250, feeRecipient1); + + address newRecipient = address(0x4); + vm.prank(app1); + registry.updateApp(500, newRecipient); + + (bool registered, uint16 feeBp, address feeRecipient) = registry.apps(app1); + assertTrue(registered); + assertEq(feeBp, 500); + assertEq(feeRecipient, newRecipient); + } + + function test_updateApp_revertNotRegistered() public { + vm.prank(app1); + vm.expectRevert("not registered"); + registry.updateApp(500, feeRecipient1); + } + + function test_deregisterApp() public { + vm.prank(app1); + registry.registerApp(250, feeRecipient1); + + vm.prank(app1); + registry.deregisterApp(); + + (bool registered,,) = registry.apps(app1); + assertFalse(registered); + } + + function test_deregisterApp_revertNotRegistered() public { + vm.prank(app1); + vm.expectRevert("not registered"); + registry.deregisterApp(); + } + + function test_calculateFeeSplit_zeroApp() public { + (uint256 appShare, uint256 protocolShare, uint256 totalFee) = + registry.calculateFeeSplit(address(0), 1000 ether); + + assertEq(appShare, 0); + assertEq(protocolShare, 0); + assertEq(totalFee, 0); + } + + function test_calculateFeeSplit_unregisteredApp() public { + (uint256 appShare, uint256 protocolShare, uint256 totalFee) = + registry.calculateFeeSplit(app1, 1000 ether); + + assertEq(appShare, 0); + assertEq(protocolShare, 0); + assertEq(totalFee, 0); + } + + function test_calculateFeeSplit_registeredApp() public { + vm.prank(app1); + registry.registerApp(250, feeRecipient1); // 2.5% + + uint256 amount = 1000 ether; + (uint256 appShare, uint256 protocolShare, uint256 totalFee) = + registry.calculateFeeSplit(app1, amount); + + uint256 expectedTotalFee = (amount * 250) / 10000; // 25 ether + assertEq(totalFee, expectedTotalFee); + + uint256 expectedProtocolShare = (expectedTotalFee * 2000) / 10000; // 20% of fee = 5 ether + assertEq(protocolShare, expectedProtocolShare); + + assertEq(appShare, expectedTotalFee - expectedProtocolShare); // 20 ether + } + + function test_setProtocolShareBp() public { + vm.prank(owner); + registry.setProtocolShareBp(3000); + + assertEq(registry.protocolShareBp(), 3000); + } + + function test_setProtocolShareBp_revertExceedsMax() public { + vm.prank(owner); + vm.expectRevert("exceeds max"); + registry.setProtocolShareBp(10001); + } + + function test_setProtocolShareBp_revertNotOwner() public { + vm.prank(app1); + vm.expectRevert(); + registry.setProtocolShareBp(3000); + } +}