diff --git a/contracts/core/MultiGauge.sol b/contracts/core/MultiGauge.sol index e6ce8a5..87fe147 100644 --- a/contracts/core/MultiGauge.sol +++ b/contracts/core/MultiGauge.sol @@ -13,7 +13,8 @@ contract MultiGauge is StakelessMultiPoolBase, IGauge { //region ---------------------- Constants /// @dev Version of this contract. Adjust manually on each code modification. - string public constant VERSION = "1.0.0"; + /// 1.0.1 - check left() in updatePeriod + string public constant VERSION = "1.0.1"; // keccak256(abi.encode(uint256(keccak256("erc7201:myrd.MultiGauge")) - 1)) & ~bytes32(uint256(0xff)) bytes32 internal constant MULTI_GAUGE_STORAGE_LOCATION = 0x56fe937432a4b636174f357965a052660eeb836d7a87be456fd784604b733000; // erc7201:myrd.MultiGauge @@ -64,22 +65,28 @@ contract MultiGauge is StakelessMultiPoolBase, IGauge { $.activePeriod = _activePeriod; address _xMyrd = $.xMyrd; - // get MYRD balance before calling rebase() address _myrd = defaultRewardToken; + + // get MYRD balance before calling rebase() uint balanceBefore = IERC20(_myrd).balanceOf(address(this)); - // receive penalties from xMyrd (if any) - // xMyrd will transfer penalties directly to this contract - IXMyrd(_xMyrd).rebase(); + // min amount that is allowed to be send to the gauge according implementation of _notifyRewardAmount() + uint _left = left(_xMyrd, _myrd); - // notify reward amount if necessary + // min required amount of the rebase to satisfy requirements in _notifyRewardAmount() + uint minAllowedRebase = amount_ > _left ? 0 : _left - amount_ + 1; + + // xMyrd transfers penalties directly to this contract + // assume here that XMyrd won't transfer anything if available penalties are less than minAllowedRebase + IXMyrd(_xMyrd).rebase(minAllowedRebase); + + // ensure that rebase haven't sent any penalties OR it sent at least minAllowedRebase uint balanceAfter = IERC20(_myrd).balanceOf(address(this)); - if ( - balanceAfter > balanceBefore // penalties received - || amount_ != 0 // additional amount provided - ) { - // received penalties will be added to the amount_ inside _notifyRewardAmount - _notifyRewardAmount(_S().xMyrd, _myrd, amount_, true, balanceBefore); + if (balanceAfter != balanceBefore && balanceAfter < minAllowedRebase + balanceBefore) revert IAppErrors.IncorrectBalance(); + + // total amount for _notifyRewardAmount must exceed left amount + if (amount_ + balanceAfter > _left + balanceBefore) { + _notifyRewardAmount(_xMyrd, _myrd, amount_, true, balanceBefore); } } //endregion ---------------------- Operator actions diff --git a/contracts/interfaces/IAppErrors.sol b/contracts/interfaces/IAppErrors.sol index 6c41c0b..a517604 100644 --- a/contracts/interfaces/IAppErrors.sol +++ b/contracts/interfaces/IAppErrors.sol @@ -11,6 +11,7 @@ interface IAppErrors { error IncorrectArrayLength(); error IncorrectZeroArgument(); error IncorrectZeroAddress(); + error IncorrectBalance(); error AlreadySet(); error ZeroAddress(); diff --git a/contracts/interfaces/IXMyrd.sol b/contracts/interfaces/IXMyrd.sol index 5c43707..09a8dcb 100644 --- a/contracts/interfaces/IXMyrd.sol +++ b/contracts/interfaces/IXMyrd.sol @@ -59,7 +59,8 @@ interface IXMyrd { function setExemptionTo(address[] calldata exemptee, bool[] calldata exempt) external; /// @notice Function called by the gauge to send the rebases once a week - function rebase() external; + /// @param minAmount If available penalties < minAmount function won't send anything + function rebase(uint minAmount) external; // ------------------------------ View functions diff --git a/contracts/test/mocks/XMyrdMock.sol b/contracts/test/mocks/XMyrdMock.sol index c123fb4..88c92c2 100644 --- a/contracts/test/mocks/XMyrdMock.sol +++ b/contracts/test/mocks/XMyrdMock.sol @@ -9,6 +9,7 @@ contract XMyrdMock is MockToken { address gauge; bool private rebaseCalled; mapping(address => uint) private _enterForCalled; + uint private rebaseAmountToTransfer; constructor(address myrd_, address gauge_) MockToken("x", "y") { myrd = myrd_; @@ -16,17 +17,22 @@ contract XMyrdMock is MockToken { } /// @dev Transfer all MYRD balance to the gauge - function rebase() external { + function rebase(uint minAmount) external { rebaseCalled = true; if (myrd != address(0) && gauge != address(0)) { uint256 myrdBalance = IERC20(myrd).balanceOf(address(this)); - if (myrdBalance != 0) { - IERC20(myrd).transfer(gauge, myrdBalance); + if (myrdBalance != 0 && myrdBalance >= minAmount && myrdBalance >= 10_000) { + uint amount = rebaseAmountToTransfer == 0 ? myrdBalance : rebaseAmountToTransfer; + IERC20(myrd).transfer(gauge, amount); } } } + function setRebaseAmountToTransfer_(uint rebaseAmountToTransfer_) external { + rebaseAmountToTransfer = rebaseAmountToTransfer_; + } + function isRebaseCalled() external view returns (bool) { return rebaseCalled; } @@ -38,4 +44,12 @@ contract XMyrdMock is MockToken { function enterForAmount(address receiver) external view returns (uint) { return _enterForCalled[receiver]; } + + function pendingRebase() external view returns (uint) { + return IERC20(myrd).balanceOf(address(this)); + } + + function BASIS() external pure returns (uint) { + return 10_000; + } } \ No newline at end of file diff --git a/contracts/token/XMyrd.sol b/contracts/token/XMyrd.sol index e53acee..d07e6df 100644 --- a/contracts/token/XMyrd.sol +++ b/contracts/token/XMyrd.sol @@ -16,8 +16,9 @@ contract XMyrd is Controllable, ERC20Upgradeable, IXMyrd { //region ------------------------ Constants - /// @inheritdoc IControllable - string public constant VERSION = "1.0.0"; + /// @dev Version of this contract. Adjust manually on each code modification. + /// 1.0.1: add minAmount param to rebase + string public constant VERSION = "1.0.1"; /// @inheritdoc IXMyrd uint public constant BASIS = 10_000; @@ -73,7 +74,7 @@ contract XMyrd is Controllable, ERC20Upgradeable, IXMyrd { //region ------------------------ Restricted actions /// @inheritdoc IXMyrd - function rebase() external { + function rebase(uint minAmount) external { MainStorage storage $ = _S(); address _gauge = $.gauge; @@ -90,6 +91,8 @@ contract XMyrd is Controllable, ERC20Upgradeable, IXMyrd { if ( /// @dev if the rebase is greater than the Basis period > $.lastDistributedPeriod && _pendingRebase >= BASIS + /// @dev if the rebase is greater than the given threshold + && _pendingRebase >= minAmount ) { $.lastDistributedPeriod = period; diff --git a/hardhat.config.ts b/hardhat.config.ts index 12430be..a4a9914 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -84,19 +84,25 @@ export default { accountsBalance: '100000000000000000000000000000', }, loggingEnabled: argv.loggingEnabled, - // chains: { + chains: { // 778877: { // hardforkHistory: { // istanbul: 0, // }, // } - // }, + 146: { + hardforkHistory: { + shanghai: 0, + }, + } + }, }, sonic: { chainId: 146, url: argv.sonicRpcUrl, accounts: [argv.privateKey], timeout: 99999, + hardfork: "shanghai", verify: { etherscan: { apiKey: argv.networkScanKeySonic, diff --git a/package.json b/package.json index cb8eb64..5cc65cd 100644 --- a/package.json +++ b/package.json @@ -38,10 +38,10 @@ "@graphql-codegen/cli": "^5.0.0", "@graphql-codegen/typescript": "^4.0.1", "@graphql-codegen/typescript-operations": "^4.0.1", - "@nomicfoundation/hardhat-chai-matchers": "^2.0.2", - "@nomicfoundation/hardhat-ethers": "^3.0.5", + "@nomicfoundation/hardhat-chai-matchers": "^2.0.8", + "@nomicfoundation/hardhat-ethers": "^3.0.8", "@nomicfoundation/hardhat-network-helpers": "^1.0.10", - "@nomicfoundation/hardhat-verify": "^2.0.3", + "@nomicfoundation/hardhat-verify": "^2.0.13", "@openzeppelin/contracts": "^5.3.0", "@typechain/ethers-v6": "^0.5.1", "@typechain/hardhat": "^9.1.0", @@ -66,7 +66,7 @@ "ethereumjs-tx": "^2.1.2", "ethers": "^6.9.1", "graphql": "^16.8.1", - "hardhat": "^2.19.3", + "hardhat": "^2.23.0", "hardhat-abi-exporter": "^2.10.1", "hardhat-contract-sizer": "^2.10.0", "hardhat-deploy": "^0.11.45", diff --git a/test/core/MultiGaugeFTest.ts b/test/core/MultiGaugeFTest.ts index 9699e5a..34f3fe4 100644 --- a/test/core/MultiGaugeFTest.ts +++ b/test/core/MultiGaugeFTest.ts @@ -38,6 +38,7 @@ describe('MultiGaugeFTest', function() { let user3: SignerWithAddress; let user4: SignerWithAddress; let deployerInController: SignerWithAddress; + let controllerGovernance: SignerWithAddress; let controller: Controller; let xMyrd: XMyrd; @@ -73,7 +74,8 @@ describe('MultiGaugeFTest', function() { usdcMock = await DeployerUtils.deployMockToken(signer, 'USDC', 6, false); wethMock = await DeployerUtils.deployMockToken(signer, 'WETH', 18, false); - await controller.connect(governance).changeDeployer(deployerInController, false); + controllerGovernance = await DeployUtils.impersonate(await controller.governance()); + await controller.connect(controllerGovernance).changeDeployer(deployerInController, false); }); after(async function () { @@ -90,7 +92,7 @@ describe('MultiGaugeFTest', function() { describe("Check initialization of deployed proxy contracts", () => { it("should return expected values", async () => { - expect((await controller.governance()).toLowerCase()).eq(governance.address.toLowerCase()); + expect((await controller.governance()).toLowerCase()).eq(controllerGovernance.address.toLowerCase()); expect((await gauge.controller()).toLowerCase()).eq((await controller.getAddress()).toLowerCase()); expect((await gauge.xMyrd()).toLowerCase()).eq((await xMyrd.getAddress()).toLowerCase()); @@ -450,8 +452,8 @@ describe('MultiGaugeFTest', function() { // ------------ try to remove reward tokens await expect(await gauge.left(xMyrd, usdcMock)).gt(0n); - await expect(gauge.connect(governance).removeRewardToken(xMyrd, usdcMock)).rejectedWith("Rewards not ended", "there is not empty amount of rewards for the current period"); - await expect(gauge.connect(governance).removeRewardToken(xMyrd, wethMock)).rejectedWith("Not reward token", "default token cannot be removed"); + await expect(gauge.connect(controllerGovernance).removeRewardToken(xMyrd, usdcMock)).rejectedWith("Rewards not ended", "there is not empty amount of rewards for the current period"); + await expect(gauge.connect(controllerGovernance).removeRewardToken(xMyrd, wethMock)).rejectedWith("Not reward token", "default token cannot be removed"); // ------------ register WETH as reward await gauge.connect(deployerInController).registerRewardToken(xMyrd, wethMock); diff --git a/test/core/MultiGaugeTest.ts b/test/core/MultiGaugeTest.ts index 04bb903..2bd2c60 100644 --- a/test/core/MultiGaugeTest.ts +++ b/test/core/MultiGaugeTest.ts @@ -119,11 +119,20 @@ describe('MultiGaugeTest', function() { }); interface IParams { - amount: bigint; + amount: bigint | string; penalties: bigint; timePassedSincePeriodStartSeconds?: number; balanceSigner?: bigint; useInitialUpdate?: boolean; + + /** + * By default, we call updatePeriod at the exact moment of the beginning of the period. + * There are also special cases: + * 1) first period is started, i.e. in 3 days after an exact moment. + * 2) at the moment of the beginning of the next period, there are some left rewards in the gauge. + */ + left?: bigint; + rebaseAmountToTransfer?: bigint; } interface IResults { @@ -139,17 +148,35 @@ describe('MultiGaugeTest', function() { lastUpdateTime: number; periodFinish: number; blockTimestamp: number; + + leftBefore: bigint; + initialSignerBalance: bigint; } async function makeTest(p: IParams): Promise { // --------------- at first let's move to the board of the period + const rewardsPeriod = Number(await gauge.REWARDS_PERIOD()); const period0 = Number(await gauge.getPeriod()); - const delta = (period0 + 1) * 7 * 24 * 60 * 60 - Math.floor(Date.now() / 1000); + const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp ?? 0; + const delta = (period0 + 1) * rewardsPeriod - currentTimestamp; + + if (p.rebaseAmountToTransfer) { + xmyrdMock.setRebaseAmountToTransfer_(p.rebaseAmountToTransfer); + } await TimeUtils.advanceBlocksOnTs(delta); if (p.useInitialUpdate) { - await gauge.updatePeriod(0n); + if (p.left) { + // shift on 3 days from the exact moment + await TimeUtils.advanceBlocksOnTs(3 * 24 * 60 * 60); // 3 days + + await myrd.mint(signer, p.left); + await myrd.connect(signer).approve(gauge, Misc.MAX_UINT); + await gauge.updatePeriod(p.left); + } else { + await gauge.updatePeriod(0); + } } const periodBefore = Number(await gauge.getPeriod()); @@ -161,13 +188,19 @@ describe('MultiGaugeTest', function() { await myrd.mint(xmyrdMock, p.penalties); } - if (p.balanceSigner ?? p.amount != 0n) { - await myrd.mint(signer, p.balanceSigner ?? p.amount); + const leftBefore = await gauge.left(xmyrdMock, myrd); + const initialSignerBalance = p.amount === "LEFT_MINUS_8000" ? leftBefore - 8000n : BigInt(p.amount); + + if (p.balanceSigner ?? initialSignerBalance != 0n) { + await myrd.mint(signer, p.balanceSigner ?? initialSignerBalance); } await myrd.connect(signer).approve(gauge, Misc.MAX_UINT); + // --------------- updatePeriod - const tx = await gauge.connect(signer).updatePeriod(p.amount); + const amountToSend = p.amount === "LEFT_MINUS_8000" ? await gauge.left(xmyrdMock, myrd) - 8000n : BigInt(p.amount); + + const tx = await gauge.connect(signer).updatePeriod(amountToSend); const cr = await tx.wait(); const blockTimestamp = (await ethers.provider.getBlock(cr?.blockNumber ?? 0))?.timestamp; @@ -182,6 +215,8 @@ describe('MultiGaugeTest', function() { lastUpdateTime: Number(await gauge.lastUpdateTime(xmyrdMock, myrd)), periodFinish: Number(await gauge.periodFinish(xmyrdMock, myrd)), blockTimestamp: blockTimestamp ?? 0, + leftBefore, + initialSignerBalance } } @@ -203,60 +238,60 @@ describe('MultiGaugeTest', function() { it("should return expected values if penalties only", async () => { const ret = await makeTest({ amount: 0n, - penalties: 2n, - balanceSigner: 1n, + penalties: 20_000n, + balanceSigner: 30_000n, }); console.log(ret); expect(ret.periodBefore).eq(ret.periodAfter - 1); expect(ret.activePeriod).eq(ret.periodAfter); - expect(ret.gaugeMyrdBalance).eq(2n); - expect(ret.signerMyrdBalance).eq(1n); + expect(ret.gaugeMyrdBalance).eq(20_000n); + expect(ret.signerMyrdBalance).eq(30_000n); expect(ret.xmyrdMyrdBalance).eq(0n); // see _notifyRewardAmount implementation - expect(ret.rewardRate).eq(2n * 10n**27n / (7n * 24n * 60n * 60n)); + expect(ret.rewardRate).eq(20_000n * 10n**27n / (7n * 24n * 60n * 60n)); expect(ret.lastUpdateTime).eq(ret.blockTimestamp); expect(ret.periodFinish).eq(ret.blockTimestamp + 7 * 24 * 60 * 60); }); it("should return expected values if amount only", async () => { const ret = await makeTest({ - amount: 2n, + amount: parseUnits("2"), penalties: 0n, - balanceSigner: 2n, + balanceSigner: parseUnits("2"), }); expect(ret.periodBefore).eq(ret.periodAfter - 1); expect(ret.activePeriod).eq(ret.periodAfter); - expect(ret.gaugeMyrdBalance).eq(2n); + expect(ret.gaugeMyrdBalance).eq(parseUnits("2")); expect(ret.signerMyrdBalance).eq(0n); expect(ret.xmyrdMyrdBalance).eq(0n); // see _notifyRewardAmount implementation - expect(ret.rewardRate).eq(2n * 10n**27n / (7n * 24n * 60n * 60n)); + expect(ret.rewardRate).eq(parseUnits("2") * 10n**27n / (7n * 24n * 60n * 60n)); expect(ret.lastUpdateTime).eq(ret.blockTimestamp); expect(ret.periodFinish).eq(ret.blockTimestamp + 7 * 24 * 60 * 60); }); it("should return expected values if penalties + amount", async () => { const ret = await makeTest({ - amount: 2n, - penalties: 3n, - balanceSigner: 2n, + amount: 20_000n, + penalties: 30_000n, + balanceSigner: 20_000n, }); expect(ret.periodBefore).eq(ret.periodAfter - 1); expect(ret.activePeriod).eq(ret.periodAfter); - expect(ret.gaugeMyrdBalance).eq(5n); + expect(ret.gaugeMyrdBalance).eq(50_000n); expect(ret.signerMyrdBalance).eq(0n); expect(ret.xmyrdMyrdBalance).eq(0n); // see _notifyRewardAmount implementation - expect(ret.rewardRate).eq(5n * 10n**27n / (7n * 24n * 60n * 60n)); + expect(ret.rewardRate).eq(50_000n * 10n**27n / (7n * 24n * 60n * 60n)); expect(ret.lastUpdateTime).eq(ret.blockTimestamp); expect(ret.periodFinish).eq(ret.blockTimestamp + 7 * 24 * 60 * 60); }); @@ -269,6 +304,62 @@ describe('MultiGaugeTest', function() { timePassedSincePeriodStartSeconds: 3 * 24 * 60 * 60, // 3 days of 7 required })).revertedWithCustomError(gauge, "WaitForNewPeriod"); }); + + it("should not call _notifyRewardAmount if left amount exceeds new amount", async () => { + const ret = await makeTest({ + amount: parseUnits("1"), + penalties: parseUnits("40"), + useInitialUpdate: true, + left: parseUnits("100"), + timePassedSincePeriodStartSeconds: 4 * 24 * 60 * 60, // 3 + 4 = 7 => updatePeriod is allowed + }); + + expect(+formatUnits(ret.leftBefore, 18)).approximately(42, 1); + expect(ret.xmyrdMyrdBalance).eq(parseUnits("40")); + expect(ret.signerMyrdBalance).eq(parseUnits("1")); + }); + + it("should call _notifyRewardAmount if new amount exceeds left", async () => { + const ret = await makeTest({ + amount: parseUnits("3"), + penalties: parseUnits("40"), + useInitialUpdate: true, + left: parseUnits("100"), + timePassedSincePeriodStartSeconds: 4 * 24 * 60 * 60, // 3 + 4 = 7 => updatePeriod is allowed + }); + + expect(+formatUnits(ret.leftBefore, 18)).approximately(42, 1); + expect(+formatUnits(ret.gaugeMyrdBalance, 18)).approximately(100 + 40 + 3, 1); + expect(ret.xmyrdMyrdBalance).eq(parseUnits("0")); + expect(ret.signerMyrdBalance).eq(parseUnits("0")); + }); + + it("should not call _notifyRewardAmount if new amount exceeds left but only together with penalties but penalties are not paid", async () => { + const ret = await makeTest({ + amount: "LEFT_MINUS_8000", + penalties: 9_999n, // < BASIS=10_000 + useInitialUpdate: true, + left: 700_000n, + timePassedSincePeriodStartSeconds: 4 * 24 * 60 * 60, // 3 + 4 = 7 => updatePeriod is allowed + }); + console.log(ret) + + expect(ret.leftBefore).approximately(299999, 10); + expect(ret.xmyrdMyrdBalance).eq(9_999n); + expect(ret.signerMyrdBalance).eq(ret.initialSignerBalance); + }); + + it("should revert if rebase doesn't transfer expected amount", async () => { + await expect(makeTest({ + amount: "LEFT_MINUS_8000", + penalties: parseUnits("1"), + useInitialUpdate: true, + left: 700_000n, + timePassedSincePeriodStartSeconds: 4 * 24 * 60 * 60, + rebaseAmountToTransfer: 100n, // (!) + + })).revertedWithCustomError(gauge, "IncorrectBalance"); + }); }); describe("notifyRewardAmount", () => { diff --git a/test/token/XMyrdFTest.ts b/test/token/XMyrdFTest.ts index 1ed5c1a..c0e2e7b 100644 --- a/test/token/XMyrdFTest.ts +++ b/test/token/XMyrdFTest.ts @@ -382,7 +382,7 @@ describe('XMyrdFTest', function() { // -------------- rebase const gaugeAsSigner = await DeployUtils.impersonate(await gauge.getAddress()); - await xmyrd.connect(gaugeAsSigner).rebase(); + await xmyrd.connect(gaugeAsSigner).rebase(0n); expect(await myrd.balanceOf(gauge)).eq(AMOUNT / 2n); expect(await xmyrd.balanceOf(gauge)).eq(0n); @@ -398,7 +398,7 @@ describe('XMyrdFTest', function() { // -------------- first rebase in the period const gaugeAsSigner = await DeployUtils.impersonate(await gauge.getAddress()); - await xmyrd.connect(gaugeAsSigner).rebase(); + await xmyrd.connect(gaugeAsSigner).rebase(0n); // -------------- check results 1 expect(await xmyrd.lastDistributedPeriod()).eq(await gauge.getPeriod()); @@ -414,7 +414,7 @@ describe('XMyrdFTest', function() { await xmyrd.connect(user1).exit(AMOUNT); // -------------- second rebase in the same period - await xmyrd.connect(gaugeAsSigner).rebase(); + await xmyrd.connect(gaugeAsSigner).rebase(0n); // -------------- check results 2 expect(await xmyrd.lastDistributedPeriod()).eq(await gauge.getPeriod()); @@ -433,7 +433,7 @@ describe('XMyrdFTest', function() { // -------------- rebase const gaugeAsSigner = await DeployUtils.impersonate(await gauge.getAddress()); - await xmyrd.connect(gaugeAsSigner).rebase(); + await xmyrd.connect(gaugeAsSigner).rebase(0n); // -------------- check results expect(await xmyrd.lastDistributedPeriod()).eq(0n); @@ -442,7 +442,7 @@ describe('XMyrdFTest', function() { }); it("should revert if not gauge", async () => { - await expect(xmyrd.connect(user1).rebase()).revertedWithCustomError(xmyrd, "NotGauge"); + await expect(xmyrd.connect(user1).rebase(0n)).revertedWithCustomError(xmyrd, "NotGauge"); }); }); }); \ No newline at end of file diff --git a/test/updates/20250426-test-update.ts b/test/updates/20250426-test-update.ts new file mode 100644 index 0000000..9e2acfb --- /dev/null +++ b/test/updates/20250426-test-update.ts @@ -0,0 +1,125 @@ +import { + Controller__factory, MultiGauge, + MultiGauge__factory, MYRD, MYRD__factory, + XMyrd, + XMyrd__factory +} from "../../typechain"; +import {ethers} from "hardhat"; +import {DeployUtils} from "../utils/DeployUtils"; +import {Deploy} from "../../scripts/deploy/Deploy"; +import {expect} from "chai"; +import {TimeUtils} from "../utils/TimeUtils"; +import {Misc} from "../../scripts/Misc"; +import {parseUnits} from "ethers"; + +describe('Test update 20250426', () => { + interface IState { + timestamp: number; + activePeriod: number; + period: number; + periodFinish: number; + pendingRebase: bigint; + myrdBalance: bigint; + left: bigint; + } + async function getState(gauge: MultiGauge, xmyrd: XMyrd, myrd: MYRD) : Promise { + const dest = { + timestamp: Number((await ethers.provider.getBlock("latest"))?.timestamp ?? 0), + activePeriod: Number(await gauge.activePeriod()), + period: Number(await gauge.getPeriod()), + periodFinish: Number(await gauge.periodFinish(await gauge.xMyrd(), await gauge.defaultRewardToken())), + pendingRebase: await xmyrd.pendingRebase(), + myrdBalance: await myrd.balanceOf(gauge), + left: await gauge.left(xmyrd, myrd) + } + console.log("activePeriod", dest.activePeriod); + console.log("period", dest.period); + console.log("periodFinish", dest.periodFinish); + console.log("pendingRebase", dest.pendingRebase); + console.log("myrdBalance", dest.myrdBalance); + console.log("left", dest.left); + return dest; + } + + it.skip("study, sonic only: should update multi gauge and ensure that updatePeriod works properly", async () => { + const signer = (await ethers.getSigners())[0]; + const deployer = new Deploy(signer); + + const SONIC_MULTI_GAUGE = "0x9A3Dea4432bE010Db8Bcfd297b918Ad012d389f9"; + const myrdGovernance = await DeployUtils.impersonate("0xBe68f08bCa20e2a413D425c2F1aD7a43E1b67B67"); + + const gauge = MultiGauge__factory.connect(SONIC_MULTI_GAUGE, signer); + const gaugeAsSigner = await DeployUtils.impersonate(SONIC_MULTI_GAUGE); + const controller = Controller__factory.connect(await gauge.controller(), signer); + const governance = await DeployUtils.impersonate(await controller.governance()); + const xmyrd = XMyrd__factory.connect(await gauge.xMyrd(), signer); + const myrd = MYRD__factory.connect(await xmyrd.myrd(), signer); + + if (await gauge.VERSION() !== "1.0.0") return; + if (await xmyrd.VERSION() !== "1.0.0") return; + + //------------------- Reproduce the problem + + const state0 = await getState(gauge, xmyrd, myrd); + + await expect(gauge.connect(gaugeAsSigner).updatePeriod(0)).revertedWith("Amount should be higher than remaining rewards"); + + //------------------- Apply gauge and xmyrd update + const newGaugeLogic = await (await deployer.deployContract('MultiGauge')).getAddress(); + const newXMyrdLogic = await (await deployer.deployContract('XMyrd')).getAddress(); + await controller.connect(governance).updateProxies([gauge], newGaugeLogic); + await controller.connect(governance).updateProxies([xmyrd], newXMyrdLogic); + expect(await gauge.VERSION()).eq("1.0.1"); + expect(await xmyrd.VERSION()).eq("1.0.1"); + + //------------------- Now we can update period + await gauge.connect(gaugeAsSigner).updatePeriod(0); + // await myrd.connect(gaugeAsSigner).transfer(signer, state0.pendingRebase - state0.left + 1n); + + const state1 = await getState(gauge, xmyrd, myrd); + + expect(state1.timestamp < state1.periodFinish).eq(true); + + expect(state1.myrdBalance).eq(state0.myrdBalance); + expect(state1.pendingRebase).eq(state0.pendingRebase); + expect(state1.periodFinish).eq(state0.periodFinish); + expect(state1.period).eq(state0.period); + expect(state1.activePeriod).eq(state1.period, "updated"); + + //------------------- Skip 1 week + await TimeUtils.advanceBlocksOnTs(7 * 24 * 60 * 60); // 1 week + + const state2 = await getState(gauge, xmyrd, myrd); + expect(state2.timestamp >= state2.periodFinish).eq(true); + + //------------------- Update period again + await gauge.connect(gaugeAsSigner).updatePeriod(0); + const state3 = await getState(gauge, xmyrd, myrd); + + expect(state3.myrdBalance).approximately(state0.myrdBalance + state0.pendingRebase, 1); + expect(state3.pendingRebase).eq(0n); + expect(state3.periodFinish).approximately(state2.timestamp + 7 * 24 * 60 * 60, 1); + expect(state3.period).eq(state1.period + 1); + expect(state3.activePeriod).eq(state1.period + 1); + + //------------------- Update period again + await TimeUtils.advanceBlocksOnTs(7 * 24 * 60 * 60); // 1 week + + await myrd.connect(myrdGovernance).transfer(signer, parseUnits("200")); + await myrd.connect(signer).approve(xmyrd, Misc.MAX_UINT); + await xmyrd.connect(signer).enter( parseUnits("200")); + await xmyrd.connect(signer).exit( parseUnits("200")); + + expect(await xmyrd.pendingRebase()).eq(parseUnits("100")); + + await gauge.connect(gaugeAsSigner).updatePeriod(0); + const state4 = await getState(gauge, xmyrd, myrd); + + expect(state4.myrdBalance).approximately(state0.myrdBalance + state0.pendingRebase + parseUnits("100"), 1); + expect(state4.pendingRebase).eq(0); + expect(state4.periodFinish).approximately(state3.periodFinish + 7 * 24 * 60 * 60, 100); + expect(state4.period).eq(state3.period + 1); + expect(state4.activePeriod).eq(state3.period + 1); + + }); +}); diff --git a/yarn.lock b/yarn.lock index 1a80ad7..ea1d53c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -626,6 +626,11 @@ resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== +"@ethereumjs/rlp@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-5.0.2.tgz#c89bd82f2f3bec248ab2d517ae25f5bbc4aac842" + integrity sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA== + "@ethereumjs/util@^8.1.0": version "8.1.0" resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" @@ -635,6 +640,14 @@ ethereum-cryptography "^2.0.0" micro-ftch "^0.3.1" +"@ethereumjs/util@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.1.0.tgz#75e3898a3116d21c135fa9e29886565609129bce" + integrity sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog== + dependencies: + "@ethereumjs/rlp" "^5.0.2" + ethereum-cryptography "^2.2.1" + "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" @@ -1496,17 +1509,6 @@ resolved "https://registry.yarnpkg.com/@kamilkisiela/fast-url-parser/-/fast-url-parser-1.1.4.tgz#9d68877a489107411b953c54ea65d0658b515809" integrity sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew== -"@metamask/eth-sig-util@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" - integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== - dependencies: - ethereumjs-abi "^0.6.8" - ethereumjs-util "^6.2.1" - ethjs-util "^0.1.6" - tweetnacl "^1.0.3" - tweetnacl-util "^0.15.1" - "@noble/curves@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" @@ -1521,6 +1523,20 @@ dependencies: "@noble/hashes" "1.3.3" +"@noble/curves@1.4.2", "@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/curves@~1.8.1": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.2.tgz#8f24c037795e22b90ae29e222a856294c1d9ffc7" + integrity sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g== + dependencies: + "@noble/hashes" "1.7.2" + "@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" @@ -1536,6 +1552,16 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== +"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@1.7.2", "@noble/hashes@~1.7.1": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.2.tgz#d53c65a21658fb02f3303e7ee3ba89d6754c64b4" + integrity sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ== + "@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -1562,156 +1588,68 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/ethereumjs-block@5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.4.tgz#ff2acb98a86b9290e35e315a6abfb9aebb9cf39e" - integrity sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-blockchain@7.0.4": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.4.tgz#b77511b389290b186c8d999e70f4b15c27ef44ea" - integrity sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.4" - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-ethash" "3.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - lru-cache "^10.0.0" - -"@nomicfoundation/ethereumjs-common@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb" - integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg== - dependencies: - "@nomicfoundation/ethereumjs-util" "9.0.4" - -"@nomicfoundation/ethereumjs-ethash@3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.4.tgz#06cb2502b3012fb6c11cffd44af08aecf71310da" - integrity sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - bigint-crypto-utils "^3.2.2" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-evm@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.4.tgz#c9c761767283ac53946185474362230b169f8f63" - integrity sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-statemanager" "2.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - "@types/debug" "^4.1.9" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - rustbn-wasm "^0.2.0" - -"@nomicfoundation/ethereumjs-rlp@5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" - integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== - -"@nomicfoundation/ethereumjs-statemanager@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.4.tgz#bf14415e1f31b5ea8b98a0c027c547d0555059b6" - integrity sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - js-sdsl "^4.1.4" - lru-cache "^10.0.0" - -"@nomicfoundation/ethereumjs-trie@6.0.4": - version "6.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.4.tgz#688a3f76646c209365ee6d959c3d7330ede5e609" - integrity sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - "@types/readable-stream" "^2.3.13" - ethereum-cryptography "0.1.3" - lru-cache "^10.0.0" - readable-stream "^3.6.0" - -"@nomicfoundation/ethereumjs-tx@5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" - integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-util@9.0.4": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz#84c5274e82018b154244c877b76bc049a4ed7b38" - integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-verkle@0.0.2": - version "0.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-verkle/-/ethereumjs-verkle-0.0.2.tgz#7686689edec775b2efea5a71548f417c18f7dea4" - integrity sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - lru-cache "^10.0.0" - rust-verkle-wasm "^0.0.1" - -"@nomicfoundation/ethereumjs-vm@7.0.4": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.4.tgz#e5a6eec4877dc62dda93003c6d7afd1fe4b9625b" - integrity sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ== - dependencies: - "@nomicfoundation/ethereumjs-block" "5.0.4" - "@nomicfoundation/ethereumjs-blockchain" "7.0.4" - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-evm" "2.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-statemanager" "2.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/hardhat-chai-matchers@^2.0.2": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.6.tgz#ef88be3bd666adf29c06ac7882e96c8dbaaa32ba" - integrity sha512-Te1Uyo9oJcTCF0Jy9dztaLpshmlpjLf2yPtWXlXuLjMt3RRSmJLm/+rKVTW6gfadAEs12U/it6D0ZRnnRGiICQ== +"@nomicfoundation/edr-darwin-arm64@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.10.0.tgz#3a6952bdf3e2825937cb1aad737b6851e4c6df30" + integrity sha512-n0N+CVM4LKN9QeGZ5irr94Q4vwSs4u7W6jfuhNLmx1cpUxwE9RpeW+ym93JXDv62iVsbekeI5VsUEBHy0hymtA== + +"@nomicfoundation/edr-darwin-x64@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.10.0.tgz#e8e8a1b5e0e6df27d47dee38fbea7d1b77e92ee5" + integrity sha512-nmImWM/3qWopYzOmicMzK/MF3rFKpm2Biuc8GpQYTLjdXhmItpP9JwEPyjbAWv/1HI09C2pRzgNzKfTxoIgJ6w== + +"@nomicfoundation/edr-linux-arm64-gnu@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.10.0.tgz#0442b934d801abf1e94de517203f6c7cb24022a6" + integrity sha512-B/N1IyrCU7J6H4QckkQ1cSWAq1jSrJcXpO8GzRaQD1bgOOvg8wrUOrCD+Mfw7MLa6+X9vdZoXtPZOaaOQ9LmhA== + +"@nomicfoundation/edr-linux-arm64-musl@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.10.0.tgz#ece7f90113347b3c41ca9d0b27962cbc42e54a3d" + integrity sha512-NA9DFLB0LzcKy9mTCUzgnRDbmmSfW0CdO22ySwOy+MKt4Cr9eJi+XR5ZH933Rxpi6BWNkSPeS2ECETE25sJT3w== + +"@nomicfoundation/edr-linux-x64-gnu@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.10.0.tgz#aa2b6587f2dc5da280c696aaf3c8021edce36e4f" + integrity sha512-bDrbRTA9qZ9wSw5mqa8VpLFbf6ue2Z4qmRd08404eKm8RyBEFxjdHflFzCx46gz/Td0e+GLXy6KTVDj5D29r8w== + +"@nomicfoundation/edr-linux-x64-musl@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.10.0.tgz#fcb755e1f1926d713f3883856b5840e970ce9096" + integrity sha512-wx7yOlC/hx4N1xuIeh5cAebpzCTx8ZH8/z0IyYMf2t4v52KHERz4IyzBz5OLfd+0IqTRg8ZU5EnFBacIoPeP/g== + +"@nomicfoundation/edr-win32-x64-msvc@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.10.0.tgz#eb411d5a855a82cc9859a8889069c887ca5dde4b" + integrity sha512-DpBdVMimb+BUEs0E+nLGQ5JFHdGHyxQQNA+nh9V1eKtgarsV21S6br/d1vlQBMLQqkIzwmc6n+/O9Zjk2KfB3g== + +"@nomicfoundation/edr@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.10.0.tgz#c0d3476b348ae396458369d1589913154d774192" + integrity sha512-ed9qHSNssgh+0hYUx4ilDoMxxgf/sNT8SjnzgmA5A/LSXHaq2ax68bkdQ8otLYTlxHCO9BS5Nhb8bfajV4FZeA== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.10.0" + "@nomicfoundation/edr-darwin-x64" "0.10.0" + "@nomicfoundation/edr-linux-arm64-gnu" "0.10.0" + "@nomicfoundation/edr-linux-arm64-musl" "0.10.0" + "@nomicfoundation/edr-linux-x64-gnu" "0.10.0" + "@nomicfoundation/edr-linux-x64-musl" "0.10.0" + "@nomicfoundation/edr-win32-x64-msvc" "0.10.0" + +"@nomicfoundation/hardhat-chai-matchers@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.8.tgz#9c7cfc4ad0f0a5e9cf16aba8ab668c02f6e273aa" + integrity sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg== dependencies: "@types/chai-as-promised" "^7.1.3" chai-as-promised "^7.1.1" deep-eql "^4.0.1" ordinal "^1.0.3" -"@nomicfoundation/hardhat-ethers@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.5.tgz#0422c2123dec7c42e7fb2be8e1691f1d9708db56" - integrity sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw== +"@nomicfoundation/hardhat-ethers@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.8.tgz#af078f566373abeb77e11cbe69fe3dd47f8bfc27" + integrity sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA== dependencies: debug "^4.1.1" lodash.isequal "^4.5.0" @@ -1723,17 +1661,17 @@ dependencies: ethereumjs-util "^7.1.4" -"@nomicfoundation/hardhat-verify@^2.0.3": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.4.tgz#65b86787fc7b47d38fd941862266065c7eb9bca4" - integrity sha512-B8ZjhOrmbbRWqJi65jvQblzjsfYktjqj2vmOm+oc2Vu8drZbT2cjeSCRHZKbS7lOtfW78aJZSFvw+zRLCiABJA== +"@nomicfoundation/hardhat-verify@^2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.13.tgz#41691adc32e01dc5cf6b725615f64958fba2100b" + integrity sha512-i57GX1sC0kYGyRVnbQrjjyBTpWTKgrvKC+jH8CMKV6gHp959Upb8lKaZ58WRHIU0espkulTxLnacYeUDirwJ2g== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" cbor "^8.1.0" - chalk "^2.4.2" debug "^4.1.1" lodash.clonedeep "^4.5.0" + picocolors "^1.1.0" semver "^6.3.0" table "^6.8.0" undici "^5.14.0" @@ -1851,11 +1789,21 @@ resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.5.tgz#b77571685410217a548a9c753aa3cdfc215bfc78" integrity sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA== -"@scure/base@^1.1.1", "@scure/base@~1.1.0", "@scure/base@~1.1.4": +"@scure/base@~1.1.0", "@scure/base@~1.1.4": version "1.1.5" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== +"@scure/base@~1.1.6": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + +"@scure/base@~1.2.5": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.5.tgz#f9d1b232425b367d0dcb81c96611dcc651d58671" + integrity sha512-9rE6EOVeIQzt5TSu4v+K523F8u6DhBsoZWPGKlnCshhlDhy0kJzUX4V+tr2dWmzF1GdekvThABoEQBGBQI7xZw== + "@scure/bip32@1.1.5": version "1.1.5" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" @@ -1874,6 +1822,15 @@ "@noble/hashes" "~1.3.2" "@scure/base" "~1.1.4" +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + "@scure/bip39@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" @@ -1890,6 +1847,14 @@ "@noble/hashes" "~1.3.2" "@scure/base" "~1.1.4" +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== + dependencies: + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" @@ -2043,13 +2008,6 @@ dependencies: "@types/node" "*" -"@types/debug@^4.1.9": - version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== - dependencies: - "@types/ms" "*" - "@types/form-data@0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" @@ -2112,11 +2070,6 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b" integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== -"@types/ms@*": - version "0.7.34" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" - integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== - "@types/node@*": version "20.11.19" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195" @@ -2184,14 +2137,6 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/readable-stream@^2.3.13": - version "2.3.15" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" - integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== - dependencies: - "@types/node" "*" - safe-buffer "~5.1.1" - "@types/resolve@^0.0.8": version "0.0.8" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" @@ -2825,11 +2770,6 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -bigint-crypto-utils@^3.2.2: - version "3.3.0" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" - integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -2854,7 +2794,7 @@ bn.js@4.11.6: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== -bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.11.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -3161,7 +3101,7 @@ chokidar@3.5.3: optionalDependencies: fsevents "~2.3.2" -chokidar@^3.4.0, chokidar@^3.5.2: +chokidar@^3.5.2: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -3176,6 +3116,13 @@ chokidar@^3.4.0, chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -3353,10 +3300,10 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== common-tags@1.8.2: version "1.8.2" @@ -3537,7 +3484,7 @@ debounce@^1.2.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4051,7 +3998,7 @@ ethereum-bloom-filters@^1.0.6: dependencies: js-sha3 "^0.8.0" -ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: +ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -4092,13 +4039,15 @@ ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: "@scure/bip32" "1.3.3" "@scure/bip39" "1.2.2" -ethereumjs-abi@^0.6.8: - version "0.6.8" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" - integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== +ethereum-cryptography@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" ethereumjs-common@^1.5.0: version "1.5.2" @@ -4113,7 +4062,7 @@ ethereumjs-tx@^2.1.2: ethereumjs-common "^1.5.0" ethereumjs-util "^6.0.0" -ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: +ethereumjs-util@^6.0.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== @@ -4194,7 +4143,7 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" -ethjs-util@0.1.6, ethjs-util@^0.1.6: +ethjs-util@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== @@ -4306,6 +4255,11 @@ fbjs@^3.0.0: setimmediate "^1.0.5" ua-parser-js "^1.0.35" +fdir@^6.4.4: + version "6.4.4" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" + integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== + fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" @@ -4350,13 +4304,6 @@ find-up@5.0.0, find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -4446,17 +4393,6 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -4603,18 +4539,6 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" @@ -4728,7 +4652,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -4857,24 +4781,14 @@ hardhat-ignore-warnings@^0.2.9: node-interval-tree "^2.0.1" solidity-comments "^0.0.2" -hardhat@^2.19.3: - version "2.20.1" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.20.1.tgz#3ad8f2b003a96c9ce80a55fec3575580ff2ddcd4" - integrity sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw== +hardhat@^2.23.0: + version "2.23.0" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.23.0.tgz#c3b404410ea52c41f3200cc011f5b4cebd7d80bd" + integrity sha512-xnORx1LgX46TxylOFme96JmSAIjXuHUVpOlUnaCt8MKMGsgy0NGsfPo5rJI/ncCBPLFLURGfZUQ2Uc6ZYN4kYg== dependencies: + "@ethereumjs/util" "^9.1.0" "@ethersproject/abi" "^5.1.2" - "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "5.0.4" - "@nomicfoundation/ethereumjs-blockchain" "7.0.4" - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-evm" "2.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-statemanager" "2.0.4" - "@nomicfoundation/ethereumjs-trie" "6.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" - "@nomicfoundation/ethereumjs-verkle" "0.0.2" - "@nomicfoundation/ethereumjs-vm" "7.0.4" + "@nomicfoundation/edr" "^0.10.0" "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" @@ -4883,31 +4797,32 @@ hardhat@^2.19.3: aggregate-error "^3.0.0" ansi-escapes "^4.3.0" boxen "^5.1.2" - chalk "^2.4.2" - chokidar "^3.4.0" + chokidar "^4.0.0" ci-info "^2.0.0" debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" ethereum-cryptography "^1.0.3" - ethereumjs-abi "^0.6.8" - find-up "^2.1.0" + find-up "^5.0.0" fp-ts "1.19.3" fs-extra "^7.0.1" - glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + json-stream-stringify "^3.1.4" keccak "^3.0.2" lodash "^4.17.11" + micro-eth-signer "^0.14.0" mnemonist "^0.38.0" mocha "^10.0.0" p-map "^4.0.0" + picocolors "^1.1.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - solc "0.7.3" + solc "0.8.26" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" + tinyglobby "^0.2.6" tsort "0.0.1" undici "^5.14.0" uuid "^8.3.2" @@ -5458,11 +5373,6 @@ jose@^5.0.0: resolved "https://registry.yarnpkg.com/jose/-/jose-5.2.2.tgz#b91170e9ba6dbe609b0c0a86568f9a1fbe4335c0" integrity sha512-/WByRr4jDcsKlvMd1dRJnPfS1GVO3WuKyaurJ/vvXcOaUQO8rnNObCQMlv/5uCceVQIq5Q4WLF44ohsdiTohdg== -js-sdsl@^4.1.4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" - integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== - js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" @@ -5528,6 +5438,11 @@ json-stable-stringify@^1.0.1: jsonify "^0.0.1" object-keys "^1.1.1" +json-stream-stringify@^3.1.4: + version "3.1.6" + resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" + integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== + json-to-pretty-yaml@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz#f4cd0bd0a5e8fe1df25aaf5ba118b099fd992d5b" @@ -5548,13 +5463,6 @@ json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -5607,13 +5515,6 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== - optionalDependencies: - graceful-fs "^4.1.9" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -5649,14 +5550,6 @@ listr2@^4.0.5: through "^2.3.8" wrap-ansi "^7.0.0" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -5752,11 +5645,6 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lru-cache@^10.0.0, "lru-cache@^9.1.1 || ^10.0.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -5771,6 +5659,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" @@ -5820,11 +5713,27 @@ meros@^1.2.1: resolved "https://registry.yarnpkg.com/meros/-/meros-1.3.0.tgz#c617d2092739d55286bf618129280f362e6242f2" integrity sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w== +micro-eth-signer@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz#8aa1fe997d98d6bdf42f2071cef7eb01a66ecb22" + integrity sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw== + dependencies: + "@noble/curves" "~1.8.1" + "@noble/hashes" "~1.7.1" + micro-packed "~0.7.2" + micro-ftch@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== +micro-packed@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/micro-packed/-/micro-packed-0.7.3.tgz#59e96b139dffeda22705c7a041476f24cabb12b6" + integrity sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg== + dependencies: + "@scure/base" "~1.2.5" + micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -6237,13 +6146,6 @@ p-limit@3.1.0, p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -6251,13 +6153,6 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -6279,11 +6174,6 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -6366,11 +6256,6 @@ path-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -6500,11 +6385,21 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -6685,6 +6580,11 @@ readable-stream@^3.4.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -6784,7 +6684,7 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-from-string@^2.0.0, require-from-string@^2.0.2: +require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -6853,7 +6753,7 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== -rimraf@^2.2.8, rimraf@^2.6.2: +rimraf@^2.6.2: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -6894,18 +6794,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rust-verkle-wasm@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/rust-verkle-wasm/-/rust-verkle-wasm-0.0.1.tgz#fd8396a7060d8ee8ea10da50ab6e862948095a74" - integrity sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA== - -rustbn-wasm@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz#0407521fb55ae69eeb4968d01885d63efd1c4ff9" - integrity sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg== - dependencies: - "@scure/base" "^1.1.1" - rxjs@^7.5.5, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" @@ -7165,18 +7053,16 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== dependencies: command-exists "^1.2.8" - commander "3.0.2" + commander "^8.1.0" follow-redirects "^1.12.1" - fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" @@ -7592,6 +7478,14 @@ through@^2.3.6, through@^2.3.8: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tinyglobby@^0.2.6: + version "0.2.13" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" + integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== + dependencies: + fdir "^6.4.4" + picomatch "^4.0.2" + title-case@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" @@ -7739,16 +7633,6 @@ tsort@0.0.1: resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== -tweetnacl-util@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" - integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== - -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"