From 7f5ddf9c4c7bd86067139edcb43a3522f10e83ba Mon Sep 17 00:00:00 2001 From: mriynyk Date: Thu, 12 Feb 2026 19:48:43 +0700 Subject: [PATCH 01/14] reviewed --- config.chain.example.yaml | 2 + contracts/art-token/ArtToken.sol | 40 +++-- contracts/art-token/IArtToken.sol | 2 +- .../ArtTokenConfigManager.sol | 18 +- contracts/auction-house/AuctionHouse.sol | 111 ++++++------ contracts/auction-house/IAuctionHouse.sol | 5 +- .../{ShareDistributor.sol => ShareUtils.sol} | 51 +----- contracts/market/IMarket.sol | 2 +- contracts/market/Market.sol | 33 ++-- contracts/tests/AllDeployer.sol | 19 +- contracts/tests/WrappedEther.sol | 62 +++++++ contracts/utils/Authorization.sol | 2 +- contracts/utils/CollectionDeployer.sol | 11 +- contracts/utils/CurrencyTransfers.sol | 117 +++++++++++++ contracts/utils/EIP712Domain.sol | 2 +- contracts/utils/IWrappedEther.sol | 21 +++ contracts/utils/MarketDeployer.sol | 5 +- contracts/utils/SafeERC20BulkTransfer.sol | 78 --------- .../currency-manager/CurrencyManager.sol | 10 +- contracts/utils/role-system/IRoleSystem.sol | 27 +-- contracts/utils/role-system/RoleSystem.sol | 53 +++++- tests/ArtToken.ts | 144 +++++++++++++-- tests/AuctionHouse.ts | 164 +++++++++++++----- tests/CurrencyManager.ts | 2 +- tests/Market.ts | 32 ++-- tests/RoleSystem.ts | 20 +-- tests/SafeERC20BulkTransfer.ts | 3 - tests/utils/art-token-utils.ts | 5 +- 28 files changed, 697 insertions(+), 344 deletions(-) rename contracts/auction-house/libraries/{ShareDistributor.sol => ShareUtils.sol} (60%) create mode 100644 contracts/tests/WrappedEther.sol create mode 100644 contracts/utils/CurrencyTransfers.sol create mode 100644 contracts/utils/IWrappedEther.sol delete mode 100644 contracts/utils/SafeERC20BulkTransfer.sol delete mode 100644 tests/SafeERC20BulkTransfer.ts diff --git a/config.chain.example.yaml b/config.chain.example.yaml index 259ed23..43d7df1 100644 --- a/config.chain.example.yaml +++ b/config.chain.example.yaml @@ -3,9 +3,11 @@ sepolia: url: '' deployerPrivateKey: '' main: '' + wrappedEther: '' ethereum: chainId: 1 url: '' deployerPrivateKey: '' main: '' + wrappedEther: '' diff --git a/contracts/art-token/ArtToken.sol b/contracts/art-token/ArtToken.sol index 9d4ed72..cec14ff 100644 --- a/contracts/art-token/ArtToken.sol +++ b/contracts/art-token/ArtToken.sol @@ -1,14 +1,12 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.20; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {EIP712Domain} from "../utils/EIP712Domain.sol"; import {RoleSystem} from "../utils/role-system/RoleSystem.sol"; import {Authorization} from "../utils/Authorization.sol"; import {CurrencyManager} from "../utils/currency-manager/CurrencyManager.sol"; -import {SafeERC20BulkTransfer} from "../utils/SafeERC20BulkTransfer.sol"; import {TokenConfig} from "../utils/TokenConfig.sol"; +import {CurrencyTransfers} from "../utils/CurrencyTransfers.sol"; import {Roles} from "../utils/Roles.sol"; import {IAuctionHouse} from "../auction-house/IAuctionHouse.sol"; import {ArtTokenConfigManager} from "./art-token-config-manager/ArtTokenConfigManager.sol"; @@ -32,7 +30,8 @@ contract ArtToken is Authorization, CurrencyManager, ArtTokenConfigManager, - ArtTokenRoyaltyManager + ArtTokenRoyaltyManager, + CurrencyTransfers { using TokenMintingPermit for TokenMintingPermit.Type; @@ -45,13 +44,15 @@ contract ArtToken is * @param proxy Address of the proxy that will ultimately own the implementation * (used for EIP-712 domain separator). * @param main Address that will be set as {RoleSystem.MAIN}. + * @param wrappedEther Address of the Wrapped Ether contract. * @param auctionHouse Address of the AuctionHouse contract. */ constructor( address proxy, address main, + address wrappedEther, address auctionHouse - ) EIP712Domain(proxy, "ArtToken", "1") RoleSystem(main) { + ) EIP712Domain(proxy, "ArtToken", "1") RoleSystem(main) CurrencyTransfers(wrappedEther) { if (auctionHouse == address(0)) revert ArtTokenMisconfiguration(2); AUCTION_HOUSE = IAuctionHouse(auctionHouse); @@ -95,19 +96,17 @@ contract ArtToken is revert ArtTokenTokenReserved(); } - if (!currencyAllowed(permit.currency)) { + if (!_currencyAllowed(permit.currency)) { revert ArtTokenCurrencyInvalid(); } - IERC20 currency = IERC20(permit.currency); - _mint(permit.minter, permit.tokenId, permit.tokenURI, permit.tokenConfig); - SafeERC20.safeTransferFrom(currency, msg.sender, address(this), permit.price + permit.fee); + _receiveCurrency(permit.currency, msg.sender, permit.price + permit.fee); - SafeERC20BulkTransfer.safeTransfer(currency, permit.price, permit.participants, permit.rewards); + _sendCurrencyBatch(permit.currency, permit.price, permit.participants, permit.rewards); - SafeERC20.safeTransfer(currency, uniqueRoleOwner(Roles.FINANCIAL_ROLE), permit.fee); + _sendCurrency(permit.currency, _uniqueRoleOwner(Roles.FINANCIAL_ROLE), permit.fee); } /** @@ -131,8 +130,8 @@ contract ArtToken is /** * @inheritdoc IArtToken */ - function recipientAuthorized(address account) public view returns (bool authorized) { - return account.code.length == 0 || hasRole(Roles.PARTNER_ROLE, account); + function recipientAuthorized(address account) external view returns (bool authorized) { + return _recipientAuthorized(account); } /** @@ -164,11 +163,24 @@ contract ArtToken is * @param account The account to check. */ function _requireAuthorizedRecipient(address account) private view { - if (!recipientAuthorized(account)) { + if (!_recipientAuthorized(account)) { revert ArtTokenUnauthorizedAccount(account); } } + /** + * @notice Returns whether `account` passes the collection's compliance rules. + * + * @dev This function checks if the account is an EOA or has the PARTNER_ROLE. + * + * @param account Address to query. + * + * @return True if the account can receive or manage tokens. + */ + function _recipientAuthorized(address account) internal view returns (bool) { + return account.code.length == 0 || _hasRole(Roles.PARTNER_ROLE, account); + } + /** * @inheritdoc ArtTokenBase * diff --git a/contracts/art-token/IArtToken.sol b/contracts/art-token/IArtToken.sol index 242a35d..d351cc9 100644 --- a/contracts/art-token/IArtToken.sol +++ b/contracts/art-token/IArtToken.sol @@ -79,5 +79,5 @@ interface IArtToken is IERC721 { error ArtTokenTokenReserved(); /// @dev Thrown when a constructor argument under the provided `argIndex` is invalid (e.g., zero address). - error ArtTokenMisconfiguration(uint256 argIndex); + error ArtTokenMisconfiguration(uint8 argIndex); } diff --git a/contracts/art-token/art-token-config-manager/ArtTokenConfigManager.sol b/contracts/art-token/art-token-config-manager/ArtTokenConfigManager.sol index 019e8eb..fc75bba 100644 --- a/contracts/art-token/art-token-config-manager/ArtTokenConfigManager.sol +++ b/contracts/art-token/art-token-config-manager/ArtTokenConfigManager.sol @@ -44,14 +44,18 @@ abstract contract ArtTokenConfigManager is IArtTokenConfigManager, RoleSystem { * @inheritdoc IArtTokenConfigManager */ function tokenCreator(uint256 tokenId) external view returns (address creator) { - return ArtTokenConfigManagerStorage.layout().tokenConfig[tokenId].creator; + ArtTokenConfigManagerStorage.Layout storage $ = ArtTokenConfigManagerStorage.layout(); + + return $.tokenConfig[tokenId].creator; } /** * @inheritdoc IArtTokenConfigManager */ function tokenRegulationMode(uint256 tokenId) external view returns (TokenConfig.RegulationMode regulationMode) { - return ArtTokenConfigManagerStorage.layout().tokenConfig[tokenId].regulationMode; + ArtTokenConfigManagerStorage.Layout storage $ = ArtTokenConfigManagerStorage.layout(); + + return $.tokenConfig[tokenId].regulationMode; } /** @@ -76,10 +80,12 @@ abstract contract ArtTokenConfigManager is IArtTokenConfigManager, RoleSystem { * @return creator The address of the token's creator. */ function _tokenCreator(uint256 tokenId) internal view returns (address creator) { - creator = ArtTokenConfigManagerStorage.layout().tokenConfig[tokenId].creator; + ArtTokenConfigManagerStorage.Layout storage $ = ArtTokenConfigManagerStorage.layout(); + + creator = $.tokenConfig[tokenId].creator; if (creator == address(0)) { - return uniqueRoleOwner(Roles.FINANCIAL_ROLE); + return _uniqueRoleOwner(Roles.FINANCIAL_ROLE); } } @@ -90,7 +96,9 @@ abstract contract ArtTokenConfigManager is IArtTokenConfigManager, RoleSystem { * @return regulationMode The regulation mode of the token. */ function _tokenRegulationMode(uint256 tokenId) internal view returns (TokenConfig.RegulationMode regulationMode) { - regulationMode = ArtTokenConfigManagerStorage.layout().tokenConfig[tokenId].regulationMode; + ArtTokenConfigManagerStorage.Layout storage $ = ArtTokenConfigManagerStorage.layout(); + + regulationMode = $.tokenConfig[tokenId].regulationMode; if (regulationMode == TokenConfig.RegulationMode.None) { return TokenConfig.RegulationMode.Regulated; diff --git a/contracts/auction-house/AuctionHouse.sol b/contracts/auction-house/AuctionHouse.sol index 644c182..dc4acfe 100644 --- a/contracts/auction-house/AuctionHouse.sol +++ b/contracts/auction-house/AuctionHouse.sol @@ -1,15 +1,14 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.20; -import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {EIP712Domain} from "../utils/EIP712Domain.sol"; import {RoleSystem} from "../utils/role-system/RoleSystem.sol"; import {Authorization} from "../utils/Authorization.sol"; -import {ShareDistributor} from "./libraries/ShareDistributor.sol"; import {CurrencyManager} from "../utils/currency-manager/CurrencyManager.sol"; +import {CurrencyTransfers} from "../utils/CurrencyTransfers.sol"; import {Roles} from "../utils/Roles.sol"; import {IArtToken} from "../art-token/IArtToken.sol"; +import {ShareUtils} from "./libraries/ShareUtils.sol"; import {AuctionCreationPermit} from "./libraries/AuctionCreationPermit.sol"; import {Auction} from "./libraries/Auction.sol"; import {AuctionHouseStorage} from "./AuctionHouseStorage.sol"; @@ -19,11 +18,11 @@ import {IAuctionHouse} from "./IAuctionHouse.sol"; * @title AuctionHouse * * @notice Upgradeable English-auction contract that conducts primary sales for NFTs minted by - * {ArtToken}. Users create auctions via an authorized EIP-712 permit, place bids in - * USDC and, after the auction ends, the highest bidder receives the token while funds are + * {ArtToken}. Users create auctions via an authorized EIP-712 permit, place bids and, + * after the auction ends, the highest bidder receives the token while funds are * split between participants and the protocol treasury. */ -contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, CurrencyManager { +contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, CurrencyManager, CurrencyTransfers { using AuctionCreationPermit for AuctionCreationPermit.Type; /// @notice Address of the associated {ArtToken} contract. @@ -77,7 +76,7 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, /// @notice Ensures the auction already has a highest bidder recorded. /// @dev Reverts with {AuctionHouseBuyerNotExists} otherwise. - modifier withBuyer(uint256 auctionId) { + modifier auctionWithBuyer(uint256 auctionId) { if (_auctionWithBuyer(auctionId)) { _; } else { @@ -87,7 +86,7 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, /// @notice Ensures the auction currently has no buyer. /// @dev Reverts with {AuctionHouseBuyerExists} if a buyer is present. - modifier withoutBuyer(uint256 auctionId) { + modifier auctionWithoutBuyer(uint256 auctionId) { if (_auctionWithBuyer(auctionId)) { revert AuctionHouseBuyerExists(); } else { @@ -110,15 +109,17 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, * * @param proxy Proxy address used for EIP-712 verifying contract. * @param main Address that will be set as {RoleSystem.MAIN}. + * @param wrappedEther Address of the Wrapped Ether contract. * @param artToken Address of the {ArtToken} contract. * @param minAuctionDuration Minimum auction duration (seconds). */ constructor( address proxy, address main, + address wrappedEther, address artToken, uint256 minAuctionDuration - ) EIP712Domain(proxy, "AuctionHouse", "1") RoleSystem(main) { + ) EIP712Domain(proxy, "AuctionHouse", "1") RoleSystem(main) CurrencyTransfers(wrappedEther) { if (artToken == address(0)) revert AuctionHouseMisconfiguration(2); if (minAuctionDuration == 0) revert AuctionHouseMisconfiguration(3); @@ -155,11 +156,11 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, revert AuctionHouseInvalidEndTime(); } - if (!currencyAllowed(permit.currency)) { + if (!_currencyAllowed(permit.currency)) { revert AuctionHouseInvalidCurrency(); } - if (tokenReserved(permit.tokenId)) { + if (_tokenReserved(permit.tokenId)) { revert AuctionHouseTokenReserved(); } @@ -167,7 +168,7 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, revert AuctionHouseTokenReserved(); } - ShareDistributor.requireValidConditions(permit.participants, permit.shares); + ShareUtils.requireValidConditions(permit.participants, permit.shares); AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); @@ -197,14 +198,14 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, * * @dev First bid path. The function: * - Checks caller authorization via {authorizedBuyer}. - * - Transfers `newPrice + fee` USDC from the caller to the contract. + * - Transfers `newPrice + fee` from the caller to the contract. * - Stores the caller as `buyer` and `newPrice` as `price`. * - Emits {Raised}. * * Reverts with {AuctionHouseRaiseTooLow} if `newPrice < initial price`. * * @param auctionId Identifier of the auction that has no current buyer. - * @param newPrice First bid amount in USDC. + * @param newPrice First bid amount. */ function raiseInitial( uint256 auctionId, @@ -215,7 +216,7 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, authorizedBuyer(msg.sender) auctionExists(auctionId) auctionNotEnded(auctionId) - withoutBuyer(auctionId) + auctionWithoutBuyer(auctionId) { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); @@ -228,12 +229,7 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, emit Raised(auctionId, msg.sender, newPrice); - SafeERC20.safeTransferFrom( - IERC20($.auction[auctionId].currency), - msg.sender, - address(this), - newPrice + $.auction[auctionId].fee - ); + _receiveCurrency($.auction[auctionId].currency, msg.sender, newPrice + $.auction[auctionId].fee); } /** @@ -248,7 +244,7 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, * `current price + step`. * * @param auctionId Identifier of the auction with an existing buyer. - * @param newPrice New highest bid in USDC. + * @param newPrice New highest bid. */ function raise( uint256 auctionId, @@ -259,40 +255,27 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, authorizedBuyer(msg.sender) auctionExists(auctionId) auctionNotEnded(auctionId) - withBuyer(auctionId) + auctionWithBuyer(auctionId) { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); Auction.Type memory _auction = $.auction[auctionId]; - uint256 step = _auction.step; - uint256 price = _auction.price; - uint256 fee = _auction.fee; - address currency = _auction.currency; + uint256 oldPrice = _auction.price; + address oldBuyer = _auction.buyer; - if (newPrice < price + step) { - revert AuctionHouseRaiseTooLow(price + step); + if (newPrice < oldPrice + _auction.step) { + revert AuctionHouseRaiseTooLow(oldPrice + _auction.step); } emit Raised(auctionId, msg.sender, newPrice); - SafeERC20.safeTransferFrom( - IERC20(currency), - msg.sender, - address(this), - newPrice + fee // - ); - - address buyer = _auction.buyer; + _receiveCurrency(_auction.currency, msg.sender, newPrice + _auction.fee); - $.auction[auctionId].buyer = msg.sender; $.auction[auctionId].price = newPrice; + $.auction[auctionId].buyer = msg.sender; - SafeERC20.safeTransfer( - IERC20(currency), - buyer, - price + fee // - ); + _sendCurrency(_auction.currency, oldBuyer, oldPrice + _auction.fee); } /** @@ -303,13 +286,15 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, * 2. Mints the NFT to the stored `buyer` via {ArtToken.mintFromAuctionHouse}. * 3. Transfers the platform `fee` to the treasury (owner of {Roles.FINANCIAL_ROLE}). * 4. Splits the sale `price` among `participants` according to `shares` using - * {ShareDistributor.distribute}. + * {ShareUtils.calculateRewards} and {CurrencyTransfers._sendCurrencyBatch}. * * Reverts with {AuctionHouseTokenSold} if already settled. * * @param auctionId Identifier of the auction to settle. */ - function finish(uint256 auctionId) external auctionExists(auctionId) auctionEnded(auctionId) withBuyer(auctionId) { + function finish( + uint256 auctionId + ) external auctionExists(auctionId) auctionEnded(auctionId) auctionWithBuyer(auctionId) { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); Auction.Type memory _auction = $.auction[auctionId]; @@ -329,19 +314,13 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, $.tokenConfig[_auction.tokenId] ); - address currency = _auction.currency; - - SafeERC20.safeTransfer( - IERC20(currency), - uniqueRoleOwner(Roles.FINANCIAL_ROLE), - _auction.fee // - ); + _sendCurrency(_auction.currency, _uniqueRoleOwner(Roles.FINANCIAL_ROLE), _auction.fee); - ShareDistributor.distribute( - currency, + _sendCurrencyBatch( + _auction.currency, _auction.price, _auction.participants, - _auction.shares // + ShareUtils.calculateRewards(_auction.price, _auction.shares) ); } @@ -356,7 +335,13 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, */ function cancel( uint256 auctionId - ) external auctionExists(auctionId) auctionNotEnded(auctionId) withoutBuyer(auctionId) onlyRole(Roles.ADMIN_ROLE) { + ) + external + auctionExists(auctionId) + auctionNotEnded(auctionId) + auctionWithoutBuyer(auctionId) + onlyRole(Roles.ADMIN_ROLE) + { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); // Mark the auction as ended by setting endTime to current timestamp @@ -376,11 +361,19 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, /** * @inheritdoc IAuctionHouse + */ + function tokenReserved(uint256 tokenId) external view returns (bool reserved) { + return _tokenReserved(tokenId); + } + + /** + * @notice Internal helper that checks whether `tokenId` is reserved by an active auction + * or an ended auction with a buyer. * - * @return reserved True if the token is currently locked by an active auction or an ended - * auction with a buyer. + * @param tokenId The ID of the token to check. + * @return reserved True if the token is reserved. */ - function tokenReserved(uint256 tokenId) public view returns (bool reserved) { + function _tokenReserved(uint256 tokenId) internal view returns (bool reserved) { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); uint256 auctionId = $.tokenAuctionId[tokenId]; diff --git a/contracts/auction-house/IAuctionHouse.sol b/contracts/auction-house/IAuctionHouse.sol index fc3d834..5095a42 100644 --- a/contracts/auction-house/IAuctionHouse.sol +++ b/contracts/auction-house/IAuctionHouse.sol @@ -86,6 +86,9 @@ interface IAuctionHouse { * @notice Indicates whether any active auction has reserved `tokenId`. * * @param tokenId The ID of the token to check. + * + * @return reserved True if the token is currently locked by an active auction or an ended + * auction with a buyer. */ function tokenReserved(uint256 tokenId) external view returns (bool reserved); @@ -135,5 +138,5 @@ interface IAuctionHouse { error AuctionHouseRaiseTooLow(uint256 minAmount); /// @dev Thrown when constructor argument at `argIndex` is invalid. - error AuctionHouseMisconfiguration(uint256 argIndex); + error AuctionHouseMisconfiguration(uint8 argIndex); } diff --git a/contracts/auction-house/libraries/ShareDistributor.sol b/contracts/auction-house/libraries/ShareUtils.sol similarity index 60% rename from contracts/auction-house/libraries/ShareDistributor.sol rename to contracts/auction-house/libraries/ShareUtils.sol index f1a7d75..a21bae8 100644 --- a/contracts/auction-house/libraries/ShareDistributor.sol +++ b/contracts/auction-house/libraries/ShareUtils.sol @@ -1,43 +1,10 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.20; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; -import {SafeERC20BulkTransfer} from "../../utils/SafeERC20BulkTransfer.sol"; import {ONE_HUNDRED_PERCENT_IN_BP} from "../../utils/Constants.sol"; -/** - * @title ShareDistributor - * @notice A library for distributing a total amount of an ERC20 token among multiple participants - * based on specified shares. - */ -library ShareDistributor { - /** - * @notice Distributes a given amount of an ERC20 token to a list of participants. - * - * @dev Calculates rewards and uses {SafeERC20BulkTransfer} to transfer the amounts. - * - * @param currency The address of the ERC20 token to distribute. - * @param amount The total amount of the token to be distributed. - * @param participants An array of addresses for the recipients. - * @param shares An array of shares (in basis points) corresponding to each participant. - */ - function distribute( - address currency, - uint256 amount, - address[] memory participants, - uint256[] memory shares - ) internal { - uint256[] memory rewards = calculateRewards(amount, shares); - - SafeERC20BulkTransfer.safeTransfer( - IERC20(currency), - amount, - participants, - rewards // - ); - } - +library ShareUtils { /** * @notice Calculates the individual reward amounts from a total amount based on shares. * @@ -86,20 +53,20 @@ library ShareDistributor { uint256 participantsCount = participants.length; if (participantsCount != shares.length) { - revert ShareDistributorParticipantsSharesMismatch(); + revert ShareUtilsParticipantsSharesMismatch(); } uint256 sharesSum = 0; for (uint256 i = 0; i < participantsCount; ) { if (participants[i] == address(0)) { - revert ShareDistributorZeroAddress(); + revert ShareUtilsZeroAddress(); } uint256 share = shares[i]; if (share == 0) { - revert ShareDistributorZeroShare(); + revert ShareUtilsZeroShare(); } sharesSum += share; @@ -110,19 +77,19 @@ library ShareDistributor { } if (sharesSum != ONE_HUNDRED_PERCENT_IN_BP) { - revert ShareDistributorSharesSumInvalid(sharesSum); + revert ShareUtilsInvalidSum(sharesSum); } } /// @dev Thrown when `participants.length != shares.length`. - error ShareDistributorParticipantsSharesMismatch(); + error ShareUtilsParticipantsSharesMismatch(); /// @dev Thrown when a share value is zero. - error ShareDistributorZeroShare(); + error ShareUtilsZeroShare(); /// @dev Thrown when a participant address is zero. - error ShareDistributorZeroAddress(); + error ShareUtilsZeroAddress(); /// @dev Thrown when `sum(shares) != ONE_HUNDRED_PERCENT_IN_BP`. - error ShareDistributorSharesSumInvalid(uint256 sharesSum); + error ShareUtilsInvalidSum(uint256 sharesSum); } diff --git a/contracts/market/IMarket.sol b/contracts/market/IMarket.sol index 5cb715a..0eed624 100644 --- a/contracts/market/IMarket.sol +++ b/contracts/market/IMarket.sol @@ -144,5 +144,5 @@ interface IMarket { error MarketInvalidAskSideFee(); /// @dev Thrown when a constructor argument at `argIndex` is invalid. - error MarketMisconfiguration(uint256 argIndex); + error MarketMisconfiguration(uint8 argIndex); } diff --git a/contracts/market/Market.sol b/contracts/market/Market.sol index c1d7f66..12b4d85 100644 --- a/contracts/market/Market.sol +++ b/contracts/market/Market.sol @@ -1,16 +1,14 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.20; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {EIP712Domain} from "../utils/EIP712Domain.sol"; import {EIP712Signature} from "../utils/EIP712Signature.sol"; import {RoleSystem} from "../utils/role-system/RoleSystem.sol"; import {CurrencyManager} from "../utils/currency-manager/CurrencyManager.sol"; +import {CurrencyTransfers} from "../utils/CurrencyTransfers.sol"; import {Roles} from "../utils/Roles.sol"; import {Authorization} from "../utils/Authorization.sol"; -import {SafeERC20BulkTransfer} from "../utils/SafeERC20BulkTransfer.sol"; import {MarketStorage} from "./MarketStorage.sol"; import {IMarket} from "./IMarket.sol"; import {Order} from "./libraries/Order.sol"; @@ -23,7 +21,7 @@ import {OrderExecutionPermit} from "./libraries/OrderExecutionPermit.sol"; * through off-chain orders. It supports both sell-side (ask) and buy-side (bid) orders, * which are authorized via EIP-712 signatures. */ -contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authorization { +contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authorization, CurrencyTransfers { using Order for Order.Type; using OrderExecutionPermit for OrderExecutionPermit.Type; @@ -32,8 +30,13 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza * * @param proxy Proxy address used for EIP-712 verifying contract. * @param main Address that will be set as {RoleSystem.MAIN}. + * @param wrappedEther Address of the Wrapped Ether contract. */ - constructor(address proxy, address main) EIP712Domain(proxy, "Market", "1") RoleSystem(main) {} + constructor( + address proxy, + address main, + address wrappedEther + ) EIP712Domain(proxy, "Market", "1") RoleSystem(main) CurrencyTransfers(wrappedEther) {} /** * @inheritdoc IMarket @@ -67,7 +70,7 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza revert MarketUnauthorizedAccount(); } - if (!currencyAllowed(order.currency)) { + if (!_currencyAllowed(order.currency)) { revert MarketCurrencyInvalid(); } @@ -80,7 +83,7 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza _invalidateOrder(maker, permit.orderHash); _distribute( - IERC20(order.currency), + order.currency, maker, // askSide - maker msg.sender, // bidSide - taker order.price, @@ -139,7 +142,7 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza revert MarketUnauthorizedAccount(); } - if (!currencyAllowed(order.currency)) { + if (!_currencyAllowed(order.currency)) { revert MarketCurrencyInvalid(); } @@ -152,7 +155,7 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza _invalidateOrder(maker, permit.orderHash); _distribute( - IERC20(order.currency), + order.currency, msg.sender, // askSide - taker maker, // bidSide - maker order.price, @@ -183,7 +186,7 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza * @inheritdoc IMarket */ function invalidateOrder(address maker, bytes32 orderHash) external { - if (msg.sender == maker || hasRole(Roles.ADMIN_ROLE, msg.sender)) { + if (msg.sender == maker || _hasRole(Roles.ADMIN_ROLE, msg.sender)) { _invalidateOrder(maker, orderHash); emit OrderInvalidated(maker, orderHash); @@ -214,7 +217,7 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza * @param rewards The corresponding rewards for each participant. */ function _distribute( - IERC20 currency, + address currency, address askSide, address bidSide, uint256 price, @@ -223,13 +226,13 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza address[] calldata participants, uint256[] calldata rewards ) internal { - SafeERC20.safeTransferFrom(currency, bidSide, address(this), price + bidSideFee); + _receiveCurrency(currency, bidSide, price + bidSideFee); - SafeERC20.safeTransfer(currency, askSide, price - askSideFee); + _sendCurrency(currency, askSide, price - askSideFee); - SafeERC20.safeTransfer(currency, uniqueRoleOwner(Roles.FINANCIAL_ROLE), bidSideFee); + _sendCurrency(currency, _uniqueRoleOwner(Roles.FINANCIAL_ROLE), bidSideFee); - SafeERC20BulkTransfer.safeTransfer(currency, askSideFee, participants, rewards); + _sendCurrencyBatch(currency, askSideFee, participants, rewards); } /** diff --git a/contracts/tests/AllDeployer.sol b/contracts/tests/AllDeployer.sol index 4d78be6..56a450e 100644 --- a/contracts/tests/AllDeployer.sol +++ b/contracts/tests/AllDeployer.sol @@ -6,22 +6,26 @@ import {ArtToken} from "../art-token/ArtToken.sol"; import {AuctionHouse} from "../auction-house/AuctionHouse.sol"; import {Market} from "../market/Market.sol"; import {Roles} from "../utils/Roles.sol"; -import {USDC} from "../tests/USDC.sol"; +import {ETHER} from "../utils/Constants.sol"; +import {USDC} from "./USDC.sol"; +import {WrappedEther} from "./WrappedEther.sol"; contract AllDeployer { event Deployed(address artToken, address auctionHouse, address market, address usdc); constructor(address signer, address financier, address admin, uint256 minAuctionDuration) { address usdc = address(new USDC()); - address artTokenProxy = Deployment.calculateContractAddress(address(this), 5); - address auctionHouseProxy = Deployment.calculateContractAddress(address(this), 6); - address marketProxy = Deployment.calculateContractAddress(address(this), 7); + address wrappedEther = address(new WrappedEther()); + address artTokenProxy = Deployment.calculateContractAddress(address(this), 6); + address auctionHouseProxy = Deployment.calculateContractAddress(address(this), 7); + address marketProxy = Deployment.calculateContractAddress(address(this), 8); { address artTokenImpl = address( new ArtToken( artTokenProxy, address(this), + wrappedEther, auctionHouseProxy // ) ); @@ -30,6 +34,7 @@ contract AllDeployer { new AuctionHouse( auctionHouseProxy, address(this), + wrappedEther, artTokenProxy, minAuctionDuration // ) @@ -38,7 +43,8 @@ contract AllDeployer { address marketImpl = address( new Market( marketProxy, - address(this) // + address(this), + wrappedEther // ) ); @@ -59,18 +65,21 @@ contract AllDeployer { ArtToken(artTokenProxy).grantRole(Roles.PARTNER_ROLE, marketProxy); ArtToken(artTokenProxy).grantRole(Roles.ADMIN_ROLE, address(this)); ArtToken(artTokenProxy).updateCurrencyStatus(usdc, true); + ArtToken(artTokenProxy).updateCurrencyStatus(ETHER, true); if (admin != address(0)) ArtToken(artTokenProxy).grantRole(Roles.ADMIN_ROLE, admin); AuctionHouse(auctionHouseProxy).transferUniqueRole(Roles.FINANCIAL_ROLE, financier); AuctionHouse(auctionHouseProxy).transferUniqueRole(Roles.SIGNER_ROLE, signer); AuctionHouse(auctionHouseProxy).grantRole(Roles.ADMIN_ROLE, address(this)); AuctionHouse(auctionHouseProxy).updateCurrencyStatus(usdc, true); + AuctionHouse(auctionHouseProxy).updateCurrencyStatus(ETHER, true); if (admin != address(0)) AuctionHouse(auctionHouseProxy).grantRole(Roles.ADMIN_ROLE, admin); Market(marketProxy).transferUniqueRole(Roles.SIGNER_ROLE, signer); Market(marketProxy).transferUniqueRole(Roles.FINANCIAL_ROLE, financier); Market(marketProxy).grantRole(Roles.ADMIN_ROLE, address(this)); Market(marketProxy).updateCurrencyStatus(usdc, true); + Market(marketProxy).updateCurrencyStatus(ETHER, true); if (admin != address(0)) Market(marketProxy).grantRole(Roles.ADMIN_ROLE, admin); } diff --git a/contracts/tests/WrappedEther.sol b/contracts/tests/WrappedEther.sol new file mode 100644 index 0000000..d3aedbc --- /dev/null +++ b/contracts/tests/WrappedEther.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.20; + +contract WrappedEther { + string public name = "Wrapped Ether"; + string public symbol = "WETH"; + uint8 public decimals = 18; + + event Approval(address indexed src, address indexed guy, uint256 wad); + event Transfer(address indexed src, address indexed dst, uint256 wad); + event Deposit(address indexed dst, uint256 wad); + event Withdrawal(address indexed src, uint256 wad); + + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + receive() external payable { + deposit(); + } + + function deposit() public payable { + balanceOf[msg.sender] += msg.value; + emit Deposit(msg.sender, msg.value); + } + + function withdraw(uint256 wad) public { + require(balanceOf[msg.sender] >= wad); + balanceOf[msg.sender] -= wad; + payable(msg.sender).transfer(wad); + emit Withdrawal(msg.sender, wad); + } + + function totalSupply() public view returns (uint256) { + return address(this).balance; + } + + function approve(address guy, uint256 wad) public returns (bool) { + allowance[msg.sender][guy] = wad; + emit Approval(msg.sender, guy, wad); + return true; + } + + function transfer(address dst, uint256 wad) public returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom(address src, address dst, uint256 wad) public returns (bool) { + require(balanceOf[src] >= wad); + + if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) { + require(allowance[src][msg.sender] >= wad); + allowance[src][msg.sender] -= wad; + } + + balanceOf[src] -= wad; + balanceOf[dst] += wad; + + emit Transfer(src, dst, wad); + + return true; + } +} diff --git a/contracts/utils/Authorization.sol b/contracts/utils/Authorization.sol index e22b2fd..80fb135 100644 --- a/contracts/utils/Authorization.sol +++ b/contracts/utils/Authorization.sol @@ -38,7 +38,7 @@ abstract contract Authorization is EIP712Domain, RoleSystem { address signer = EIP712Signature.recover(DOMAIN_SEPARATOR, messageHash, signature); - if (uniqueRoleOwner(Roles.SIGNER_ROLE) != signer) { + if (_uniqueRoleOwner(Roles.SIGNER_ROLE) != signer) { revert AuthorizationUnauthorizedAction(); } } diff --git a/contracts/utils/CollectionDeployer.sol b/contracts/utils/CollectionDeployer.sol index 8f1ae0b..a86063e 100644 --- a/contracts/utils/CollectionDeployer.sol +++ b/contracts/utils/CollectionDeployer.sol @@ -41,9 +41,16 @@ contract CollectionDeployer { * @param name ERC-721 collection name. * @param symbol ERC-721 collection symbol. * @param main Address that will be set as {RoleSystem.MAIN}. + * @param wrappedEther Address of the Wrapped Ether contract. * @param minAuctionDuration Minimum auction duration (seconds) enforced by AuctionHouse. */ - constructor(string memory name, string memory symbol, address main, uint256 minAuctionDuration) { + constructor( + string memory name, + string memory symbol, + address main, + address wrappedEther, + uint256 minAuctionDuration + ) { address calculatedArtTokenProxy = Deployment.calculateContractAddress(address(this), 3); address calculatedAuctionHouseProxy = Deployment.calculateContractAddress(address(this), 4); @@ -51,6 +58,7 @@ contract CollectionDeployer { new ArtToken( calculatedArtTokenProxy, main, + wrappedEther, calculatedAuctionHouseProxy // ) ); @@ -59,6 +67,7 @@ contract CollectionDeployer { new AuctionHouse( calculatedAuctionHouseProxy, main, + wrappedEther, calculatedArtTokenProxy, minAuctionDuration // ) diff --git a/contracts/utils/CurrencyTransfers.sol b/contracts/utils/CurrencyTransfers.sol new file mode 100644 index 0000000..c17997b --- /dev/null +++ b/contracts/utils/CurrencyTransfers.sol @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity ^0.8.20; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {ETHER} from "../utils/Constants.sol"; +import {IWrappedEther} from "../utils/IWrappedEther.sol"; + +contract CurrencyTransfers { + uint256 public constant GAS_LIMIT_ETHER_TRANSFER = 2_300; + + IWrappedEther public immutable WRAPPED_ETHER; + + constructor(address wrappedEther) { + if (wrappedEther == address(0)) revert CurrencyTransfersMisconfiguration(0); + + WRAPPED_ETHER = IWrappedEther(wrappedEther); + } + + function _sendCurrency(address currency, address to, uint256 value) internal { + if (currency == ETHER) { + _sendEtherAndWrapIfFail(to, value); + } else { + SafeERC20.safeTransfer(IERC20(currency), to, value); + } + } + + function _receiveCurrency(address currency, address from, uint256 value) internal { + if (currency == ETHER) { + // Ensure the correct amount of Ether is sent with the transaction + if (msg.value != value) { + revert CurrencyTransfersIncorrectEtherValue(); + } + } else { + // Ensure no Ether is sent with the transaction + if (msg.value != 0) { + revert CurrencyTransfersUnexpectedEther(); + } + + SafeERC20.safeTransferFrom(IERC20(currency), from, address(this), value); + } + } + + function _sendCurrencyBatch( + address currency, + uint256 amount, + address[] memory receivers, + uint256[] memory values + ) internal { + uint256 receiversCount = receivers.length; + + if (receiversCount != values.length) { + revert CurrencyTransfersInvalidInputLengths(); + } + + uint256 sent = 0; + + for (uint256 i; i < receiversCount; ) { + address receiver = receivers[i]; + uint256 value = values[i]; + + if (receiver == address(0)) { + revert CurrencyTransfersZeroAddress(); + } + + if (value == 0) { + revert CurrencyTransfersZeroValue(); + } + + _sendCurrency(currency, receiver, value); + + sent += value; + + unchecked { + i++; + } + } + + if (amount != sent) { + revert CurrencyTransfersIncorrectTotalAmount(); + } + } + + function _sendEtherAndWrapIfFail(address to, uint256 value) private { + bool status; + + assembly { + status := call(GAS_LIMIT_ETHER_TRANSFER, to, value, 0, 0, 0, 0) + } + + if (!status) { + WRAPPED_ETHER.deposit{value: value}(); + SafeERC20.safeTransfer(WRAPPED_ETHER, to, value); + } + } + + /// @dev Thrown when the lengths of the `receivers` and `values` arrays do not match. + error CurrencyTransfersInvalidInputLengths(); + + /// @dev Thrown when a receiver's address is the zero address. + error CurrencyTransfersZeroAddress(); + + /// @dev Thrown when a transfer value is zero. + error CurrencyTransfersZeroValue(); + + /// @dev Thrown when the sum of `values` does not equal the total `amount`. + error CurrencyTransfersIncorrectTotalAmount(); + + /// @dev Thrown when the Ether value sent does not match the expected value. + error CurrencyTransfersIncorrectEtherValue(); + + /// @dev Thrown when an unexpected amount of Ether is sent. + error CurrencyTransfersUnexpectedEther(); + + /// @dev Thrown when a constructor argument at index `argIndex` is invalid. + error CurrencyTransfersMisconfiguration(uint8 argIndex); +} diff --git a/contracts/utils/EIP712Domain.sol b/contracts/utils/EIP712Domain.sol index f25fe76..dd7875f 100644 --- a/contracts/utils/EIP712Domain.sol +++ b/contracts/utils/EIP712Domain.sol @@ -58,5 +58,5 @@ contract EIP712Domain { * @dev Thrown when a constructor argument at position `argIndex` is invalid (zero address or * empty string). */ - error EIP712DomainMisconfiguration(uint256 argIndex); + error EIP712DomainMisconfiguration(uint8 argIndex); } diff --git a/contracts/utils/IWrappedEther.sol b/contracts/utils/IWrappedEther.sol new file mode 100644 index 0000000..8bcc8d7 --- /dev/null +++ b/contracts/utils/IWrappedEther.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity ^0.8.20; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +/** + * @title IWrappedEther + * @notice Defines the interface for the wrapped ether external contract. + */ +interface IWrappedEther is IERC20 { + /** + * @dev Locks sent ether and mints the same amount of wrapped ether for the caller. + */ + function deposit() external payable; + + /** + * @dev Burns the amount of the caller's wrapped ether and sends the same amount of ether to the caller. + * @param amount The amount to be withdrawn + */ + function withdraw(uint256 amount) external; +} diff --git a/contracts/utils/MarketDeployer.sol b/contracts/utils/MarketDeployer.sol index 13fd908..dc1c67d 100644 --- a/contracts/utils/MarketDeployer.sol +++ b/contracts/utils/MarketDeployer.sol @@ -29,11 +29,12 @@ contract MarketDeployer { * 5. Emits {Deployed}. * * @param main Address that will be set as {RoleSystem.MAIN}. + * @param wrappedEther Address of the Wrapped Ether contract. */ - constructor(address main) { + constructor(address main, address wrappedEther) { address calculatedMarketProxy = Deployment.calculateContractAddress(address(this), 2); - address marketImpl = address(new Market(calculatedMarketProxy, main)); + address marketImpl = address(new Market(calculatedMarketProxy, main, wrappedEther)); address marketProxy = Deployment.deployUpgradeableContract(marketImpl, main); diff --git a/contracts/utils/SafeERC20BulkTransfer.sol b/contracts/utils/SafeERC20BulkTransfer.sol deleted file mode 100644 index bbc9881..0000000 --- a/contracts/utils/SafeERC20BulkTransfer.sol +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity ^0.8.20; - -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; - -/** - * @title SafeERC20BulkTransfer - * - * @notice A library for performing safe bulk transfers of ERC20 tokens. - * - * @dev This library provides a `safeTransfer` function that iterates over arrays of receivers and - * values to transfer tokens to multiple recipients. It includes validation to ensure the - * input arrays are consistent and that the total transferred amount matches the expected - * amount. - */ -library SafeERC20BulkTransfer { - /** - * @notice Safely transfers ERC20 tokens to multiple receivers. - * - * @dev Reverts if the lengths of the `receivers` and `values` arrays do not match, if a - * receiver is the zero address, if a value is zero, or if the sum of `values` does not - * equal `amount`. - * - * @param currency The ERC20 token to transfer. - * @param amount The total amount of tokens to be transferred. - * @param receivers An array of addresses to receive the tokens. - * @param values An array of amounts to be transferred to each receiver. - */ - function safeTransfer( - IERC20 currency, - uint256 amount, - address[] memory receivers, - uint256[] memory values - ) internal { - uint256 receiversCount = receivers.length; - - if (receiversCount != values.length) { - revert SafeERC20BulkTransferInvalidInputLengths(); - } - - uint256 transferred = 0; - - for (uint256 i; i < receiversCount; ) { - address receiver = receivers[i]; - uint256 value = values[i]; - - if (receiver == address(0)) { - revert SafeERC20BulkTransferZeroAddress(); - } - - if (value == 0) { - revert SafeERC20BulkTransferZeroValue(); - } - - SafeERC20.safeTransfer(currency, receiver, value); - - transferred += value; - - unchecked { - i++; - } - } - - if (amount != transferred) { - revert SafeERC20BulkTransferIncorrectTotalAmount(); - } - } - - /// @dev Thrown when the lengths of the `receivers` and `values` arrays do not match. - error SafeERC20BulkTransferInvalidInputLengths(); - /// @dev Thrown when a receiver's address is the zero address. - error SafeERC20BulkTransferZeroAddress(); - /// @dev Thrown when a transfer value is zero. - error SafeERC20BulkTransferZeroValue(); - /// @dev Thrown when the sum of `values` does not equal the total `amount`. - error SafeERC20BulkTransferIncorrectTotalAmount(); -} diff --git a/contracts/utils/currency-manager/CurrencyManager.sol b/contracts/utils/currency-manager/CurrencyManager.sol index 0814f3c..c8e13bb 100644 --- a/contracts/utils/currency-manager/CurrencyManager.sol +++ b/contracts/utils/currency-manager/CurrencyManager.sol @@ -26,7 +26,13 @@ abstract contract CurrencyManager is ICurrencyManager, RoleSystem { /** * @inheritdoc ICurrencyManager */ - function currencyAllowed(address currency) public view returns (bool allowed) { - return CurrencyManagerStorage.layout().allowed[currency]; + function currencyAllowed(address currency) external view returns (bool allowed) { + return _currencyAllowed(currency); + } + + function _currencyAllowed(address currency) internal view returns (bool allowed) { + CurrencyManagerStorage.Layout storage $ = CurrencyManagerStorage.layout(); + + return $.allowed[currency]; } } diff --git a/contracts/utils/role-system/IRoleSystem.sol b/contracts/utils/role-system/IRoleSystem.sol index 21aacbd..b204427 100644 --- a/contracts/utils/role-system/IRoleSystem.sol +++ b/contracts/utils/role-system/IRoleSystem.sol @@ -29,9 +29,10 @@ interface IRoleSystem { * @notice Emitted when ownership of a unique role is transferred. * * @param role Identifier of the unique role. - * @param newOwner Address that becomes the new (sole) owner of the role. + * @param oldOwner Address of the previous owner of the role. + * @param newOwner Address that becomes the new owner of the role. */ - event UniqueRoleTransferred(bytes32 indexed role, address indexed newOwner); + event UniqueRoleTransferred(bytes32 indexed role, address indexed oldOwner, address indexed newOwner); /** * @notice Grants `role` to `account`. @@ -63,19 +64,15 @@ interface IRoleSystem { /** * @notice Checks if `account` has been granted `role`. * - * @dev Reverts with {RoleSystemZeroAddress} when `account` is the zero address. - * * @param role The role to query. * @param account The account to query. * - * @return true if `account` possesses `role`, false otherwise. + * @return hasRole True if `account` possesses `role`, false otherwise. */ - function hasRole(bytes32 role, address account) external view returns (bool); + function hasRole(bytes32 role, address account) external view returns (bool hasRole); /** - * @notice Returns the sole owner of `uniqueRole`. - * - * @dev Reverts with {RoleSystemZeroAddress} when the role is currently unassigned. + * @notice Returns the owner of `uniqueRole`. * * @param uniqueRole The unique role to query. * @@ -101,8 +98,18 @@ interface IRoleSystem { */ error RoleSystemZeroAddress(); + /** + * @dev Thrown when attempting to grant a role to an account that already has it. + */ + error RoleSystemAlreadyHasRole(bytes32 role, address account); + + /** + * @dev Thrown when attempting to revoke a role from an account that does not have it. + */ + error RoleSystemMissingRole(bytes32 role, address account); + /** * @dev Thrown when a constructor argument at index `argIndex` is invalid. */ - error RoleSystemMisconfiguration(uint256 argIndex); + error RoleSystemMisconfiguration(uint8 argIndex); } diff --git a/contracts/utils/role-system/RoleSystem.sol b/contracts/utils/role-system/RoleSystem.sol index 8be11de..d881ef4 100644 --- a/contracts/utils/role-system/RoleSystem.sol +++ b/contracts/utils/role-system/RoleSystem.sol @@ -37,7 +37,7 @@ contract RoleSystem is IRoleSystem { * @param role The role required to call the function. */ modifier onlyRole(bytes32 role) { - if (!hasRole(role, msg.sender)) { + if (!_hasRole(role, msg.sender)) { revert RoleSystemUnauthorizedAccount(msg.sender, role); } @@ -65,6 +65,10 @@ contract RoleSystem is IRoleSystem { RoleSystemStorage.Layout storage $ = RoleSystemStorage.layout(); + if ($.hasRole[role][account]) { + revert RoleSystemAlreadyHasRole(role, account); + } + $.hasRole[role][account] = true; emit RoleGranted(role, account); @@ -78,6 +82,10 @@ contract RoleSystem is IRoleSystem { RoleSystemStorage.Layout storage $ = RoleSystemStorage.layout(); + if (!$.hasRole[role][account]) { + revert RoleSystemMissingRole(role, account); + } + $.hasRole[role][account] = false; emit RoleRevoked(role, account); @@ -89,15 +97,44 @@ contract RoleSystem is IRoleSystem { function transferUniqueRole(bytes32 uniqueRole, address newOwner) external onlyMain { RoleSystemStorage.Layout storage $ = RoleSystemStorage.layout(); + address oldOwner = $.uniqueRoleOwner[uniqueRole]; + + if (oldOwner == newOwner) { + revert RoleSystemAlreadyHasRole(uniqueRole, newOwner); + } + $.uniqueRoleOwner[uniqueRole] = newOwner; - emit UniqueRoleTransferred(uniqueRole, newOwner); + emit UniqueRoleTransferred(uniqueRole, oldOwner, newOwner); } /** * @inheritdoc IRoleSystem */ - function hasRole(bytes32 role, address account) public view returns (bool) { + function hasRole(bytes32 role, address account) external view returns (bool) { + RoleSystemStorage.Layout storage $ = RoleSystemStorage.layout(); + + return $.hasRole[role][account]; + } + + /** + * @inheritdoc IRoleSystem + */ + function uniqueRoleOwner(bytes32 uniqueRole) external view returns (address) { + RoleSystemStorage.Layout storage $ = RoleSystemStorage.layout(); + + return $.uniqueRoleOwner[uniqueRole]; + } + + /** + * @notice Internal variant of {hasRole} that reverts when `account` is the zero address. + * + * @param role The role to query. + * @param account The account to query. + * + * @return True if `account` possesses `role`, false otherwise. + */ + function _hasRole(bytes32 role, address account) internal view returns (bool) { _requireNotZeroAddress(account); RoleSystemStorage.Layout storage $ = RoleSystemStorage.layout(); @@ -106,9 +143,15 @@ contract RoleSystem is IRoleSystem { } /** - * @inheritdoc IRoleSystem + * @notice Internal variant of {uniqueRoleOwner} that reverts when the role is unassigned. + * + * @dev Reverts with {RoleSystemZeroAddress} when the role is currently unassigned. + * + * @param uniqueRole The unique role to query. + * + * @return owner Address of the current role owner. */ - function uniqueRoleOwner(bytes32 uniqueRole) public view returns (address owner) { + function _uniqueRoleOwner(bytes32 uniqueRole) internal view returns (address owner) { RoleSystemStorage.Layout storage $ = RoleSystemStorage.layout(); owner = $.uniqueRoleOwner[uniqueRole]; diff --git a/tests/ArtToken.ts b/tests/ArtToken.ts index f9c122c..3c3dec7 100644 --- a/tests/ArtToken.ts +++ b/tests/ArtToken.ts @@ -3,7 +3,7 @@ import { Signer, MaxInt256, ZeroAddress } from 'ethers'; import { ArtToken, AuctionHouse, USDC, Market } from '../typechain-types'; import { AuctionCreationPermit } from '../typechain-types/contracts/auction-house/AuctionHouse'; import { TokenMintingPermit } from '../typechain-types/contracts/art-token/ArtToken'; -import { HOUR, ONE_HUNDRED } from './constants/general'; +import { ETHER_ADDR, HOUR, ONE_HUNDRED } from './constants/general'; import { NON_EXISTENT_TOKEN_ID, SECOND_TOKEN_URI, @@ -98,19 +98,19 @@ describe('ArtToken', function () { sender: buyer, }); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(buyerAddr, artTokenAddr, TOKEN_PRICE + TOKEN_FEE); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(artTokenAddr, institutionAddr, institutionReward); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(artTokenAddr, financierAddr, platformReward); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(artTokenAddr, financierAddr, TOKEN_FEE); @@ -148,7 +148,9 @@ describe('ArtToken', function () { expect(tokenCreator).equal(TOKEN_CONFIG.creator); expect(tokenRegulationMode).equal(TOKEN_CONFIG.regulationMode); - await expect(tx).emit(artToken, 'TokenConfigUpdated').withArgs(TOKEN_ID); + await expect(tx) // + .emit(artToken, 'TokenConfigUpdated') + .withArgs(TOKEN_ID); }); it(`should fail if the caller is not the allowed minter`, async () => { @@ -276,6 +278,108 @@ describe('ArtToken', function () { await expect(tx).rejectedWith('AuthorizationUnauthorizedAction'); }); + + it(`should fail if unexpected ether is sent`, async () => { + const latestBlockTimestamp = await getLatestBlockTimestamp(); + + const tokenMintingPermit: TokenMintingPermit.TypeStruct = { + tokenId: TOKEN_ID, + minter: buyerAddr, + currency: usdcAddr, + price: TOKEN_PRICE, + fee: TOKEN_FEE, + tokenURI: TOKEN_URI, + tokenConfig: TOKEN_CONFIG, + participants: [institutionAddr], + rewards: [TOKEN_PRICE], + deadline: latestBlockTimestamp + HOUR, + }; + + const tx = ArtTokenUtils.mint({ + artToken, + permit: tokenMintingPermit, + permitSigner: artTokenSigner, + sender: buyer, + value: 1n, // Incorrectly sent ether + }); + + await expect(tx).rejectedWith('CurrencyTransfersUnexpectedEther'); + }); + }); + + describe(`method 'mint' with Ether`, () => { + it(`should mint, distribute price, and charge a fee`, async () => { + const latestBlockTimestamp = await getLatestBlockTimestamp(); + + const institutionReward = (TOKEN_PRICE / 5n) * 4n; // 80% + const platformReward = TOKEN_PRICE / 5n; // 20% + + const tokenMintingPermit: TokenMintingPermit.TypeStruct = { + tokenId: TOKEN_ID, + minter: buyerAddr, + currency: ETHER_ADDR, + price: TOKEN_PRICE, + fee: TOKEN_FEE, + tokenURI: TOKEN_URI, + tokenConfig: TOKEN_CONFIG, + participants: [institutionAddr, financierAddr], + rewards: [institutionReward, platformReward], + deadline: latestBlockTimestamp + HOUR, + }; + + const tx = await ArtTokenUtils.mint({ + artToken, + permit: tokenMintingPermit, + permitSigner: artTokenSigner, + sender: buyer, + value: TOKEN_PRICE + TOKEN_FEE, + }); + + await expect(tx).changeEtherBalance(artTokenAddr, 0n); + + await expect(tx).changeEtherBalance(buyerAddr, (TOKEN_PRICE + TOKEN_FEE) * -1n); + + await expect(tx).changeEtherBalance(institutionAddr, institutionReward); + + await expect(tx).changeEtherBalance(financierAddr, platformReward + TOKEN_FEE); + }); + + it(`should fail if incorrect amount of ether is sent`, async () => { + const latestBlockTimestamp = await getLatestBlockTimestamp(); + + const tokenMintingPermit: TokenMintingPermit.TypeStruct = { + tokenId: TOKEN_ID, + minter: buyerAddr, + currency: ETHER_ADDR, + price: TOKEN_PRICE, + fee: TOKEN_FEE, + tokenURI: TOKEN_URI, + tokenConfig: TOKEN_CONFIG, + participants: [institutionAddr], + rewards: [TOKEN_PRICE], + deadline: latestBlockTimestamp + HOUR, + }; + + const tx1 = ArtTokenUtils.mint({ + artToken, + permit: tokenMintingPermit, + permitSigner: artTokenSigner, + sender: buyer, + value: TOKEN_PRICE + TOKEN_FEE - 1n, // Incorrect amount + }); + + await expect(tx1).rejectedWith('CurrencyTransfersIncorrectEtherValue'); + + const tx2 = ArtTokenUtils.mint({ + artToken, + permit: tokenMintingPermit, + permitSigner: artTokenSigner, + sender: buyer, + value: TOKEN_PRICE + TOKEN_FEE + 1n, // Incorrect amount + }); + + await expect(tx2).rejectedWith('CurrencyTransfersIncorrectEtherValue'); + }); }); describe(`method 'mintFromAuctionHouse'`, () => { @@ -332,7 +436,7 @@ describe('ArtToken', function () { .connect(buyer) .transferFrom(buyer, randomAccount, TOKEN_ID); - await expect(tx) + await expect(tx) // .emit(artToken, 'Transfer') .withArgs(buyerAddr, randomAccountAddr, TOKEN_ID); }); @@ -340,7 +444,7 @@ describe('ArtToken', function () { it(`should transfer to a partner contract`, async () => { const tx = await artToken.connect(buyer).transferFrom(buyer, market, TOKEN_ID); - await expect(tx) + await expect(tx) // .emit(artToken, 'Transfer') .withArgs(buyerAddr, marketAddr, TOKEN_ID); }); @@ -359,7 +463,7 @@ describe('ArtToken', function () { .connect(buyer) .transferFrom(buyer, usdc, TOKEN_ID); - await expect(tx) + await expect(tx) // .emit(artToken, 'Transfer') .withArgs(buyerAddr, usdcAddr, TOKEN_ID); }); @@ -410,7 +514,7 @@ describe('ArtToken', function () { it(`should provide the approval to a non-contract account`, async () => { const tx = await artToken.connect(buyer).approve(randomAccountAddr, TOKEN_ID); - await expect(tx) + await expect(tx) // .emit(artToken, 'Approval') .withArgs(buyerAddr, randomAccountAddr, TOKEN_ID); }); @@ -418,7 +522,7 @@ describe('ArtToken', function () { it(`should provide the approval to a partner contract`, async () => { const tx = await artToken.connect(buyer).approve(market, TOKEN_ID); - await expect(tx) + await expect(tx) // .emit(artToken, 'Approval') .withArgs(buyerAddr, marketAddr, TOKEN_ID); }); @@ -439,7 +543,7 @@ describe('ArtToken', function () { it(`should provide the approval to a non-partner contract`, async () => { const tx = await artToken.connect(buyer).approve(usdc, TOKEN_ID); - await expect(tx) + await expect(tx) // .emit(artToken, 'Approval') .withArgs(buyerAddr, usdc, TOKEN_ID); }); @@ -492,7 +596,7 @@ describe('ArtToken', function () { .connect(buyer) .setApprovalForAll(randomAccountAddr, true); - await expect(tx) + await expect(tx) // .emit(artToken, 'ApprovalForAll') .withArgs(buyerAddr, randomAccountAddr, true); }); @@ -500,7 +604,7 @@ describe('ArtToken', function () { it(`should provide the approval to a partner contract`, async () => { const tx = await artToken.connect(buyer).setApprovalForAll(market, true); - await expect(tx) + await expect(tx) // .emit(artToken, 'ApprovalForAll') .withArgs(buyerAddr, marketAddr, true); }); @@ -598,7 +702,9 @@ describe('ArtToken', function () { it(`should set the new token URI`, async () => { const tx = await artToken.connect(admin).setTokenURI(TOKEN_ID, SECOND_TOKEN_URI); - await expect(tx).emit(artToken, 'MetadataUpdate').withArgs(TOKEN_ID); + await expect(tx) // + .emit(artToken, 'MetadataUpdate') + .withArgs(TOKEN_ID); const tokenURI = await artToken.tokenURI(TOKEN_ID); @@ -679,7 +785,9 @@ describe('ArtToken', function () { expect(tokenCreatorAfter).equal(institutionAddr); - await expect(tx).emit(artToken, 'TokenConfigUpdated').withArgs(TOKEN_ID); + await expect(tx) // + .emit(artToken, 'TokenConfigUpdated') + .withArgs(TOKEN_ID); }); it(`should fail if the caller is not the art token admin`, async () => { @@ -705,7 +813,9 @@ describe('ArtToken', function () { expect(tokenRegulationModeAfter).equal(REGULATION_MODE_UNREGULATED); - await expect(tx).emit(artToken, 'TokenConfigUpdated').withArgs(TOKEN_ID); + await expect(tx) // + .emit(artToken, 'TokenConfigUpdated') + .withArgs(TOKEN_ID); }); it(`should fail if the caller is not the art token admin`, async () => { diff --git a/tests/AuctionHouse.ts b/tests/AuctionHouse.ts index 697dfe7..864af45 100644 --- a/tests/AuctionHouse.ts +++ b/tests/AuctionHouse.ts @@ -5,7 +5,7 @@ import { setNextBlockTimestamp } from '@nomicfoundation/hardhat-network-helpers/ import { ArtToken, AuctionHouse, USDC } from '../typechain-types'; import { TokenMintingPermit } from '../typechain-types/contracts/art-token/ArtToken'; import { AuctionCreationPermit } from '../typechain-types/contracts/auction-house/AuctionHouse'; -import { ONE_HUNDRED, HOUR } from './constants/general'; +import { ONE_HUNDRED, HOUR, ETHER_ADDR } from './constants/general'; import { AUCTION_FEE, AUCTION_ID, @@ -110,7 +110,7 @@ describe(`AuctionHouse`, () => { const auction = await auctionHouse.auction(AUCTION_ID); - await expect(tx) + await expect(tx) // .emit(auctionHouse, 'Created') .withArgs(AUCTION_ID, TOKEN_ID, AUCTION_PRICE, endTime); @@ -501,37 +501,45 @@ describe(`AuctionHouse`, () => { }); it(`should raise if the new price is equal to the initial price`, async () => { - const { price: initialPrice } = await auctionHouse.auction(AUCTION_ID); + const { price: initialPrice, fee } = await auctionHouse.auction(AUCTION_ID); const newPrice = initialPrice; const tx = await auctionHouse.connect(buyer).raiseInitial(AUCTION_ID, newPrice); - const auction = await auctionHouse.auction(AUCTION_ID); + const auctionAfterRise = await auctionHouse.auction(AUCTION_ID); - expect(auction.buyer).equal(buyerAddr); - expect(auction.price).equal(newPrice); + expect(auctionAfterRise.buyer).equal(buyerAddr); + expect(auctionAfterRise.price).equal(newPrice); - await expect(tx) + await expect(tx) // .emit(auctionHouse, 'Raised') - .withArgs(AUCTION_ID, auction.buyer, auction.price); + .withArgs(AUCTION_ID, buyerAddr, newPrice); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') - .withArgs(buyerAddr, auctionHouseAddr, auction.price + auction.fee); + .withArgs(buyerAddr, auctionHouseAddr, newPrice + fee); }); it(`should raise if the new price is greater than the initial price`, async () => { - const { price: initialPrice } = await auctionHouse.auction(AUCTION_ID); + const { price: initialPrice, fee } = await auctionHouse.auction(AUCTION_ID); const newPrice = initialPrice + 1n; - await auctionHouse.connect(buyer).raiseInitial(AUCTION_ID, newPrice); + const tx = await auctionHouse.connect(buyer).raiseInitial(AUCTION_ID, newPrice); - const auction = await auctionHouse.auction(AUCTION_ID); + const auctionAfterRise = await auctionHouse.auction(AUCTION_ID); + + expect(auctionAfterRise.buyer).equal(buyerAddr); + expect(auctionAfterRise.price).equal(newPrice); - expect(auction.buyer).equal(buyerAddr); - expect(auction.price).equal(newPrice); + await expect(tx) // + .emit(auctionHouse, 'Raised') + .withArgs(AUCTION_ID, buyerAddr, newPrice); + + await expect(tx) // + .emit(usdc, 'Transfer') + .withArgs(buyerAddr, auctionHouseAddr, newPrice + fee); }); it(`should fail if the new price is lower than the initial price`, async () => { @@ -553,23 +561,23 @@ describe(`AuctionHouse`, () => { }); it(`should fail if the auction has a buyer`, async () => { - const auction = await auctionHouse.auction(AUCTION_ID); + const { price } = await auctionHouse.auction(AUCTION_ID); - await auctionHouse.connect(buyer).raiseInitial(AUCTION_ID, auction.price); + await auctionHouse.connect(buyer).raiseInitial(AUCTION_ID, price); await usdc.connect(randomAccount).mintAndApprove(auctionHouse, MaxInt256); - const tx = auctionHouse.connect(randomAccount).raiseInitial(AUCTION_ID, auction.price); + const tx = auctionHouse.connect(randomAccount).raiseInitial(AUCTION_ID, price); await expect(tx).rejectedWith('AuctionHouseBuyerExists'); }); it(`should fail if the auction has ended`, async () => { - const auction = await auctionHouse.auction(AUCTION_ID); + const { price, endTime } = await auctionHouse.auction(AUCTION_ID); - await setNextBlockTimestamp(auction.endTime); + await setNextBlockTimestamp(endTime); - const tx = auctionHouse.connect(buyer).raiseInitial(AUCTION_ID, auction.price); + const tx = auctionHouse.connect(buyer).raiseInitial(AUCTION_ID, price); await expect(tx).rejectedWith('AuctionHouseAuctionEnded'); }); @@ -616,37 +624,49 @@ describe(`AuctionHouse`, () => { const tx = await auctionHouse.connect(buyer).raise(AUCTION_ID, newPrice); - const auction = await auctionHouse.auction(AUCTION_ID); + const auctionAfterRise = await auctionHouse.auction(AUCTION_ID); - expect(auction.buyer).equal(buyerAddr); - expect(auction.price).equal(newPrice); + expect(auctionAfterRise.buyer).equal(buyerAddr); + expect(auctionAfterRise.price).equal(newPrice); - await expect(tx) + await expect(tx) // .emit(auctionHouse, 'Raised') - .withArgs(AUCTION_ID, auction.buyer, auction.price); + .withArgs(AUCTION_ID, buyerAddr, newPrice); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') - .withArgs(buyerAddr, auctionHouseAddr, auction.price + auction.fee); + .withArgs(buyerAddr, auctionHouseAddr, newPrice + fee); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(auctionHouseAddr, randomAccountAddr, initialPrice + fee); }); it(`should raise if the new price is greater than the sum of the old price and the step`, async () => { - const { price: initialPrice, step } = await auctionHouse.auction(AUCTION_ID); + const { price: initialPrice, step, fee } = await auctionHouse.auction(AUCTION_ID); await auctionHouse.connect(randomAccount).raiseInitial(AUCTION_ID, initialPrice); const newPrice = initialPrice + step + 1n; - await auctionHouse.connect(buyer).raise(AUCTION_ID, newPrice); + const tx = await auctionHouse.connect(buyer).raise(AUCTION_ID, newPrice); - const auction = await auctionHouse.auction(AUCTION_ID); + const auctionAfterRise = await auctionHouse.auction(AUCTION_ID); + + expect(auctionAfterRise.buyer).equal(buyerAddr); + expect(auctionAfterRise.price).equal(newPrice); + + await expect(tx) // + .emit(auctionHouse, 'Raised') + .withArgs(AUCTION_ID, buyerAddr, newPrice); - expect(auction.buyer).equal(buyerAddr); - expect(auction.price).equal(newPrice); + await expect(tx) // + .emit(usdc, 'Transfer') + .withArgs(buyerAddr, auctionHouseAddr, newPrice + fee); + + await expect(tx) // + .emit(usdc, 'Transfer') + .withArgs(auctionHouseAddr, randomAccountAddr, initialPrice + fee); }); it(`should fail if the new price is lower than the sum of the old price and the step`, async () => { @@ -690,6 +710,56 @@ describe(`AuctionHouse`, () => { it(`should fail if the buyer is unauthorized`); }); + describe(`method 'raise' with Ether`, () => { + beforeEach(async () => { + const latestBlockTimestamp = await getLatestBlockTimestamp(); + + const auctionCreationPermit: AuctionCreationPermit.TypeStruct = { + auctionId: AUCTION_ID, + tokenId: TOKEN_ID, + currency: ETHER_ADDR, + price: AUCTION_PRICE, + fee: AUCTION_FEE, + step: AUCTION_STEP, + endTime: latestBlockTimestamp + HOUR, + tokenURI: TOKEN_URI, + tokenConfig: TOKEN_CONFIG, + participants: [institutionAddr], + shares: [ONE_HUNDRED], + deadline: latestBlockTimestamp + HOUR, + }; + + await AuctionHouseUtils.create({ + auctionHouse, + permit: auctionCreationPermit, + permitSigner: auctionHouseSigner, + sender: institution, + }); + + await auctionHouse + .connect(randomAccount) + .raiseInitial(AUCTION_ID, AUCTION_PRICE, { value: AUCTION_PRICE + AUCTION_FEE }); + }); + + it(`should raise`, async () => { + const { price: initialPrice, step, fee } = await auctionHouse.auction(AUCTION_ID); + + const newPrice = initialPrice + step; + + const tx = await auctionHouse + .connect(buyer) + .raise(AUCTION_ID, newPrice, { value: newPrice + fee }); + + await expect(tx).changeEtherBalance(auctionHouseAddr, newPrice - initialPrice); + + await expect(tx).changeEtherBalance(buyerAddr, (newPrice + fee) * -1n); + + await expect(tx).changeEtherBalance(randomAccountAddr, initialPrice + fee); + }); + + // TODO: should fail if incorrect amount of ether is sent + }); + describe(`method 'finish'`, async () => { beforeEach(async () => { const latestBlockTimestamp = await getLatestBlockTimestamp(); @@ -728,9 +798,9 @@ describe(`AuctionHouse`, () => { const tx = await auctionHouse.connect(buyer).finish(AUCTION_ID); - const auction = await auctionHouse.auction(AUCTION_ID); + const { sold } = await auctionHouse.auction(AUCTION_ID); - expect(auction.sold).equal(true); + expect(sold).equal(true); await expect(tx) // .emit(auctionHouse, 'Sold') @@ -945,7 +1015,7 @@ describe(`AuctionHouse`, () => { }); }); - describe(`ShareDistributor`, () => { + describe(`ShareUtils`, () => { beforeEach(async () => { await usdc.connect(buyer).mintAndApprove(auctionHouse, MaxInt256); }); @@ -988,11 +1058,11 @@ describe(`AuctionHouse`, () => { const institutionReward = (AUCTION_PRICE * institutionShare) / ONE_HUNDRED; const platformReward = (AUCTION_PRICE * platformShare) / ONE_HUNDRED; - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(auctionHouseAddr, institutionAddr, institutionReward); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(auctionHouseAddr, financierAddr, platformReward); }); @@ -1038,11 +1108,11 @@ describe(`AuctionHouse`, () => { const institutionReward = (priceWithRemainder * institutionShare) / ONE_HUNDRED; const platformReward = (priceWithRemainder * platformShare) / ONE_HUNDRED + remainder; - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(auctionHouseAddr, institutionAddr, institutionReward); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(auctionHouseAddr, financierAddr, platformReward); }); @@ -1072,7 +1142,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith('ShareDistributorParticipantsSharesMismatch'); + await expect(tx).rejectedWith('ShareUtilsParticipantsSharesMismatch'); }); it(`should fail if the total share is greater than 100%`, async () => { @@ -1103,7 +1173,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith('ShareDistributorSharesSumInvalid(10500)'); + await expect(tx).rejectedWith('ShareUtilsInvalidSum(10500)'); }); it(`should fail if the total share is less than 100%`, async () => { @@ -1134,7 +1204,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith('ShareDistributorSharesSumInvalid(8000)'); + await expect(tx).rejectedWith('ShareUtilsInvalidSum(8000)'); }); it(`should fail if shares and participants are missing`, async () => { @@ -1162,7 +1232,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith('ShareDistributorSharesSumInvalid(0)'); + await expect(tx).rejectedWith('ShareUtilsInvalidSum(0)'); }); it(`should fail if a participant address is zero`, async () => { @@ -1190,7 +1260,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith('ShareDistributorZeroAddress'); + await expect(tx).rejectedWith('ShareUtilsZeroAddress'); }); it(`should fail if a participant has a zero share`, async () => { @@ -1218,7 +1288,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith('ShareDistributorZeroShare'); + await expect(tx).rejectedWith('ShareUtilsZeroShare'); }); }); }); diff --git a/tests/CurrencyManager.ts b/tests/CurrencyManager.ts index 2aa6cff..e050655 100644 --- a/tests/CurrencyManager.ts +++ b/tests/CurrencyManager.ts @@ -59,7 +59,7 @@ describe('CurrencyManager', function () { expect(currencyAllowedAfter).equal(false); - await expect(tx) + await expect(tx) // .emit(currencyManager, 'CurrencyStatusUpdated') .withArgs(usdcAddr, false); }); diff --git a/tests/Market.ts b/tests/Market.ts index 53d741e..090993e 100644 --- a/tests/Market.ts +++ b/tests/Market.ts @@ -133,11 +133,11 @@ describe('Market', function () { expect(orderInvalidated).equal(true); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(takerAddr, marketAddr, ORDER_PRICE + BID_SIDE_FEE); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(marketAddr, financierAddr, BID_SIDE_FEE); @@ -145,11 +145,11 @@ describe('Market', function () { .emit(usdc, 'Transfer') .withArgs(marketAddr, makerAddr, askSideReward); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(marketAddr, institutionAddr, institutionReward); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(marketAddr, financierAddr, platformReward); @@ -157,7 +157,7 @@ describe('Market', function () { .emit(artToken, 'Transfer') .withArgs(makerAddr, takerAddr, TOKEN_ID); - await expect(tx) + await expect(tx) // .emit(market, 'AskOrderExecuted') .withArgs( orderHash, @@ -205,7 +205,9 @@ describe('Market', function () { sender: taker, }); - await expect(tx).emit(usdc, 'Transfer').withArgs(marketAddr, makerAddr, ORDER_PRICE); // Full price to maker + await expect(tx) // + .emit(usdc, 'Transfer') + .withArgs(marketAddr, makerAddr, ORDER_PRICE); // Full price to maker }); it(`should execute the order with zero taker fee`, async () => { @@ -689,7 +691,7 @@ describe('Market', function () { sender: taker, }); - await expect(tx).rejectedWith('SafeERC20BulkTransferIncorrectTotalAmount'); + await expect(tx).rejectedWith('CurrencyTransfersIncorrectTotalAmount'); }); it(`should fail if the sum of rewards is less than the ask side fee`, async () => { @@ -725,7 +727,7 @@ describe('Market', function () { sender: taker, }); - await expect(tx).rejectedWith('SafeERC20BulkTransferIncorrectTotalAmount'); + await expect(tx).rejectedWith('CurrencyTransfersIncorrectTotalAmount'); }); }); @@ -808,11 +810,11 @@ describe('Market', function () { expect(orderInvalidated).equal(true); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(makerAddr, marketAddr, ORDER_PRICE + BID_SIDE_FEE); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(marketAddr, financierAddr, BID_SIDE_FEE); @@ -820,11 +822,11 @@ describe('Market', function () { .emit(usdc, 'Transfer') .withArgs(marketAddr, takerAddr, askSideReward); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(marketAddr, institutionAddr, institutionReward); - await expect(tx) + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(marketAddr, financierAddr, platformReward); @@ -832,7 +834,7 @@ describe('Market', function () { .emit(artToken, 'Transfer') .withArgs(takerAddr, makerAddr, TOKEN_ID); - await expect(tx) + await expect(tx) // .emit(market, 'BidOrderExecuted') .withArgs( orderHash, @@ -1366,7 +1368,7 @@ describe('Market', function () { sender: taker, }); - await expect(tx).rejectedWith('SafeERC20BulkTransferIncorrectTotalAmount'); + await expect(tx).rejectedWith('CurrencyTransfersIncorrectTotalAmount'); }); it(`should fail if the sum of rewards is less than the ask side fee`, async () => { @@ -1402,7 +1404,7 @@ describe('Market', function () { sender: taker, }); - await expect(tx).rejectedWith('SafeERC20BulkTransferIncorrectTotalAmount'); + await expect(tx).rejectedWith('CurrencyTransfersIncorrectTotalAmount'); }); }); diff --git a/tests/RoleSystem.ts b/tests/RoleSystem.ts index e867bb8..e1317f6 100644 --- a/tests/RoleSystem.ts +++ b/tests/RoleSystem.ts @@ -85,12 +85,6 @@ describe('RoleSystem', function () { expect(hasRoleAfterRevoke).equal(false); }); - - it(`should fail if the account is the zero address`, async () => { - const hasRole = roleSystem.hasRole(ADMIN_ROLE, ZeroAddress); - - await expect(hasRole).rejectedWith('RoleSystemZeroAddress'); - }); }); }); @@ -99,15 +93,15 @@ describe('RoleSystem', function () { it(`should transfer a unique role`, async () => { const tx1 = await roleSystem.transferUniqueRole(ADMIN_ROLE, account); - await expect(tx1) + await expect(tx1) // .emit(roleSystem, 'UniqueRoleTransferred') - .withArgs(ADMIN_ROLE, accountAddr); + .withArgs(ADMIN_ROLE, ZeroAddress, accountAddr); const tx2 = await roleSystem.transferUniqueRole(ADMIN_ROLE, ZeroAddress); - await expect(tx2) + await expect(tx2) // .emit(roleSystem, 'UniqueRoleTransferred') - .withArgs(ADMIN_ROLE, ZeroAddress); + .withArgs(ADMIN_ROLE, accountAddr, ZeroAddress); }); it(`should fail if the sender is not the main account`, async () => { @@ -125,12 +119,6 @@ describe('RoleSystem', function () { expect(uniqueRoleOwner).equal(accountAddr); }); - - it(`should fail if the role does not have an owner`, async () => { - const tx = roleSystem.uniqueRoleOwner(ADMIN_ROLE); - - await expect(tx).rejectedWith('RoleSystemZeroAddress'); - }); }); }); }); diff --git a/tests/SafeERC20BulkTransfer.ts b/tests/SafeERC20BulkTransfer.ts deleted file mode 100644 index bb33d63..0000000 --- a/tests/SafeERC20BulkTransfer.ts +++ /dev/null @@ -1,3 +0,0 @@ -describe('SafeERC20BulkTransfer', function () { - it('should perform bulk transfer successfully'); -}); diff --git a/tests/utils/art-token-utils.ts b/tests/utils/art-token-utils.ts index a9aeac9..f794dca 100644 --- a/tests/utils/art-token-utils.ts +++ b/tests/utils/art-token-utils.ts @@ -14,11 +14,12 @@ type MintArgs = { permit: TokenMintingPermit.TypeStruct; permitSigner: Signer; sender: Signer; + value?: bigint; }; export class ArtTokenUtils { static async mint(args: MintArgs) { - const { artToken, permit, permitSigner, sender } = args; + const { artToken, permit, permitSigner, sender, value = 0n } = args; const domain = await this.buildDomain(artToken); @@ -30,7 +31,7 @@ export class ArtTokenUtils { { ...permit, tokenConfig: tokenConfigHash }, ); - return artToken.connect(sender).mint(permit, permitSignature); + return artToken.connect(sender).mint(permit, permitSignature, { value }); } static async buildDomain(artToken: ArtToken): Promise { From 2c24d0ada967016d6c99aab646a949447ac2239a Mon Sep 17 00:00:00 2001 From: mriynyk Date: Sun, 15 Feb 2026 19:12:58 +0700 Subject: [PATCH 02/14] hardhat tasks update --- config.collection.example.yaml | 7 ++-- hardhat.config.ts | 28 ++++----------- scripts/deploy-collection.ts | 6 ++-- scripts/deploy-market.ts | 5 +-- tasks/deploy-art-token-impl.ts | 11 +++--- tasks/deploy-auction-house-impl.ts | 14 +++++--- tasks/deploy-collection.ts | 7 ++-- tasks/deploy-market-impl.ts | 14 ++++---- tasks/deploy-market.ts | 5 +-- tasks/verify-art-token.ts | 23 ++++++------- tasks/verify-auction-house.ts | 23 ++++++------- tasks/verify-market.ts | 41 +++++++++++----------- types/environment.ts | 55 +++++++++++++----------------- 13 files changed, 109 insertions(+), 130 deletions(-) diff --git a/config.collection.example.yaml b/config.collection.example.yaml index 9c07fc6..70623a5 100644 --- a/config.collection.example.yaml +++ b/config.collection.example.yaml @@ -1,7 +1,6 @@ -name: 'DigitalOriginal' -symbol: 'DO' - sepolia: + name: 'DigitalOriginal' + symbol: 'DO' minAuctionDurationHours: 0.25 artToken: proxy: '' @@ -13,6 +12,8 @@ sepolia: admin: '' ethereum: + name: 'DigitalOriginal' + symbol: 'DO' minAuctionDurationHours: 24 artToken: proxy: '' diff --git a/hardhat.config.ts b/hardhat.config.ts index 1d7ec1e..cc41bfd 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -10,17 +10,14 @@ import type { HardhatUserConfig } from 'hardhat/config'; import type { NetworksUserConfig } from 'hardhat/types'; import type { ChainConfigYaml, - CollectionConfig, CollectionConfigYaml, EnvConfigYaml, - MarketConfig, MarketConfigYaml, ProtocolConfig, } from './types/environment'; const envConfigYaml = yaml.load(fs.readFileSync('./config.env.yaml', 'utf8')); const chainConfigYaml = yaml.load(fs.readFileSync('./config.chain.yaml', 'utf8')); - const collectionConfigYaml = ( yaml.load(fs.readFileSync('./config.collection.yaml', 'utf8')) ); @@ -77,34 +74,21 @@ function buildHardhatConfig(): HardhatUserConfig { const hardhatNetworksConfig: NetworksUserConfig = {}; for (const [chainName, chainConfig] of Object.entries(chainConfigYaml)) { - const collectionConfig = collectionConfigYaml[chainName]; - const marketConfig = marketConfigYaml[chainName]; - - const { chainId, url, deployerPrivateKey, main } = chainConfig; - - const collection: CollectionConfig = { - name: collectionConfigYaml.name, - symbol: collectionConfigYaml.symbol, - minAuctionDurationHours: collectionConfig.minAuctionDurationHours, - artToken: collectionConfig.artToken, - auctionHouse: collectionConfig.auctionHouse, - }; - - const market: MarketConfig = { - market: marketConfig.market, - }; + const { chainId, url, deployerPrivateKey, main, wrappedEther } = chainConfig; const protocolConfig: ProtocolConfig = { + collection: collectionConfigYaml[chainName], + market: marketConfigYaml[chainName], main, - collection, - market, + wrappedEther, }; hardhatNetworksConfig[chainName] = { chainId, url, accounts: [deployerPrivateKey], - ...{ protocolConfig }, + // @ts-ignore + protocolConfig, }; } diff --git a/scripts/deploy-collection.ts b/scripts/deploy-collection.ts index 74eb6c4..7fb7859 100644 --- a/scripts/deploy-collection.ts +++ b/scripts/deploy-collection.ts @@ -1,4 +1,4 @@ -import { AddressLike, Numeric, Signer } from 'ethers'; +import { AddressLike, Signer } from 'ethers'; import { UpgradedEvent, AdminChangedEvent, @@ -11,6 +11,7 @@ type Params = { name: string; symbol: string; main: AddressLike; + wrappedEther: AddressLike; minAuctionDuration: number; }; @@ -22,13 +23,14 @@ export async function deployCollection(params: Params, deployer?: Signer) { name, symbol, main, + wrappedEther, minAuctionDuration, } = params; const { receipt } = await deploy( { name: 'CollectionDeployer', - constructorArgs: [name, symbol, main, minAuctionDuration], + constructorArgs: [name, symbol, main, wrappedEther, minAuctionDuration], }, deployer, ); diff --git a/scripts/deploy-market.ts b/scripts/deploy-market.ts index d1bca96..d917563 100644 --- a/scripts/deploy-market.ts +++ b/scripts/deploy-market.ts @@ -9,18 +9,19 @@ import { deploy } from './deploy'; type Params = { main: AddressLike; + wrappedEther: AddressLike; }; // prettier-ignore export async function deployMarket(params: Params, deployer?: Signer) { const { ethers } = await import('hardhat'); - const { main } = params; + const { main, wrappedEther } = params; const { receipt } = await deploy( { name: 'MarketDeployer', - constructorArgs: [main], + constructorArgs: [main, wrappedEther], }, deployer, ); diff --git a/tasks/deploy-art-token-impl.ts b/tasks/deploy-art-token-impl.ts index ce12155..a0ea4c4 100644 --- a/tasks/deploy-art-token-impl.ts +++ b/tasks/deploy-art-token-impl.ts @@ -21,22 +21,23 @@ task('deploy-art-token-impl').setAction(async (taskArgs: Record, console.groupEnd(); console.log('-'.repeat(process.stdout.columns)); - const { main } = config; + const { main, wrappedEther } = config; const { artToken, auctionHouse } = config.collection; console.log(`Deploying ArtToken Impl...`); console.log(`\n`); console.group('Params:'); + console.log(`proxy: ${artToken.proxy}`); console.log(`main: ${main}`); - console.log(`artToken: ${artToken.proxy}`); + console.log(`wrappedEther: ${wrappedEther}`); console.log(`auctionHouse: ${auctionHouse.proxy}`); console.groupEnd(); console.log(`\n`); console.log(`Transaction broadcasting...`); - const { receipt, contractAddr: artTokenImplAddr } = await deploy({ + const { receipt, contractAddr } = await deploy({ name: 'ArtToken', - constructorArgs: [artToken.proxy, main, auctionHouse.proxy], + constructorArgs: [artToken.proxy, main, wrappedEther, auctionHouse.proxy], }); console.log(`Transaction broadcasted`); @@ -44,7 +45,7 @@ task('deploy-art-token-impl').setAction(async (taskArgs: Record, console.log('-'.repeat(process.stdout.columns)); console.group('Result:'); - console.log(`ArtToken Impl - ${artTokenImplAddr}`); + console.log(`ArtToken Impl - ${contractAddr}`); console.groupEnd(); console.log('-'.repeat(process.stdout.columns)); }); diff --git a/tasks/deploy-auction-house-impl.ts b/tasks/deploy-auction-house-impl.ts index 63eea32..d1145d6 100644 --- a/tasks/deploy-auction-house-impl.ts +++ b/tasks/deploy-auction-house-impl.ts @@ -21,7 +21,7 @@ task('deploy-auction-house-impl').setAction(async (taskArgs: Record, har console.groupEnd(); console.log('-'.repeat(process.stdout.columns)); - const { main } = config; + const { main, wrappedEther } = config; const { name, symbol, minAuctionDurationHours } = config.collection; - const minAuctionDuration = hoursToSeconds(minAuctionDurationHours); console.log(`Deploying collection...`); @@ -33,6 +32,7 @@ task('deploy-collection').setAction(async (taskArgs: Record, har console.log(`name: ${name}`); console.log(`symbol: ${symbol}`); console.log(`main: ${main}`); + console.log(`wrappedEther: ${wrappedEther}`); console.log(`minAuctionDurationHours: ${minAuctionDurationHours}`); console.log(`minAuctionDuration: ${minAuctionDuration}`); console.groupEnd(); @@ -52,9 +52,10 @@ task('deploy-collection').setAction(async (taskArgs: Record, har auctionHouseProxyAdminAddr, auctionHouseProxyAdminOwnerAddr, } = await deployCollection({ - main, name, symbol, + main, + wrappedEther, minAuctionDuration, }); diff --git a/tasks/deploy-market-impl.ts b/tasks/deploy-market-impl.ts index 38dc300..a9759d5 100644 --- a/tasks/deploy-market-impl.ts +++ b/tasks/deploy-market-impl.ts @@ -21,21 +21,21 @@ task('deploy-market-impl').setAction(async (taskArgs: Record, ha console.groupEnd(); console.log('-'.repeat(process.stdout.columns)); - const proxyAddr = config.market.market.proxy; - const mainAddr = config.main; + const { main, wrappedEther, market } = config; console.log(`Deploying Market Impl...`); console.log(`\n`); console.group('Params:'); - console.log(`proxy: ${proxyAddr}`); - console.log(`main: ${mainAddr}`); + console.log(`proxy: ${market.proxy}`); + console.log(`main: ${main}`); + console.log(`wrappedEther: ${wrappedEther}`); console.groupEnd(); console.log(`\n`); console.log(`Transaction broadcasting...`); - const { receipt, contractAddr: marketImplAddr } = await deploy({ + const { receipt, contractAddr } = await deploy({ name: 'Market', - constructorArgs: [proxyAddr, mainAddr], + constructorArgs: [market.proxy, main, wrappedEther], }); console.log(`Transaction broadcasted`); @@ -43,7 +43,7 @@ task('deploy-market-impl').setAction(async (taskArgs: Record, ha console.log('-'.repeat(process.stdout.columns)); console.group('Result:'); - console.log(`Market Impl - ${marketImplAddr}`); + console.log(`Market Impl - ${contractAddr}`); console.groupEnd(); console.log('-'.repeat(process.stdout.columns)); }); diff --git a/tasks/deploy-market.ts b/tasks/deploy-market.ts index 5f5b9de..deec4d8 100644 --- a/tasks/deploy-market.ts +++ b/tasks/deploy-market.ts @@ -21,18 +21,19 @@ task('deploy-market').setAction(async (taskArgs: Record, hardhat console.groupEnd(); console.log('-'.repeat(process.stdout.columns)); - const { main } = config; + const { main, wrappedEther } = config; console.log(`Deploying Market...`); console.log(`\n`); console.group('Params:'); console.log(`main: ${main}`); + console.log(`wrappedEther: ${wrappedEther}`); console.groupEnd(); console.log(`\n`); console.log(`Transaction broadcasting...`); const { receipt, marketAddr, marketProxyAdminAddr, marketProxyAdminOwnerAddr, marketImplAddr } = - await deployMarket({ main }); + await deployMarket({ main, wrappedEther }); console.log(`Transaction broadcasted`); console.log(`Transaction hash - ${receipt.hash}`); diff --git a/tasks/verify-art-token.ts b/tasks/verify-art-token.ts index 9883300..32e9b7c 100644 --- a/tasks/verify-art-token.ts +++ b/tasks/verify-art-token.ts @@ -20,35 +20,32 @@ task('verify-art-token').setAction(async (taskArgs: Record, hard console.groupEnd(); console.log('-'.repeat(process.stdout.columns)); - // TransparentUpgradeableProxy - const proxy = config.collection.artToken.proxy; - const impl = config.collection.artToken.impl; - const proxyAdminOwner = config.main; - - // ProxyAdmin - const proxyAdmin = config.collection.artToken.admin; - - // ArtToken - const main = config.main; + const { main, wrappedEther } = config; + const { proxy, impl, admin } = config.collection.artToken; const auctionHouse = config.collection.auctionHouse.proxy; + const proxyAdmin = admin; + const proxyAdminOwner = main; console.log(`Verify ArtToken...`); console.log(`\n`); console.group('Params:'); console.group(`TransparentUpgradeableProxy:`); - console.log(`proxy: ${proxy}`); + console.log(`address: ${proxy}`); console.log(`impl: ${impl}`); console.log(`proxyAdminOwner: ${proxyAdminOwner}`); console.groupEnd(); console.group(`ProxyAdmin:`); - console.log(`proxyAdmin: ${proxyAdmin}`); + console.log(`address: ${proxyAdmin}`); console.log(`proxyAdminOwner: ${proxyAdminOwner}`); console.groupEnd(); console.group(`ArtToken Impl:`); + console.log(`address: ${impl}`); + console.log(`proxy: ${proxy}`); console.log(`main: ${main}`); + console.log(`wrappedEther: ${wrappedEther}`); console.log(`auctionHouse: ${auctionHouse}`); console.groupEnd(); @@ -73,7 +70,7 @@ task('verify-art-token').setAction(async (taskArgs: Record, hard await hardhat.run('verify:verify', { contract: 'contracts/art-token/ArtToken.sol:ArtToken', address: impl, - constructorArguments: [proxy, main, auctionHouse], + constructorArguments: [proxy, main, wrappedEther, auctionHouse], }); console.log('-'.repeat(process.stdout.columns)); }); diff --git a/tasks/verify-auction-house.ts b/tasks/verify-auction-house.ts index fd7ffd9..0e1e8c0 100644 --- a/tasks/verify-auction-house.ts +++ b/tasks/verify-auction-house.ts @@ -21,36 +21,33 @@ task('verify-auction-house').setAction(async (taskArgs: Record, console.groupEnd(); console.log('-'.repeat(process.stdout.columns)); - // TransparentUpgradeableProxy - const proxy = config.collection.auctionHouse.proxy; - const impl = config.collection.auctionHouse.impl; - const proxyAdminOwner = config.main; - - // ProxyAdmin - const proxyAdmin = config.collection.auctionHouse.admin; - - // AuctionHouse - const main = config.main; + const { main, wrappedEther } = config; + const { proxy, impl, admin } = config.collection.auctionHouse; const artToken = config.collection.artToken.proxy; const minAuctionDuration = hoursToSeconds(config.collection.minAuctionDurationHours); + const proxyAdmin = admin; + const proxyAdminOwner = main; console.log(`Verify AuctionHouse...`); console.log(`\n`); console.group('Params:'); console.group(`TransparentUpgradeableProxy:`); - console.log(`proxy: ${proxy}`); + console.log(`address: ${proxy}`); console.log(`impl: ${impl}`); console.log(`proxyAdminOwner: ${proxyAdminOwner}`); console.groupEnd(); console.group(`ProxyAdmin:`); - console.log(`proxyAdmin: ${proxyAdmin}`); + console.log(`address: ${proxyAdmin}`); console.log(`proxyAdminOwner: ${proxyAdminOwner}`); console.groupEnd(); console.group(`AuctionHouse Impl:`); + console.log(`address: ${impl}`); + console.log(`proxy: ${proxy}`); console.log(`main: ${main}`); + console.log(`wrappedEther: ${wrappedEther}`); console.log(`artToken: ${artToken}`); console.log(`minAuctionDuration: ${minAuctionDuration}`); console.groupEnd(); @@ -76,7 +73,7 @@ task('verify-auction-house').setAction(async (taskArgs: Record, await hardhat.run('verify:verify', { contract: 'contracts/auction-house/AuctionHouse.sol:AuctionHouse', address: impl, - constructorArguments: [proxy, main, artToken, minAuctionDuration], + constructorArguments: [proxy, main, wrappedEther, artToken, minAuctionDuration], }); console.log('-'.repeat(process.stdout.columns)); }); diff --git a/tasks/verify-market.ts b/tasks/verify-market.ts index bd41989..d2ab3d9 100644 --- a/tasks/verify-market.ts +++ b/tasks/verify-market.ts @@ -20,34 +20,31 @@ task('verify-market').setAction(async (taskArgs: Record, hardhat console.groupEnd(); console.log('-'.repeat(process.stdout.columns)); - // TransparentUpgradeableProxy - const proxyAddr = config.market.market.proxy; - const implAddr = config.market.market.impl; - const proxyAdminOwnerAddr = config.main; - - // ProxyAdmin - const proxyAdminAddr = config.market.market.admin; - - // Market - const mainAddr = config.main; + const { main, wrappedEther } = config; + const { proxy, impl, admin } = config.market; + const proxyAdmin = admin; + const proxyAdminOwner = main; console.log(`Verify Market...`); console.log(`\n`); console.group('Params:'); console.group(`TransparentUpgradeableProxy:`); - console.log(`proxy: ${proxyAddr}`); - console.log(`impl: ${implAddr}`); - console.log(`proxyAdminOwner: ${proxyAdminOwnerAddr}`); + console.log(`address: ${proxy}`); + console.log(`impl: ${impl}`); + console.log(`proxyAdminOwner: ${proxyAdminOwner}`); console.groupEnd(); console.group(`ProxyAdmin:`); - console.log(`proxyAdmin: ${proxyAdminAddr}`); - console.log(`proxyAdminOwner: ${proxyAdminOwnerAddr}`); + console.log(`address: ${proxyAdmin}`); + console.log(`proxyAdminOwner: ${proxyAdminOwner}`); console.groupEnd(); console.group(`Market:`); - console.log(`main: ${mainAddr}`); + console.log(`address: ${impl}`); + console.log(`proxy: ${proxy}`); + console.log(`main: ${main}`); + console.log(`wrappedEther: ${wrappedEther}`); console.groupEnd(); console.groupEnd(); @@ -56,22 +53,22 @@ task('verify-market').setAction(async (taskArgs: Record, hardhat await hardhat.run('verify:verify', { contract: '@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy', - address: proxyAddr, - constructorArguments: [implAddr, proxyAdminOwnerAddr, new Uint8Array(0)], + address: proxy, + constructorArguments: [impl, proxyAdminOwner, new Uint8Array(0)], }); console.log(`\n`); await hardhat.run('verify:verify', { contract: '@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol:ProxyAdmin', - address: proxyAdminAddr, - constructorArguments: [proxyAdminOwnerAddr], + address: proxyAdmin, + constructorArguments: [proxyAdminOwner], }); console.log(`\n`); await hardhat.run('verify:verify', { contract: 'contracts/market/Market.sol:Market', - address: implAddr, - constructorArguments: [proxyAddr, mainAddr], + address: impl, + constructorArguments: [proxy, main, wrappedEther], }); console.log('-'.repeat(process.stdout.columns)); }); diff --git a/types/environment.ts b/types/environment.ts index 6490136..4452204 100644 --- a/types/environment.ts +++ b/types/environment.ts @@ -1,27 +1,38 @@ +/* ################### Env Config ############################# */ + +export type EnvConfigYaml = { + fork: { + name: string; + chainId: number; + url: string; + }; + reportGas: boolean; + etherscanApiKey: string; + coinmarketcapApiKey: string; +}; + /* ################### Chain Config ############################# */ export type ChainConfigYaml = { - [chainName: string]: ChainChainConfigYaml; + [chainName: string]: ChainConfig; }; -type ChainChainConfigYaml = { +type ChainConfig = { chainId: number; url: string; deployerPrivateKey: string; main: string; + wrappedEther: string; }; /* ################### Collection Config ############################# */ -export type CollectionConfigYaml = CollectionDataYaml & { - [chainName: string]: ChainCollectionConfigYaml; +export type CollectionConfigYaml = { + [chainName: string]: CollectionConfig; }; -type CollectionDataYaml = { +type CollectionConfig = { name: string; symbol: string; -}; - -type ChainCollectionConfigYaml = { minAuctionDurationHours: number; artToken: UpgradeableContractConfig; auctionHouse: UpgradeableContractConfig; @@ -30,34 +41,14 @@ type ChainCollectionConfigYaml = { /* ################### Market Config ############################# */ export type MarketConfigYaml = { - [chainName: string]: ChainMarketConfigYaml; -}; - -type ChainMarketConfigYaml = { - market: UpgradeableContractConfig; -}; - -/* ################### Env Config ############################# */ - -export type EnvConfigYaml = { - fork: { - name: string; - chainId: number; - url: string; - }; - reportGas: boolean; - etherscanApiKey: string; - coinmarketcapApiKey: string; + [chainName: string]: MarketConfig; }; -/* ################### Formatted Configs ############################# */ +type MarketConfig = UpgradeableContractConfig; -export type EnvConfig = EnvConfigYaml; -export type ChainConfig = ChainChainConfigYaml; -export type CollectionConfig = CollectionDataYaml & ChainCollectionConfigYaml; -export type MarketConfig = ChainMarketConfigYaml; +/* ################### Protocol Config ############################# */ -export type ProtocolConfig = Pick & { +export type ProtocolConfig = Pick & { collection: CollectionConfig; market: MarketConfig; }; From f16c6d2ad190ec4e3d6605cd36df38d35000f8d3 Mon Sep 17 00:00:00 2001 From: mriynyk Date: Mon, 16 Feb 2026 16:51:13 +0700 Subject: [PATCH 03/14] AuctionHouse tests --- contracts/market/Market.sol | 3 +- tests/ArtToken.ts | 4 +- tests/AuctionHouse.ts | 129 +++++++++++++++++++++++++++++++++++- 3 files changed, 131 insertions(+), 5 deletions(-) diff --git a/contracts/market/Market.sol b/contracts/market/Market.sol index 12b4d85..b57e88a 100644 --- a/contracts/market/Market.sol +++ b/contracts/market/Market.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.20; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; +import {ETHER} from "../utils/Constants.sol"; import {EIP712Domain} from "../utils/EIP712Domain.sol"; import {EIP712Signature} from "../utils/EIP712Signature.sol"; import {RoleSystem} from "../utils/role-system/RoleSystem.sol"; @@ -142,7 +143,7 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza revert MarketUnauthorizedAccount(); } - if (!_currencyAllowed(order.currency)) { + if (!_currencyAllowed(order.currency) || order.currency == ETHER) { revert MarketCurrencyInvalid(); } diff --git a/tests/ArtToken.ts b/tests/ArtToken.ts index 3c3dec7..a3ae925 100644 --- a/tests/ArtToken.ts +++ b/tests/ArtToken.ts @@ -368,8 +368,6 @@ describe('ArtToken', function () { value: TOKEN_PRICE + TOKEN_FEE - 1n, // Incorrect amount }); - await expect(tx1).rejectedWith('CurrencyTransfersIncorrectEtherValue'); - const tx2 = ArtTokenUtils.mint({ artToken, permit: tokenMintingPermit, @@ -378,6 +376,8 @@ describe('ArtToken', function () { value: TOKEN_PRICE + TOKEN_FEE + 1n, // Incorrect amount }); + await expect(tx1).rejectedWith('CurrencyTransfersIncorrectEtherValue'); + await expect(tx2).rejectedWith('CurrencyTransfersIncorrectEtherValue'); }); }); diff --git a/tests/AuctionHouse.ts b/tests/AuctionHouse.ts index 864af45..6a175fc 100644 --- a/tests/AuctionHouse.ts +++ b/tests/AuctionHouse.ts @@ -585,6 +585,62 @@ describe(`AuctionHouse`, () => { it(`should fail if the buyer is unauthorized`); }); + describe(`method 'raiseInitial' with Ether`, () => { + beforeEach(async () => { + const latestBlockTimestamp = await getLatestBlockTimestamp(); + + const auctionCreationPermit: AuctionCreationPermit.TypeStruct = { + auctionId: AUCTION_ID, + tokenId: TOKEN_ID, + currency: ETHER_ADDR, + price: AUCTION_PRICE, + fee: AUCTION_FEE, + step: AUCTION_STEP, + endTime: latestBlockTimestamp + HOUR, + tokenURI: TOKEN_URI, + tokenConfig: TOKEN_CONFIG, + participants: [institutionAddr], + shares: [ONE_HUNDRED], + deadline: latestBlockTimestamp + HOUR, + }; + + await AuctionHouseUtils.create({ + auctionHouse, + permit: auctionCreationPermit, + permitSigner: auctionHouseSigner, + sender: institution, + }); + }); + + it(`should raise`, async () => { + const { price: initialPrice, fee } = await auctionHouse.auction(AUCTION_ID); + + const tx = await auctionHouse + .connect(buyer) + .raiseInitial(AUCTION_ID, initialPrice, { value: initialPrice + fee }); + + await expect(tx).changeEtherBalance(auctionHouseAddr, initialPrice + fee); + + await expect(tx).changeEtherBalance(buyerAddr, (initialPrice + fee) * -1n); + }); + + it(`should fail if incorrect amount of ether is sent`, async () => { + const { price: initialPrice, fee } = await auctionHouse.auction(AUCTION_ID); + + const tx1 = auctionHouse + .connect(buyer) + .raiseInitial(AUCTION_ID, initialPrice, { value: initialPrice + fee + 1n }); // Incorrect amount + + const tx2 = auctionHouse + .connect(buyer) + .raiseInitial(AUCTION_ID, initialPrice, { value: initialPrice + fee - 1n }); // Incorrect amount + + await expect(tx1).rejectedWith('CurrencyTransfersIncorrectEtherValue'); + + await expect(tx2).rejectedWith('CurrencyTransfersIncorrectEtherValue'); + }); + }); + describe(`method 'raise'`, () => { beforeEach(async () => { const latestBlockTimestamp = await getLatestBlockTimestamp(); @@ -757,7 +813,23 @@ describe(`AuctionHouse`, () => { await expect(tx).changeEtherBalance(randomAccountAddr, initialPrice + fee); }); - // TODO: should fail if incorrect amount of ether is sent + it(`should fail if incorrect amount of ether is sent`, async () => { + const { price: initialPrice, step, fee } = await auctionHouse.auction(AUCTION_ID); + + const newPrice = initialPrice + step; + + const tx1 = auctionHouse + .connect(buyer) + .raise(AUCTION_ID, newPrice, { value: newPrice + fee + 1n }); // Incorrect amount + + const tx2 = auctionHouse + .connect(buyer) + .raise(AUCTION_ID, newPrice, { value: newPrice + fee - 1n }); // Incorrect amount + + await expect(tx1).rejectedWith('CurrencyTransfersIncorrectEtherValue'); + + await expect(tx2).rejectedWith('CurrencyTransfersIncorrectEtherValue'); + }); }); describe(`method 'finish'`, async () => { @@ -810,6 +882,10 @@ describe(`AuctionHouse`, () => { .emit(artToken, 'Transfer') .withArgs(ZeroAddress, buyerAddr, TOKEN_ID); + await expect(tx) // + .emit(usdc, 'Transfer') + .withArgs(auctionHouseAddr, institutionAddr, price); + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(auctionHouseAddr, financierAddr, fee); @@ -1015,7 +1091,7 @@ describe(`AuctionHouse`, () => { }); }); - describe(`ShareUtils`, () => { + describe(`currency distribution`, () => { beforeEach(async () => { await usdc.connect(buyer).mintAndApprove(auctionHouse, MaxInt256); }); @@ -1291,4 +1367,53 @@ describe(`AuctionHouse`, () => { await expect(tx).rejectedWith('ShareUtilsZeroShare'); }); }); + + describe(`currency distribution with Ether`, () => { + it(`should distribute the price among participants according to shares`, async () => { + const latestBlockTimestamp = await getLatestBlockTimestamp(); + const endTime = latestBlockTimestamp + HOUR; + + const institutionShare = (ONE_HUNDRED / 5n) * 4n; // 80% + const platformShare = ONE_HUNDRED / 5n; // 20% + + const auctionCreationPermit: AuctionCreationPermit.TypeStruct = { + auctionId: AUCTION_ID, + tokenId: TOKEN_ID, + currency: ETHER_ADDR, + price: AUCTION_PRICE, + fee: AUCTION_FEE, + step: AUCTION_STEP, + endTime: endTime, + tokenURI: TOKEN_URI, + tokenConfig: TOKEN_CONFIG, + participants: [institutionAddr, financierAddr], + shares: [institutionShare, platformShare], + deadline: latestBlockTimestamp + HOUR, + }; + + await AuctionHouseUtils.create({ + auctionHouse, + permit: auctionCreationPermit, + permitSigner: auctionHouseSigner, + sender: institution, + }); + + await auctionHouse + .connect(buyer) + .raiseInitial(AUCTION_ID, AUCTION_PRICE, { value: AUCTION_PRICE + AUCTION_FEE }); + + await setNextBlockTimestamp(endTime); + + const tx = await auctionHouse.connect(buyer).finish(AUCTION_ID); + + const institutionReward = (AUCTION_PRICE * institutionShare) / ONE_HUNDRED; + const platformReward = (AUCTION_PRICE * platformShare) / ONE_HUNDRED; + + await expect(tx).changeEtherBalance(auctionHouseAddr, (AUCTION_PRICE + AUCTION_FEE) * -1n); + + await expect(tx).changeEtherBalance(institutionAddr, institutionReward); + + await expect(tx).changeEtherBalance(financierAddr, platformReward + AUCTION_FEE); + }); + }); }); From 76b323936c2f523f2b4e439b1547a3e6dc1e5962 Mon Sep 17 00:00:00 2001 From: mriynyk Date: Tue, 17 Feb 2026 15:06:45 +0700 Subject: [PATCH 04/14] Market tests --- tests/ArtToken.ts | 2 +- tests/AuctionHouse.ts | 11 +- tests/Market.ts | 211 +++++++++++++++++++++++++++++++++++- tests/utils/market-utils.ts | 7 +- 4 files changed, 223 insertions(+), 8 deletions(-) diff --git a/tests/ArtToken.ts b/tests/ArtToken.ts index a3ae925..15d54d4 100644 --- a/tests/ArtToken.ts +++ b/tests/ArtToken.ts @@ -308,7 +308,7 @@ describe('ArtToken', function () { }); describe(`method 'mint' with Ether`, () => { - it(`should mint, distribute price, and charge a fee`, async () => { + it(`should transfer ether correctly`, async () => { const latestBlockTimestamp = await getLatestBlockTimestamp(); const institutionReward = (TOKEN_PRICE / 5n) * 4n; // 80% diff --git a/tests/AuctionHouse.ts b/tests/AuctionHouse.ts index 6a175fc..102f8ca 100644 --- a/tests/AuctionHouse.ts +++ b/tests/AuctionHouse.ts @@ -612,7 +612,7 @@ describe(`AuctionHouse`, () => { }); }); - it(`should raise`, async () => { + it(`should transfer ether correctly`, async () => { const { price: initialPrice, fee } = await auctionHouse.auction(AUCTION_ID); const tx = await auctionHouse @@ -797,7 +797,7 @@ describe(`AuctionHouse`, () => { .raiseInitial(AUCTION_ID, AUCTION_PRICE, { value: AUCTION_PRICE + AUCTION_FEE }); }); - it(`should raise`, async () => { + it(`should transfer ether correctly`, async () => { const { price: initialPrice, step, fee } = await auctionHouse.auction(AUCTION_ID); const newPrice = initialPrice + step; @@ -1369,7 +1369,7 @@ describe(`AuctionHouse`, () => { }); describe(`currency distribution with Ether`, () => { - it(`should distribute the price among participants according to shares`, async () => { + it(`should transfer ether correctly`, async () => { const latestBlockTimestamp = await getLatestBlockTimestamp(); const endTime = latestBlockTimestamp + HOUR; @@ -1409,7 +1409,10 @@ describe(`AuctionHouse`, () => { const institutionReward = (AUCTION_PRICE * institutionShare) / ONE_HUNDRED; const platformReward = (AUCTION_PRICE * platformShare) / ONE_HUNDRED; - await expect(tx).changeEtherBalance(auctionHouseAddr, (AUCTION_PRICE + AUCTION_FEE) * -1n); + await expect(tx).changeEtherBalance( + auctionHouseAddr, + (AUCTION_PRICE + AUCTION_FEE) * -1n, + ); await expect(tx).changeEtherBalance(institutionAddr, institutionReward); diff --git a/tests/Market.ts b/tests/Market.ts index 090993e..3a335c3 100644 --- a/tests/Market.ts +++ b/tests/Market.ts @@ -4,7 +4,7 @@ import { ArtToken, Market, USDC } from '../typechain-types'; import { TokenMintingPermit } from '../typechain-types/contracts/art-token/ArtToken'; import { Order, OrderExecutionPermit } from '../typechain-types/contracts/market/Market'; import { TOKEN_CONFIG, TOKEN_FEE, TOKEN_ID, TOKEN_PRICE, TOKEN_URI } from './constants/art-token'; -import { HOUR } from './constants/general'; +import { ETHER_ADDR, HOUR } from './constants/general'; import { ORDER_PRICE, ASK_SIDE_FEE, BID_SIDE_FEE, ASK_SIDE, BID_SIDE } from './constants/market'; import { getSigners } from './utils/get-signers'; import { getLatestBlockTimestamp } from './utils/get-latest-block-timestamp'; @@ -729,6 +729,177 @@ describe('Market', function () { await expect(tx).rejectedWith('CurrencyTransfersIncorrectTotalAmount'); }); + + it(`should fail if unexpected ether is sent`, async () => { + const latestBlockTimestamp = await getLatestBlockTimestamp(); + + const order: Order.TypeStruct = { + side: ASK_SIDE, + collection: artTokenAddr, + currency: usdcAddr, + maker: makerAddr, + tokenId: TOKEN_ID, + price: ORDER_PRICE, + makerFee: ASK_SIDE_FEE, + startTime: latestBlockTimestamp, + endTime: latestBlockTimestamp + HOUR, + }; + + const orderHash = MarketUtils.hashOrder(order); + + const orderExecutionPermit: OrderExecutionPermit.TypeStruct = { + orderHash, + taker: takerAddr, + takerFee: BID_SIDE_FEE, + participants: [institutionAddr], + rewards: [ASK_SIDE_FEE], + deadline: latestBlockTimestamp + HOUR, + }; + + const tx = MarketUtils.executeAsk({ + market, + order, + permit: orderExecutionPermit, + orderSigner: maker, + permitSigner: marketSigner, + sender: taker, + value: 1n, // Unexpected ether + }); + + await expect(tx).rejectedWith('CurrencyTransfersUnexpectedEther'); + }); + }); + + describe(`method 'executeAsk' with Ether`, () => { + beforeEach(async () => { + const latestBlockTimestamp = await getLatestBlockTimestamp(); + + const tokenMintingPermit: TokenMintingPermit.TypeStruct = { + tokenId: TOKEN_ID, + minter: makerAddr, + currency: usdcAddr, + price: TOKEN_PRICE, + fee: TOKEN_FEE, + tokenURI: TOKEN_URI, + tokenConfig: TOKEN_CONFIG, + participants: [institutionAddr], + rewards: [TOKEN_PRICE], + deadline: latestBlockTimestamp + HOUR, + }; + + await usdc.connect(maker).mintAndApprove(artToken, MaxInt256); + + await ArtTokenUtils.mint({ + artToken, + permit: tokenMintingPermit, + permitSigner: marketSigner, + sender: maker, + }); + + await artToken.connect(maker).approve(marketAddr, TOKEN_ID); + }); + + it(`should transfer ether correctly`, async () => { + const latestBlockTimestamp = await getLatestBlockTimestamp(); + + const askSideReward = ORDER_PRICE - ASK_SIDE_FEE; + const platformReward = 100n; + const institutionReward = ASK_SIDE_FEE - platformReward; + + const order: Order.TypeStruct = { + side: ASK_SIDE, + collection: artTokenAddr, + currency: ETHER_ADDR, + maker: makerAddr, + tokenId: TOKEN_ID, + price: ORDER_PRICE, + makerFee: ASK_SIDE_FEE, + startTime: latestBlockTimestamp, + endTime: latestBlockTimestamp + HOUR, + }; + + const orderHash = MarketUtils.hashOrder(order); + + const orderExecutionPermit: OrderExecutionPermit.TypeStruct = { + orderHash, + taker: takerAddr, + takerFee: BID_SIDE_FEE, + participants: [institutionAddr, financierAddr], + rewards: [institutionReward, platformReward], + deadline: latestBlockTimestamp + HOUR, + }; + + const tx = await MarketUtils.executeAsk({ + market, + order, + permit: orderExecutionPermit, + orderSigner: maker, + permitSigner: marketSigner, + sender: taker, + value: ORDER_PRICE + BID_SIDE_FEE, + }); + + await expect(tx).changeEtherBalance(marketAddr, 0n); + + await expect(tx).changeEtherBalance(takerAddr, (ORDER_PRICE + BID_SIDE_FEE) * -1n); + + await expect(tx).changeEtherBalance(makerAddr, askSideReward); + + await expect(tx).changeEtherBalance(institutionAddr, institutionReward); + + await expect(tx).changeEtherBalance(financierAddr, BID_SIDE_FEE + platformReward); + }); + + it(`should fail if incorrect amount of ether is sent`, async () => { + const latestBlockTimestamp = await getLatestBlockTimestamp(); + + const order: Order.TypeStruct = { + side: ASK_SIDE, + collection: artTokenAddr, + currency: ETHER_ADDR, + maker: makerAddr, + tokenId: TOKEN_ID, + price: ORDER_PRICE, + makerFee: ASK_SIDE_FEE, + startTime: latestBlockTimestamp, + endTime: latestBlockTimestamp + HOUR, + }; + + const orderHash = MarketUtils.hashOrder(order); + + const orderExecutionPermit: OrderExecutionPermit.TypeStruct = { + orderHash, + taker: takerAddr, + takerFee: BID_SIDE_FEE, + participants: [institutionAddr], + rewards: [ASK_SIDE_FEE], + deadline: latestBlockTimestamp + HOUR, + }; + + const tx1 = MarketUtils.executeAsk({ + market, + order, + permit: orderExecutionPermit, + orderSigner: maker, + permitSigner: marketSigner, + sender: taker, + value: ORDER_PRICE + BID_SIDE_FEE + 1n, // Too much ether + }); + + const tx2 = MarketUtils.executeAsk({ + market, + order, + permit: orderExecutionPermit, + orderSigner: maker, + permitSigner: marketSigner, + sender: taker, + value: ORDER_PRICE + BID_SIDE_FEE - 1n, // Too little ether + }); + + await expect(tx1).rejectedWith('CurrencyTransfersIncorrectEtherValue'); + + await expect(tx2).rejectedWith('CurrencyTransfersIncorrectEtherValue'); + }); }); describe(`method 'executeBid'`, () => { @@ -1406,6 +1577,44 @@ describe('Market', function () { await expect(tx).rejectedWith('CurrencyTransfersIncorrectTotalAmount'); }); + + it(`should fail if currency is ether`, async () => { + const latestBlockTimestamp = await getLatestBlockTimestamp(); + + const order: Order.TypeStruct = { + side: BID_SIDE, + collection: artTokenAddr, + currency: ETHER_ADDR, + maker: makerAddr, + tokenId: TOKEN_ID, + price: ORDER_PRICE, + makerFee: BID_SIDE_FEE, + startTime: latestBlockTimestamp, + endTime: latestBlockTimestamp + HOUR, + }; + + const orderHash = MarketUtils.hashOrder(order); + + const orderExecutionPermit: OrderExecutionPermit.TypeStruct = { + orderHash, + taker: takerAddr, + takerFee: ASK_SIDE_FEE, + participants: [institutionAddr], + rewards: [ASK_SIDE_FEE], + deadline: latestBlockTimestamp + HOUR, + }; + + const tx = MarketUtils.executeBid({ + market, + order, + permit: orderExecutionPermit, + orderSigner: maker, + permitSigner: marketSigner, + sender: taker, + }); + + await expect(tx).rejectedWith('MarketCurrencyInvalid'); + }); }); describe(`method 'invalidateOrder'`, () => { diff --git a/tests/utils/market-utils.ts b/tests/utils/market-utils.ts index 82879cb..e18fa11 100644 --- a/tests/utils/market-utils.ts +++ b/tests/utils/market-utils.ts @@ -16,6 +16,7 @@ type ExecuteAskArgs = { orderSigner: Signer; permitSigner: Signer; sender: Signer; + value?: bigint; }; type ExecuteBidArgs = { @@ -29,7 +30,7 @@ type ExecuteBidArgs = { export class MarketUtils { static async executeAsk(args: ExecuteAskArgs) { - const { market, order, permit, orderSigner, permitSigner, sender } = args; + const { market, order, permit, orderSigner, permitSigner, sender, value = 0n } = args; const domain = await this.buildDomain(market); @@ -41,7 +42,9 @@ export class MarketUtils { permit, ); - return market.connect(sender).executeAsk(order, permit, orderSignature, permitSignature); + return market + .connect(sender) + .executeAsk(order, permit, orderSignature, permitSignature, { value }); } static async executeBid(args: ExecuteBidArgs) { From 260e23133b89e0ae94a42e2c85d32239011a6984 Mon Sep 17 00:00:00 2001 From: mriynyk Date: Thu, 19 Feb 2026 16:15:01 +0700 Subject: [PATCH 05/14] Minor changes --- .lintstagedrc | 2 +- .solhintignore | 1 + contracts/art-token/ArtToken.sol | 2 +- .../art-token-config-manager/ArtTokenConfigManager.sol | 1 + .../art-token-config-manager/IArtTokenConfigManager.sol | 1 + contracts/art-token/libraries/TokenMintingPermit.sol | 1 + contracts/auction-house/libraries/Auction.sol | 1 + contracts/auction-house/libraries/AuctionCreationPermit.sol | 1 + contracts/utils/IWrappedEther.sol | 1 + contracts/utils/TokenConfig.sol | 1 + 10 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.lintstagedrc b/.lintstagedrc index 2d8bc7d..47a20b0 100644 --- a/.lintstagedrc +++ b/.lintstagedrc @@ -4,6 +4,6 @@ ], "*.sol": [ "prettier --write", - "solhint --max-warnings 0" + "solhint" ] } diff --git a/.solhintignore b/.solhintignore index 3c3629e..779a30f 100644 --- a/.solhintignore +++ b/.solhintignore @@ -1 +1,2 @@ node_modules +contracts/tests/** diff --git a/contracts/art-token/ArtToken.sol b/contracts/art-token/ArtToken.sol index cec14ff..0416c94 100644 --- a/contracts/art-token/ArtToken.sol +++ b/contracts/art-token/ArtToken.sol @@ -112,7 +112,7 @@ contract ArtToken is /** * @inheritdoc IArtToken */ - function setTokenURI(uint256 tokenId, string memory _tokenURI) external onlyRole(Roles.ADMIN_ROLE) { + function setTokenURI(uint256 tokenId, string calldata _tokenURI) external onlyRole(Roles.ADMIN_ROLE) { if (_ownerOf(tokenId) == address(0)) { revert ArtTokenNonexistentToken(tokenId); } diff --git a/contracts/art-token/art-token-config-manager/ArtTokenConfigManager.sol b/contracts/art-token/art-token-config-manager/ArtTokenConfigManager.sol index fc75bba..989f044 100644 --- a/contracts/art-token/art-token-config-manager/ArtTokenConfigManager.sol +++ b/contracts/art-token/art-token-config-manager/ArtTokenConfigManager.sol @@ -9,6 +9,7 @@ import {IArtTokenConfigManager} from "./IArtTokenConfigManager.sol"; /** * @title ArtTokenConfigManager + * * @notice Abstract contract that implements the logic for managing token configurations. * @dev This contract is intended to be inherited by other contracts to provide token * configuration management functionality. It uses `ArtTokenConfigManagerStorage` diff --git a/contracts/art-token/art-token-config-manager/IArtTokenConfigManager.sol b/contracts/art-token/art-token-config-manager/IArtTokenConfigManager.sol index 7af0f50..be82666 100644 --- a/contracts/art-token/art-token-config-manager/IArtTokenConfigManager.sol +++ b/contracts/art-token/art-token-config-manager/IArtTokenConfigManager.sol @@ -5,6 +5,7 @@ import {TokenConfig} from "../../utils/TokenConfig.sol"; /** * @title IArtTokenConfigManager + * * @notice Manages configuration for individual tokens, such as creator and regulation mode. */ interface IArtTokenConfigManager { diff --git a/contracts/art-token/libraries/TokenMintingPermit.sol b/contracts/art-token/libraries/TokenMintingPermit.sol index 3473272..30acb64 100644 --- a/contracts/art-token/libraries/TokenMintingPermit.sol +++ b/contracts/art-token/libraries/TokenMintingPermit.sol @@ -5,6 +5,7 @@ import {TokenConfig} from "../../utils/TokenConfig.sol"; /** * @title TokenMintingPermit + * * @notice EIP-712 struct for a token minting permit, which authorizes the minting of a new token with specified * parameters. */ diff --git a/contracts/auction-house/libraries/Auction.sol b/contracts/auction-house/libraries/Auction.sol index 2de18bc..1eddd27 100644 --- a/contracts/auction-house/libraries/Auction.sol +++ b/contracts/auction-house/libraries/Auction.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.20; /** * @title Auction + * * @notice A library that defines the data structure for an auction. */ library Auction { diff --git a/contracts/auction-house/libraries/AuctionCreationPermit.sol b/contracts/auction-house/libraries/AuctionCreationPermit.sol index 4356a18..d6534dd 100644 --- a/contracts/auction-house/libraries/AuctionCreationPermit.sol +++ b/contracts/auction-house/libraries/AuctionCreationPermit.sol @@ -5,6 +5,7 @@ import {TokenConfig} from "../../utils/TokenConfig.sol"; /** * @title AuctionCreationPermit + * * @notice EIP-712 struct for an auction creation permit, which authorizes the creation of a new auction with * specified parameters. */ diff --git a/contracts/utils/IWrappedEther.sol b/contracts/utils/IWrappedEther.sol index 8bcc8d7..9fe7dd6 100644 --- a/contracts/utils/IWrappedEther.sol +++ b/contracts/utils/IWrappedEther.sol @@ -5,6 +5,7 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /** * @title IWrappedEther + * * @notice Defines the interface for the wrapped ether external contract. */ interface IWrappedEther is IERC20 { diff --git a/contracts/utils/TokenConfig.sol b/contracts/utils/TokenConfig.sol index 0a1887f..a90d5b2 100644 --- a/contracts/utils/TokenConfig.sol +++ b/contracts/utils/TokenConfig.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.20; /** * @title TokenConfig + * * @notice A library for managing token configuration, including creator and regulation mode. */ library TokenConfig { From 9398ec821ab41499bb3e7ddd7d1291d561adb888 Mon Sep 17 00:00:00 2001 From: mriynyk Date: Thu, 19 Feb 2026 19:35:40 +0700 Subject: [PATCH 06/14] check if token config is populated --- contracts/art-token/ArtToken.sol | 11 ++++++---- ...RoyaltyManager.sol => ArtTokenRoyalty.sol} | 4 ++-- contracts/art-token/IArtToken.sol | 8 ++++---- .../libraries/TokenMintingPermit.sol | 1 - contracts/auction-house/AuctionHouse.sol | 20 ++++++++++++++----- contracts/auction-house/IAuctionHouse.sol | 8 ++++++-- contracts/market/IMarket.sol | 4 ++-- contracts/utils/TokenConfig.sol | 12 +++++++++++ 8 files changed, 48 insertions(+), 20 deletions(-) rename contracts/art-token/{ArtTokenRoyaltyManager.sol => ArtTokenRoyalty.sol} (92%) diff --git a/contracts/art-token/ArtToken.sol b/contracts/art-token/ArtToken.sol index 0416c94..22d41c3 100644 --- a/contracts/art-token/ArtToken.sol +++ b/contracts/art-token/ArtToken.sol @@ -11,7 +11,7 @@ import {Roles} from "../utils/Roles.sol"; import {IAuctionHouse} from "../auction-house/IAuctionHouse.sol"; import {ArtTokenConfigManager} from "./art-token-config-manager/ArtTokenConfigManager.sol"; import {TokenMintingPermit} from "./libraries/TokenMintingPermit.sol"; -import {ArtTokenRoyaltyManager} from "./ArtTokenRoyaltyManager.sol"; +import {ArtTokenRoyalty} from "./ArtTokenRoyalty.sol"; import {ArtTokenBase} from "./ArtTokenBase.sol"; import {IArtToken} from "./IArtToken.sol"; @@ -30,9 +30,10 @@ contract ArtToken is Authorization, CurrencyManager, ArtTokenConfigManager, - ArtTokenRoyaltyManager, + ArtTokenRoyalty, CurrencyTransfers { + using TokenConfig for TokenConfig.Type; using TokenMintingPermit for TokenMintingPermit.Type; /// @notice Address of the accompanying AuctionHouse contract. @@ -80,6 +81,8 @@ contract ArtToken is function mint(TokenMintingPermit.Type calldata permit, bytes calldata permitSignature) external payable { _requireAuthorizedAction(permit.hash(), permit.deadline, permitSignature); + permit.tokenConfig.requirePopulated(); + if (permit.minter != msg.sender) { revert ArtTokenUnauthorizedAccount(msg.sender); } @@ -93,7 +96,7 @@ contract ArtToken is } if (AUCTION_HOUSE.tokenReserved(permit.tokenId)) { - revert ArtTokenTokenReserved(); + revert ArtTokenTokenReservedByAuction(); } if (!_currencyAllowed(permit.currency)) { @@ -123,7 +126,7 @@ contract ArtToken is /** * @inheritdoc IArtToken */ - function tokenReserved(uint256 tokenId) external view returns (bool reserved) { + function tokenExists(uint256 tokenId) external view returns (bool reserved) { return _ownerOf(tokenId) != address(0); } diff --git a/contracts/art-token/ArtTokenRoyaltyManager.sol b/contracts/art-token/ArtTokenRoyalty.sol similarity index 92% rename from contracts/art-token/ArtTokenRoyaltyManager.sol rename to contracts/art-token/ArtTokenRoyalty.sol index d3f01c0..ca69243 100644 --- a/contracts/art-token/ArtTokenRoyaltyManager.sol +++ b/contracts/art-token/ArtTokenRoyalty.sol @@ -6,14 +6,14 @@ import {ArtTokenConfigManager} from "./art-token-config-manager/ArtTokenConfigMa import {ONE_HUNDRED_PERCENT_IN_BP} from "../utils/Constants.sol"; /** - * @title ArtTokenRoyaltyManager + * @title ArtTokenRoyalty * * @notice Abstract contract that provides a basic implementation of the EIP-2981 royalty standard. * * @dev This implementation calculates a fixed 5% royalty on the sale price and designates the * original token creator as the royalty recipient. */ -abstract contract ArtTokenRoyaltyManager is IERC2981, ArtTokenConfigManager { +abstract contract ArtTokenRoyalty is IERC2981, ArtTokenConfigManager { /** * @notice The royalty percentage in basis points - 5%. */ diff --git a/contracts/art-token/IArtToken.sol b/contracts/art-token/IArtToken.sol index d351cc9..86aabff 100644 --- a/contracts/art-token/IArtToken.sol +++ b/contracts/art-token/IArtToken.sol @@ -43,13 +43,13 @@ interface IArtToken is IERC721 { function setTokenURI(uint256 tokenId, string memory _tokenURI) external; /** - * @notice Returns whether `tokenId` has already been minted (i.e., is reserved). + * @notice Returns whether `tokenId` has already been minted. * * @param tokenId Token identifier to query. * * @return reserved True if the token exists, false otherwise. */ - function tokenReserved(uint256 tokenId) external view returns (bool reserved); + function tokenExists(uint256 tokenId) external view returns (bool reserved); /** * @notice Checks whether `account` passes the collection's compliance rules. @@ -75,8 +75,8 @@ interface IArtToken is IERC721 { /// @dev Thrown when `fee` supplied to {buy} is below the minimum configured fee. error ArtTokenInvalidFee(); - /// @dev Thrown when attempting to mint or purchase a token that is already owned / reserved. - error ArtTokenTokenReserved(); + /// @dev Thrown when attempting to mint or purchase a token that is reserved by an auction. + error ArtTokenTokenReservedByAuction(); /// @dev Thrown when a constructor argument under the provided `argIndex` is invalid (e.g., zero address). error ArtTokenMisconfiguration(uint8 argIndex); diff --git a/contracts/art-token/libraries/TokenMintingPermit.sol b/contracts/art-token/libraries/TokenMintingPermit.sol index 30acb64..73f301b 100644 --- a/contracts/art-token/libraries/TokenMintingPermit.sol +++ b/contracts/art-token/libraries/TokenMintingPermit.sol @@ -11,7 +11,6 @@ import {TokenConfig} from "../../utils/TokenConfig.sol"; */ library TokenMintingPermit { using TokenConfig for TokenConfig.Type; - using TokenMintingPermit for TokenMintingPermit.Type; /** * @notice Represents a token minting permit. diff --git a/contracts/auction-house/AuctionHouse.sol b/contracts/auction-house/AuctionHouse.sol index dc4acfe..2dcbe65 100644 --- a/contracts/auction-house/AuctionHouse.sol +++ b/contracts/auction-house/AuctionHouse.sol @@ -6,6 +6,7 @@ import {RoleSystem} from "../utils/role-system/RoleSystem.sol"; import {Authorization} from "../utils/Authorization.sol"; import {CurrencyManager} from "../utils/currency-manager/CurrencyManager.sol"; import {CurrencyTransfers} from "../utils/CurrencyTransfers.sol"; +import {TokenConfig} from "../utils/TokenConfig.sol"; import {Roles} from "../utils/Roles.sol"; import {IArtToken} from "../art-token/IArtToken.sol"; import {ShareUtils} from "./libraries/ShareUtils.sol"; @@ -23,6 +24,7 @@ import {IAuctionHouse} from "./IAuctionHouse.sol"; * split between participants and the protocol treasury. */ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, CurrencyManager, CurrencyTransfers { + using TokenConfig for TokenConfig.Type; using AuctionCreationPermit for AuctionCreationPermit.Type; /// @notice Address of the associated {ArtToken} contract. @@ -134,8 +136,12 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, AuctionCreationPermit.Type calldata permit, bytes calldata permitSignature ) external auctionNotExist(permit.auctionId) { + AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); + _requireAuthorizedAction(permit.hash(), permit.deadline, permitSignature); + permit.tokenConfig.requirePopulated(); + if (permit.price == 0) { revert AuctionHouseInvalidPrice(); } @@ -161,17 +167,15 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, } if (_tokenReserved(permit.tokenId)) { - revert AuctionHouseTokenReserved(); + revert AuctionHouseTokenReserved($.tokenAuctionId[permit.tokenId]); } - if (ART_TOKEN.tokenReserved(permit.tokenId)) { - revert AuctionHouseTokenReserved(); + if (ART_TOKEN.tokenExists(permit.tokenId)) { + revert AuctionHouseTokenAlreadyMinted(); } ShareUtils.requireValidConditions(permit.participants, permit.shares); - AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); - $.auction[permit.auctionId] = Auction.Type({ tokenId: permit.tokenId, price: permit.price, @@ -390,6 +394,12 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, if (_auctionWithBuyer(auctionId)) { // The auction has a buyer + + /** + * If a buyer exists, the token remains reserved by the auction + * even after the auction ends and the token is minted. + * This behavior fully matches the current logic. + */ return true; } diff --git a/contracts/auction-house/IAuctionHouse.sol b/contracts/auction-house/IAuctionHouse.sol index 5095a42..95750e1 100644 --- a/contracts/auction-house/IAuctionHouse.sol +++ b/contracts/auction-house/IAuctionHouse.sol @@ -110,8 +110,12 @@ interface IAuctionHouse { /// @dev Thrown when a currency is invalid. error AuctionHouseInvalidCurrency(); - /// @dev Thrown when the token is already reserved by an auction. - error AuctionHouseTokenReserved(); + /// @dev Thrown when the token is already reserved by another auction. + /// @param existingAuctionId The ID of the auction that has reserved the token. + error AuctionHouseTokenReserved(uint256 existingAuctionId); + + /// @dev Thrown when the token has already been minted. + error AuctionHouseTokenAlreadyMinted(); /// @dev Thrown when trying to set a buyer but one already exists. error AuctionHouseBuyerExists(); diff --git a/contracts/market/IMarket.sol b/contracts/market/IMarket.sol index 0eed624..3e8d166 100644 --- a/contracts/market/IMarket.sol +++ b/contracts/market/IMarket.sol @@ -19,8 +19,8 @@ interface IMarket { * @param currency Address of the settlement currency (ERC-20). * @param maker Address of the seller. * @param taker Address of the buyer. - * @param price The price at which the token was sold. * @param tokenId The identifier of the token that was sold. + * @param price The price at which the token was sold. */ event AskOrderExecuted( bytes32 orderHash, @@ -40,8 +40,8 @@ interface IMarket { * @param currency Address of the settlement currency (ERC-20). * @param maker Address of the buyer. * @param taker Address of the seller. - * @param price The price at which the token was bought. * @param tokenId The identifier of the token that was bought. + * @param price The price at which the token was bought. */ event BidOrderExecuted( bytes32 orderHash, diff --git a/contracts/utils/TokenConfig.sol b/contracts/utils/TokenConfig.sol index a90d5b2..854ea9e 100644 --- a/contracts/utils/TokenConfig.sol +++ b/contracts/utils/TokenConfig.sol @@ -51,4 +51,16 @@ library TokenConfig { function hash(Type calldata config) internal pure returns (bytes32) { return keccak256(abi.encode(TYPE_HASH, config.creator, config.regulationMode)); } + + function requirePopulated(TokenConfig.Type calldata tokenConfig) internal pure { + if (tokenConfig.creator == address(0)) { + revert TokenConfigNotPopulated(); + } + + if (tokenConfig.regulationMode == TokenConfig.RegulationMode.None) { + revert TokenConfigNotPopulated(); + } + } + + error TokenConfigNotPopulated(); } From dc7fdff359693ba55d5a06582d340ce0264fb619 Mon Sep 17 00:00:00 2001 From: mriynyk Date: Fri, 20 Feb 2026 16:43:15 +0700 Subject: [PATCH 07/14] minor test changes --- contracts/art-token/ArtToken.sol | 2 +- contracts/art-token/IArtToken.sol | 4 ++-- tests/ArtToken.ts | 2 +- tests/AuctionHouse.ts | 16 ++++++++++------ 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/contracts/art-token/ArtToken.sol b/contracts/art-token/ArtToken.sol index 22d41c3..917564a 100644 --- a/contracts/art-token/ArtToken.sol +++ b/contracts/art-token/ArtToken.sol @@ -126,7 +126,7 @@ contract ArtToken is /** * @inheritdoc IArtToken */ - function tokenExists(uint256 tokenId) external view returns (bool reserved) { + function tokenExists(uint256 tokenId) external view returns (bool exists) { return _ownerOf(tokenId) != address(0); } diff --git a/contracts/art-token/IArtToken.sol b/contracts/art-token/IArtToken.sol index 86aabff..bb8c394 100644 --- a/contracts/art-token/IArtToken.sol +++ b/contracts/art-token/IArtToken.sol @@ -47,9 +47,9 @@ interface IArtToken is IERC721 { * * @param tokenId Token identifier to query. * - * @return reserved True if the token exists, false otherwise. + * @return exists True if the token exists, false otherwise. */ - function tokenExists(uint256 tokenId) external view returns (bool reserved); + function tokenExists(uint256 tokenId) external view returns (bool exists); /** * @notice Checks whether `account` passes the collection's compliance rules. diff --git a/tests/ArtToken.ts b/tests/ArtToken.ts index 15d54d4..ad3e93c 100644 --- a/tests/ArtToken.ts +++ b/tests/ArtToken.ts @@ -250,7 +250,7 @@ describe('ArtToken', function () { sender: buyer, }); - await expect(tx).rejectedWith('ArtTokenTokenReserved'); + await expect(tx).rejectedWith('ArtTokenTokenReservedByAuction'); }); it(`should fail if the permit signer is not the art token signer`, async () => { diff --git a/tests/AuctionHouse.ts b/tests/AuctionHouse.ts index 102f8ca..0b69e38 100644 --- a/tests/AuctionHouse.ts +++ b/tests/AuctionHouse.ts @@ -341,7 +341,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith('AuctionHouseTokenReserved'); + await expect(tx).rejectedWith(`AuctionHouseTokenReserved(${AUCTION_ID})`); }); it(`should fail if the token is in an inactive auction with a buyer`, async () => { @@ -389,7 +389,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith('AuctionHouseTokenReserved'); + await expect(tx).rejectedWith(`AuctionHouseTokenReserved(${AUCTION_ID})`); }); it(`should fail if the token is already minted`, async () => { @@ -439,7 +439,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith('AuctionHouseTokenReserved'); + await expect(tx).rejectedWith('AuctionHouseTokenAlreadyMinted'); }); it(`should fail if the permit signer is not the auction house signer`, async () => { @@ -978,9 +978,9 @@ describe(`AuctionHouse`, () => { }); it(`should cancel the auction by setting block timestamp as the end time`, async () => { - const { endTime: originalEndTime } = await auctionHouse.auction(AUCTION_ID); + const { endTime: originalEndTime, price } = await auctionHouse.auction(AUCTION_ID); - const tx = await auctionHouse.connect(admin).cancel(AUCTION_ID); + const tx1 = await auctionHouse.connect(admin).cancel(AUCTION_ID); const blockTimestamp = await getLatestBlockTimestamp(); const { endTime } = await auctionHouse.auction(AUCTION_ID); @@ -990,9 +990,13 @@ describe(`AuctionHouse`, () => { expect(endTime).equal(blockTimestamp); expect(tokenReserved).equal(false); - await expect(tx) // + await expect(tx1) // .emit(auctionHouse, 'Cancelled') .withArgs(AUCTION_ID); + + const tx2 = auctionHouse.connect(buyer).raiseInitial(AUCTION_ID, price); + + await expect(tx2).rejectedWith('AuctionHouseAuctionEnded'); }); it(`should fail if the auction does not exist`, async () => { From 8cdabb158b0a739b24c73ac9b7bdeda97730c08e Mon Sep 17 00:00:00 2001 From: mriynyk Date: Tue, 24 Feb 2026 13:48:59 +0700 Subject: [PATCH 08/14] documentation update, audit, refactoring, and ci --- .github/CODEOWNERS | 1 + .github/PULL_REQUEST_TEMPLATE.md | 15 + .github/workflows/CODEOWNERS | 1 - .github/workflows/ci.yml | 42 + .github/workflows/test.yml | 47 - .lintstagedrc | 2 +- .npmrc | 1 + .nvmrc | 1 + .prettierrc | 2 +- .solhint.json | 14 +- README.md | 12 +- abis/ArtToken.json | 346 +- abis/AuctionHouse.json | 243 +- abis/Market.json | 170 +- contracts/art-token/ArtToken.sol | 116 +- contracts/art-token/ArtTokenBase.sol | 108 +- contracts/art-token/ArtTokenRoyalty.sol | 13 +- contracts/art-token/IArtToken.sol | 49 +- .../ArtTokenConfigManager.sol | 27 +- .../ArtTokenConfigManagerStorage.sol | 5 +- .../IArtTokenConfigManager.sol | 7 +- .../libraries/TokenMintingPermit.sol | 4 - contracts/auction-house/AuctionHouse.sol | 414 +- .../auction-house/AuctionHouseStorage.sol | 5 +- contracts/auction-house/IAuctionHouse.sol | 92 +- contracts/auction-house/libraries/Auction.sol | 2 - .../libraries/AuctionCreationPermit.sol | 8 +- .../auction-house/libraries/ShareUtils.sol | 39 +- contracts/market/IMarket.sol | 37 +- contracts/market/Market.sol | 93 +- contracts/market/MarketStorage.sol | 12 +- contracts/market/libraries/Order.sol | 11 +- .../market/libraries/OrderExecutionPermit.sol | 4 - contracts/tests/AllDeployer.sol | 7 +- contracts/utils/Authorization.sol | 13 +- contracts/utils/CollectionDeployer.sol | 26 +- contracts/utils/CurrencyTransfers.sol | 49 +- contracts/utils/Deployment.sol | 70 +- contracts/utils/EIP712Domain.sol | 23 +- contracts/utils/EIP712Signature.sol | 12 +- contracts/utils/IWrappedEther.sol | 5 +- contracts/utils/MarketDeployer.sol | 15 +- contracts/utils/Roles.sol | 9 +- contracts/utils/TokenConfig.sol | 12 +- .../currency-manager/CurrencyManager.sol | 19 +- .../CurrencyManagerStorage.sol | 5 +- .../currency-manager/ICurrencyManager.sol | 16 +- contracts/utils/role-system/IRoleSystem.sol | 37 +- contracts/utils/role-system/RoleSystem.sol | 62 +- .../utils/role-system/RoleSystemStorage.sol | 8 +- package-lock.json | 728 ++-- package.json | 9 +- requirements.txt | 26 +- scripts/deploy-collection.ts | 16 +- slither.config.json | 3 +- slither.db.json | 3518 ++++++----------- tests/ArtToken.ts | 34 +- tests/AuctionHouse.ts | 73 +- tests/Market.ts | 14 +- tests/constants/art-token.ts | 5 +- tests/constants/auction-house.ts | 8 +- tests/utils/deploy-all.ts | 20 +- 62 files changed, 3179 insertions(+), 3606 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/CODEOWNERS create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/test.yml create mode 100644 .npmrc create mode 100644 .nvmrc diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..b7775bf --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @mriynyk diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..d2b3d92 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,15 @@ +## Issue + +Describe the issue here. + +### Summary: + +- create ... +- fix ... +- implement ... + + +### Useful Links: + +- [Source name](source_link); +- [Source name](source_link); diff --git a/.github/workflows/CODEOWNERS b/.github/workflows/CODEOWNERS deleted file mode 100644 index 53c57f4..0000000 --- a/.github/workflows/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @Vladimir-Beliy diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..cdfc9d7 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,42 @@ +name: CI + +on: + push: + branches: ["master"] + pull_request: + branches: ["master"] + +jobs: + ci: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: "24.6.0" + + - name: Install Node dependencies + run: npm ci + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.13.7" + + - name: Install Python dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + - name: Compile + run: npm run compile + + - name: Run tests + run: npm run test + + - name: Run slither + run: npm run slither diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index e5f9ed6..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Test - -on: - push: - branches: - - master - pull_request: - branches: - - master - -jobs: - test: - strategy: - matrix: - os: [ubuntu-latest] - node: [24.6.0] - # python: [3.11.6] - - runs-on: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v3 - - - name: Use Node.js - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node }} - - - name: Install node packages - run: npm install - - - name: Run test - run: npm run test - - # - name: Compile contracts - # run: npm run compile - - # - name: Use Python - # uses: actions/setup-python@v4 - # with: - # python-version: ${{ matrix.python }} - - # - name: Install python packages - # run: pip install -r requirements.txt - - # - name: Run slither - # run: npm run slither diff --git a/.lintstagedrc b/.lintstagedrc index 47a20b0..2d8bc7d 100644 --- a/.lintstagedrc +++ b/.lintstagedrc @@ -4,6 +4,6 @@ ], "*.sol": [ "prettier --write", - "solhint" + "solhint --max-warnings 0" ] } diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..fa3adfb --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v24.6.0 diff --git a/.prettierrc b/.prettierrc index 07e2430..a0e1dc5 100644 --- a/.prettierrc +++ b/.prettierrc @@ -9,7 +9,7 @@ { "files": "*.sol", "options": { - "printWidth": 120, + "printWidth": 110, "tabWidth": 4, "useTabs": false, "singleQuote": false, diff --git a/.solhint.json b/.solhint.json index 86d3014..a09ddf2 100644 --- a/.solhint.json +++ b/.solhint.json @@ -11,13 +11,11 @@ "ignoreConstructors": true } ], - "reason-string": [ - "warn", - { - "maxLength": 48 - } - ], - "no-empty-blocks": "off", - "func-name-mixedcase": "off" + "use-natspec": "off", + "gas-small-strings": "off", + "gas-indexed-events": "off", + "function-max-lines": "off", + "gas-strict-inequalities": "off", + "no-inline-assembly": "off" } } diff --git a/README.md b/README.md index 311fcfc..3adb193 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ ![tests](https://github.com/digital-original/contracts/actions/workflows/test.yml/badge.svg) ![license](https://img.shields.io/badge/license-GPLv3-blue) -# Digital Original – Smart-Contracts Suite +# Digital Original – Smart Contracts Suite Digital Original (DO) is a modular on-chain framework for managing primary sales and secondary markets of digital collectibles (NFTs). -This repository hosts all **Solidity smart-contracts, tests and tooling** required to deploy and operate the protocol. +This repository hosts all **Solidity smart contracts, tests and tooling** required to deploy and operate the protocol. ## 🧩 Features @@ -17,7 +17,7 @@ This repository hosts all **Solidity smart-contracts, tests and tooling** requir - **EIP-712 Permits**: Gas-efficient and secure transactions with cryptographic authorization. - **Role-Based Access Control**: Granular control over contract functions and administrative actions. - **Flexible Fee Structures**: Configurable maker and taker fees for market transactions. -- **Multi-Currency Support**: Support for multiple ERC-20 tokens for payments. +- **Multi-Currency Support**: Configurable support for multiple payment currencies. - **Upgradeable Contracts**: Upgradeable contract architecture for future improvements. ## 📚 Contracts @@ -38,7 +38,7 @@ The `AuctionHouse` contract manages English-style auctions for primary NFT sales - **Auction Creation**: Authorized creation of time-bound auctions with EIP-712 signatures - **Bidding System**: Progressive bidding with minimum raise steps and automatic refunds to outbid participants -- **Multi-Currency**: Configurable support for multiple ERC-20 payment currencies +- **Multi-Currency**: Configurable support for multiple payment currencies ### Market @@ -46,7 +46,7 @@ The `Market` contract facilitates peer-to-peer secondary trading of NFTs through - **Order Types**: Supports both sell-side (ask) and buy-side (bid) orders - **Off-chain Orders**: Gas-efficient trading through EIP-712 signed orders executed on-chain -- **Multi-Currency**: Configurable support for multiple ERC-20 payment currencies +- **Multi-Currency**: Configurable support for multiple payment currencies - **Order Management**: Order invalidation capabilities for makers and admins - **Fee Structure**: Flexible fee system supporting both maker and taker fees - **Revenue Sharing**: Built-in mechanism for distributing fees among multiple participants @@ -55,7 +55,7 @@ The `Market` contract facilitates peer-to-peer secondary trading of NFTs through ## 🏃🏽 Getting Started ### 📋 Prerequisites -- [Node.js](https://nodejs.org/) (v24+) +- [Node.js](https://nodejs.org/) - [Python](https://www.python.org/) (for static analysis) ### ⚡️ Quick Start diff --git a/abis/ArtToken.json b/abis/ArtToken.json index a3a9976..6794547 100644 --- a/abis/ArtToken.json +++ b/abis/ArtToken.json @@ -11,6 +11,11 @@ "name": "main", "type": "address" }, + { + "internalType": "address", + "name": "wrappedEther", + "type": "address" + }, { "internalType": "address", "name": "auctionHouse", @@ -54,29 +59,25 @@ "type": "error" }, { - "inputs": [], - "name": "ArtTokenCurrencyInvalid", - "type": "error" - }, - { - "inputs": [], - "name": "ArtTokenInvalidFee", - "type": "error" - }, - { - "inputs": [], - "name": "ArtTokenInvalidPrice", + "inputs": [ + { + "internalType": "uint8", + "name": "argIndex", + "type": "uint8" + } + ], + "name": "ArtTokenMisconfiguration", "type": "error" }, { "inputs": [ { - "internalType": "uint256", - "name": "argIndex", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "ArtTokenMisconfiguration", + "name": "ArtTokenNonCompliantAccount", "type": "error" }, { @@ -92,7 +93,7 @@ }, { "inputs": [], - "name": "ArtTokenTokenReserved", + "name": "ArtTokenTokenReservedByAuction", "type": "error" }, { @@ -106,6 +107,16 @@ "name": "ArtTokenUnauthorizedAccount", "type": "error" }, + { + "inputs": [], + "name": "ArtTokenUnsupportedCurrency", + "type": "error" + }, + { + "inputs": [], + "name": "ArtTokenZeroPrice", + "type": "error" + }, { "inputs": [], "name": "AuthorizationDeadlineExpired", @@ -116,6 +127,52 @@ "name": "AuthorizationUnauthorizedAction", "type": "error" }, + { + "inputs": [], + "name": "CurrencyManagerZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersIncorrectEtherValue", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersIncorrectTotalAmount", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersInvalidInputLengths", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "argIndex", + "type": "uint8" + } + ], + "name": "CurrencyTransfersMisconfiguration", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersUnexpectedEther", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersZeroValue", + "type": "error" + }, { "inputs": [], "name": "ECDSAInvalidSignature", @@ -146,9 +203,9 @@ { "inputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "argIndex", - "type": "uint256" + "type": "uint8" } ], "name": "EIP712DomainMisconfiguration", @@ -301,14 +358,46 @@ { "inputs": [ { - "internalType": "uint256", + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "RoleSystemAlreadyHasRole", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", "name": "argIndex", - "type": "uint256" + "type": "uint8" } ], "name": "RoleSystemMisconfiguration", "type": "error" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "RoleSystemMissingRole", + "type": "error" + }, { "inputs": [], "name": "RoleSystemNotMain", @@ -335,26 +424,6 @@ "name": "RoleSystemZeroAddress", "type": "error" }, - { - "inputs": [], - "name": "SafeERC20BulkTransferIncorrectTotalAmount", - "type": "error" - }, - { - "inputs": [], - "name": "SafeERC20BulkTransferInvalidInputLengths", - "type": "error" - }, - { - "inputs": [], - "name": "SafeERC20BulkTransferZeroAddress", - "type": "error" - }, - { - "inputs": [], - "name": "SafeERC20BulkTransferZeroValue", - "type": "error" - }, { "inputs": [ { @@ -366,6 +435,11 @@ "name": "SafeERC20FailedOperation", "type": "error" }, + { + "inputs": [], + "name": "TokenConfigNotPopulated", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -565,6 +639,12 @@ "name": "role", "type": "bytes32" }, + { + "indexed": true, + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, { "indexed": true, "internalType": "address", @@ -614,6 +694,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GAS_LIMIT_ETHER_TRANSFER", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "MAIN", @@ -640,6 +733,38 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "WRAPPED_ETHER", + "outputs": [ + { + "internalType": "contract IWrappedEther", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "accountCompliant", + "outputs": [ + { + "internalType": "bool", + "name": "compliant", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -881,46 +1006,6 @@ "stateMutability": "payable", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "internalType": "string", - "name": "_tokenURI", - "type": "string" - }, - { - "components": [ - { - "internalType": "address", - "name": "creator", - "type": "address" - }, - { - "internalType": "enum TokenConfig.RegulationMode", - "name": "regulationMode", - "type": "uint8" - } - ], - "internalType": "struct TokenConfig.Type", - "name": "tokenConfig", - "type": "tuple" - } - ], - "name": "mintFromAuctionHouse", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "name": "name", @@ -953,25 +1038,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "recipientAuthorized", - "outputs": [ - { - "internalType": "bool", - "name": "authorized", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -1019,6 +1085,46 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_tokenURI", + "type": "string" + }, + { + "components": [ + { + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "internalType": "enum TokenConfig.RegulationMode", + "name": "regulationMode", + "type": "uint8" + } + ], + "internalType": "struct TokenConfig.Type", + "name": "tokenConfig", + "type": "tuple" + } + ], + "name": "safeMintFromAuctionHouse", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1178,23 +1284,18 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, { "internalType": "uint256", - "name": "index", + "name": "tokenId", "type": "uint256" } ], - "name": "tokenOfOwnerByIndex", + "name": "tokenExists", "outputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "bool", + "name": "exists", + "type": "bool" } ], "stateMutability": "view", @@ -1202,18 +1303,23 @@ }, { "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, { "internalType": "uint256", - "name": "tokenId", + "name": "index", "type": "uint256" } ], - "name": "tokenRegulationMode", + "name": "tokenOfOwnerByIndex", "outputs": [ { - "internalType": "enum TokenConfig.RegulationMode", - "name": "regulationMode", - "type": "uint8" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], "stateMutability": "view", @@ -1227,12 +1333,12 @@ "type": "uint256" } ], - "name": "tokenReserved", + "name": "tokenRegulationMode", "outputs": [ { - "internalType": "bool", - "name": "reserved", - "type": "bool" + "internalType": "enum TokenConfig.RegulationMode", + "name": "regulationMode", + "type": "uint8" } ], "stateMutability": "view", @@ -1323,7 +1429,7 @@ "outputs": [ { "internalType": "address", - "name": "owner", + "name": "", "type": "address" } ], diff --git a/abis/AuctionHouse.json b/abis/AuctionHouse.json index 3c60526..23d9dd7 100644 --- a/abis/AuctionHouse.json +++ b/abis/AuctionHouse.json @@ -11,6 +11,11 @@ "name": "main", "type": "address" }, + { + "internalType": "address", + "name": "wrappedEther", + "type": "address" + }, { "internalType": "address", "name": "artToken", @@ -49,12 +54,12 @@ }, { "inputs": [], - "name": "AuctionHouseAuctionEnded", + "name": "AuctionHouseAuctionAlreadyEnded", "type": "error" }, { "inputs": [], - "name": "AuctionHouseAuctionExists", + "name": "AuctionHouseAuctionAlreadyExists", "type": "error" }, { @@ -64,95 +69,147 @@ }, { "inputs": [], - "name": "AuctionHouseAuctionNotExists", + "name": "AuctionHouseInvalidEndTime", "type": "error" }, { - "inputs": [], - "name": "AuctionHouseBuyerExists", + "inputs": [ + { + "internalType": "uint8", + "name": "argIndex", + "type": "uint8" + } + ], + "name": "AuctionHouseMisconfiguration", "type": "error" }, { "inputs": [], - "name": "AuctionHouseBuyerNotExists", + "name": "AuctionHouseMissingBuyer", "type": "error" }, { "inputs": [], - "name": "AuctionHouseInvalidCurrency", + "name": "AuctionHouseNonexistentAuction", "type": "error" }, { - "inputs": [], - "name": "AuctionHouseInvalidEndTime", + "inputs": [ + { + "internalType": "uint256", + "name": "minAmount", + "type": "uint256" + } + ], + "name": "AuctionHouseRaiseTooLow", "type": "error" }, { "inputs": [], - "name": "AuctionHouseInvalidFee", + "name": "AuctionHouseTokenAlreadyMinted", "type": "error" }, { - "inputs": [], - "name": "AuctionHouseInvalidPrice", + "inputs": [ + { + "internalType": "uint256", + "name": "existingAuctionId", + "type": "uint256" + } + ], + "name": "AuctionHouseTokenAlreadyReserved", "type": "error" }, { "inputs": [], - "name": "AuctionHouseInvalidStep", + "name": "AuctionHouseTokenAlreadySold", "type": "error" }, { "inputs": [ { - "internalType": "uint256", - "name": "argIndex", - "type": "uint256" + "internalType": "address", + "name": "account", + "type": "address" } ], - "name": "AuctionHouseMisconfiguration", + "name": "AuctionHouseUnauthorizedAccount", "type": "error" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "minAmount", - "type": "uint256" - } - ], - "name": "AuctionHouseRaiseTooLow", + "inputs": [], + "name": "AuctionHouseUnexpectedBuyer", "type": "error" }, { "inputs": [], - "name": "AuctionHouseTokenReserved", + "name": "AuctionHouseUnsupportedCurrency", "type": "error" }, { "inputs": [], - "name": "AuctionHouseTokenSold", + "name": "AuctionHouseZeroPrice", + "type": "error" + }, + { + "inputs": [], + "name": "AuctionHouseZeroStep", + "type": "error" + }, + { + "inputs": [], + "name": "AuthorizationDeadlineExpired", + "type": "error" + }, + { + "inputs": [], + "name": "AuthorizationUnauthorizedAction", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyManagerZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersIncorrectEtherValue", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersIncorrectTotalAmount", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersInvalidInputLengths", "type": "error" }, { "inputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint8", + "name": "argIndex", + "type": "uint8" } ], - "name": "AuctionHouseUnauthorizedAccount", + "name": "CurrencyTransfersMisconfiguration", "type": "error" }, { "inputs": [], - "name": "AuthorizationDeadlineExpired", + "name": "CurrencyTransfersUnexpectedEther", "type": "error" }, { "inputs": [], - "name": "AuthorizationUnauthorizedAction", + "name": "CurrencyTransfersZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersZeroValue", "type": "error" }, { @@ -185,9 +242,9 @@ { "inputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "argIndex", - "type": "uint256" + "type": "uint8" } ], "name": "EIP712DomainMisconfiguration", @@ -211,14 +268,46 @@ { "inputs": [ { - "internalType": "uint256", + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "RoleSystemAlreadyHasRole", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", "name": "argIndex", - "type": "uint256" + "type": "uint8" } ], "name": "RoleSystemMisconfiguration", "type": "error" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "RoleSystemMissingRole", + "type": "error" + }, { "inputs": [], "name": "RoleSystemNotMain", @@ -245,26 +334,6 @@ "name": "RoleSystemZeroAddress", "type": "error" }, - { - "inputs": [], - "name": "SafeERC20BulkTransferIncorrectTotalAmount", - "type": "error" - }, - { - "inputs": [], - "name": "SafeERC20BulkTransferInvalidInputLengths", - "type": "error" - }, - { - "inputs": [], - "name": "SafeERC20BulkTransferZeroAddress", - "type": "error" - }, - { - "inputs": [], - "name": "SafeERC20BulkTransferZeroValue", - "type": "error" - }, { "inputs": [ { @@ -277,8 +346,14 @@ "type": "error" }, { - "inputs": [], - "name": "ShareDistributorParticipantsSharesMismatch", + "inputs": [ + { + "internalType": "uint256", + "name": "participantsCount", + "type": "uint256" + } + ], + "name": "ShareUtilsInvalidParticipantsCount", "type": "error" }, { @@ -289,17 +364,27 @@ "type": "uint256" } ], - "name": "ShareDistributorSharesSumInvalid", + "name": "ShareUtilsInvalidSum", + "type": "error" + }, + { + "inputs": [], + "name": "ShareUtilsParticipantsSharesMismatch", "type": "error" }, { "inputs": [], - "name": "ShareDistributorZeroAddress", + "name": "ShareUtilsZeroAddress", "type": "error" }, { "inputs": [], - "name": "ShareDistributorZeroShare", + "name": "ShareUtilsZeroShare", + "type": "error" + }, + { + "inputs": [], + "name": "TokenConfigNotPopulated", "type": "error" }, { @@ -450,6 +535,12 @@ "name": "role", "type": "bytes32" }, + { + "indexed": true, + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, { "indexed": true, "internalType": "address", @@ -499,6 +590,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GAS_LIMIT_ETHER_TRANSFER", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "MAIN", @@ -538,6 +642,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "WRAPPED_ETHER", + "outputs": [ + { + "internalType": "contract IWrappedEther", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -896,7 +1013,7 @@ "outputs": [ { "internalType": "address", - "name": "owner", + "name": "", "type": "address" } ], diff --git a/abis/Market.json b/abis/Market.json index 21221b8..12cd279 100644 --- a/abis/Market.json +++ b/abis/Market.json @@ -10,6 +10,11 @@ "internalType": "address", "name": "main", "type": "address" + }, + { + "internalType": "address", + "name": "wrappedEther", + "type": "address" } ], "stateMutability": "nonpayable", @@ -47,6 +52,52 @@ "name": "AuthorizationUnauthorizedAction", "type": "error" }, + { + "inputs": [], + "name": "CurrencyManagerZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersIncorrectEtherValue", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersIncorrectTotalAmount", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersInvalidInputLengths", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "argIndex", + "type": "uint8" + } + ], + "name": "CurrencyTransfersMisconfiguration", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersUnexpectedEther", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "CurrencyTransfersZeroValue", + "type": "error" + }, { "inputs": [], "name": "ECDSAInvalidSignature", @@ -77,9 +128,9 @@ { "inputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "argIndex", - "type": "uint256" + "type": "uint8" } ], "name": "EIP712DomainMisconfiguration", @@ -95,11 +146,6 @@ "name": "FailedInnerCall", "type": "error" }, - { - "inputs": [], - "name": "MarketCurrencyInvalid", - "type": "error" - }, { "inputs": [], "name": "MarketInvalidAskSideFee", @@ -107,25 +153,30 @@ }, { "inputs": [], - "name": "MarketInvalidOrderHash", + "name": "MarketInvalidOrderSide", "type": "error" }, { "inputs": [], - "name": "MarketInvalidOrderSide", + "name": "MarketInvalidOrderSignature", "type": "error" }, { "inputs": [ { - "internalType": "uint256", + "internalType": "uint8", "name": "argIndex", - "type": "uint256" + "type": "uint8" } ], "name": "MarketMisconfiguration", "type": "error" }, + { + "inputs": [], + "name": "MarketOrderHashMismatch", + "type": "error" + }, { "inputs": [ { @@ -149,20 +200,57 @@ }, { "inputs": [], - "name": "MarketUnauthorizedOrder", + "name": "MarketUnsupportedCurrency", + "type": "error" + }, + { + "inputs": [], + "name": "MarketZeroOrderPrice", "type": "error" }, { "inputs": [ { - "internalType": "uint256", + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "RoleSystemAlreadyHasRole", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", "name": "argIndex", - "type": "uint256" + "type": "uint8" } ], "name": "RoleSystemMisconfiguration", "type": "error" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "RoleSystemMissingRole", + "type": "error" + }, { "inputs": [], "name": "RoleSystemNotMain", @@ -189,26 +277,6 @@ "name": "RoleSystemZeroAddress", "type": "error" }, - { - "inputs": [], - "name": "SafeERC20BulkTransferIncorrectTotalAmount", - "type": "error" - }, - { - "inputs": [], - "name": "SafeERC20BulkTransferInvalidInputLengths", - "type": "error" - }, - { - "inputs": [], - "name": "SafeERC20BulkTransferZeroAddress", - "type": "error" - }, - { - "inputs": [], - "name": "SafeERC20BulkTransferZeroValue", - "type": "error" - }, { "inputs": [ { @@ -403,6 +471,12 @@ "name": "role", "type": "bytes32" }, + { + "indexed": true, + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, { "indexed": true, "internalType": "address", @@ -439,6 +513,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "GAS_LIMIT_ETHER_TRANSFER", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "MAIN", @@ -452,6 +539,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "WRAPPED_ETHER", + "outputs": [ + { + "internalType": "contract IWrappedEther", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -817,7 +917,7 @@ "outputs": [ { "internalType": "address", - "name": "owner", + "name": "", "type": "address" } ], diff --git a/contracts/art-token/ArtToken.sol b/contracts/art-token/ArtToken.sol index 917564a..cfc9e30 100644 --- a/contracts/art-token/ArtToken.sol +++ b/contracts/art-token/ArtToken.sol @@ -17,7 +17,6 @@ import {IArtToken} from "./IArtToken.sol"; /** * @title ArtToken - * * @notice Upgradeable ERC-721 token used by DigitalOriginal protocols. Adds primary-sale * logic, integrates EIP-712 permits and enforces optional transfer * restrictions for regulated collections. @@ -40,8 +39,7 @@ contract ArtToken is IAuctionHouse public immutable AUCTION_HOUSE; /** - * @notice Contract constructor. - * + * @notice Initializes the implementation with the given immutable parameters. * @param proxy Address of the proxy that will ultimately own the implementation * (used for EIP-712 domain separator). * @param main Address that will be set as {RoleSystem.MAIN}. @@ -60,9 +58,13 @@ contract ArtToken is } /** - * @inheritdoc IArtToken + * @notice Mints `tokenId` and transfers it to `to`. + * @param to Address that will receive the newly minted token. + * @param tokenId Unique identifier of the token to mint. + * @param _tokenURI Metadata URI that will be associated with the token. + * @param tokenConfig The configuration for the token, including creator and regulation mode. */ - function mintFromAuctionHouse( + function safeMintFromAuctionHouse( address to, uint256 tokenId, string calldata _tokenURI, @@ -72,11 +74,13 @@ contract ArtToken is revert ArtTokenUnauthorizedAccount(msg.sender); } - _mint(to, tokenId, _tokenURI, tokenConfig); + _safeMintAndSetTokenConfig(to, tokenId, _tokenURI, tokenConfig); } /** - * @inheritdoc IArtToken + * @notice Mints a new token according to the specifications in `permit`. + * @param permit The minting details. + * @param permitSignature The EIP-712 signature of the `permit` signed by the art-token signer. */ function mint(TokenMintingPermit.Type calldata permit, bytes calldata permitSignature) external payable { _requireAuthorizedAction(permit.hash(), permit.deadline, permitSignature); @@ -88,11 +92,7 @@ contract ArtToken is } if (permit.price == 0) { - revert ArtTokenInvalidPrice(); - } - - if (permit.fee == 0) { - revert ArtTokenInvalidFee(); + revert ArtTokenZeroPrice(); } if (AUCTION_HOUSE.tokenReserved(permit.tokenId)) { @@ -100,23 +100,26 @@ contract ArtToken is } if (!_currencyAllowed(permit.currency)) { - revert ArtTokenCurrencyInvalid(); + revert ArtTokenUnsupportedCurrency(); } - _mint(permit.minter, permit.tokenId, permit.tokenURI, permit.tokenConfig); - _receiveCurrency(permit.currency, msg.sender, permit.price + permit.fee); + _sendCurrency(permit.currency, _uniqueRoleOwner(Roles.FINANCIAL_ROLE), permit.fee); + _sendCurrencyBatch(permit.currency, permit.price, permit.participants, permit.rewards); - _sendCurrency(permit.currency, _uniqueRoleOwner(Roles.FINANCIAL_ROLE), permit.fee); + _safeMintAndSetTokenConfig(permit.minter, permit.tokenId, permit.tokenURI, permit.tokenConfig); } /** - * @inheritdoc IArtToken + * @notice Sets the token URI for a given token. + * @dev Can only be called by an account with the `ADMIN_ROLE`. + * @param tokenId The ID of the token to update. + * @param _tokenURI The new token URI. */ function setTokenURI(uint256 tokenId, string calldata _tokenURI) external onlyRole(Roles.ADMIN_ROLE) { - if (_ownerOf(tokenId) == address(0)) { + if (!_tokenExists(tokenId)) { revert ArtTokenNonexistentToken(tokenId); } @@ -124,100 +127,101 @@ contract ArtToken is } /** - * @inheritdoc IArtToken + * @notice Returns whether `tokenId` has already been minted. + * @param tokenId Token identifier to query. + * @return exists True if the token exists. */ function tokenExists(uint256 tokenId) external view returns (bool exists) { - return _ownerOf(tokenId) != address(0); + return _tokenExists(tokenId); } /** - * @inheritdoc IArtToken + * @notice Checks whether `account` passes the collection's compliance rules. + * @param account The address to check for compliance. + * @return compliant True if the account is compliant with the collection's rules. */ - function recipientAuthorized(address account) external view returns (bool authorized) { - return _recipientAuthorized(account); + function accountCompliant(address account) external view returns (bool compliant) { + return _accountCompliant(account); } /** - * @notice Internal function to mint a new token. - * - * @dev This function is called by both `mintFromAuctionHouse` and `mint`. It handles the core - * minting logic and sets the token URI and configuration. - * + * @notice Mints `tokenId` and transfers it to `to`, then sets the token URI and configuration. * @param to The address that will receive the newly minted token. * @param tokenId The unique identifier of the token to mint. * @param _tokenURI The metadata URI that will be associated with the token. * @param tokenConfig The configuration for the token. */ - function _mint( + function _safeMintAndSetTokenConfig( address to, uint256 tokenId, string calldata _tokenURI, TokenConfig.Type calldata tokenConfig - ) internal { + ) private { _safeMintAndSetTokenURI(to, tokenId, _tokenURI); _setTokenConfig(tokenId, tokenConfig); } /** - * @notice Reverts unless `account` passes {recipientAuthorized}. - * - * @dev This function is used to enforce that only authorized accounts can receive tokens. - * - * @param account The account to check. + * @notice Returns whether `tokenId` has already been minted. + * @param tokenId Token identifier to query. + * @return exists True if the token exists. */ - function _requireAuthorizedRecipient(address account) private view { - if (!_recipientAuthorized(account)) { - revert ArtTokenUnauthorizedAccount(account); - } + function _tokenExists(uint256 tokenId) private view returns (bool exists) { + return _ownerOf(tokenId) != address(0); } /** - * @notice Returns whether `account` passes the collection's compliance rules. - * + * @notice Checks whether `account` passes the collection's compliance rules. * @dev This function checks if the account is an EOA or has the PARTNER_ROLE. - * - * @param account Address to query. - * - * @return True if the account can receive or manage tokens. + * @param account The address to check for compliance. + * @return compliant True if the account is compliant with the collection's rules. */ - function _recipientAuthorized(address account) internal view returns (bool) { + function _accountCompliant(address account) private view returns (bool compliant) { return account.code.length == 0 || _hasRole(Roles.PARTNER_ROLE, account); } + /** + * @notice Checks whether `account` passes the collection's compliance rules. + * @dev Reverts if the account is not compliant with the collection's rules. + * @param account The address to check for authorization. + */ + function _requireCompliantAccount(address account) private view { + if (!_accountCompliant(account)) { + revert ArtTokenNonCompliantAccount(account); + } + } + /** * @inheritdoc ArtTokenBase - * * @dev Hook that ensures both the recipient and the authorizing address are compliant with * the collection's rules before any token transfer occurs. */ - function _beforeTransfer(address to, uint256 tokenId, address auth) internal view override { + function _beforeTransfer(address to, uint256 tokenId, address auth) internal view override(ArtTokenBase) { if (_tokenRegulationMode(tokenId) == TokenConfig.RegulationMode.Regulated) { - _requireAuthorizedRecipient(to); - _requireAuthorizedRecipient(auth); + _requireCompliantAccount(to); + _requireCompliantAccount(auth); } } /** * @inheritdoc ArtTokenBase - * * @dev Hook that ensures the recipient of an approval is compliant with the collection's * rules. */ - function _beforeApprove(address to, uint256 tokenId) internal view override { + function _beforeApprove(address to, uint256 tokenId) internal view override(ArtTokenBase) { if (_tokenRegulationMode(tokenId) == TokenConfig.RegulationMode.Regulated) { - _requireAuthorizedRecipient(to); + _requireCompliantAccount(to); } } /** * @inheritdoc ArtTokenBase - * * @dev Hook that ensures a new operator is compliant with the collection's rules before * being approved. */ - function _beforeSetApprovalForAll(address operator, bool approved) internal view override { + function _beforeSetApprovalForAll(address operator, bool approved) internal view override(ArtTokenBase) { if (approved) { - _requireAuthorizedRecipient(operator); + _requireCompliantAccount(operator); } } } diff --git a/contracts/art-token/ArtTokenBase.sol b/contracts/art-token/ArtTokenBase.sol index b1df1d8..2fe946b 100644 --- a/contracts/art-token/ArtTokenBase.sol +++ b/contracts/art-token/ArtTokenBase.sol @@ -10,25 +10,32 @@ import {IERC2981} from "@openzeppelin/contracts/interfaces/IERC2981.sol"; /** * @title ArtTokenBase - * * @notice Upgradeable, abstract ERC-721 implementation used as a building block for the * protocol's ArtToken contracts. Relies on OpenZeppelin upgradeable libraries and * bundles the Enumerable and URIStorage extensions in a single inheritance tree. */ abstract contract ArtTokenBase is ERC721EnumerableUpgradeable, ERC721URIStorageUpgradeable, IERC2981 { + /** + * @notice Disables initializers to prevent misuse of the implementation contract. + */ + constructor() { + _disableInitializers(); + } + /** * @notice Initializes the token with a `name` and a `symbol`. - * * @param _name Token collection name. * @param _symbol Token collection symbol. */ - function initialize(string memory _name, string memory _symbol) external initializer { + function initialize(string calldata _name, string calldata _symbol) external initializer { __ERC721_init(_name, _symbol); + __ERC721Enumerable_init(); + __ERC721URIStorage_init(); } /** - * @dev Overrides {ERC721.approve}. Adds the `_beforeApprove` hook so that inheriting contracts - * can introduce custom approval rules. + * @notice Overrides {ERC721.approve}. Adds the `_beforeApprove` hook so that inheriting contracts + * can introduce custom approval rules. */ function approve(address to, uint256 tokenId) public override(ERC721Upgradeable, IERC721) { _beforeApprove(to, tokenId); @@ -37,8 +44,8 @@ abstract contract ArtTokenBase is ERC721EnumerableUpgradeable, ERC721URIStorageU } /** - * @dev Overrides {ERC721.setApprovalForAll}. Adds the `_beforeSetApprovalForAll` hook so that - * inheriting contracts can introduce custom operator-approval rules. + * @notice Overrides {ERC721.setApprovalForAll}. Adds the `_beforeSetApprovalForAll` hook so that + * inheriting contracts can introduce custom operator-approval rules. */ function setApprovalForAll(address operator, bool approved) public override(ERC721Upgradeable, IERC721) { _beforeSetApprovalForAll(operator, approved); @@ -47,17 +54,8 @@ abstract contract ArtTokenBase is ERC721EnumerableUpgradeable, ERC721URIStorageU } /** - * @dev An override required by Solidity. - */ - function tokenURI( - uint256 tokenId - ) public view override(ERC721Upgradeable, ERC721URIStorageUpgradeable) returns (string memory) { - return super.tokenURI(tokenId); - } - - /** - * @notice Returns true if the contract implements the interface defined by - * `interfaceId`. See the corresponding EIP-165 standard for more details. + * @notice Overrides {ERC721Upgradeable.supportsInterface} to include support for + * IERC-2981 (royalty info). */ function supportsInterface( bytes4 interfaceId @@ -66,26 +64,12 @@ abstract contract ArtTokenBase is ERC721EnumerableUpgradeable, ERC721URIStorageU } /** - * @dev Helper that performs a safe mint and assigns a token URI in a single call. - * - * @param to Recipient of the newly minted token. - * @param tokenId Identifier of the token to mint. - * @param _tokenURI Metadata URI that will be associated with the token. - */ - function _safeMintAndSetTokenURI(address to, uint256 tokenId, string memory _tokenURI) internal { - _safeMint(to, tokenId); - _setTokenURI(tokenId, _tokenURI); - } - - /** - * @dev Overrides the OpenZeppelin internal `_update` function in order to plug the - * `_beforeTransfer` hook. - * + * @notice Overrides the OpenZeppelin internal `_update` function in order to plug the + * `_beforeTransfer` hook. * @param to Address receiving the token. * @param tokenId Identifier of the token being transferred. * @param auth Address whose approval is being used for the transfer * (may be the the owner of the token or an operator). - * * @return from Address that previously owned the token. */ function _update( @@ -99,37 +83,63 @@ abstract contract ArtTokenBase is ERC721EnumerableUpgradeable, ERC721URIStorageU } /** - * @dev An override required by Solidity. + * @notice Helper that performs a safe mint and assigns a token URI in a single call. + * @param to Recipient of the newly minted token. + * @param tokenId Identifier of the token to mint. + * @param _tokenURI Metadata URI that will be associated with the token. */ - function _increaseBalance( - address account, - uint128 amount - ) internal override(ERC721Upgradeable, ERC721EnumerableUpgradeable) { - super._increaseBalance(account, amount); + function _safeMintAndSetTokenURI(address to, uint256 tokenId, string memory _tokenURI) internal { + _safeMint(to, tokenId); + _setTokenURI(tokenId, _tokenURI); } + /* + * ####################################### + * ############ Virtual hooks ############ + * ####################################### + */ + /** - * @dev Hook called before any token transfer or mint. - * + * @notice Hook called before any token transfer or mint. * @param to The address receiving the token. * @param tokenId Identifier of the token being transferred. * @param auth Address whose approval is being used for the transfer. + * (may be the the owner of the token or an operator). */ - function _beforeTransfer(address to, uint256 tokenId, address auth) internal virtual {} + function _beforeTransfer(address to, uint256 tokenId, address auth) internal virtual; /** - * @dev Hook called before an approval is granted for a single token. - * + * @notice Hook called before an approval is granted for a single token. * @param to Address that the approval will be granted to. * @param tokenId Identifier of the token for which the approval is set. */ - function _beforeApprove(address to, uint256 tokenId) internal virtual {} + function _beforeApprove(address to, uint256 tokenId) internal virtual; /** - * @dev Hook called before an operator approval is changed for an account. - * + * @notice Hook called before an operator approval is changed for an account. * @param operator Address whose operator status is being updated. * @param approved Boolean indicating whether the operator is being approved or revoked. */ - function _beforeSetApprovalForAll(address operator, bool approved) internal virtual {} + function _beforeSetApprovalForAll(address operator, bool approved) internal virtual; + + /* + * ######################################## + * #### Overrides required by Solidity #### + * ######################################## + */ + + /// @dev An override required by Solidity. + function _increaseBalance( + address account, + uint128 amount + ) internal override(ERC721Upgradeable, ERC721EnumerableUpgradeable) { + super._increaseBalance(account, amount); + } + + /// @dev An override required by Solidity. + function tokenURI( + uint256 tokenId + ) public view override(ERC721Upgradeable, ERC721URIStorageUpgradeable) returns (string memory) { + return super.tokenURI(tokenId); + } } diff --git a/contracts/art-token/ArtTokenRoyalty.sol b/contracts/art-token/ArtTokenRoyalty.sol index ca69243..3c6d827 100644 --- a/contracts/art-token/ArtTokenRoyalty.sol +++ b/contracts/art-token/ArtTokenRoyalty.sol @@ -7,24 +7,19 @@ import {ONE_HUNDRED_PERCENT_IN_BP} from "../utils/Constants.sol"; /** * @title ArtTokenRoyalty - * * @notice Abstract contract that provides a basic implementation of the EIP-2981 royalty standard. - * * @dev This implementation calculates a fixed 5% royalty on the sale price and designates the * original token creator as the royalty recipient. */ abstract contract ArtTokenRoyalty is IERC2981, ArtTokenConfigManager { - /** - * @notice The royalty percentage in basis points - 5%. - */ + /// @notice The royalty percentage in basis points - 5%. uint256 public constant ROYALTY_PERCENT_IN_BP = ONE_HUNDRED_PERCENT_IN_BP / 20; // 5% /** - * @notice Calculates the royalty payment for a token sale, returning the recipient's address and the royalty amount. - * + * @notice Calculates the royalty payment for a token sale,returning the recipient's + * address and the royalty amount. * @param tokenId The ID of the token for which royalty information is being requested. - * @param salePrice The price at which the token was sold. - * + * @param salePrice The sale price of the token. * @return receiver The address that should receive the royalty payment. * @return royaltyAmount The amount of the royalty payment. */ diff --git a/contracts/art-token/IArtToken.sol b/contracts/art-token/IArtToken.sol index bb8c394..40b3ea9 100644 --- a/contracts/art-token/IArtToken.sol +++ b/contracts/art-token/IArtToken.sol @@ -7,36 +7,33 @@ import {TokenMintingPermit} from "./libraries/TokenMintingPermit.sol"; /** * @title IArtToken - * * @notice Interface of the DigitalOriginal ERC-721 ArtToken contracts. */ interface IArtToken is IERC721 { /** * @notice Mints `tokenId` and transfers it to `to`. - * * @param to Address that will receive the newly minted token. * @param tokenId Unique identifier of the token to mint. - * @param _tokenURI Metadata URI that will be associated with the token. + * @param tokenURI Metadata URI that will be associated with the token. * @param tokenConfig The configuration for the token, including creator and regulation mode. */ - function mintFromAuctionHouse( + function safeMintFromAuctionHouse( address to, uint256 tokenId, - string memory _tokenURI, + string memory tokenURI, TokenConfig.Type calldata tokenConfig ) external; /** - * @notice Primary sale helper: mints the token and immediately transfers it to the caller. - * - * @param permit The `TokenMintingPermit` struct containing the sale details. - * @param permitSignature The EIP-712 signature of the `permit`, signed by the art-token signer. + * @notice Mints a new token with `tokenId` to `msg.sender`. The minting details are specified in the `permit`, + * which is signed by an authorized art-token signer. + * @param permit The `TokenMintingPermit` struct containing the minting details. + * @param permitSignature The EIP-712 signature of the `permit` signed by an authorized art-token signer. */ function mint(TokenMintingPermit.Type calldata permit, bytes calldata permitSignature) external payable; /** * @notice Sets the token URI for a given token. - * * @param tokenId The ID of the token to update. * @param _tokenURI The new token URI. */ @@ -44,40 +41,40 @@ interface IArtToken is IERC721 { /** * @notice Returns whether `tokenId` has already been minted. - * * @param tokenId Token identifier to query. - * - * @return exists True if the token exists, false otherwise. + * @return exists True if the token exists. */ function tokenExists(uint256 tokenId) external view returns (bool exists); /** * @notice Checks whether `account` passes the collection's compliance rules. - * - * @param account Address to query. - * - * @return authorized True if the account can receive or manage tokens. + * @param account The address to check for compliance. + * @return compliant True if the account is compliant with the collection's rules. */ - function recipientAuthorized(address account) external view returns (bool authorized); + function accountCompliant(address account) external view returns (bool compliant); /// @dev Thrown when an action involves an account that is not authorized by the contract rules. + /// @param account The unauthorized account involved in the action. error ArtTokenUnauthorizedAccount(address account); + /// @dev Thrown when an action involves an account that does not comply with the collection's rules. + /// @param account The non-compliant account involved in the action. + error ArtTokenNonCompliantAccount(address account); + /// @dev Thrown when a token does not exist. + /// @param tokenId The identifier of the nonexistent token. error ArtTokenNonexistentToken(uint256 tokenId); - /// @dev Thrown when a currency is invalid. - error ArtTokenCurrencyInvalid(); - - /// @dev Thrown when `price` supplied to {buy} is below the minimum configured price. - error ArtTokenInvalidPrice(); + /// @dev Thrown when the currency specified is not supported. + error ArtTokenUnsupportedCurrency(); - /// @dev Thrown when `fee` supplied to {buy} is below the minimum configured fee. - error ArtTokenInvalidFee(); + /// @dev Thrown when the `price` provided is zero. + error ArtTokenZeroPrice(); /// @dev Thrown when attempting to mint or purchase a token that is reserved by an auction. error ArtTokenTokenReservedByAuction(); - /// @dev Thrown when a constructor argument under the provided `argIndex` is invalid (e.g., zero address). + /// @dev Thrown when a constructor argument is invalid. + /// @param argIndex The index of the invalid constructor argument. error ArtTokenMisconfiguration(uint8 argIndex); } diff --git a/contracts/art-token/art-token-config-manager/ArtTokenConfigManager.sol b/contracts/art-token/art-token-config-manager/ArtTokenConfigManager.sol index 989f044..44622f4 100644 --- a/contracts/art-token/art-token-config-manager/ArtTokenConfigManager.sol +++ b/contracts/art-token/art-token-config-manager/ArtTokenConfigManager.sol @@ -9,7 +9,6 @@ import {IArtTokenConfigManager} from "./IArtTokenConfigManager.sol"; /** * @title ArtTokenConfigManager - * * @notice Abstract contract that implements the logic for managing token configurations. * @dev This contract is intended to be inherited by other contracts to provide token * configuration management functionality. It uses `ArtTokenConfigManagerStorage` @@ -17,7 +16,10 @@ import {IArtTokenConfigManager} from "./IArtTokenConfigManager.sol"; */ abstract contract ArtTokenConfigManager is IArtTokenConfigManager, RoleSystem { /** - * @inheritdoc IArtTokenConfigManager + * @notice Updates the creator of a specific token. + * @dev Can only be called by an account with the `ADMIN_ROLE`. + * @param tokenId The ID of the token to update. + * @param creator The address of the new creator. */ function updateTokenCreator(uint256 tokenId, address creator) external onlyRole(Roles.ADMIN_ROLE) { ArtTokenConfigManagerStorage.Layout storage $ = ArtTokenConfigManagerStorage.layout(); @@ -28,7 +30,10 @@ abstract contract ArtTokenConfigManager is IArtTokenConfigManager, RoleSystem { } /** - * @inheritdoc IArtTokenConfigManager + * @notice Updates the regulation mode of a specific token. + * @dev Can only be called by an account with the `ADMIN_ROLE`. + * @param tokenId The ID of the token to update. + * @param regulationMode The new regulation mode. */ function updateTokenRegulationMode( uint256 tokenId, @@ -42,7 +47,9 @@ abstract contract ArtTokenConfigManager is IArtTokenConfigManager, RoleSystem { } /** - * @inheritdoc IArtTokenConfigManager + * @notice Returns the creator of a specific token. + * @param tokenId The ID of the token to query. + * @return creator The address of the token's creator. */ function tokenCreator(uint256 tokenId) external view returns (address creator) { ArtTokenConfigManagerStorage.Layout storage $ = ArtTokenConfigManagerStorage.layout(); @@ -51,9 +58,13 @@ abstract contract ArtTokenConfigManager is IArtTokenConfigManager, RoleSystem { } /** - * @inheritdoc IArtTokenConfigManager + * @notice Returns the regulation mode of a specific token. + * @param tokenId The ID of the token to query. + * @return regulationMode The regulation mode of the token. */ - function tokenRegulationMode(uint256 tokenId) external view returns (TokenConfig.RegulationMode regulationMode) { + function tokenRegulationMode( + uint256 tokenId + ) external view returns (TokenConfig.RegulationMode regulationMode) { ArtTokenConfigManagerStorage.Layout storage $ = ArtTokenConfigManagerStorage.layout(); return $.tokenConfig[tokenId].regulationMode; @@ -96,7 +107,9 @@ abstract contract ArtTokenConfigManager is IArtTokenConfigManager, RoleSystem { * @param tokenId The ID of the token to query. * @return regulationMode The regulation mode of the token. */ - function _tokenRegulationMode(uint256 tokenId) internal view returns (TokenConfig.RegulationMode regulationMode) { + function _tokenRegulationMode( + uint256 tokenId + ) internal view returns (TokenConfig.RegulationMode regulationMode) { ArtTokenConfigManagerStorage.Layout storage $ = ArtTokenConfigManagerStorage.layout(); regulationMode = $.tokenConfig[tokenId].regulationMode; diff --git a/contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol b/contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol index 317d942..9e3e7f2 100644 --- a/contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol +++ b/contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol @@ -5,12 +5,11 @@ import {TokenConfig} from "../../utils/TokenConfig.sol"; /** * @title ArtTokenConfigManagerStorage - * * @notice Defines the storage layout for {ArtTokenConfigManager}. Using a deterministic slot makes the * module safe for use behind proxies and alongside other upgradeable components. */ library ArtTokenConfigManagerStorage { - /// @dev Unique storage slot for the layout, computed using EIP-7201 convention. + /// @notice Unique storage slot for the layout, computed using EIP-7201 convention. bytes32 private constant STORAGE_SLOT = keccak256(abi.encode(uint256(keccak256("digital-original.storage.ArtTokenConfigManager")) - 1)) & ~bytes32(uint256(0xff)); @@ -24,13 +23,11 @@ library ArtTokenConfigManagerStorage { /** * @notice Returns a pointer to the storage layout. - * * @return $ The pointer to the Layout struct in storage. */ function layout() internal pure returns (Layout storage $) { bytes32 slot = STORAGE_SLOT; - // solhint-disable-next-line assembly { $.slot := slot } diff --git a/contracts/art-token/art-token-config-manager/IArtTokenConfigManager.sol b/contracts/art-token/art-token-config-manager/IArtTokenConfigManager.sol index be82666..e6a730b 100644 --- a/contracts/art-token/art-token-config-manager/IArtTokenConfigManager.sol +++ b/contracts/art-token/art-token-config-manager/IArtTokenConfigManager.sol @@ -5,7 +5,6 @@ import {TokenConfig} from "../../utils/TokenConfig.sol"; /** * @title IArtTokenConfigManager - * * @notice Manages configuration for individual tokens, such as creator and regulation mode. */ interface IArtTokenConfigManager { @@ -17,7 +16,6 @@ interface IArtTokenConfigManager { /** * @notice Updates the creator of a specific token. - * @dev Can only be called by an account with the `ADMIN_ROLE`. * @param tokenId The ID of the token to update. * @param creator The address of the new creator. */ @@ -25,7 +23,6 @@ interface IArtTokenConfigManager { /** * @notice Updates the regulation mode of a specific token. - * @dev Can only be called by an account with the `ADMIN_ROLE`. * @param tokenId The ID of the token to update. * @param regulationMode The new regulation mode. */ @@ -43,7 +40,9 @@ interface IArtTokenConfigManager { * @param tokenId The ID of the token to query. * @return regulationMode The regulation mode of the token. */ - function tokenRegulationMode(uint256 tokenId) external view returns (TokenConfig.RegulationMode regulationMode); + function tokenRegulationMode( + uint256 tokenId + ) external view returns (TokenConfig.RegulationMode regulationMode); /** * @dev Thrown when an unauthorized account attempts to call a restricted function. diff --git a/contracts/art-token/libraries/TokenMintingPermit.sol b/contracts/art-token/libraries/TokenMintingPermit.sol index 73f301b..0898ebd 100644 --- a/contracts/art-token/libraries/TokenMintingPermit.sol +++ b/contracts/art-token/libraries/TokenMintingPermit.sol @@ -5,7 +5,6 @@ import {TokenConfig} from "../../utils/TokenConfig.sol"; /** * @title TokenMintingPermit - * * @notice EIP-712 struct for a token minting permit, which authorizes the minting of a new token with specified * parameters. */ @@ -14,7 +13,6 @@ library TokenMintingPermit { /** * @notice Represents a token minting permit. - * * @param tokenId The ID of the token to be minted. * @param minter The address of the account that will mint the token. * @param currency The token used for payment. @@ -59,9 +57,7 @@ library TokenMintingPermit { /** * @notice Hashes a token minting permit using the EIP-712 standard. - * * @param permit The permit to hash. - * * @return The EIP-712 hash of the permit. */ function hash(Type calldata permit) internal pure returns (bytes32) { diff --git a/contracts/auction-house/AuctionHouse.sol b/contracts/auction-house/AuctionHouse.sol index 2dcbe65..02e6c54 100644 --- a/contracts/auction-house/AuctionHouse.sol +++ b/contracts/auction-house/AuctionHouse.sol @@ -17,13 +17,19 @@ import {IAuctionHouse} from "./IAuctionHouse.sol"; /** * @title AuctionHouse - * * @notice Upgradeable English-auction contract that conducts primary sales for NFTs minted by * {ArtToken}. Users create auctions via an authorized EIP-712 permit, place bids and, * after the auction ends, the highest bidder receives the token while funds are * split between participants and the protocol treasury. */ -contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, CurrencyManager, CurrencyTransfers { +contract AuctionHouse is + IAuctionHouse, + EIP712Domain, + RoleSystem, + Authorization, + CurrencyManager, + CurrencyTransfers +{ using TokenConfig for TokenConfig.Type; using AuctionCreationPermit for AuctionCreationPermit.Type; @@ -36,84 +42,70 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, /// @notice Hard-coded upper bound for auction duration (21 days). uint256 public constant MAX_DURATION = 21 days; - /// @notice Ensures that an auction with `auctionId` exists. - /// @dev Reverts with {AuctionHouseAuctionNotExists} otherwise. + /// @notice Ensures that an auction with `auctionId` exists, reverts otherwise. modifier auctionExists(uint256 auctionId) { - if (_auctionExists(auctionId)) { - _; - } else { - revert AuctionHouseAuctionNotExists(); + if (!_auctionExists(auctionId)) { + revert AuctionHouseNonexistentAuction(); } + _; } - /// @notice Ensures that no auction with `auctionId` exists yet. - /// @dev Reverts with {AuctionHouseAuctionExists} otherwise. - modifier auctionNotExist(uint256 auctionId) { + /// @notice Ensures that no auction with `auctionId` exists yet, reverts otherwise. + modifier auctionDoesNotExist(uint256 auctionId) { if (_auctionExists(auctionId)) { - revert AuctionHouseAuctionExists(); - } else { - _; + revert AuctionHouseAuctionAlreadyExists(); } + _; } - /// @notice Ensures the auction has passed its `endTime`. - /// @dev Reverts with {AuctionHouseAuctionNotEnded} if still active. + /// @notice Ensures the auction has passed its `endTime`, reverts otherwise. modifier auctionEnded(uint256 auctionId) { - if (_auctionEnded(auctionId)) { - _; - } else { + if (!_auctionEnded(auctionId)) { revert AuctionHouseAuctionNotEnded(); } + _; } - /// @notice Ensures the auction is still active (not ended). - /// @dev Reverts with {AuctionHouseAuctionEnded} if the auction has ended. + /// @notice Ensures the auction is still active (not ended), reverts otherwise. modifier auctionNotEnded(uint256 auctionId) { if (_auctionEnded(auctionId)) { - revert AuctionHouseAuctionEnded(); - } else { - _; + revert AuctionHouseAuctionAlreadyEnded(); } + _; } - /// @notice Ensures the auction already has a highest bidder recorded. - /// @dev Reverts with {AuctionHouseBuyerNotExists} otherwise. + /// @notice Ensures the auction already has a highest bidder recorded, reverts otherwise. modifier auctionWithBuyer(uint256 auctionId) { - if (_auctionWithBuyer(auctionId)) { - _; - } else { - revert AuctionHouseBuyerNotExists(); + if (!_auctionWithBuyer(auctionId)) { + revert AuctionHouseMissingBuyer(); } + _; } - /// @notice Ensures the auction currently has no buyer. - /// @dev Reverts with {AuctionHouseBuyerExists} if a buyer is present. + /// @notice Ensures the auction currently has no buyer, reverts otherwise. modifier auctionWithoutBuyer(uint256 auctionId) { if (_auctionWithBuyer(auctionId)) { - revert AuctionHouseBuyerExists(); - } else { - _; + revert AuctionHouseUnexpectedBuyer(); } + _; } - /// @notice Ensures `account` is authorized to receive tokens. - /// @dev Reverts with {AuctionHouseUnauthorizedAccount} for non-compliant addresses. - modifier authorizedBuyer(address account) { - if (ART_TOKEN.recipientAuthorized(account)) { - _; - } else { + /// @notice Ensures the caller is compliant with the {ArtToken} contract, reverts otherwise. + modifier onlyCompliantAccount(address account) { + if (!ART_TOKEN.accountCompliant(account)) { revert AuctionHouseUnauthorizedAccount(account); } + _; } /** - * @notice Contract constructor. - * - * @param proxy Proxy address used for EIP-712 verifying contract. + * @notice Initializes the implementation with the given immutable parameters. + * @param proxy Address of the proxy that will ultimately own the implementation + * (used for EIP-712 domain separator). * @param main Address that will be set as {RoleSystem.MAIN}. * @param wrappedEther Address of the Wrapped Ether contract. - * @param artToken Address of the {ArtToken} contract. - * @param minAuctionDuration Minimum auction duration (seconds). + * @param artToken Address of the associated {ArtToken} contract. + * @param minAuctionDuration Minimum duration for auctions, in seconds. */ constructor( address proxy, @@ -130,12 +122,15 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, } /** - * @inheritdoc IAuctionHouse + * @notice Creates a new auction for a token that has not yet been minted. The auction details are + * specified in the `permit`, which is signed by an authorized auction-house signer. + * @param permit The `AuctionCreationPermit` struct containing the auction details. + * @param permitSignature The EIP-712 signature of the `permit`, signed by the auction-house signer. */ function create( AuctionCreationPermit.Type calldata permit, bytes calldata permitSignature - ) external auctionNotExist(permit.auctionId) { + ) external auctionDoesNotExist(permit.auctionId) { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); _requireAuthorizedAction(permit.hash(), permit.deadline, permitSignature); @@ -143,15 +138,11 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, permit.tokenConfig.requirePopulated(); if (permit.price == 0) { - revert AuctionHouseInvalidPrice(); - } - - if (permit.fee == 0) { - revert AuctionHouseInvalidFee(); + revert AuctionHouseZeroPrice(); } if (permit.step == 0) { - revert AuctionHouseInvalidStep(); + revert AuctionHouseZeroStep(); } if (permit.endTime < block.timestamp + MIN_DURATION) { @@ -163,11 +154,11 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, } if (!_currencyAllowed(permit.currency)) { - revert AuctionHouseInvalidCurrency(); + revert AuctionHouseUnsupportedCurrency(); } if (_tokenReserved(permit.tokenId)) { - revert AuctionHouseTokenReserved($.tokenAuctionId[permit.tokenId]); + revert AuctionHouseTokenAlreadyReserved($.tokenAuctionId[permit.tokenId]); } if (ART_TOKEN.tokenExists(permit.tokenId)) { @@ -198,18 +189,9 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, } /** - * @inheritdoc IAuctionHouse - * - * @dev First bid path. The function: - * - Checks caller authorization via {authorizedBuyer}. - * - Transfers `newPrice + fee` from the caller to the contract. - * - Stores the caller as `buyer` and `newPrice` as `price`. - * - Emits {Raised}. - * - * Reverts with {AuctionHouseRaiseTooLow} if `newPrice < initial price`. - * - * @param auctionId Identifier of the auction that has no current buyer. - * @param newPrice First bid amount. + * @notice Places the first bid on an auction, which must be at least the starting price. + * @param auctionId The ID of the auction to bid on. + * @param newPrice The amount of the bid, which must be at least the starting price. */ function raiseInitial( uint256 auctionId, @@ -217,38 +199,33 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, ) external payable - authorizedBuyer(msg.sender) + onlyCompliantAccount(msg.sender) auctionExists(auctionId) auctionNotEnded(auctionId) auctionWithoutBuyer(auctionId) { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); + Auction.Type storage _auction = $.auction[auctionId]; - if (newPrice < $.auction[auctionId].price) { - revert AuctionHouseRaiseTooLow($.auction[auctionId].price); + if (newPrice < _auction.price) { + revert AuctionHouseRaiseTooLow(_auction.price); } - $.auction[auctionId].buyer = msg.sender; - $.auction[auctionId].price = newPrice; + _auction.buyer = msg.sender; + _auction.price = newPrice; emit Raised(auctionId, msg.sender, newPrice); - _receiveCurrency($.auction[auctionId].currency, msg.sender, newPrice + $.auction[auctionId].fee); + _receiveCurrency(_auction.currency, msg.sender, newPrice + _auction.fee); } /** - * @inheritdoc IAuctionHouse - * - * @dev Subsequent bid path. The function: - * - Transfers `newPrice + fee` from the caller. - * - Refunds `oldPrice + fee` to the previously highest `buyer`. - * - Updates storage and emits {Raised}. - * - * Reverts with {AuctionHouseRaiseTooLow} when `newPrice` is less than - * `current price + step`. - * - * @param auctionId Identifier of the auction with an existing buyer. - * @param newPrice New highest bid. + * @notice Raises the current highest bid on an auction. The new bid must be at least the sum of the + * current highest bid and the minimum step increment. + * @dev when a new bid is placed, the previous highest bidder is refunded. + * @param auctionId The ID of the auction to bid on. + * @param newPrice The amount of the new bid, which must be at least the sum of the current highest + * bid and the minimum step increment. */ function raise( uint256 auctionId, @@ -256,86 +233,80 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, ) external payable - authorizedBuyer(msg.sender) + onlyCompliantAccount(msg.sender) auctionExists(auctionId) auctionNotEnded(auctionId) auctionWithBuyer(auctionId) { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); - - Auction.Type memory _auction = $.auction[auctionId]; + Auction.Type storage _auction = $.auction[auctionId]; uint256 oldPrice = _auction.price; address oldBuyer = _auction.buyer; + uint256 fee = _auction.fee; + address currency = _auction.currency; if (newPrice < oldPrice + _auction.step) { revert AuctionHouseRaiseTooLow(oldPrice + _auction.step); } - emit Raised(auctionId, msg.sender, newPrice); + _auction.price = newPrice; + _auction.buyer = msg.sender; - _receiveCurrency(_auction.currency, msg.sender, newPrice + _auction.fee); + emit Raised(auctionId, msg.sender, newPrice); - $.auction[auctionId].price = newPrice; - $.auction[auctionId].buyer = msg.sender; + _receiveCurrency(currency, msg.sender, newPrice + fee); - _sendCurrency(_auction.currency, oldBuyer, oldPrice + _auction.fee); + _sendCurrency(currency, oldBuyer, oldPrice + fee); } /** - * @inheritdoc IAuctionHouse - * - * @dev Finalizes the auction after `endTime`: - * 1. Marks auction as sold and emits {Sold}. - * 2. Mints the NFT to the stored `buyer` via {ArtToken.mintFromAuctionHouse}. - * 3. Transfers the platform `fee` to the treasury (owner of {Roles.FINANCIAL_ROLE}). - * 4. Splits the sale `price` among `participants` according to `shares` using - * {ShareUtils.calculateRewards} and {CurrencyTransfers._sendCurrencyBatch}. - * - * Reverts with {AuctionHouseTokenSold} if already settled. - * - * @param auctionId Identifier of the auction to settle. + * @notice Finalizes an auction that has ended, transferring the token to the buyer and distributing + * the revenue. + * @param auctionId The ID of the auction to finalize. */ function finish( uint256 auctionId ) external auctionExists(auctionId) auctionEnded(auctionId) auctionWithBuyer(auctionId) { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); - - Auction.Type memory _auction = $.auction[auctionId]; + Auction.Type storage _auction = $.auction[auctionId]; if (_auction.sold) { - revert AuctionHouseTokenSold(); + revert AuctionHouseTokenAlreadySold(); } - $.auction[auctionId].sold = true; + _auction.sold = true; emit Sold(auctionId); - ART_TOKEN.mintFromAuctionHouse( - _auction.buyer, - _auction.tokenId, - _auction.tokenURI, - $.tokenConfig[_auction.tokenId] - ); + address currency = _auction.currency; + uint256 price = _auction.price; - _sendCurrency(_auction.currency, _uniqueRoleOwner(Roles.FINANCIAL_ROLE), _auction.fee); + _sendCurrency(currency, _uniqueRoleOwner(Roles.FINANCIAL_ROLE), _auction.fee); _sendCurrencyBatch( - _auction.currency, - _auction.price, + currency, + price, _auction.participants, - ShareUtils.calculateRewards(_auction.price, _auction.shares) + ShareUtils.calculateRewards(price, _auction.shares) + ); + + uint256 tokenId = _auction.tokenId; + + ART_TOKEN.safeMintFromAuctionHouse( + _auction.buyer, + tokenId, + _auction.tokenURI, + $.tokenConfig[tokenId] ); } /** - * @inheritdoc IAuctionHouse - * - * @dev Cancels an auction that has no bids. + * @notice Cancels an active auction. + * @dev An auction can only be cancelled if there are no bids yet. * Can only be called by an account with the `ADMIN_ROLE`. * The function marks the auction as ended by setting its `endTime` to the current block timestamp. - * - * @param auctionId Identifier of the auction to cancel. + * @param auctionId The ID of the auction to cancel. */ function cancel( uint256 auctionId @@ -355,7 +326,8 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, } /** - * @inheritdoc IAuctionHouse + * @notice Returns the full auction struct for `auctionId`. + * @param auctionId The ID of the auction to retrieve. */ function auction(uint256 auctionId) external view auctionExists(auctionId) returns (Auction.Type memory) { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); @@ -364,16 +336,17 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, } /** - * @inheritdoc IAuctionHouse + * @notice Indicates whether any active auction has reserved `tokenId` for future minting. + * @param tokenId The ID of the token to check. + * @return reserved True if the token is currently locked by an active auction. */ function tokenReserved(uint256 tokenId) external view returns (bool reserved) { return _tokenReserved(tokenId); } /** - * @notice Internal helper that checks whether `tokenId` is reserved by an active auction - * or an ended auction with a buyer. - * + * @notice Internal helper that indicates whether any active auction has reserved `tokenId` + * for future minting. * @param tokenId The ID of the token to check. * @return reserved True if the token is reserved. */ @@ -392,14 +365,13 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, return true; } - if (_auctionWithBuyer(auctionId)) { - // The auction has a buyer + if ($.auction[auctionId].sold) { + // The auction has been sold (token minted) + return false; + } - /** - * If a buyer exists, the token remains reserved by the auction - * even after the auction ends and the token is minted. - * This behavior fully matches the current logic. - */ + if (_auctionWithBuyer(auctionId)) { + // The auction has a buyer (token not minted) return true; } @@ -409,9 +381,8 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, /** * @notice Internal helper that returns true if `auctionId`'s `endTime` is in the past. - * * @param auctionId The ID of the auction to check. - * @return bool True if the auction has ended, false otherwise. + * @return bool True if the auction has ended. */ function _auctionEnded(uint256 auctionId) private view returns (bool) { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); @@ -422,7 +393,7 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, /** * @notice Internal helper that checks whether an auction struct has been populated. * @param auctionId The ID of the auction to check. - * @return bool True if the auction exists, false otherwise. + * @return bool True if the auction exists. */ function _auctionExists(uint256 auctionId) private view returns (bool) { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); @@ -433,7 +404,7 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, /** * @notice Internal helper that returns true when an auction has a non-zero buyer. * @param auctionId The ID of the auction to check. - * @return bool True if the auction has a buyer, false otherwise. + * @return bool True if the auction has a buyer. */ function _auctionWithBuyer(uint256 auctionId) private view returns (bool) { AuctionHouseStorage.Layout storage $ = AuctionHouseStorage.layout(); @@ -441,3 +412,164 @@ contract AuctionHouse is IAuctionHouse, EIP712Domain, RoleSystem, Authorization, return $.auction[auctionId].buyer != address(0); } } + +/** + * ------------------------------------------------------------------------- + * AuctionHouse State Machine Specification + * ------------------------------------------------------------------------- + * + * This document describes the implicit state machine governing each auction. + * + * The contract does not use an explicit enum to represent auction states. + * Instead, the state of an auction is derived from the combination of: + * + * - `endTime` + * - `buyer` + * - `sold` + * + * Each auction deterministically transitions between the states described below. + * + * ------------------------------------------------------------------------- + * STATE DEFINITIONS + * ------------------------------------------------------------------------- + * + * ------------------------------------------------------------------------- + * 0. Nonexistent + * ------------------------------------------------------------------------- + * + * Conditions: + * - auction.endTime == 0 + * + * Description: + * The auction has not been created. + * + * Allowed actions: + * - create() + * + * Disallowed actions: + * - raiseInitial() + * - raise() + * - finish() + * - cancel() + * + * ------------------------------------------------------------------------- + * 1. Active (No Bids) + * ------------------------------------------------------------------------- + * + * Conditions: + * - auction.endTime > block.timestamp + * - auction.buyer == address(0) + * - auction.sold == false + * + * Description: + * The auction exists and is currently active. + * No bids have been placed yet. + * + * Allowed actions: + * - raiseInitial() + * - cancel() (ADMIN_ROLE only) + * + * Disallowed actions: + * - raise() + * - finish() + * + * Transitions: + * - raiseInitial() → Active (Has Bids) + * - cancel() → Ended (No Bids) + * - time expiration → Ended (No Bids) + * + * ------------------------------------------------------------------------- + * 2. Active (Has Bids) + * ------------------------------------------------------------------------- + * + * Conditions: + * - auction.endTime > block.timestamp + * - auction.buyer != address(0) + * - auction.sold == false + * + * Description: + * The auction is active and has a current highest bidder. + * + * Allowed actions: + * - raise() + * + * Disallowed actions: + * - raiseInitial() + * - cancel() + * - finish() + * + * Transitions: + * - raise() → remains Active (Has Bids) + * - time expiration → Ended (Has Bids) + * + * ------------------------------------------------------------------------- + * 3. Ended (No Bids) + * ------------------------------------------------------------------------- + * + * Conditions: + * - auction.endTime <= block.timestamp + * - auction.buyer == address(0) + * - auction.sold == false + * + * Description: + * The auction ended without any bids. + * No token is minted and no funds are distributed. + * + * Allowed actions: + * - none + * + * Token reservation behavior: + * - tokenReserved(tokenId) returns false + * - the token may be reused in a future auction + * + * ------------------------------------------------------------------------- + * 4. Ended (Has Bids, Not Settled) + * ------------------------------------------------------------------------- + * + * Conditions: + * - auction.endTime <= block.timestamp + * - auction.buyer != address(0) + * - auction.sold == false + * + * Description: + * The auction has ended and a winner exists, + * but settlement has not yet been executed. + * + * Allowed actions: + * - finish() + * + * Disallowed actions: + * - raiseInitial() + * - raise() + * - cancel() + * + * Transitions: + * - finish() → Settled + * + * Token reservation behavior: + * - tokenReserved(tokenId) returns true + * - token remains reserved until settlement + * + * ------------------------------------------------------------------------- + * 5. Settled (Final State) + * ------------------------------------------------------------------------- + * + * Conditions: + * - auction.sold == true + * + * Description: + * The auction has been finalized: + * - the NFT is minted to the winner + * - the protocol fee is transferred + * - proceeds are distributed to participants + * + * This is a terminal state. + * + * Allowed actions: + * - none + * + * Token reservation behavior: + * - tokenReserved(tokenId) returns false + * - token is permanently minted and no longer reservable + * + */ diff --git a/contracts/auction-house/AuctionHouseStorage.sol b/contracts/auction-house/AuctionHouseStorage.sol index 07ed56a..90bd3a9 100644 --- a/contracts/auction-house/AuctionHouseStorage.sol +++ b/contracts/auction-house/AuctionHouseStorage.sol @@ -6,12 +6,11 @@ import {TokenConfig} from "../utils/TokenConfig.sol"; /** * @title AuctionHouseStorage - * * @notice Defines the storage layout for {AuctionHouse}. Using a deterministic slot makes the * module safe for use behind proxies and alongside other upgradeable components. */ library AuctionHouseStorage { - /// @dev Unique storage slot for the layout, computed using EIP-7201 convention. + /// @notice Unique storage slot for the layout, computed using EIP-7201 convention. bytes32 private constant STORAGE_SLOT = keccak256(abi.encode(uint256(keccak256("digital-original.storage.AuctionHouse")) - 1)) & ~bytes32(uint256(0xff)); @@ -27,13 +26,11 @@ library AuctionHouseStorage { /** * @notice Returns a pointer to the storage layout. - * * @return $ The pointer to the Layout struct in storage. */ function layout() internal pure returns (Layout storage $) { bytes32 slot = STORAGE_SLOT; - // solhint-disable-next-line assembly { $.slot := slot } diff --git a/contracts/auction-house/IAuctionHouse.sol b/contracts/auction-house/IAuctionHouse.sol index 95750e1..caa4d97 100644 --- a/contracts/auction-house/IAuctionHouse.sol +++ b/contracts/auction-house/IAuctionHouse.sol @@ -6,15 +6,13 @@ import {AuctionCreationPermit} from "./libraries/AuctionCreationPermit.sol"; /** * @title IAuctionHouse - * * @notice Interface for the protocol's English-auction module responsible for primary NFT sales. * Allows creating auctions, placing bids (raises), and finalizing sales with revenue * distribution. */ interface IAuctionHouse { /** - * @notice Emitted after a successful call to {create}. - * + * @notice Emitted when a new auction is created. * @param auctionId Identifier of the newly created auction. * @param tokenId Token identifier associated with the auction. * @param price Starting price. @@ -23,8 +21,7 @@ interface IAuctionHouse { event Created(uint256 indexed auctionId, uint256 indexed tokenId, uint256 price, uint256 endTime); /** - * @notice Emitted each time a new highest bid is placed. - * + * @notice Emitted when a new highest bid is placed on an auction. * @param auctionId Identifier of the auction. * @param buyer Address of the bidder. * @param price New highest bid. @@ -32,115 +29,118 @@ interface IAuctionHouse { event Raised(uint256 indexed auctionId, address indexed buyer, uint256 price); /** - * @notice Emitted when {finish} successfully settles the auction. - * + * @notice Emitted when an auction is finalized with a sale. * @param auctionId Identifier of the auction that was sold. */ event Sold(uint256 indexed auctionId); /** * @notice Emitted when an auction is cancelled. - * * @param auctionId Identifier of the auction that was cancelled. */ event Cancelled(uint256 indexed auctionId); /** - * @notice Creates a new auction with parameters validated and authorized via - * an EIP-712 signature. - * + * @notice Creates a new auction for a token that has not yet been minted. The auction details are + * specified in the `permit`, which is signed by an authorized auction-house signer. * @param permit The `AuctionCreationPermit` struct containing the auction details. * @param permitSignature The EIP-712 signature of the `permit`, signed by the auction-house signer. */ function create(AuctionCreationPermit.Type calldata permit, bytes calldata permitSignature) external; /** - * @notice Places the first bid on an auction that has no current bidder. + * @notice Places the first bid on an auction, which must be at least the starting price. + * @param auctionId The ID of the auction to bid on. + * @param newPrice The amount of the bid, which must be at least the starting price. */ function raiseInitial(uint256 auctionId, uint256 newPrice) external payable; /** - * @notice Places a bid higher than the current highest bid by at least `step`. + * @notice Raises the current highest bid on an auction. The new bid must be at least the sum of the + * current highest bid and the minimum step increment. + * @dev when a new bid is placed, the previous highest bidder is refunded. + * @param auctionId The ID of the auction to bid on. + * @param newPrice The amount of the new bid, which must be at least the sum of the current highest + * bid and the minimum step increment. */ function raise(uint256 auctionId, uint256 newPrice) external payable; /** - * @notice Finalizes the auction, mints the token to the highest bidder - * and distributes proceeds. + * @notice Finalizes an auction that has ended, transferring the token to the buyer and distributing + * the revenue. + * @param auctionId The ID of the auction to finalize. */ function finish(uint256 auctionId) external; /** - * @notice Cancels an auction. + * @notice Cancels an active auction. + * @dev An auction can only be cancelled if there are no bids yet. + * @param auctionId The ID of the auction to cancel. */ function cancel(uint256 auctionId) external; /** * @notice Returns the full auction struct for `auctionId`. - * * @param auctionId The ID of the auction to retrieve. */ function auction(uint256 auctionId) external view returns (Auction.Type memory); /** - * @notice Indicates whether any active auction has reserved `tokenId`. - * + * @notice Indicates whether any active auction has reserved `tokenId` for future minting. * @param tokenId The ID of the token to check. - * - * @return reserved True if the token is currently locked by an active auction or an ended - * auction with a buyer. + * @return reserved True if the token is currently locked by an active auction. */ function tokenReserved(uint256 tokenId) external view returns (bool reserved); /// @dev Thrown when an action is attempted by an unauthorized account. + /// @param account The address of the unauthorized account. error AuctionHouseUnauthorizedAccount(address account); - /// @dev Thrown when `price` provided is below minimum allowed. - error AuctionHouseInvalidPrice(); + /// @dev Thrown when the `price` provided is zero. + error AuctionHouseZeroPrice(); - /// @dev Thrown when `fee` provided is below minimum allowed. - error AuctionHouseInvalidFee(); + /// @dev Thrown when the `step` parameter is zero. + error AuctionHouseZeroStep(); - /// @dev Thrown when `step` parameter is zero. - error AuctionHouseInvalidStep(); - - /// @dev Thrown when `endTime` is outside the permitted window. + /// @dev Thrown when the provided `endTime` is outside the permitted time window. error AuctionHouseInvalidEndTime(); - /// @dev Thrown when a currency is invalid. - error AuctionHouseInvalidCurrency(); + /// @dev Thrown when the currency specified is not supported. + error AuctionHouseUnsupportedCurrency(); /// @dev Thrown when the token is already reserved by another auction. /// @param existingAuctionId The ID of the auction that has reserved the token. - error AuctionHouseTokenReserved(uint256 existingAuctionId); + error AuctionHouseTokenAlreadyReserved(uint256 existingAuctionId); /// @dev Thrown when the token has already been minted. error AuctionHouseTokenAlreadyMinted(); - /// @dev Thrown when trying to set a buyer but one already exists. - error AuctionHouseBuyerExists(); + /// @dev Thrown when a buyer exists but is not expected. + error AuctionHouseUnexpectedBuyer(); - /// @dev Thrown when expected buyer does not exist. - error AuctionHouseBuyerNotExists(); + /// @dev Thrown when a buyer does not exist but is expected. + error AuctionHouseMissingBuyer(); - /// @dev Thrown when creating an auction that already exists. - error AuctionHouseAuctionExists(); + /// @dev Thrown when an auction already exists. + error AuctionHouseAuctionAlreadyExists(); - /// @dev Thrown when referencing a non-existent auction. - error AuctionHouseAuctionNotExists(); + /// @dev Thrown when an auction does not exist. + error AuctionHouseNonexistentAuction(); /// @dev Thrown when the auction has already ended. - error AuctionHouseAuctionEnded(); + error AuctionHouseAuctionAlreadyEnded(); /// @dev Thrown when the auction has not yet ended. error AuctionHouseAuctionNotEnded(); - /// @dev Thrown when attempting to finish an auction whose token is already sold. - error AuctionHouseTokenSold(); + /// @dev Thrown when the token has already been sold. + error AuctionHouseTokenAlreadySold(); - /// @dev Thrown when a raise is below the minimum increment. + /// @dev Thrown when the provided bid amount is below the required minimum. + /// @param minAmount The minimum allowed bid amount. error AuctionHouseRaiseTooLow(uint256 minAmount); - /// @dev Thrown when constructor argument at `argIndex` is invalid. + /// @dev Thrown when a constructor argument is invalid. + /// @param argIndex The index of the invalid constructor argument. error AuctionHouseMisconfiguration(uint8 argIndex); } diff --git a/contracts/auction-house/libraries/Auction.sol b/contracts/auction-house/libraries/Auction.sol index 1eddd27..0f9da2e 100644 --- a/contracts/auction-house/libraries/Auction.sol +++ b/contracts/auction-house/libraries/Auction.sol @@ -3,13 +3,11 @@ pragma solidity ^0.8.20; /** * @title Auction - * * @notice A library that defines the data structure for an auction. */ library Auction { /** * @notice Represents an auction for a single token. - * * @param tokenId The ID of the token being auctioned. * @param price The current price of the auction, which is the highest bid or starting price. * @param fee The platform fee for the auction. diff --git a/contracts/auction-house/libraries/AuctionCreationPermit.sol b/contracts/auction-house/libraries/AuctionCreationPermit.sol index d6534dd..43700ed 100644 --- a/contracts/auction-house/libraries/AuctionCreationPermit.sol +++ b/contracts/auction-house/libraries/AuctionCreationPermit.sol @@ -5,16 +5,14 @@ import {TokenConfig} from "../../utils/TokenConfig.sol"; /** * @title AuctionCreationPermit - * - * @notice EIP-712 struct for an auction creation permit, which authorizes the creation of a new auction with - * specified parameters. + * @notice EIP-712 struct for an auction creation permit, which authorizes + * the creation of a new auction with specified parameters. */ library AuctionCreationPermit { using TokenConfig for TokenConfig.Type; /** * @notice Represents an auction creation permit. - * * @param auctionId The ID of the auction to be created. * @param tokenId The ID of the token to be auctioned. * @param currency The token used for payment. @@ -65,9 +63,7 @@ library AuctionCreationPermit { /** * @notice Hashes an auction creation permit using the EIP-712 standard. - * * @param permit The permit to hash. - * * @return The EIP-712 hash of the permit. */ function hash(Type calldata permit) internal pure returns (bytes32) { diff --git a/contracts/auction-house/libraries/ShareUtils.sol b/contracts/auction-house/libraries/ShareUtils.sol index a21bae8..6788334 100644 --- a/contracts/auction-house/libraries/ShareUtils.sol +++ b/contracts/auction-house/libraries/ShareUtils.sol @@ -4,16 +4,22 @@ pragma solidity ^0.8.20; import {Math} from "@openzeppelin/contracts/utils/math/Math.sol"; import {ONE_HUNDRED_PERCENT_IN_BP} from "../../utils/Constants.sol"; +/** + * @title ShareUtils + * @notice A library for calculating and validating share distributions. + * @dev This library provides functions to calculate individual reward amounts based on shares + * and to validate the conditions for a share distribution. + */ library ShareUtils { + /// @notice The maximum number of participants allowed in a share distribution. + uint256 private constant MAX_PARTICIPANTS = 10; + /** * @notice Calculates the individual reward amounts from a total amount based on shares. - * * @dev The last participant receives the remaining amount to prevent loss from rounding errors. - * - * @param amount The total amount to be divided. + * @param amount The total amount to be distributed. * @param shares An array of shares (in basis points). - * - * @return rewards An array of calculated reward amounts for each participant. + * @return rewards An array of calculated reward amounts corresponding to each share. */ function calculateRewards( uint256 amount, @@ -32,7 +38,7 @@ library ShareUtils { rewards[i] = value; unchecked { - i++; + ++i; } } @@ -42,16 +48,21 @@ library ShareUtils { /** * @notice Validates the conditions for a share distribution. - * - * @dev Checks for correct array lengths, non-zero addresses, non-zero shares, and that the - * total shares sum up to 100%. - * + * @dev Checks for correct array lengths, non-zero addresses, non-zero shares, + * and that the total shares sum up to 100%. * @param participants An array of addresses for the recipients. * @param shares An array of shares (in basis points). */ - function requireValidConditions(address[] calldata participants, uint256[] calldata shares) internal pure { + function requireValidConditions( + address[] calldata participants, + uint256[] calldata shares + ) internal pure { uint256 participantsCount = participants.length; + if (participantsCount == 0 || participantsCount > MAX_PARTICIPANTS) { + revert ShareUtilsInvalidParticipantsCount(participantsCount); + } + if (participantsCount != shares.length) { revert ShareUtilsParticipantsSharesMismatch(); } @@ -72,7 +83,7 @@ library ShareUtils { sharesSum += share; unchecked { - i++; + ++i; } } @@ -81,6 +92,10 @@ library ShareUtils { } } + /// @dev Thrown when the number of participants is zero or exceeds the maximum allowed. + /// @param participantsCount The actual number of participants provided. + error ShareUtilsInvalidParticipantsCount(uint256 participantsCount); + /// @dev Thrown when `participants.length != shares.length`. error ShareUtilsParticipantsSharesMismatch(); diff --git a/contracts/market/IMarket.sol b/contracts/market/IMarket.sol index 3e8d166..16be281 100644 --- a/contracts/market/IMarket.sol +++ b/contracts/market/IMarket.sol @@ -6,17 +6,15 @@ import {OrderExecutionPermit} from "./libraries/OrderExecutionPermit.sol"; /** * @title IMarket - * * @notice Interface for the protocol's secondary market module. It allows users to trade NFTs * through off-chain orders (asks and bids) that are executed on-chain. */ interface IMarket { /** * @notice Emitted when a sell-side order (ask) is executed. - * * @param orderHash The hash of the executed ask order. * @param collection Address of the ERC-721 collection contract. - * @param currency Address of the settlement currency (ERC-20). + * @param currency Address of the settlement currency. * @param maker Address of the seller. * @param taker Address of the buyer. * @param tokenId The identifier of the token that was sold. @@ -34,10 +32,9 @@ interface IMarket { /** * @notice Emitted when a buy-side order (bid) is executed. - * * @param orderHash The hash of the executed bid order. * @param collection Address of the ERC-721 collection contract. - * @param currency Address of the settlement currency (ERC-20). + * @param currency Address of the settlement currency. * @param maker Address of the buyer. * @param taker Address of the seller. * @param tokenId The identifier of the token that was bought. @@ -55,7 +52,6 @@ interface IMarket { /** * @notice Emitted when an order is invalidated by its maker or a market admin. - * * @param maker Address of the order's maker. * @param orderHash The hash of the invalidated order. */ @@ -63,13 +59,10 @@ interface IMarket { /** * @notice Executes a sell-side order (ask). - * * @dev The `order` must be signed by the `maker` (seller), and the `permit` must be signed by * the market signer. The `msg.sender` is the `taker` (buyer). - * * @param order The ask order to execute. See {Order.Type}. - * @param permit The execution permit, containing revenue-sharing information. See - * {OrderExecutionPermit.Type}. + * @param permit The execution permit, containing revenue-sharing information. See {OrderExecutionPermit.Type}. * @param orderSignature The EIP-712 signature of the `order`, signed by the `maker`. * @param permitSignature The EIP-712 signature of the `permit`, signed by the market signer. */ @@ -82,13 +75,10 @@ interface IMarket { /** * @notice Executes a buy-side order (bid). - * * @dev The `order` must be signed by the `maker` (buyer), and the `permit` must be signed by * the market signer. The `msg.sender` is the `taker` (seller). - * * @param order The bid order to execute. See {Order.Type}. - * @param permit The execution permit, containing revenue-sharing information. See - * {OrderExecutionPermit.Type}. + * @param permit The execution permit, containing revenue-sharing information. See {OrderExecutionPermit.Type}. * @param orderSignature The EIP-712 signature of the `order`, signed by the `maker`. * @param permitSignature The EIP-712 signature of the `permit`, signed by the market signer. */ @@ -101,9 +91,7 @@ interface IMarket { /** * @notice Invalidates an order, preventing its future execution. - * * @dev Can be called by the `maker` of the order or a market admin. - * * @param maker Address of the order's maker. * @param orderHash The hash of the order to invalidate. */ @@ -111,22 +99,20 @@ interface IMarket { /** * @notice Checks if an order has been invalidated. - * * @param maker Address of the order's maker. * @param orderHash The hash of the order to check. - * - * @return invalidated True if the order has been invalidated, false otherwise. + * @return invalidated True if the order has been invalidated. */ function orderInvalidated(address maker, bytes32 orderHash) external view returns (bool invalidated); /// @dev Thrown when an order signature is not from the specified `maker`. - error MarketUnauthorizedOrder(); + error MarketInvalidOrderSignature(); /// @dev Thrown when an order is executed with an invalid side. error MarketInvalidOrderSide(); - /// @dev Thrown when an order hash is invalid. - error MarketInvalidOrderHash(); + /// @dev Thrown when the hash of the `order` does not match the `orderHash` in the `permit`. + error MarketOrderHashMismatch(); /// @dev Thrown when an action is attempted by an unauthorized account. error MarketUnauthorizedAccount(); @@ -134,12 +120,15 @@ interface IMarket { /// @dev Thrown when an order is executed outside of its `startTime` and `endTime`. error MarketOrderOutsideOfTimeRange(); - /// @dev Thrown when the specified `currency` is not supported. - error MarketCurrencyInvalid(); + /// @dev Thrown when the currency specified is not supported. + error MarketUnsupportedCurrency(); /// @dev Thrown when an attempt is made to execute an invalidated order. error MarketOrderInvalidated(bytes32 orderHash); + /// @dev Thrown when an order price is zero. + error MarketZeroOrderPrice(); + /// @dev Thrown when an ask side fee is invalid. error MarketInvalidAskSideFee(); diff --git a/contracts/market/Market.sol b/contracts/market/Market.sol index b57e88a..9f3608b 100644 --- a/contracts/market/Market.sol +++ b/contracts/market/Market.sol @@ -17,7 +17,6 @@ import {OrderExecutionPermit} from "./libraries/OrderExecutionPermit.sol"; /** * @title Market - * * @notice Upgradeable secondary market contract that facilitates peer-to-peer trading of NFTs * through off-chain orders. It supports both sell-side (ask) and buy-side (bid) orders, * which are authorized via EIP-712 signatures. @@ -27,8 +26,7 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza using OrderExecutionPermit for OrderExecutionPermit.Type; /** - * @notice Contract constructor. - * + * @notice Initializes the implementation with the given immutable parameters. * @param proxy Proxy address used for EIP-712 verifying contract. * @param main Address that will be set as {RoleSystem.MAIN}. * @param wrappedEther Address of the Wrapped Ether contract. @@ -40,14 +38,20 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza ) EIP712Domain(proxy, "Market", "1") RoleSystem(main) CurrencyTransfers(wrappedEther) {} /** - * @inheritdoc IMarket - * - * @dev Flow: - * 1. Validates the order side, taker, currency, signatures, and time range. - * 2. Invalidates the order to prevent replay attacks. - * 3. Distributes the payment and fees. - * 4. Transfers the token from the seller to the buyer. - * 5. Emits {AskOrderExecuted}. + * @notice Executes a sell-side order (ask). + * @dev The `order` must be signed by the `maker` (seller), and the `permit` must be signed by + * the market signer. The `msg.sender` is the `taker` (buyer). + * `maker` is Ask side, `taker` is Bid side. + * Flow: + * 1. Validates the order side, taker, currency, signatures, and time range. + * 2. Invalidates the order to prevent replay attacks. + * 3. Distributes the payment and fees. + * 4. Transfers the token from the seller to the buyer. + * 5. Emits {AskOrderExecuted}. + * @param order The ask order to execute. See {Order.Type}. + * @param permit The execution permit, containing revenue-sharing information. See {OrderExecutionPermit.Type}. + * @param orderSignature The EIP-712 signature of the `order`, signed by the `maker`. + * @param permitSignature The EIP-712 signature of the `permit`, signed by the market signer. */ function executeAsk( Order.Type calldata order, @@ -60,10 +64,15 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza } if (permit.orderHash != order.hash()) { - revert MarketInvalidOrderHash(); + revert MarketOrderHashMismatch(); + } + + if (order.price == 0) { + revert MarketZeroOrderPrice(); } if (order.makerFee >= order.price) { + // maker is Ask side revert MarketInvalidAskSideFee(); } @@ -72,7 +81,7 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza } if (!_currencyAllowed(order.currency)) { - revert MarketCurrencyInvalid(); + revert MarketUnsupportedCurrency(); } address maker = order.maker; @@ -112,14 +121,20 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza } /** - * @inheritdoc IMarket - * - * @dev Flow: - * 1. Validates the order side, taker, currency, signatures, and time range. - * 2. Invalidates the order to prevent replay attacks. - * 3. Distributes the payment and fees. - * 4. Transfers the token from the seller to the buyer. - * 5. Emits {BidOrderExecuted}. + * @notice Executes a buy-side order (bid). + * @dev The `order` must be signed by the `maker` (buyer), and the `permit` must be signed by + * the market signer. The `msg.sender` is the `taker` (seller). + * `maker` is Bid side, `taker` is Ask side. + * Flow: + * 1. Validates the order side, taker, currency, signatures, and time range. + * 2. Invalidates the order to prevent replay attacks. + * 3. Distributes the payment and fees. + * 4. Transfers the token from the seller to the buyer. + * 5. Emits {BidOrderExecuted}. + * @param order The bid order to execute. See {Order.Type}. + * @param permit The execution permit, containing revenue-sharing information. See {OrderExecutionPermit.Type}. + * @param orderSignature The EIP-712 signature of the `order`, signed by the `maker`. + * @param permitSignature The EIP-712 signature of the `permit`, signed by the market signer. */ function executeBid( Order.Type calldata order, @@ -132,10 +147,15 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza } if (permit.orderHash != order.hash()) { - revert MarketInvalidOrderHash(); + revert MarketOrderHashMismatch(); + } + + if (order.price == 0) { + revert MarketZeroOrderPrice(); } if (permit.takerFee >= order.price) { + // taker is Ask side revert MarketInvalidAskSideFee(); } @@ -144,7 +164,7 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza } if (!_currencyAllowed(order.currency) || order.currency == ETHER) { - revert MarketCurrencyInvalid(); + revert MarketUnsupportedCurrency(); } address maker = order.maker; @@ -184,7 +204,10 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza } /** - * @inheritdoc IMarket + * @notice Invalidates an order, preventing its future execution. + * @dev Can be called by the `maker` of the order or a market admin. + * @param maker Address of the order's maker. + * @param orderHash The hash of the order to invalidate. */ function invalidateOrder(address maker, bytes32 orderHash) external { if (msg.sender == maker || _hasRole(Roles.ADMIN_ROLE, msg.sender)) { @@ -197,7 +220,10 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza } /** - * @inheritdoc IMarket + * @notice Checks if an order has been invalidated. + * @param maker Address of the order's maker. + * @param orderHash The hash of the order to check. + * @return invalidated True if the order has been invalidated. */ function orderInvalidated(address maker, bytes32 orderHash) external view returns (bool invalidated) { MarketStorage.Layout storage $ = MarketStorage.layout(); @@ -207,8 +233,7 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza /** * @notice Internal function to handle the distribution of funds for an order. - * - * @param currency The ERC-20 token used for the payment. + * @param currency The currency token used for the payment. * @param askSide The seller's address. * @param bidSide The buyer's address. * @param price The price of the order. @@ -238,9 +263,7 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza /** * @notice Internal function to invalidate an order. - * - * @dev Reverts with {MarketOrderInvalidated} if the order is already invalidated. - * + * @dev Reverts if the order is already invalidated. * @param maker The address of the order's maker. * @param orderHash The hash of the order to invalidate. */ @@ -256,10 +279,8 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza /** * @notice Internal function to verify an order's authorization. - * * @dev It checks the time validity of the order and recovers the signer's address from the * signature to ensure it matches the `maker`. - * * @param orderHash The hash of the order. * @param maker The address of the order's maker. * @param startTime The start time of the order's validity. @@ -277,14 +298,10 @@ contract Market is IMarket, EIP712Domain, RoleSystem, CurrencyManager, Authoriza revert MarketOrderOutsideOfTimeRange(); } - address signer = EIP712Signature.recover( - DOMAIN_SEPARATOR, - orderHash, - orderSignature // - ); + address signer = EIP712Signature.recover(DOMAIN_SEPARATOR, orderHash, orderSignature); if (maker != signer) { - revert MarketUnauthorizedOrder(); + revert MarketInvalidOrderSignature(); } } } diff --git a/contracts/market/MarketStorage.sol b/contracts/market/MarketStorage.sol index b3afec3..740c0d6 100644 --- a/contracts/market/MarketStorage.sol +++ b/contracts/market/MarketStorage.sol @@ -3,14 +3,14 @@ pragma solidity ^0.8.20; /** * @title MarketStorage - * - * @notice Defines the storage layout for {Market}. Using a deterministic slot - * makes the module safe for use behind proxies and alongside other upgradeable components. + * @notice Defines the storage layout for {Market}. Using a deterministic slot makes the + * module safe for use behind proxies and alongside other upgradeable components. */ library MarketStorage { - /// @dev Unique storage slot for the layout, computed using EIP-7201 convention. + /// @notice Unique storage slot for the layout, computed using EIP-7201 convention. bytes32 private constant STORAGE_SLOT = - keccak256(abi.encode(uint256(keccak256("digital-original.storage.Market")) - 1)) & ~bytes32(uint256(0xff)); + keccak256(abi.encode(uint256(keccak256("digital-original.storage.Market")) - 1)) & + ~bytes32(uint256(0xff)); /** * @custom:storage-location erc7201:digital-original.storage.Market @@ -21,13 +21,11 @@ library MarketStorage { /** * @notice Returns a pointer to the storage layout. - * * @return $ The pointer to the Layout struct in storage. */ function layout() internal pure returns (Layout storage $) { bytes32 slot = STORAGE_SLOT; - // solhint-disable-next-line assembly { $.slot := slot } diff --git a/contracts/market/libraries/Order.sol b/contracts/market/libraries/Order.sol index 8f3931c..269d1b1 100644 --- a/contracts/market/libraries/Order.sol +++ b/contracts/market/libraries/Order.sol @@ -3,14 +3,12 @@ pragma solidity ^0.8.20; /** * @title Order - * - * @notice EIP-712 struct for a market order, which can be either a sell-side (ask) or a buy-side - * (bid) order. + * @notice EIP-712 struct for a market order, which can be either a sell-side (ask) or + * a buy-side (bid) order. */ library Order { /** * @notice Indicates the side of the order. - * * @param Ask A sell-side order, where the maker is the seller. * @param Bid A buy-side order, where the maker is the buyer. */ @@ -21,10 +19,9 @@ library Order { /** * @notice Represents a market order. - * * @param side The side of the order (ask or bid). * @param collection Address of the ERC-721 collection contract. - * @param currency Address of the settlement currency (ERC-20). + * @param currency Address of the settlement currency. * @param maker Address of the order's creator. * @param tokenId The identifier of the token being traded. * @param price The price of the order. @@ -63,9 +60,7 @@ library Order { /** * @notice Hashes an order using the EIP-712 standard. - * * @param order The order to hash. - * * @return orderHash The EIP-712 hash of the order. */ function hash(Type calldata order) internal pure returns (bytes32) { diff --git a/contracts/market/libraries/OrderExecutionPermit.sol b/contracts/market/libraries/OrderExecutionPermit.sol index cab3365..29a320e 100644 --- a/contracts/market/libraries/OrderExecutionPermit.sol +++ b/contracts/market/libraries/OrderExecutionPermit.sol @@ -3,14 +3,12 @@ pragma solidity ^0.8.20; /** * @title OrderExecutionPermit - * * @notice EIP-712 struct for an order execution permit, which authorizes the execution of a * market order and specifies the taker fee and revenue-sharing details. */ library OrderExecutionPermit { /** * @notice Represents an order execution permit. - * * @param orderHash The hash of the order to be executed. * @param taker The address of the account that is executing the order. * @param takerFee The fee that the `taker` is willing to pay for the execution. @@ -43,9 +41,7 @@ library OrderExecutionPermit { /** * @notice Hashes an execution permit using the EIP-712 standard. - * * @param permit The execution permit to hash. - * * @return permitHash The EIP-712 hash of the permit. */ function hash(Type calldata permit) internal pure returns (bytes32) { diff --git a/contracts/tests/AllDeployer.sol b/contracts/tests/AllDeployer.sol index 56a450e..54c54fb 100644 --- a/contracts/tests/AllDeployer.sol +++ b/contracts/tests/AllDeployer.sol @@ -20,13 +20,14 @@ contract AllDeployer { address auctionHouseProxy = Deployment.calculateContractAddress(address(this), 7); address marketProxy = Deployment.calculateContractAddress(address(this), 8); + // prettier-ignore { address artTokenImpl = address( new ArtToken( artTokenProxy, address(this), wrappedEther, - auctionHouseProxy // + auctionHouseProxy ) ); @@ -36,7 +37,7 @@ contract AllDeployer { address(this), wrappedEther, artTokenProxy, - minAuctionDuration // + minAuctionDuration ) ); @@ -44,7 +45,7 @@ contract AllDeployer { new Market( marketProxy, address(this), - wrappedEther // + wrappedEther ) ); diff --git a/contracts/utils/Authorization.sol b/contracts/utils/Authorization.sol index 80fb135..aaedfee 100644 --- a/contracts/utils/Authorization.sol +++ b/contracts/utils/Authorization.sol @@ -8,11 +8,9 @@ import {Roles} from "./Roles.sol"; /** * @title Authorization - * * @notice Mixin that provides EIP-712 based action authorization using a dedicated * `SIGNER_ROLE` account. Intended to be inherited by contracts that need off-chain * signatures for sensitive operations. - * * @dev Relies on {EIP712Domain} for the domain separator and on {RoleSystem} for role * storage. The helper {_requireAuthorizedAction} validates both signature freshness and * signer authenticity. @@ -21,17 +19,18 @@ abstract contract Authorization is EIP712Domain, RoleSystem { /** * @notice Verifies that `signature` is a valid authorization for `messageHash` and that it * has not expired. - * - * @dev Reverts with {AuthorizationDeadlineExpired} if `deadline` has passed or with - * {AuthorizationUnauthorizedAction} if the recovered signer does not hold the + * @dev Reverts if `deadline` has passed or if the recovered signer does not hold the * `SIGNER_ROLE`. - * * @param messageHash EIP-712 struct hash (already `keccak256`-encoded). * @param deadline UNIX timestamp after which the signature is considered invalid. * @param signature EIP-712 signature (65/64-byte format accepted by * {EIP712Signature.recover}). */ - function _requireAuthorizedAction(bytes32 messageHash, uint256 deadline, bytes calldata signature) internal view { + function _requireAuthorizedAction( + bytes32 messageHash, + uint256 deadline, + bytes calldata signature + ) internal view { if (deadline < block.timestamp) { revert AuthorizationDeadlineExpired(); } diff --git a/contracts/utils/CollectionDeployer.sol b/contracts/utils/CollectionDeployer.sol index a86063e..d7440e0 100644 --- a/contracts/utils/CollectionDeployer.sol +++ b/contracts/utils/CollectionDeployer.sol @@ -7,39 +7,35 @@ import {Deployment} from "./Deployment.sol"; /** * @title CollectionDeployer - * * @notice Helper contract that deploys and wires together fresh instances of `ArtToken` and * `AuctionHouse` behind transparent upgradeable proxies. Intended for deterministic * deployments during initial collection setup. - * * @dev The contract self-destructs implicitly after construction (no storage is written). It * relies on {Deployment.calculateContractAddress} to pre-compute the proxy addresses, * ensuring that the implementation constructors can reference each other before the proxies * exist. */ contract CollectionDeployer { - /// @notice Emitted once the proxy contracts are deployed and initialised. - /// @param artToken Address of the newly deployed ArtToken proxy. - /// @param auctionHouse Address of the newly deployed AuctionHouse proxy. + /** + * @notice Emitted once the proxy contracts are deployed and initialized. + * @param artToken Address of the newly deployed ArtToken proxy. + * @param auctionHouse Address of the newly deployed AuctionHouse proxy. + */ event Deployed(address artToken, address auctionHouse); /** * @notice Deploys upgradeable `ArtToken` and `AuctionHouse` instances. - * * @dev The constructor performs the following steps: * 1. Computes the expected proxy addresses using the current contract nonce (deploy * order is deterministic). * 2. Deploys the implementation contracts, passing the computed proxy addresses so they * can reference each other. * 3. Deploys the transparent proxies via {Deployment.deployUpgradeableContract}. - * 4. Reverts with {DeployerIncorrectAddress} if the actual proxy addresses do not - * match the pre-computed ones (should never happen unless the deployment order - * changes). + * 4. Reverts if the actual proxy addresses do not match the pre-computed ones. * 5. Calls `initialize` on the ArtToken proxy to set `name` and `symbol`. * 6. Emits {Deployed}. - * - * @param name ERC-721 collection name. - * @param symbol ERC-721 collection symbol. + * @param name Collection name. + * @param symbol Collection symbol. * @param main Address that will be set as {RoleSystem.MAIN}. * @param wrappedEther Address of the Wrapped Ether contract. * @param minAuctionDuration Minimum auction duration (seconds) enforced by AuctionHouse. @@ -54,22 +50,24 @@ contract CollectionDeployer { address calculatedArtTokenProxy = Deployment.calculateContractAddress(address(this), 3); address calculatedAuctionHouseProxy = Deployment.calculateContractAddress(address(this), 4); + // prettier-ignore address artTokenImpl = address( new ArtToken( calculatedArtTokenProxy, main, wrappedEther, - calculatedAuctionHouseProxy // + calculatedAuctionHouseProxy ) ); + // prettier-ignore address auctionHouseImpl = address( new AuctionHouse( calculatedAuctionHouseProxy, main, wrappedEther, calculatedArtTokenProxy, - minAuctionDuration // + minAuctionDuration ) ); diff --git a/contracts/utils/CurrencyTransfers.sol b/contracts/utils/CurrencyTransfers.sol index c17997b..614bfe4 100644 --- a/contracts/utils/CurrencyTransfers.sol +++ b/contracts/utils/CurrencyTransfers.sol @@ -6,18 +6,39 @@ import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol import {ETHER} from "../utils/Constants.sol"; import {IWrappedEther} from "../utils/IWrappedEther.sol"; -contract CurrencyTransfers { +/** + * @title CurrencyTransfers + * @notice This contract provides utility functions for transferring Ether and ERC-20 tokens. + */ +abstract contract CurrencyTransfers { + /// @notice Gas limit for direct Ether transfers. uint256 public constant GAS_LIMIT_ETHER_TRANSFER = 2_300; + /// @notice The Wrapped Ether contract. IWrappedEther public immutable WRAPPED_ETHER; + /** + * @notice Initializes the Wrapped Ether address. + * @param wrappedEther The address of the Wrapped Ether contract. + */ constructor(address wrappedEther) { if (wrappedEther == address(0)) revert CurrencyTransfersMisconfiguration(0); WRAPPED_ETHER = IWrappedEther(wrappedEther); } + /** + * @notice Sends a specified amount of a currency to a recipient. + * @dev If the currency is Ether, it attempts a direct transfer and wraps to WETH as a fallback. + * @param currency The address of the currency. + * @param to The recipient's address. + * @param value The amount of currency to send. + */ function _sendCurrency(address currency, address to, uint256 value) internal { + if (value == 0) { + return; + } + if (currency == ETHER) { _sendEtherAndWrapIfFail(to, value); } else { @@ -25,6 +46,13 @@ contract CurrencyTransfers { } } + /** + * @notice Receives a specified amount of a currency from a sender. + * @dev Validates the `msg.value` for Ether transactions and ensures no Ether is sent for token transactions. + * @param currency The address of the currency. + * @param from The sender's address. + * @param value The amount of currency to receive. + */ function _receiveCurrency(address currency, address from, uint256 value) internal { if (currency == ETHER) { // Ensure the correct amount of Ether is sent with the transaction @@ -37,10 +65,22 @@ contract CurrencyTransfers { revert CurrencyTransfersUnexpectedEther(); } + if (value == 0) { + return; + } + SafeERC20.safeTransferFrom(IERC20(currency), from, address(this), value); } } + /** + * @notice Sends a currency to multiple recipients in a batch. + * @dev Reverts if input arrays have different lengths or if any transfer details are invalid. + * @param currency The address of the currency to send. + * @param amount The total amount to be distributed. + * @param receivers An array of recipient addresses. + * @param values An array of amounts to send to each recipient. + */ function _sendCurrencyBatch( address currency, uint256 amount, @@ -72,7 +112,7 @@ contract CurrencyTransfers { sent += value; unchecked { - i++; + ++i; } } @@ -81,6 +121,11 @@ contract CurrencyTransfers { } } + /** + * @notice Attempts to send Ether and wraps it into WETH if the direct transfer fails. + * @param to The recipient's address. + * @param value The amount of Ether to send. + */ function _sendEtherAndWrapIfFail(address to, uint256 value) private { bool status; diff --git a/contracts/utils/Deployment.sol b/contracts/utils/Deployment.sol index e85f397..e8219a3 100644 --- a/contracts/utils/Deployment.sol +++ b/contracts/utils/Deployment.sol @@ -5,11 +5,9 @@ import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transpa /** * @title Deployment - * * @notice Helper library that simplifies contract deployment logic used in the protocol scripts. - * * @dev Currently exposes two low-level utilities: - * 1. {deployUpgradeableContract} — deploys an `TransparentUpgradeableProxy` pointing to an + * 1. {deployUpgradeableContract} — deploys a `TransparentUpgradeableProxy` pointing to an * implementation contract. * 2. {calculateContractAddress} — deterministic computation of the address of a contract * that would be deployed by `account` at a given nonce (matching the algorithm used @@ -17,40 +15,48 @@ import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transpa */ library Deployment { /** - * @notice Deploys a `TransparentUpgradeableProxy` with the provided implementation and - * admin. - * - * @param impl Address of the implementation contract that the proxy will delegate‐call to. + * @notice Deploys a `TransparentUpgradeableProxy` with the provided implementation and admin. + * @param impl Address of the implementation contract that the proxy will delegate-call to. * @param proxyAdminOwner Address that will become the owner of the proxy's admin contract. - * * @return proxy Address of the newly deployed proxy. */ - function deployUpgradeableContract(address impl, address proxyAdminOwner) internal returns (address proxy) { + function deployUpgradeableContract( + address impl, + address proxyAdminOwner + ) internal returns (address proxy) { return address(new TransparentUpgradeableProxy(impl, proxyAdminOwner, "")); } /** * @notice Predicts the address of a future deployment by `account` at the specified nonce. - * * @dev Mirrors the algorithm used by the `CREATE` opcode. Only supports nonces up to * `0xffffff` to avoid unnecessary dynamic memory in encoding logic. - * * @param account Deployer address. * @param nonce Nonce of the deploying account at the time of the future deployment. - * * @return predicted Address the contract will be deployed to. */ - function calculateContractAddress(address account, uint256 nonce) internal pure returns (address predicted) { + function calculateContractAddress( + address account, + uint256 nonce + ) internal pure returns (address predicted) { if (nonce == 0x00) { return address( - uint160(uint256(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), account, bytes1(0x80))))) + uint160( + uint256( + keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), account, bytes1(0x80))) + ) + ) ); } else if (nonce <= 0x7f) { return address( uint160( - uint256(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), account, bytes1(uint8(nonce))))) + uint256( + keccak256( + abi.encodePacked(bytes1(0xd6), bytes1(0x94), account, bytes1(uint8(nonce))) + ) + ) ) ); } else if (nonce <= 0xff) { @@ -58,7 +64,15 @@ library Deployment { address( uint160( uint256( - keccak256(abi.encodePacked(bytes1(0xd7), bytes1(0x94), account, bytes1(0x81), uint8(nonce))) + keccak256( + abi.encodePacked( + bytes1(0xd7), + bytes1(0x94), + account, + bytes1(0x81), + uint8(nonce) + ) + ) ) ) ); @@ -68,7 +82,13 @@ library Deployment { uint160( uint256( keccak256( - abi.encodePacked(bytes1(0xd8), bytes1(0x94), account, bytes1(0x82), uint16(nonce)) + abi.encodePacked( + bytes1(0xd8), + bytes1(0x94), + account, + bytes1(0x82), + uint16(nonce) + ) ) ) ) @@ -79,7 +99,13 @@ library Deployment { uint160( uint256( keccak256( - abi.encodePacked(bytes1(0xd9), bytes1(0x94), account, bytes1(0x83), uint24(nonce)) + abi.encodePacked( + bytes1(0xd9), + bytes1(0x94), + account, + bytes1(0x83), + uint24(nonce) + ) ) ) ) @@ -90,7 +116,13 @@ library Deployment { uint160( uint256( keccak256( - abi.encodePacked(bytes1(0xda), bytes1(0x94), account, bytes1(0x84), uint32(nonce)) + abi.encodePacked( + bytes1(0xda), + bytes1(0x94), + account, + bytes1(0x84), + uint32(nonce) + ) ) ) ) diff --git a/contracts/utils/EIP712Domain.sol b/contracts/utils/EIP712Domain.sol index dd7875f..0372707 100644 --- a/contracts/utils/EIP712Domain.sol +++ b/contracts/utils/EIP712Domain.sol @@ -3,18 +3,11 @@ pragma solidity ^0.8.20; /** * @title EIP712Domain - * * @notice Minimal helper that constructs an EIP-712 domain separator once at deployment time and * exposes it as an immutable constant. - * - * @dev Designed to be inherited by contracts that need typed-data signatures. Follows the standard - * domain schema: - * `EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)`. */ -contract EIP712Domain { - /** - * @dev Type-hash of the canonical EIP-712 domain. - */ +abstract contract EIP712Domain { + /// @notice Type-hash of the canonical EIP-712 domain. // prettier-ignore bytes32 public constant DOMAIN_TYPE_HASH = keccak256( @@ -26,14 +19,11 @@ contract EIP712Domain { ")" ); - /** - * @notice Fully-qualified EIP-712 domain separator for this contract. - */ + /// @notice EIP-712 domain separator. bytes32 public immutable DOMAIN_SEPARATOR; /** - * @notice Contract constructor. - * + * @notice Initializes the immutable domain separator. * @param verifyingContract Address of the contract that will verify signatures (usually the proxy). * @param name Human-readable name of the signing domain. * @param version Current major version of the signing domain. @@ -54,9 +44,6 @@ contract EIP712Domain { ); } - /** - * @dev Thrown when a constructor argument at position `argIndex` is invalid (zero address or - * empty string). - */ + /// @dev Thrown when a constructor argument at index `argIndex` is invalid. error EIP712DomainMisconfiguration(uint8 argIndex); } diff --git a/contracts/utils/EIP712Signature.sol b/contracts/utils/EIP712Signature.sol index 50f4340..e08b466 100644 --- a/contracts/utils/EIP712Signature.sol +++ b/contracts/utils/EIP712Signature.sol @@ -6,22 +6,18 @@ import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/Messa /** * @title EIP712Signature - * * @notice Lightweight helper for recovering the signer of an EIP-712 typed-data signature. * Combines OpenZeppelin's {ECDSA} and {MessageHashUtils}. - * - * @dev Reverts with {EIP712SignatureZeroAddress} if signature recovery yields the zero address - * (which indicates an invalid signature). */ library EIP712Signature { /** - * @notice Recovers the signer of an EIP-712 `{structHash}` bound to the provided - * `domainSeparator`. - * + * @notice Recovers the signer of an EIP-712 `structHash` bound to + * the provided `domainSeparator`. + * @dev Reverts if signature recovery yields the zero address + * (which indicates an invalid signature). * @param domainSeparator The domain separator used when signing. * @param structHash Hash of the typed data structure being signed. * @param signature 65/64-byte ECDSA signature produced by the signer. - * * @return signer Address that produced the signature. */ function recover( diff --git a/contracts/utils/IWrappedEther.sol b/contracts/utils/IWrappedEther.sol index 9fe7dd6..ddb053d 100644 --- a/contracts/utils/IWrappedEther.sol +++ b/contracts/utils/IWrappedEther.sol @@ -5,17 +5,16 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /** * @title IWrappedEther - * * @notice Defines the interface for the wrapped ether external contract. */ interface IWrappedEther is IERC20 { /** - * @dev Locks sent ether and mints the same amount of wrapped ether for the caller. + * @notice Locks sent ether and mints the same amount of wrapped ether for the caller. */ function deposit() external payable; /** - * @dev Burns the amount of the caller's wrapped ether and sends the same amount of ether to the caller. + * @notice Burns the amount of the caller's wrapped ether and sends the same amount of ether to the caller. * @param amount The amount to be withdrawn */ function withdraw(uint256 amount) external; diff --git a/contracts/utils/MarketDeployer.sol b/contracts/utils/MarketDeployer.sol index dc1c67d..c9b65ef 100644 --- a/contracts/utils/MarketDeployer.sol +++ b/contracts/utils/MarketDeployer.sol @@ -6,28 +6,25 @@ import {Deployment} from "./Deployment.sol"; /** * @title MarketDeployer - * * @notice Helper contract that deploys the `Market` contract behind a transparent upgradeable * proxy. */ contract MarketDeployer { - /// @notice Emitted once the proxy contract is deployed. - /// @param market Address of the newly deployed Market proxy. + /** + * @notice Emitted once the proxy contract is deployed. + * @param market Address of the newly deployed Market proxy. + */ event Deployed(address market); /** * @notice Deploys upgradeable `Market` instance. - * * @dev The constructor performs the following steps: * 1. Computes the expected proxy addresses using the current contract nonce (deploy * order is deterministic). * 2. Deploys the implementation contract. - * 3. Deploys the transparent proxy via {Deployment.deployUpgradeableContract}. - * 4. Reverts with {DeployerIncorrectAddress} if the actual proxy addresses do not - * match the pre-computed ones (should never happen unless the deployment order - * changes). + * 3. Deploys the transparent proxy. + * 4. Reverts if the actual proxy addresses do not match the pre-computed ones. * 5. Emits {Deployed}. - * * @param main Address that will be set as {RoleSystem.MAIN}. * @param wrappedEther Address of the Wrapped Ether contract. */ diff --git a/contracts/utils/Roles.sol b/contracts/utils/Roles.sol index 4a265d6..976491b 100644 --- a/contracts/utils/Roles.sol +++ b/contracts/utils/Roles.sol @@ -3,21 +3,20 @@ pragma solidity ^0.8.20; /** * @title Roles - * * @notice Defines keccak256 hashed identifiers for role-based access control used across the * protocol. These identifiers are consumed by the {RoleSystem} mix-in and contracts that * inherit from it. */ library Roles { - /// @dev Role that owns protocol fees and treasury funds. + /// @notice Role that owns protocol fees and treasury funds. bytes32 internal constant FINANCIAL_ROLE = keccak256("FINANCIAL_ROLE"); - /// @dev Whitelist role for regulated ArtToken transfers. + /// @notice Whitelist role for regulated ArtToken transfers. bytes32 internal constant PARTNER_ROLE = keccak256("PARTNER_ROLE"); - /// @dev Role allowed to sign off-chain permits and other authorizations. + /// @notice Role allowed to sign off-chain permits and other authorizations. bytes32 internal constant SIGNER_ROLE = keccak256("SIGNER_ROLE"); - /// @dev Role allowed to perform admin actions. + /// @notice Role allowed to perform admin actions. bytes32 internal constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); } diff --git a/contracts/utils/TokenConfig.sol b/contracts/utils/TokenConfig.sol index 854ea9e..297305a 100644 --- a/contracts/utils/TokenConfig.sol +++ b/contracts/utils/TokenConfig.sol @@ -3,13 +3,11 @@ pragma solidity ^0.8.20; /** * @title TokenConfig - * * @notice A library for managing token configuration, including creator and regulation mode. */ library TokenConfig { /** * @notice Defines the regulation modes for a token. - * * @param None Default value, should not be used. * @param Unregulated The token is not subject to transfer restrictions. * @param Regulated The token is subject to transfer restrictions. @@ -22,7 +20,6 @@ library TokenConfig { /** * @notice Represents the configuration for a single token. - * * @param creator The address of the token's creator. * @param regulationMode The regulation mode of the token. */ @@ -43,15 +40,19 @@ library TokenConfig { /** * @notice Hashes a token configuration using the EIP-712 standard. - * * @param config The token configuration to hash. - * * @return The EIP-712 hash of the configuration. */ function hash(Type calldata config) internal pure returns (bytes32) { return keccak256(abi.encode(TYPE_HASH, config.creator, config.regulationMode)); } + /** + * @notice Validates that a token configuration is properly populated, + * meaning it has a non-zero creator and a valid regulation mode. + * @dev Reverts if the token configuration is not properly populated. + * @param tokenConfig The token configuration to validate. + */ function requirePopulated(TokenConfig.Type calldata tokenConfig) internal pure { if (tokenConfig.creator == address(0)) { revert TokenConfigNotPopulated(); @@ -62,5 +63,6 @@ library TokenConfig { } } + /// @dev Thrown when a token configuration is not properly populated. error TokenConfigNotPopulated(); } diff --git a/contracts/utils/currency-manager/CurrencyManager.sol b/contracts/utils/currency-manager/CurrencyManager.sol index c8e13bb..5658de9 100644 --- a/contracts/utils/currency-manager/CurrencyManager.sol +++ b/contracts/utils/currency-manager/CurrencyManager.sol @@ -8,14 +8,20 @@ import {ICurrencyManager} from "./ICurrencyManager.sol"; /** * @title CurrencyManager - * * @notice Abstract contract that implements the logic for managing allowed currencies. */ abstract contract CurrencyManager is ICurrencyManager, RoleSystem { /** - * @inheritdoc ICurrencyManager + * @notice Updates the status of a currency. + * @dev This function can only be called by an account with the ADMIN_ROLE. + * @param currency The address of the currency contract. + * @param allowed The new status of the currency. */ function updateCurrencyStatus(address currency, bool allowed) external onlyRole(Roles.ADMIN_ROLE) { + if (currency == address(0)) { + revert CurrencyManagerZeroAddress(); + } + CurrencyManagerStorage.Layout storage $ = CurrencyManagerStorage.layout(); $.allowed[currency] = allowed; @@ -24,12 +30,19 @@ abstract contract CurrencyManager is ICurrencyManager, RoleSystem { } /** - * @inheritdoc ICurrencyManager + * @notice Checks if a currency is allowed. + * @param currency The address of the currency to check. + * @return allowed True if the currency is allowed. */ function currencyAllowed(address currency) external view returns (bool allowed) { return _currencyAllowed(currency); } + /** + * @notice Internal function to check if a currency is allowed. + * @param currency The address of the currency to check. + * @return allowed True if the currency is allowed. + */ function _currencyAllowed(address currency) internal view returns (bool allowed) { CurrencyManagerStorage.Layout storage $ = CurrencyManagerStorage.layout(); diff --git a/contracts/utils/currency-manager/CurrencyManagerStorage.sol b/contracts/utils/currency-manager/CurrencyManagerStorage.sol index 3c587e1..f210ba8 100644 --- a/contracts/utils/currency-manager/CurrencyManagerStorage.sol +++ b/contracts/utils/currency-manager/CurrencyManagerStorage.sol @@ -3,12 +3,11 @@ pragma solidity ^0.8.20; /** * @title CurrencyManagerStorage - * * @notice Defines the storage layout for {CurrencyManager}. Using a deterministic slot makes the * module safe for use behind proxies and alongside other upgradeable components. */ library CurrencyManagerStorage { - /// @dev Unique storage slot for the layout, computed using EIP-7201 convention. + /// @notice Unique storage slot for the layout, computed using EIP-7201 convention. bytes32 private constant STORAGE_SLOT = keccak256(abi.encode(uint256(keccak256("digital-original.storage.CurrencyManager")) - 1)) & ~bytes32(uint256(0xff)); @@ -22,13 +21,11 @@ library CurrencyManagerStorage { /** * @notice Returns a pointer to the storage layout. - * * @return $ The pointer to the Layout struct in storage. */ function layout() internal pure returns (Layout storage $) { bytes32 slot = STORAGE_SLOT; - // solhint-disable-next-line assembly { $.slot := slot } diff --git a/contracts/utils/currency-manager/ICurrencyManager.sol b/contracts/utils/currency-manager/ICurrencyManager.sol index fc7b630..fa1b4ef 100644 --- a/contracts/utils/currency-manager/ICurrencyManager.sol +++ b/contracts/utils/currency-manager/ICurrencyManager.sol @@ -3,34 +3,30 @@ pragma solidity ^0.8.20; /** * @title ICurrencyManager - * * @notice Manages the list of allowed currencies for market transactions. */ interface ICurrencyManager { /** * @notice Emitted when the status of a currency is updated. - * * @param currency The address of the currency contract. - * @param allowed True if the currency is allowed, false otherwise. + * @param allowed True if the currency is allowed. */ event CurrencyStatusUpdated(address currency, bool allowed); /** * @notice Updates the status of a currency. - * - * @dev This function can only be called by an account with the ADMIN_ROLE. - * - * @param currency The address of the ERC20 token contract to update. + * @param currency The address of the currency contract. * @param allowed The new status of the currency. */ function updateCurrencyStatus(address currency, bool allowed) external; /** * @notice Checks if a currency is allowed. - * * @param currency The address of the currency to check. - * - * @return allowed True if the currency is allowed, false otherwise. + * @return allowed True if the currency is allowed. */ function currencyAllowed(address currency) external view returns (bool allowed); + + /// @dev Thrown when attempting to set the status of the zero address as a currency. + error CurrencyManagerZeroAddress(); } diff --git a/contracts/utils/role-system/IRoleSystem.sol b/contracts/utils/role-system/IRoleSystem.sol index b204427..613b85a 100644 --- a/contracts/utils/role-system/IRoleSystem.sol +++ b/contracts/utils/role-system/IRoleSystem.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.20; /** * @title IRoleSystem - * * @notice Interface describing the on-chain role-based access-control system used by the * protocol. Provides both multi-owner roles (grant/revoke) and unique roles * (single owner, transferable). @@ -11,7 +10,6 @@ pragma solidity ^0.8.20; interface IRoleSystem { /** * @notice Emitted when `role` is granted to `account`. - * * @param role Identifier of the role granted. * @param account Recipient account that now possesses the role. */ @@ -19,7 +17,6 @@ interface IRoleSystem { /** * @notice Emitted when `role` is revoked from `account`. - * * @param role Identifier of the role revoked. * @param account Account that lost the role. */ @@ -27,7 +24,6 @@ interface IRoleSystem { /** * @notice Emitted when ownership of a unique role is transferred. - * * @param role Identifier of the unique role. * @param oldOwner Address of the previous owner of the role. * @param newOwner Address that becomes the new owner of the role. @@ -36,7 +32,6 @@ interface IRoleSystem { /** * @notice Grants `role` to `account`. - * * @param role The role to be granted. * @param account The account for granting the role. */ @@ -44,7 +39,6 @@ interface IRoleSystem { /** * @notice Revokes `role` from `account`. - * * @param role The role to be revoked. * @param account The account for revoking the role. */ @@ -52,10 +46,8 @@ interface IRoleSystem { /** * @notice Transfers `uniqueRole` from the previous role owner to `newOwner`. - * * @dev Passing the zero address as `newOwner` will effectively revoke the role without * assigning it to anyone. - * * @param uniqueRole The role to be transferred. * @param newOwner The new owner of the unique role (may be address(0)). */ @@ -63,53 +55,38 @@ interface IRoleSystem { /** * @notice Checks if `account` has been granted `role`. - * * @param role The role to query. * @param account The account to query. - * - * @return hasRole True if `account` possesses `role`, false otherwise. + * @return True if `account` possesses `role`. */ - function hasRole(bytes32 role, address account) external view returns (bool hasRole); + function hasRole(bytes32 role, address account) external view returns (bool); /** * @notice Returns the owner of `uniqueRole`. - * * @param uniqueRole The unique role to query. - * * @return owner Address of the current role owner. */ function uniqueRoleOwner(bytes32 uniqueRole) external view returns (address owner); - /** - * @dev Thrown when a function restricted to the main role owner is called by another account. - */ + /// @dev Thrown when a function restricted to the main role owner is called by another account. error RoleSystemNotMain(); /** * @dev Thrown when an account does not have the required role. - * * @param account The account that does not have the required role. * @param requiredRole The required role. */ error RoleSystemUnauthorizedAccount(address account, bytes32 requiredRole); - /** - * @dev Thrown when the zero address is supplied where a non-zero address is required. - */ + /// @dev Thrown when the zero address is supplied where a non-zero address is required. error RoleSystemZeroAddress(); - /** - * @dev Thrown when attempting to grant a role to an account that already has it. - */ + /// @dev Thrown when attempting to grant a role to an account that already has it. error RoleSystemAlreadyHasRole(bytes32 role, address account); - /** - * @dev Thrown when attempting to revoke a role from an account that does not have it. - */ + /// @dev Thrown when attempting to revoke a role from an account that does not have it. error RoleSystemMissingRole(bytes32 role, address account); - /** - * @dev Thrown when a constructor argument at index `argIndex` is invalid. - */ + /// @dev Thrown when a constructor argument at index `argIndex` is invalid. error RoleSystemMisconfiguration(uint8 argIndex); } diff --git a/contracts/utils/role-system/RoleSystem.sol b/contracts/utils/role-system/RoleSystem.sol index d881ef4..86f9e71 100644 --- a/contracts/utils/role-system/RoleSystem.sol +++ b/contracts/utils/role-system/RoleSystem.sol @@ -6,34 +6,27 @@ import {IRoleSystem} from "./IRoleSystem.sol"; /** * @title RoleSystem - * - * @notice Concrete implementation of {IRoleSystem}. Stores role mappings in an - * unstructured-storage slot defined by {RoleSystemStorage} and exposes simple - * grant/revoke/transfer helpers restricted to the immutable {MAIN} administrator. + * @notice A simple role management system that supports both unique and non-unique roles. + * The main account has the exclusive authority to grant, revoke and transfer roles. */ contract RoleSystem is IRoleSystem { /** * @notice Account endowed with full administrative privileges over the role system (grant, - * revoke, transfer unique roles). + * revoke, transfer unique roles). The main account is expected to be a multisig */ address public immutable MAIN; - /** - * @notice Restricts a function so it can only be executed by {MAIN}. Reverts with - * {RoleSystemNotMain} otherwise. - */ + /// @notice Restricts a function so it can only be executed by {MAIN}, reverts otherwise. modifier onlyMain() { if (msg.sender != MAIN) { revert RoleSystemNotMain(); } - _; } /** - * @notice Restricts a function so it can only be executed by an account that has `role`. - * Reverts with {RoleSystemUnauthorizedAccount} otherwise. - * + * @notice Restricts a function so it can only be executed by an account that has `role`, + * reverts otherwise. * @param role The role required to call the function. */ modifier onlyRole(bytes32 role) { @@ -45,11 +38,8 @@ contract RoleSystem is IRoleSystem { } /** - * @notice Contract constructor. - * - * @param main Address that will be set as {MAIN}. Cannot be zero. - * - * @dev Reverts with {RoleSystemMisconfiguration} if `main` is the zero address. + * @notice Initializes the main account. + * @param main Address that will be set as {MAIN}. */ constructor(address main) { if (main == address(0)) revert RoleSystemMisconfiguration(0); @@ -58,7 +48,9 @@ contract RoleSystem is IRoleSystem { } /** - * @inheritdoc IRoleSystem + * @notice Grants `role` to `account`. + * @param role The role to be granted. + * @param account The account for granting the role. */ function grantRole(bytes32 role, address account) external onlyMain { _requireNotZeroAddress(account); @@ -75,7 +67,9 @@ contract RoleSystem is IRoleSystem { } /** - * @inheritdoc IRoleSystem + * @notice Revokes `role` from `account`. + * @param role The role to be revoked. + * @param account The account for revoking the role. */ function revokeRole(bytes32 role, address account) external onlyMain { _requireNotZeroAddress(account); @@ -92,7 +86,11 @@ contract RoleSystem is IRoleSystem { } /** - * @inheritdoc IRoleSystem + * @notice Transfers `uniqueRole` from the previous role owner to `newOwner`. + * @dev Passing the zero address as `newOwner` will effectively revoke the role without + * assigning it to anyone. + * @param uniqueRole The role to be transferred. + * @param newOwner The new owner of the unique role (may be address(0)). */ function transferUniqueRole(bytes32 uniqueRole, address newOwner) external onlyMain { RoleSystemStorage.Layout storage $ = RoleSystemStorage.layout(); @@ -109,7 +107,10 @@ contract RoleSystem is IRoleSystem { } /** - * @inheritdoc IRoleSystem + * @notice Checks if `account` has been granted `role`. + * @param role The role to query. + * @param account The account to query. + * @return True if `account` possesses `role`. */ function hasRole(bytes32 role, address account) external view returns (bool) { RoleSystemStorage.Layout storage $ = RoleSystemStorage.layout(); @@ -118,7 +119,9 @@ contract RoleSystem is IRoleSystem { } /** - * @inheritdoc IRoleSystem + * @notice Returns the owner of `uniqueRole`. + * @param uniqueRole The unique role to query. + * @return owner Address of the current role owner. */ function uniqueRoleOwner(bytes32 uniqueRole) external view returns (address) { RoleSystemStorage.Layout storage $ = RoleSystemStorage.layout(); @@ -128,11 +131,9 @@ contract RoleSystem is IRoleSystem { /** * @notice Internal variant of {hasRole} that reverts when `account` is the zero address. - * * @param role The role to query. * @param account The account to query. - * - * @return True if `account` possesses `role`, false otherwise. + * @return True if `account` possesses `role`. */ function _hasRole(bytes32 role, address account) internal view returns (bool) { _requireNotZeroAddress(account); @@ -144,11 +145,7 @@ contract RoleSystem is IRoleSystem { /** * @notice Internal variant of {uniqueRoleOwner} that reverts when the role is unassigned. - * - * @dev Reverts with {RoleSystemZeroAddress} when the role is currently unassigned. - * * @param uniqueRole The unique role to query. - * * @return owner Address of the current role owner. */ function _uniqueRoleOwner(bytes32 uniqueRole) internal view returns (address owner) { @@ -160,10 +157,7 @@ contract RoleSystem is IRoleSystem { } /** - * @notice Internal helper that standardises zero-address checks across the contract. - * - * @dev Reverts with {RoleSystemZeroAddress} if `account` is the zero address. - * + * @notice Internal helper that standardizes zero-address checks across the contract. * @param account The address to check. */ function _requireNotZeroAddress(address account) private pure { diff --git a/contracts/utils/role-system/RoleSystemStorage.sol b/contracts/utils/role-system/RoleSystemStorage.sol index a690d91..bbc300b 100644 --- a/contracts/utils/role-system/RoleSystemStorage.sol +++ b/contracts/utils/role-system/RoleSystemStorage.sol @@ -3,14 +3,14 @@ pragma solidity ^0.8.20; /** * @title RoleSystemStorage - * * @notice Defines the storage layout for {RoleSystem}. Using a deterministic slot makes the * module safe for use behind proxies and alongside other upgradeable components. */ library RoleSystemStorage { - /// @dev Unique storage slot for the layout, computed using EIP-7201 convention. + /// @notice Unique storage slot for the layout, computed using EIP-7201 convention. bytes32 private constant STORAGE_SLOT = - keccak256(abi.encode(uint256(keccak256("digital-original.storage.RoleSystem")) - 1)) & ~bytes32(uint256(0xff)); + keccak256(abi.encode(uint256(keccak256("digital-original.storage.RoleSystem")) - 1)) & + ~bytes32(uint256(0xff)); /** * @custom:storage-location erc7201:digital-original.storage.RoleSystem @@ -22,13 +22,11 @@ library RoleSystemStorage { /** * @notice Returns a pointer to the storage layout. - * * @return $ The pointer to the Layout struct in storage. */ function layout() internal pure returns (Layout storage $) { bytes32 slot = STORAGE_SLOT; - // solhint-disable-next-line assembly { $.slot := slot } diff --git a/package-lock.json b/package-lock.json index ae60b56..16d7da1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,13 +14,16 @@ "@openzeppelin/contracts-upgradeable": "^5.0.2", "@types/js-yaml": "^4.0.9", "ethers": "^6.16.0", - "hardhat": "^2.28.0", + "hardhat": "^2.28.6", "husky": "^9.1.7", "js-yaml": "^4.1.1", "lint-staged": "^16.2.7", - "prettier": "^3.7.4", + "prettier": "^3.8.1", "prettier-plugin-solidity": "^2.2.1", - "solhint": "^6.0.2" + "solhint": "^6.0.3" + }, + "engines": { + "node": "^24.6.0" } }, "node_modules/@adraffy/ens-normalize": { @@ -73,6 +76,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "license": "MPL-2.0", "peer": true, "bin": { "rlp": "bin/rlp" @@ -85,6 +89,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "license": "MPL-2.0", "peer": true, "dependencies": { "@ethereumjs/rlp": "^4.0.1", @@ -96,21 +101,23 @@ } }, "node_modules/@ethereumjs/util/node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", "peer": true, "dependencies": { - "@noble/hashes": "1.3.1" + "@noble/hashes": "1.4.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 16" @@ -120,15 +127,16 @@ } }, "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", - "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "license": "MIT", "peer": true, "dependencies": { - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@scure/bip32": "1.3.1", - "@scure/bip39": "1.2.1" + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" } }, "node_modules/@ethersproject/abi": { @@ -740,6 +748,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "peer": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -753,6 +762,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "peer": true, "engines": { "node": ">= 8" @@ -762,6 +772,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "peer": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -772,90 +783,90 @@ } }, "node_modules/@nomicfoundation/edr": { - "version": "0.12.0-next.17", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.12.0-next.17.tgz", - "integrity": "sha512-Y8Kwqd5JpBmI/Kst6NJ/bZ81FeJea9J6WEwoSRTZnEvwfqW9dk9PI8zJs2UJpOACL1fXEPvN+doETbxT9EhwXA==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.12.0-next.23.tgz", + "integrity": "sha512-F2/6HZh8Q9RsgkOIkRrckldbhPjIZY7d4mT9LYuW68miwGQ5l7CkAgcz9fRRiurA0+YJhtsbx/EyrD9DmX9BOw==", "license": "MIT", "dependencies": { - "@nomicfoundation/edr-darwin-arm64": "0.12.0-next.17", - "@nomicfoundation/edr-darwin-x64": "0.12.0-next.17", - "@nomicfoundation/edr-linux-arm64-gnu": "0.12.0-next.17", - "@nomicfoundation/edr-linux-arm64-musl": "0.12.0-next.17", - "@nomicfoundation/edr-linux-x64-gnu": "0.12.0-next.17", - "@nomicfoundation/edr-linux-x64-musl": "0.12.0-next.17", - "@nomicfoundation/edr-win32-x64-msvc": "0.12.0-next.17" + "@nomicfoundation/edr-darwin-arm64": "0.12.0-next.23", + "@nomicfoundation/edr-darwin-x64": "0.12.0-next.23", + "@nomicfoundation/edr-linux-arm64-gnu": "0.12.0-next.23", + "@nomicfoundation/edr-linux-arm64-musl": "0.12.0-next.23", + "@nomicfoundation/edr-linux-x64-gnu": "0.12.0-next.23", + "@nomicfoundation/edr-linux-x64-musl": "0.12.0-next.23", + "@nomicfoundation/edr-win32-x64-msvc": "0.12.0-next.23" }, "engines": { "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-darwin-arm64": { - "version": "0.12.0-next.17", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.12.0-next.17.tgz", - "integrity": "sha512-gI9/9ysLeAid0+VSTBeutxOJ0/Rrh00niGkGL9+4lR577igDY+v55XGN0oBMST49ILS0f12J6ZY90LG8sxPXmQ==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.12.0-next.23.tgz", + "integrity": "sha512-Amh7mRoDzZyJJ4efqoePqdoZOzharmSOttZuJDlVE5yy07BoE8hL6ZRpa5fNYn0LCqn/KoWs8OHANWxhKDGhvQ==", "license": "MIT", "engines": { "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-darwin-x64": { - "version": "0.12.0-next.17", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.12.0-next.17.tgz", - "integrity": "sha512-zSZtwf584RkIyb8awELDt7ctskogH0p4pmqOC4vhykc8ODOv2XLuG1IgeE4WgYhWGZOufbCtgLfpJQrWqN6mmw==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.12.0-next.23.tgz", + "integrity": "sha512-9wn489FIQm7m0UCD+HhktjWx6vskZzeZD9oDc2k9ZvbBzdXwPp5tiDqUBJ+eQpByAzCDfteAJwRn2lQCE0U+Iw==", "license": "MIT", "engines": { "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { - "version": "0.12.0-next.17", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.12.0-next.17.tgz", - "integrity": "sha512-WjdfgV6B7gT5Q0NXtSIWyeK8gzaJX5HK6/jclYVHarWuEtS1LFgePYgMjK8rmm7IRTkM9RsE/PCuQEP1nrSsuA==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.12.0-next.23.tgz", + "integrity": "sha512-nlk5EejSzEUfEngv0Jkhqq3/wINIfF2ED9wAofc22w/V1DV99ASh9l3/e/MIHOQFecIZ9MDqt0Em9/oDyB1Uew==", "license": "MIT", "engines": { "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-linux-arm64-musl": { - "version": "0.12.0-next.17", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.12.0-next.17.tgz", - "integrity": "sha512-26rObKhhCDb9JkZbToyr7JVZo4tSVAFvzoJSJVmvpOl0LOHrfFsgVQu2n/8cNkwMAqulPubKL2E0jdnmEoZjWA==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.12.0-next.23.tgz", + "integrity": "sha512-SJuPBp3Rc6vM92UtVTUxZQ/QlLhLfwTftt2XUiYohmGKB3RjGzpgduEFMCA0LEnucUckU6UHrJNFHiDm77C4PQ==", "license": "MIT", "engines": { "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-linux-x64-gnu": { - "version": "0.12.0-next.17", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.12.0-next.17.tgz", - "integrity": "sha512-dPkHScIf/CU6h6k3k4HNUnQyQcVSLKanviHCAcs5HkviiJPxvVtOMMvtNBxoIvKZRxGFxf2eutcqQW4ZV1wRQQ==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.12.0-next.23.tgz", + "integrity": "sha512-NU+Qs3u7Qt6t3bJFdmmjd5CsvgI2bPPzO31KifM2Ez96/jsXYho5debtTQnimlb5NAqiHTSlxjh/F8ROcptmeQ==", "license": "MIT", "engines": { "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-linux-x64-musl": { - "version": "0.12.0-next.17", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.12.0-next.17.tgz", - "integrity": "sha512-5Ixe/bpyWZxC3AjIb8EomAOK44ajemBVx/lZRHZiWSBlwQpbSWriYAtKjKcReQQPwuYVjnFpAD2AtuCvseIjHw==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.12.0-next.23.tgz", + "integrity": "sha512-F78fZA2h6/ssiCSZOovlgIu0dUeI7ItKPsDDF3UUlIibef052GCXmliMinC90jVPbrjUADMd1BUwjfI0Z8OllQ==", "license": "MIT", "engines": { "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-win32-x64-msvc": { - "version": "0.12.0-next.17", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.12.0-next.17.tgz", - "integrity": "sha512-29YlvdgofSdXG1mUzIuH4kMXu1lmVc1hvYWUGWEH59L+LaakdhfJ/Wu5izeclKkrTh729Amtk/Hk1m29kFOO8A==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.12.0-next.23.tgz", + "integrity": "sha512-IfJZQJn7d/YyqhmguBIGoCKjE9dKjbu6V6iNEPApfwf5JyyjHYyyfkLU4rf7hygj57bfH4sl1jtQ6r8HnT62lw==", "license": "MIT", "engines": { "node": ">= 20" } }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.1.0.tgz", - "integrity": "sha512-GPhBNafh1fCnVD9Y7BYvoLnblnvfcq3j8YDbO1gGe/1nOFWzGmV7gFu5DkwFXF+IpYsS+t96o9qc/mPu3V3Vfw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.1.2.tgz", + "integrity": "sha512-NlUlde/ycXw2bLzA2gWjjbxQaD9xIRbAF30nsoEprAWzH8dXEI1ILZUKZMyux9n9iygEXTzN0SDVjE6zWDZi9g==", "license": "MIT", "peer": true, "dependencies": { @@ -872,9 +883,9 @@ } }, "node_modules/@nomicfoundation/hardhat-ethers": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.1.0.tgz", - "integrity": "sha512-jx6fw3Ms7QBwFGT2MU6ICG292z0P81u6g54JjSV105+FbTZOF4FJqPksLfDybxkkOeq28eDxbqq7vpxRYyIlxA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.1.3.tgz", + "integrity": "sha512-208JcDeVIl+7Wu3MhFUUtiA8TJ7r2Rn3Wr+lSx9PfsDTKkbsAsWPY6N6wQ4mtzDv0/pB9nIbJhkjoHe1EsgNsA==", "license": "MIT", "peer": true, "dependencies": { @@ -883,18 +894,18 @@ }, "peerDependencies": { "ethers": "^6.14.0", - "hardhat": "^2.26.0" + "hardhat": "^2.28.0" } }, "node_modules/@nomicfoundation/hardhat-ignition": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.13.tgz", - "integrity": "sha512-G4XGPWvxs9DJhZ6PE1wdvKjHkjErWbsETf4c7YxO6GUz+MJGlw+PtgbnCwhL3tQzSq3oD4MB0LGi+sK0polpUA==", + "version": "0.15.16", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.16.tgz", + "integrity": "sha512-T0JTnuib7QcpsWkHCPLT7Z6F483EjTdcdjb1e00jqS9zTGCPqinPB66LLtR/duDLdvgoiCVS6K8WxTQkA/xR1Q==", "license": "MIT", "peer": true, "dependencies": { - "@nomicfoundation/ignition-core": "^0.15.13", - "@nomicfoundation/ignition-ui": "^0.15.12", + "@nomicfoundation/ignition-core": "^0.15.15", + "@nomicfoundation/ignition-ui": "^0.15.13", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", @@ -907,15 +918,15 @@ } }, "node_modules/@nomicfoundation/hardhat-ignition-ethers": { - "version": "0.15.14", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.14.tgz", - "integrity": "sha512-eq+5n+c1DW18/Xp8/QrHBBvG5QaKUxYF/byol4f1jrnZ1zAy0OrqEa/oaNFWchhpLalX7d7suk/2EL0PbT0CDQ==", + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.17.tgz", + "integrity": "sha512-io6Wrp1dUsJ94xEI3pw6qkPfhc9TFA+e6/+o16yQ8pvBTFMjgK5x8wIHKrrIHr9L3bkuTMtmDjyN4doqO2IqFQ==", "license": "MIT", "peer": true, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.1.0", - "@nomicfoundation/hardhat-ignition": "^0.15.13", - "@nomicfoundation/ignition-core": "^0.15.13", + "@nomicfoundation/hardhat-ignition": "^0.15.16", + "@nomicfoundation/ignition-core": "^0.15.15", "ethers": "^6.14.0", "hardhat": "^2.26.0" } @@ -1012,9 +1023,9 @@ } }, "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.1.0.tgz", - "integrity": "sha512-ZS+NulZuR99NUHt2VwcgZvgeD6Y63qrbORNRuKO+lTowJxNVsrJ0zbRx1j5De6G3dOno5pVGvuYSq2QVG0qCYg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.1.2.tgz", + "integrity": "sha512-p7HaUVDbLj7ikFivQVNhnfMHUBgiHYMwQWvGn9AriieuopGOELIrwj2KjyM2a6z70zai5YKO264Vwz+3UFJZPQ==", "license": "MIT", "peer": true, "dependencies": { @@ -1025,13 +1036,13 @@ } }, "node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-6.1.0.tgz", - "integrity": "sha512-iAIl6pIK3F4R3JXeq+b6tiShXUrp1sQRiPfqoCMUE7QLUzoFifzGV97IDRL6e73pWsMKpUQBsHBvTCsqn+ZdpA==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-6.1.2.tgz", + "integrity": "sha512-xKL2r43GC/UIcQzmtFSmj3L4KqLSQ4fK+kyUw0vbIp94nV+9o2ZkI1s3znB8EKXqitt9ClXo0qcKj9RKOFjqPQ==", "license": "MIT", "peerDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.1.0", - "@nomicfoundation/hardhat-ethers": "^3.1.0", + "@nomicfoundation/hardhat-ethers": "^3.1.3", "@nomicfoundation/hardhat-ignition-ethers": "^0.15.14", "@nomicfoundation/hardhat-network-helpers": "^1.1.0", "@nomicfoundation/hardhat-verify": "^2.1.0", @@ -1042,18 +1053,18 @@ "@types/node": ">=20.0.0", "chai": "^4.2.0", "ethers": "^6.14.0", - "hardhat": "^2.26.0", + "hardhat": "^2.28.0", "hardhat-gas-reporter": "^2.3.0", - "solidity-coverage": "^0.8.1", + "solidity-coverage": "^0.8.17", "ts-node": ">=8.0.0", "typechain": "^8.3.0", "typescript": ">=4.5.0" } }, "node_modules/@nomicfoundation/hardhat-verify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.1.1.tgz", - "integrity": "sha512-K1plXIS42xSHDJZRkrE2TZikqxp9T4y6jUMUNI/imLgN5uCcEQokmfU0DlyP9zzHncYK92HlT5IWP35UVCLrPw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.1.3.tgz", + "integrity": "sha512-danbGjPp2WBhLkJdQy9/ARM3WQIK+7vwzE0urNem1qZJjh9f54Kf5f1xuQv8DvqewUAkuPxVt/7q4Grz5WjqSg==", "license": "MIT", "peer": true, "dependencies": { @@ -1072,9 +1083,9 @@ } }, "node_modules/@nomicfoundation/ignition-core": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.13.tgz", - "integrity": "sha512-Z4T1WIbw0EqdsN9RxtnHeQXBi7P/piAmCu8bZmReIdDo/2h06qgKWxjDoNfc9VBFZJ0+Dx79tkgQR3ewxMDcpA==", + "version": "0.15.15", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.15.tgz", + "integrity": "sha512-JdKFxYknTfOYtFXMN6iFJ1vALJPednuB+9p9OwGIRdoI6HYSh4ZBzyRURgyXtHFyaJ/SF9lBpsYV9/1zEpcYwg==", "license": "MIT", "peer": true, "dependencies": { @@ -1142,9 +1153,10 @@ } }, "node_modules/@nomicfoundation/ignition-ui": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.12.tgz", - "integrity": "sha512-nQl8tusvmt1ANoyIj5RQl9tVSEmG0FnNbtwnWbTim+F8JLm4YLHWS0yEgYUZC+BEO3oS0D8r6V8a02JGZJgqiQ==", + "version": "0.15.13", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.13.tgz", + "integrity": "sha512-HbTszdN1iDHCkUS9hLeooqnLEW2U45FaqFwFEYT8nIno2prFZhG+n68JEERjmfFCB5u0WgbuJwk3CgLoqtSL7Q==", + "license": "MIT", "peer": true }, "node_modules/@nomicfoundation/slang": { @@ -1386,35 +1398,38 @@ } }, "node_modules/@scure/bip32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", - "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "license": "MIT", "peer": true, "dependencies": { - "@noble/curves": "~1.1.0", - "@noble/hashes": "~1.3.1", - "@scure/base": "~1.1.0" + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32/node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", "peer": true, "dependencies": { - "@noble/hashes": "1.3.1" + "@noble/hashes": "1.4.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 16" @@ -1424,13 +1439,27 @@ } }, "node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "license": "MIT", "peer": true, "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -1674,6 +1703,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "license": "MIT", "peer": true, "dependencies": { "@types/minimatch": "*", @@ -1695,6 +1725,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "license": "MIT", "peer": true }, "node_modules/@types/mocha": { @@ -1741,6 +1772,7 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "license": "ISC", "peer": true }, "node_modules/abitype": { @@ -1823,14 +1855,15 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -1896,14 +1929,6 @@ "node": ">=4" } }, - "node_modules/antlr4": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.13.1.tgz", - "integrity": "sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==", - "engines": { - "node": ">=16" - } - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -1940,6 +1965,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -1972,6 +1998,7 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "license": "MIT", "peer": true }, "node_modules/asynckit": { @@ -2007,14 +2034,14 @@ } }, "node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "license": "MIT", "peer": true, "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, @@ -2138,9 +2165,10 @@ "peer": true }, "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "license": "MIT" }, "node_modules/boxen": { "version": "5.1.2", @@ -3031,6 +3059,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT", "peer": true }, "node_modules/defer-to-connect": { @@ -3078,9 +3107,9 @@ } }, "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -3102,6 +3131,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", "peer": true, "dependencies": { "path-type": "^4.0.0" @@ -3148,9 +3178,9 @@ } }, "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "license": "MIT" }, "node_modules/emoji-regex": { @@ -3268,6 +3298,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "license": "BSD-2-Clause", "peer": true, "dependencies": { "esprima": "^2.7.1", @@ -3290,6 +3321,7 @@ "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "license": "BSD-2-Clause", "peer": true, "bin": { "esparse": "bin/esparse.js", @@ -3312,18 +3344,33 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz", + "integrity": "sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==", + "license": "MIT", "peer": true, "dependencies": { - "js-sha3": "^0.8.0" + "@noble/hashes": "^1.4.0" + } + }, + "node_modules/ethereum-bloom-filters/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/ethereum-cryptography": { @@ -3399,6 +3446,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "license": "MIT", "peer": true, "dependencies": { "bn.js": "4.11.6", @@ -3413,6 +3461,7 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "license": "MIT", "peer": true }, "node_modules/eventemitter3": { @@ -3443,16 +3492,17 @@ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "peer": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -3467,12 +3517,30 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT", "peer": true }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", "peer": true, "dependencies": { "reusify": "^1.0.4" @@ -3525,9 +3593,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -3578,9 +3646,9 @@ } }, "node_modules/form-data": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", - "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "peer": true, "dependencies": { @@ -3723,6 +3791,7 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "license": "ISC", "peer": true, "dependencies": { "chalk": "^2.4.2", @@ -3733,20 +3802,22 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", "peer": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3763,10 +3834,50 @@ "node": ">= 6" } }, + "node_modules/glob/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "peer": true, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", + "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", "peer": true, "dependencies": { "global-prefix": "^3.0.0" @@ -3779,6 +3890,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", "peer": true, "dependencies": { "ini": "^1.3.5", @@ -3793,6 +3905,7 @@ "version": "10.0.2", "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "license": "MIT", "peer": true, "dependencies": { "@types/glob": "^7.1.1", @@ -3808,6 +3921,28 @@ "node": ">=8" } }, + "node_modules/globby/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -3865,6 +4000,7 @@ "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.5", @@ -3886,20 +4022,21 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/hardhat": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.28.0.tgz", - "integrity": "sha512-A3yBISI18EcnY2IR7Ny2xZF33Q3qH01yrWapeWbyGOiJm/386SasWjbHRHYgUlZ3YWJETIMh7wYfMUaXrofTDQ==", + "version": "2.28.6", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.28.6.tgz", + "integrity": "sha512-zQze7qe+8ltwHvhX5NQ8sN1N37WWZGw8L63y+2XcPxGwAjc/SMF829z3NS6o1krX0sryhAsVBK/xrwUqlsot4Q==", "license": "MIT", "dependencies": { "@ethereumjs/util": "^9.1.0", "@ethersproject/abi": "^5.1.2", - "@nomicfoundation/edr": "0.12.0-next.17", + "@nomicfoundation/edr": "0.12.0-next.23", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "adm-zip": "^0.4.16", @@ -4006,35 +4143,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/hardhat-gas-reporter/node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/hardhat-gas-reporter/node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/hardhat-gas-reporter/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -4051,16 +4159,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/hardhat-gas-reporter/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/hardhat-gas-reporter/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4111,27 +4209,6 @@ "@scure/bip39": "1.3.0" } }, - "node_modules/hardhat-gas-reporter/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "peer": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/hardhat-gas-reporter/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4142,22 +4219,6 @@ "node": ">=8" } }, - "node_modules/hardhat-gas-reporter/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/hardhat-gas-reporter/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4500,6 +4561,7 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "license": "MIT", "peer": true }, "node_modules/hmac-drbg": { @@ -4660,6 +4722,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "license": "MIT", "peer": true, "engines": { "node": ">= 0.10" @@ -4734,6 +4797,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "license": "MIT", "peer": true, "engines": { "node": ">=6.5.0", @@ -4950,6 +5014,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -4992,6 +5057,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "~1.1.2", @@ -5490,6 +5556,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 8" @@ -5537,6 +5604,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", + "license": "MIT", "peer": true }, "node_modules/micro-packed": { @@ -5629,9 +5697,10 @@ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -5662,6 +5731,7 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.6" @@ -5762,9 +5832,9 @@ } }, "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz", + "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -5829,6 +5899,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT", "peer": true }, "node_modules/node-addon-api": { @@ -5840,6 +5911,7 @@ "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.17.21" @@ -5869,6 +5941,7 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "license": "ISC", "peer": true, "dependencies": { "abbrev": "1" @@ -5900,6 +5973,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "license": "MIT", "peer": true, "dependencies": { "bn.js": "4.11.6", @@ -5914,6 +5988,7 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "license": "MIT", "peer": true }, "node_modules/obliterator": { @@ -5948,6 +6023,7 @@ "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", "peer": true, "dependencies": { "deep-is": "~0.1.3", @@ -6364,6 +6440,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -6397,9 +6474,9 @@ } }, "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -6492,6 +6569,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "peer": true }, "node_modules/quick-lru": { @@ -6589,6 +6667,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", "peer": true, "dependencies": { "minimatch": "^3.0.5" @@ -6704,9 +6783,10 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", "peer": true, "engines": { "iojs": ">=1.0.0", @@ -6761,6 +6841,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "peer": true, "dependencies": { "queue-microtask": "^1.2.2" @@ -6794,6 +6875,7 @@ "version": "0.4.6", "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "abbrev": "1.0.x", @@ -6819,6 +6901,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "peer": true, "dependencies": { "sprintf-js": "~1.0.2" @@ -6828,6 +6911,8 @@ "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", "peer": true, "dependencies": { "inflight": "^1.0.4", @@ -6844,15 +6929,17 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/sc-istanbul/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", "peer": true, "dependencies": { "argparse": "^1.0.7", @@ -6866,6 +6953,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "peer": true, "bin": { "esparse": "bin/esparse.js", @@ -6879,12 +6967,14 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "license": "MIT", "peer": true }, "node_modules/sc-istanbul/node_modules/supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^1.0.0" @@ -7032,6 +7122,7 @@ "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "glob": "^7.0.0", @@ -7045,6 +7136,28 @@ "node": ">=4" } }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -7068,6 +7181,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -7148,15 +7262,14 @@ } }, "node_modules/solhint": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/solhint/-/solhint-6.0.2.tgz", - "integrity": "sha512-RInN0tz9FVR4eYlyLS0Pk8iJP3WdfVmmMJR9FIUxe9bKHgAPE8OYUXcMd5PGi5fO5BnZw32e0qMYcJZgH9MiBg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-6.0.3.tgz", + "integrity": "sha512-LYiy1bN8X9eUsti13mbS4fY6ILVxhP6VoOgqbHxCsHl5VPnxOWf7U1V9ZvgizxdInKBMW82D1FNJO+daAcWHbA==", "license": "MIT", "dependencies": { "@solidity-parser/parser": "^0.20.2", "ajv": "^6.12.6", "ajv-errors": "^1.0.1", - "antlr4": "^4.13.1-patch-1", "ast-parents": "^0.0.1", "better-ajv-errors": "^2.0.2", "chalk": "^4.1.2", @@ -7181,9 +7294,10 @@ } }, "node_modules/solhint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7300,9 +7414,10 @@ } }, "node_modules/solhint/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz", + "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7356,9 +7471,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/solidity-coverage": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.16.tgz", - "integrity": "sha512-qKqgm8TPpcnCK0HCDLJrjbOA2tQNEJY4dHX/LSSQ9iwYFS973MwjtgYn2Iv3vfCEQJTj5xtm4cuUMzlJsJSMbg==", + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.17.tgz", + "integrity": "sha512-5P8vnB6qVX9tt1MfuONtCTEaEGO/O4WuEidPHIAJjx4sktHHKhO3rFvnE0q8L30nWJPTrcqGQMT7jpE29B2qow==", "license": "ISC", "peer": true, "dependencies": { @@ -7393,6 +7508,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -7407,31 +7523,18 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "node_modules/solidity-coverage/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/solidity-coverage/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -7443,17 +7546,12 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 4.0.0" } }, - "node_modules/solidity-coverage/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "peer": true - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -7485,6 +7583,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause", "peer": true }, "node_modules/stacktrace-parser": { @@ -7595,6 +7694,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "license": "MIT", "peer": true, "dependencies": { "is-hex-prefixed": "1.0.0" @@ -7912,9 +8012,10 @@ } }, "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.3.1" @@ -7934,6 +8035,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "~1.1.2" @@ -8150,6 +8252,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "license": "MIT", "peer": true }, "node_modules/util-deprecate": { @@ -8293,9 +8396,10 @@ } }, "node_modules/web3-utils": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.3.tgz", - "integrity": "sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz", + "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==", + "license": "LGPL-3.0", "peer": true, "dependencies": { "@ethereumjs/util": "^8.1.0", @@ -8312,21 +8416,23 @@ } }, "node_modules/web3-utils/node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", "peer": true, "dependencies": { - "@noble/hashes": "1.3.1" + "@noble/hashes": "1.4.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/web3-utils/node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 16" @@ -8336,21 +8442,23 @@ } }, "node_modules/web3-utils/node_modules/ethereum-cryptography": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", - "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "license": "MIT", "peer": true, "dependencies": { - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@scure/bip32": "1.3.1", - "@scure/bip39": "1.2.1" + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" } }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -8396,6 +8504,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -8405,6 +8514,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT", "peer": true }, "node_modules/wordwrapjs": { diff --git a/package.json b/package.json index 286b5c8..1fca889 100644 --- a/package.json +++ b/package.json @@ -18,12 +18,15 @@ "@openzeppelin/contracts-upgradeable": "^5.0.2", "@types/js-yaml": "^4.0.9", "ethers": "^6.16.0", - "hardhat": "^2.28.0", + "hardhat": "^2.28.6", "husky": "^9.1.7", "js-yaml": "^4.1.1", "lint-staged": "^16.2.7", - "prettier": "^3.7.4", + "prettier": "^3.8.1", "prettier-plugin-solidity": "^2.2.1", - "solhint": "^6.0.2" + "solhint": "^6.0.3" + }, + "engines": { + "node": "^24.6.0" } } diff --git a/requirements.txt b/requirements.txt index 9377a4c..d9dd458 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,11 @@ aiohappyeyeballs==2.6.1 -aiohttp==3.13.2 +aiohttp==3.13.3 aiosignal==1.4.0 annotated-types==0.7.0 attrs==25.4.0 bitarray==3.8.0 -cbor2==5.7.1 -certifi==2025.11.12 +cbor2==5.8.0 +certifi==2026.1.4 charset-normalizer==3.4.4 ckzg==2.1.5 crytic-compile==0.3.11 @@ -21,26 +21,26 @@ eth_abi==5.2.0 frozenlist==1.8.0 hexbytes==1.3.1 idna==3.11 -multidict==6.7.0 -packaging==25.0 +multidict==6.7.1 +packaging==26.0 parsimonious==0.10.0 prettytable==3.17.0 propcache==0.4.1 pycryptodome==3.23.0 -pydantic==2.12.4 +pydantic==2.12.5 pydantic_core==2.41.5 pyunormalize==17.0.0 -regex==2025.11.3 +regex==2026.2.19 requests==2.32.5 rlp==4.1.0 -slither-analyzer==0.11.3 -solc-select==1.1.0 +slither-analyzer==0.11.5 +solc-select==1.2.0 toolz==1.1.0 -types-requests==2.32.4.20250913 +types-requests==2.32.4.20260107 typing-inspection==0.4.2 typing_extensions==4.15.0 -urllib3==2.5.0 -wcwidth==0.2.14 -web3==7.14.0 +urllib3==2.6.3 +wcwidth==0.6.0 +web3==7.14.1 websockets==15.0.1 yarl==1.22.0 diff --git a/scripts/deploy-collection.ts b/scripts/deploy-collection.ts index 7fb7859..f3286e5 100644 --- a/scripts/deploy-collection.ts +++ b/scripts/deploy-collection.ts @@ -41,33 +41,33 @@ export async function deployCollection(params: Params, deployer?: Signer) { const ArtToken_Proxy_UpgradedEvent = < UpgradedEvent.LogDescription - >(Proxy.interface.parseLog(receipt.logs[0])); + >(Proxy.interface.parseLog(receipt.logs[1])); const ArtToken_ProxyAdmin_OwnershipTransferredEvent = < OwnershipTransferredEvent.LogDescription - >(ProxyAdmin.interface.parseLog(receipt.logs[1])); + >(ProxyAdmin.interface.parseLog(receipt.logs[2])); const ArtToken_Proxy_AdminChangedEvent = < AdminChangedEvent.LogDescription - >(Proxy.interface.parseLog(receipt.logs[2])); + >(Proxy.interface.parseLog(receipt.logs[3])); const AuctionHouse_Proxy_UpgradedEvent = < UpgradedEvent.LogDescription - >(Proxy.interface.parseLog(receipt.logs[3])); + >(Proxy.interface.parseLog(receipt.logs[4])); const AuctionHouse_ProxyAdmin_OwnershipTransferredEvent = < OwnershipTransferredEvent.LogDescription - >(ProxyAdmin.interface.parseLog(receipt.logs[4])); + >(ProxyAdmin.interface.parseLog(receipt.logs[5])); const AuctionHouse_Proxy_AdminChangedEvent = < AdminChangedEvent.LogDescription - >(Proxy.interface.parseLog(receipt.logs[5])); + >(Proxy.interface.parseLog(receipt.logs[6])); - // const ArtToken_Proxy_InitializedEvent = receipt.logs[6]; + // const ArtToken_Proxy_InitializedEvent = receipt.logs[7]; const Deployer_DeployedEvent = < DeployedEvent.LogDescription - >(Deployer.interface.parseLog(receipt.logs[7])); + >(Deployer.interface.parseLog(receipt.logs[8])); const artTokenAddr = Deployer_DeployedEvent.args.artToken; const artTokenImplAddr = ArtToken_Proxy_UpgradedEvent.args.implementation; diff --git a/slither.config.json b/slither.config.json index f184c1d..7b35df4 100644 --- a/slither.config.json +++ b/slither.config.json @@ -1,5 +1,6 @@ { "filter_paths": "(mocks/|tests/|node_modules/)", "compile_force_framework": "hardhat", - "hardhat_ignore_compile": true + "hardhat_ignore_compile": true, + "detectors_to_exclude": "conformance-to-solidity-naming-conventions" } diff --git a/slither.db.json b/slither.db.json index d32c7d0..446f8c0 100644 --- a/slither.db.json +++ b/slither.db.json @@ -1,524 +1,26 @@ [ - { - "elements": [ - { - "type": "function", - "name": "auctionExists", - "source_mapping": { - "start": 1914, - "length": 183, - "filename_relative": "contracts/auction-house/AuctionHouse.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", - "filename_short": "contracts/auction-house/AuctionHouse.sol", - "is_dependency": false, - "lines": [40, 41, 42, 43, 44, 45, 46], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "AuctionHouse", - "source_mapping": { - "start": 1272, - "length": 13404, - "filename_relative": "contracts/auction-house/AuctionHouse.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", - "filename_short": "contracts/auction-house/AuctionHouse.sol", - "is_dependency": false, - "lines": [ - 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, - 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, - 437, 438, 439, 440 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "auctionExists(uint256)" - } - } - ], - "description": "Modifier AuctionHouse.auctionExists(uint256) (contracts/auction-house/AuctionHouse.sol#40-46) does not always execute _; or revert\n", - "markdown": "Modifier [AuctionHouse.auctionExists(uint256)](contracts/auction-house/AuctionHouse.sol#L40-L46) does not always execute _; or revert\n", - "first_markdown_element": "contracts/auction-house/AuctionHouse.sol#L40-L46", - "id": "df77d86e81ab2e43df564de9204b5e212fdb053cced7d8363e9cf429b00d05c3", - "check": "incorrect-modifier", - "impact": "Low", - "confidence": "High" - }, - { - "elements": [ - { - "type": "function", - "name": "auctionEnded", - "source_mapping": { - "start": 2560, - "length": 180, - "filename_relative": "contracts/auction-house/AuctionHouse.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", - "filename_short": "contracts/auction-house/AuctionHouse.sol", - "is_dependency": false, - "lines": [60, 61, 62, 63, 64, 65, 66], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "AuctionHouse", - "source_mapping": { - "start": 1272, - "length": 13404, - "filename_relative": "contracts/auction-house/AuctionHouse.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", - "filename_short": "contracts/auction-house/AuctionHouse.sol", - "is_dependency": false, - "lines": [ - 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, - 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, - 437, 438, 439, 440 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "auctionEnded(uint256)" - } - } - ], - "description": "Modifier AuctionHouse.auctionEnded(uint256) (contracts/auction-house/AuctionHouse.sol#60-66) does not always execute _; or revert\n", - "markdown": "Modifier [AuctionHouse.auctionEnded(uint256)](contracts/auction-house/AuctionHouse.sol#L60-L66) does not always execute _; or revert\n", - "first_markdown_element": "contracts/auction-house/AuctionHouse.sol#L60-L66", - "id": "231e15bbc53bb317ba18ba7a532fc08f0aeab95b6e8a391e84eefe681b37b13e", - "check": "incorrect-modifier", - "impact": "Low", - "confidence": "High" - }, - { - "elements": [ - { - "type": "function", - "name": "withBuyer", - "source_mapping": { - "start": 3217, - "length": 180, - "filename_relative": "contracts/auction-house/AuctionHouse.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", - "filename_short": "contracts/auction-house/AuctionHouse.sol", - "is_dependency": false, - "lines": [80, 81, 82, 83, 84, 85, 86], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "AuctionHouse", - "source_mapping": { - "start": 1272, - "length": 13404, - "filename_relative": "contracts/auction-house/AuctionHouse.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", - "filename_short": "contracts/auction-house/AuctionHouse.sol", - "is_dependency": false, - "lines": [ - 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, - 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, - 437, 438, 439, 440 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "withBuyer(uint256)" - } - } - ], - "description": "Modifier AuctionHouse.withBuyer(uint256) (contracts/auction-house/AuctionHouse.sol#80-86) does not always execute _; or revert\n", - "markdown": "Modifier [AuctionHouse.withBuyer(uint256)](contracts/auction-house/AuctionHouse.sol#L80-L86) does not always execute _; or revert\n", - "first_markdown_element": "contracts/auction-house/AuctionHouse.sol#L80-L86", - "id": "128d5b812b57359a56062cf3a9b43628ab98d0de6b09df9fdaa3697aefe12bc7", - "check": "incorrect-modifier", - "impact": "Low", - "confidence": "High" - }, - { - "elements": [ - { - "type": "function", - "name": "authorizedBuyer", - "source_mapping": { - "start": 3880, - "length": 206, - "filename_relative": "contracts/auction-house/AuctionHouse.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", - "filename_short": "contracts/auction-house/AuctionHouse.sol", - "is_dependency": false, - "lines": [ - 100, 101, 102, 103, 104, 105, 106 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "AuctionHouse", - "source_mapping": { - "start": 1272, - "length": 13404, - "filename_relative": "contracts/auction-house/AuctionHouse.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", - "filename_short": "contracts/auction-house/AuctionHouse.sol", - "is_dependency": false, - "lines": [ - 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, - 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, - 437, 438, 439, 440 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "authorizedBuyer(address)" - } - } - ], - "description": "Modifier AuctionHouse.authorizedBuyer(address) (contracts/auction-house/AuctionHouse.sol#100-106) does not always execute _; or revert\n", - "markdown": "Modifier [AuctionHouse.authorizedBuyer(address)](contracts/auction-house/AuctionHouse.sol#L100-L106) does not always execute _; or revert\n", - "first_markdown_element": "contracts/auction-house/AuctionHouse.sol#L100-L106", - "id": "44596abc779becc714ceca96ccacdc0a13e2cb26cde89bd96cbe5d21e7dc5f1b", - "check": "incorrect-modifier", - "impact": "Low", - "confidence": "High" - }, { "elements": [ { "type": "function", "name": "create", "source_mapping": { - "start": 4900, - "length": 1910, + "start": 5070, + "length": 1911, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, "lines": [ - 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193 + 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189 ], "starting_column": 5, "ending_column": 6 @@ -528,92 +30,87 @@ "type": "contract", "name": "AuctionHouse", "source_mapping": { - "start": 1272, - "length": 13404, + "start": 1215, + "length": 13407, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, "lines": [ - 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, - 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, - 437, 438, 439, 440 + 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, + 411, 412, 413, 414 ], "starting_column": 1, "ending_column": 2 @@ -626,13 +123,13 @@ "type": "node", "name": "permit.endTime < block.timestamp + MIN_DURATION", "source_mapping": { - "start": 5422, + "start": 5629, "length": 47, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, - "lines": [150], + "lines": [148], "starting_column": 13, "ending_column": 60 }, @@ -641,26 +138,25 @@ "type": "function", "name": "create", "source_mapping": { - "start": 4900, - "length": 1910, + "start": 5070, + "length": 1911, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, "lines": [ - 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, - 192, 193 + 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189 ], "starting_column": 5, "ending_column": 6 @@ -670,113 +166,107 @@ "type": "contract", "name": "AuctionHouse", "source_mapping": { - "start": 1272, - "length": 13404, + "start": 1215, + "length": 13407, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, "lines": [ - 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, - 101, 102, 103, 104, - 105, 106, 107, 108, - 109, 110, 111, 112, - 113, 114, 115, 116, - 117, 118, 119, 120, - 121, 122, 123, 124, - 125, 126, 127, 128, - 129, 130, 131, 132, - 133, 134, 135, 136, - 137, 138, 139, 140, - 141, 142, 143, 144, - 145, 146, 147, 148, - 149, 150, 151, 152, - 153, 154, 155, 156, - 157, 158, 159, 160, - 161, 162, 163, 164, - 165, 166, 167, 168, - 169, 170, 171, 172, - 173, 174, 175, 176, - 177, 178, 179, 180, - 181, 182, 183, 184, - 185, 186, 187, 188, - 189, 190, 191, 192, - 193, 194, 195, 196, - 197, 198, 199, 200, - 201, 202, 203, 204, - 205, 206, 207, 208, - 209, 210, 211, 212, - 213, 214, 215, 216, - 217, 218, 219, 220, - 221, 222, 223, 224, - 225, 226, 227, 228, - 229, 230, 231, 232, - 233, 234, 235, 236, - 237, 238, 239, 240, - 241, 242, 243, 244, - 245, 246, 247, 248, - 249, 250, 251, 252, - 253, 254, 255, 256, - 257, 258, 259, 260, - 261, 262, 263, 264, - 265, 266, 267, 268, - 269, 270, 271, 272, - 273, 274, 275, 276, - 277, 278, 279, 280, - 281, 282, 283, 284, - 285, 286, 287, 288, - 289, 290, 291, 292, - 293, 294, 295, 296, - 297, 298, 299, 300, - 301, 302, 303, 304, - 305, 306, 307, 308, - 309, 310, 311, 312, - 313, 314, 315, 316, - 317, 318, 319, 320, - 321, 322, 323, 324, - 325, 326, 327, 328, - 329, 330, 331, 332, - 333, 334, 335, 336, - 337, 338, 339, 340, - 341, 342, 343, 344, - 345, 346, 347, 348, - 349, 350, 351, 352, - 353, 354, 355, 356, - 357, 358, 359, 360, - 361, 362, 363, 364, - 365, 366, 367, 368, - 369, 370, 371, 372, - 373, 374, 375, 376, - 377, 378, 379, 380, - 381, 382, 383, 384, - 385, 386, 387, 388, - 389, 390, 391, 392, - 393, 394, 395, 396, - 397, 398, 399, 400, - 401, 402, 403, 404, - 405, 406, 407, 408, - 409, 410, 411, 412, - 413, 414, 415, 416, - 417, 418, 419, 420, - 421, 422, 423, 424, - 425, 426, 427, 428, - 429, 430, 431, 432, - 433, 434, 435, 436, - 437, 438, 439, 440 + 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, + 100, 101, 102, 103, + 104, 105, 106, 107, + 108, 109, 110, 111, + 112, 113, 114, 115, + 116, 117, 118, 119, + 120, 121, 122, 123, + 124, 125, 126, 127, + 128, 129, 130, 131, + 132, 133, 134, 135, + 136, 137, 138, 139, + 140, 141, 142, 143, + 144, 145, 146, 147, + 148, 149, 150, 151, + 152, 153, 154, 155, + 156, 157, 158, 159, + 160, 161, 162, 163, + 164, 165, 166, 167, + 168, 169, 170, 171, + 172, 173, 174, 175, + 176, 177, 178, 179, + 180, 181, 182, 183, + 184, 185, 186, 187, + 188, 189, 190, 191, + 192, 193, 194, 195, + 196, 197, 198, 199, + 200, 201, 202, 203, + 204, 205, 206, 207, + 208, 209, 210, 211, + 212, 213, 214, 215, + 216, 217, 218, 219, + 220, 221, 222, 223, + 224, 225, 226, 227, + 228, 229, 230, 231, + 232, 233, 234, 235, + 236, 237, 238, 239, + 240, 241, 242, 243, + 244, 245, 246, 247, + 248, 249, 250, 251, + 252, 253, 254, 255, + 256, 257, 258, 259, + 260, 261, 262, 263, + 264, 265, 266, 267, + 268, 269, 270, 271, + 272, 273, 274, 275, + 276, 277, 278, 279, + 280, 281, 282, 283, + 284, 285, 286, 287, + 288, 289, 290, 291, + 292, 293, 294, 295, + 296, 297, 298, 299, + 300, 301, 302, 303, + 304, 305, 306, 307, + 308, 309, 310, 311, + 312, 313, 314, 315, + 316, 317, 318, 319, + 320, 321, 322, 323, + 324, 325, 326, 327, + 328, 329, 330, 331, + 332, 333, 334, 335, + 336, 337, 338, 339, + 340, 341, 342, 343, + 344, 345, 346, 347, + 348, 349, 350, 351, + 352, 353, 354, 355, + 356, 357, 358, 359, + 360, 361, 362, 363, + 364, 365, 366, 367, + 368, 369, 370, 371, + 372, 373, 374, 375, + 376, 377, 378, 379, + 380, 381, 382, 383, + 384, 385, 386, 387, + 388, 389, 390, 391, + 392, 393, 394, 395, + 396, 397, 398, 399, + 400, 401, 402, 403, + 404, 405, 406, 407, + 408, 409, 410, 411, + 412, 413, 414 ], "starting_column": 1, "ending_column": 2 @@ -791,13 +281,13 @@ "type": "node", "name": "permit.endTime > block.timestamp + MAX_DURATION", "source_mapping": { - "start": 5545, + "start": 5752, "length": 47, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, - "lines": [154], + "lines": [152], "starting_column": 13, "ending_column": 60 }, @@ -806,26 +296,25 @@ "type": "function", "name": "create", "source_mapping": { - "start": 4900, - "length": 1910, + "start": 5070, + "length": 1911, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, "lines": [ - 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, - 192, 193 + 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189 ], "starting_column": 5, "ending_column": 6 @@ -835,113 +324,107 @@ "type": "contract", "name": "AuctionHouse", "source_mapping": { - "start": 1272, - "length": 13404, + "start": 1215, + "length": 13407, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, "lines": [ - 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, - 101, 102, 103, 104, - 105, 106, 107, 108, - 109, 110, 111, 112, - 113, 114, 115, 116, - 117, 118, 119, 120, - 121, 122, 123, 124, - 125, 126, 127, 128, - 129, 130, 131, 132, - 133, 134, 135, 136, - 137, 138, 139, 140, - 141, 142, 143, 144, - 145, 146, 147, 148, - 149, 150, 151, 152, - 153, 154, 155, 156, - 157, 158, 159, 160, - 161, 162, 163, 164, - 165, 166, 167, 168, - 169, 170, 171, 172, - 173, 174, 175, 176, - 177, 178, 179, 180, - 181, 182, 183, 184, - 185, 186, 187, 188, - 189, 190, 191, 192, - 193, 194, 195, 196, - 197, 198, 199, 200, - 201, 202, 203, 204, - 205, 206, 207, 208, - 209, 210, 211, 212, - 213, 214, 215, 216, - 217, 218, 219, 220, - 221, 222, 223, 224, - 225, 226, 227, 228, - 229, 230, 231, 232, - 233, 234, 235, 236, - 237, 238, 239, 240, - 241, 242, 243, 244, - 245, 246, 247, 248, - 249, 250, 251, 252, - 253, 254, 255, 256, - 257, 258, 259, 260, - 261, 262, 263, 264, - 265, 266, 267, 268, - 269, 270, 271, 272, - 273, 274, 275, 276, - 277, 278, 279, 280, - 281, 282, 283, 284, - 285, 286, 287, 288, - 289, 290, 291, 292, - 293, 294, 295, 296, - 297, 298, 299, 300, - 301, 302, 303, 304, - 305, 306, 307, 308, - 309, 310, 311, 312, - 313, 314, 315, 316, - 317, 318, 319, 320, - 321, 322, 323, 324, - 325, 326, 327, 328, - 329, 330, 331, 332, - 333, 334, 335, 336, - 337, 338, 339, 340, - 341, 342, 343, 344, - 345, 346, 347, 348, - 349, 350, 351, 352, - 353, 354, 355, 356, - 357, 358, 359, 360, - 361, 362, 363, 364, - 365, 366, 367, 368, - 369, 370, 371, 372, - 373, 374, 375, 376, - 377, 378, 379, 380, - 381, 382, 383, 384, - 385, 386, 387, 388, - 389, 390, 391, 392, - 393, 394, 395, 396, - 397, 398, 399, 400, - 401, 402, 403, 404, - 405, 406, 407, 408, - 409, 410, 411, 412, - 413, 414, 415, 416, - 417, 418, 419, 420, - 421, 422, 423, 424, - 425, 426, 427, 428, - 429, 430, 431, 432, - 433, 434, 435, 436, - 437, 438, 439, 440 + 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, + 100, 101, 102, 103, + 104, 105, 106, 107, + 108, 109, 110, 111, + 112, 113, 114, 115, + 116, 117, 118, 119, + 120, 121, 122, 123, + 124, 125, 126, 127, + 128, 129, 130, 131, + 132, 133, 134, 135, + 136, 137, 138, 139, + 140, 141, 142, 143, + 144, 145, 146, 147, + 148, 149, 150, 151, + 152, 153, 154, 155, + 156, 157, 158, 159, + 160, 161, 162, 163, + 164, 165, 166, 167, + 168, 169, 170, 171, + 172, 173, 174, 175, + 176, 177, 178, 179, + 180, 181, 182, 183, + 184, 185, 186, 187, + 188, 189, 190, 191, + 192, 193, 194, 195, + 196, 197, 198, 199, + 200, 201, 202, 203, + 204, 205, 206, 207, + 208, 209, 210, 211, + 212, 213, 214, 215, + 216, 217, 218, 219, + 220, 221, 222, 223, + 224, 225, 226, 227, + 228, 229, 230, 231, + 232, 233, 234, 235, + 236, 237, 238, 239, + 240, 241, 242, 243, + 244, 245, 246, 247, + 248, 249, 250, 251, + 252, 253, 254, 255, + 256, 257, 258, 259, + 260, 261, 262, 263, + 264, 265, 266, 267, + 268, 269, 270, 271, + 272, 273, 274, 275, + 276, 277, 278, 279, + 280, 281, 282, 283, + 284, 285, 286, 287, + 288, 289, 290, 291, + 292, 293, 294, 295, + 296, 297, 298, 299, + 300, 301, 302, 303, + 304, 305, 306, 307, + 308, 309, 310, 311, + 312, 313, 314, 315, + 316, 317, 318, 319, + 320, 321, 322, 323, + 324, 325, 326, 327, + 328, 329, 330, 331, + 332, 333, 334, 335, + 336, 337, 338, 339, + 340, 341, 342, 343, + 344, 345, 346, 347, + 348, 349, 350, 351, + 352, 353, 354, 355, + 356, 357, 358, 359, + 360, 361, 362, 363, + 364, 365, 366, 367, + 368, 369, 370, 371, + 372, 373, 374, 375, + 376, 377, 378, 379, + 380, 381, 382, 383, + 384, 385, 386, 387, + 388, 389, 390, 391, + 392, 393, 394, 395, + 396, 397, 398, 399, + 400, 401, 402, 403, + 404, 405, 406, 407, + 408, 409, 410, 411, + 412, 413, 414 ], "starting_column": 1, "ending_column": 2 @@ -953,10 +436,10 @@ } } ], - "description": "AuctionHouse.create(AuctionCreationPermit.Type,bytes) (contracts/auction-house/AuctionHouse.sol#132-193) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- permit.endTime < block.timestamp + MIN_DURATION (contracts/auction-house/AuctionHouse.sol#150)\n\t- permit.endTime > block.timestamp + MAX_DURATION (contracts/auction-house/AuctionHouse.sol#154)\n", - "markdown": "[AuctionHouse.create(AuctionCreationPermit.Type,bytes)](contracts/auction-house/AuctionHouse.sol#L132-L193) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [permit.endTime < block.timestamp + MIN_DURATION](contracts/auction-house/AuctionHouse.sol#L150)\n\t- [permit.endTime > block.timestamp + MAX_DURATION](contracts/auction-house/AuctionHouse.sol#L154)\n", - "first_markdown_element": "contracts/auction-house/AuctionHouse.sol#L132-L193", - "id": "d4a899dd14eada97e5a88abc4bd21ff91eb1ce77b34ad425143c4df5f40997f9", + "description": "AuctionHouse.create(AuctionCreationPermit.Type,bytes) (contracts/auction-house/AuctionHouse.sol#130-189) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- permit.endTime < block.timestamp + MIN_DURATION (contracts/auction-house/AuctionHouse.sol#148)\n\t- permit.endTime > block.timestamp + MAX_DURATION (contracts/auction-house/AuctionHouse.sol#152)\n", + "markdown": "[AuctionHouse.create(AuctionCreationPermit.Type,bytes)](contracts/auction-house/AuctionHouse.sol#L130-L189) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [permit.endTime < block.timestamp + MIN_DURATION](contracts/auction-house/AuctionHouse.sol#L148)\n\t- [permit.endTime > block.timestamp + MAX_DURATION](contracts/auction-house/AuctionHouse.sol#L152)\n", + "first_markdown_element": "contracts/auction-house/AuctionHouse.sol#L130-L189", + "id": "f7deeada9220a9cb390c2b6950b702a8a0829077213f30de960ae151319489ba", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -967,13 +450,13 @@ "type": "function", "name": "_auctionEnded", "source_mapping": { - "start": 13566, + "start": 13546, "length": 219, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, - "lines": [413, 414, 415, 416, 417], + "lines": [387, 388, 389, 390, 391], "starting_column": 5, "ending_column": 6 }, @@ -982,92 +465,87 @@ "type": "contract", "name": "AuctionHouse", "source_mapping": { - "start": 1272, - "length": 13404, + "start": 1215, + "length": 13407, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, "lines": [ - 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, - 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, - 437, 438, 439, 440 + 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, + 411, 412, 413, 414 ], "starting_column": 1, "ending_column": 2 @@ -1080,13 +558,13 @@ "type": "node", "name": "$.auction[auctionId].endTime <= block.timestamp", "source_mapping": { - "start": 13724, + "start": 13704, "length": 54, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, - "lines": [416], + "lines": [390], "starting_column": 9, "ending_column": 63 }, @@ -1095,14 +573,14 @@ "type": "function", "name": "_auctionEnded", "source_mapping": { - "start": 13566, + "start": 13546, "length": 219, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, "lines": [ - 413, 414, 415, 416, 417 + 387, 388, 389, 390, 391 ], "starting_column": 5, "ending_column": 6 @@ -1112,113 +590,107 @@ "type": "contract", "name": "AuctionHouse", "source_mapping": { - "start": 1272, - "length": 13404, + "start": 1215, + "length": 13407, "filename_relative": "contracts/auction-house/AuctionHouse.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", "filename_short": "contracts/auction-house/AuctionHouse.sol", "is_dependency": false, "lines": [ - 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, - 101, 102, 103, 104, - 105, 106, 107, 108, - 109, 110, 111, 112, - 113, 114, 115, 116, - 117, 118, 119, 120, - 121, 122, 123, 124, - 125, 126, 127, 128, - 129, 130, 131, 132, - 133, 134, 135, 136, - 137, 138, 139, 140, - 141, 142, 143, 144, - 145, 146, 147, 148, - 149, 150, 151, 152, - 153, 154, 155, 156, - 157, 158, 159, 160, - 161, 162, 163, 164, - 165, 166, 167, 168, - 169, 170, 171, 172, - 173, 174, 175, 176, - 177, 178, 179, 180, - 181, 182, 183, 184, - 185, 186, 187, 188, - 189, 190, 191, 192, - 193, 194, 195, 196, - 197, 198, 199, 200, - 201, 202, 203, 204, - 205, 206, 207, 208, - 209, 210, 211, 212, - 213, 214, 215, 216, - 217, 218, 219, 220, - 221, 222, 223, 224, - 225, 226, 227, 228, - 229, 230, 231, 232, - 233, 234, 235, 236, - 237, 238, 239, 240, - 241, 242, 243, 244, - 245, 246, 247, 248, - 249, 250, 251, 252, - 253, 254, 255, 256, - 257, 258, 259, 260, - 261, 262, 263, 264, - 265, 266, 267, 268, - 269, 270, 271, 272, - 273, 274, 275, 276, - 277, 278, 279, 280, - 281, 282, 283, 284, - 285, 286, 287, 288, - 289, 290, 291, 292, - 293, 294, 295, 296, - 297, 298, 299, 300, - 301, 302, 303, 304, - 305, 306, 307, 308, - 309, 310, 311, 312, - 313, 314, 315, 316, - 317, 318, 319, 320, - 321, 322, 323, 324, - 325, 326, 327, 328, - 329, 330, 331, 332, - 333, 334, 335, 336, - 337, 338, 339, 340, - 341, 342, 343, 344, - 345, 346, 347, 348, - 349, 350, 351, 352, - 353, 354, 355, 356, - 357, 358, 359, 360, - 361, 362, 363, 364, - 365, 366, 367, 368, - 369, 370, 371, 372, - 373, 374, 375, 376, - 377, 378, 379, 380, - 381, 382, 383, 384, - 385, 386, 387, 388, - 389, 390, 391, 392, - 393, 394, 395, 396, - 397, 398, 399, 400, - 401, 402, 403, 404, - 405, 406, 407, 408, - 409, 410, 411, 412, - 413, 414, 415, 416, - 417, 418, 419, 420, - 421, 422, 423, 424, - 425, 426, 427, 428, - 429, 430, 431, 432, - 433, 434, 435, 436, - 437, 438, 439, 440 + 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, + 100, 101, 102, 103, + 104, 105, 106, 107, + 108, 109, 110, 111, + 112, 113, 114, 115, + 116, 117, 118, 119, + 120, 121, 122, 123, + 124, 125, 126, 127, + 128, 129, 130, 131, + 132, 133, 134, 135, + 136, 137, 138, 139, + 140, 141, 142, 143, + 144, 145, 146, 147, + 148, 149, 150, 151, + 152, 153, 154, 155, + 156, 157, 158, 159, + 160, 161, 162, 163, + 164, 165, 166, 167, + 168, 169, 170, 171, + 172, 173, 174, 175, + 176, 177, 178, 179, + 180, 181, 182, 183, + 184, 185, 186, 187, + 188, 189, 190, 191, + 192, 193, 194, 195, + 196, 197, 198, 199, + 200, 201, 202, 203, + 204, 205, 206, 207, + 208, 209, 210, 211, + 212, 213, 214, 215, + 216, 217, 218, 219, + 220, 221, 222, 223, + 224, 225, 226, 227, + 228, 229, 230, 231, + 232, 233, 234, 235, + 236, 237, 238, 239, + 240, 241, 242, 243, + 244, 245, 246, 247, + 248, 249, 250, 251, + 252, 253, 254, 255, + 256, 257, 258, 259, + 260, 261, 262, 263, + 264, 265, 266, 267, + 268, 269, 270, 271, + 272, 273, 274, 275, + 276, 277, 278, 279, + 280, 281, 282, 283, + 284, 285, 286, 287, + 288, 289, 290, 291, + 292, 293, 294, 295, + 296, 297, 298, 299, + 300, 301, 302, 303, + 304, 305, 306, 307, + 308, 309, 310, 311, + 312, 313, 314, 315, + 316, 317, 318, 319, + 320, 321, 322, 323, + 324, 325, 326, 327, + 328, 329, 330, 331, + 332, 333, 334, 335, + 336, 337, 338, 339, + 340, 341, 342, 343, + 344, 345, 346, 347, + 348, 349, 350, 351, + 352, 353, 354, 355, + 356, 357, 358, 359, + 360, 361, 362, 363, + 364, 365, 366, 367, + 368, 369, 370, 371, + 372, 373, 374, 375, + 376, 377, 378, 379, + 380, 381, 382, 383, + 384, 385, 386, 387, + 388, 389, 390, 391, + 392, 393, 394, 395, + 396, 397, 398, 399, + 400, 401, 402, 403, + 404, 405, 406, 407, + 408, 409, 410, 411, + 412, 413, 414 ], "starting_column": 1, "ending_column": 2 @@ -1230,10 +702,10 @@ } } ], - "description": "AuctionHouse._auctionEnded(uint256) (contracts/auction-house/AuctionHouse.sol#413-417) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- $.auction[auctionId].endTime <= block.timestamp (contracts/auction-house/AuctionHouse.sol#416)\n", - "markdown": "[AuctionHouse._auctionEnded(uint256)](contracts/auction-house/AuctionHouse.sol#L413-L417) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [$.auction[auctionId].endTime <= block.timestamp](contracts/auction-house/AuctionHouse.sol#L416)\n", - "first_markdown_element": "contracts/auction-house/AuctionHouse.sol#L413-L417", - "id": "fd4ce76ff64a76aa5cb09ee731e85bcd767955a8f013ef4beef10155084fd83b", + "description": "AuctionHouse._auctionEnded(uint256) (contracts/auction-house/AuctionHouse.sol#387-391) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- $.auction[auctionId].endTime <= block.timestamp (contracts/auction-house/AuctionHouse.sol#390)\n", + "markdown": "[AuctionHouse._auctionEnded(uint256)](contracts/auction-house/AuctionHouse.sol#L387-L391) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [$.auction[auctionId].endTime <= block.timestamp](contracts/auction-house/AuctionHouse.sol#L390)\n", + "first_markdown_element": "contracts/auction-house/AuctionHouse.sol#L387-L391", + "id": "23e5ac8aba1eb122be26d23b6c8c6200167234746619534342e35d48164e67d9", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -1244,16 +716,16 @@ "type": "function", "name": "_requireAuthorizedOrder", "source_mapping": { - "start": 8872, - "length": 568, + "start": 10797, + "length": 523, "filename_relative": "contracts/market/Market.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/Market.sol", "filename_short": "contracts/market/Market.sol", "is_dependency": false, "lines": [ - 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285 + 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306 ], "starting_column": 5, "ending_column": 6 @@ -1263,61 +735,66 @@ "type": "contract", "name": "Market", "source_mapping": { - "start": 1221, - "length": 8221, + "start": 1102, + "length": 10220, "filename_relative": "contracts/market/Market.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/Market.sol", "filename_short": "contracts/market/Market.sol", "is_dependency": false, "lines": [ - 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286 + 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, + 301, 302, 303, 304, 305, + 306, 307 ], "starting_column": 1, "ending_column": 2 @@ -1330,13 +807,13 @@ "type": "node", "name": "startTime > block.timestamp || endTime < block.timestamp", "source_mapping": { - "start": 9080, + "start": 11005, "length": 56, "filename_relative": "contracts/market/Market.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/Market.sol", "filename_short": "contracts/market/Market.sol", "is_dependency": false, - "lines": [272], + "lines": [297], "starting_column": 13, "ending_column": 69 }, @@ -1345,17 +822,17 @@ "type": "function", "name": "_requireAuthorizedOrder", "source_mapping": { - "start": 8872, - "length": 568, + "start": 10797, + "length": 523, "filename_relative": "contracts/market/Market.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/Market.sol", "filename_short": "contracts/market/Market.sol", "is_dependency": false, "lines": [ - 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285 + 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, + 305, 306 ], "starting_column": 5, "ending_column": 6 @@ -1365,75 +842,81 @@ "type": "contract", "name": "Market", "source_mapping": { - "start": 1221, - "length": 8221, + "start": 1102, + "length": 10220, "filename_relative": "contracts/market/Market.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/Market.sol", "filename_short": "contracts/market/Market.sol", "is_dependency": false, "lines": [ - 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, - 101, 102, 103, 104, - 105, 106, 107, 108, - 109, 110, 111, 112, - 113, 114, 115, 116, - 117, 118, 119, 120, - 121, 122, 123, 124, - 125, 126, 127, 128, - 129, 130, 131, 132, - 133, 134, 135, 136, - 137, 138, 139, 140, - 141, 142, 143, 144, - 145, 146, 147, 148, - 149, 150, 151, 152, - 153, 154, 155, 156, - 157, 158, 159, 160, - 161, 162, 163, 164, - 165, 166, 167, 168, - 169, 170, 171, 172, - 173, 174, 175, 176, - 177, 178, 179, 180, - 181, 182, 183, 184, - 185, 186, 187, 188, - 189, 190, 191, 192, - 193, 194, 195, 196, - 197, 198, 199, 200, - 201, 202, 203, 204, - 205, 206, 207, 208, - 209, 210, 211, 212, - 213, 214, 215, 216, - 217, 218, 219, 220, - 221, 222, 223, 224, - 225, 226, 227, 228, - 229, 230, 231, 232, - 233, 234, 235, 236, - 237, 238, 239, 240, - 241, 242, 243, 244, - 245, 246, 247, 248, - 249, 250, 251, 252, - 253, 254, 255, 256, - 257, 258, 259, 260, - 261, 262, 263, 264, - 265, 266, 267, 268, - 269, 270, 271, 272, - 273, 274, 275, 276, - 277, 278, 279, 280, - 281, 282, 283, 284, - 285, 286 + 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, + 99, 100, 101, 102, + 103, 104, 105, 106, + 107, 108, 109, 110, + 111, 112, 113, 114, + 115, 116, 117, 118, + 119, 120, 121, 122, + 123, 124, 125, 126, + 127, 128, 129, 130, + 131, 132, 133, 134, + 135, 136, 137, 138, + 139, 140, 141, 142, + 143, 144, 145, 146, + 147, 148, 149, 150, + 151, 152, 153, 154, + 155, 156, 157, 158, + 159, 160, 161, 162, + 163, 164, 165, 166, + 167, 168, 169, 170, + 171, 172, 173, 174, + 175, 176, 177, 178, + 179, 180, 181, 182, + 183, 184, 185, 186, + 187, 188, 189, 190, + 191, 192, 193, 194, + 195, 196, 197, 198, + 199, 200, 201, 202, + 203, 204, 205, 206, + 207, 208, 209, 210, + 211, 212, 213, 214, + 215, 216, 217, 218, + 219, 220, 221, 222, + 223, 224, 225, 226, + 227, 228, 229, 230, + 231, 232, 233, 234, + 235, 236, 237, 238, + 239, 240, 241, 242, + 243, 244, 245, 246, + 247, 248, 249, 250, + 251, 252, 253, 254, + 255, 256, 257, 258, + 259, 260, 261, 262, + 263, 264, 265, 266, + 267, 268, 269, 270, + 271, 272, 273, 274, + 275, 276, 277, 278, + 279, 280, 281, 282, + 283, 284, 285, 286, + 287, 288, 289, 290, + 291, 292, 293, 294, + 295, 296, 297, 298, + 299, 300, 301, 302, + 303, 304, 305, 306, + 307 ], "starting_column": 1, "ending_column": 2 @@ -1445,10 +928,10 @@ } } ], - "description": "Market._requireAuthorizedOrder(bytes32,address,uint256,uint256,bytes) (contracts/market/Market.sol#265-285) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- startTime > block.timestamp || endTime < block.timestamp (contracts/market/Market.sol#272)\n", - "markdown": "[Market._requireAuthorizedOrder(bytes32,address,uint256,uint256,bytes)](contracts/market/Market.sol#L265-L285) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [startTime > block.timestamp || endTime < block.timestamp](contracts/market/Market.sol#L272)\n", - "first_markdown_element": "contracts/market/Market.sol#L265-L285", - "id": "3ba883e3a9297c6c21ee47636449a380ba9903c018dcdd7d1176e0c28025d585", + "description": "Market._requireAuthorizedOrder(bytes32,address,uint256,uint256,bytes) (contracts/market/Market.sol#290-306) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- startTime > block.timestamp || endTime < block.timestamp (contracts/market/Market.sol#297)\n", + "markdown": "[Market._requireAuthorizedOrder(bytes32,address,uint256,uint256,bytes)](contracts/market/Market.sol#L290-L306) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [startTime > block.timestamp || endTime < block.timestamp](contracts/market/Market.sol#L297)\n", + "first_markdown_element": "contracts/market/Market.sol#L290-L306", + "id": "35dc34f048e621cfd682a1d9a3f35b37f2eae11a244ba8ded8a75a26085184a3", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -1459,15 +942,15 @@ "type": "function", "name": "_requireAuthorizedAction", "source_mapping": { - "start": 1457, - "length": 441, + "start": 1350, + "length": 472, "filename_relative": "contracts/utils/Authorization.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/Authorization.sol", "filename_short": "contracts/utils/Authorization.sol", "is_dependency": false, "lines": [ - 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44 + 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43 ], "starting_column": 5, "ending_column": 6 @@ -1477,18 +960,18 @@ "type": "contract", "name": "Authorization", "source_mapping": { - "start": 740, - "length": 1386, + "start": 734, + "length": 1316, "filename_relative": "contracts/utils/Authorization.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/Authorization.sol", "filename_short": "contracts/utils/Authorization.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51 + 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50 ], "starting_column": 1, "ending_column": 2 @@ -1501,13 +984,13 @@ "type": "node", "name": "deadline < block.timestamp", "source_mapping": { - "start": 1584, + "start": 1507, "length": 26, "filename_relative": "contracts/utils/Authorization.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/Authorization.sol", "filename_short": "contracts/utils/Authorization.sol", "is_dependency": false, - "lines": [35], + "lines": [34], "starting_column": 13, "ending_column": 39 }, @@ -1516,15 +999,16 @@ "type": "function", "name": "_requireAuthorizedAction", "source_mapping": { - "start": 1457, - "length": 441, + "start": 1350, + "length": 472, "filename_relative": "contracts/utils/Authorization.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/Authorization.sol", "filename_short": "contracts/utils/Authorization.sol", "is_dependency": false, "lines": [ - 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44 + 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, + 43 ], "starting_column": 5, "ending_column": 6 @@ -1534,20 +1018,20 @@ "type": "contract", "name": "Authorization", "source_mapping": { - "start": 740, - "length": 1386, + "start": 734, + "length": 1316, "filename_relative": "contracts/utils/Authorization.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/Authorization.sol", "filename_short": "contracts/utils/Authorization.sol", "is_dependency": false, "lines": [ - 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, - 50, 51 + 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, + 48, 49, 50 ], "starting_column": 1, "ending_column": 2 @@ -1559,10 +1043,10 @@ } } ], - "description": "Authorization._requireAuthorizedAction(bytes32,uint256,bytes) (contracts/utils/Authorization.sol#34-44) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- deadline < block.timestamp (contracts/utils/Authorization.sol#35)\n", - "markdown": "[Authorization._requireAuthorizedAction(bytes32,uint256,bytes)](contracts/utils/Authorization.sol#L34-L44) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [deadline < block.timestamp](contracts/utils/Authorization.sol#L35)\n", - "first_markdown_element": "contracts/utils/Authorization.sol#L34-L44", - "id": "0ab54036e1970b1ccef6d1e540f052283408c22e46489be98f5c540b586b5f7f", + "description": "Authorization._requireAuthorizedAction(bytes32,uint256,bytes) (contracts/utils/Authorization.sol#29-43) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- deadline < block.timestamp (contracts/utils/Authorization.sol#34)\n", + "markdown": "[Authorization._requireAuthorizedAction(bytes32,uint256,bytes)](contracts/utils/Authorization.sol#L29-L43) uses timestamp for comparisons\n\tDangerous comparisons:\n\t- [deadline < block.timestamp](contracts/utils/Authorization.sol#L34)\n", + "first_markdown_element": "contracts/utils/Authorization.sol#L29-L43", + "id": "4906ae9da080b2ecf34390ea122268365436221e21129a178496e121feb867b4", "check": "timestamp", "impact": "Low", "confidence": "Medium" @@ -1573,15 +1057,13 @@ "type": "function", "name": "layout", "source_mapping": { - "start": 1026, - "length": 197, + "start": 1019, + "length": 160, "filename_relative": "contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "filename_short": "contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "is_dependency": false, - "lines": [ - 30, 31, 32, 33, 34, 35, 36, 37 - ], + "lines": [28, 29, 30, 31, 32, 33, 34], "starting_column": 5, "ending_column": 6 }, @@ -1590,17 +1072,17 @@ "type": "contract", "name": "ArtTokenConfigManagerStorage", "source_mapping": { - "start": 373, - "length": 852, + "start": 370, + "length": 811, "filename_relative": "contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "filename_short": "contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "is_dependency": false, "lines": [ - 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38 + 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35 ], "starting_column": 1, "ending_column": 2 @@ -1613,13 +1095,13 @@ "type": "node", "name": "", "source_mapping": { - "start": 1170, + "start": 1126, "length": 47, "filename_relative": "contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "filename_short": "contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "is_dependency": false, - "lines": [34, 35, 36], + "lines": [31, 32, 33], "starting_column": 9, "ending_column": 10 }, @@ -1628,15 +1110,14 @@ "type": "function", "name": "layout", "source_mapping": { - "start": 1026, - "length": 197, + "start": 1019, + "length": 160, "filename_relative": "contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "filename_short": "contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "is_dependency": false, "lines": [ - 30, 31, 32, 33, 34, 35, 36, - 37 + 28, 29, 30, 31, 32, 33, 34 ], "starting_column": 5, "ending_column": 6 @@ -1646,19 +1127,18 @@ "type": "contract", "name": "ArtTokenConfigManagerStorage", "source_mapping": { - "start": 373, - "length": 852, + "start": 370, + "length": 811, "filename_relative": "contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "filename_short": "contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol", "is_dependency": false, "lines": [ - 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, - 37, 38 + 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35 ], "starting_column": 1, "ending_column": 2 @@ -1670,10 +1150,10 @@ } } ], - "description": "ArtTokenConfigManagerStorage.layout() (contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol#30-37) uses assembly\n\t- INLINE ASM (contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol#34-36)\n", - "markdown": "[ArtTokenConfigManagerStorage.layout()](contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol#L30-L37) uses assembly\n\t- [INLINE ASM](contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol#L34-L36)\n", - "first_markdown_element": "contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol#L30-L37", - "id": "29435d38cf4828998ac54dacee687b0a26dcd56debc6296b700501a8c606aa9d", + "description": "ArtTokenConfigManagerStorage.layout() (contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol#28-34) uses assembly\n\t- INLINE ASM (contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol#31-33)\n", + "markdown": "[ArtTokenConfigManagerStorage.layout()](contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol#L28-L34) uses assembly\n\t- [INLINE ASM](contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol#L31-L33)\n", + "first_markdown_element": "contracts/art-token/art-token-config-manager/ArtTokenConfigManagerStorage.sol#L28-L34", + "id": "dda2414a7278f32066018314e0eac4521081ffa95f94cd857beccce7567e8eba", "check": "assembly", "impact": "Informational", "confidence": "High" @@ -1684,15 +1164,13 @@ "type": "function", "name": "layout", "source_mapping": { - "start": 1147, - "length": 197, + "start": 1137, + "length": 160, "filename_relative": "contracts/auction-house/AuctionHouseStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouseStorage.sol", "filename_short": "contracts/auction-house/AuctionHouseStorage.sol", "is_dependency": false, - "lines": [ - 33, 34, 35, 36, 37, 38, 39, 40 - ], + "lines": [31, 32, 33, 34, 35, 36, 37], "starting_column": 5, "ending_column": 6 }, @@ -1701,18 +1179,17 @@ "type": "contract", "name": "AuctionHouseStorage", "source_mapping": { - "start": 401, - "length": 945, + "start": 398, + "length": 901, "filename_relative": "contracts/auction-house/AuctionHouseStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouseStorage.sol", "filename_short": "contracts/auction-house/AuctionHouseStorage.sol", "is_dependency": false, "lines": [ - 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, - 41 + 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38 ], "starting_column": 1, "ending_column": 2 @@ -1725,13 +1202,13 @@ "type": "node", "name": "", "source_mapping": { - "start": 1291, + "start": 1244, "length": 47, "filename_relative": "contracts/auction-house/AuctionHouseStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouseStorage.sol", "filename_short": "contracts/auction-house/AuctionHouseStorage.sol", "is_dependency": false, - "lines": [37, 38, 39], + "lines": [34, 35, 36], "starting_column": 9, "ending_column": 10 }, @@ -1740,15 +1217,14 @@ "type": "function", "name": "layout", "source_mapping": { - "start": 1147, - "length": 197, + "start": 1137, + "length": 160, "filename_relative": "contracts/auction-house/AuctionHouseStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouseStorage.sol", "filename_short": "contracts/auction-house/AuctionHouseStorage.sol", "is_dependency": false, "lines": [ - 33, 34, 35, 36, 37, 38, 39, - 40 + 31, 32, 33, 34, 35, 36, 37 ], "starting_column": 5, "ending_column": 6 @@ -1758,19 +1234,19 @@ "type": "contract", "name": "AuctionHouseStorage", "source_mapping": { - "start": 401, - "length": 945, + "start": 398, + "length": 901, "filename_relative": "contracts/auction-house/AuctionHouseStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouseStorage.sol", "filename_short": "contracts/auction-house/AuctionHouseStorage.sol", "is_dependency": false, "lines": [ - 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, - 38, 39, 40, 41 + 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, + 37, 38 ], "starting_column": 1, "ending_column": 2 @@ -1782,10 +1258,10 @@ } } ], - "description": "AuctionHouseStorage.layout() (contracts/auction-house/AuctionHouseStorage.sol#33-40) uses assembly\n\t- INLINE ASM (contracts/auction-house/AuctionHouseStorage.sol#37-39)\n", - "markdown": "[AuctionHouseStorage.layout()](contracts/auction-house/AuctionHouseStorage.sol#L33-L40) uses assembly\n\t- [INLINE ASM](contracts/auction-house/AuctionHouseStorage.sol#L37-L39)\n", - "first_markdown_element": "contracts/auction-house/AuctionHouseStorage.sol#L33-L40", - "id": "54103840324778e37ed5e505c689a0ec8912d7227f61c0d7ea93d4d8cc7874db", + "description": "AuctionHouseStorage.layout() (contracts/auction-house/AuctionHouseStorage.sol#31-37) uses assembly\n\t- INLINE ASM (contracts/auction-house/AuctionHouseStorage.sol#34-36)\n", + "markdown": "[AuctionHouseStorage.layout()](contracts/auction-house/AuctionHouseStorage.sol#L31-L37) uses assembly\n\t- [INLINE ASM](contracts/auction-house/AuctionHouseStorage.sol#L34-L36)\n", + "first_markdown_element": "contracts/auction-house/AuctionHouseStorage.sol#L31-L37", + "id": "131b486be057c1c6989b0889d937eaeacf13f3cde5cccac4a849a3ff1767e101", "check": "assembly", "impact": "Informational", "confidence": "High" @@ -1796,15 +1272,13 @@ "type": "function", "name": "layout", "source_mapping": { - "start": 894, - "length": 197, + "start": 904, + "length": 160, "filename_relative": "contracts/market/MarketStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/MarketStorage.sol", "filename_short": "contracts/market/MarketStorage.sol", "is_dependency": false, - "lines": [ - 27, 28, 29, 30, 31, 32, 33, 34 - ], + "lines": [26, 27, 28, 29, 30, 31, 32], "starting_column": 5, "ending_column": 6 }, @@ -1813,17 +1287,17 @@ "type": "contract", "name": "MarketStorage", "source_mapping": { - "start": 277, - "length": 816, + "start": 282, + "length": 784, "filename_relative": "contracts/market/MarketStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/MarketStorage.sol", "filename_short": "contracts/market/MarketStorage.sol", "is_dependency": false, "lines": [ - 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35 + 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33 ], "starting_column": 1, "ending_column": 2 @@ -1836,13 +1310,13 @@ "type": "node", "name": "", "source_mapping": { - "start": 1038, + "start": 1011, "length": 47, "filename_relative": "contracts/market/MarketStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/MarketStorage.sol", "filename_short": "contracts/market/MarketStorage.sol", "is_dependency": false, - "lines": [31, 32, 33], + "lines": [29, 30, 31], "starting_column": 9, "ending_column": 10 }, @@ -1851,15 +1325,14 @@ "type": "function", "name": "layout", "source_mapping": { - "start": 894, - "length": 197, + "start": 904, + "length": 160, "filename_relative": "contracts/market/MarketStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/MarketStorage.sol", "filename_short": "contracts/market/MarketStorage.sol", "is_dependency": false, "lines": [ - 27, 28, 29, 30, 31, 32, 33, - 34 + 26, 27, 28, 29, 30, 31, 32 ], "starting_column": 5, "ending_column": 6 @@ -1869,19 +1342,18 @@ "type": "contract", "name": "MarketStorage", "source_mapping": { - "start": 277, - "length": 816, + "start": 282, + "length": 784, "filename_relative": "contracts/market/MarketStorage.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/MarketStorage.sol", "filename_short": "contracts/market/MarketStorage.sol", "is_dependency": false, "lines": [ - 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, - 35 + 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33 ], "starting_column": 1, "ending_column": 2 @@ -1893,10 +1365,10 @@ } } ], - "description": "MarketStorage.layout() (contracts/market/MarketStorage.sol#27-34) uses assembly\n\t- INLINE ASM (contracts/market/MarketStorage.sol#31-33)\n", - "markdown": "[MarketStorage.layout()](contracts/market/MarketStorage.sol#L27-L34) uses assembly\n\t- [INLINE ASM](contracts/market/MarketStorage.sol#L31-L33)\n", - "first_markdown_element": "contracts/market/MarketStorage.sol#L27-L34", - "id": "008eb0f824385ea7000bc3919ff70c6c6f8446f78ad6c1c4e385783554c7c75f", + "description": "MarketStorage.layout() (contracts/market/MarketStorage.sol#26-32) uses assembly\n\t- INLINE ASM (contracts/market/MarketStorage.sol#29-31)\n", + "markdown": "[MarketStorage.layout()](contracts/market/MarketStorage.sol#L26-L32) uses assembly\n\t- [INLINE ASM](contracts/market/MarketStorage.sol#L29-L31)\n", + "first_markdown_element": "contracts/market/MarketStorage.sol#L26-L32", + "id": "7d87119151cba3ddc25789a4835521aee6d0e68a24abd79d4ec8308705ab8b34", "check": "assembly", "impact": "Informational", "confidence": "High" @@ -1905,16 +1377,17 @@ "elements": [ { "type": "function", - "name": "layout", + "name": "_sendEtherAndWrapIfFail", "source_mapping": { - "start": 914, - "length": 197, - "filename_relative": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/currency-manager/CurrencyManagerStorage.sol", - "filename_short": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "start": 4304, + "length": 349, + "filename_relative": "contracts/utils/CurrencyTransfers.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/CurrencyTransfers.sol", + "filename_short": "contracts/utils/CurrencyTransfers.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35 + 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140 ], "starting_column": 5, "ending_column": 6 @@ -1922,55 +1395,77 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "CurrencyManagerStorage", + "name": "CurrencyTransfers", "source_mapping": { - "start": 303, - "length": 810, - "filename_relative": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/currency-manager/CurrencyManagerStorage.sol", - "filename_short": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "start": 460, + "length": 5055, + "filename_relative": "contracts/utils/CurrencyTransfers.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/CurrencyTransfers.sol", + "filename_short": "contracts/utils/CurrencyTransfers.sol", "is_dependency": false, "lines": [ - 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36 + 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "layout()" + "signature": "_sendEtherAndWrapIfFail(address,uint256)" } }, { "type": "node", "name": "", "source_mapping": { - "start": 1058, - "length": 47, - "filename_relative": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/currency-manager/CurrencyManagerStorage.sol", - "filename_short": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "start": 4404, + "length": 96, + "filename_relative": "contracts/utils/CurrencyTransfers.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/CurrencyTransfers.sol", + "filename_short": "contracts/utils/CurrencyTransfers.sol", "is_dependency": false, - "lines": [32, 33, 34], + "lines": [132, 133, 134], "starting_column": 9, "ending_column": 10 }, "type_specific_fields": { "parent": { "type": "function", - "name": "layout", + "name": "_sendEtherAndWrapIfFail", "source_mapping": { - "start": 914, - "length": 197, - "filename_relative": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/currency-manager/CurrencyManagerStorage.sol", - "filename_short": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "start": 4304, + "length": 349, + "filename_relative": "contracts/utils/CurrencyTransfers.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/CurrencyTransfers.sol", + "filename_short": "contracts/utils/CurrencyTransfers.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, - 35 + 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, + 139, 140 ], "starting_column": 5, "ending_column": 6 @@ -1978,36 +1473,64 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "CurrencyManagerStorage", + "name": "CurrencyTransfers", "source_mapping": { - "start": 303, - "length": 810, - "filename_relative": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/currency-manager/CurrencyManagerStorage.sol", - "filename_short": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "start": 460, + "length": 5055, + "filename_relative": "contracts/utils/CurrencyTransfers.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/CurrencyTransfers.sol", + "filename_short": "contracts/utils/CurrencyTransfers.sol", "is_dependency": false, "lines": [ - 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, - 35, 36 + 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, + 98, 99, 100, 101, + 102, 103, 104, 105, + 106, 107, 108, 109, + 110, 111, 112, 113, + 114, 115, 116, 117, + 118, 119, 120, 121, + 122, 123, 124, 125, + 126, 127, 128, 129, + 130, 131, 132, 133, + 134, 135, 136, 137, + 138, 139, 140, 141, + 142, 143, 144, 145, + 146, 147, 148, 149, + 150, 151, 152, 153, + 154, 155, 156, 157, + 158, 159, 160, 161, + 162 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "layout()" + "signature": "_sendEtherAndWrapIfFail(address,uint256)" } } } } ], - "description": "CurrencyManagerStorage.layout() (contracts/utils/currency-manager/CurrencyManagerStorage.sol#28-35) uses assembly\n\t- INLINE ASM (contracts/utils/currency-manager/CurrencyManagerStorage.sol#32-34)\n", - "markdown": "[CurrencyManagerStorage.layout()](contracts/utils/currency-manager/CurrencyManagerStorage.sol#L28-L35) uses assembly\n\t- [INLINE ASM](contracts/utils/currency-manager/CurrencyManagerStorage.sol#L32-L34)\n", - "first_markdown_element": "contracts/utils/currency-manager/CurrencyManagerStorage.sol#L28-L35", - "id": "00e1ff2e413045f4c9ae84c01a9f0173f5674e5cbd30ed695e78ed5f4d20ea35", + "description": "CurrencyTransfers._sendEtherAndWrapIfFail(address,uint256) (contracts/utils/CurrencyTransfers.sol#129-140) uses assembly\n\t- INLINE ASM (contracts/utils/CurrencyTransfers.sol#132-134)\n", + "markdown": "[CurrencyTransfers._sendEtherAndWrapIfFail(address,uint256)](contracts/utils/CurrencyTransfers.sol#L129-L140) uses assembly\n\t- [INLINE ASM](contracts/utils/CurrencyTransfers.sol#L132-L134)\n", + "first_markdown_element": "contracts/utils/CurrencyTransfers.sol#L129-L140", + "id": "918b74b2bcc1fc0a3fc180099a2e43a943925b0c22a295955a67b30a28209835", "check": "assembly", "impact": "Informational", "confidence": "High" @@ -2018,34 +1541,32 @@ "type": "function", "name": "layout", "source_mapping": { - "start": 960, - "length": 197, - "filename_relative": "contracts/utils/role-system/RoleSystemStorage.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/role-system/RoleSystemStorage.sol", - "filename_short": "contracts/utils/role-system/RoleSystemStorage.sol", + "start": 904, + "length": 160, + "filename_relative": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "filename_short": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", "is_dependency": false, - "lines": [ - 28, 29, 30, 31, 32, 33, 34, 35 - ], + "lines": [26, 27, 28, 29, 30, 31, 32], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RoleSystemStorage", + "name": "CurrencyManagerStorage", "source_mapping": { - "start": 293, - "length": 866, - "filename_relative": "contracts/utils/role-system/RoleSystemStorage.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/role-system/RoleSystemStorage.sol", - "filename_short": "contracts/utils/role-system/RoleSystemStorage.sol", + "start": 300, + "length": 766, + "filename_relative": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "filename_short": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", "is_dependency": false, "lines": [ - 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36 + 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33 ], "starting_column": 1, "ending_column": 2 @@ -2058,13 +1579,13 @@ "type": "node", "name": "", "source_mapping": { - "start": 1104, + "start": 1011, "length": 47, - "filename_relative": "contracts/utils/role-system/RoleSystemStorage.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/role-system/RoleSystemStorage.sol", - "filename_short": "contracts/utils/role-system/RoleSystemStorage.sol", + "filename_relative": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "filename_short": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", "is_dependency": false, - "lines": [32, 33, 34], + "lines": [29, 30, 31], "starting_column": 9, "ending_column": 10 }, @@ -2073,15 +1594,14 @@ "type": "function", "name": "layout", "source_mapping": { - "start": 960, - "length": 197, - "filename_relative": "contracts/utils/role-system/RoleSystemStorage.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/role-system/RoleSystemStorage.sol", - "filename_short": "contracts/utils/role-system/RoleSystemStorage.sol", + "start": 904, + "length": 160, + "filename_relative": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "filename_short": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", "is_dependency": false, "lines": [ - 28, 29, 30, 31, 32, 33, 34, - 35 + 26, 27, 28, 29, 30, 31, 32 ], "starting_column": 5, "ending_column": 6 @@ -2089,21 +1609,20 @@ "type_specific_fields": { "parent": { "type": "contract", - "name": "RoleSystemStorage", + "name": "CurrencyManagerStorage", "source_mapping": { - "start": 293, - "length": 866, - "filename_relative": "contracts/utils/role-system/RoleSystemStorage.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/role-system/RoleSystemStorage.sol", - "filename_short": "contracts/utils/role-system/RoleSystemStorage.sol", + "start": 300, + "length": 766, + "filename_relative": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/currency-manager/CurrencyManagerStorage.sol", + "filename_short": "contracts/utils/currency-manager/CurrencyManagerStorage.sol", "is_dependency": false, "lines": [ - 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, - 35, 36 + 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33 ], "starting_column": 1, "ending_column": 2 @@ -2115,10 +1634,10 @@ } } ], - "description": "RoleSystemStorage.layout() (contracts/utils/role-system/RoleSystemStorage.sol#28-35) uses assembly\n\t- INLINE ASM (contracts/utils/role-system/RoleSystemStorage.sol#32-34)\n", - "markdown": "[RoleSystemStorage.layout()](contracts/utils/role-system/RoleSystemStorage.sol#L28-L35) uses assembly\n\t- [INLINE ASM](contracts/utils/role-system/RoleSystemStorage.sol#L32-L34)\n", - "first_markdown_element": "contracts/utils/role-system/RoleSystemStorage.sol#L28-L35", - "id": "4a56117d004d366e5830761a960600ec7049cf3320b79080e3f734f694b3ae2f", + "description": "CurrencyManagerStorage.layout() (contracts/utils/currency-manager/CurrencyManagerStorage.sol#26-32) uses assembly\n\t- INLINE ASM (contracts/utils/currency-manager/CurrencyManagerStorage.sol#29-31)\n", + "markdown": "[CurrencyManagerStorage.layout()](contracts/utils/currency-manager/CurrencyManagerStorage.sol#L26-L32) uses assembly\n\t- [INLINE ASM](contracts/utils/currency-manager/CurrencyManagerStorage.sol#L29-L31)\n", + "first_markdown_element": "contracts/utils/currency-manager/CurrencyManagerStorage.sol#L26-L32", + "id": "8cfcd09630b536dbd9154c820e3eaf18ef6044fa06cd5a05e0616bba35f951ed", "check": "assembly", "impact": "Informational", "confidence": "High" @@ -2127,772 +1646,275 @@ "elements": [ { "type": "function", - "name": "_beforeApprove", + "name": "layout", "source_mapping": { - "start": 4983, - "length": 72, - "filename_relative": "contracts/art-token/ArtTokenBase.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", - "filename_short": "contracts/art-token/ArtTokenBase.sol", - "is_dependency": false, - "lines": [126], - "starting_column": 5, - "ending_column": 77 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "ArtTokenBase", - "source_mapping": { - "start": 976, - "length": 4439, - "filename_relative": "contracts/art-token/ArtTokenBase.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", - "filename_short": "contracts/art-token/ArtTokenBase.sol", - "is_dependency": false, - "lines": [ - 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "_beforeApprove(address,uint256)" - } - } - ], - "description": "ArtTokenBase._beforeApprove(address,uint256) (contracts/art-token/ArtTokenBase.sol#126) is never used and should be removed\n", - "markdown": "[ArtTokenBase._beforeApprove(address,uint256)](contracts/art-token/ArtTokenBase.sol#L126) is never used and should be removed\n", - "first_markdown_element": "contracts/art-token/ArtTokenBase.sol#L126", - "id": "5f92f43cb8301f0cfb6f065cce61d7ef313093cc529cd8c8fe8f4cd4faf86348", - "check": "dead-code", - "impact": "Informational", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "_beforeSetApprovalForAll", - "source_mapping": { - "start": 5327, - "length": 86, - "filename_relative": "contracts/art-token/ArtTokenBase.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", - "filename_short": "contracts/art-token/ArtTokenBase.sol", - "is_dependency": false, - "lines": [134], - "starting_column": 5, - "ending_column": 91 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "ArtTokenBase", - "source_mapping": { - "start": 976, - "length": 4439, - "filename_relative": "contracts/art-token/ArtTokenBase.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", - "filename_short": "contracts/art-token/ArtTokenBase.sol", - "is_dependency": false, - "lines": [ - 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "_beforeSetApprovalForAll(address,bool)" - } - } - ], - "description": "ArtTokenBase._beforeSetApprovalForAll(address,bool) (contracts/art-token/ArtTokenBase.sol#134) is never used and should be removed\n", - "markdown": "[ArtTokenBase._beforeSetApprovalForAll(address,bool)](contracts/art-token/ArtTokenBase.sol#L134) is never used and should be removed\n", - "first_markdown_element": "contracts/art-token/ArtTokenBase.sol#L134", - "id": "a420cad121b9863c5420ce936be50fdafcc2fed508ef19dcffff8371fe270809", - "check": "dead-code", - "impact": "Informational", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "_beforeTransfer", - "source_mapping": { - "start": 4653, - "length": 87, - "filename_relative": "contracts/art-token/ArtTokenBase.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", - "filename_short": "contracts/art-token/ArtTokenBase.sol", - "is_dependency": false, - "lines": [118], - "starting_column": 5, - "ending_column": 92 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "ArtTokenBase", - "source_mapping": { - "start": 976, - "length": 4439, - "filename_relative": "contracts/art-token/ArtTokenBase.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", - "filename_short": "contracts/art-token/ArtTokenBase.sol", - "is_dependency": false, - "lines": [ - 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "_beforeTransfer(address,uint256,address)" - } - } - ], - "description": "ArtTokenBase._beforeTransfer(address,uint256,address) (contracts/art-token/ArtTokenBase.sol#118) is never used and should be removed\n", - "markdown": "[ArtTokenBase._beforeTransfer(address,uint256,address)](contracts/art-token/ArtTokenBase.sol#L118) is never used and should be removed\n", - "first_markdown_element": "contracts/art-token/ArtTokenBase.sol#L118", - "id": "ad65513af2c3915ae9fabe63dd9779aed68f1f812699652736ac1b68a790ddd6", - "check": "dead-code", - "impact": "Informational", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "function", - "name": "_increaseBalance", - "source_mapping": { - "start": 4173, - "length": 203, - "filename_relative": "contracts/art-token/ArtTokenBase.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", - "filename_short": "contracts/art-token/ArtTokenBase.sol", - "is_dependency": false, - "lines": [104, 105, 106, 107, 108, 109], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "ArtTokenBase", - "source_mapping": { - "start": 976, - "length": 4439, - "filename_relative": "contracts/art-token/ArtTokenBase.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", - "filename_short": "contracts/art-token/ArtTokenBase.sol", - "is_dependency": false, - "lines": [ - 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "_increaseBalance(address,uint128)" - } - } - ], - "description": "ArtTokenBase._increaseBalance(address,uint128) (contracts/art-token/ArtTokenBase.sol#104-109) is never used and should be removed\n", - "markdown": "[ArtTokenBase._increaseBalance(address,uint128)](contracts/art-token/ArtTokenBase.sol#L104-L109) is never used and should be removed\n", - "first_markdown_element": "contracts/art-token/ArtTokenBase.sol#L104-L109", - "id": "a548e9dd0856e89fbbade6fefa791dda22cc4edc39e8e8cbd15b1a088281bdf8", - "check": "dead-code", - "impact": "Informational", - "confidence": "Medium" - }, - { - "elements": [ - { - "type": "variable", - "name": "_tokenURI", - "source_mapping": { - "start": 2407, - "length": 25, - "filename_relative": "contracts/art-token/ArtToken.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtToken.sol", - "filename_short": "contracts/art-token/ArtToken.sol", - "is_dependency": false, - "lines": [66], - "starting_column": 9, - "ending_column": 34 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "mintFromAuctionHouse", - "source_mapping": { - "start": 2323, - "length": 354, - "filename_relative": "contracts/art-token/ArtToken.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtToken.sol", - "filename_short": "contracts/art-token/ArtToken.sol", - "is_dependency": false, - "lines": [ - 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "ArtToken", - "source_mapping": { - "start": 1290, - "length": 5798, - "filename_relative": "contracts/art-token/ArtToken.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtToken.sol", - "filename_short": "contracts/art-token/ArtToken.sol", - "is_dependency": false, - "lines": [ - 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, - 97, 98, 99, 100, - 101, 102, 103, 104, - 105, 106, 107, 108, - 109, 110, 111, 112, - 113, 114, 115, 116, - 117, 118, 119, 120, - 121, 122, 123, 124, - 125, 126, 127, 128, - 129, 130, 131, 132, - 133, 134, 135, 136, - 137, 138, 139, 140, - 141, 142, 143, 144, - 145, 146, 147, 148, - 149, 150, 151, 152, - 153, 154, 155, 156, - 157, 158, 159, 160, - 161, 162, 163, 164, - 165, 166, 167, 168, - 169, 170, 171, 172, - 173, 174, 175, 176, - 177, 178, 179, 180, - 181, 182, 183, 184, - 185, 186, 187, 188, - 189, 190, 191, 192, - 193, 194, 195, 196, - 197, 198, 199, 200, - 201, 202, 203, 204, - 205, 206, 207, 208 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "mintFromAuctionHouse(address,uint256,string,TokenConfig.Type)" - } - } - }, - "additional_fields": { - "target": "parameter", - "convention": "mixedCase" - } - } - ], - "description": "Parameter ArtToken.mintFromAuctionHouse(address,uint256,string,TokenConfig.Type)._tokenURI (contracts/art-token/ArtToken.sol#66) is not in mixedCase\n", - "markdown": "Parameter [ArtToken.mintFromAuctionHouse(address,uint256,string,TokenConfig.Type)._tokenURI](contracts/art-token/ArtToken.sol#L66) is not in mixedCase\n", - "first_markdown_element": "contracts/art-token/ArtToken.sol#L66", - "id": "994a4ee42975f133797b06f9bd977a795da1befda9fb3a5621eb71c3f8b23046", - "check": "naming-convention", - "impact": "Informational", - "confidence": "High" - }, - { - "elements": [ - { - "type": "variable", - "name": "_tokenURI", - "source_mapping": { - "start": 3952, - "length": 23, - "filename_relative": "contracts/art-token/ArtToken.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtToken.sol", - "filename_short": "contracts/art-token/ArtToken.sol", - "is_dependency": false, - "lines": [116], - "starting_column": 43, - "ending_column": 66 - }, - "type_specific_fields": { - "parent": { - "type": "function", - "name": "setTokenURI", - "source_mapping": { - "start": 3914, - "length": 260, - "filename_relative": "contracts/art-token/ArtToken.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtToken.sol", - "filename_short": "contracts/art-token/ArtToken.sol", - "is_dependency": false, - "lines": [ - 116, 117, 118, 119, 120, - 121, 122 - ], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "ArtToken", - "source_mapping": { - "start": 1290, - "length": 5798, - "filename_relative": "contracts/art-token/ArtToken.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtToken.sol", - "filename_short": "contracts/art-token/ArtToken.sol", - "is_dependency": false, - "lines": [ - 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, - 97, 98, 99, 100, - 101, 102, 103, 104, - 105, 106, 107, 108, - 109, 110, 111, 112, - 113, 114, 115, 116, - 117, 118, 119, 120, - 121, 122, 123, 124, - 125, 126, 127, 128, - 129, 130, 131, 132, - 133, 134, 135, 136, - 137, 138, 139, 140, - 141, 142, 143, 144, - 145, 146, 147, 148, - 149, 150, 151, 152, - 153, 154, 155, 156, - 157, 158, 159, 160, - 161, 162, 163, 164, - 165, 166, 167, 168, - 169, 170, 171, 172, - 173, 174, 175, 176, - 177, 178, 179, 180, - 181, 182, 183, 184, - 185, 186, 187, 188, - 189, 190, 191, 192, - 193, 194, 195, 196, - 197, 198, 199, 200, - 201, 202, 203, 204, - 205, 206, 207, 208 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "setTokenURI(uint256,string)" - } - } - }, - "additional_fields": { - "target": "parameter", - "convention": "mixedCase" - } - } - ], - "description": "Parameter ArtToken.setTokenURI(uint256,string)._tokenURI (contracts/art-token/ArtToken.sol#116) is not in mixedCase\n", - "markdown": "Parameter [ArtToken.setTokenURI(uint256,string)._tokenURI](contracts/art-token/ArtToken.sol#L116) is not in mixedCase\n", - "first_markdown_element": "contracts/art-token/ArtToken.sol#L116", - "id": "a99b1d93ad15fdf04c05a364d4508213d9830f4e529d47ae911e53e28c675106", - "check": "naming-convention", - "impact": "Informational", - "confidence": "High" - }, - { - "elements": [ - { - "type": "variable", - "name": "AUCTION_HOUSE", - "source_mapping": { - "start": 1604, - "length": 44, - "filename_relative": "contracts/art-token/ArtToken.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtToken.sol", - "filename_short": "contracts/art-token/ArtToken.sol", - "is_dependency": false, - "lines": [40], - "starting_column": 5, - "ending_column": 49 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "ArtToken", - "source_mapping": { - "start": 1290, - "length": 5798, - "filename_relative": "contracts/art-token/ArtToken.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtToken.sol", - "filename_short": "contracts/art-token/ArtToken.sol", - "is_dependency": false, - "lines": [ - 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208 + "start": 962, + "length": 160, + "filename_relative": "contracts/utils/role-system/RoleSystemStorage.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/role-system/RoleSystemStorage.sol", + "filename_short": "contracts/utils/role-system/RoleSystemStorage.sol", + "is_dependency": false, + "lines": [27, 28, 29, 30, 31, 32, 33], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RoleSystemStorage", + "source_mapping": { + "start": 290, + "length": 834, + "filename_relative": "contracts/utils/role-system/RoleSystemStorage.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/role-system/RoleSystemStorage.sol", + "filename_short": "contracts/utils/role-system/RoleSystemStorage.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34 ], "starting_column": 1, "ending_column": 2 } - } - }, - "additional_fields": { - "target": "variable", - "convention": "mixedCase" + }, + "signature": "layout()" } - } - ], - "description": "Variable ArtToken.AUCTION_HOUSE (contracts/art-token/ArtToken.sol#40) is not in mixedCase\n", - "markdown": "Variable [ArtToken.AUCTION_HOUSE](contracts/art-token/ArtToken.sol#L40) is not in mixedCase\n", - "first_markdown_element": "contracts/art-token/ArtToken.sol#L40", - "id": "801381de76b3547f4627bb52efb1b320f8a4d03e2f2b03504b027686906d7cac", - "check": "naming-convention", - "impact": "Informational", - "confidence": "High" - }, - { - "elements": [ + }, { - "type": "variable", - "name": "_name", + "type": "node", + "name": "", "source_mapping": { - "start": 1283, - "length": 19, - "filename_relative": "contracts/art-token/ArtTokenBase.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", - "filename_short": "contracts/art-token/ArtTokenBase.sol", + "start": 1069, + "length": 47, + "filename_relative": "contracts/utils/role-system/RoleSystemStorage.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/role-system/RoleSystemStorage.sol", + "filename_short": "contracts/utils/role-system/RoleSystemStorage.sol", "is_dependency": false, - "lines": [25], - "starting_column": 25, - "ending_column": 44 + "lines": [30, 31, 32], + "starting_column": 9, + "ending_column": 10 }, "type_specific_fields": { "parent": { "type": "function", - "name": "initialize", + "name": "layout", "source_mapping": { - "start": 1263, - "length": 131, - "filename_relative": "contracts/art-token/ArtTokenBase.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", - "filename_short": "contracts/art-token/ArtTokenBase.sol", + "start": 962, + "length": 160, + "filename_relative": "contracts/utils/role-system/RoleSystemStorage.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/role-system/RoleSystemStorage.sol", + "filename_short": "contracts/utils/role-system/RoleSystemStorage.sol", "is_dependency": false, - "lines": [25, 26, 27], + "lines": [ + 27, 28, 29, 30, 31, 32, 33 + ], "starting_column": 5, "ending_column": 6 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "ArtTokenBase", + "name": "RoleSystemStorage", "source_mapping": { - "start": 976, - "length": 4439, - "filename_relative": "contracts/art-token/ArtTokenBase.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", - "filename_short": "contracts/art-token/ArtTokenBase.sol", + "start": 290, + "length": 834, + "filename_relative": "contracts/utils/role-system/RoleSystemStorage.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/role-system/RoleSystemStorage.sol", + "filename_short": "contracts/utils/role-system/RoleSystemStorage.sol", "is_dependency": false, "lines": [ - 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, - 98, 99, 100, 101, - 102, 103, 104, 105, - 106, 107, 108, 109, - 110, 111, 112, 113, - 114, 115, 116, 117, - 118, 119, 120, 121, - 122, 123, 124, 125, - 126, 127, 128, 129, - 130, 131, 132, 133, - 134, 135 + 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, + 34 ], "starting_column": 1, "ending_column": 2 } }, - "signature": "initialize(string,string)" + "signature": "layout()" } } - }, - "additional_fields": { - "target": "parameter", - "convention": "mixedCase" } } ], - "description": "Parameter ArtTokenBase.initialize(string,string)._name (contracts/art-token/ArtTokenBase.sol#25) is not in mixedCase\n", - "markdown": "Parameter [ArtTokenBase.initialize(string,string)._name](contracts/art-token/ArtTokenBase.sol#L25) is not in mixedCase\n", - "first_markdown_element": "contracts/art-token/ArtTokenBase.sol#L25", - "id": "0d6536aff27f992204afb08494fd56ce453268a0d6d7f76954870ce15454efdd", - "check": "naming-convention", + "description": "RoleSystemStorage.layout() (contracts/utils/role-system/RoleSystemStorage.sol#27-33) uses assembly\n\t- INLINE ASM (contracts/utils/role-system/RoleSystemStorage.sol#30-32)\n", + "markdown": "[RoleSystemStorage.layout()](contracts/utils/role-system/RoleSystemStorage.sol#L27-L33) uses assembly\n\t- [INLINE ASM](contracts/utils/role-system/RoleSystemStorage.sol#L30-L32)\n", + "first_markdown_element": "contracts/utils/role-system/RoleSystemStorage.sol#L27-L33", + "id": "ba6ec6661eb13c11610451f6e696415b5437a85c5c0ed0bb5612add323961234", + "check": "assembly", "impact": "Informational", "confidence": "High" }, { "elements": [ { - "type": "variable", - "name": "_symbol", + "type": "function", + "name": "_increaseBalance", "source_mapping": { - "start": 1304, - "length": 21, + "start": 5494, + "length": 203, "filename_relative": "contracts/art-token/ArtTokenBase.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", "filename_short": "contracts/art-token/ArtTokenBase.sol", "is_dependency": false, - "lines": [25], - "starting_column": 46, - "ending_column": 67 + "lines": [132, 133, 134, 135, 136, 137], + "starting_column": 5, + "ending_column": 6 }, "type_specific_fields": { "parent": { - "type": "function", - "name": "initialize", + "type": "contract", + "name": "ArtTokenBase", "source_mapping": { - "start": 1263, - "length": 131, + "start": 973, + "length": 4968, "filename_relative": "contracts/art-token/ArtTokenBase.sol", "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", "filename_short": "contracts/art-token/ArtTokenBase.sol", "is_dependency": false, - "lines": [25, 26, 27], - "starting_column": 5, - "ending_column": 6 - }, - "type_specific_fields": { - "parent": { - "type": "contract", - "name": "ArtTokenBase", - "source_mapping": { - "start": 976, - "length": 4439, - "filename_relative": "contracts/art-token/ArtTokenBase.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/art-token/ArtTokenBase.sol", - "filename_short": "contracts/art-token/ArtTokenBase.sol", - "is_dependency": false, - "lines": [ - 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, - 98, 99, 100, 101, - 102, 103, 104, 105, - 106, 107, 108, 109, - 110, 111, 112, 113, - 114, 115, 116, 117, - 118, 119, 120, 121, - 122, 123, 124, 125, - 126, 127, 128, 129, - 130, 131, 132, 133, - 134, 135 - ], - "starting_column": 1, - "ending_column": 2 - } - }, - "signature": "initialize(string,string)" + "lines": [ + 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145 + ], + "starting_column": 1, + "ending_column": 2 } - } + }, + "signature": "_increaseBalance(address,uint128)" + } + } + ], + "description": "ArtTokenBase._increaseBalance(address,uint128) (contracts/art-token/ArtTokenBase.sol#132-137) is never used and should be removed\n", + "markdown": "[ArtTokenBase._increaseBalance(address,uint128)](contracts/art-token/ArtTokenBase.sol#L132-L137) is never used and should be removed\n", + "first_markdown_element": "contracts/art-token/ArtTokenBase.sol#L132-L137", + "id": "a548e9dd0856e89fbbade6fefa791dda22cc4edc39e8e8cbd15b1a088281bdf8", + "check": "dead-code", + "impact": "Informational", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "event", + "name": "AskOrderExecuted", + "source_mapping": { + "start": 895, + "length": 204, + "filename_relative": "contracts/market/IMarket.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/IMarket.sol", + "filename_short": "contracts/market/IMarket.sol", + "is_dependency": false, + "lines": [ + 23, 24, 25, 26, 27, 28, 29, 30, 31 + ], + "starting_column": 5, + "ending_column": 7 }, - "additional_fields": { - "target": "parameter", - "convention": "mixedCase" + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "IMarket", + "source_mapping": { + "start": 393, + "length": 5140, + "filename_relative": "contracts/market/IMarket.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/IMarket.sol", + "filename_short": "contracts/market/IMarket.sol", + "is_dependency": false, + "lines": [ + 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "AskOrderExecuted(bytes32,address,address,address,address,uint256,uint256)" } } ], - "description": "Parameter ArtTokenBase.initialize(string,string)._symbol (contracts/art-token/ArtTokenBase.sol#25) is not in mixedCase\n", - "markdown": "Parameter [ArtTokenBase.initialize(string,string)._symbol](contracts/art-token/ArtTokenBase.sol#L25) is not in mixedCase\n", - "first_markdown_element": "contracts/art-token/ArtTokenBase.sol#L25", - "id": "7bcea9354c9ddc3dbe1466bf8c094194d3838858b9a7057b8a6ff3e4d9e1c359", - "check": "naming-convention", + "description": "Event IMarket.AskOrderExecuted(bytes32,address,address,address,address,uint256,uint256) (contracts/market/IMarket.sol#23-31) has address parameters but no indexed parameters\n", + "markdown": "Event [IMarket.AskOrderExecuted(bytes32,address,address,address,address,uint256,uint256)](contracts/market/IMarket.sol#L23-L31) has address parameters but no indexed parameters\n", + "first_markdown_element": "contracts/market/IMarket.sol#L23-L31", + "id": "19e956d55105e458cb3fafbaa20f3fe39fae2ee4f11690e81dd1ee2426c2d8d4", + "check": "unindexed-event-address", "impact": "Informational", "confidence": "High" }, { "elements": [ { - "type": "variable", - "name": "ART_TOKEN", + "type": "event", + "name": "BidOrderExecuted", "source_mapping": { - "start": 1503, - "length": 36, - "filename_relative": "contracts/auction-house/AuctionHouse.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", - "filename_short": "contracts/auction-house/AuctionHouse.sol", + "start": 1586, + "length": 204, + "filename_relative": "contracts/market/IMarket.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/IMarket.sol", + "filename_short": "contracts/market/IMarket.sol", "is_dependency": false, - "lines": [30], + "lines": [ + 43, 44, 45, 46, 47, 48, 49, 50, 51 + ], "starting_column": 5, - "ending_column": 41 + "ending_column": 7 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "AuctionHouse", + "name": "IMarket", "source_mapping": { - "start": 1272, - "length": 13404, - "filename_relative": "contracts/auction-house/AuctionHouse.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", - "filename_short": "contracts/auction-house/AuctionHouse.sol", + "start": 393, + "length": 5140, + "filename_relative": "contracts/market/IMarket.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/IMarket.sol", + "filename_short": "contracts/market/IMarket.sol", "is_dependency": false, "lines": [ + 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, @@ -2910,116 +1932,54 @@ 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, - 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, - 437, 438, 439, 440 + 132, 133, 134, 135, 136, 137 ], "starting_column": 1, "ending_column": 2 } - } - }, - "additional_fields": { - "target": "variable", - "convention": "mixedCase" + }, + "signature": "BidOrderExecuted(bytes32,address,address,address,address,uint256,uint256)" } } ], - "description": "Variable AuctionHouse.ART_TOKEN (contracts/auction-house/AuctionHouse.sol#30) is not in mixedCase\n", - "markdown": "Variable [AuctionHouse.ART_TOKEN](contracts/auction-house/AuctionHouse.sol#L30) is not in mixedCase\n", - "first_markdown_element": "contracts/auction-house/AuctionHouse.sol#L30", - "id": "f7dd52429a9f100298e6e21b03630cde50306045be3c0e11376ab20f5034c1df", - "check": "naming-convention", + "description": "Event IMarket.BidOrderExecuted(bytes32,address,address,address,address,uint256,uint256) (contracts/market/IMarket.sol#43-51) has address parameters but no indexed parameters\n", + "markdown": "Event [IMarket.BidOrderExecuted(bytes32,address,address,address,address,uint256,uint256)](contracts/market/IMarket.sol#L43-L51) has address parameters but no indexed parameters\n", + "first_markdown_element": "contracts/market/IMarket.sol#L43-L51", + "id": "e84666a0ecf99f86d3f0c6a332de07727b49393d3d5e30c4a0134c4a30989ee7", + "check": "unindexed-event-address", "impact": "Informational", "confidence": "High" }, { "elements": [ { - "type": "variable", - "name": "MIN_DURATION", + "type": "event", + "name": "OrderInvalidated", "source_mapping": { - "start": 1613, - "length": 37, - "filename_relative": "contracts/auction-house/AuctionHouse.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", - "filename_short": "contracts/auction-house/AuctionHouse.sol", + "start": 2005, + "length": 57, + "filename_relative": "contracts/market/IMarket.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/IMarket.sol", + "filename_short": "contracts/market/IMarket.sol", "is_dependency": false, - "lines": [33], + "lines": [58], "starting_column": 5, - "ending_column": 42 + "ending_column": 62 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "AuctionHouse", + "name": "IMarket", "source_mapping": { - "start": 1272, - "length": 13404, - "filename_relative": "contracts/auction-house/AuctionHouse.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/auction-house/AuctionHouse.sol", - "filename_short": "contracts/auction-house/AuctionHouse.sol", + "start": 393, + "length": 5140, + "filename_relative": "contracts/market/IMarket.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/market/IMarket.sol", + "filename_short": "contracts/market/IMarket.sol", "is_dependency": false, "lines": [ + 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, @@ -3037,207 +1997,175 @@ 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, - 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, - 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, - 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, - 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, - 437, 438, 439, 440 + 132, 133, 134, 135, 136, 137 ], "starting_column": 1, "ending_column": 2 } - } - }, - "additional_fields": { - "target": "variable", - "convention": "mixedCase" + }, + "signature": "OrderInvalidated(address,bytes32)" } } ], - "description": "Variable AuctionHouse.MIN_DURATION (contracts/auction-house/AuctionHouse.sol#33) is not in mixedCase\n", - "markdown": "Variable [AuctionHouse.MIN_DURATION](contracts/auction-house/AuctionHouse.sol#L33) is not in mixedCase\n", - "first_markdown_element": "contracts/auction-house/AuctionHouse.sol#L33", - "id": "98b4ffaf5185ecfde6761fb768baf7f6cc537e760d8419d5663fed6cfca136ba", - "check": "naming-convention", + "description": "Event IMarket.OrderInvalidated(address,bytes32) (contracts/market/IMarket.sol#58) has address parameters but no indexed parameters\n", + "markdown": "Event [IMarket.OrderInvalidated(address,bytes32)](contracts/market/IMarket.sol#L58) has address parameters but no indexed parameters\n", + "first_markdown_element": "contracts/market/IMarket.sol#L58", + "id": "9f88c18a47c74a64319d916ea6b3a162e4af56edd8b9b55e2c7d054464c097da", + "check": "unindexed-event-address", "impact": "Informational", "confidence": "High" }, { "elements": [ { - "type": "variable", - "name": "DOMAIN_SEPARATOR", + "type": "event", + "name": "Deployed", "source_mapping": { - "start": 950, - "length": 41, - "filename_relative": "contracts/utils/EIP712Domain.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/EIP712Domain.sol", - "filename_short": "contracts/utils/EIP712Domain.sol", + "start": 1085, + "length": 55, + "filename_relative": "contracts/utils/CollectionDeployer.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/CollectionDeployer.sol", + "filename_short": "contracts/utils/CollectionDeployer.sol", "is_dependency": false, - "lines": [32], + "lines": [24], "starting_column": 5, - "ending_column": 46 + "ending_column": 60 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "EIP712Domain", + "name": "CollectionDeployer", "source_mapping": { - "start": 471, - "length": 1624, - "filename_relative": "contracts/utils/EIP712Domain.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/EIP712Domain.sol", - "filename_short": "contracts/utils/EIP712Domain.sol", + "start": 811, + "length": 2911, + "filename_relative": "contracts/utils/CollectionDeployer.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/CollectionDeployer.sol", + "filename_short": "contracts/utils/CollectionDeployer.sol", "is_dependency": false, "lines": [ - 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62 + 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87 ], "starting_column": 1, "ending_column": 2 } - } - }, - "additional_fields": { - "target": "variable", - "convention": "mixedCase" + }, + "signature": "Deployed(address,address)" } } ], - "description": "Variable EIP712Domain.DOMAIN_SEPARATOR (contracts/utils/EIP712Domain.sol#32) is not in mixedCase\n", - "markdown": "Variable [EIP712Domain.DOMAIN_SEPARATOR](contracts/utils/EIP712Domain.sol#L32) is not in mixedCase\n", - "first_markdown_element": "contracts/utils/EIP712Domain.sol#L32", - "id": "c5e1e07840d8fa8430d68f2ffa4236ae55d6aec820b9c584905faf4b42cda28d", - "check": "naming-convention", + "description": "Event CollectionDeployer.Deployed(address,address) (contracts/utils/CollectionDeployer.sol#24) has address parameters but no indexed parameters\n", + "markdown": "Event [CollectionDeployer.Deployed(address,address)](contracts/utils/CollectionDeployer.sol#L24) has address parameters but no indexed parameters\n", + "first_markdown_element": "contracts/utils/CollectionDeployer.sol#L24", + "id": "eea9ec1ade8deeae2c8401b4eda6b41015541719099b85c1bd714a9b6ed8f431", + "check": "unindexed-event-address", "impact": "Informational", "confidence": "High" }, { "elements": [ { - "type": "variable", - "name": "MAIN", + "type": "event", + "name": "Deployed", "source_mapping": { - "start": 668, - "length": 29, - "filename_relative": "contracts/utils/role-system/RoleSystem.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/role-system/RoleSystem.sol", - "filename_short": "contracts/utils/role-system/RoleSystem.sol", + "start": 479, + "length": 31, + "filename_relative": "contracts/utils/MarketDeployer.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/MarketDeployer.sol", + "filename_short": "contracts/utils/MarketDeployer.sol", "is_dependency": false, - "lines": [19], + "lines": [17], "starting_column": 5, - "ending_column": 34 + "ending_column": 36 }, "type_specific_fields": { "parent": { "type": "contract", - "name": "RoleSystem", + "name": "MarketDeployer", "source_mapping": { - "start": 468, - "length": 3272, - "filename_relative": "contracts/utils/role-system/RoleSystem.sol", - "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/role-system/RoleSystem.sol", - "filename_short": "contracts/utils/role-system/RoleSystem.sol", + "start": 308, + "length": 1407, + "filename_relative": "contracts/utils/MarketDeployer.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/MarketDeployer.sol", + "filename_short": "contracts/utils/MarketDeployer.sol", "is_dependency": false, "lines": [ - 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, - 129, 130, 131 + 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45 ], "starting_column": 1, "ending_column": 2 } - } + }, + "signature": "Deployed(address)" + } + } + ], + "description": "Event MarketDeployer.Deployed(address) (contracts/utils/MarketDeployer.sol#17) has address parameters but no indexed parameters\n", + "markdown": "Event [MarketDeployer.Deployed(address)](contracts/utils/MarketDeployer.sol#L17) has address parameters but no indexed parameters\n", + "first_markdown_element": "contracts/utils/MarketDeployer.sol#L17", + "id": "545aec21add854f8ab0547233af03297ab63a1bffa31230aef62ea1edc1242be", + "check": "unindexed-event-address", + "impact": "Informational", + "confidence": "High" + }, + { + "elements": [ + { + "type": "event", + "name": "CurrencyStatusUpdated", + "source_mapping": { + "start": 411, + "length": 60, + "filename_relative": "contracts/utils/currency-manager/ICurrencyManager.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/currency-manager/ICurrencyManager.sol", + "filename_short": "contracts/utils/currency-manager/ICurrencyManager.sol", + "is_dependency": false, + "lines": [14], + "starting_column": 5, + "ending_column": 65 }, - "additional_fields": { - "target": "variable", - "convention": "mixedCase" + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ICurrencyManager", + "source_mapping": { + "start": 181, + "length": 946, + "filename_relative": "contracts/utils/currency-manager/ICurrencyManager.sol", + "filename_absolute": "/Users/mriynyk/Documents/work/do/contracts/contracts/utils/currency-manager/ICurrencyManager.sol", + "filename_short": "contracts/utils/currency-manager/ICurrencyManager.sol", + "is_dependency": false, + "lines": [ + 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "CurrencyStatusUpdated(address,bool)" } } ], - "description": "Variable RoleSystem.MAIN (contracts/utils/role-system/RoleSystem.sol#19) is not in mixedCase\n", - "markdown": "Variable [RoleSystem.MAIN](contracts/utils/role-system/RoleSystem.sol#L19) is not in mixedCase\n", - "first_markdown_element": "contracts/utils/role-system/RoleSystem.sol#L19", - "id": "982f659317f43fe0bfb7378ac84558b3324e377aa7bb10bb095243377cb00a53", - "check": "naming-convention", + "description": "Event ICurrencyManager.CurrencyStatusUpdated(address,bool) (contracts/utils/currency-manager/ICurrencyManager.sol#14) has address parameters but no indexed parameters\n", + "markdown": "Event [ICurrencyManager.CurrencyStatusUpdated(address,bool)](contracts/utils/currency-manager/ICurrencyManager.sol#L14) has address parameters but no indexed parameters\n", + "first_markdown_element": "contracts/utils/currency-manager/ICurrencyManager.sol#L14", + "id": "389dcbe17c360bef8f95d163fc84f9439a89346991d6387b4dc6938de68d04d4", + "check": "unindexed-event-address", "impact": "Informational", "confidence": "High" } diff --git a/tests/ArtToken.ts b/tests/ArtToken.ts index ad3e93c..6498dae 100644 --- a/tests/ArtToken.ts +++ b/tests/ArtToken.ts @@ -98,6 +98,12 @@ describe('ArtToken', function () { sender: buyer, }); + const tokenOwner = await artToken.ownerOf(TOKEN_ID); + const tokenURI = await artToken.tokenURI(TOKEN_ID); + + expect(tokenOwner).equal(buyerAddr); + expect(tokenURI).equal(TOKEN_URI); + await expect(tx) // .emit(usdc, 'Transfer') .withArgs(buyerAddr, artTokenAddr, TOKEN_PRICE + TOKEN_FEE); @@ -202,7 +208,7 @@ describe('ArtToken', function () { sender: buyer, }); - await expect(tx).rejectedWith('ArtTokenCurrencyInvalid'); + await expect(tx).rejectedWith('ArtTokenUnsupportedCurrency'); }); it(`should fail if the token is reserved by an auction`, async () => { @@ -253,7 +259,7 @@ describe('ArtToken', function () { await expect(tx).rejectedWith('ArtTokenTokenReservedByAuction'); }); - it(`should fail if the permit signer is not the art token signer`, async () => { + it(`should fail if the permit signer is not the art-token signer`, async () => { const latestBlockTimestamp = await getLatestBlockTimestamp(); const tokenMintingPermit: TokenMintingPermit.TypeStruct = { @@ -382,11 +388,11 @@ describe('ArtToken', function () { }); }); - describe(`method 'mintFromAuctionHouse'`, () => { + describe(`method 'safeMintFromAuctionHouse'`, () => { it(`should fail if the caller is not the auction house`, async () => { const tx = artToken .connect(randomAccount) - .mintFromAuctionHouse(randomAccountAddr, TOKEN_ID, TOKEN_URI, TOKEN_CONFIG); + .safeMintFromAuctionHouse(randomAccountAddr, TOKEN_ID, TOKEN_URI, TOKEN_CONFIG); await expect(tx).rejectedWith('ArtTokenUnauthorizedAccount'); }); @@ -453,7 +459,7 @@ describe('ArtToken', function () { it(`should fail if a token is transferred to a non-partner contract`, async () => { const tx = artToken.connect(buyer).transferFrom(buyer, usdc, TOKEN_ID); - await expect(tx).rejectedWith('ArtTokenUnauthorizedAccount'); + await expect(tx).rejectedWith('ArtTokenNonCompliantAccount'); }); } @@ -531,7 +537,7 @@ describe('ArtToken', function () { it(`should fail if approval is provided to a non-partner contract`, async () => { const tx = artToken.connect(buyer).approve(usdc, TOKEN_ID); - await expect(tx).rejectedWith('ArtTokenUnauthorizedAccount'); + await expect(tx).rejectedWith('ArtTokenNonCompliantAccount'); }); it( @@ -612,7 +618,7 @@ describe('ArtToken', function () { it(`should fail if approval is provided to a non-partner contract`, async () => { const tx = artToken.connect(buyer).setApprovalForAll(usdc, true); - await expect(tx).rejectedWith('ArtTokenUnauthorizedAccount'); + await expect(tx).rejectedWith('ArtTokenNonCompliantAccount'); }); if ([REGULATION_MODE_NONE, REGULATION_MODE_REGULATED].includes(regulationMode)) { @@ -724,23 +730,23 @@ describe('ArtToken', function () { }); }); - describe(`method 'recipientAuthorized'`, () => { + describe(`method 'accountCompliant'`, () => { it(`should return 'true' for a non-contract account`, async () => { - const authorized = await artToken.recipientAuthorized(randomAccount); + const compliant = await artToken.accountCompliant(randomAccount); - expect(authorized).equal(true); + expect(compliant).equal(true); }); it(`should return 'true' for a partner contract`, async () => { - const authorized = await artToken.recipientAuthorized(market); + const compliant = await artToken.accountCompliant(market); - expect(authorized).equal(true); + expect(compliant).equal(true); }); it(`should return 'false' for a non-partner contract`, async () => { - const authorized = await artToken.recipientAuthorized(usdc); + const compliant = await artToken.accountCompliant(usdc); - expect(authorized).equal(false); + expect(compliant).equal(false); }); }); diff --git a/tests/AuctionHouse.ts b/tests/AuctionHouse.ts index 0b69e38..f84d685 100644 --- a/tests/AuctionHouse.ts +++ b/tests/AuctionHouse.ts @@ -198,7 +198,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith('AuctionHouseInvalidCurrency'); + await expect(tx).rejectedWith('AuctionHouseUnsupportedCurrency'); }); it(`should fail if the auction duration is less than the minimum duration`, async () => { @@ -301,7 +301,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith('AuctionHouseAuctionExists'); + await expect(tx).rejectedWith('AuctionHouseAuctionAlreadyExists'); }); it(`should fail if the token is already in an active auction`, async () => { @@ -341,7 +341,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith(`AuctionHouseTokenReserved(${AUCTION_ID})`); + await expect(tx).rejectedWith(`AuctionHouseTokenAlreadyReserved(${AUCTION_ID})`); }); it(`should fail if the token is in an inactive auction with a buyer`, async () => { @@ -389,7 +389,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith(`AuctionHouseTokenReserved(${AUCTION_ID})`); + await expect(tx).rejectedWith(`AuctionHouseTokenAlreadyReserved(${AUCTION_ID})`); }); it(`should fail if the token is already minted`, async () => { @@ -442,7 +442,7 @@ describe(`AuctionHouse`, () => { await expect(tx).rejectedWith('AuctionHouseTokenAlreadyMinted'); }); - it(`should fail if the permit signer is not the auction house signer`, async () => { + it(`should fail if the permit signer is not the auction-house signer`, async () => { const latestBlockTimestamp = await getLatestBlockTimestamp(); const auctionCreationPermit: AuctionCreationPermit.TypeStruct = { @@ -557,7 +557,7 @@ describe(`AuctionHouse`, () => { .connect(buyer) .raiseInitial(NON_EXISTENT_AUCTION_ID, AUCTION_PRICE); - await expect(tx).rejectedWith('AuctionHouseAuctionNotExist'); + await expect(tx).rejectedWith('AuctionHouseNonexistentAuction'); }); it(`should fail if the auction has a buyer`, async () => { @@ -569,7 +569,7 @@ describe(`AuctionHouse`, () => { const tx = auctionHouse.connect(randomAccount).raiseInitial(AUCTION_ID, price); - await expect(tx).rejectedWith('AuctionHouseBuyerExists'); + await expect(tx).rejectedWith('AuctionHouseUnexpectedBuyer'); }); it(`should fail if the auction has ended`, async () => { @@ -579,10 +579,10 @@ describe(`AuctionHouse`, () => { const tx = auctionHouse.connect(buyer).raiseInitial(AUCTION_ID, price); - await expect(tx).rejectedWith('AuctionHouseAuctionEnded'); + await expect(tx).rejectedWith('AuctionHouseAuctionAlreadyEnded'); }); - it(`should fail if the buyer is unauthorized`); + it(`should fail if the buyer is not compliant`); }); describe(`method 'raiseInitial' with Ether`, () => { @@ -740,7 +740,7 @@ describe(`AuctionHouse`, () => { it(`should fail if the auction does not exist`, async () => { const tx = auctionHouse.connect(buyer).raise(NON_EXISTENT_AUCTION_ID, AUCTION_PRICE); - await expect(tx).rejectedWith('AuctionHouseAuctionNotExist'); + await expect(tx).rejectedWith('AuctionHouseNonexistentAuction'); }); it(`should fail if the auction has ended`, async () => { @@ -752,7 +752,7 @@ describe(`AuctionHouse`, () => { const tx = auctionHouse.connect(buyer).raise(AUCTION_ID, initialPrice + step); - await expect(tx).rejectedWith('AuctionHouseAuctionEnded'); + await expect(tx).rejectedWith('AuctionHouseAuctionAlreadyEnded'); }); it(`should fail if the auction does not have a buyer`, async () => { @@ -760,10 +760,10 @@ describe(`AuctionHouse`, () => { const tx = auctionHouse.connect(buyer).raise(AUCTION_ID, initialPrice + step); - await expect(tx).rejectedWith('AuctionHouseBuyerNotExists'); + await expect(tx).rejectedWith('AuctionHouseMissingBuyer'); }); - it(`should fail if the buyer is unauthorized`); + it(`should fail if the buyer is not compliant`); }); describe(`method 'raise' with Ether`, () => { @@ -910,7 +910,7 @@ describe(`AuctionHouse`, () => { it(`should fail if the auction does not exist`, async () => { const tx = auctionHouse.connect(buyer).finish(NON_EXISTENT_AUCTION_ID); - await expect(tx).rejectedWith('AuctionHouseAuctionNotExist'); + await expect(tx).rejectedWith('AuctionHouseNonexistentAuction'); }); it(`should fail if the token has been sold`, async () => { @@ -924,7 +924,7 @@ describe(`AuctionHouse`, () => { const tx = auctionHouse.connect(buyer).finish(AUCTION_ID); - await expect(tx).rejectedWith('AuctionHouseTokenSold'); + await expect(tx).rejectedWith('AuctionHouseTokenAlreadySold'); }); it(`should fail if the auction has not ended`, async () => { @@ -944,7 +944,7 @@ describe(`AuctionHouse`, () => { const tx = auctionHouse.connect(buyer).finish(AUCTION_ID); - await expect(tx).rejectedWith('AuctionHouseBuyerNotExists'); + await expect(tx).rejectedWith('AuctionHouseMissingBuyer'); }); }); @@ -996,13 +996,13 @@ describe(`AuctionHouse`, () => { const tx2 = auctionHouse.connect(buyer).raiseInitial(AUCTION_ID, price); - await expect(tx2).rejectedWith('AuctionHouseAuctionEnded'); + await expect(tx2).rejectedWith('AuctionHouseAuctionAlreadyEnded'); }); it(`should fail if the auction does not exist`, async () => { const tx = auctionHouse.connect(admin).cancel(SECOND_AUCTION_ID); - await expect(tx).rejectedWith('AuctionHouseAuctionNotExist'); + await expect(tx).rejectedWith('AuctionHouseNonexistentAuction'); }); it(`should fail if the auction has a buyer`, async () => { @@ -1010,7 +1010,7 @@ describe(`AuctionHouse`, () => { const tx = auctionHouse.connect(admin).cancel(AUCTION_ID); - await expect(tx).rejectedWith('AuctionHouseBuyerExists'); + await expect(tx).rejectedWith('AuctionHouseUnexpectedBuyer'); }); it(`should fail if the auction has already ended`, async () => { @@ -1020,7 +1020,7 @@ describe(`AuctionHouse`, () => { const tx = auctionHouse.connect(admin).cancel(AUCTION_ID); - await expect(tx).rejectedWith('AuctionHouseAuctionEnded'); + await expect(tx).rejectedWith('AuctionHouseAuctionAlreadyEnded'); }); it(`should fail if the sender is not the auction house admin`, async () => { @@ -1059,37 +1059,52 @@ describe(`AuctionHouse`, () => { await usdc.connect(buyer).mintAndApprove(auctionHouse, MaxInt256); }); + it(`should return 'false' for a token that has never been put up for auction`, async () => { + const tokenReserved = await auctionHouse.tokenReserved(NON_EXISTENT_TOKEN_ID); + + expect(tokenReserved).equal(false); + }); + it(`should return 'true' for a token that is in an active auction`, async () => { const tokenReserved = await auctionHouse.tokenReserved(TOKEN_ID); expect(tokenReserved).equal(true); }); - it(`should return 'true' for a token that is in an inactive auction with a buyer`, async () => { + it(`should return 'false' for a token that has been sold`, async () => { const { price, endTime } = await auctionHouse.auction(AUCTION_ID); await auctionHouse.connect(buyer).raiseInitial(AUCTION_ID, price); await setNextBlockTimestamp(endTime); + await auctionHouse.connect(buyer).finish(AUCTION_ID); + const tokenReserved = await auctionHouse.tokenReserved(TOKEN_ID); - expect(tokenReserved).equal(true); + expect(tokenReserved).equal(false); }); - it(`should return 'false' for a token that has not been sold`, async () => { - const { endTime } = await auctionHouse.auction(AUCTION_ID); + it(`should return 'true' for a token that is in an ended auction with a buyer, but not yet finished`, async () => { + const { price, endTime } = await auctionHouse.auction(AUCTION_ID); + + await auctionHouse.connect(buyer).raiseInitial(AUCTION_ID, price); await setNextBlockTimestamp(endTime); await mine(); const tokenReserved = await auctionHouse.tokenReserved(TOKEN_ID); - expect(tokenReserved).equal(false); + expect(tokenReserved).equal(true); }); - it(`should return 'false' for a token that has never been put up for auction`, async () => { - const tokenReserved = await auctionHouse.tokenReserved(NON_EXISTENT_TOKEN_ID); + it(`should return 'false' for a token that is in an ended auction without a buyer`, async () => { + const { endTime } = await auctionHouse.auction(AUCTION_ID); + + await setNextBlockTimestamp(endTime); + await mine(); + + const tokenReserved = await auctionHouse.tokenReserved(TOKEN_ID); expect(tokenReserved).equal(false); }); @@ -1287,7 +1302,7 @@ describe(`AuctionHouse`, () => { await expect(tx).rejectedWith('ShareUtilsInvalidSum(8000)'); }); - it(`should fail if shares and participants are missing`, async () => { + it(`should fail if participants are missing`, async () => { const latestBlockTimestamp = await getLatestBlockTimestamp(); const auctionCreationPermit: AuctionCreationPermit.TypeStruct = { @@ -1312,7 +1327,7 @@ describe(`AuctionHouse`, () => { sender: institution, }); - await expect(tx).rejectedWith('ShareUtilsInvalidSum(0)'); + await expect(tx).rejectedWith('ShareUtilsInvalidParticipantsCount(0)'); }); it(`should fail if a participant address is zero`, async () => { diff --git a/tests/Market.ts b/tests/Market.ts index 3a335c3..1c5a05b 100644 --- a/tests/Market.ts +++ b/tests/Market.ts @@ -361,7 +361,7 @@ describe('Market', function () { sender: taker, }); - await expect(tx).rejectedWith('MarketUnauthorizedOrder'); + await expect(tx).rejectedWith('MarketInvalidOrderSignature'); }); it(`should fail if the permit order hash and the order hash do not match`, async () => { @@ -397,7 +397,7 @@ describe('Market', function () { sender: taker, }); - await expect(tx).rejectedWith('MarketInvalidOrderHash'); + await expect(tx).rejectedWith('MarketOrderHashMismatch'); }); it(`should fail if the permit signer is not the market signer`, async () => { @@ -581,7 +581,7 @@ describe('Market', function () { sender: taker, }); - await expect(tx).rejectedWith('MarketCurrencyInvalid'); + await expect(tx).rejectedWith('MarketUnsupportedCurrency'); }); it(`should fail if the sender is not the permitted taker`, async () => { @@ -1209,7 +1209,7 @@ describe('Market', function () { sender: taker, }); - await expect(tx).rejectedWith('MarketUnauthorizedOrder'); + await expect(tx).rejectedWith('MarketInvalidOrderSignature'); }); it(`should fail if the permit order hash and the order hash do not match`, async () => { @@ -1245,7 +1245,7 @@ describe('Market', function () { sender: taker, }); - await expect(tx).rejectedWith('MarketInvalidOrderHash'); + await expect(tx).rejectedWith('MarketOrderHashMismatch'); }); it(`should fail if the permit signer is not the market signer`, async () => { @@ -1429,7 +1429,7 @@ describe('Market', function () { sender: taker, }); - await expect(tx).rejectedWith('MarketCurrencyInvalid'); + await expect(tx).rejectedWith('MarketUnsupportedCurrency'); }); it(`should fail if the sender is not the permitted taker`, async () => { @@ -1613,7 +1613,7 @@ describe('Market', function () { sender: taker, }); - await expect(tx).rejectedWith('MarketCurrencyInvalid'); + await expect(tx).rejectedWith('MarketUnsupportedCurrency'); }); }); diff --git a/tests/constants/art-token.ts b/tests/constants/art-token.ts index 1688bda..2663d37 100644 --- a/tests/constants/art-token.ts +++ b/tests/constants/art-token.ts @@ -1,3 +1,4 @@ +import { id } from 'ethers'; import { TokenConfig } from '../../typechain-types/contracts/art-token/ArtToken'; import { ONE_HUNDRED } from './general'; import { REGULATION_MODE_REGULATED } from './token-config'; @@ -20,8 +21,8 @@ export const TOKEN_MINTING_PERMIT_TYPE = { ], }; -export const TOKEN_ID = 1; -export const NON_EXISTENT_TOKEN_ID = 9999; +export const TOKEN_ID = +id('TOKEN_ID').slice(0, 10); +export const NON_EXISTENT_TOKEN_ID = +id('NON_EXISTENT_TOKEN_ID').slice(0, 10); export const TOKEN_URI = 'ipfs://QmbQ9c4KN5FcGreai5rjTRUs1N2FFMaY819JGZZMGDcSLQ'; export const SECOND_TOKEN_URI = 'ipfs://QmbqKeWzBDUwKzVye3RxeD67N7rQrfgTaPTevucfbP3BST'; diff --git a/tests/constants/auction-house.ts b/tests/constants/auction-house.ts index 8a130be..09b9e9e 100644 --- a/tests/constants/auction-house.ts +++ b/tests/constants/auction-house.ts @@ -1,3 +1,5 @@ +import { id } from 'ethers'; + export const AUCTION_HOUSE_DOMAIN_NAME = 'AuctionHouse'; export const AUCTION_HOUSE_DOMAIN_VERSION = '1'; @@ -20,9 +22,9 @@ export const AUCTION_CREATION_PERMIT_TYPE = { export const MIN_AUCTION_DURATION = 1800; -export const AUCTION_ID = 1; -export const NON_EXISTENT_AUCTION_ID = 9999; -export const SECOND_AUCTION_ID = 2; +export const AUCTION_ID = +id('AUCTION_ID').slice(0, 10); +export const NON_EXISTENT_AUCTION_ID = +id('NON_EXISTENT_AUCTION_ID').slice(0, 10); +export const SECOND_AUCTION_ID = +id('SECOND_AUCTION_ID').slice(0, 10); export const AUCTION_STEP = 1_000_000n; export const AUCTION_PRICE = 1_000_000_000n; diff --git a/tests/utils/deploy-all.ts b/tests/utils/deploy-all.ts index 5865593..d80cbc0 100644 --- a/tests/utils/deploy-all.ts +++ b/tests/utils/deploy-all.ts @@ -37,43 +37,43 @@ export async function deployAll(params: Params, deployer?: Signer) { const ArtToken_Proxy_UpgradedEvent = < UpgradedEvent.LogDescription - >(Proxy.interface.parseLog(receipt.logs[0])); + >(Proxy.interface.parseLog(receipt.logs[1])); const ArtToken_ProxyAdmin_OwnershipTransferredEvent = < OwnershipTransferredEvent.LogDescription - >(ProxyAdmin.interface.parseLog(receipt.logs[1])); + >(ProxyAdmin.interface.parseLog(receipt.logs[2])); const ArtToken_Proxy_AdminChangedEvent = < AdminChangedEvent.LogDescription - >(Proxy.interface.parseLog(receipt.logs[2])); + >(Proxy.interface.parseLog(receipt.logs[3])); const AuctionHouse_Proxy_UpgradedEvent = < UpgradedEvent.LogDescription - >(Proxy.interface.parseLog(receipt.logs[3])); + >(Proxy.interface.parseLog(receipt.logs[4])); const AuctionHouse_ProxyAdmin_OwnershipTransferredEvent = < OwnershipTransferredEvent.LogDescription - >(ProxyAdmin.interface.parseLog(receipt.logs[4])); + >(ProxyAdmin.interface.parseLog(receipt.logs[5])); const AuctionHouse_Proxy_AdminChangedEvent = < AdminChangedEvent.LogDescription - >(Proxy.interface.parseLog(receipt.logs[5])); + >(Proxy.interface.parseLog(receipt.logs[6])); const Market_Proxy_UpgradedEvent = < UpgradedEvent.LogDescription - >(Proxy.interface.parseLog(receipt.logs[6])); + >(Proxy.interface.parseLog(receipt.logs[7])); const Market_ProxyAdmin_OwnershipTransferredEvent = < OwnershipTransferredEvent.LogDescription - >(ProxyAdmin.interface.parseLog(receipt.logs[7])); + >(ProxyAdmin.interface.parseLog(receipt.logs[8])); const Market_Proxy_AdminChangedEvent = < AdminChangedEvent.LogDescription - >(Proxy.interface.parseLog(receipt.logs[8])); + >(Proxy.interface.parseLog(receipt.logs[9])); const Deployer_DeployedEvent = < DeployedEvent.LogDescription - >(Deployer.interface.parseLog(receipt.logs[9])); + >(Deployer.interface.parseLog(receipt.logs[10])); const artTokenAddr = Deployer_DeployedEvent.args.artToken; const artTokenImplAddr = ArtToken_Proxy_UpgradedEvent.args.implementation; From 8223dd8f02cdb5d212d345b7c45926ae0c387d12 Mon Sep 17 00:00:00 2001 From: mriynyk Date: Fri, 27 Feb 2026 13:27:28 +0700 Subject: [PATCH 09/14] upd readme --- README.md | 196 +++++++++++++++++----------------------- config.env.example.yaml | 2 +- 2 files changed, 85 insertions(+), 113 deletions(-) diff --git a/README.md b/README.md index 3adb193..d20f3f5 100644 --- a/README.md +++ b/README.md @@ -4,164 +4,136 @@ ![tests](https://github.com/digital-original/contracts/actions/workflows/test.yml/badge.svg) ![license](https://img.shields.io/badge/license-GPLv3-blue) -# Digital Original – Smart Contracts Suite +# Digital Original Smart Contracts -Digital Original (DO) is a modular on-chain framework for managing primary sales and secondary markets of digital collectibles (NFTs). -This repository hosts all **Solidity smart contracts, tests and tooling** required to deploy and operate the protocol. +A modular on-chain framework for NFT primary sales and secondary markets. This repository contains the core Solidity implementations, testing suites, and deployment tooling for the Digital Original protocol. -## 🧩 Features +## Architecture Overview -- **Primary Sales & Minting**: Directly mint and purchase NFTs with built-in revenue distribution. -- **Secondary Markets**: Peer-to-peer trading of NFTs with off-chain order matching. -- **Auction House**: English-style auctions for primary NFT sales. -- **EIP-712 Permits**: Gas-efficient and secure transactions with cryptographic authorization. -- **Role-Based Access Control**: Granular control over contract functions and administrative actions. -- **Flexible Fee Structures**: Configurable maker and taker fees for market transactions. -- **Multi-Currency Support**: Configurable support for multiple payment currencies. -- **Upgradeable Contracts**: Upgradeable contract architecture for future improvements. +The DO protocol is built on a modular, upgradeable architecture designed for security and scalability. -## 📚 Contracts +- **Signature-Based Authorization**: Most protocol actions (minting, auctions, market orders) are authorized off-chain via EIP-712 permits and executed on-chain. +- **Upgradeable Core**: Contracts utilize a proxy-implementation pattern with explicit storage layouts to allow for seamless protocol upgrades. +- **Unified Role System**: Granular access control is managed through a central `RoleSystem` inherited by all core components. +- **Multi-Currency Support**: A `CurrencyManager` module allows the protocol to interact with an arbitrary list of approved ERC-20 tokens. -### ArtToken - -The `ArtToken` contract is an upgradeable ERC-721 NFT implementation that serves as the core collectible in the Digital Original ecosystem. Key features: +## Core Contracts -- **Primary Sales**: Supports direct minting and purchasing through the `mint()` function with built-in revenue distribution -- **EIP-712 Permits**: All primary sales require cryptographic authorization from designated signers -- **Compliance & Regulation**: Optional transfer restrictions for regulated tokens -- **AuctionHouse Integration**: Works seamlessly with the AuctionHouse for auction-based primary sales -- **Revenue Splitting**: Automatic distribution of sale proceeds among multiple participants according to predefined shares +### ArtToken +An upgradeable ERC-721 implementation with integrated primary-sale logic. +- **Token Minting**: Requires cryptographic authorization from designated signers. +- **Transfer Restrictions**: Optional enforcement for regulated collections. +- **Revenue Distribution**: Automatic on-chain splits for primary sale proceeds. ### AuctionHouse - -The `AuctionHouse` contract manages English-style auctions for primary NFT sales. Key features: - -- **Auction Creation**: Authorized creation of time-bound auctions with EIP-712 signatures -- **Bidding System**: Progressive bidding with minimum raise steps and automatic refunds to outbid participants -- **Multi-Currency**: Configurable support for multiple payment currencies +Manages English-style auctions for primary NFT releases. +- **Auction Creation**: Requires cryptographic authorization from designated signers. +- **Escrow-less Bidding**: Refunds are handled automatically during the bidding process. ### Market +A secondary marketplace facilitating peer-to-peer trading. +- **Off-chain Orders**: Supports EIP-712 signed 'Asks' and 'Bids'. +- **Fees**: Supports maker and taker fee. -The `Market` contract facilitates peer-to-peer secondary trading of NFTs through off-chain order matching. Key features: +## Environment Setup -- **Order Types**: Supports both sell-side (ask) and buy-side (bid) orders -- **Off-chain Orders**: Gas-efficient trading through EIP-712 signed orders executed on-chain -- **Multi-Currency**: Configurable support for multiple payment currencies -- **Order Management**: Order invalidation capabilities for makers and admins -- **Fee Structure**: Flexible fee system supporting both maker and taker fees -- **Revenue Sharing**: Built-in mechanism for distributing fees among multiple participants -- **Security**: Time-bound orders with replay protection and signature verification +### Prerequisites +- **Node.js**: ^24.6.0 +- **Python**: ^3.13.7 (for Slither) -## 🏃🏽 Getting Started - -### 📋 Prerequisites -- [Node.js](https://nodejs.org/) -- [Python](https://www.python.org/) (for static analysis) - -### ⚡️ Quick Start +### Installation ```bash -# 1. install deps npm install +``` +This will automatically run the `prepare` script, initializing your configuration files from templates. -# 2. init config templates -source ./init.sh +### Configuration +The project uses four YAML-based configuration files: +1. `config.env.yaml`: API keys for Etherscan, CoinMarketCap, and Gas Reporter. +2. `config.chain.yaml`: RPC URLs and deployer private keys per network. +3. `config.collection.yaml`: Parameters for the NFT collection. +4. `config.market.yaml`: Parameters for the marketplace. -# 3. compile +## Development Lifecycle + +### Compilation +```bash npm run compile +``` -# 4. run the tests +### Running Tests +```bash npm run test ``` -### ⚙️ Configuration - -The project uses YAML files for configuration. You'll need to create your own configuration files by copying the example files and editing them with your desired settings. - -Every Hardhat network entry gets enriched with a `protocolConfig` object at runtime, see `hardhat.config.ts`. - -1. **Environment Config:** Copy `config.env.example.yaml` to `config.env.yaml` and add your API keys (e.g., Etherscan, CoinMarketCap). - -2. **Chain Config:** Copy `config.chain.example.yaml` to `config.chain.yaml` and add your RPC URLs and deployer private keys for the desired networks. - -3. **Collection Config:** Copy `config.collection.example.yaml` to `config.collection.yaml` and configure the art token collection parameters. - -4. **Market Config:** Copy `config.market.example.yaml` to `config.market.yaml` and configure the marketplace parameters. - -### 🍴 Local Fork - -Spin up a mainnet-fork using the URL from `config.chain.yaml`: +### Local Forking +To start a local node forking a network defined in your config: ```bash npm run fork ``` - In a separate terminal, you can then use hardhat tasks: ```bash npx hardhat deploy-collection --network fork ``` -### 📜 NPM Scripts - -| Script | Description | -| ----------------- | ------------------------------------------------------------------ | -| `npm run compile` | Clean & compile contracts | -| `npm run test` | Execute TypeScript test-suite | -| `npm run fork` | Start a local Hardhat node (optionally forking) | -| `npm run slither` | Static analysis using [Slither](https://github.com/crytic/slither) | -| `npm run lint` | Lint Solidity with Solhint | -| `npm run format` | Auto-format using Prettier | - -### 👷🏽 Hardhat Tasks - -- **Deploy Collection**: - ```bash - npx hardhat deploy-collection --network - ``` -- **Deploy Market**: - ```bash - npx hardhat deploy-market --network - ``` -- **Deploy Individual Implementations**: - ```bash - npx hardhat deploy-art-token-impl --network - npx hardhat deploy-auction-house-impl --network - npx hardhat deploy-market-impl --network - ``` -- **Verify Contracts on Etherscan**: - ```bash - npx hardhat verify-art-token --network - npx hardhat verify-auction-house --network - npx hardhat verify-market --network - ``` - -To see a full list of available tasks, run `npx hardhat --help`. - -## 🛡️ Static Analysis - +### Static Analysis To run Slither for smart contract security analysis, you need to set up a Python virtual environment first: - ```bash -# 1. Create a virtual environment +# Create a virtual environment python3 -m venv venv -# 2. Activate the virtual environment +# Activate the virtual environment source venv/bin/activate -# 3. Install Python dependencies (including slither-analyzer) +# Install Python dependencies (including slither-analyzer) pip install -r requirements.txt -# 4. Compile contracts +# Compile contracts npm run compile -# 5. Run Slither analysis +# Run Slither analysis npm run slither ``` - The Slither configuration is defined in `slither.config.json`. After running, you can deactivate the virtual environment with: - ```bash deactivate ``` -## 📜 License +## Deployment & Verification + +Deployments are handled via Hardhat tasks. Always specify the `--network` flag. + +- **Deploy Full Suite**: +```bash +npx hardhat deploy-collection --network +npx hardhat deploy-market --network +``` +- **Deploy Individual Implementations**: +```bash +npx hardhat deploy-art-token-impl --network +npx hardhat deploy-auction-house-impl --network +npx hardhat deploy-market-impl --network +``` +- **Verification**: +```bash +npx hardhat verify-art-token --network +npx hardhat verify-auction-house --network +npx hardhat verify-market --network +``` + +## Project Structure + +```text +├── contracts/ +│ ├── art-token/ # ERC-721 and minting logic +│ ├── auction-house/ # Primary auction logic +│ ├── market/ # Secondary trading logic +│ └── utils/ # Shared modules (Roles, Currency, etc.) +├── scripts/ # Deployment scripts +├── tasks/ # Hardhat tasks (deploy/verify) +└── tests/ # TypeScript test suite +``` + +## License Licensed under **GPL-3.0** – see [LICENSE](./LICENSE) for details. diff --git a/config.env.example.yaml b/config.env.example.yaml index fdee84c..c5b03af 100644 --- a/config.env.example.yaml +++ b/config.env.example.yaml @@ -2,6 +2,6 @@ fork: name: 'ethereum' chainId: 31337 url: 'http://localhost:8545/' -reportGas: false +reportGas: true etherscanApiKey: '' coinmarketcapApiKey: '' From bea5137da51a911ea66ec9a85345332bb112c86a Mon Sep 17 00:00:00 2001 From: mriynyk Date: Fri, 27 Feb 2026 13:42:13 +0700 Subject: [PATCH 10/14] upd compile cmd --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1fca889..e47aa25 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "license": "UNLICENSED", "scripts": { "test": "ENV_MODE=test hardhat test", - "compile": "hardhat clean && hardhat compile", + "compile": "ENV_MODE=test hardhat clean && hardhat compile", "fork": "hardhat node", "lint": "solhint 'contracts/**'", "format": "prettier --write .", From 6630b9923f7d16937c542397835bf03b6abc436a Mon Sep 17 00:00:00 2001 From: mriynyk Date: Fri, 27 Feb 2026 13:49:24 +0700 Subject: [PATCH 11/14] upd compile cmd --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e47aa25..410beb0 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "license": "UNLICENSED", "scripts": { "test": "ENV_MODE=test hardhat test", - "compile": "ENV_MODE=test hardhat clean && hardhat compile", + "compile": "ENV_MODE=test hardhat clean && ENV_MODE=test hardhat compile", "fork": "hardhat node", "lint": "solhint 'contracts/**'", "format": "prettier --write .", From 61dd36079ba5b0474c75b4906eae7808e4791c69 Mon Sep 17 00:00:00 2001 From: mriynyk Date: Fri, 27 Feb 2026 17:10:18 +0700 Subject: [PATCH 12/14] upd package-lock --- package-lock.json | 3384 ++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 1661 insertions(+), 1727 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16d7da1..9ef3441 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "UNLICENSED", "dependencies": { "@nomicfoundation/hardhat-toolbox": "^6.1.0", - "@openzeppelin/contracts": "^5.0.2", - "@openzeppelin/contracts-upgradeable": "^5.0.2", + "@openzeppelin/contracts": "5.0.2", + "@openzeppelin/contracts-upgradeable": "5.0.2", "@types/js-yaml": "^4.0.9", "ethers": "^6.16.0", "hardhat": "^2.28.6", @@ -29,15 +29,16 @@ "node_modules/@adraffy/ens-normalize": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -55,15 +56,27 @@ } }, "node_modules/@bytecodealliance/preview2-shim": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@bytecodealliance/preview2-shim/-/preview2-shim-0.17.5.tgz", - "integrity": "sha512-F4WYVC6aHOiOXSsG3WDGFALrkpb952+9/EIX119qIzDtYgE5tvbOnKeBb0Y+NMzGEsu3334GdHIRXQ6wibY0MA==", + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@bytecodealliance/preview2-shim/-/preview2-shim-0.17.8.tgz", + "integrity": "sha512-wS5kg8u0KCML1UeHQPJ1IuOI24x/XLentCzsqPER1+gDNC5Cz2hG4G2blLOZap+3CEGhIhnJ9mmZYj6a2W0Lww==", "license": "(Apache-2.0 WITH LLVM-exception)" }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "license": "MIT", "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -73,31 +86,28 @@ } }, "node_modules/@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", + "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", "license": "MPL-2.0", - "peer": true, "bin": { - "rlp": "bin/rlp" + "rlp": "bin/rlp.cjs" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@ethereumjs/util": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", - "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz", + "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", "license": "MPL-2.0", - "peer": true, "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "ethereum-cryptography": "^2.0.0", - "micro-ftch": "^0.3.1" + "@ethereumjs/rlp": "^5.0.2", + "ethereum-cryptography": "^2.2.1" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@ethereumjs/util/node_modules/@noble/curves": { @@ -105,7 +115,6 @@ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "license": "MIT", - "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -118,7 +127,6 @@ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 16" }, @@ -126,12 +134,47 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@ethereumjs/util/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "license": "MIT", - "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -554,9 +597,10 @@ } }, "node_modules/@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", "engines": { "node": ">=14" } @@ -589,9 +633,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "peer": true, "engines": { @@ -602,9 +646,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "peer": true, "engines": { @@ -640,13 +684,13 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "peer": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -674,24 +718,27 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", "peer": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT", "peer": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -715,6 +762,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", "dependencies": { "@noble/hashes": "1.3.2" }, @@ -726,6 +774,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", "engines": { "node": ">= 16" }, @@ -742,7 +791,8 @@ "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -931,97 +981,6 @@ "hardhat": "^2.26.0" } }, - "node_modules/@nomicfoundation/hardhat-ignition/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@nomicfoundation/hardhat-ignition/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nomicfoundation/hardhat-ignition/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@nomicfoundation/hardhat-ignition/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT", - "peer": true - }, - "node_modules/@nomicfoundation/hardhat-ignition/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@nomicfoundation/hardhat-ignition/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nomicfoundation/hardhat-ignition/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@nomicfoundation/hardhat-network-helpers": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.1.2.tgz", @@ -1137,21 +1096,6 @@ "node": ">=16" } }, - "node_modules/@nomicfoundation/ignition-core/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@nomicfoundation/ignition-ui": { "version": "0.15.13", "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.13.tgz", @@ -1169,192 +1113,124 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz", + "integrity": "sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==", + "license": "MIT", "engines": { "node": ">= 12" }, "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.2", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.2" } }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "cpu": [ - "arm64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz", + "integrity": "sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==", + "license": "MIT", "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "cpu": [ - "x64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz", + "integrity": "sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==", + "license": "MIT", "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "cpu": [ - "arm64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz", + "integrity": "sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "cpu": [ - "arm64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz", + "integrity": "sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "cpu": [ - "x64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz", + "integrity": "sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "cpu": [ - "ia32" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz", + "integrity": "sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==", + "license": "MIT", "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "cpu": [ - "x64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz", + "integrity": "sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==", + "license": "MIT", "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@openzeppelin/contracts": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.0.2.tgz", - "integrity": "sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==" + "integrity": "sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==", + "license": "MIT" }, "node_modules/@openzeppelin/contracts-upgradeable": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.2.tgz", "integrity": "sha512-0MmkHSHiW2NRFiT9/r5Lu4eJq5UJ4/tzlOgYXNAIj/ONkQTVnz22pLxDvp4C4uZ9he7ZFvGn3Driptn1/iU7tQ==", + "license": "MIT", "peerDependencies": { "@openzeppelin/contracts": "5.0.2" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", "engines": { "node": ">=12.22.0" } @@ -1363,6 +1239,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", "dependencies": { "graceful-fs": "4.2.10" }, @@ -1373,12 +1250,14 @@ "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" }, "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", + "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", + "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", @@ -1389,77 +1268,80 @@ } }, "node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", "license": "MIT", "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", "license": "MIT", "peer": true, "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "peer": true, "dependencies": { - "@noble/hashes": "1.4.0" + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", "peer": true, "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", "license": "MIT", "peer": true, "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip39/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", "peer": true, "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -1469,6 +1351,7 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -1483,12 +1366,14 @@ "node_modules/@sentry/core/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@sentry/hub": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", @@ -1501,12 +1386,14 @@ "node_modules/@sentry/hub/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@sentry/minimal": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/types": "5.30.0", @@ -1519,12 +1406,14 @@ "node_modules/@sentry/minimal/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@sentry/node": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/core": "5.30.0", "@sentry/hub": "5.30.0", @@ -1543,12 +1432,14 @@ "node_modules/@sentry/node/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@sentry/tracing": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "license": "MIT", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -1563,12 +1454,14 @@ "node_modules/@sentry/tracing/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@sentry/types": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "license": "BSD-3-Clause", "engines": { "node": ">=6" } @@ -1577,6 +1470,7 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/types": "5.30.0", "tslib": "^1.9.3" @@ -1588,12 +1482,14 @@ "node_modules/@sentry/utils/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@sindresorhus/is": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -1611,6 +1507,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -1619,33 +1516,38 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "license": "MIT", "peer": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "license": "MIT", "peer": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "license": "MIT", "peer": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "license": "MIT", "peer": true }, "node_modules/@typechain/ethers-v6": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz", "integrity": "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==", + "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.17.15", @@ -1661,6 +1563,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-9.1.0.tgz", "integrity": "sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==", + "license": "MIT", "peer": true, "dependencies": { "fs-extra": "^9.1.0" @@ -1672,6 +1575,22 @@ "typechain": "^8.3.2" } }, + "node_modules/@typechain/hardhat/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@types/bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.2.0.tgz", @@ -1711,9 +1630,10 @@ } }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "license": "MIT" }, "node_modules/@types/js-yaml": { "version": "4.0.9", @@ -1729,17 +1649,20 @@ "peer": true }, "node_modules/@types/mocha": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.3.tgz", - "integrity": "sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ==", + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "license": "MIT", "peer": true }, "node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "version": "25.3.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.2.tgz", + "integrity": "sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q==", + "license": "MIT", + "peer": true, "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~7.18.0" } }, "node_modules/@types/pbkdf2": { @@ -1756,12 +1679,13 @@ "version": "2.7.3", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "license": "MIT", "peer": true }, "node_modules/@types/secp256k1": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", - "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.7.tgz", + "integrity": "sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw==", "license": "MIT", "peer": true, "dependencies": { @@ -1776,9 +1700,9 @@ "peer": true }, "node_modules/abitype": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", - "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", + "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", "license": "MIT", "peer": true, "funding": { @@ -1786,7 +1710,7 @@ }, "peerDependencies": { "typescript": ">=5.0.4", - "zod": "^3 >=3.22.0" + "zod": "^3.22.0 || ^4.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1798,9 +1722,10 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", "peer": true, "bin": { "acorn": "bin/acorn" @@ -1810,10 +1735,14 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", "peer": true, + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -1822,6 +1751,7 @@ "version": "0.4.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "license": "MIT", "engines": { "node": ">=0.3.0" } @@ -1829,12 +1759,14 @@ "node_modules/aes-js": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", "dependencies": { "debug": "4" }, @@ -1846,6 +1778,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -1855,15 +1788,15 @@ } }, "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -1879,10 +1812,22 @@ "ajv": ">=5.0.0" } }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "license": "BSD-3-Clause OR MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.2" + } + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", "dependencies": { "string-width": "^4.1.0" } @@ -1891,6 +1836,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", "engines": { "node": ">=6" } @@ -1899,6 +1845,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -1913,26 +1860,31 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "peer": true, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1945,17 +1897,20 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT", "peer": true }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/array-back": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -1984,12 +1939,14 @@ "node_modules/ast-parents": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", - "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==" + "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", + "license": "MIT" }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -2012,6 +1969,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", "peer": true, "engines": { "node": ">= 4.0.0" @@ -2048,7 +2006,8 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, "node_modules/base-x": { "version": "3.0.11", @@ -2061,9 +2020,9 @@ } }, "node_modules/better-ajv-errors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-2.0.2.tgz", - "integrity": "sha512-1cLrJXEq46n0hjV8dDYwg9LKYjDb3KbeW7nZTv4kvfoDD9c2DXHIE31nxM+Y/cIfXMggLUfmxbm6h/JoM/yotA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-2.0.3.tgz", + "integrity": "sha512-t1vxUP+vYKsaYi/BbKo2K98nEAZmfi4sjwvmRT8aOPDzPJeAtLurfoIDazVkLILxO4K+Sw4YrLYnBQ46l6pePg==", "license": "Apache-2.0", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -2079,82 +2038,16 @@ "ajv": "4.11.8 - 8" } }, - "node_modules/better-ajv-errors/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/better-ajv-errors/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/better-ajv-errors/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/better-ajv-errors/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/better-ajv-errors/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/better-ajv-errors/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/blakejs": { @@ -2174,6 +2067,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "license": "MIT", "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", @@ -2191,96 +2085,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/boxen/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/boxen/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -2291,7 +2121,8 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" }, "node_modules/brotli-wasm": { "version": "2.0.1", @@ -2303,7 +2134,8 @@ "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "license": "ISC" }, "node_modules/browserify-aes": { "version": "1.2.0", @@ -2345,7 +2177,8 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" }, "node_modules/buffer-xor": { "version": "1.0.3", @@ -2358,6 +2191,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2366,6 +2200,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", "engines": { "node": ">=14.16" } @@ -2374,6 +2209,7 @@ "version": "10.2.14", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -2387,17 +2223,6 @@ "node": ">=14.16" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -2452,6 +2277,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -2460,6 +2286,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -2513,17 +2340,19 @@ } }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "peer": true, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/charenc": { @@ -2550,45 +2379,36 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT" }, "node_modules/cipher-base": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", - "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", "license": "MIT", "peer": true, "dependencies": { "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" }, "engines": { "node": ">= 0.10" @@ -2598,6 +2418,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", "engines": { "node": ">=6" } @@ -2606,6 +2427,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -2672,57 +2494,14 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cli-truncate/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/slice-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/cli-truncate/node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { "node": ">=20" @@ -2732,12 +2511,12 @@ } }, "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -2750,6 +2529,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -2757,19 +2537,22 @@ } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "peer": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "peer": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", @@ -2793,12 +2576,14 @@ "node_modules/command-exists": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "license": "MIT" }, "node_modules/command-line-args": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "license": "MIT", "peer": true, "dependencies": { "array-back": "^3.1.0", @@ -2814,6 +2599,7 @@ "version": "6.1.3", "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "license": "MIT", "peer": true, "dependencies": { "array-back": "^4.0.2", @@ -2825,59 +2611,151 @@ "node": ">=8.0.0" } }, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/command-line-usage/node_modules/array-back": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" } }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" + "node_modules/command-line-usage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/command-line-usage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT", "peer": true }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "node_modules/command-line-usage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=0.8.0" } }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT", + "peer": true + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT", + "peer": true + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -2932,6 +2810,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "license": "MIT", "peer": true }, "node_modules/cross-spawn": { @@ -2949,22 +2828,6 @@ "node": ">= 8" } }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", @@ -2982,9 +2845,9 @@ "peer": true }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3002,6 +2865,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -3013,6 +2877,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -3027,6 +2892,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -3051,6 +2917,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -3066,6 +2933,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", "engines": { "node": ">=10" } @@ -3102,6 +2970,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3186,12 +3055,14 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/enquirer": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -3204,6 +3075,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", "engines": { "node": ">=6" } @@ -3221,9 +3093,10 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -3278,20 +3151,24 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "peer": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/escodegen": { @@ -3442,6 +3319,21 @@ "node": ">=14.0.0" } }, + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, "node_modules/ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", @@ -3465,9 +3357,9 @@ "peer": true }, "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, "node_modules/evp_bytestokey": { @@ -3484,12 +3376,14 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.3", @@ -3511,7 +3405,8 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -3550,6 +3445,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3561,6 +3457,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "license": "MIT", "peer": true, "dependencies": { "array-back": "^3.0.1" @@ -3573,6 +3470,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3588,6 +3486,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } @@ -3666,6 +3565,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", "engines": { "node": ">= 14.17" } @@ -3673,33 +3573,36 @@ "node_modules/fp-ts": { "version": "1.19.3", "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "license": "MIT" }, "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", "peer": true, "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3722,14 +3625,15 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "license": "MIT", "engines": { "node": ">=18" @@ -3787,6 +3691,18 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ghost-testrpc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", @@ -3801,6 +3717,84 @@ "testrpc-sc": "index.js" } }, + "node_modules/ghost-testrpc/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ghost-testrpc/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT", + "peer": true + }, + "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ghost-testrpc/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -3827,6 +3821,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -3834,71 +3829,45 @@ "node": ">= 6" } }, - "node_modules/glob/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "license": "MIT", "peer": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, "engines": { - "node": "18 || 20 || >=22" + "node": ">=6" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "license": "MIT", "peer": true, "dependencies": { - "balanced-match": "^4.0.2" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">=6" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "license": "ISC", "peer": true, "dependencies": { - "brace-expansion": "^5.0.2" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "license": "MIT", - "peer": true, - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "license": "MIT", - "peer": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" + "bin": { + "which": "bin/which" } }, "node_modules/globby": { @@ -3921,6 +3890,17 @@ "node": ">=8" } }, + "node_modules/globby/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/globby/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3943,6 +3923,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/globby/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -3960,6 +3953,7 @@ "version": "12.6.1", "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -3980,21 +3974,11 @@ "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/got/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, "node_modules/handlebars": { "version": "4.7.8", @@ -4143,137 +4127,22 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/hardhat-gas-reporter/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/hardhat-gas-reporter/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/hardhat-gas-reporter/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/hardhat-gas-reporter/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT", - "peer": true - }, - "node_modules/hardhat-gas-reporter/node_modules/ethereum-cryptography": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", - "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" - } - }, - "node_modules/hardhat-gas-reporter/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hardhat-gas-reporter/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/hardhat-gas-reporter/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", "license": "MIT", "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/hardhat/node_modules/@ethereumjs/rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", - "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", - "license": "MPL-2.0", - "bin": { - "rlp": "bin/rlp.cjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/hardhat/node_modules/@ethereumjs/util": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz", - "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", - "license": "MPL-2.0", - "dependencies": { - "@ethereumjs/rlp": "^5.0.2", - "ethereum-cryptography": "^2.2.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/hardhat/node_modules/@ethereumjs/util/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/hardhat/node_modules/@ethereumjs/util/node_modules/@scure/bip32": { + "node_modules/hardhat-gas-reporter/node_modules/@scure/bip32": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "license": "MIT", + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -4283,11 +4152,12 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/hardhat/node_modules/@ethereumjs/util/node_modules/@scure/bip39": { + "node_modules/hardhat-gas-reporter/node_modules/@scure/bip39": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "license": "MIT", + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -4296,11 +4166,12 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/hardhat/node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { + "node_modules/hardhat-gas-reporter/node_modules/ethereum-cryptography": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "license": "MIT", + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -4308,30 +4179,6 @@ "@scure/bip39": "1.3.0" } }, - "node_modules/hardhat/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/hardhat/node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/hardhat/node_modules/@noble/hashes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", @@ -4341,7 +4188,17 @@ "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" + }, + "node_modules/hardhat/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } }, "node_modules/hardhat/node_modules/@scure/bip32": { "version": "1.1.5", @@ -4353,6 +4210,7 @@ "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "@noble/hashes": "~1.2.0", "@noble/secp256k1": "~1.7.0", @@ -4369,29 +4227,17 @@ "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "@noble/hashes": "~1.2.0", "@scure/base": "~1.1.0" } }, - "node_modules/hardhat/node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/hardhat/node_modules/ethereum-cryptography": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "license": "MIT", "dependencies": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", @@ -4403,6 +4249,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -4416,26 +4263,16 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "node_modules/hardhat/node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/hardhat/node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -4462,12 +4299,12 @@ } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "peer": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -4513,24 +4350,73 @@ } }, "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", "license": "MIT", "peer": true, "dependencies": { "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, + "node_modules/hash-base/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT", + "peer": true + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hash-base/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT", + "peer": true + }, + "node_modules/hash-base/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/hash-base/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT", + "peer": true + }, "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -4553,6 +4439,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", "bin": { "he": "bin/he" } @@ -4568,6 +4455,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -4575,29 +4463,36 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -4610,6 +4505,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -4637,6 +4533,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -4645,9 +4542,10 @@ } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -4664,14 +4562,16 @@ } }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "license": "MIT" }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4683,18 +4583,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", "engines": { "node": ">=8" } @@ -4703,6 +4596,8 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4711,12 +4606,14 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, "node_modules/interpret": { "version": "1.4.0", @@ -4732,6 +4629,7 @@ "version": "1.10.4", "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "license": "MIT", "dependencies": { "fp-ts": "^1.0.0" } @@ -4739,12 +4637,14 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -4769,23 +4669,31 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -4808,6 +4716,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -4816,6 +4725,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", "engines": { "node": ">=8" } @@ -4840,6 +4750,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -4858,6 +4769,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC", "peer": true }, "node_modules/isows": { @@ -4895,7 +4807,8 @@ "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -4918,22 +4831,26 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" }, "node_modules/json-stream-stringify": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==", + "license": "MIT", "engines": { "node": ">=7.10.1" } @@ -4959,9 +4876,10 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", "peer": true, "dependencies": { "universalify": "^2.0.0" @@ -4980,9 +4898,10 @@ } }, "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz", + "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", + "license": "MIT", "peer": true, "engines": { "node": "*" @@ -4993,6 +4912,7 @@ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -5006,6 +4926,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -5034,6 +4955,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", "dependencies": { "package-json": "^8.1.0" }, @@ -5070,7 +4992,8 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/lint-staged": { "version": "16.2.7", @@ -5096,15 +5019,6 @@ "url": "https://opencollective.com/lint-staged" } }, - "node_modules/lint-staged/node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, "node_modules/listr2": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", @@ -5170,12 +5084,12 @@ } }, "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -5205,6 +5119,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -5218,12 +5133,14 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT", "peer": true }, "node_modules/lodash.clonedeep": { @@ -5244,12 +5161,14 @@ "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -5261,70 +5180,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -5345,9 +5200,9 @@ } }, "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", - "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "license": "MIT", "dependencies": { "environment": "^1.0.0" @@ -5389,37 +5244,6 @@ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "license": "MIT" }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -5438,12 +5262,12 @@ } }, "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -5483,6 +5307,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -5493,7 +5318,8 @@ "node_modules/lru_map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "license": "MIT" }, "node_modules/lru-cache": { "version": "10.4.3", @@ -5506,6 +5332,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "license": "ISC", "peer": true }, "node_modules/markdown-table": { @@ -5619,19 +5446,11 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/micro-packed/node_modules/@scure/base": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.5.tgz", - "integrity": "sha512-9rE6EOVeIQzt5TSu4v+K523F8u6DhBsoZWPGKlnCshhlDhy0kJzUX4V+tr2dWmzF1GdekvThABoEQBGBQI7xZw==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -5679,6 +5498,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -5689,39 +5509,45 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" }, "node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.2" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", "peer": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -5744,6 +5570,7 @@ "version": "0.38.5", "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "license": "MIT", "dependencies": { "obliterator": "^2.0.0" } @@ -5783,31 +5610,35 @@ "node": ">= 14.0.0" } }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/mocha/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": ">=10" + "node": ">= 8.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, "node_modules/mocha/node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -5823,18 +5654,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz", - "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -5843,13 +5666,26 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/mocha/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { "node": ">=10" }, @@ -5905,7 +5741,8 @@ "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "license": "MIT" }, "node_modules/node-emoji": { "version": "1.11.0", @@ -5918,9 +5755,10 @@ } }, "node_modules/node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -5954,14 +5792,16 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -5992,14 +5832,16 @@ "peer": true }, "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", + "license": "MIT" }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -6048,14 +5890,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/ox": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.8.1.tgz", - "integrity": "sha512-e+z5epnzV+Zuz91YYujecW8cF01mzmrUtWotJ0oEPym/G82uccs7q0WDHTYL3eiONbTUEvcZrptAKLgTBD3u2A==", + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.12.4.tgz", + "integrity": "sha512-+P+C7QzuwPV8lu79dOwjBKfB2CbnbEXe/hfyyrff1drrO1nOOj3Hc87svHfcW1yneRr3WXaKr6nz11nq+/DF9Q==", "funding": [ { "type": "github", @@ -6067,11 +5910,11 @@ "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", - "@noble/curves": "^1.9.1", + "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", - "abitype": "^1.0.8", + "abitype": "^1.2.3", "eventemitter3": "5.0.1" }, "peerDependencies": { @@ -6084,16 +5927,16 @@ } }, "node_modules/ox/node_modules/@adraffy/ens-normalize": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", - "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", "license": "MIT", "peer": true }, "node_modules/ox/node_modules/@noble/curves": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz", - "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", "license": "MIT", "peer": true, "dependencies": { @@ -6119,49 +5962,18 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/ox/node_modules/@scure/base": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", - "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", - "license": "MIT", - "peer": true, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ox/node_modules/@scure/bip32": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", - "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@noble/curves": "~1.9.0", - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ox/node_modules/@scure/bip39": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", - "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "node_modules/ox/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT", - "peer": true, - "dependencies": { - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } + "peer": true }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", "engines": { "node": ">=12.20" } @@ -6170,6 +5982,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -6184,6 +5997,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -6198,6 +6012,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -6212,6 +6027,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", "dependencies": { "got": "^12.1.0", "registry-auth-token": "^5.0.1", @@ -6232,24 +6048,11 @@ "license": "BlueOak-1.0.0", "peer": true }, - "node_modules/package-json/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/package-json/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -6257,15 +6060,11 @@ "node": ">=10" } }, - "node_modules/package-json/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -6277,6 +6076,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -6294,6 +6094,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { "node": ">=8" } @@ -6302,6 +6103,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -6320,7 +6122,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", @@ -6343,6 +6146,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } @@ -6358,66 +6162,34 @@ } }, "node_modules/pbkdf2": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.3.tgz", - "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", + "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", "license": "MIT", "peer": true, "dependencies": { - "create-hash": "~1.1.3", + "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "ripemd160": "=2.0.1", + "ripemd160": "^2.0.3", "safe-buffer": "^5.2.1", - "sha.js": "^2.4.11", - "to-buffer": "^1.2.0" + "sha.js": "^2.4.12", + "to-buffer": "^1.2.1" }, "engines": { - "node": ">=0.12" - } - }, - "node_modules/pbkdf2/node_modules/create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", - "license": "MIT", - "peer": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "sha.js": "^2.4.0" - } - }, - "node_modules/pbkdf2/node_modules/hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.1" - } - }, - "node_modules/pbkdf2/node_modules/ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", - "license": "MIT", - "peer": true, - "dependencies": { - "hash-base": "^2.0.0", - "inherits": "^2.0.1" + "node": ">= 0.10" } }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -6429,6 +6201,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "license": "MIT", "bin": { "pidtree": "bin/pidtree.js" }, @@ -6450,6 +6223,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", "engines": { "node": ">=4" } @@ -6506,9 +6280,9 @@ } }, "node_modules/prettier-plugin-solidity/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -6517,6 +6291,13 @@ "node": ">=10" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT", + "peer": true + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -6534,7 +6315,8 @@ "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" }, "node_modules/proxy-from-env": { "version": "1.1.0", @@ -6544,9 +6326,10 @@ "peer": true }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -6576,6 +6359,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -6587,19 +6371,21 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" @@ -6609,6 +6395,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -6623,6 +6410,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6631,6 +6419,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6641,14 +6430,16 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/rechoir": { @@ -6676,21 +6467,47 @@ "node": ">=6.0.0" } }, + "node_modules/recursive-readdir/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/reduce-flatten": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "license": "MIT", "peer": true, "engines": { "node": ">=6" } }, "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", + "license": "MIT", "dependencies": { - "@pnpm/npm-conf": "^2.1.0" + "@pnpm/npm-conf": "^3.0.2" }, "engines": { "node": ">=14" @@ -6700,6 +6517,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", "dependencies": { "rc": "1.2.8" }, @@ -6724,6 +6542,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6732,6 +6551,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6740,6 +6560,7 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "license": "MIT", "dependencies": { "path-parse": "^1.0.6" }, @@ -6750,12 +6571,23 @@ "node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } }, "node_modules/responselike": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -6800,14 +6632,17 @@ "license": "MIT" }, "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", "license": "MIT", "peer": true, "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" } }, "node_modules/rlp": { @@ -6864,12 +6699,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/sc-istanbul": { "version": "0.4.6", @@ -6907,6 +6744,17 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/sc-istanbul/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/sc-istanbul/node_modules/glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -6963,6 +6811,19 @@ "node": ">=4" } }, + "node_modules/sc-istanbul/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/sc-istanbul/node_modules/resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -6983,6 +6844,19 @@ "node": ">=0.8.0" } }, + "node_modules/sc-istanbul/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", @@ -7017,6 +6891,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -7058,7 +6933,8 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.12", @@ -7136,6 +7012,17 @@ "node": ">=4" } }, + "node_modules/shelljs/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/shelljs/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -7158,6 +7045,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/shelljs/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -7188,55 +7088,38 @@ } }, "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/solc": { "version": "0.8.26", "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz", "integrity": "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==", + "license": "MIT", "dependencies": { "command-exists": "^1.2.8", "commander": "^8.1.0", @@ -7253,10 +7136,20 @@ "node": ">=10.0.0" } }, + "node_modules/solc/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/solc/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", "bin": { "semver": "bin/semver" } @@ -7293,80 +7186,11 @@ "prettier": "^2.8.3" } }, - "node_modules/solhint/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/solhint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/solhint/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/solhint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/solhint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/solhint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/solhint/node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", "engines": { "node": ">=14" } @@ -7375,6 +7199,8 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7389,34 +7215,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/solhint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/solhint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/solhint/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/solhint/node_modules/minimatch": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz", - "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -7429,6 +7231,7 @@ "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "license": "MIT", "optional": true, "bin": { "prettier": "bin-prettier.js" @@ -7441,12 +7244,10 @@ } }, "node_modules/solhint/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -7454,22 +7255,6 @@ "node": ">=10" } }, - "node_modules/solhint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/solhint/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/solidity-coverage": { "version": "0.8.17", "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.17.tgz", @@ -7504,6 +7289,61 @@ "hardhat": "^2.11.0" } }, + "node_modules/solidity-coverage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/solidity-coverage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT", + "peer": true + }, + "node_modules/solidity-coverage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/solidity-coverage/node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -7519,6 +7359,16 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/solidity-coverage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/solidity-coverage/node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -7542,6 +7392,19 @@ "node": ">=10" } }, + "node_modules/solidity-coverage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/solidity-coverage/node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -7552,10 +7415,24 @@ "node": ">= 4.0.0" } }, + "node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "optional": true, + "peer": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -7565,6 +7442,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7587,9 +7465,10 @@ "peer": true }, "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", + "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", + "license": "MIT", "dependencies": { "type-fest": "^0.7.1" }, @@ -7601,14 +7480,16 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7617,6 +7498,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -7625,6 +7507,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "license": "MIT", "engines": { "node": ">=0.6.19" } @@ -7633,6 +7516,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "license": "WTFPL OR MIT", "peer": true }, "node_modules/string-width": { @@ -7665,10 +7549,30 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7708,6 +7612,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -7716,21 +7621,22 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "peer": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -7746,6 +7652,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "license": "MIT", "peer": true, "dependencies": { "array-back": "^4.0.1", @@ -7761,6 +7668,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -7770,15 +7678,65 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" } }, + "node_modules/table/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" }, "node_modules/through2": { "version": "4.0.2", @@ -7791,12 +7749,13 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", "dependencies": { - "fdir": "^6.4.3", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -7806,9 +7765,13 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -7819,9 +7782,10 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -7833,6 +7797,7 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -7841,9 +7806,9 @@ } }, "node_modules/to-buffer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", - "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", "license": "MIT", "peer": true, "dependencies": { @@ -7859,6 +7824,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -7866,112 +7832,46 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/ts-command-line-args": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", - "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", - "peer": true, - "dependencies": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" - }, - "bin": { - "write-markdown": "dist/write-markdown.js" - } - }, - "node_modules/ts-command-line-args/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ts-command-line-args/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ts-command-line-args/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ts-command-line-args/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/ts-command-line-args/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.6" } }, - "node_modules/ts-command-line-args/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", + "license": "ISC", "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "write-markdown": "dist/write-markdown.js" } }, "node_modules/ts-essentials": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "license": "MIT", "peer": true, "peerDependencies": { "typescript": ">=3.7.0" } }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "license": "MIT", "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -8024,12 +7924,14 @@ "node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" }, "node_modules/tsort": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", + "license": "MIT" }, "node_modules/type-check": { "version": "0.3.2", @@ -8058,6 +7960,7 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -8069,6 +7972,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", + "license": "MIT", "peer": true, "dependencies": { "@types/prettier": "^2.1.1", @@ -8089,10 +7993,22 @@ "typescript": ">=4.3.0" } }, + "node_modules/typechain/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/typechain/node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.1.2", @@ -8107,6 +8023,8 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -8127,15 +8045,30 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, + "node_modules/typechain/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/typechain/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", "peer": true, "bin": { "mkdirp": "bin/cmd.js" @@ -8148,6 +8081,7 @@ "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "license": "MIT", "peer": true, "bin": { "prettier": "bin-prettier.js" @@ -8163,6 +8097,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "peer": true, "engines": { "node": ">= 4.0.0" @@ -8184,9 +8119,9 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", "peer": true, "bin": { @@ -8201,11 +8136,26 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" } }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/undici": { "version": "5.29.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", @@ -8219,14 +8169,17 @@ } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT", + "peer": true }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", "peer": true, "engines": { "node": ">= 10.0.0" @@ -8236,6 +8189,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -8244,6 +8198,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -8258,12 +8213,14 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -8272,12 +8229,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "license": "MIT", "peer": true }, "node_modules/viem": { - "version": "2.31.4", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.31.4.tgz", - "integrity": "sha512-0UZ/asvzl6p44CIBRDbwEcn3HXIQQurBZcMo5qmLhQ8s27Ockk+RYohgTLlpLvkYs8/t4UUEREAbHLuek1kXcw==", + "version": "2.46.3", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.46.3.tgz", + "integrity": "sha512-2LJS+Hyh2sYjHXQtzfv1kU9pZx9dxFzvoU/ZKIcn0FNtOU0HQuIICuYdWtUDFHaGXbAdVo8J1eCvmjkL9JVGwg==", "funding": [ { "type": "github", @@ -8287,14 +8245,14 @@ "license": "MIT", "peer": true, "dependencies": { - "@noble/curves": "1.9.2", + "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", - "abitype": "1.0.8", + "abitype": "1.2.3", "isows": "1.0.7", - "ox": "0.8.1", - "ws": "8.18.2" + "ox": "0.12.4", + "ws": "8.18.3" }, "peerDependencies": { "typescript": ">=5.0.4" @@ -8306,9 +8264,9 @@ } }, "node_modules/viem/node_modules/@noble/curves": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz", - "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", "license": "MIT", "peer": true, "dependencies": { @@ -8334,49 +8292,10 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/viem/node_modules/@scure/base": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", - "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", - "license": "MIT", - "peer": true, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/@scure/bip32": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", - "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@noble/curves": "~1.9.0", - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/@scure/bip39": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", - "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", - "license": "MIT", - "peer": true, - "dependencies": { - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/viem/node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "peer": true, "engines": { @@ -8415,6 +8334,34 @@ "node": ">=8.0.0" } }, + "node_modules/web3-utils/node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "license": "MPL-2.0", + "peer": true, + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/web3-utils/node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "license": "MPL-2.0", + "peer": true, + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/web3-utils/node_modules/@noble/curves": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", @@ -8441,6 +8388,45 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/web3-utils/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/web3-utils/node_modules/ethereum-cryptography": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", @@ -8455,22 +8441,25 @@ } }, "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "license": "MIT", "peer": true, "dependencies": { @@ -8493,6 +8482,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "license": "MIT", "dependencies": { "string-width": "^4.0.0" }, @@ -8521,6 +8511,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "license": "MIT", "peer": true, "dependencies": { "reduce-flatten": "^2.0.0", @@ -8534,6 +8525,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -8549,6 +8541,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8580,81 +8573,17 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT", - "peer": true - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/ws": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -8675,6 +8604,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } @@ -8698,6 +8628,7 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -8724,6 +8655,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "license": "MIT", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -8738,6 +8670,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -8747,6 +8680,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 410beb0..17956ba 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ }, "dependencies": { "@nomicfoundation/hardhat-toolbox": "^6.1.0", - "@openzeppelin/contracts": "^5.0.2", - "@openzeppelin/contracts-upgradeable": "^5.0.2", + "@openzeppelin/contracts": "5.0.2", + "@openzeppelin/contracts-upgradeable": "5.0.2", "@types/js-yaml": "^4.0.9", "ethers": "^6.16.0", "hardhat": "^2.28.6", From 7b71f829a89f108f9c63333426b2a9dbc3e20a7d Mon Sep 17 00:00:00 2001 From: mriynyk Date: Wed, 4 Mar 2026 14:37:01 +0700 Subject: [PATCH 13/14] adds hh vars for private keys --- README.md | 11 ++++++- config.chain.example.yaml | 4 +-- hardhat.config.ts | 17 +++-------- package-lock.json | 60 --------------------------------------- types/environment.ts | 2 +- 5 files changed, 17 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index d20f3f5..88ce900 100644 --- a/README.md +++ b/README.md @@ -50,10 +50,19 @@ This will automatically run the `prepare` script, initializing your configuratio ### Configuration The project uses four YAML-based configuration files: 1. `config.env.yaml`: API keys for Etherscan, CoinMarketCap, and Gas Reporter. -2. `config.chain.yaml`: RPC URLs and deployer private keys per network. +2. `config.chain.yaml`: RPC URLs and deployer wallet aliases per network. 3. `config.collection.yaml`: Parameters for the NFT collection. 4. `config.market.yaml`: Parameters for the marketplace. +### Hardhat Configuration Variables +Actual private keys are not stored in YAML files. Instead, they are managed via [Hardhat Configuration Variables](https://hardhat.org/hardhat-runner/docs/guides/configuration-variables). + +To set a private key for a specific wallet alias (e.g., `sepolia-deployer-wallet`), run: +```bash +npx hardhat vars set sepolia-deployer-wallet +``` +You will be prompted to enter the private key value. + ## Development Lifecycle ### Compilation diff --git a/config.chain.example.yaml b/config.chain.example.yaml index 43d7df1..01d56c9 100644 --- a/config.chain.example.yaml +++ b/config.chain.example.yaml @@ -1,13 +1,13 @@ sepolia: chainId: 11155111 url: '' - deployerPrivateKey: '' + deployerWalletAlias: 'sepolia-deployer-wallet' main: '' wrappedEther: '' ethereum: chainId: 1 url: '' - deployerPrivateKey: '' + deployerWalletAlias: 'ethereum-deployer-wallet' main: '' wrappedEther: '' diff --git a/hardhat.config.ts b/hardhat.config.ts index cc41bfd..415d06f 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,11 +1,8 @@ import fs from 'fs'; import yaml from 'js-yaml'; - -import { parseEther } from 'ethers'; +import { vars } from 'hardhat/config'; import '@nomicfoundation/hardhat-toolbox'; - import './tasks'; - import type { HardhatUserConfig } from 'hardhat/config'; import type { NetworksUserConfig } from 'hardhat/types'; import type { @@ -74,7 +71,7 @@ function buildHardhatConfig(): HardhatUserConfig { const hardhatNetworksConfig: NetworksUserConfig = {}; for (const [chainName, chainConfig] of Object.entries(chainConfigYaml)) { - const { chainId, url, deployerPrivateKey, main, wrappedEther } = chainConfig; + const { chainId, url, deployerWalletAlias, main, wrappedEther } = chainConfig; const protocolConfig: ProtocolConfig = { collection: collectionConfigYaml[chainName], @@ -86,7 +83,7 @@ function buildHardhatConfig(): HardhatUserConfig { hardhatNetworksConfig[chainName] = { chainId, url, - accounts: [deployerPrivateKey], + accounts: [vars.get(deployerWalletAlias)], // @ts-ignore protocolConfig, }; @@ -100,15 +97,9 @@ function buildHardhatConfig(): HardhatUserConfig { }; } - if (envConfigYaml.fork.name) { + if (envConfigYaml.fork.name && chainConfigYaml[envConfigYaml.fork.name].url) { hardhatNetworksConfig['hardhat'] = { forking: { url: chainConfigYaml[envConfigYaml.fork.name].url }, - accounts: [ - { - privateKey: chainConfigYaml[envConfigYaml.fork.name].deployerPrivateKey, - balance: parseEther('100').toString(), - }, - ], }; } diff --git a/package-lock.json b/package-lock.json index 9ef3441..10acc91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,17 +61,6 @@ "integrity": "sha512-wS5kg8u0KCML1UeHQPJ1IuOI24x/XLentCzsqPER1+gDNC5Cz2hG4G2blLOZap+3CEGhIhnJ9mmZYj6a2W0Lww==", "license": "(Apache-2.0 WITH LLVM-exception)" }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -1215,17 +1204,6 @@ "@openzeppelin/contracts": "5.0.2" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", @@ -1812,17 +1790,6 @@ "ajv": ">=5.0.0" } }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "license": "BSD-3-Clause OR MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.4.2" - } - }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -7415,19 +7382,6 @@ "node": ">= 4.0.0" } }, - "node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", - "optional": true, - "peer": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -8142,20 +8096,6 @@ "node": ">=8" } }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/undici": { "version": "5.29.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", diff --git a/types/environment.ts b/types/environment.ts index 4452204..d3ef75b 100644 --- a/types/environment.ts +++ b/types/environment.ts @@ -19,7 +19,7 @@ export type ChainConfigYaml = { type ChainConfig = { chainId: number; url: string; - deployerPrivateKey: string; + deployerWalletAlias: string; main: string; wrappedEther: string; }; From 029cef26db1c054d2c4ec41b000a9a4f48bcc60c Mon Sep 17 00:00:00 2001 From: mriynyk Date: Sat, 7 Mar 2026 17:01:18 +0700 Subject: [PATCH 14/14] minor chain config example update --- config.chain.example.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.chain.example.yaml b/config.chain.example.yaml index 01d56c9..a9ddaa3 100644 --- a/config.chain.example.yaml +++ b/config.chain.example.yaml @@ -1,13 +1,13 @@ sepolia: chainId: 11155111 url: '' - deployerWalletAlias: 'sepolia-deployer-wallet' + deployerWalletAlias: 'digital-original-sepolia-deployer-wallet' main: '' wrappedEther: '' ethereum: chainId: 1 url: '' - deployerWalletAlias: 'ethereum-deployer-wallet' + deployerWalletAlias: 'digital-original-ethereum-deployer-wallet' main: '' wrappedEther: ''