diff --git a/.gitignore b/.gitignore index 2e4b760..1bfe5d4 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ artifacts/ .vscode typechain-types scripts/safe/*.json +scripts/deployStakingRewards/*testnet*.json \ No newline at end of file diff --git a/README.md b/README.md index 0d934eb..7aad7f2 100644 --- a/README.md +++ b/README.md @@ -189,4 +189,4 @@ All upgrades go through the Timelock (2-day minimum delay): ## Security Audits 1. [HALBORN](https://www.halborn.com/audits) has performed a security audit of `BillionsNetworkToken` smart contract and compiled report on Dec 5, 2025: [billions-token-7661d8](https://github.com/BillionsNetwork/billions-token/blob/main/audits/Billions_Token_SSC.pdf). -2. [HALBORN](https://www.halborn.com/audits) has performed a security audit of `StakingRewards` smart contract and compiled report on Jan 5, 2026: [staking-rewards-0b472f](https://github.com/BillionsNetwork/billions-token/blob/main/audits/Staking_Rewards_SSC.pdf). \ No newline at end of file +2. [HALBORN](https://www.halborn.com/audits) has performed a security audit of `StakingRewards` smart contract and compiled report on Jan 5, 2026: [staking-rewards-0b472f](https://github.com/BillionsNetwork/billions-token/blob/main/audits/Staking_Rewards_SSC.pdf). diff --git a/contracts/staking/StakingRewards.sol b/contracts/staking/StakingRewards.sol index adcfba1..d410676 100644 --- a/contracts/staking/StakingRewards.sol +++ b/contracts/staking/StakingRewards.sol @@ -3,10 +3,10 @@ pragma solidity 0.8.30; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; - +// solhint-disable-next-line max-line-length +import {AccessControlDefaultAdminRulesUpgradeable} from "@openzeppelin/contracts-upgradeable/access/extensions/AccessControlDefaultAdminRulesUpgradeable.sol"; import {IStakingRewards} from "./interfaces/IStakingRewards.sol"; /** @@ -37,13 +37,11 @@ import {IStakingRewards} from "./interfaces/IStakingRewards.sol"; * * Contract Consolidation: * - Merged RewardsDistributionRecipient logic directly into StakingRewards contract - * - Added RewardsDistributionUpdated event for better event tracking * * Admin Functions: - * - Added pause() and unpause() functions for owner control + * - Added pause() and unpause() functions for onlyRole(DEFAULT_ADMIN_ROLE) control * - Made rewardsDuration configurable via initialize() parameter - * - Refactored setRewardsDistribution() and setRewardsDuration() to use internal functions - * - Created _setRewardsDistribution() internal function for code reuse + * - Refactored setRewardsDuration() to use internal functions * - Created _setRewardsDuration() internal function for code reuse * - Both internal functions are called by initialize() and their respective public functions * - _setRewardsDuration() includes periodFinish check to prevent changing duration during active reward periods @@ -64,9 +62,9 @@ import {IStakingRewards} from "./interfaces/IStakingRewards.sol"; * - Added LockedStake struct to interface for external accessibility * * Security & Input Validation: - * - Added zero address validation in initialize() for owner, rewardsDistribution, rewardsToken, stakingToken + * - Added zero address validation in initialize() for onlyRole(DEFAULT_ADMIN_ROLE), + * rewardsDistribution, rewardsToken, stakingToken * - Added zero value validation for rewardsDuration in initialize() and setRewardsDuration() - * - Added zero address validation in setRewardsDistribution() * - Fixed notifyRewardAmount() balance check when stakingToken == rewardsToken (subtracts _totalSupply) * - Added StakeLocked event for lock tracking * - Added NatSpec documentation to all functions @@ -75,11 +73,15 @@ import {IStakingRewards} from "./interfaces/IStakingRewards.sol"; */ contract StakingRewards is IStakingRewards, - Ownable2StepUpgradeable, + AccessControlDefaultAdminRulesUpgradeable, ReentrancyGuardUpgradeable, PausableUpgradeable { using SafeERC20 for IERC20; + bytes32 public constant STAKER_ON_BEHALF_ROLE = keccak256("STAKER_ON_BEHALF_ROLE"); + bytes32 public constant REWARDS_DISTRIBUTOR_ROLE = keccak256("REWARDS_DISTRIBUTOR_ROLE"); + uint256 public constant MAX_INITIAL_LOCK_PERIOD_DURATION = 730 days; + uint48 public constant DEFAULT_INITIAL_DELAY = 2 days; /* ========== STATE VARIABLES ========== */ @@ -90,7 +92,6 @@ contract StakingRewards is uint256 public rewardsDuration; uint256 public lastUpdateTime; uint256 public rewardPerTokenStored; - address public rewardsDistribution; mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public rewards; @@ -102,6 +103,13 @@ contract StakingRewards is mapping(address => LockedStake) public addressToLockedStake; + uint256 public initialLockPeriodFinish; + uint256 public initialLockPeriodDuration; + + /// @dev Reserved storage gap for future upgrades. Reduces the gap by 1 for each new + /// state variable added to this contract in subsequent versions. + uint256[50] private __gap; + /* ========== CONSTRUCTOR ========== */ /// @custom:oz-upgrades-unsafe-allow constructor @@ -125,18 +133,19 @@ contract StakingRewards is uint256 _rewardsDuration ) external initializer { require(_owner != address(0), "Owner cannot be zero address"); + require(_rewardsDistribution != address(0), "RewardsDistribution cannot be zero address"); require(_rewardsToken != address(0), "RewardsToken cannot be zero address"); require(_stakingToken != address(0), "StakingToken cannot be zero address"); // Initialize inherited OZ contracts - __Ownable_init(_owner); + __AccessControlDefaultAdminRules_init(DEFAULT_INITIAL_DELAY, _owner); __ReentrancyGuard_init(); __Pausable_init(); rewardsToken = IERC20(_rewardsToken); stakingToken = IERC20(_stakingToken); - _setRewardsDistribution(_rewardsDistribution); + _grantRole(REWARDS_DISTRIBUTOR_ROLE, _rewardsDistribution); _setRewardsDuration(_rewardsDuration); } @@ -220,12 +229,21 @@ contract StakingRewards is * @dev Tokens are staked unlocked by default. Use lockStake() to lock staked tokens. * @param amount The amount of tokens to stake */ - function stake(uint256 amount) public nonReentrant whenNotPaused updateReward(msg.sender) { - require(amount > 0, "Cannot stake 0"); - _totalSupply = _totalSupply + amount; - _balances[msg.sender] = _balances[msg.sender] + amount; - stakingToken.safeTransferFrom(msg.sender, address(this), amount); - emit Staked(msg.sender, amount); + function stake(uint256 amount) public nonReentrant whenNotPaused { + _stake(msg.sender, amount); + } + + /** + * @notice Stakes tokens on behalf of an account + * @dev Tokens are staked unlocked by default. Use stakeAndLockOnBehalf to lock staked tokens. + * @param account The address on whose behalf to stake + * @param amount The amount of tokens to stake + */ + function stakeOnBehalf( + address account, + uint256 amount + ) public nonReentrant whenNotPaused onlyRole(STAKER_ON_BEHALF_ROLE) { + _stake(account, amount); } /** @@ -237,35 +255,8 @@ contract StakingRewards is * @param amount The amount of staked tokens to lock * @param lockDuration The duration in seconds to lock the tokens */ - function lockStake(uint256 amount, uint256 lockDuration) public whenNotPaused { - require(lockDuration > 0, "Lock duration must be greater than 0"); - require(amount > 0, "Amount must be greater than 0"); - - // Check that user has enough unlocked staked balance to lock - uint256 currentLockedStakeAmount = getLockedStakeAmount(msg.sender); - uint256 newUnlockTimestamp = block.timestamp + lockDuration; - - // Check if user has any locked tokens - if (currentLockedStakeAmount != 0) { - require( - amount >= currentLockedStakeAmount, - "Cannot reduce the amount of locked tokens" - ); - require( - newUnlockTimestamp >= addressToLockedStake[msg.sender].unlockTimestamp, - "Cannot shorten the lock duration" - ); - } - - // Check that user has enough staked balance to lock - require(_balances[msg.sender] >= amount, "Not enough staked balance to lock"); - - // Update the locked tokens - addressToLockedStake[msg.sender].lockDuration = lockDuration; - addressToLockedStake[msg.sender].unlockTimestamp = newUnlockTimestamp; - addressToLockedStake[msg.sender].amount = amount; - - emit StakeLocked(msg.sender, amount, lockDuration); + function lockStake(uint256 amount, uint256 lockDuration) public nonReentrant whenNotPaused { + _lockStake(msg.sender, amount, lockDuration); } /** @@ -279,9 +270,32 @@ contract StakingRewards is uint256 amountToStake, uint256 amountToLock, uint256 lockDuration - ) public { - stake(amountToStake); - lockStake(amountToLock, lockDuration); + ) public nonReentrant whenNotPaused { + _stake(msg.sender, amountToStake); + _lockStake(msg.sender, amountToLock, lockDuration); + } + + /** + * @notice Stakes and accumulate locks tokens on behalf of an account for a specified duration + * @dev Can only be called by the authorized stakerOnBehalf address. If the account already has a locked stake, + * the new lock duration will be the maximum of the existing unlock timestamp and the new lock duration. + * @param account The address on whose behalf to stake and lock + * @param amount The amount of tokens to stake and accumulate to lock + * @param lockDuration The duration in seconds to lock all the tokens + */ + function stakeAndLockOnBehalf( + address account, + uint256 amount, + uint256 lockDuration + ) public nonReentrant whenNotPaused onlyRole(STAKER_ON_BEHALF_ROLE) { + uint256 currentLockedStakeAmount = getLockedStakeAmount(account); + if (currentLockedStakeAmount > 0) { + if (block.timestamp + lockDuration < addressToLockedStake[account].unlockTimestamp) { + lockDuration = addressToLockedStake[account].unlockTimestamp - block.timestamp; + } + } + _stake(account, amount); + _lockStake(account, currentLockedStakeAmount + amount, lockDuration); } /** @@ -292,6 +306,11 @@ contract StakingRewards is function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) { require(amount > 0, "Cannot withdraw 0"); + require( + block.timestamp >= initialLockPeriodFinish, + "Withdraw not allowed during initial lock period" + ); + // Check if there are any locked tokens uint256 lockedStakeAmount = getLockedStakeAmount(msg.sender); @@ -311,6 +330,10 @@ contract StakingRewards is * @notice Claims all pending rewards for the caller */ function getReward() public nonReentrant updateReward(msg.sender) { + require( + block.timestamp >= initialLockPeriodFinish, + "Get rewards not allowed during initial lock period" + ); uint256 reward = rewards[msg.sender]; if (reward > 0) { rewards[msg.sender] = 0; @@ -323,7 +346,10 @@ contract StakingRewards is * @notice Withdraws all unlocked staked tokens and claims rewards */ function exit() external { - withdraw(_balances[msg.sender] - getLockedStakeAmount(msg.sender)); + uint256 withdrawAmount = _balances[msg.sender] - getLockedStakeAmount(msg.sender); + if (withdrawAmount > 0) { + withdraw(withdrawAmount); + } getReward(); } @@ -336,7 +362,7 @@ contract StakingRewards is */ function notifyRewardAmount( uint256 reward - ) external onlyRewardsDistribution updateReward(address(0)) { + ) external onlyRole(REWARDS_DISTRIBUTOR_ROLE) updateReward(address(0)) { if (block.timestamp >= periodFinish) { rewardRate = reward / rewardsDuration; } else { @@ -362,11 +388,22 @@ contract StakingRewards is } /** - * @notice Sets the rewards distribution address - * @param _rewardsDistribution The address authorized to call notifyRewardAmount + * @notice Sets the initial period during which withdrawals and get rewards are not allowed + * @param duration The duration in seconds for which withdrawals and get rewards are not allowed */ - function setRewardsDistribution(address _rewardsDistribution) external onlyOwner { - _setRewardsDistribution(_rewardsDistribution); + function setInitialLockPeriod(uint256 duration) external onlyRole(DEFAULT_ADMIN_ROLE) { + require(duration > 0, "Initial lock period must be greater than 0"); + require( + duration <= MAX_INITIAL_LOCK_PERIOD_DURATION, + "Initial lock period cannot be longer than 2 years" + ); + require( + block.timestamp >= initialLockPeriodFinish, + "Previous initial lock period must be complete before changing the duration for the new period" + ); + initialLockPeriodDuration = duration; + initialLockPeriodFinish = block.timestamp + duration; + emit InitialLockPeriodUpdated(duration); } /** @@ -376,7 +413,10 @@ contract StakingRewards is * @param tokenAddress The address of the token to recover * @param tokenAmount The amount of tokens to recover */ - function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner { + function recoverERC20( + address tokenAddress, + uint256 tokenAmount + ) external onlyRole(DEFAULT_ADMIN_ROLE) { require(tokenAmount > 0, "Cannot recover 0 tokens"); if (tokenAddress == address(stakingToken)) { // Protect user staked tokens @@ -391,36 +431,82 @@ contract StakingRewards is * @notice Sets the rewards duration for future reward periods * @param _rewardsDuration The duration in seconds for reward distribution */ - function setRewardsDuration(uint256 _rewardsDuration) external onlyOwner { + function setRewardsDuration(uint256 _rewardsDuration) external onlyRole(DEFAULT_ADMIN_ROLE) { _setRewardsDuration(_rewardsDuration); } /** * @notice Pauses staking functionality - * @dev Only owner can pause. Withdrawals and reward claims remain available + * @dev Only admin can pause. Withdrawals and reward claims remain available */ - function pause() external onlyOwner { + function pause() external onlyRole(DEFAULT_ADMIN_ROLE) { _pause(); } /** * @notice Unpauses staking functionality - * @dev Only owner can unpause + * @dev Only admin can unpause */ - function unpause() external onlyOwner { + function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) { _unpause(); } /* ========== INTERNAL FUNCTIONS ========== */ /** - * @notice Internal function to set the rewards distribution address - * @param _rewardsDistribution The address authorized to call notifyRewardAmount + * @notice Stakes tokens + * @dev Tokens are staked unlocked by default. Use lockStake() to lock staked tokens. + * @param account The address on whose behalf to stake + * @param amount The amount of tokens to stake */ - function _setRewardsDistribution(address _rewardsDistribution) internal { - require(_rewardsDistribution != address(0), "RewardsDistribution cannot be zero address"); - rewardsDistribution = _rewardsDistribution; - emit RewardsDistributionUpdated(_rewardsDistribution); + function _stake(address account, uint256 amount) internal updateReward(account) { + require(account != address(0), "Cannot stake for the zero address"); + require(amount > 0, "Cannot stake 0"); + _totalSupply = _totalSupply + amount; + _balances[account] = _balances[account] + amount; + stakingToken.safeTransferFrom(msg.sender, address(this), amount); + emit Staked(account, amount); + } + + /** + * @notice Locks staked tokens for a specified duration + * @dev User must have enough staked balance to cover the new lock amount. If a lock already exists, + * the new amount cannot be less than the currently locked amount and the new unlock timestamp + * cannot be earlier than the current unlock timestamp. Increasing the lock amount uses additional + * unlocked staked balance on top of the already locked tokens. + * @param account The address on whose behalf to lock the tokens + * @param amount The amount of staked tokens to lock + * @param lockDuration The duration in seconds to lock the tokens + */ + function _lockStake(address account, uint256 amount, uint256 lockDuration) internal { + require(lockDuration > 0, "Lock duration must be greater than 0"); + require(amount > 0, "Amount must be greater than 0"); + + // Check that user has enough unlocked staked balance to lock + uint256 currentLockedStakeAmount = getLockedStakeAmount(account); + uint256 newUnlockTimestamp = block.timestamp + lockDuration; + + // Check if user has any locked tokens + if (currentLockedStakeAmount != 0) { + require( + amount >= currentLockedStakeAmount, + "Cannot reduce the amount of locked tokens" + ); + require( + newUnlockTimestamp >= addressToLockedStake[account].unlockTimestamp, + "Cannot shorten the lock duration" + ); + } + + // Check that user has enough staked balance to lock + require(_balances[account] >= amount, "Not enough staked balance to lock"); + + // Update the locked tokens + addressToLockedStake[account].lockDuration = lockDuration; + addressToLockedStake[account].unlockTimestamp = newUnlockTimestamp; + addressToLockedStake[account].amount = amount; + + emit StakeLocked(account, amount, lockDuration); } /** @@ -439,11 +525,6 @@ contract StakingRewards is /* ========== MODIFIERS ========== */ - modifier onlyRewardsDistribution() { - require(msg.sender == rewardsDistribution, "Caller is not RewardsDistribution contract"); - _; - } - modifier updateReward(address account) { rewardPerTokenStored = rewardPerToken(); lastUpdateTime = lastTimeRewardApplicable(); @@ -453,15 +534,4 @@ contract StakingRewards is } _; } - - /* ========== EVENTS ========== */ - - event RewardAdded(uint256 reward); - event Staked(address indexed user, uint256 amount); - event Withdrawn(address indexed user, uint256 amount); - event RewardPaid(address indexed user, uint256 reward); - event RewardsDurationUpdated(uint256 newDuration); - event Recovered(address token, uint256 amount); - event RewardsDistributionUpdated(address indexed newRewardsDistribution); - event StakeLocked(address indexed user, uint256 amount, uint256 lockDuration); } diff --git a/contracts/staking/interfaces/IStakingRewards.sol b/contracts/staking/interfaces/IStakingRewards.sol index 609a9cc..b4377ce 100644 --- a/contracts/staking/interfaces/IStakingRewards.sol +++ b/contracts/staking/interfaces/IStakingRewards.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; +pragma solidity 0.8.30; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; @@ -33,10 +33,12 @@ interface IStakingRewards { function rewardPerTokenStored() external view returns (uint256); - function rewardsDistribution() external view returns (address); - function userRewardPerTokenPaid(address account) external view returns (uint256); + function initialLockPeriodFinish() external view returns (uint256); + + function initialLockPeriodDuration() external view returns (uint256); + function rewards(address account) external view returns (uint256); function totalSupply() external view returns (uint256); @@ -61,6 +63,8 @@ interface IStakingRewards { function stake(uint256 amount) external; + function stakeOnBehalf(address account, uint256 amount) external; + function withdraw(uint256 amount) external; function lockStake(uint256 amount, uint256 lockDuration) external; @@ -71,6 +75,8 @@ interface IStakingRewards { uint256 lockDuration ) external; + function stakeAndLockOnBehalf(address account, uint256 amount, uint256 lockDuration) external; + function getReward() external; function exit() external; @@ -79,8 +85,6 @@ interface IStakingRewards { function notifyRewardAmount(uint256 reward) external; - function setRewardsDistribution(address _rewardsDistribution) external; - function recoverERC20(address tokenAddress, uint256 tokenAmount) external; function setRewardsDuration(uint256 _rewardsDuration) external; @@ -88,4 +92,17 @@ interface IStakingRewards { function pause() external; function unpause() external; + + function setInitialLockPeriod(uint256 duration) external; + + /* ========== EVENTS ========== */ + + event RewardAdded(uint256 reward); + event Staked(address indexed user, uint256 amount); + event Withdrawn(address indexed user, uint256 amount); + event RewardPaid(address indexed user, uint256 reward); + event RewardsDurationUpdated(uint256 newDuration); + event Recovered(address token, uint256 amount); + event StakeLocked(address indexed user, uint256 amount, uint256 lockDuration); + event InitialLockPeriodUpdated(uint256 newDuration); } diff --git a/package-lock.json b/package-lock.json index 1a3e0de..e9dee28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -949,6 +949,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" @@ -1028,6 +1029,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/abstract-provider": "^5.8.0", @@ -1083,6 +1085,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", @@ -1113,6 +1116,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -1133,7 +1137,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@ethersproject/keccak256": { "version": "5.8.0", @@ -1205,6 +1210,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" @@ -1244,6 +1250,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -1272,6 +1279,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -1303,6 +1311,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" @@ -1343,6 +1352,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", @@ -1388,6 +1398,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -1460,6 +1471,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/constants": "^5.8.0", @@ -1481,6 +1493,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -1537,6 +1550,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", @@ -1805,6 +1819,7 @@ "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", "run-parallel": "^1.1.9" @@ -1818,6 +1833,7 @@ "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" } @@ -1827,6 +1843,7 @@ "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", "fastq": "^1.6.0" @@ -2208,6 +2225,7 @@ "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": { "@ethersproject/address": "5.6.1", "@nomicfoundation/solidity-analyzer": "^0.1.1", @@ -2235,6 +2253,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.6.2", "@ethersproject/bytes": "^5.6.1", @@ -2248,6 +2267,7 @@ "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", "license": "MIT", + "peer": true, "dependencies": { "nofilter": "^3.1.0" }, @@ -2259,7 +2279,8 @@ "version": "0.15.13", "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.13.tgz", "integrity": "sha512-HbTszdN1iDHCkUS9hLeooqnLEW2U45FaqFwFEYT8nIno2prFZhG+n68JEERjmfFCB5u0WgbuJwk3CgLoqtSL7Q==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@nomicfoundation/slang": { "version": "0.18.3", @@ -3479,6 +3500,7 @@ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", "license": "MIT", + "peer": true, "dependencies": { "antlr4ts": "^0.5.0-alpha.4" } @@ -3552,6 +3574,7 @@ "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" }, @@ -3567,6 +3590,7 @@ "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", @@ -3598,6 +3622,7 @@ "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", "license": "MIT", + "peer": true, "dependencies": { "@types/chai": "*" } @@ -3607,6 +3632,7 @@ "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*" } @@ -3616,6 +3642,7 @@ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*" } @@ -3625,6 +3652,7 @@ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "license": "MIT", + "peer": true, "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -3640,7 +3668,8 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/mocha": { "version": "10.0.10", @@ -3654,7 +3683,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.12.tgz", "integrity": "sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -3672,13 +3700,15 @@ "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" + "license": "MIT", + "peer": true }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/secp256k1": { "version": "4.0.7", @@ -3705,7 +3735,8 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/acorn": { "version": "8.15.0", @@ -3776,7 +3807,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -3844,6 +3874,7 @@ "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "license": "BSD-3-Clause OR MIT", "optional": true, + "peer": true, "engines": { "node": ">=0.4.2" } @@ -3909,7 +3940,8 @@ "version": "0.5.0-alpha.4", "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/anymatch": { "version": "3.1.3", @@ -3941,6 +3973,7 @@ "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" } @@ -3950,6 +3983,7 @@ "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" } @@ -3959,6 +3993,7 @@ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -3967,13 +4002,15 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "license": "MIT", + "peer": true, "engines": { "node": "*" } @@ -3997,7 +4034,8 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/async-retry": { "version": "1.3.3", @@ -4019,6 +4057,7 @@ "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" } @@ -4091,7 +4130,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/better-ajv-errors": { "version": "2.0.3", @@ -4436,13 +4476,15 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/cbor": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "license": "MIT", + "peer": true, "dependencies": { "nofilter": "^3.1.0" }, @@ -4474,6 +4516,7 @@ "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", "license": "WTFPL", + "peer": true, "dependencies": { "check-error": "^1.0.2" }, @@ -4502,6 +4545,7 @@ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "license": "BSD-3-Clause", + "peer": true, "engines": { "node": "*" } @@ -4511,6 +4555,7 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "license": "MIT", + "peer": true, "dependencies": { "get-func-name": "^2.0.2" }, @@ -4609,6 +4654,7 @@ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "license": "MIT", + "peer": true, "dependencies": { "object-assign": "^4.1.0", "string-width": "^2.1.1" @@ -4625,6 +4671,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -4634,6 +4681,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -4643,6 +4691,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "license": "MIT", + "peer": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -4656,6 +4705,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^3.0.0" }, @@ -4706,6 +4756,7 @@ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.1.90" } @@ -4733,6 +4784,7 @@ "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", "find-replace": "^3.0.0", @@ -4748,6 +4800,7 @@ "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", "chalk": "^2.4.2", @@ -4763,6 +4816,7 @@ "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" }, @@ -4775,6 +4829,7 @@ "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" } @@ -4784,6 +4839,7 @@ "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", @@ -4798,6 +4854,7 @@ "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" } @@ -4806,13 +4863,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "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.8.0" } @@ -4822,6 +4881,7 @@ "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" } @@ -4831,6 +4891,7 @@ "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" }, @@ -4843,6 +4904,7 @@ "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" } @@ -4870,6 +4932,7 @@ "node >= 0.8" ], "license": "MIT", + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -4881,13 +4944,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/concat-stream/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", @@ -4902,13 +4967,15 @@ "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" + "license": "MIT", + "peer": true }, "node_modules/concat-stream/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" } @@ -5031,6 +5098,7 @@ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "license": "BSD-3-Clause", + "peer": true, "engines": { "node": "*" } @@ -5044,7 +5112,8 @@ "node_modules/death": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==" + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", + "peer": true }, "node_modules/debug": { "version": "4.4.3", @@ -5107,6 +5176,7 @@ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "license": "MIT", + "peer": true, "dependencies": { "type-detect": "^4.0.0" }, @@ -5127,7 +5197,8 @@ "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" + "license": "MIT", + "peer": true }, "node_modules/defaults": { "version": "1.0.4", @@ -5207,6 +5278,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "peer": true, "dependencies": { "heap": ">= 0.2.0" }, @@ -5219,6 +5291,7 @@ "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" }, @@ -5393,6 +5466,7 @@ "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", "estraverse": "^1.9.1", @@ -5415,6 +5489,7 @@ "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", "esvalidate": "bin/esvalidate.js" @@ -5427,6 +5502,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -5436,6 +5512,7 @@ "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" } @@ -5445,6 +5522,7 @@ "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz", "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==", "license": "MIT", + "peer": true, "dependencies": { "@solidity-parser/parser": "^0.14.0", "axios": "^1.5.1", @@ -5479,13 +5557,15 @@ "url": "https://paulmillr.com/funding/" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/eth-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, "funding": { "url": "https://paulmillr.com/funding/" } @@ -5501,6 +5581,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@noble/hashes": "~1.2.0", "@noble/secp256k1": "~1.7.0", @@ -5518,6 +5599,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@noble/hashes": "~1.2.0", "@scure/base": "~1.1.0" @@ -5528,6 +5610,7 @@ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "license": "MIT", + "peer": true, "dependencies": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", @@ -5550,6 +5633,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@ethersproject/abi": "5.8.0", "@ethersproject/abstract-provider": "5.8.0", @@ -5588,6 +5672,7 @@ "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": { "@noble/hashes": "^1.4.0" } @@ -5597,6 +5682,7 @@ "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" }, @@ -5658,7 +5744,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", @@ -5692,6 +5777,7 @@ "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", "number-to-bn": "1.7.0" @@ -5752,6 +5838,7 @@ "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", @@ -5773,7 +5860,8 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fast-uri": { "version": "3.1.0", @@ -5814,6 +5902,7 @@ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "license": "ISC", + "peer": true, "dependencies": { "reusify": "^1.0.4" } @@ -5841,6 +5930,7 @@ "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" }, @@ -5972,7 +6062,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -5980,20 +6071,6 @@ "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" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -6017,6 +6094,7 @@ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "license": "MIT", + "peer": true, "engines": { "node": "*" } @@ -6050,6 +6128,7 @@ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -6084,6 +6163,7 @@ "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", "node-emoji": "^1.10.0" @@ -6097,6 +6177,7 @@ "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" }, @@ -6109,6 +6190,7 @@ "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", @@ -6123,6 +6205,7 @@ "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" } @@ -6131,13 +6214,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "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" } @@ -6147,6 +6232,7 @@ "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" } @@ -6156,6 +6242,7 @@ "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" }, @@ -6206,6 +6293,7 @@ "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" }, @@ -6218,6 +6306,7 @@ "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", @@ -6232,6 +6321,7 @@ "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", "array-union": "^2.1.0", @@ -6252,6 +6342,7 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6315,6 +6406,7 @@ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "license": "MIT", + "peer": true, "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -6336,6 +6428,7 @@ "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" } @@ -6345,7 +6438,6 @@ "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.28.6.tgz", "integrity": "sha512-zQze7qe+8ltwHvhX5NQ8sN1N37WWZGw8L63y+2XcPxGwAjc/SMF829z3NS6o1krX0sryhAsVBK/xrwUqlsot4Q==", "license": "MIT", - "peer": true, "dependencies": { "@ethereumjs/util": "^9.1.0", "@ethersproject/abi": "^5.1.2", @@ -6677,7 +6769,8 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/hmac-drbg": { "version": "1.0.1", @@ -6695,6 +6788,7 @@ "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", "license": "MIT", + "peer": true, "dependencies": { "caseless": "^0.12.0", "concat-stream": "^1.6.2", @@ -6732,6 +6826,7 @@ "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", "license": "MIT", + "peer": true, "dependencies": { "@types/node": "^10.0.3" } @@ -6740,7 +6835,8 @@ "version": "10.17.60", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/http2-wrapper": { "version": "2.2.1", @@ -6814,6 +6910,7 @@ "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.2.tgz", "integrity": "sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -6887,6 +6984,7 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.10" } @@ -6989,6 +7087,7 @@ "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", "npm": ">=3" @@ -7162,13 +7261,15 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", + "peer": true, "bin": { "json5": "lib/cli.js" }, @@ -7211,6 +7312,7 @@ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz", "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", "license": "MIT", + "peer": true, "engines": { "node": "*" } @@ -7244,6 +7346,7 @@ "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" } @@ -7262,6 +7365,7 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -7295,6 +7399,7 @@ "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", "type-check": "~0.3.2" @@ -7334,20 +7439,23 @@ "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" + "license": "MIT", + "peer": true }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.truncate": { "version": "4.4.2", @@ -7388,6 +7496,7 @@ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "license": "MIT", + "peer": true, "dependencies": { "get-func-name": "^2.0.1" } @@ -7420,7 +7529,8 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -7455,6 +7565,7 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 8" } @@ -7501,7 +7612,8 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/micro-packed": { "version": "0.7.3", @@ -7611,6 +7723,7 @@ "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" }, @@ -7736,6 +7849,7 @@ "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "json-stringify-safe": "^5.0.1", "minimist": "^1.2.5", @@ -7754,7 +7868,8 @@ "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" + "license": "MIT", + "peer": true }, "node_modules/node-abi": { "version": "3.87.0", @@ -7791,6 +7906,7 @@ "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" } @@ -7864,6 +7980,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "license": "ISC", + "peer": true, "dependencies": { "abbrev": "1" }, @@ -7897,6 +8014,7 @@ "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", "strip-hex-prefix": "1.0.0" @@ -7911,6 +8029,7 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -7920,6 +8039,7 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -7987,6 +8107,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "license": "MIT", + "peer": true, "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -8026,7 +8147,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/os-tmpdir": { "version": "1.0.2", @@ -8136,7 +8258,8 @@ "node_modules/parse-cache-control": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "peer": true }, "node_modules/parse-json": { "version": "5.2.0", @@ -8244,6 +8367,7 @@ "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" } @@ -8277,6 +8401,7 @@ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "license": "MIT", + "peer": true, "engines": { "node": "*" } @@ -8321,6 +8446,7 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -8374,6 +8500,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -8383,7 +8510,6 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -8451,6 +8577,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "license": "MIT", + "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -8460,6 +8587,7 @@ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "license": "MIT", + "peer": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -8524,6 +8652,7 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "side-channel": "^1.1.0" }, @@ -8552,7 +8681,8 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/quick-lru": { "version": "5.1.1", @@ -8619,7 +8749,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -8671,6 +8800,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "peer": true, "dependencies": { "resolve": "^1.1.6" }, @@ -8683,6 +8813,7 @@ "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" }, @@ -8695,6 +8826,7 @@ "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" } @@ -8703,8 +8835,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -8747,6 +8878,7 @@ "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", "license": "MIT", + "peer": true, "dependencies": { "req-from": "^2.0.0" }, @@ -8759,6 +8891,7 @@ "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", "license": "MIT", + "peer": true, "dependencies": { "resolve-from": "^3.0.0" }, @@ -8813,6 +8946,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -8859,6 +8993,7 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", + "peer": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -8908,6 +9043,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "queue-microtask": "^1.2.2" } @@ -8952,6 +9088,7 @@ "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", "async": "1.x", @@ -8977,6 +9114,7 @@ "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" } @@ -8987,6 +9125,7 @@ "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", + "peer": true, "dependencies": { "inflight": "^1.0.4", "inherits": "2", @@ -9003,6 +9142,7 @@ "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" } @@ -9012,6 +9152,7 @@ "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", "esprima": "^4.0.0" @@ -9025,6 +9166,7 @@ "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", "esvalidate": "bin/esvalidate.js" @@ -9037,13 +9179,15 @@ "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" + "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" }, @@ -9159,6 +9303,7 @@ "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "charenc": ">= 0.0.1", "crypt": ">= 0.0.1" @@ -9193,6 +9338,7 @@ "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", "interpret": "^1.0.0", @@ -9211,6 +9357,7 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9231,6 +9378,7 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -9250,6 +9398,7 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -9266,6 +9415,7 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -9284,6 +9434,7 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -9353,13 +9504,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/slash": { "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" } @@ -9533,6 +9686,7 @@ "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.17.tgz", "integrity": "sha512-5P8vnB6qVX9tt1MfuONtCTEaEGO/O4WuEidPHIAJjx4sktHHKhO3rFvnE0q8L30nWJPTrcqGQMT7jpE29B2qow==", "license": "ISC", + "peer": true, "dependencies": { "@ethersproject/abi": "^5.0.9", "@solidity-parser/parser": "^0.20.1", @@ -9565,13 +9719,15 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.20.2.tgz", "integrity": "sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "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" }, @@ -9584,6 +9740,7 @@ "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", @@ -9598,6 +9755,7 @@ "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" } @@ -9606,13 +9764,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "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" } @@ -9622,6 +9782,7 @@ "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", "jsonfile": "^4.0.0", @@ -9636,6 +9797,7 @@ "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" } @@ -9645,6 +9807,7 @@ "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" } @@ -9654,6 +9817,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -9666,6 +9830,7 @@ "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" }, @@ -9678,6 +9843,7 @@ "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" } @@ -9687,6 +9853,7 @@ "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" }, @@ -9718,6 +9885,7 @@ "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "license": "ISC", + "peer": true, "dependencies": { "readable-stream": "^3.0.0" } @@ -9726,7 +9894,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/stacktrace-parser": { "version": "0.1.11", @@ -9771,7 +9940,8 @@ "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" + "license": "WTFPL OR MIT", + "peer": true }, "node_modules/string-width": { "version": "4.2.3", @@ -9804,6 +9974,7 @@ "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" }, @@ -9853,6 +10024,7 @@ "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", "license": "MIT", + "peer": true, "dependencies": { "http-response-object": "^3.0.1", "sync-rpc": "^1.2.1", @@ -9867,6 +10039,7 @@ "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", "license": "MIT", + "peer": true, "dependencies": { "get-port": "^3.1.0" } @@ -9892,6 +10065,7 @@ "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", "deep-extend": "~0.6.0", @@ -9907,6 +10081,7 @@ "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" } @@ -9916,6 +10091,7 @@ "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" } @@ -9959,6 +10135,7 @@ "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", "license": "MIT", + "peer": true, "dependencies": { "@types/concat-stream": "^1.6.0", "@types/form-data": "0.0.33", @@ -9980,13 +10157,15 @@ "version": "8.10.66", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/then-request/node_modules/form-data": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", "license": "MIT", + "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -10004,6 +10183,7 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "license": "MIT", + "peer": true, "dependencies": { "readable-stream": "3" } @@ -10046,7 +10226,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -10112,6 +10291,7 @@ "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": { "chalk": "^4.1.0", "command-line-args": "^5.1.1", @@ -10127,6 +10307,7 @@ "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" } @@ -10136,7 +10317,6 @@ "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", "@tsconfig/node10": "^1.0.7", @@ -10204,6 +10384,7 @@ "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" }, @@ -10216,6 +10397,7 @@ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -10262,6 +10444,7 @@ "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", "jsonfile": "^4.0.0", @@ -10277,6 +10460,7 @@ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10297,6 +10481,7 @@ "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" } @@ -10306,6 +10491,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", + "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -10318,6 +10504,7 @@ "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" }, @@ -10333,6 +10520,7 @@ "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" } @@ -10355,14 +10543,14 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/typescript": { "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": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10376,6 +10564,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -10386,6 +10575,7 @@ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "license": "BSD-2-Clause", "optional": true, + "peer": true, "bin": { "uglifyjs": "bin/uglifyjs" }, @@ -10469,7 +10659,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/util-deprecate": { "version": "1.0.2", @@ -10515,6 +10706,7 @@ "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", "bn.js": "^5.2.1", @@ -10534,6 +10726,7 @@ "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" }, @@ -10546,6 +10739,7 @@ "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", @@ -10560,6 +10754,7 @@ "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" }, @@ -10572,6 +10767,7 @@ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 16" }, @@ -10584,6 +10780,7 @@ "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", @@ -10612,6 +10809,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "license": "ISC", + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -10657,6 +10855,7 @@ "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" } @@ -10665,13 +10864,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/wordwrapjs": { "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", "typical": "^5.2.0" @@ -10685,6 +10886,7 @@ "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" } diff --git a/scripts/deployStakingRewards/verify.ts b/scripts/deployStakingRewards/verify.ts index 396efe0..d9c7e1f 100644 --- a/scripts/deployStakingRewards/verify.ts +++ b/scripts/deployStakingRewards/verify.ts @@ -123,10 +123,9 @@ async function main() { // 2.3 Check rewards distribution console.log('\nšŸ“¤ Rewards Distribution Check:'); - const rewardsDistribution = await stakingRewards.rewardsDistribution(); - console.log(` Rewards Distribution: ${rewardsDistribution}`); - - expect(rewardsDistribution.toLowerCase()).to.equal(input.REWARDS_DISTRIBUTOR.toLowerCase(), 'Rewards distribution mismatch'); + expect( + await stakingRewards.hasRole(await stakingRewards.REWARDS_DISTRIBUTOR_ROLE(), input.REWARDS_DISTRIBUTOR), + ).to.equal(true); console.log(' āœ… Rewards distribution is Multisig'); // 2.4 Check rewards duration diff --git a/test/StakingRewards.test.ts b/test/StakingRewards.test.ts index 90ddef2..62a9299 100644 --- a/test/StakingRewards.test.ts +++ b/test/StakingRewards.test.ts @@ -65,7 +65,12 @@ describe('StakingRewards', function () { it('Should deploy with correct initial values', async function () { expect(await stakingRewards.rewardsToken()).to.equal(await rewardsToken.getAddress()); expect(await stakingRewards.stakingToken()).to.equal(await stakingToken.getAddress()); - expect(await stakingRewards.rewardsDistribution()).to.equal(rewardsDistributor.address); + expect( + await stakingRewards.hasRole( + await stakingRewards.REWARDS_DISTRIBUTOR_ROLE(), + rewardsDistributor.address, + ), + ).to.equal(true); expect(await stakingRewards.rewardsDuration()).to.equal(REWARDS_DURATION); expect(await stakingRewards.owner()).to.equal(owner.address); }); @@ -163,12 +168,6 @@ describe('StakingRewards', function () { ).to.be.revertedWith('RewardsDuration must be greater than 0'); }); - it('Should fail setRewardsDistribution with zero address', async function () { - await expect(stakingRewards.connect(owner).setRewardsDistribution(ethers.ZeroAddress)).to.be.revertedWith( - 'RewardsDistribution cannot be zero address', - ); - }); - it('Should fail setRewardsDuration with zero value', async function () { // Wait for period to finish first await time.increase(REWARDS_DURATION + 1); @@ -214,6 +213,37 @@ describe('StakingRewards', function () { expect(await stakingRewards.balanceOf(user1.address)).to.equal(amount1 + amount2); expect(await stakingRewards.totalSupply()).to.equal(amount1 + amount2); }); + + it('Should fail stakeOnBehalf with unallowed staker on behalf', async function () { + const amountToStake = ethers.parseUnits('500', 18); + + await expect(stakingRewards.connect(user2).stakeOnBehalf(user1.address, amountToStake)) + .to.be.revertedWithCustomError(stakingRewards, 'AccessControlUnauthorizedAccount') + .withArgs(user2.address, await stakingRewards.STAKER_ON_BEHALF_ROLE()); + }); + + it('Should fail stakeOnBehalf with zero address account', async function () { + const amountToStake = ethers.parseUnits('500', 18); + await stakingRewards.connect(owner).grantRole(await stakingRewards.STAKER_ON_BEHALF_ROLE(), user2.address); + + await expect( + stakingRewards.connect(user2).stakeOnBehalf(ethers.ZeroAddress, amountToStake), + ).to.be.revertedWith('Cannot stake for the zero address'); + }); + + it('Should allow stakeOnBehalf on behalf of the user', async function () { + const amountToStake = ethers.parseUnits('500', 18); + const user2BalanceBefore = await stakingToken.balanceOf(user2.address); + + await stakingRewards.connect(owner).grantRole(await stakingRewards.STAKER_ON_BEHALF_ROLE(), user2.address); + + await stakingRewards.connect(user2).stakeOnBehalf(user1.address, amountToStake); + + const user2BalanceAfter = await stakingToken.balanceOf(user2.address); + + expect(await stakingRewards.balanceOf(user1.address)).to.equal(amountToStake); + expect(user2BalanceBefore - user2BalanceAfter).to.equal(amountToStake); + }); }); describe('Token Locking', function () { @@ -426,9 +456,9 @@ describe('StakingRewards', function () { const rewardAmount = ethers.parseUnits('10000', 18); await rewardsToken.transfer(await stakingRewards.getAddress(), rewardAmount); - await expect(stakingRewards.connect(user1).notifyRewardAmount(rewardAmount)).to.be.revertedWith( - 'Caller is not RewardsDistribution contract', - ); + await expect(stakingRewards.connect(user1).notifyRewardAmount(rewardAmount)) + .to.be.revertedWithCustomError(stakingRewards, 'AccessControlUnauthorizedAccount') + .withArgs(user1.address, await stakingRewards.REWARDS_DISTRIBUTOR_ROLE()); }); it('Should emit RewardAdded event', async function () { @@ -463,7 +493,7 @@ describe('StakingRewards', function () { expect(await rewardsToken.balanceOf(user1.address)).to.be.closeTo(earnedBefore, earnedBefore / 1000n); }); - it('Should fail exit if tokens are locked', async function () { + it('Should allow exit if tokens are locked (skips withdraw if all tokens are locked)', async function () { const lockDuration = 30 * 24 * 60 * 60; await stakingRewards.connect(user1).lockStake(stakeAmount, lockDuration); @@ -472,7 +502,7 @@ describe('StakingRewards', function () { // Verify tokens are locked expect(await stakingRewards.getLockedStakeAmount(user1.address)).to.equal(stakeAmount); - await expect(stakingRewards.connect(user1).exit()).to.be.reverted; + await expect(stakingRewards.connect(user1).exit()).not.to.be.reverted; }); it('Should allow exit after lock expires', async function () { @@ -503,14 +533,12 @@ describe('StakingRewards', function () { }); it('Should allow owner to set rewards distribution', async function () { - await stakingRewards.connect(owner).setRewardsDistribution(user1.address); - expect(await stakingRewards.rewardsDistribution()).to.equal(user1.address); - }); - - it('Should emit RewardsDistributionUpdated event', async function () { - await expect(stakingRewards.connect(owner).setRewardsDistribution(user1.address)) - .to.emit(stakingRewards, 'RewardsDistributionUpdated') - .withArgs(user1.address); + await stakingRewards + .connect(owner) + .grantRole(await stakingRewards.REWARDS_DISTRIBUTOR_ROLE(), user1.address); + expect( + await stakingRewards.hasRole(await stakingRewards.REWARDS_DISTRIBUTOR_ROLE(), user1.address), + ).to.equal(true); }); it('Should allow owner to recover ERC20 tokens', async function () { @@ -551,6 +579,45 @@ describe('StakingRewards', function () { 'Previous rewards period must be complete before changing the duration for the new period', ); }); + + it('Should allow owner to set initial lock period', async function () { + const duration = 90 * 24 * 60 * 60; // 90 days + await stakingRewards.connect(owner).setInitialLockPeriod(duration); + expect(await stakingRewards.initialLockPeriodDuration()).to.equal(duration); + expect(await stakingRewards.initialLockPeriodFinish()).to.equal((await time.latest()) + duration); + }); + + it('Should fail to set initial lock period 0', async function () { + await expect(stakingRewards.connect(owner).setInitialLockPeriod(0)).to.be.revertedWith( + 'Initial lock period must be greater than 0', + ); + }); + + it('Should fail to set initial lock period longer than 2 years', async function () { + await expect(stakingRewards.connect(owner).setInitialLockPeriod(731 * 24 * 60 * 60)).to.be.revertedWith( + 'Initial lock period cannot be longer than 2 years', + ); + }); + + it('Should fail to set initial lock period before period finishes', async function () { + const duration = 90 * 24 * 60 * 60; // 90 days + await stakingRewards.connect(owner).setInitialLockPeriod(duration); + expect(await stakingRewards.initialLockPeriodDuration()).to.equal(duration); + + await expect(stakingRewards.connect(owner).setInitialLockPeriod(duration)).to.be.revertedWith( + 'Previous initial lock period must be complete before changing the duration for the new period', + ); + }); + + it('Should fail to set initial lock period before period finishes', async function () { + const duration = 90 * 24 * 60 * 60; // 90 days + await stakingRewards.connect(owner).setInitialLockPeriod(duration); + expect(await stakingRewards.initialLockPeriodDuration()).to.equal(duration); + + await expect(stakingRewards.connect(owner).setInitialLockPeriod(duration)).to.be.revertedWith( + 'Previous initial lock period must be complete before changing the duration for the new period', + ); + }); }); describe('Edge Cases', function () { @@ -700,6 +767,53 @@ describe('StakingRewards', function () { .be.reverted; }); + it('Should fail stakeAndLockOnBehalf with unallowed staker on behalf', async function () { + const amountToStake = ethers.parseUnits('500', 18); + const lockDuration = 7 * 24 * 60 * 60; // 7 days + + await expect(stakingRewards.connect(user2).stakeAndLockOnBehalf(user1.address, amountToStake, lockDuration)) + .to.be.revertedWithCustomError(stakingRewards, 'AccessControlUnauthorizedAccount') + .withArgs(user2.address, await stakingRewards.STAKER_ON_BEHALF_ROLE()); + }); + + it('Should allow stakeAndLockOnBehalf in one call without user previous stake', async function () { + const amountToStake = ethers.parseUnits('500', 18); + const lockDuration = 7 * 24 * 60 * 60; // 7 days + const user2BalanceBefore = await stakingToken.balanceOf(user2.address); + + await stakingRewards.connect(owner).grantRole(await stakingRewards.STAKER_ON_BEHALF_ROLE(), user2.address); + + await stakingRewards.connect(user2).stakeAndLockOnBehalf(user1.address, amountToStake, lockDuration); + + const user2BalanceAfter = await stakingToken.balanceOf(user2.address); + + expect(await stakingRewards.balanceOf(user1.address)).to.equal(amountToStake); + expect(await stakingRewards.getLockedStakeAmount(user1.address)).to.equal(amountToStake); + expect(user2BalanceBefore - user2BalanceAfter).to.equal(amountToStake); + }); + + it('Should allow stakeAndLockOnBehalf in one call with user with previous stake locked', async function () { + const amountToStake = ethers.parseUnits('500', 18); + const amountToLock = ethers.parseUnits('300', 18); + const amountToStakeOnBehalf = ethers.parseUnits('200', 18); + const lockDuration = 7 * 24 * 60 * 60; // 7 days + const user2BalanceBefore = await stakingToken.balanceOf(user2.address); + + await stakingRewards.connect(user1).stakeAndLock(amountToStake, amountToLock, lockDuration); + + await stakingRewards.connect(owner).grantRole(await stakingRewards.STAKER_ON_BEHALF_ROLE(), user2.address); + + await stakingRewards + .connect(user2) + .stakeAndLockOnBehalf(user1.address, amountToStakeOnBehalf, lockDuration); + const user2BalanceAfter = await stakingToken.balanceOf(user2.address); + expect(await stakingRewards.balanceOf(user1.address)).to.equal(amountToStake + amountToStakeOnBehalf); + expect(await stakingRewards.getLockedStakeAmount(user1.address)).to.equal( + amountToLock + amountToStakeOnBehalf, + ); + expect(user2BalanceBefore - user2BalanceAfter).to.equal(amountToStakeOnBehalf); + }); + it('Should add leftover rewards when notifying during active period', async function () { const stakeAmount = ethers.parseUnits('1000', 18); await stakingRewards.connect(user1).stake(stakeAmount); @@ -1035,9 +1149,9 @@ describe('StakingRewards', function () { // onlyRewardsDistribution modifier - FAILURE path it('onlyRewardsDistribution: should fail when caller is not rewardsDistribution', async function () { const rewardAmount = ethers.parseUnits('7000', 18); - await expect(stakingRewards.connect(user1).notifyRewardAmount(rewardAmount)).to.be.revertedWith( - 'Caller is not RewardsDistribution contract', - ); + await expect(stakingRewards.connect(user1).notifyRewardAmount(rewardAmount)) + .to.be.revertedWithCustomError(stakingRewards, 'AccessControlUnauthorizedAccount') + .withArgs(user1.address, await stakingRewards.REWARDS_DISTRIBUTOR_ROLE()); }); // updateReward modifier - account != address(0) path @@ -1139,12 +1253,17 @@ describe('StakingRewards', function () { }); it('onlyOwner: setRewardsDistribution should succeed for owner', async function () { - await stakingRewards.connect(owner).setRewardsDistribution(user2.address); - expect(await stakingRewards.rewardsDistribution()).to.equal(user2.address); + await stakingRewards + .connect(owner) + .grantRole(await stakingRewards.REWARDS_DISTRIBUTOR_ROLE(), user2.address); + expect(await stakingRewards.hasRole(await stakingRewards.REWARDS_DISTRIBUTOR_ROLE(), user2.address)).to.be + .true; }); - it('onlyOwner: setRewardsDistribution should fail for non-owner', async function () { - await expect(stakingRewards.connect(user1).setRewardsDistribution(user2.address)).to.be.reverted; + it('onlyOwner: grantRole REWARDS_DISTRIBUTOR_ROLE should fail for non-owner', async function () { + await expect( + stakingRewards.connect(user1).grantRole(await stakingRewards.REWARDS_DISTRIBUTOR_ROLE(), user2.address), + ).to.be.reverted; }); it('onlyOwner: recoverERC20 should fail for non-owner', async function () { @@ -1154,6 +1273,10 @@ describe('StakingRewards', function () { it('onlyOwner: setRewardsDuration should fail for non-owner', async function () { await expect(stakingRewards.connect(user1).setRewardsDuration(86400)).to.be.reverted; }); + + it('onlyOwner: setInitialLockPeriod should fail for non-owner', async function () { + await expect(stakingRewards.connect(user1).setInitialLockPeriod(7776000)).to.be.reverted; + }); }); describe('Require Statement Branch Coverage', function () { @@ -1356,7 +1479,6 @@ describe('StakingRewards', function () { await stakingRewards.rewardsDuration(); await stakingRewards.lastUpdateTime(); await stakingRewards.rewardPerTokenStored(); - await stakingRewards.rewardsDistribution(); await stakingRewards.userRewardPerTokenPaid(user1.address); await stakingRewards.rewards(user1.address); await stakingRewards.totalSupply(); @@ -1369,6 +1491,7 @@ describe('StakingRewards', function () { await stakingRewards.getLockedStakeAmount(user1.address); await stakingRewards.paused(); await stakingRewards.owner(); + await stakingRewards.initialLockPeriodDuration(); }); // Test lockStake when currentLockedStakeAmount == 0 path explicitly @@ -1434,5 +1557,79 @@ describe('StakingRewards', function () { // Rate should be different (includes leftover) expect(rate2).to.not.equal(rate1); }); + + it('Should fail to get rewards before initial lock period finishes', async function () { + const duration = 90 * 24 * 60 * 60; // 90 days + await stakingRewards.connect(owner).setInitialLockPeriod(duration); + await expect(stakingRewards.connect(user1).getReward()).to.be.revertedWith( + 'Get rewards not allowed during initial lock period', + ); + }); + + it('Should fail to withdraw before initial lock period finishes', async function () { + const duration = 90 * 24 * 60 * 60; // 90 days + await stakingRewards.connect(owner).setInitialLockPeriod(duration); + await expect(stakingRewards.connect(user1).withdraw(stakeAmount / 2n)).to.be.revertedWith( + 'Withdraw not allowed during initial lock period', + ); + }); + + it('Should succeed to get rewards after initial lock period finishes', async function () { + const duration = 90 * 24 * 60 * 60; // 90 days + await stakingRewards.connect(owner).setInitialLockPeriod(duration); + await time.increase(duration); // Fast forward time to after the lock period + await expect(stakingRewards.connect(user1).getReward()).to.not.be.reverted; + }); + + it('Should succeed to withdraw after initial lock period finishes', async function () { + const duration = 90 * 24 * 60 * 60; // 90 days + await stakingRewards.connect(owner).setInitialLockPeriod(duration); + await time.increase(duration); // Fast forward time to after the initial lock period + await expect(stakingRewards.connect(user1).withdraw(stakeAmount / 2n)).to.not.be.reverted; + }); + + it('Should allow stakeAndLock with lock period after initial lock period finishes', async function () { + const duration = 90 * 24 * 60 * 60; // 90 days + await stakingRewards.connect(owner).setInitialLockPeriod(duration); + await time.increase(duration); // Fast forward time to after the initial lock period + + const amountToStake = ethers.parseUnits('500', 18); + const amountToLock = ethers.parseUnits('300', 18); + const lockDuration = 7 * 24 * 60 * 60; // 7 days + + await stakingRewards.connect(user1).stakeAndLock(amountToStake, amountToLock, lockDuration); + + expect(await stakingRewards.balanceOf(user1.address)).to.equal(stakeAmount + amountToStake); // Previous stake + new stake + expect(await stakingRewards.getLockedStakeAmount(user1.address)).to.equal(amountToLock); + }); + + it('Should allow stakeAndLockOnBehalf with lock period after initial lock period finishes', async function () { + const duration = 90 * 24 * 60 * 60; // 90 days + await stakingRewards.connect(owner).setInitialLockPeriod(duration); + await stakingRewards.connect(owner).grantRole(await stakingRewards.STAKER_ON_BEHALF_ROLE(), user1.address); + + await time.increase(duration); // Fast forward time to after the initial lock period + + const amount = ethers.parseUnits('300', 18); + const lockDuration = 7 * 24 * 60 * 60; // 7 days + + await stakingRewards.connect(user1).stakeAndLockOnBehalf(user2, amount, lockDuration); + + expect(await stakingRewards.balanceOf(user2.address)).to.equal(amount); + expect(await stakingRewards.getLockedStakeAmount(user2.address)).to.equal(amount); + }); + + it('Should allow lockStake with lock period after initial lock period finishes', async function () { + const duration = 90 * 24 * 60 * 60; // 90 days + await stakingRewards.connect(owner).setInitialLockPeriod(duration); + await time.increase(duration); // Fast forward time to after the initial lock period + + const lockDuration = 7 * 24 * 60 * 60; // 7 days + + await stakingRewards.connect(user1).lockStake(stakeAmount, lockDuration); + + expect(await stakingRewards.balanceOf(user1.address)).to.equal(stakeAmount); // Previous staked amount + expect(await stakingRewards.getLockedStakeAmount(user1.address)).to.equal(stakeAmount); // All should be locked + }); }); });