diff --git a/package.json b/package.json index 45282aa78..5808128ba 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "lint:json": "prettier -w --cache --log-level warn 'packages/**/*.json' '.changeset/**/*.json' '*.json'", "lint:yaml": "npx yaml-lint .github/**/*.{yml,yaml} packages/contracts/task/config/*.yml; prettier -w --cache --log-level warn 'packages/**/*.{yml,yaml}' '.github/**/*.{yml,yaml}'", "test": "pnpm build && pnpm -r run test:self", + "test:prod": "FOUNDRY_PROFILE=prod pnpm test", "test:coverage": "pnpm build && pnpm -r run build:self:coverage && pnpm -r run test:coverage:self" }, "devDependencies": { diff --git a/packages/contracts-test/tests/unit/rewards/rewards-interface.test.ts b/packages/contracts-test/tests/unit/rewards/rewards-interface.test.ts index 7bbfebe6b..db77d5f9b 100644 --- a/packages/contracts-test/tests/unit/rewards/rewards-interface.test.ts +++ b/packages/contracts-test/tests/unit/rewards/rewards-interface.test.ts @@ -1,5 +1,10 @@ import { RewardsManager } from '@graphprotocol/contracts' -import { IERC165__factory, IIssuanceTarget__factory, IRewardsManager__factory } from '@graphprotocol/interfaces/types' +import { + IERC165__factory, + IIssuanceTarget__factory, + IProviderEligibilityManagement__factory, + IRewardsManager__factory, +} from '@graphprotocol/interfaces/types' import { GraphNetworkContracts, toGRT } from '@graphprotocol/sdk' import type { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' import { expect } from 'chai' @@ -78,6 +83,11 @@ describe('RewardsManager interfaces', () => { expect(supports).to.be.true }) + it('should support IProviderEligibilityManagement interface', async function () { + const supports = await rewardsManager.supportsInterface(IProviderEligibilityManagement__factory.interfaceId) + expect(supports).to.be.true + }) + it('should return false for unsupported interfaces', async function () { // Test with an unknown interface ID const unknownInterfaceId = '0x12345678' // Random interface ID diff --git a/packages/data-edge/hardhat.config.ts b/packages/data-edge/hardhat.config.ts index 807580f49..a3b1ccff4 100644 --- a/packages/data-edge/hardhat.config.ts +++ b/packages/data-edge/hardhat.config.ts @@ -101,7 +101,7 @@ const config: HardhatUserConfig = { solidity: { compilers: [ { - version: '0.8.12', + version: '0.8.35', settings: { optimizer: { enabled: true, diff --git a/packages/horizon/contracts/mocks/AfterCollectionGasReportingMock.sol b/packages/horizon/contracts/mocks/AfterCollectionGasReportingMock.sol new file mode 100644 index 000000000..cc2a2c788 --- /dev/null +++ b/packages/horizon/contracts/mocks/AfterCollectionGasReportingMock.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// solhint-disable no-unused-vars + +pragma solidity ^0.8.27; + +/** + * @title AfterCollectionGasReportingMock + * @author Edge & Node + * @notice Test-only mock used by the warm-path `CallbackGasProbe` boundary test. Returns + * `gasleft()` from `afterCollection` so the probe can read back the forwarded-gas value via + * returndata, and provides a no-op `isEligible` for the warm-up staticcall. + * + * @dev `afterCollection` shares its selector with `IAgreementOwner.afterCollection` but + * intentionally diverges on return type (returns `uint256` so the probe can decode the + * gasleft sample). Production dispatch in `RecurringCollector._postCollectCallback` discards + * returndata, so this divergence does not affect the gas accounting under measurement. + */ +contract AfterCollectionGasReportingMock { + /// @notice No-op warm-up target. Returning a value is irrelevant — the probe only runs + /// this to warm `payer`'s entry on the access list before the timed CALL. + /// @param payer Ignored. + /// @return Always true. + function isEligible(address payer) external pure returns (bool) { + payer; + return true; + } + + /// @notice Returns the `gasleft()` value observed at function entry. View so the probe + /// can be invoked via `eth_call` (Hardhat `staticCall`) without committing state. + /// @param agreementId Ignored. + /// @param tokens Ignored. + /// @return The result of `gasleft()` at function entry. + function afterCollection(bytes16 agreementId, uint256 tokens) external view returns (uint256) { + agreementId; + tokens; + return gasleft(); + } +} diff --git a/packages/horizon/contracts/mocks/CallbackGasProbe.sol b/packages/horizon/contracts/mocks/CallbackGasProbe.sol index 3bf76a5e6..48a29dc11 100644 --- a/packages/horizon/contracts/mocks/CallbackGasProbe.sol +++ b/packages/horizon/contracts/mocks/CallbackGasProbe.sol @@ -3,19 +3,22 @@ pragma solidity ^0.8.27; import { IProviderEligibility } from "@graphprotocol/interfaces/contracts/issuance/eligibility/IProviderEligibility.sol"; +import { IAgreementOwner } from "@graphprotocol/interfaces/contracts/horizon/IAgreementOwner.sol"; /** * @title CallbackGasProbe * @author Edge & Node - * @notice Test-only contract that replicates the precheck + STATICCALL pattern used by - * `RecurringCollector._preCollectCallbacks` for the eligibility path. Exists so that + * @notice Test-only contract that replicates the precheck + STATICCALL/CALL patterns used by + * `RecurringCollector._preCollectCallbacks` (eligibility, cold path) and + * `RecurringCollector._postCollectCallback` (afterCollection, warm path). Exists so that * Hardhat-side tests can verify, on a real EIP-2929-applying EVM (foundry's REVM in this * project does not differentiate cold/warm in `gasleft()`-derived measurements), that - * `CALLBACK_GAS_OVERHEAD` covers the cold-account access cost on the staticcall. + * `CALLBACK_GAS_OVERHEAD` covers both the cold-account access cost on the staticcall and the + * warm-call dispatch overhead on the after-collection CALL. * - * @dev MUST be kept in sync with the equivalent block in `RecurringCollector.sol`. If the + * @dev MUST be kept in sync with the equivalent blocks in `RecurringCollector.sol`. If the * production constants (`MAX_PAYER_CALLBACK_GAS`, `CALLBACK_GAS_OVERHEAD`) or the precheck / - * staticcall sequence change, mirror the change here. This probe is not deployed to any + * staticcall / call sequence change, mirror the change here. This probe is not deployed to any * production network. */ contract CallbackGasProbe { @@ -24,6 +27,7 @@ contract CallbackGasProbe { error CallbackGasProbeInsufficientCallbackGas(); error CallbackGasProbeNotEligible(); + error CallbackGasProbeAfterCollectionFailed(); /** * @notice Re-runs the eligibility precheck + STATICCALL exactly as @@ -54,4 +58,59 @@ contract CallbackGasProbe { revert CallbackGasProbeNotEligible(); } } + + /** + * @notice Re-runs the after-collection precheck + CALL exactly as + * `RecurringCollector._postCollectCallback` does, against `payer`. Warms the payer first + * (mirroring the eligibility staticcall site that runs ahead of the after-callback in + * `_collect`) so the CALL itself measures warm-path δ. + * + * Returns the `gasleft()` the callee observed at function entry, captured from the + * callee's 32-byte return word. Boundary tests use this to assert that, at the lowest + * outer gas at which the precheck just clears, the forwarded gas stays within tolerance + * of `MAX_PAYER_CALLBACK_GAS` — i.e. `CALLBACK_GAS_OVERHEAD ≥ δ_warm`. Reverts with + * `CallbackGasProbeInsufficientCallbackGas` if the precheck blocks, or + * `CallbackGasProbeAfterCollectionFailed` if the CALL itself fails. + * + * @dev Diverges from production in exactly one respect: it reads back the callee's + * returndata so the test can observe the warm-path forwarded-gas value. Production + * dispatch in `_postCollectCallback` discards returndata via `call(..., 0, 0)`. The + * gas accounting up to and through the CALL opcode is identical. + * @param payer The contract whose `afterCollection` should be invoked. + * @return received The `gasleft()` value the callee saw at function entry. + */ + function probeAfterCollection(address payer) external returns (uint256 received) { + // Warm payer's account access list. In production, `_preCollectCallbacks` is the + // first to touch `payer` (eligibility staticcall), so by the time + // `_postCollectCallback` issues its CALL the account is warm. Replicate that here + // with a staticcall whose return value we don't care about. + bytes memory eligCd = abi.encodeCall(IProviderEligibility.isEligible, (address(0))); + // solhint-disable-next-line no-inline-assembly + assembly { + // Output buffer is irrelevant — we ignore the result; this exists only to warm payer. + pop(staticcall(MAX_PAYER_CALLBACK_GAS, payer, add(eligCd, 0x20), mload(eligCd), 0, 0)) + } + + // Precheck — same expression as `_postCollectCallback`. + if (gasleft() < (MAX_PAYER_CALLBACK_GAS * 64) / 63 + CALLBACK_GAS_OVERHEAD) { + revert CallbackGasProbeInsufficientCallbackGas(); + } + + // CALL afterCollection — same opcode and gas limit as `_postCollectCallback`. + bytes memory cd = abi.encodeCall(IAgreementOwner.afterCollection, (bytes16(0), 0)); + bool ok; + // solhint-disable-next-line no-inline-assembly + assembly { + ok := call(MAX_PAYER_CALLBACK_GAS, payer, 0, add(cd, 0x20), mload(cd), 0, 0) + } + if (!ok) revert CallbackGasProbeAfterCollectionFailed(); + + // Capture the 32-byte gasleft value the callee returned. Note RC discards returndata + // here (call(..., 0, 0)); we read it back only so the test can assert on it. + // solhint-disable-next-line no-inline-assembly + assembly { + returndatacopy(0, 0, 32) + received := mload(0) + } + } } diff --git a/packages/horizon/contracts/payments/collectors/RecurringCollector.sol b/packages/horizon/contracts/payments/collectors/RecurringCollector.sol index d56d6580b..dd89dabad 100644 --- a/packages/horizon/contracts/payments/collectors/RecurringCollector.sol +++ b/packages/horizon/contracts/payments/collectors/RecurringCollector.sol @@ -135,11 +135,7 @@ contract RecurringCollector is } } - /** - * @notice List of pause guardians and their allowed status - * @param pauseGuardian The address to check - * @return Whether the address is a pause guardian - */ + /// @inheritdoc IRecurringCollector function pauseGuardians(address pauseGuardian) public view override returns (bool) { return _getStorage().pauseGuardians[pauseGuardian]; } @@ -208,12 +204,8 @@ contract RecurringCollector is emit PauseGuardianSet(_pauseGuardian, _allowed); } - /** - * @inheritdoc IPaymentsCollector - * @notice Initiate a payment collection through the payments protocol. - * See {IPaymentsCollector.collect}. - * @dev Caller must be the data service the RCA was issued to. - */ + /// @inheritdoc IPaymentsCollector + /// @dev Caller must be the data service the RCA was issued to. function collect( IGraphPayments.PaymentTypes paymentType, bytes calldata data @@ -225,11 +217,7 @@ contract RecurringCollector is } } - /** - * @inheritdoc IRecurringCollector - * @notice Accept a Recurring Collection Agreement. - * @dev Caller must be the data service the RCA was issued to. - */ + /// @inheritdoc IRecurringCollector function accept( RecurringCollectionAgreement calldata rca, bytes calldata signature @@ -321,12 +309,7 @@ contract RecurringCollector is agreement.updateNonce = 0; } - /** - * @inheritdoc IRecurringCollector - * @notice Cancel a Recurring Collection Agreement. - * See {IRecurringCollector.cancel}. - * @dev Caller must be the data service for the agreement. - */ + /// @inheritdoc IRecurringCollector function cancel(bytes16 agreementId, CancelAgreementBy by) external whenNotPaused { RecurringCollectorStorage storage $ = _getStorage(); AgreementData storage agreement = $.agreements[agreementId]; @@ -351,13 +334,9 @@ contract RecurringCollector is emit AgreementCanceled(agreement.dataService, agreement.payer, agreement.serviceProvider, agreementId, by); } - /** - * @inheritdoc IRecurringCollector - * @notice Update a Recurring Collection Agreement. - * @dev Caller must be the data service for the agreement. - * @dev Note: Updated pricing terms apply immediately and will affect the next collection - * for the entire period since lastCollectionAt. - */ + /// @inheritdoc IRecurringCollector + /// @dev Updated pricing terms apply immediately and affect the next collection for the + /// entire period since lastCollectionAt. function update(RecurringCollectionAgreementUpdate calldata rcau, bytes calldata signature) external whenNotPaused { AgreementData storage agreement = _requireValidUpdateTarget(rcau.agreementId); @@ -1351,8 +1330,11 @@ contract RecurringCollector is ); if (block.timestamp <= rcau.deadline) { + uint256 collectionStart = _a.state == AgreementState.Accepted + ? _agreementCollectionStartAt(_a) + : block.timestamp; uint256 maxPendingClaim = _maxClaim( - block.timestamp, + collectionStart, rcau.endsAt, rcau.maxSecondsPerCollection, rcau.maxOngoingTokensPerSecond, diff --git a/packages/horizon/foundry.toml b/packages/horizon/foundry.toml index c13f2ebe0..3f810e892 100644 --- a/packages/horizon/foundry.toml +++ b/packages/horizon/foundry.toml @@ -3,15 +3,30 @@ src = 'contracts' out = 'build' libs = ["node_modules"] test = 'test' -cache_path = 'cache_forge' -fs_permissions = [{ access = "read", path = "./"}] -optimizer = true -optimizer_runs = 100 +cache_path = 'cache_forge' +fs_permissions = [{ access = "read", path = "./" }] +solc_version = '0.8.35' +evm_version = 'cancun' +# Suppress solc warnings emitted from third-party code we don't control +# (e.g. @openzeppelin/foundry-upgrades' state-mutability suggestions). +ignored_warnings_from = ["node_modules"] # Exclude test files from coverage reports no_match_coverage = "(^test/|/mocks/)" +# Opt-in profile for production-matching bytecode (viaIR + optimizer). +# Use FOUNDRY_PROFILE=prod for CI / pre-merge runs that should mirror what hardhat +# compiles for deploy. Default profile stays optimizer-off / viaIR-off for fast iteration. +[profile.prod] +optimizer = true +optimizer_runs = 100 +via_ir = true + # Lint configuration [lint] +# Disable lint-on-build: forge build's auto-lint scans test/ files which use bytes32("...") +# literal IDs that trigger spurious unsafe-typecast warnings. `pnpm lint:forge` (scoped to +# contracts/) remains the canonical lint path for production code. +lint_on_build = false ignore = ["contracts/mocks/imports.sol"] exclude_lints = ["mixed-case-function", "mixed-case-variable", "block-timestamp"] diff --git a/packages/horizon/hardhat.config.ts b/packages/horizon/hardhat.config.ts index d9b1334e4..bbc804613 100644 --- a/packages/horizon/hardhat.config.ts +++ b/packages/horizon/hardhat.config.ts @@ -17,15 +17,6 @@ if (isProjectBuilt(__dirname)) { const baseConfig = hardhatBaseConfig(require) const config: HardhatUserConfig = { ...baseConfig, - solidity: { - version: '0.8.27', - settings: { - optimizer: { - enabled: true, - runs: 20, - }, - }, - }, etherscan: { ...baseConfig.etherscan, }, diff --git a/packages/horizon/test/deployment/RecurringCollectorCallbackGas.test.ts b/packages/horizon/test/deployment/RecurringCollectorCallbackGas.test.ts index 9fb6b51ba..681405025 100644 --- a/packages/horizon/test/deployment/RecurringCollectorCallbackGas.test.ts +++ b/packages/horizon/test/deployment/RecurringCollectorCallbackGas.test.ts @@ -3,34 +3,40 @@ import hre from 'hardhat' import { ethers } from 'hardhat' /** - * Cold-path boundary check for `CALLBACK_GAS_OVERHEAD` in `RecurringCollector`. + * Boundary checks for `CALLBACK_GAS_OVERHEAD` in `RecurringCollector`. * * Foundry/REVM in this project does not differentiate cold/warm account access in * `gasleft()`-derived measurements (verified empirically: `vm.cool` produces no gas * differential, and a fresh-deployed contract's first staticcall costs the same as a - * subsequent one). The Foundry warm-path test - * (`test_Collect_Callbacks_ReceiveMaxPayerCallbackGas` in `afterCollection.t.sol`) bounds - * the warm δ; this Hardhat-side test exercises the cold δ that `CALLBACK_GAS_OVERHEAD` - * was actually sized for (EIP-2929 cold-account access ≈ 2_600 gas). + * subsequent one). Both directions — cold δ on the eligibility staticcall, warm δ on + * the after-collection CALL — therefore need a Hardhat-side test against an EIP-2929- + * applying EVM. Each `it(...)` block here covers one direction. * - * Each `await probe.probeEligibility(...)` is a fresh ethers transaction, so each one - * starts with an empty access list — the first access to `payer` inside the call genuinely - * incurs the cold-access cost on Hardhat Network's EVM (which does apply EIP-2929). - * - * Discriminator at the boundary: - * - `CallbackGasProbeInsufficientCallbackGas` at `hi - 1` → precheck is the gate, OVERHEAD - * covers cold δ. - * - `CallbackGasProbeNotEligible` at `hi - 1` → precheck passed but forwarded gas was - * below `MAX − tolerance`, i.e. OVERHEAD < cold δ. - * - * **If this test fails with `NotEligible`**, `CALLBACK_GAS_OVERHEAD` no longer covers the - * cold-access cost. Action: bump it in `RecurringCollector.sol` (and mirror in - * `CallbackGasProbe.sol`); do not raise `tolerance` here. + * The horizon Foundry tests retain the *negative* boundary + * (`test_Collect_Revert_WhenInsufficientCallbackGas*` in `afterCollection.t.sol`): + * `gasleft < threshold` reverts with `InsufficientCallbackGas`. Those exercises don't + * depend on cold/warm differentiation. The *positive* boundary — at lowest passing gas, + * the forwarded gas is within tolerance of MAX — does, and lives here. */ -describe('RecurringCollector callback gas overhead (cold path)', () => { +describe('RecurringCollector callback gas overhead', () => { const MAX_PAYER_CALLBACK_GAS = 1_500_000n const TOLERANCE = 500n + /** + * Each `await probe.probeEligibility(...)` is a fresh ethers transaction, so each one + * starts with an empty access list — the first access to `payer` inside the call genuinely + * incurs the cold-access cost on Hardhat Network's EVM (which does apply EIP-2929). + * + * Discriminator at the boundary: + * - `CallbackGasProbeInsufficientCallbackGas` at `hi - 1` → precheck is the gate, OVERHEAD + * covers cold δ. + * - `CallbackGasProbeNotEligible` at `hi - 1` → precheck passed but forwarded gas was + * below `MAX − tolerance`, i.e. OVERHEAD < cold δ. + * + * **If this test fails with `NotEligible`**, `CALLBACK_GAS_OVERHEAD` no longer covers the + * cold-access cost. Action: bump it in `RecurringCollector.sol` (and mirror in + * `CallbackGasProbe.sol`); do not raise `tolerance` here. + */ it('CALLBACK_GAS_OVERHEAD covers cold-access cost on the eligibility staticcall', async () => { // Deploy the probe and a gasleft-reporting eligibility mock. The mock returns // false from isEligible() if forwarded gas dropped below MAX_PAYER_CALLBACK_GAS - TOLERANCE. @@ -91,6 +97,75 @@ describe('RecurringCollector callback gas overhead (cold path)', () => { `boundary revert at hi-1 was ${failure.reason}, expected InsufficientCallbackGas — CALLBACK_GAS_OVERHEAD does not cover cold delta`, ).to.equal('InsufficientCallbackGas') }) + + /** + * Warm-path counterpart: the after-collection CALL in `_postCollectCallback`. The probe + * first warms `payer` via a staticcall (mirroring the eligibility site that runs ahead + * of the after-callback in `_collect`), then does the precheck + CALL pattern. + * + * At the lowest outer gas at which the precheck just clears, EIP-150's `gasleft * 63/64` + * cap is at its tightest — the forwarded gas is `MAX − δ_warm`, where δ_warm is the + * pre-CALL Solidity overhead between `gasleft()` and the CALL opcode plus the warm CALL + * fixed cost. Asserting `received >= MAX − tolerance` verifies that + * `CALLBACK_GAS_OVERHEAD ≥ δ_warm` at the production configuration. + * + * **If this test fails** look at *what changed*: + * - You added pre-CALL Solidity overhead (extra arg encoding, an SLOAD before the + * assembly block, code between `gasleft()` and CALL). + * Action: bump `CALLBACK_GAS_OVERHEAD` in `RecurringCollector.sol` (and mirror in + * `CallbackGasProbe.sol`); **don't** just raise `TOLERANCE` here. + * - You changed `MAX_PAYER_CALLBACK_GAS`. Update `MAX_PAYER_CALLBACK_GAS` here to follow. + */ + it('CALLBACK_GAS_OVERHEAD covers warm-path δ on the after-collection CALL', async () => { + const ProbeFactory = await ethers.getContractFactory('CallbackGasProbe') + const probe = await ProbeFactory.deploy() + await probe.waitForDeployment() + + const MockFactory = await ethers.getContractFactory('AfterCollectionGasReportingMock') + const mock = await MockFactory.deploy() + await mock.waitForDeployment() + + type Outcome = { ok: true; received: bigint } | { ok: false; reason: string } + + const callBoundary = async (gasLimit: bigint): Promise => { + try { + const received = await probe.probeAfterCollection.staticCall(await mock.getAddress(), { gasLimit }) + return { ok: true, received: BigInt(received) } + } catch (e: any) { + const data: string = e?.data ?? e?.info?.error?.data ?? '' + if (typeof data === 'string' && data.startsWith('0x')) { + const insufficientSel = probe.interface.getError('CallbackGasProbeInsufficientCallbackGas')!.selector + const failedSel = probe.interface.getError('CallbackGasProbeAfterCollectionFailed')!.selector + if (data.startsWith(insufficientSel)) return { ok: false, reason: 'InsufficientCallbackGas' } + if (data.startsWith(failedSel)) return { ok: false, reason: 'AfterCollectionFailed' } + } + return { ok: false, reason: 'oog-or-other' } + } + } + + // Binary search the lowest gas at which the probe succeeds. + let lo = 1_500_000n + let hi = 2_000_000n + while (hi - lo > 1n) { + const mid = (lo + hi) / 2n + const result = await callBoundary(mid) + if (result.ok) hi = mid + else lo = mid + } + + // Re-run at the lowest passing gas; this is where the precheck is just satisfied so the + // EIP-150 cap is tightest. The callee's recorded gasleft must stay within tolerance of MAX. + const settled = await callBoundary(hi) + expect(settled.ok, 'binary search settled on a gas value where probe should succeed').to.be.true + if (!settled.ok) return // narrowing for TS + + expect( + settled.received, + `afterCollection received ${settled.received} < MAX_PAYER_CALLBACK_GAS - TOLERANCE (${ + MAX_PAYER_CALLBACK_GAS - TOLERANCE + }) at boundary gas: CALLBACK_GAS_OVERHEAD margin eroded`, + ).to.be.gte(MAX_PAYER_CALLBACK_GAS - TOLERANCE) + }) }) // Suppress lint about unused hre import; some hardhat plugins require it for side effects. diff --git a/packages/horizon/test/unit/data-service/extensions/DataServiceFees.t.sol b/packages/horizon/test/unit/data-service/extensions/DataServiceFees.t.sol index 5692dd952..b5ab2442a 100644 --- a/packages/horizon/test/unit/data-service/extensions/DataServiceFees.t.sol +++ b/packages/horizon/test/unit/data-service/extensions/DataServiceFees.t.sol @@ -101,6 +101,15 @@ contract DataServiceFeesTest is HorizonStakingSharedTest { _assertReleaseStake(users.indexer, numClaimsToRelease); } + function test_ProcessStakeClaim_RevertWhen_ClaimNotFound() external { + StakeClaimsHarness harness = new StakeClaimsHarness(); + bytes32 unknownClaimId = keccak256("unknown"); + bytes memory acc = abi.encode(uint256(0), address(0)); + + vm.expectRevert(abi.encodeWithSelector(StakeClaims.StakeClaimsClaimNotFound.selector, unknownClaimId)); + harness.processStakeClaim(unknownClaimId, acc); + } + function test_Release_WhenNIsNotValid( uint256 tokens, uint256 steps @@ -238,3 +247,12 @@ contract DataServiceFeesTest is HorizonStakingSharedTest { assertEq(afterTail, calcValues.claimsCount == beforeCount ? bytes32(0) : beforeTail); } } + +contract StakeClaimsHarness { + mapping(address serviceProvider => uint256 tokens) public feesProvisionTracker; + mapping(bytes32 claimId => StakeClaims.StakeClaim claim) public claims; + + function processStakeClaim(bytes32 claimId, bytes memory acc) external returns (bool, bytes memory) { + return StakeClaims.processStakeClaim(feesProvisionTracker, claims, claimId, acc); + } +} diff --git a/packages/horizon/test/unit/payments/graph-tally-collector/GraphTallyCollector.t.sol b/packages/horizon/test/unit/payments/graph-tally-collector/GraphTallyCollector.t.sol index 4b05992f3..bd022f1d3 100644 --- a/packages/horizon/test/unit/payments/graph-tally-collector/GraphTallyCollector.t.sol +++ b/packages/horizon/test/unit/payments/graph-tally-collector/GraphTallyCollector.t.sol @@ -42,7 +42,7 @@ contract GraphTallyTest is HorizonStakingSharedTest, PaymentsEscrowSharedTest { * HELPERS */ - function _getSignerProof(uint256 _proofDeadline, uint256 _signer) internal returns (bytes memory) { + function _getSignerProof(uint256 _proofDeadline, uint256 _signer) internal view returns (bytes memory) { (, address msgSender, ) = vm.readCallers(); bytes32 messageHash = keccak256( abi.encodePacked( diff --git a/packages/horizon/test/unit/payments/recurring-collector/RecurringCollectorHelper.t.sol b/packages/horizon/test/unit/payments/recurring-collector/RecurringCollectorHelper.t.sol index a512d0321..29700d488 100644 --- a/packages/horizon/test/unit/payments/recurring-collector/RecurringCollectorHelper.t.sol +++ b/packages/horizon/test/unit/payments/recurring-collector/RecurringCollectorHelper.t.sol @@ -177,7 +177,7 @@ contract RecurringCollectorHelper is AuthorizableHelper, Bounder { function _sensibleMaxSecondsPerCollection( uint32 _seed, uint32 _minSecondsPerCollection - ) internal view returns (uint32) { + ) internal pure returns (uint32) { return uint32( bound( diff --git a/packages/horizon/test/unit/payments/recurring-collector/afterCollection.t.sol b/packages/horizon/test/unit/payments/recurring-collector/afterCollection.t.sol index 63d72d809..de2a01eb1 100644 --- a/packages/horizon/test/unit/payments/recurring-collector/afterCollection.t.sol +++ b/packages/horizon/test/unit/payments/recurring-collector/afterCollection.t.sol @@ -275,89 +275,6 @@ contract RecurringCollectorAfterCollectionTest is RecurringCollectorSharedTest { assertTrue(triggered, "eligibility precheck must trip InsufficientCallbackGas under tight gas"); } - /// @notice Boundary regression check on CALLBACK_GAS_OVERHEAD: at the lowest gas at which - /// `collect` succeeds, the after-callback precheck is just barely satisfied, so the EIP-150 - /// `gasleft * 63/64` cap is at its tightest. Asserting the callback's recorded gasleft stays - /// within `tolerance` of MAX_PAYER_CALLBACK_GAS verifies that `OVERHEAD ≥ δ` (the actual - /// pre-CALL Solidity overhead) at this collector configuration. Existing - /// `test_Collect_Revert_WhenInsufficientCallbackGas*` tests bracket the other side - /// (`gasleft < threshold` reverts with `InsufficientCallbackGas`). - /// - /// **If this test fails** look at *what changed*: - /// - You added pre-CALL Solidity overhead (extra arg encoding, an SLOAD before the assembly - /// block, or any code between the gasleft() precheck and the CALL opcode). - /// Action: bump `CALLBACK_GAS_OVERHEAD` in `RecurringCollector.sol` to cover the new δ, - /// or trim the new overhead. **Don't just raise `tolerance` here** — that silences the - /// alarm without restoring the production margin. - /// - You changed `MAX_PAYER_CALLBACK_GAS`. Update `expectedMin` to follow. - /// - You changed `MockAgreementOwner.afterCollection`'s prologue (added SLOADs, etc.) so the - /// `gasleft()` sample lands deeper into dispatch. Recorded baseline shifts. Adjust - /// `tolerance` only if you understand and accept the new overhead path. - /// - /// Numbers at the time of writing (CALLBACK_GAS_OVERHEAD = 3_000, MAX = 1_500_000, warm-call - /// δ ≈ 500, mock dispatch ≈ 300): recorded ≈ 1_499_700. tolerance 500 → assertion floor - /// 1_499_500, leaves ~200 gas of headroom. Reducing `OVERHEAD` to ~100 (sabotage check) - /// drops recorded to ~1_499_220 → fails. - function test_Collect_Callbacks_ReceiveMaxPayerCallbackGas() public { - // Skip under `forge coverage`: the optimizer is disabled there, so dispatch δ - // is materially larger than under production settings (optimizer + via_ir). The - // whole point of this test is asserting the production margin — measuring against - // unoptimized bytecode answers a different question. The package's coverage - // scripts set FOUNDRY_COVERAGE=1; running `forge coverage` directly without it - // will fail this test loudly, which is the correct outcome. - if (vm.envOr("FOUNDRY_COVERAGE", false)) { - vm.skip(true); - } - - uint256 expectedMin = 1_500_000; // mirrors MAX_PAYER_CALLBACK_GAS - uint256 tolerance = 500; - - MockAgreementOwner approver = _newApprover(); - (IRecurringCollector.RecurringCollectionAgreement memory rca, bytes16 agreementId) = _acceptUnsignedAgreement( - approver - ); - - skip(rca.minSecondsPerCollection); - bytes memory data = _generateCollectData( - _generateCollectParams(rca, agreementId, bytes32("col-budget"), 1 ether, 0) - ); - bytes memory callData = abi.encodeCall( - _recurringCollector.collect, - (IGraphPayments.PaymentTypes.IndexingFee, data) - ); - - // Binary-search the lowest external gas at which `collect` succeeds. With both - // CONDITION_AGREEMENT_OWNER callbacks live, the after-callback precheck is the - // bottleneck — at the lowest passing gas its precheck is just satisfied, so any - // shortfall in CALLBACK_GAS_OVERHEAD shows up in the after-callback's recorded gasleft. - uint256 lo = 1_500_000; // below threshold — collect reverts with InsufficientCallbackGas - uint256 hi = 2_000_000; // ample - while (hi - lo > 100) { - uint256 mid = (lo + hi) / 2; - uint256 snap = vm.snapshotState(); - vm.prank(rca.dataService); - (bool ok, ) = address(_recurringCollector).call{ gas: mid }(callData); - assertTrue(vm.revertToState(snap)); - if (ok) hi = mid; - else lo = mid; - } - - // Re-run at the lowest passing gas; this run's state we keep so the mock's recorded - // values are readable. - vm.prank(rca.dataService); - (bool finalOk, ) = address(_recurringCollector).call{ gas: hi }(callData); - assertTrue(finalOk, "collect failed at the gas value the binary search settled on"); - - // before-callback (cold first access) runs with plenty of remaining gas, so EIP-150 - // doesn't bite there even at the boundary. after-callback (warm) is where the cap - // tightens — that's the meaningful assertion. - assertGe( - approver.recordedAfterCollectionGasleft(), - expectedMin - tolerance, - "afterCollection received < MAX_PAYER_CALLBACK_GAS at boundary gas: CALLBACK_GAS_OVERHEAD margin eroded" - ); - } - function test_AfterCollection_NotCalledForEOAPayer(FuzzyTestCollect calldata fuzzy) public { // Use standard ECDSA-signed path (EOA payer, no contract) (IRecurringCollector.RecurringCollectionAgreement memory acceptedRca, , , ) = _sensibleAuthorizeAndAccept( diff --git a/packages/horizon/test/unit/payments/recurring-collector/coverageGaps.t.sol b/packages/horizon/test/unit/payments/recurring-collector/coverageGaps.t.sol index 689cf5b48..36317702f 100644 --- a/packages/horizon/test/unit/payments/recurring-collector/coverageGaps.t.sol +++ b/packages/horizon/test/unit/payments/recurring-collector/coverageGaps.t.sol @@ -460,9 +460,6 @@ contract RecurringCollectorCoverageGapsTest is RecurringCollectorSharedTest { function test_GetCollectionInfo_ZeroCollectionSeconds(FuzzyTestAccept calldata fuzzy) public { (, , , bytes16 agreementId) = _sensibleAuthorizeAndAccept(fuzzy); - // Read agreement in the same block as accept - IRecurringCollector.AgreementData memory agreement = _recurringCollector.getAgreement(agreementId); - (bool isCollectable, uint256 collectionSeconds, ) = _recurringCollector.getCollectionInfo(agreementId); assertFalse(isCollectable, "Should not be collectable with zero elapsed time"); diff --git a/packages/horizon/test/unit/payments/recurring-collector/eligibility.t.sol b/packages/horizon/test/unit/payments/recurring-collector/eligibility.t.sol index b507e522f..2b54d3f2b 100644 --- a/packages/horizon/test/unit/payments/recurring-collector/eligibility.t.sol +++ b/packages/horizon/test/unit/payments/recurring-collector/eligibility.t.sol @@ -128,12 +128,9 @@ contract RecurringCollectorEligibilityTest is RecurringCollectorSharedTest { function test_Collect_OK_WhenEOAPayer(FuzzyTestCollect calldata fuzzy) public { // Use standard ECDSA-signed path (EOA payer) - ( - IRecurringCollector.RecurringCollectionAgreement memory acceptedRca, - , - , - bytes16 agreementId - ) = _sensibleAuthorizeAndAccept(fuzzy.fuzzyTestAccept); + (IRecurringCollector.RecurringCollectionAgreement memory acceptedRca, , , ) = _sensibleAuthorizeAndAccept( + fuzzy.fuzzyTestAccept + ); (bytes memory data, uint256 collectionSeconds, uint256 tokens) = _generateValidCollection( acceptedRca, diff --git a/packages/horizon/test/unit/payments/recurring-collector/getMaxNextClaim.t.sol b/packages/horizon/test/unit/payments/recurring-collector/getMaxNextClaim.t.sol index fe792c059..679b582bc 100644 --- a/packages/horizon/test/unit/payments/recurring-collector/getMaxNextClaim.t.sol +++ b/packages/horizon/test/unit/payments/recurring-collector/getMaxNextClaim.t.sol @@ -367,7 +367,10 @@ contract RecurringCollectorGetMaxNextClaimTest is RecurringCollectorSharedTest { vm.prank(rca.dataService); _recurringCollector.collect(_paymentType(0), data); - uint256 lastCollectionAt = block.timestamp; + // vm.getBlockTimestamp() (external cheatcode CALL) instead of block.timestamp: + // under viaIR, the TIMESTAMP opcode is treated as pure and CSE-eliminates the + // local, re-reading block.timestamp at the use site post-warp. + uint256 lastCollectionAt = vm.getBlockTimestamp(); // Warp past endsAt vm.warp(rca.endsAt + 1000); @@ -391,7 +394,8 @@ contract RecurringCollectorGetMaxNextClaimTest is RecurringCollectorSharedTest { bytes16 agreementId ) = _sensibleAuthorizeAndAccept(fuzzy); - uint256 acceptedAt = block.timestamp; + // See sibling test for the viaIR/CSE rationale for vm.getBlockTimestamp(). + uint256 acceptedAt = vm.getBlockTimestamp(); // Warp past endsAt without ever collecting vm.warp(rca.endsAt + 1000); @@ -754,5 +758,240 @@ contract RecurringCollectorGetMaxNextClaimTest is RecurringCollectorSharedTest { assertGt(activeScope, 0, "sanity: active scope claim is non-zero"); } + /// @notice Envelope invariant across update(): with a pending RCAU stored, the amount any + /// subsequent collect() can pay out (after that RCAU is promoted via update()) must not + /// exceed the value getMaxNextClaim() returned beforehand. Exercised under conditions + /// where update() retroactively widens the per-collect cap relative to the remaining + /// `endsAt - now` window. + function test_GetMaxNextClaim_PendingScope_CoversPostUpdateCollection() public { + MockAgreementOwner approver = new MockAgreementOwner(); + + // Original RCA: rate=1, maxSec=3600, endsAt far in the future. maxInitialTokens=0 + // and minSec=0 to keep the arithmetic clean. + IRecurringCollector.RecurringCollectionAgreement memory rca = IRecurringCollector.RecurringCollectionAgreement({ + deadline: uint64(block.timestamp + 1 hours), + endsAt: uint64(block.timestamp + 365 days), + payer: address(approver), + dataService: makeAddr("ds"), + serviceProvider: makeAddr("sp"), + maxInitialTokens: 0, + maxOngoingTokensPerSecond: 1, + minSecondsPerCollection: 0, + maxSecondsPerCollection: 3600, + conditions: 0, + nonce: 1, + metadata: "" + }); + + vm.prank(address(approver)); + _recurringCollector.offer(OFFER_TYPE_NEW, abi.encode(rca), 0); + _setupValidProvision(rca.serviceProvider, rca.dataService); + vm.prank(rca.dataService); + bytes16 agreementId = _recurringCollector.accept(rca, ""); + + // Long quiet period: 24h elapses without any collection. lastCollectionAt stays 0, + // so the collection start (= acceptedAt) is now 86_400s in the past. + skip(86_400); + + // Pending RCAU offered: short remaining window (1_200s to endsAt) but generous + // maxSec (7_200s) and 10x rate. After update() promotes this, the per-collect cap + // is governed by maxSec_new (7_200), not the remaining-window view (1_200). + IRecurringCollector.RecurringCollectionAgreementUpdate memory rcau = IRecurringCollector + .RecurringCollectionAgreementUpdate({ + agreementId: agreementId, + deadline: uint64(block.timestamp), + endsAt: uint64(block.timestamp + 1_200), + maxInitialTokens: 0, + maxOngoingTokensPerSecond: 10, + minSecondsPerCollection: 0, + maxSecondsPerCollection: 7_200, + conditions: 0, + nonce: 1, + metadata: "" + }); + vm.prank(address(approver)); + _recurringCollector.offer(OFFER_TYPE_UPDATE, abi.encode(rcau), 0); + + // The reservation envelope RAM._reconcileAgreement uses to size escrow. + uint256 preUpdateEnvelope = _recurringCollector.getMaxNextClaim(agreementId); + + // Promote the RCAU on the same block. update() overwrites terms but does NOT advance + // lastCollectionAt (per the contract's update() docstring). + vm.prank(rca.dataService); + _recurringCollector.update(rcau, ""); + + // Warp to endsAt — worst-case elapsed for a single collect — and request unbounded + // tokens. The contract clamps to its internal maxClaim. With new terms applied + // retroactively from acceptedAt, this pays out rate_new * maxSec_new = 10 * 7_200. + vm.warp(rcau.endsAt); + bytes memory data = _generateCollectData( + _generateCollectParams(rca, agreementId, keccak256("collect-after-update"), type(uint256).max, 0) + ); + vm.prank(rca.dataService); + uint256 actuallyCollected = _recurringCollector.collect(_paymentType(0), data); + + // The post-update collect must fit within the pre-update envelope — otherwise RAM + // under-reserves and PaymentsEscrow.collect can revert on insufficient balance. + assertLe( + actuallyCollected, + preUpdateEnvelope, + "post-update collect amount must fit within the pre-update envelope" + ); + } + + /// @notice Same envelope invariant as above, but with `lastCollectionAt > 0` (a prior + /// collect has already advanced the collection-start anchor). Confirms the issue is not + /// specific to the never-collected path nor entangled with `maxInitialTokens` accounting. + function test_GetMaxNextClaim_PendingScope_CoversPostUpdateCollection_AfterPriorCollect() public { + MockAgreementOwner approver = new MockAgreementOwner(); + + IRecurringCollector.RecurringCollectionAgreement memory rca = IRecurringCollector.RecurringCollectionAgreement({ + deadline: uint64(block.timestamp + 1 hours), + endsAt: uint64(block.timestamp + 365 days), + payer: address(approver), + dataService: makeAddr("ds"), + serviceProvider: makeAddr("sp"), + maxInitialTokens: 0, + maxOngoingTokensPerSecond: 1, + minSecondsPerCollection: 0, + maxSecondsPerCollection: 3600, + conditions: 0, + nonce: 1, + metadata: "" + }); + + vm.prank(address(approver)); + _recurringCollector.offer(OFFER_TYPE_NEW, abi.encode(rca), 0); + _setupValidProvision(rca.serviceProvider, rca.dataService); + vm.prank(rca.dataService); + bytes16 agreementId = _recurringCollector.accept(rca, ""); + + // Anchor lastCollectionAt one hour past acceptedAt via a real collect(). + skip(1 hours); + bytes memory firstCollect = _generateCollectData( + _generateCollectParams(rca, agreementId, keccak256("first-collect"), 1, 0) + ); + vm.prank(rca.dataService); + _recurringCollector.collect(_paymentType(0), firstCollect); + + // Long quiet period after the prior collect — lastCollectionAt remains anchored. + skip(86_400); + + IRecurringCollector.RecurringCollectionAgreementUpdate memory rcau = IRecurringCollector + .RecurringCollectionAgreementUpdate({ + agreementId: agreementId, + deadline: uint64(block.timestamp), + endsAt: uint64(block.timestamp + 1_200), + maxInitialTokens: 0, + maxOngoingTokensPerSecond: 10, + minSecondsPerCollection: 0, + maxSecondsPerCollection: 7_200, + conditions: 0, + nonce: 1, + metadata: "" + }); + vm.prank(address(approver)); + _recurringCollector.offer(OFFER_TYPE_UPDATE, abi.encode(rcau), 0); + + uint256 preUpdateEnvelope = _recurringCollector.getMaxNextClaim(agreementId); + + vm.prank(rca.dataService); + _recurringCollector.update(rcau, ""); + + vm.warp(rcau.endsAt); + bytes memory data = _generateCollectData( + _generateCollectParams(rca, agreementId, keccak256("collect-after-update"), type(uint256).max, 0) + ); + vm.prank(rca.dataService); + uint256 actuallyCollected = _recurringCollector.collect(_paymentType(0), data); + + assertLe( + actuallyCollected, + preUpdateEnvelope, + "post-update collect amount must fit within the pre-update envelope" + ); + } + + /// @notice Same envelope invariant under fuzzed elapsed-time, new rate, new maxSec, and + /// remaining-window inputs. Bounds picked to satisfy validator constraints + /// (`maxSec >= 600`, `endsAt - deadline >= 600`) while keeping arithmetic well within + /// uint256. + function testFuzz_GetMaxNextClaim_PendingScope_CoversPostUpdateCollection( + uint256 elapsedSinceAccept, + uint32 newMaxSec, + uint256 newRate, + uint64 remainingWindow + ) public { + elapsedSinceAccept = bound(elapsedSinceAccept, 60, 30 days); + newMaxSec = uint32(bound(newMaxSec, 600, 30 days)); + newRate = bound(newRate, 1, 1e18); + remainingWindow = uint64(bound(remainingWindow, 600, 30 days)); + + MockAgreementOwner approver = new MockAgreementOwner(); + + IRecurringCollector.RecurringCollectionAgreement memory rca = IRecurringCollector.RecurringCollectionAgreement({ + deadline: uint64(block.timestamp + 1 hours), + endsAt: uint64(block.timestamp + 3650 days), + payer: address(approver), + dataService: makeAddr("ds"), + serviceProvider: makeAddr("sp"), + maxInitialTokens: 0, + maxOngoingTokensPerSecond: 1, + minSecondsPerCollection: 0, + maxSecondsPerCollection: 3600, + conditions: 0, + nonce: 1, + metadata: "" + }); + + vm.prank(address(approver)); + _recurringCollector.offer(OFFER_TYPE_NEW, abi.encode(rca), 0); + _setupValidProvision(rca.serviceProvider, rca.dataService); + vm.prank(rca.dataService); + bytes16 agreementId = _recurringCollector.accept(rca, ""); + + skip(elapsedSinceAccept); + + IRecurringCollector.RecurringCollectionAgreementUpdate memory rcau = IRecurringCollector + .RecurringCollectionAgreementUpdate({ + agreementId: agreementId, + deadline: uint64(block.timestamp), + endsAt: uint64(block.timestamp) + remainingWindow, + maxInitialTokens: 0, + maxOngoingTokensPerSecond: newRate, + minSecondsPerCollection: 0, + maxSecondsPerCollection: newMaxSec, + conditions: 0, + nonce: 1, + metadata: "" + }); + vm.prank(address(approver)); + _recurringCollector.offer(OFFER_TYPE_UPDATE, abi.encode(rcau), 0); + + uint256 preUpdateEnvelope = _recurringCollector.getMaxNextClaim(agreementId); + + vm.prank(rca.dataService); + _recurringCollector.update(rcau, ""); + + vm.warp(rcau.endsAt); + bytes memory data = _generateCollectData( + _generateCollectParams( + rca, + agreementId, + keccak256(abi.encode(elapsedSinceAccept, newMaxSec, newRate, remainingWindow)), + type(uint256).max, + 0 + ) + ); + vm.prank(rca.dataService); + uint256 actuallyCollected = _recurringCollector.collect(_paymentType(0), data); + + assertLe( + actuallyCollected, + preUpdateEnvelope, + "post-update collect amount must fit within the pre-update envelope" + ); + } + /* solhint-enable graph/func-name-mixedcase */ } diff --git a/packages/horizon/test/unit/payments/recurring-collector/returndataBomb.t.sol b/packages/horizon/test/unit/payments/recurring-collector/returndataBomb.t.sol index 3ef69f430..e68b4882f 100644 --- a/packages/horizon/test/unit/payments/recurring-collector/returndataBomb.t.sol +++ b/packages/horizon/test/unit/payments/recurring-collector/returndataBomb.t.sol @@ -23,7 +23,7 @@ contract HugeReturnPayer is IAgreementOwner, IERC165 { return interfaceId == type(IERC165).interfaceId || interfaceId == type(IProviderEligibility).interfaceId; } - function beforeCollection(bytes16, uint256) external { + function beforeCollection(bytes16, uint256) external view { uint256 size = returnBytes; // solhint-disable-next-line no-inline-assembly assembly { @@ -31,7 +31,7 @@ contract HugeReturnPayer is IAgreementOwner, IERC165 { } } - function afterCollection(bytes16, uint256) external { + function afterCollection(bytes16, uint256) external view { uint256 size = returnBytes; // solhint-disable-next-line no-inline-assembly assembly { diff --git a/packages/horizon/test/unit/payments/recurring-collector/viewFunctions.t.sol b/packages/horizon/test/unit/payments/recurring-collector/viewFunctions.t.sol index 902572a29..4c39fd25c 100644 --- a/packages/horizon/test/unit/payments/recurring-collector/viewFunctions.t.sol +++ b/packages/horizon/test/unit/payments/recurring-collector/viewFunctions.t.sol @@ -38,8 +38,6 @@ contract RecurringCollectorViewFunctionsTest is RecurringCollectorSharedTest { // Cancel by service provider _cancel(rca, agreementId, IRecurringCollector.CancelAgreementBy.ServiceProvider); - IRecurringCollector.AgreementData memory agreement = _recurringCollector.getAgreement(agreementId); - (bool isCollectable, , IRecurringCollector.AgreementNotCollectableReason reason) = _recurringCollector .getCollectionInfo(agreementId); @@ -81,8 +79,6 @@ contract RecurringCollectorViewFunctionsTest is RecurringCollectorSharedTest { // Cancel by payer in the same block as accept _cancel(rca, agreementId, IRecurringCollector.CancelAgreementBy.Payer); - IRecurringCollector.AgreementData memory agreement = _recurringCollector.getAgreement(agreementId); - (bool isCollectable, uint256 collectionSeconds, ) = _recurringCollector.getCollectionInfo(agreementId); // Same block cancel means no time elapsed @@ -104,8 +100,6 @@ contract RecurringCollectorViewFunctionsTest is RecurringCollectorSharedTest { skip(rca.minSecondsPerCollection); _cancel(rca, agreementId, IRecurringCollector.CancelAgreementBy.Payer); - IRecurringCollector.AgreementData memory agreement = _recurringCollector.getAgreement(agreementId); - (bool isCollectable, uint256 collectionSeconds, ) = _recurringCollector.getCollectionInfo(agreementId); assertTrue(isCollectable, "Payer cancel with elapsed time should be collectable"); diff --git a/packages/horizon/test/unit/shared/horizon-staking/HorizonStakingShared.t.sol b/packages/horizon/test/unit/shared/horizon-staking/HorizonStakingShared.t.sol index 1309de2b5..c7e50a133 100644 --- a/packages/horizon/test/unit/shared/horizon-staking/HorizonStakingShared.t.sol +++ b/packages/horizon/test/unit/shared/horizon-staking/HorizonStakingShared.t.sol @@ -1373,8 +1373,6 @@ abstract contract HorizonStakingSharedTest is GraphBaseTest { } function _slash(address serviceProvider, address verifier, uint256 tokens, uint256 verifierCutAmount) internal { - bool isDelegationSlashingEnabled = staking.isDelegationSlashingEnabled(); - // staking contract knows the address of the legacy subgraph service // but we cannot read it as it's an immutable, we have to use the global var :/ bool legacy = verifier == subgraphDataServiceLegacyAddress; @@ -1393,6 +1391,18 @@ abstract contract HorizonStakingSharedTest is GraphBaseTest { calcValues.providerTokensSlashed = Math.min(before.provision.tokens, calcValues.tokensToSlash); calcValues.delegationTokensSlashed = calcValues.tokensToSlash - calcValues.providerTokensSlashed; + _expectSlashEmits(serviceProvider, verifier, verifierCutAmount, calcValues); + staking.slash(serviceProvider, tokens, verifierCutAmount, verifier); + _assertSlashStateAfter(serviceProvider, verifier, verifierCutAmount, before, calcValues); + } + + function _expectSlashEmits( + address serviceProvider, + address verifier, + uint256 verifierCutAmount, + CalcValuesSlash memory calcValues + ) internal { + bool isDelegationSlashingEnabled = staking.isDelegationSlashingEnabled(); if (calcValues.tokensToSlash > 0) { if (verifierCutAmount > 0) { vm.expectEmit(address(token)); @@ -1427,9 +1437,17 @@ abstract contract HorizonStakingSharedTest is GraphBaseTest { ); } } - staking.slash(serviceProvider, tokens, verifierCutAmount, verifier); + } - // after + function _assertSlashStateAfter( + address serviceProvider, + address verifier, + uint256 verifierCutAmount, + BeforeValuesSlash memory before, + CalcValuesSlash memory calcValues + ) internal view { + bool isDelegationSlashingEnabled = staking.isDelegationSlashingEnabled(); + bool legacy = verifier == subgraphDataServiceLegacyAddress; Provision memory afterProvision = staking.getProvision(serviceProvider, verifier); DelegationPoolInternalTest memory afterPool = _getStorageDelegationPoolInternal( serviceProvider, @@ -1440,56 +1458,50 @@ abstract contract HorizonStakingSharedTest is GraphBaseTest { uint256 afterStakingBalance = token.balanceOf(address(staking)); uint256 afterVerifierBalance = token.balanceOf(verifier); - { - uint256 tokensSlashed = calcValues.providerTokensSlashed + - (isDelegationSlashingEnabled ? calcValues.delegationTokensSlashed : 0); - uint256 provisionThawingTokens = (before.provision.tokensThawing * - (before.provision.tokens - calcValues.providerTokensSlashed)) / before.provision.tokens; - - // assert - assertEq(afterProvision.tokens + calcValues.providerTokensSlashed, before.provision.tokens); - assertEq(afterProvision.tokensThawing, provisionThawingTokens); - assertEq( - afterProvision.sharesThawing, - afterProvision.tokensThawing == 0 ? 0 : before.provision.sharesThawing - ); - assertEq(afterProvision.maxVerifierCut, before.provision.maxVerifierCut); - assertEq(afterProvision.maxVerifierCutPending, before.provision.maxVerifierCutPending); - assertEq(afterProvision.thawingPeriod, before.provision.thawingPeriod); - assertEq(afterProvision.thawingPeriodPending, before.provision.thawingPeriodPending); + uint256 tokensSlashed = calcValues.providerTokensSlashed + + (isDelegationSlashingEnabled ? calcValues.delegationTokensSlashed : 0); + uint256 provisionThawingTokens = (before.provision.tokensThawing * + (before.provision.tokens - calcValues.providerTokensSlashed)) / before.provision.tokens; + + assertEq(afterProvision.tokens + calcValues.providerTokensSlashed, before.provision.tokens); + assertEq(afterProvision.tokensThawing, provisionThawingTokens); + assertEq(afterProvision.sharesThawing, afterProvision.tokensThawing == 0 ? 0 : before.provision.sharesThawing); + assertEq(afterProvision.maxVerifierCut, before.provision.maxVerifierCut); + assertEq(afterProvision.maxVerifierCutPending, before.provision.maxVerifierCutPending); + assertEq(afterProvision.thawingPeriod, before.provision.thawingPeriod); + assertEq(afterProvision.thawingPeriodPending, before.provision.thawingPeriodPending); + assertEq( + afterProvision.thawingNonce, + (before.provision.sharesThawing != 0 && afterProvision.sharesThawing == 0) + ? before.provision.thawingNonce + 1 + : before.provision.thawingNonce + ); + if (isDelegationSlashingEnabled) { + uint256 poolThawingTokens = (before.pool.tokensThawing * + (before.pool.tokens - calcValues.delegationTokensSlashed)) / before.pool.tokens; + assertEq(afterPool.tokens + calcValues.delegationTokensSlashed, before.pool.tokens); + assertEq(afterPool.shares, before.pool.shares); + assertEq(afterPool.tokensThawing, poolThawingTokens); + assertEq(afterPool.sharesThawing, afterPool.tokensThawing == 0 ? 0 : before.pool.sharesThawing); assertEq( - afterProvision.thawingNonce, - (before.provision.sharesThawing != 0 && afterProvision.sharesThawing == 0) - ? before.provision.thawingNonce + 1 - : before.provision.thawingNonce + afterPool.thawingNonce, + (before.pool.sharesThawing != 0 && afterPool.sharesThawing == 0) + ? before.pool.thawingNonce + 1 + : before.pool.thawingNonce ); - if (isDelegationSlashingEnabled) { - uint256 poolThawingTokens = (before.pool.tokensThawing * - (before.pool.tokens - calcValues.delegationTokensSlashed)) / before.pool.tokens; - assertEq(afterPool.tokens + calcValues.delegationTokensSlashed, before.pool.tokens); - assertEq(afterPool.shares, before.pool.shares); - assertEq(afterPool.tokensThawing, poolThawingTokens); - assertEq(afterPool.sharesThawing, afterPool.tokensThawing == 0 ? 0 : before.pool.sharesThawing); - assertEq( - afterPool.thawingNonce, - (before.pool.sharesThawing != 0 && afterPool.sharesThawing == 0) - ? before.pool.thawingNonce + 1 - : before.pool.thawingNonce - ); - } + } - assertEq(before.stakingBalance - tokensSlashed, afterStakingBalance); - assertEq(before.verifierBalance + verifierCutAmount, afterVerifierBalance); + assertEq(before.stakingBalance - tokensSlashed, afterStakingBalance); + assertEq(before.verifierBalance + verifierCutAmount, afterVerifierBalance); - assertEq( - afterServiceProvider.tokensStaked + calcValues.providerTokensSlashed, - before.serviceProvider.tokensStaked - ); - assertEq( - afterServiceProvider.tokensProvisioned + calcValues.providerTokensSlashed, - before.serviceProvider.tokensProvisioned - ); - } + assertEq( + afterServiceProvider.tokensStaked + calcValues.providerTokensSlashed, + before.serviceProvider.tokensStaked + ); + assertEq( + afterServiceProvider.tokensProvisioned + calcValues.providerTokensSlashed, + before.serviceProvider.tokensProvisioned + ); } /* diff --git a/packages/horizon/test/unit/staking/coverageGaps.t.sol b/packages/horizon/test/unit/staking/coverageGaps.t.sol index 07dfec2ed..72288d5af 100644 --- a/packages/horizon/test/unit/staking/coverageGaps.t.sol +++ b/packages/horizon/test/unit/staking/coverageGaps.t.sol @@ -31,7 +31,7 @@ contract HorizonStakingCoverageGapsTest is HorizonStakingTest { function test_GetIdleStake_WithStake( uint256 stakeAmount, - uint256 provisionAmount, + uint256 /* provisionAmount */, uint32 maxVerifierCut, uint64 thawingPeriod ) public useIndexer useProvision(stakeAmount, maxVerifierCut, thawingPeriod) { diff --git a/packages/interfaces/contracts/horizon/IRecurringCollector.sol b/packages/interfaces/contracts/horizon/IRecurringCollector.sol index 18f89f00b..48ad5ea64 100644 --- a/packages/interfaces/contracts/horizon/IRecurringCollector.sol +++ b/packages/interfaces/contracts/horizon/IRecurringCollector.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.22; import { IAgreementCollector } from "./IAgreementCollector.sol"; -import { IGraphPayments } from "./IGraphPayments.sol"; import { IAuthorizable } from "./IAuthorizable.sol"; /** @@ -244,12 +243,6 @@ interface IRecurringCollector is IAuthorizable, IAgreementCollector { uint256 dataServiceCut ); - /** - * @notice Thrown when an agreement does not exist (no accepted state and no stored offer) - * @param agreementId The agreement ID that was not found - */ - error RecurringCollectorAgreementNotFound(bytes16 agreementId); - /** * @notice Thrown when accepting an agreement with a zero ID */ @@ -279,12 +272,6 @@ interface IRecurringCollector is IAuthorizable, IAgreementCollector { */ error RecurringCollectorInvalidSigner(); - /** - * @notice Thrown when the payment type is not IndexingFee - * @param invalidPaymentType The invalid payment type - */ - error RecurringCollectorInvalidPaymentType(IGraphPayments.PaymentTypes invalidPaymentType); - /** * @notice Thrown when the caller is not the data service the RCA was issued to * @param unauthorizedCaller The address of the caller @@ -331,10 +318,11 @@ interface IRecurringCollector is IAuthorizable, IAgreementCollector { error RecurringCollectorAgreementEndsBeforeDeadline(uint64 deadline, uint64 endsAt); /** - * @notice Thrown when accepting or upgrading an agreement with an elapsed endsAt - * @param allowedMinCollectionWindow The allowed minimum collection window - * @param minSecondsPerCollection The minimum seconds per collection - * @param maxSecondsPerCollection The maximum seconds per collection + * @notice Thrown when the collection window (max - min) is below the required minimum, + * or when max <= min. + * @param allowedMinCollectionWindow The minimum required collection window in seconds + * @param minSecondsPerCollection The provided minimum seconds per collection + * @param maxSecondsPerCollection The provided maximum seconds per collection */ error RecurringCollectorAgreementInvalidCollectionWindow( uint32 allowedMinCollectionWindow, @@ -349,19 +337,6 @@ interface IRecurringCollector is IAuthorizable, IAgreementCollector { */ error RecurringCollectorAgreementInvalidDuration(uint32 requiredMinDuration, uint256 invalidDuration); - /** - * @notice Thrown when calling collect() with a zero collection seconds - * @param agreementId The agreement ID - * @param currentTimestamp The current timestamp - * @param lastCollectionAt The timestamp when the last collection was done - * - */ - error RecurringCollectorZeroCollectionSeconds( - bytes16 agreementId, - uint256 currentTimestamp, - uint64 lastCollectionAt - ); - /** * @notice Thrown when calling collect() too soon * @param agreementId The agreement ID @@ -490,10 +465,12 @@ interface IRecurringCollector is IAuthorizable, IAgreementCollector { /** * @notice Accept a Recurring Collection Agreement. - * @dev Caller must be the data service the RCA was issued to. - * If `signature` is non-empty: checks `rca.deadline >= block.timestamp` and verifies the ECDSA signature. - * If `signature` is empty: the payer must be a contract implementing {IAgreementOwner.approveAgreement} - * and must return the magic value for the RCA's EIP712 hash. + * @dev Caller must be the data service the RCA was issued to. Idempotent: re-accepting an + * already-accepted agreement with the same RCA hash is a no-op (skips deadline and auth checks). + * Otherwise enforces `block.timestamp <= rca.deadline` and authorizes via one of: + * - `signature` non-empty: ECDSA signature recovery against the payer (or its authorized signer); + * - `signature` empty: the payer must have previously stored an offer for the same RCA hash via + * {IAgreementCollector.offer}; the stored hash is checked instead of a signature. * @param rca The Recurring Collection Agreement to accept * @param signature ECDSA signature bytes, or empty for contract-approved agreements * @return agreementId The deterministically generated agreement ID @@ -504,7 +481,11 @@ interface IRecurringCollector is IAuthorizable, IAgreementCollector { ) external returns (bytes16 agreementId); /** - * @notice Cancel an indexing agreement. + * @notice Cancel a Recurring Collection Agreement. + * @dev Caller must be the data service for the agreement; the agreement must be in the + * Accepted state. Records `canceledAt = block.timestamp` and transitions to + * CanceledByPayer or CanceledByServiceProvider per `by`. Any pending RCAU offer whose + * hash differs from the active terms is dropped. * @param agreementId The agreement's ID. * @param by The party that is canceling the agreement. */ @@ -512,10 +493,12 @@ interface IRecurringCollector is IAuthorizable, IAgreementCollector { /** * @notice Update a Recurring Collection Agreement. - * @dev Caller must be the data service for the agreement. - * If `signature` is non-empty: checks `rcau.deadline >= block.timestamp` and verifies the ECDSA signature. - * If `signature` is empty: the payer (stored in the agreement) must be a contract implementing - * {IAgreementOwner.approveAgreement} and must return the magic value for the RCAU's EIP712 hash. + * @dev Caller must be the data service for the agreement. Idempotent: re-applying an already-applied + * RCAU is a no-op (skips deadline and auth checks). Otherwise enforces + * `block.timestamp <= rcau.deadline` and authorizes via one of: + * - `signature` non-empty: ECDSA signature recovery against the payer (or its authorized signer); + * - `signature` empty: the payer must have previously stored an offer for the same RCAU hash via + * {IAgreementCollector.offer}; the stored hash is checked instead of a signature. * @param rcau The Recurring Collection Agreement Update to apply * @param signature ECDSA signature bytes, or empty for contract-approved updates */ diff --git a/packages/interfaces/contracts/issuance/agreement/IRecurringAgreementManagement.sol b/packages/interfaces/contracts/issuance/agreement/IRecurringAgreementManagement.sol index b6b02f1bc..bbb90564d 100644 --- a/packages/interfaces/contracts/issuance/agreement/IRecurringAgreementManagement.sol +++ b/packages/interfaces/contracts/issuance/agreement/IRecurringAgreementManagement.sol @@ -63,8 +63,9 @@ interface IRecurringAgreementManagement { /** * @notice Emitted when a (collector, provider) pair is removed from tracking - * @dev Emitted when the pair has no agreements AND escrow is fully recovered (balance zero). - * May cascade inline from agreement deletion or be triggered by {reconcileProvider}. + * @dev Emitted when the pair has no agreements AND escrow balance is below the residual + * threshold (2^minResidualEscrowFactor). May cascade inline from agreement deletion or be + * triggered by {reconcileProvider}. * @param collector The collector address * @param provider The provider address */ diff --git a/packages/interfaces/contracts/issuance/agreement/IRecurringAgreements.sol b/packages/interfaces/contracts/issuance/agreement/IRecurringAgreements.sol index 4c01aba27..9861e7d2c 100644 --- a/packages/interfaces/contracts/issuance/agreement/IRecurringAgreements.sol +++ b/packages/interfaces/contracts/issuance/agreement/IRecurringAgreements.sol @@ -83,10 +83,10 @@ interface IRecurringAgreements { function getSumMaxNextClaim() external view returns (uint256 tokens); /** - * @notice Get the total undeposited escrow across all providers - * @dev Maintained incrementally: sum of max(0, sumMaxNextClaim[p] - deposited[p]) - * for each provider p. Correctly accounts for per-provider deficits without - * allowing over-deposited providers to mask under-deposited ones. + * @notice Get the total undeposited escrow across all (collector, provider) pairs + * @dev Maintained incrementally: sum of max(0, sumMaxNextClaim[c][p] - escrowSnap[c][p]) + * across all pairs. Per-pair clamping prevents over-deposited pairs from masking + * under-deposited ones. * @return tokens The total unfunded amount */ function getTotalEscrowDeficit() external view returns (uint256 tokens); diff --git a/packages/interfaces/hardhat.config.ts b/packages/interfaces/hardhat.config.ts index 42001f299..be8d2feaa 100644 --- a/packages/interfaces/hardhat.config.ts +++ b/packages/interfaces/hardhat.config.ts @@ -3,7 +3,7 @@ import 'hardhat-ignore-warnings' const config = { solidity: { - compilers: [{ version: '0.8.27' }, { version: '0.7.6' }], + compilers: [{ version: '0.8.35' }, { version: '0.7.6' }], }, typechain: { outDir: 'types', diff --git a/packages/issuance/contracts/allocate/IssuanceAllocator.sol b/packages/issuance/contracts/allocate/IssuanceAllocator.sol index 76ecf8792..dd45f611a 100644 --- a/packages/issuance/contracts/allocate/IssuanceAllocator.sol +++ b/packages/issuance/contracts/allocate/IssuanceAllocator.sol @@ -54,12 +54,9 @@ import { ERC165Upgradeable } from "@openzeppelin/contracts-upgradeable/utils/int * @dev Pause Behavior: * - Allocator-minting: Completely suspended during pause. No tokens minted, lastDistributionBlock frozen. * When unpaused, distributes retroactively using current rates for entire undistributed period. (Distribution will be triggered by calling distributeIssuance() when not paused.) - * - Self-minting: Continues tracking via events and accumulation during pause. Accumulated self-minting - * reduces allocator-minting budget when distribution resumes, ensuring total issuance conservation. - * - Ongoing accumulation: Once accumulation starts (during pause), continues through any unpaused - * periods until distribution clears it, preventing loss of self-minting allowances across pause cycles. - * - Tracking divergence: lastSelfMintingBlock advances during pause (for allowance tracking) while - * lastDistributionBlock stays frozen (no allocator-minting). This is intentional and correct. + * - Self-minting: tracked unconditionally so the Self-Minting Accumulation invariant holds in + * every reachable state. Distribution reconciles the offset on catch-up. + * - lastSelfMintingBlock advances during pause; lastDistributionBlock stays frozen. * * @dev Issuance Accounting Invariants: * The contract maintains strict accounting to ensure total token issuance never exceeds the configured @@ -75,12 +72,12 @@ import { ERC165Upgradeable } from "@openzeppelin/contracts-upgradeable/utils/int * where totalSelfMintingRate_b is the end-state rate for block b. * * 3. Rate Constraint: For all blocks b, totalSelfMintingRate_b ≤ issuancePerBlock_b - * This follows from invariant (1) since 0 ≤ totalAllocatorRate_b. + * Follows from Allocation Completeness since 0 ≤ totalAllocatorRate_b. * * 4. Issuance Upper Bound: For any distribution period with blocks = toBlock - fromBlock + 1: * Let issuancePerBlock_final = current issuancePerBlock at distribution time * - * From invariants (2) and (3): + * From Self-Minting Accumulation and Rate Constraint: * selfMintingOffset ≤ Σ(issuancePerBlock_b) * * Allocator-minting budget for period: @@ -97,9 +94,11 @@ import { ERC165Upgradeable } from "@openzeppelin/contracts-upgradeable/utils/int * Any remaining offset when cleared represents self-minting that occurred beyond what the final * issuancePerBlock rate would allow for the period. This is acceptable because: * a) Self-minting targets were operating under rates that were valid at the time - * b) The total minted still respects the Σ(issuancePerBlock_b) bound (invariant 4) + * b) The total minted still respects the Issuance Upper Bound * c) Clearing the offset prevents it from affecting future distributions - * d) The SelfMintingOffsetReconciled event provides visibility into all offset adjustments + * d) Off-chain consumers can reconstruct any deviation from IssuanceDistributed, + * IssuanceSelfMintAllowance{,Aggregate}, IssuancePerBlockUpdated, and Pausable's + * Paused/Unpaused events * * This design ensures that even when issuancePerBlock or allocation rates change over time, and even * when self-minting targets mint independently, the total tokens minted never exceeds the sum of @@ -269,43 +268,6 @@ contract IssuanceAllocator is uint256 indexed toBlock ); // solhint-disable-line gas-indexed-events - /* solhint-disable gas-indexed-events */ - /// @notice Emitted when self-minting offset is reconciled during pending distribution - /// @param offsetBefore The self-minting offset before reconciliation - /// @param offsetAfter The self-minting offset after reconciliation (0 when caught up to current block) - /// @param totalForPeriod The total issuance budget for the distributed period - /// @param fromBlock First block in the distribution period (inclusive) - /// @param toBlock Last block in the distribution period (inclusive) - /// @dev This event provides visibility into the accounting reconciliation between self-minting - /// and allocator-minting budgets during pending distribution. When offsetAfter is 0, the contract - /// has fully caught up with distribution. When offsetAfter > 0, there remains accumulated offset - /// that will be applied to future distributions. - event SelfMintingOffsetReconciled( - uint256 offsetBefore, - uint256 offsetAfter, - uint256 totalForPeriod, - uint256 indexed fromBlock, - uint256 indexed toBlock - ); - /* solhint-enable gas-indexed-events */ - - /* solhint-disable gas-indexed-events */ - /// @notice Emitted when self-minting offset accumulates during pause or catch-up - /// @param offsetBefore The self-minting offset before accumulation - /// @param offsetAfter The self-minting offset after accumulation - /// @param fromBlock First block in the accumulation period (inclusive) - /// @param toBlock Last block in the accumulation period (inclusive) - /// @dev This event provides visibility into offset growth during pause periods or while catching up - /// after unpause. Together with SelfMintingOffsetReconciled, provides complete accounting of all - /// offset changes. - event SelfMintingOffsetAccumulated( - uint256 offsetBefore, - uint256 offsetAfter, - uint256 indexed fromBlock, - uint256 indexed toBlock - ); - /* solhint-enable gas-indexed-events */ - /// @notice Emitted when self-minting allowance is calculated in aggregate mode /// @param totalAmount The total amount of tokens available for self-minting across all targets /// @param fromBlock First block included in this allowance period (inclusive) @@ -416,19 +378,9 @@ contract IssuanceAllocator is uint256 blocks = block.number - previousBlock; uint256 fromBlock = previousBlock + 1; - // Accumulate if currently paused OR if there's existing accumulated balance. - // Once accumulation starts (during pause), continue through any unpaused periods - // until distribution clears the accumulation. This is conservative and allows - // better recovery when distribution is delayed through pause/unpause cycles. - uint256 offsetBefore = $.selfMintingOffset; - if (paused() || 0 < offsetBefore) { - $.selfMintingOffset += $.totalSelfMintingRate * blocks; - - // Emit accumulation event whenever offset changes - if (offsetBefore != $.selfMintingOffset) { - emit SelfMintingOffsetAccumulated(offsetBefore, $.selfMintingOffset, fromBlock, block.number); - } - } + // Maintains the Self-Minting Accumulation invariant unconditionally so the distribution + // path can safely bound allocator budget by selfMintingOffset. + $.selfMintingOffset += $.totalSelfMintingRate * blocks; $.lastSelfMintingBlock = block.number; // Emit self-minting allowance events based on mode @@ -455,12 +407,9 @@ contract IssuanceAllocator is /** * @notice Internal implementation for `distributeIssuance` - * @dev Handles the actual distribution logic. - * @dev Always calls _advanceSelfMintingBlock() first (advances lastSelfMintingBlock, tracks self-minting). - * @dev If paused: Returns lastDistributionBlock without distributing allocator-minting (frozen state). - * @dev If unpaused: Chooses distribution path based on accumulated self-minting: - * - With accumulation: retroactive distribution path (current rates, reduced allocator budget) - * - Without accumulation: normal distribution path (simple per-block minting) + * @dev Always advances self-minting first; returns frozen lastDistributionBlock if paused; + * otherwise delegates to _distributePendingIssuance. Self-Minting Accumulation lets a single + * distribution path serve every reachable state. * @return Block number distributed to */ function _distributeIssuance() private returns (uint256) { @@ -469,37 +418,7 @@ contract IssuanceAllocator is if (paused()) return $.lastDistributionBlock; - return 0 < $.selfMintingOffset ? _distributePendingIssuance(block.number) : _performNormalDistribution(); - } - - /** - * @notice Performs normal (non-pending) issuance distribution - * @dev Distributes allocator-minting issuance to all targets based on their rates - * @dev Assumes contract is not paused and pending issuance has already been distributed - * @return Block number distributed to - */ - function _performNormalDistribution() private returns (uint256) { - IssuanceAllocatorData storage $ = _getIssuanceAllocatorStorage(); - - uint256 blocks = block.number - $.lastDistributionBlock; - if (blocks == 0) return $.lastDistributionBlock; - - uint256 fromBlock = $.lastDistributionBlock + 1; - - for (uint256 i = 0; i < $.targetAddresses.length; ++i) { - address target = $.targetAddresses[i]; - if (target == address(0)) continue; - - AllocationTarget storage targetData = $.allocationTargets[target]; - if (0 < targetData.allocatorMintingRate) { - uint256 amount = targetData.allocatorMintingRate * blocks; - GRAPH_TOKEN.mint(target, amount); - emit IssuanceDistributed(target, amount, fromBlock, block.number); - } - } - - $.lastDistributionBlock = block.number; - return block.number; + return _distributePendingIssuance(block.number); } /** @@ -519,11 +438,10 @@ contract IssuanceAllocator is } /** - * @notice Internal implementation for distributing pending accumulated allocator-minting issuance + * @notice Internal implementation for distributing allocator-minting issuance up to a given block * @param toBlockNumber Block number to distribute up to - * @dev Distributes allocator-minting issuance for undistributed period using current rates, - * retroactively applied from lastDistributionBlock to toBlockNumber (inclusive). - * Called when 0 < selfMintingOffset, which occurs after pause periods or delayed distribution. + * @dev Distributes for [lastDistributionBlock+1, toBlockNumber]. selfMintingOffset bounds + * allocator budget so the Issuance Upper Bound holds across any rate variation in the range. * @dev Available budget = max(0, issuancePerBlock * blocks - selfMintingOffset). * Distribution cases: * (1) available < allocatedTotal: proportional distribution to non-default, default gets zero @@ -568,44 +486,13 @@ contract IssuanceAllocator is } $.lastDistributionBlock = toBlockNumber; - _reconcileSelfMintingOffset(toBlockNumber, blocks, totalForPeriod, selfMintingOffset); - return toBlockNumber; - } - - /** - * @notice Reconciles self-minting offset after distribution and emits event if changed - * @param toBlockNumber Block number distributed to - * @param blocks Number of blocks in the distribution period - * @param totalForPeriod Total issuance budget for the period - * @param selfMintingOffset Self-minting offset before reconciliation - * @dev Updates accumulated self-minting after distribution. - * Subtracts the period budget used (min of accumulated and totalForPeriod). - * When caught up to current block, clears all since nothing remains to distribute. - */ - function _reconcileSelfMintingOffset( - uint256 toBlockNumber, - uint256 blocks, - uint256 totalForPeriod, - uint256 selfMintingOffset - ) private { - IssuanceAllocatorData storage $ = _getIssuanceAllocatorStorage(); - - uint256 newOffset = toBlockNumber == block.number + // Reconcile offset: clear on full catch-up, otherwise subtract the period's budget + // (clamped at 0). Any clamped residue represents self-minting beyond what the final + // rate would allow for the period — the Issuance Upper Bound still holds. + $.selfMintingOffset = toBlockNumber == block.number ? 0 : (totalForPeriod < selfMintingOffset ? selfMintingOffset - totalForPeriod : 0); - - // Emit reconciliation event whenever offset changes during pending distribution - if (selfMintingOffset != newOffset) { - emit SelfMintingOffsetReconciled( - selfMintingOffset, - newOffset, - totalForPeriod, - toBlockNumber - blocks + 1, - toBlockNumber - ); - } - - $.selfMintingOffset = newOffset; + return toBlockNumber; } /** diff --git a/packages/issuance/foundry.toml b/packages/issuance/foundry.toml index 6de5f7434..4c0dba1bb 100644 --- a/packages/issuance/foundry.toml +++ b/packages/issuance/foundry.toml @@ -11,18 +11,26 @@ remappings = [ ] cache_path = 'cache_forge' fs_permissions = [{ access = "read", path = "./" }] -optimizer = true -optimizer_runs = 100 -via_ir = true -solc_version = '0.8.34' +solc_version = '0.8.35' evm_version = 'cancun' +# Suppress solc warnings emitted from third-party code we don't control +# (e.g. @openzeppelin/foundry-upgrades' state-mutability suggestions). +ignored_warnings_from = ["node_modules"] # Exclude test files from coverage reports no_match_coverage = "(^test/|^contracts/test/|/mocks/)" -[profile.test] -via_ir = false +# Opt-in profile for production-matching bytecode (viaIR + optimizer). +# Use FOUNDRY_PROFILE=prod for CI / pre-merge runs that should mirror what hardhat +# compiles for deploy. Default profile stays optimizer-off / viaIR-off for fast iteration. +[profile.prod] +optimizer = true +optimizer_runs = 100 +via_ir = true [lint] +# Disable lint-on-build: `pnpm lint:forge` (scoped to contracts/) is the canonical lint path +# for production code; auto-lint during build adds noise from test files without value. +lint_on_build = false exclude_lints = ["mixed-case-function", "mixed-case-variable", "block-timestamp"] ignore = ["node_modules/**", "test/node_modules/**"] diff --git a/packages/issuance/test/unit/agreement-manager/cancelWithPendingUpdate.t.sol b/packages/issuance/test/unit/agreement-manager/cancelWithPendingUpdate.t.sol index a1eac4ba8..09f4d2675 100644 --- a/packages/issuance/test/unit/agreement-manager/cancelWithPendingUpdate.t.sol +++ b/packages/issuance/test/unit/agreement-manager/cancelWithPendingUpdate.t.sol @@ -29,7 +29,6 @@ contract RecurringAgreementManagerCancelWithPendingUpdateTest is RecurringAgreem ); bytes16 agreementId = _offerAgreement(rca); - uint256 originalMaxClaim = 1 ether * 3600 + 100 ether; uint64 acceptedAt = uint64(block.timestamp); _setAgreementAccepted(agreementId, rca, acceptedAt); diff --git a/packages/issuance/test/unit/agreement-manager/edgeCases.t.sol b/packages/issuance/test/unit/agreement-manager/edgeCases.t.sol index f8bb00e8f..05c02f74d 100644 --- a/packages/issuance/test/unit/agreement-manager/edgeCases.t.sol +++ b/packages/issuance/test/unit/agreement-manager/edgeCases.t.sol @@ -769,7 +769,7 @@ contract RecurringAgreementManagerEdgeCasesTest is RecurringAgreementManagerShar // ==================== getProviderAgreements ==================== - function test_GetIndexerAgreements_Empty() public { + function test_GetIndexerAgreements_Empty() public view { bytes16[] memory ids = _getProviderAgreements(indexer); assertEq(ids.length, 0); } diff --git a/packages/issuance/test/unit/agreement-manager/escrowEdgeCases.t.sol b/packages/issuance/test/unit/agreement-manager/escrowEdgeCases.t.sol index 76cf085b2..0b9ec848a 100644 --- a/packages/issuance/test/unit/agreement-manager/escrowEdgeCases.t.sol +++ b/packages/issuance/test/unit/agreement-manager/escrowEdgeCases.t.sol @@ -184,7 +184,7 @@ contract RecurringAgreementManagerEscrowEdgeCasesTest is RecurringAgreementManag // Don't use _offerAgreement since it mints 1M tokens — call directly vm.prank(operator); - bytes16 agreementId = agreementManager.offerAgreement(_collector(), OFFER_TYPE_NEW, abi.encode(rca)); + agreementManager.offerAgreement(_collector(), OFFER_TYPE_NEW, abi.encode(rca)); uint256 expectedMaxClaim = 10 ether * 3600 + 500 ether; // 36500 ether assertEq(agreementManager.getSumMaxNextClaim(), expectedMaxClaim, "sum should reflect full maxNextClaim"); @@ -265,7 +265,7 @@ contract RecurringAgreementManagerEscrowEdgeCasesTest is RecurringAgreementManag ); bytes16 id1 = _offerAgreement(rca1); - bytes16 id2 = _offerAgreement(rca2); + _offerAgreement(rca2); uint256 maxClaim1 = 1 ether * 3600 + 100 ether; // 3700 ether uint256 maxClaim2 = 2 ether * 7200 + 200 ether; // 14600 ether diff --git a/packages/issuance/test/unit/agreement-manager/helperAudit.t.sol b/packages/issuance/test/unit/agreement-manager/helperAudit.t.sol index 72272c3e6..2fd9076ab 100644 --- a/packages/issuance/test/unit/agreement-manager/helperAudit.t.sol +++ b/packages/issuance/test/unit/agreement-manager/helperAudit.t.sol @@ -33,7 +33,7 @@ contract RecurringAgreementHelperAuditTest is RecurringAgreementManagerSharedTes // -- Helpers -- function _makeRCAForCollector( - MockRecurringCollector collector, + MockRecurringCollector /* collector */, address provider, uint256 nonce ) internal view returns (IRecurringCollector.RecurringCollectionAgreement memory rca) { diff --git a/packages/issuance/test/unit/agreement-manager/lifecycle.t.sol b/packages/issuance/test/unit/agreement-manager/lifecycle.t.sol index b7052ecc1..81dc75aa0 100644 --- a/packages/issuance/test/unit/agreement-manager/lifecycle.t.sol +++ b/packages/issuance/test/unit/agreement-manager/lifecycle.t.sol @@ -436,7 +436,6 @@ contract RecurringAgreementLifecycleTest is RecurringAgreementManagerSharedTest assertTrue(providerExists); // escrow still thawing, pair stays tracked // Collector2's agreement untouched - uint256 maxClaim1 = 1 ether * 3600 + 100 ether; uint256 maxClaim2 = 2 ether * 7200 + 200 ether; assertEq(agreementManager.getSumMaxNextClaim(IRecurringCollector(address(collector2)), indexer), maxClaim2); assertEq(agreementManager.getAgreementCount(IAgreementCollector(address(collector2)), indexer), 1); diff --git a/packages/issuance/test/unit/agreement-manager/multiIndexer.t.sol b/packages/issuance/test/unit/agreement-manager/multiIndexer.t.sol index 4f958fdc9..5647b3633 100644 --- a/packages/issuance/test/unit/agreement-manager/multiIndexer.t.sol +++ b/packages/issuance/test/unit/agreement-manager/multiIndexer.t.sol @@ -327,7 +327,6 @@ contract RecurringAgreementManagerMultiIndexerTest is RecurringAgreementManagerS bytes16 id1 = _offerAgreement(rca1); _offerAgreement(rca2); - uint256 maxClaim1 = 1 ether * 3600 + 100 ether; uint256 maxClaim2 = 2 ether * 7200 + 200 ether; // Reconcile indexer1's agreement diff --git a/packages/issuance/test/unit/agreement-manager/offerUpdate.t.sol b/packages/issuance/test/unit/agreement-manager/offerUpdate.t.sol index e58a356cf..e330ea4c0 100644 --- a/packages/issuance/test/unit/agreement-manager/offerUpdate.t.sol +++ b/packages/issuance/test/unit/agreement-manager/offerUpdate.t.sol @@ -45,8 +45,6 @@ contract RecurringAgreementManagerOfferUpdateTest is RecurringAgreementManagerSh _offerAgreementUpdate(rcau); - // Original maxNextClaim = 1e18 * 3600 + 100e18 = 3700e18 - uint256 originalMaxClaim = 1 ether * 3600 + 100 ether; // Pending = ongoing + initialExtra = 2e18 * 7200 + 200e18 = 14600e18 uint256 pendingTotal = 2 ether * 7200 + 200 ether; @@ -98,7 +96,6 @@ contract RecurringAgreementManagerOfferUpdateTest is RecurringAgreementManagerSh uint64(block.timestamp + 365 days) ); - uint256 originalMaxClaim = 1 ether * 3600 + 100 ether; // Pending = ongoing + initialExtra = 2e18 * 7200 + 200e18 = 14600e18 uint256 pendingTotal = 2 ether * 7200 + 200 ether; // Contribution = max(pendingTotal, originalMaxClaim) = 14600 (only one agreement) diff --git a/packages/issuance/test/unit/agreement-manager/reconcile.t.sol b/packages/issuance/test/unit/agreement-manager/reconcile.t.sol index c33d7e92b..0d7f8b1bd 100644 --- a/packages/issuance/test/unit/agreement-manager/reconcile.t.sol +++ b/packages/issuance/test/unit/agreement-manager/reconcile.t.sol @@ -279,7 +279,6 @@ contract RecurringAgreementManagerReconcileTest is RecurringAgreementManagerShar ); bytes16 agreementId = _offerAgreement(rca); - uint256 originalMaxClaim = 1 ether * 3600 + 100 ether; // Offer a pending update IRecurringCollector.RecurringCollectionAgreementUpdate memory rcau = _makeRCAU( @@ -344,7 +343,6 @@ contract RecurringAgreementManagerReconcileTest is RecurringAgreementManagerShar ); bytes16 agreementId = _offerAgreement(rca); - uint256 originalMaxClaim = 1 ether * 3600 + 100 ether; // Offer a pending update IRecurringCollector.RecurringCollectionAgreementUpdate memory rcau = _makeRCAU( @@ -578,7 +576,6 @@ contract RecurringAgreementManagerReconcileTest is RecurringAgreementManagerShar ); _offerAgreementUpdate(rcau); - uint256 originalMaxClaim = 1 ether * 3600 + 100 ether; // max(current, pending) = max(3700, 14600) = 14600 uint256 pendingMaxClaim = 14600 ether; assertEq(agreementManager.getSumMaxNextClaim(_collector(), indexer), pendingMaxClaim); diff --git a/packages/issuance/test/unit/agreement-manager/register.t.sol b/packages/issuance/test/unit/agreement-manager/register.t.sol index ecdbf2344..b43235e44 100644 --- a/packages/issuance/test/unit/agreement-manager/register.t.sol +++ b/packages/issuance/test/unit/agreement-manager/register.t.sol @@ -72,8 +72,7 @@ contract RecurringAgreementManagerOfferTest is RecurringAgreementManagerSharedTe uint64(block.timestamp + 365 days) ); - uint256 expectedMaxClaim = 1 ether * 3600 + 100 ether; - uint256 available = 500 ether; // Less than expectedMaxClaim + uint256 available = 500 ether; // Less than expectedMaxClaim (1 ether * 3600 + 100 ether = 3700 ether) // Fund with less than needed token.mint(address(agreementManager), available); diff --git a/packages/issuance/test/unit/agreement-manager/revokeOffer.t.sol b/packages/issuance/test/unit/agreement-manager/revokeOffer.t.sol index 72828f084..2a66575b8 100644 --- a/packages/issuance/test/unit/agreement-manager/revokeOffer.t.sol +++ b/packages/issuance/test/unit/agreement-manager/revokeOffer.t.sol @@ -84,7 +84,6 @@ contract RecurringAgreementManagerCancelOfferedTest is RecurringAgreementManager ); _offerAgreementUpdate(rcau); - uint256 originalMaxClaim = 1 ether * 3600 + 100 ether; // max(current, pending) = max(3700, 14600) = 14600 uint256 pendingMaxClaim = 14600 ether; assertEq(agreementManager.getSumMaxNextClaim(_collector(), indexer), pendingMaxClaim); diff --git a/packages/issuance/test/unit/agreement-manager/updateEscrow.t.sol b/packages/issuance/test/unit/agreement-manager/updateEscrow.t.sol index 9550f2ee0..afc8d2e08 100644 --- a/packages/issuance/test/unit/agreement-manager/updateEscrow.t.sol +++ b/packages/issuance/test/unit/agreement-manager/updateEscrow.t.sol @@ -522,7 +522,6 @@ contract RecurringAgreementManagerUpdateEscrowTest is RecurringAgreementManagerS bytes16 id1 = _offerAgreement(rca1); _offerAgreement(rca2); - uint256 maxClaim1 = 1 ether * 3600 + 100 ether; uint256 maxClaim2 = 2 ether * 7200 + 200 ether; // Reconcile indexer1's agreement (triggers thaw) diff --git a/packages/issuance/test/unit/allocator/distribution.t.sol b/packages/issuance/test/unit/allocator/distribution.t.sol index 196317dcf..c9cbf0b8b 100644 --- a/packages/issuance/test/unit/allocator/distribution.t.sol +++ b/packages/issuance/test/unit/allocator/distribution.t.sol @@ -482,6 +482,143 @@ contract IssuanceAllocatorDistributionTest is IssuanceAllocatorSharedTest { assertGt(token.balanceOf(address(trackerTarget)), 0); } + // ==================== Pending Distribution With No Accumulated Self-Minting ==================== + + /// @notice Starting from `selfMintingOffset == 0` (no prior accumulation), + /// `distributePendingIssuance()` must mint each target only its own allocator-minting + /// rate for the period, leaving the self-minting share to the self-minting targets. + function test_DistributePendingIssuance_NoOffset_DefaultGetsOwnRateOnly() public { + _setIssuanceRate(100 ether); + + // Default must be a real address for end-of-period default-target mint to run. + vm.prank(governor); + allocator.setDefaultTarget(address(trackerTarget)); + + // Self-minting-only target → default absorbs allocator share: + // default.allocatorMintingRate = 80, totalSelfMintingRate = 20. + _addTargetWithSelfMinting(IIssuanceTarget(address(simpleTarget)), 0, 20 ether); + + allocator.distributeIssuance(); + assertEq(allocator.getDistributionState().selfMintingOffset, 0); + + uint256 simpleBalBefore = token.balanceOf(address(simpleTarget)); + uint256 defaultBalBefore = token.balanceOf(address(trackerTarget)); + + uint256 blocksElapsed = 10; + vm.roll(block.number + blocksElapsed); + + vm.prank(governor); + allocator.distributePendingIssuance(); + + // Default receives its own rate only; the 20-per-block self-minting share is + // reserved for the self-minting target, not minted to it via the allocator path. + assertEq(token.balanceOf(address(simpleTarget)) - simpleBalBefore, 0); + assertEq(token.balanceOf(address(trackerTarget)) - defaultBalBefore, 80 ether * blocksElapsed); + } + + /// @notice The `toBlockNumber` overload advances `lastDistributionBlock` to exactly the + /// requested block, never over-mints to default for the partial period, and the cumulative + /// allocator distribution after a subsequent full catch-up matches per-rate over the period. + function test_DistributePendingIssuance_NoOffset_ToBlock_Partial() public { + _setIssuanceRate(100 ether); + + vm.prank(governor); + allocator.setDefaultTarget(address(trackerTarget)); + + _addTargetWithSelfMinting(IIssuanceTarget(address(simpleTarget)), 0, 20 ether); + + allocator.distributeIssuance(); + uint256 lastDistBlock = allocator.getDistributionState().lastDistributionBlock; + + uint256 simpleBalBefore = token.balanceOf(address(simpleTarget)); + uint256 defaultBalBefore = token.balanceOf(address(trackerTarget)); + + uint256 totalBlocks = 10; + uint256 partialBlocks = 4; + vm.roll(block.number + totalBlocks); + + vm.prank(governor); + allocator.distributePendingIssuance(lastDistBlock + partialBlocks); + + // Self-minting-only target receives nothing via the allocator path. + assertEq(token.balanceOf(address(simpleTarget)) - simpleBalBefore, 0); + // Safety bound: default never exceeds its per-rate share for the partial period. + uint256 partialMint = token.balanceOf(address(trackerTarget)) - defaultBalBefore; + assertLe(partialMint, 80 ether * partialBlocks); + assertEq(allocator.getDistributionState().lastDistributionBlock, lastDistBlock + partialBlocks); + + // Subsequent full catch-up restores the cumulative per-rate total over the full period. + allocator.distributeIssuance(); + assertEq(token.balanceOf(address(trackerTarget)) - defaultBalBefore, 80 ether * totalBlocks); + assertEq(allocator.getDistributionState().lastDistributionBlock, lastDistBlock + totalBlocks); + } + + /// @notice Starting from `selfMintingOffset == 0` (no prior accumulation), with a + /// target that has both allocator-minting and self-minting rates, the target receives + /// only its allocator-minting share and the default receives only its own rate. + function test_DistributePendingIssuance_NoOffset_MixedTargets() public { + _setIssuanceRate(100 ether); + + vm.prank(governor); + allocator.setDefaultTarget(address(trackerTarget)); + + // simpleTarget: 40 allocator + 20 self → default auto-adjusts to 40 allocator. + _addTargetWithSelfMinting(IIssuanceTarget(address(simpleTarget)), 40 ether, 20 ether); + + allocator.distributeIssuance(); + uint256 simpleBalBefore = token.balanceOf(address(simpleTarget)); + uint256 defaultBalBefore = token.balanceOf(address(trackerTarget)); + + uint256 blocksElapsed = 10; + vm.roll(block.number + blocksElapsed); + + vm.prank(governor); + allocator.distributePendingIssuance(); + + assertEq(token.balanceOf(address(simpleTarget)) - simpleBalBefore, 40 ether * blocksElapsed); + assertEq(token.balanceOf(address(trackerTarget)) - defaultBalBefore, 40 ether * blocksElapsed); + } + + /// @notice Total tokens minted via `distributePendingIssuance()` over a period + /// must not exceed the allocator-minting budget + /// `(issuancePerBlock - totalSelfMintingRate) * blocks`. The self-minting share + /// belongs to self-minting targets and must not be minted by the allocator. + function testFuzz_DistributePendingIssuance_NoOffset_StaysWithinAllocatorBudget( + uint256 _selfMintingRate, + uint256 _allocatorRate, + uint256 _blocksElapsed + ) public { + uint256 issuancePerBlock = 100 ether; + uint256 selfMintingRate = bound(_selfMintingRate, 0, issuancePerBlock); + uint256 allocatorRate = bound(_allocatorRate, 0, issuancePerBlock - selfMintingRate); + uint256 blocksElapsed = bound(_blocksElapsed, 1, 1_000); + + _setIssuanceRate(issuancePerBlock); + + vm.prank(governor); + allocator.setDefaultTarget(address(trackerTarget)); + + if (allocatorRate != 0 || selfMintingRate != 0) { + _addTargetWithSelfMinting(IIssuanceTarget(address(simpleTarget)), allocatorRate, selfMintingRate); + } + + allocator.distributeIssuance(); + assertEq(allocator.getDistributionState().selfMintingOffset, 0); + + uint256 simpleBalBefore = token.balanceOf(address(simpleTarget)); + uint256 defaultBalBefore = token.balanceOf(address(trackerTarget)); + + vm.roll(block.number + blocksElapsed); + + vm.prank(governor); + allocator.distributePendingIssuance(); + + uint256 totalMinted = (token.balanceOf(address(simpleTarget)) - simpleBalBefore) + + (token.balanceOf(address(trackerTarget)) - defaultBalBefore); + + assertLe(totalMinted, (issuancePerBlock - selfMintingRate) * blocksElapsed); + } + // ==================== Reentrancy Protection ==================== function test_Revert_ReentrantSetTargetAllocation() public { diff --git a/packages/subgraph-service/foundry.toml b/packages/subgraph-service/foundry.toml index 8208c8baf..296789e19 100644 --- a/packages/subgraph-service/foundry.toml +++ b/packages/subgraph-service/foundry.toml @@ -3,16 +3,28 @@ src = 'contracts' out = 'build' libs = ["node_modules"] test = 'test' -cache_path = 'cache_forge' -fs_permissions = [{ access = "read", path = "./"}] -optimizer = true -optimizer_runs = 100 -via_ir = true +cache_path = 'cache_forge' +fs_permissions = [{ access = "read", path = "./" }] +solc_version = '0.8.35' evm_version = 'cancun' +# Suppress solc warnings emitted from third-party code we don't control +# (e.g. @openzeppelin/foundry-upgrades' state-mutability suggestions). +ignored_warnings_from = ["node_modules"] # Exclude test files from coverage reports no_match_coverage = "(^test/|/mocks/)" +# Opt-in profile for production-matching bytecode (viaIR + optimizer). +# Use FOUNDRY_PROFILE=prod for CI / pre-merge runs that should mirror what hardhat +# compiles for deploy. Default profile stays optimizer-off / viaIR-off for fast iteration. +[profile.prod] +optimizer = true +optimizer_runs = 100 +via_ir = true + # Lint configuration [lint] +# Disable lint-on-build: `pnpm lint:forge` (scoped to contracts/) is the canonical lint path +# for production code; auto-lint during build adds noise from test files without value. +lint_on_build = false exclude_lints = ["mixed-case-function", "mixed-case-variable", "block-timestamp"] diff --git a/packages/subgraph-service/hardhat.config.ts b/packages/subgraph-service/hardhat.config.ts index f6f6b387e..77d57c585 100644 --- a/packages/subgraph-service/hardhat.config.ts +++ b/packages/subgraph-service/hardhat.config.ts @@ -18,14 +18,6 @@ if (isProjectBuilt(__dirname)) { const baseConfig = hardhatBaseConfig(require) const config: HardhatUserConfig = { ...baseConfig, - solidity: { - version: '0.8.34', - settings: { - optimizer: { enabled: true, runs: 100 }, - evmVersion: 'cancun', - viaIR: true, - }, - }, sourcify: { enabled: false, }, diff --git a/packages/subgraph-service/test/unit/subgraphService/indexing-agreement/collect.t.sol b/packages/subgraph-service/test/unit/subgraphService/indexing-agreement/collect.t.sol index 46d3dac26..ebfef4ec0 100644 --- a/packages/subgraph-service/test/unit/subgraphService/indexing-agreement/collect.t.sol +++ b/packages/subgraph-service/test/unit/subgraphService/indexing-agreement/collect.t.sol @@ -283,12 +283,12 @@ contract SubgraphServiceIndexingAgreementCollectTest is SubgraphServiceIndexingA function test_SubgraphService_CollectIndexingFees_AfterCloseStaleAllocation_ResizesToZero( Seed memory seed, - uint256 entities, - bytes32 poi + uint256 /* entities */, + bytes32 /* poi */ ) public { Context storage ctx = _newCtx(seed); IndexerState memory indexerState = _withIndexer(ctx); - (, bytes16 acceptedAgreementId) = _withAcceptedIndexingAgreement(ctx, indexerState); + _withAcceptedIndexingAgreement(ctx, indexerState); skip(MAX_POI_STALENESS + 1); resetPrank(indexerState.addr); diff --git a/packages/testing/foundry.toml b/packages/testing/foundry.toml index 8b632102a..e81bd9bc3 100644 --- a/packages/testing/foundry.toml +++ b/packages/testing/foundry.toml @@ -16,12 +16,22 @@ remappings = [ "subgraph-service/=node_modules/@graphprotocol/subgraph-service/contracts/", "subgraph-service-test/=node_modules/@graphprotocol/subgraph-service/test/", ] +solc_version = '0.8.35' +evm_version = 'cancun' + +# Opt-in profile for production-matching bytecode (viaIR + optimizer). +# Use FOUNDRY_PROFILE=prod for CI / pre-merge runs that should mirror what hardhat +# compiles for deploy. Default profile stays optimizer-off / viaIR-off for fast iteration. +[profile.prod] optimizer = true optimizer_runs = 100 via_ir = true -solc_version = '0.8.34' -evm_version = 'cancun' [lint] +# Disable lint-on-build: forge's lint walker follows symlinks without cycle detection and +# infinite-loops on this package's pnpm-hoisted node_modules +# (e.g., @graphprotocol/contracts/task/node_modules/@graphprotocol/contracts/task/...). +# `forge lint contracts/` (scoped) still works as a separate command. +lint_on_build = false exclude_lints = ["mixed-case-function", "mixed-case-variable", "block-timestamp"] ignore = ["node_modules/**", "**/node_modules/**"] diff --git a/packages/testing/test/gas/CallbackGas.t.sol b/packages/testing/test/gas/CallbackGas.t.sol index ae703ad51..f4b6e5da1 100644 --- a/packages/testing/test/gas/CallbackGas.t.sol +++ b/packages/testing/test/gas/CallbackGas.t.sol @@ -85,7 +85,7 @@ contract CallbackGasTest is RealStackHarness { bytes16 agreementId = _offerAgreement(rca); // Accept on the real RecurringCollector using ContractApproval path (empty signature). - // RAM.approveAgreement returns the selector when the hash is authorized. + // The RCA hash was pre-registered via _offerAgreement, so the stored-hash check passes. vm.prank(dataService); recurringCollector.accept(rca, ""); diff --git a/packages/testing/test/harness/FullStackHarness.t.sol b/packages/testing/test/harness/FullStackHarness.t.sol index b02735288..efc2fef6a 100644 --- a/packages/testing/test/harness/FullStackHarness.t.sol +++ b/packages/testing/test/harness/FullStackHarness.t.sol @@ -151,33 +151,39 @@ abstract contract FullStackHarness is Test { // We use type(...).creationCode instead of vm.getCode to get the exact bytecode // that will be used by CREATE2, avoiding metadata hash mismatches across packages. bytes32 saltGP = keccak256("GraphPaymentsSalt"); - bytes memory gpCreation = type(GraphPayments).creationCode; - address predictedGP = vm.computeCreate2Address( - saltGP, - keccak256(bytes.concat(gpCreation, abi.encode(address(controller), PROTOCOL_PAYMENT_CUT))), - deployer - ); - bytes32 saltEscrow = keccak256("GraphEscrowSalt"); - bytes memory escrowCreation = type(PaymentsEscrow).creationCode; - address predictedEscrow = vm.computeCreate2Address( - saltEscrow, - keccak256(bytes.concat(escrowCreation, abi.encode(address(controller), WITHDRAW_ESCROW_THAWING_PERIOD))), - deployer - ); - - // Register in controller (GraphDirectory reads immutably at construction) - vm.startPrank(governor); - controller.setContractProxy(keccak256("GraphToken"), address(token)); - controller.setContractProxy(keccak256("Staking"), address(stakingProxy)); - controller.setContractProxy(keccak256("RewardsManager"), address(rewardsManager)); - controller.setContractProxy(keccak256("GraphPayments"), predictedGP); - controller.setContractProxy(keccak256("PaymentsEscrow"), predictedEscrow); - controller.setContractProxy(keccak256("EpochManager"), address(epochManager)); - controller.setContractProxy(keccak256("GraphTokenGateway"), makeAddr("GraphTokenGateway")); - controller.setContractProxy(keccak256("GraphProxyAdmin"), makeAddr("GraphProxyAdmin")); - controller.setContractProxy(keccak256("Curation"), address(curation)); - vm.stopPrank(); + // Block-scoped to release the creationCode/predicted-address locals before later code — + // legacy compiler pipeline runs out of stack slots in this function otherwise. + { + bytes memory gpCreation = type(GraphPayments).creationCode; + address predictedGP = vm.computeCreate2Address( + saltGP, + keccak256(bytes.concat(gpCreation, abi.encode(address(controller), PROTOCOL_PAYMENT_CUT))), + deployer + ); + + bytes memory escrowCreation = type(PaymentsEscrow).creationCode; + address predictedEscrow = vm.computeCreate2Address( + saltEscrow, + keccak256( + bytes.concat(escrowCreation, abi.encode(address(controller), WITHDRAW_ESCROW_THAWING_PERIOD)) + ), + deployer + ); + + // Register in controller (GraphDirectory reads immutably at construction) + vm.startPrank(governor); + controller.setContractProxy(keccak256("GraphToken"), address(token)); + controller.setContractProxy(keccak256("Staking"), address(stakingProxy)); + controller.setContractProxy(keccak256("RewardsManager"), address(rewardsManager)); + controller.setContractProxy(keccak256("GraphPayments"), predictedGP); + controller.setContractProxy(keccak256("PaymentsEscrow"), predictedEscrow); + controller.setContractProxy(keccak256("EpochManager"), address(epochManager)); + controller.setContractProxy(keccak256("GraphTokenGateway"), makeAddr("GraphTokenGateway")); + controller.setContractProxy(keccak256("GraphProxyAdmin"), makeAddr("GraphProxyAdmin")); + controller.setContractProxy(keccak256("Curation"), address(curation)); + vm.stopPrank(); + } // Deploy DisputeManager vm.startPrank(deployer); diff --git a/packages/testing/test/integration/AgreementLifecycle.t.sol b/packages/testing/test/integration/AgreementLifecycle.t.sol index 515450460..9e01afc77 100644 --- a/packages/testing/test/integration/AgreementLifecycle.t.sol +++ b/packages/testing/test/integration/AgreementLifecycle.t.sol @@ -83,46 +83,49 @@ contract AgreementLifecycleTest is FullStackHarness { assertEq(uint8(ssAgreement.collectorAgreement.state), uint8(IRecurringCollector.AgreementState.Accepted)); // -- Step 3: Advance time and collect -- - uint256 collectSeconds = 1800; // 30 minutes - skip(collectSeconds); - - // Add extra tokens to indexer's provision for stake locking - uint256 expectedTokens = tokensPerSecond * collectSeconds; - uint256 tokensToLock = expectedTokens * STAKE_TO_FEES_RATIO; - _mintTokens(indexer.addr, tokensToLock); - vm.startPrank(indexer.addr); - token.approve(address(staking), tokensToLock); - staking.stakeTo(indexer.addr, tokensToLock); - staking.addToProvision(indexer.addr, address(subgraphService), tokensToLock); - vm.stopPrank(); - - uint256 indexerBalanceBefore = token.balanceOf(indexer.addr); - (uint256 escrowBefore, , ) = escrow.escrowAccounts(address(ram), address(recurringCollector), indexer.addr); - - // Advance past allocation creation epoch so POI isn't "too young" - vm.roll(block.number + EPOCH_LENGTH); - - uint256 tokensCollected = _collectIndexingFees( - indexer, - agreementId, - 0, // entities - keccak256("poi1"), - block.number - 1 - ); - - // Verify tokens flowed correctly - assertTrue(tokensCollected > 0, "should collect tokens"); - uint256 indexerBalanceAfter = token.balanceOf(indexer.addr); - uint256 protocolBurn = tokensCollected.mulPPMRoundUp(PROTOCOL_PAYMENT_CUT); - assertEq( - indexerBalanceAfter - indexerBalanceBefore, - tokensCollected - protocolBurn, - "indexer received tokens minus protocol cut" - ); - - // Verify escrow changed (RAM's beforeCollection/afterCollection may adjust balance) - (uint256 escrowAfter, , ) = escrow.escrowAccounts(address(ram), address(recurringCollector), indexer.addr); - assertTrue(escrowAfter < escrowBefore, "escrow balance decreased after collection"); + // Block-scoped to release step-3 locals before step 4 — legacy compiler pipeline runs out of stack slots otherwise. + { + uint256 collectSeconds = 1800; // 30 minutes + skip(collectSeconds); + + // Add extra tokens to indexer's provision for stake locking + uint256 expectedTokens = tokensPerSecond * collectSeconds; + uint256 tokensToLock = expectedTokens * STAKE_TO_FEES_RATIO; + _mintTokens(indexer.addr, tokensToLock); + vm.startPrank(indexer.addr); + token.approve(address(staking), tokensToLock); + staking.stakeTo(indexer.addr, tokensToLock); + staking.addToProvision(indexer.addr, address(subgraphService), tokensToLock); + vm.stopPrank(); + + uint256 indexerBalanceBefore = token.balanceOf(indexer.addr); + (uint256 escrowBefore, , ) = escrow.escrowAccounts(address(ram), address(recurringCollector), indexer.addr); + + // Advance past allocation creation epoch so POI isn't "too young" + vm.roll(block.number + EPOCH_LENGTH); + + uint256 tokensCollected = _collectIndexingFees( + indexer, + agreementId, + 0, // entities + keccak256("poi1"), + block.number - 1 + ); + + // Verify tokens flowed correctly + assertTrue(tokensCollected > 0, "should collect tokens"); + uint256 indexerBalanceAfter = token.balanceOf(indexer.addr); + uint256 protocolBurn = tokensCollected.mulPPMRoundUp(PROTOCOL_PAYMENT_CUT); + assertEq( + indexerBalanceAfter - indexerBalanceBefore, + tokensCollected - protocolBurn, + "indexer received tokens minus protocol cut" + ); + + // Verify escrow changed (RAM's beforeCollection/afterCollection may adjust balance) + (uint256 escrowAfter, , ) = escrow.escrowAccounts(address(ram), address(recurringCollector), indexer.addr); + assertTrue(escrowAfter < escrowBefore, "escrow balance decreased after collection"); + } // -- Step 4: Reconcile RAM state -- ram.reconcileAgreement(IAgreementCollector(address(recurringCollector)), agreementId); diff --git a/packages/toolshed/src/hardhat/hardhat.base.config.ts b/packages/toolshed/src/hardhat/hardhat.base.config.ts index a97f9d29c..3b7e3b66d 100644 --- a/packages/toolshed/src/hardhat/hardhat.base.config.ts +++ b/packages/toolshed/src/hardhat/hardhat.base.config.ts @@ -1,5 +1,5 @@ import { vars } from 'hardhat/config' -import type { HardhatUserConfig, NetworksUserConfig, ProjectPathsUserConfig, SolidityUserConfig } from 'hardhat/types' +import type { HardhatUserConfig, NetworksUserConfig, ProjectPathsUserConfig, SolcUserConfig } from 'hardhat/types' import { resolveAddressBook } from '../lib/resolve' @@ -41,13 +41,15 @@ const ARBITRUM_SEPOLIA_RPC = vars.get('ARBITRUM_SEPOLIA_RPC', 'https://sepolia-r const LOCAL_NETWORK_RPC = vars.get('LOCAL_NETWORK_RPC', 'http://chain:8545') const LOCALHOST_RPC = vars.get('LOCALHOST_RPC', 'http://localhost:8545') -export const solidityUserConfig: SolidityUserConfig = { - version: '0.8.27', +export const solidityUserConfig: SolcUserConfig = { + version: '0.8.35', settings: { optimizer: { enabled: true, runs: 100, }, + viaIR: true, + evmVersion: 'cancun', }, } @@ -81,6 +83,7 @@ export const networksUserConfig = function (callerRequire: typeof require): Base return { hardhat: { chainId: 31337, + hardfork: 'cancun', accounts: { mnemonic: 'myth like bonus scare over problem client lizard pioneer submit female collect', }, diff --git a/packages/toolshed/src/hardhat/index.ts b/packages/toolshed/src/hardhat/index.ts index 689ab47a6..629b971d1 100644 --- a/packages/toolshed/src/hardhat/index.ts +++ b/packages/toolshed/src/hardhat/index.ts @@ -1,7 +1,7 @@ export { isProjectBuilt, loadTasks } from './config' export { setERC20Balance, setGRTBalance } from './erc20' export { getEventData } from './event' -export { hardhatBaseConfig } from './hardhat.base.config' +export { hardhatBaseConfig, solidityUserConfig } from './hardhat.base.config' export { loadConfig, patchConfig, saveToAddressBook } from './ignition' export { requireLocalNetwork } from './local' export { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0554d28f1..24d52b5dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,8 +64,8 @@ catalogs: specifier: ^16.4.0 version: 16.4.0 hardhat: - specifier: ^2.26.0 - version: 2.26.3 + specifier: ^2.28.0 + version: 2.28.6 hardhat-contract-sizer: specifier: ^2.10.0 version: 2.10.1 @@ -204,7 +204,7 @@ importers: version: 3.1.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@defi-wonderland/smock': specifier: ^2.4.1 - version: 2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@ethersproject/abi': specifier: ^5.8.0 version: 5.8.0 @@ -228,19 +228,19 @@ importers: version: link:../interfaces '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.1.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-verify': specifier: 2.1.1 - version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-ethers': specifier: ^2.2.3 - version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-waffle': specifier: ^2.0.6 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 3.4.2 version: 3.4.2 @@ -249,13 +249,13 @@ importers: version: 3.4.2 '@openzeppelin/hardhat-upgrades': specifier: ^1.22.1 - version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v5': specifier: ^10.2.1 version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^6.1.2 - version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -300,22 +300,22 @@ importers: version: 2.12.6(graphql@16.11.0) hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.11.0 - version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.11.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: 'catalog:' - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: 'catalog:' - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-ignore-warnings: specifier: 'catalog:' version: 0.2.12 hardhat-storage-layout: specifier: 'catalog:' - version: 0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.1.7(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) prettier: specifier: 'catalog:' version: 3.8.1 @@ -327,7 +327,7 @@ importers: version: 6.0.3(typescript@5.9.3) solidity-coverage: specifier: ^0.8.16 - version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.19.14)(typescript@5.9.3) @@ -364,7 +364,7 @@ importers: version: 3.1.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@defi-wonderland/smock': specifier: ^2.4.1 - version: 2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@ethersproject/abi': specifier: ^5.8.0 version: 5.8.0 @@ -385,16 +385,16 @@ importers: version: 1.8.7(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.1.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-ethers': specifier: ^2.2.3 - version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-waffle': specifier: ^2.0.6 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 3.4.2 version: 3.4.2 @@ -403,13 +403,13 @@ importers: version: 3.4.2 '@openzeppelin/hardhat-upgrades': specifier: ^1.22.1 - version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v5': specifier: ^10.2.1 version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^6.1.2 - version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -454,19 +454,19 @@ importers: version: 2.12.6(graphql@16.11.0) hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.11.0 - version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.11.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-storage-layout: specifier: ^0.1.7 - version: 0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.1.7(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) prettier: specifier: 'catalog:' version: 3.8.1 @@ -475,7 +475,7 @@ importers: version: 2.1.0(prettier@3.8.1) solidity-coverage: specifier: ^0.8.16 - version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.19.14)(typescript@5.9.3) @@ -533,13 +533,13 @@ importers: version: 1.8.7(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.1.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-ethers': specifier: ^2.2.3 - version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 3.4.2 version: 3.4.2 @@ -548,13 +548,13 @@ importers: version: 3.4.2 '@openzeppelin/hardhat-upgrades': specifier: ^1.22.1 - version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v5': specifier: ^10.2.1 version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^6.1.2 - version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/glob': specifier: ^8.1.0 version: 8.1.0 @@ -587,19 +587,19 @@ importers: version: 2.12.6(graphql@16.11.0) hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.11.0 - version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.11.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-storage-layout: specifier: ^0.1.7 - version: 0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.1.7(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) prettier: specifier: 'catalog:' version: 3.8.1 @@ -641,31 +641,31 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomiclabs/hardhat-ethers': specifier: ^2.0.2 - version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.2 - version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-waffle': specifier: ^2.0.1 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^4.5.0 version: 4.9.6 '@openzeppelin/hardhat-upgrades': specifier: ^1.8.2 - version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@tenderly/api-client': specifier: ^1.0.13 version: 1.1.0(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3) '@tenderly/hardhat-tenderly': specifier: ^1.0.13 - version: 1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@typechain/ethers-v5': specifier: ^10.2.1 version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^6.1.6 - version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/mocha': specifier: ^9.0.0 version: 9.1.1 @@ -695,19 +695,19 @@ importers: version: 1.2.5(solium@1.2.5) hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.2.0 - version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.11.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.0.3 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.4 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-secure-accounts: specifier: 0.0.6 - version: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) husky: specifier: ^7.0.4 version: 7.0.4 @@ -731,7 +731,7 @@ importers: version: 6.0.3(typescript@5.9.3) solidity-coverage: specifier: ^0.8.16 - version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) truffle-flattener: specifier: ^1.4.4 version: 1.6.0 @@ -858,7 +858,7 @@ importers: version: link:../toolshed '@nomicfoundation/hardhat-ethers': specifier: 'catalog:' - version: 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: specifier: ^4.3.7 version: 4.4.3(supports-color@9.4.0) @@ -868,7 +868,7 @@ importers: devDependencies: '@nomicfoundation/hardhat-verify': specifier: ^2.0.12 - version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@types/chai': specifier: ^4.0.0 version: 4.3.20 @@ -889,10 +889,10 @@ importers: version: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-secure-accounts: specifier: ^1.0.4 - version: 1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) mocha: specifier: ^10.8.2 version: 10.8.2 @@ -916,28 +916,28 @@ importers: version: link:../toolshed '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: 'catalog:' - version: 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.1 - version: 1.2.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.2.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.9 - version: 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.9 - version: 0.15.14(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.15.14(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.1.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(8d521f1e2e60e049232a7f203ff6170d) + version: 4.0.0(c97007b62875fc8ad4d8d85b595e6fa7) '@nomicfoundation/hardhat-verify': specifier: ^2.1.1 - version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': specifier: ^0.15.9 version: 0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -952,13 +952,13 @@ importers: version: 0.4.0(@openzeppelin/defender-deploy-client-cli@0.0.1-alpha.10(encoding@0.1.13))(@openzeppelin/upgrades-core@1.44.1) '@tenderly/hardhat-tenderly': specifier: ^1.11.0 - version: 1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@typechain/ethers-v6': specifier: ^0.5.0 version: 0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -985,19 +985,19 @@ importers: version: 11.0.3 hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-graph-protocol: specifier: workspace:^ version: link:../hardhat-graph-protocol hardhat-secure-accounts: specifier: ^1.0.5 - version: 1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) lint-staged: specifier: 'catalog:' version: 16.2.7 @@ -1012,7 +1012,7 @@ importers: version: 6.0.3(typescript@5.9.3) solidity-coverage: specifier: ^0.8.0 - version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ts-node: specifier: '>=8.0.0' version: 10.9.2(@types/node@20.19.14)(typescript@5.9.3) @@ -1033,13 +1033,13 @@ importers: version: 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(841324e874603666491d4961f5a3314c) + version: 4.0.0(387217c56543caeacafa191f98890669) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 - version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 3.4.2 version: 3.4.2 @@ -1060,7 +1060,7 @@ importers: version: ethers@5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-ignore-warnings: specifier: 'catalog:' version: 0.2.12 @@ -1190,28 +1190,28 @@ importers: version: link:../toolshed '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: 'catalog:' - version: 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-foundry': specifier: ^1.1.1 - version: 1.2.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.2.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition': specifier: ^0.15.9 - version: 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.9 - version: 0.15.14(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.15.14(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.0 - version: 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.1.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^4.0.0 - version: 4.0.0(8d521f1e2e60e049232a7f203ff6170d) + version: 4.0.0(c97007b62875fc8ad4d8d85b595e6fa7) '@nomicfoundation/hardhat-verify': specifier: ^2.0.10 - version: 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': specifier: ^0.15.9 version: 0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -1226,13 +1226,13 @@ importers: version: 0.4.0(@openzeppelin/defender-deploy-client-cli@0.0.1-alpha.10(encoding@0.1.13))(@openzeppelin/upgrades-core@1.44.1) '@tenderly/hardhat-tenderly': specifier: ^1.11.0 - version: 1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@typechain/ethers-v6': specifier: ^0.5.0 version: 0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/chai': specifier: ^4.2.0 version: 4.3.20 @@ -1259,19 +1259,19 @@ importers: version: 11.0.3 hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-graph-protocol: specifier: workspace:^ version: link:../hardhat-graph-protocol hardhat-secure-accounts: specifier: ^1.0.5 - version: 1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) json5: specifier: ^2.2.3 version: 2.2.3 @@ -1289,10 +1289,10 @@ importers: version: 6.0.3(typescript@5.9.3) solidity-coverage: specifier: ^0.8.0 - version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) solidity-docgen: specifier: ^0.6.0-beta.36 - version: 0.6.0-beta.36(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.6.0-beta.36(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ts-node: specifier: '>=8.0.0' version: 10.9.2(@types/node@20.19.14)(typescript@5.9.3) @@ -1365,13 +1365,13 @@ importers: version: 3.15.2(graphql-yoga@5.15.2(graphql@16.11.0))(graphql@16.11.0) '@nomiclabs/hardhat-ethers': specifier: ^2.2.3 - version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.0 - version: 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-waffle': specifier: ^2.0.6 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: 3.4.2 version: 3.4.2 @@ -1380,13 +1380,13 @@ importers: version: 3.4.2 '@openzeppelin/hardhat-upgrades': specifier: ^1.22.1 - version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v5': specifier: ^10.2.1 version: 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) '@typechain/hardhat': specifier: ^6.1.6 - version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) + version: 6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/mocha': specifier: ^9.1.0 version: 9.1.1 @@ -1425,19 +1425,19 @@ importers: version: 5.15.2(graphql@16.11.0) hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-abi-exporter: specifier: ^2.0.1 - version: 2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.11.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.0.1 - version: 2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) hardhat-deploy: specifier: ^0.7.0-beta.9 - version: 0.7.11(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.7.11(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.1 - version: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) hardhat-ignore-warnings: specifier: 'catalog:' version: 0.2.12 @@ -1464,7 +1464,7 @@ importers: version: 6.0.3(typescript@5.9.3) solidity-coverage: specifier: ^0.8.16 - version: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.19.14)(typescript@5.9.3) @@ -1491,7 +1491,7 @@ importers: version: link:../issuance '@nomicfoundation/hardhat-ethers': specifier: 'catalog:' - version: 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: specifier: ^4.4.0 version: 4.4.3(supports-color@9.4.0) @@ -1503,7 +1503,7 @@ importers: version: 11.0.3 hardhat: specifier: 'catalog:' - version: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) json5: specifier: ^2.2.3 version: 2.2.3 @@ -3609,70 +3609,70 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nomicfoundation/edr-darwin-arm64@0.11.3': - resolution: {integrity: sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA==} - engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-arm64@0.12.0-next.22': resolution: {integrity: sha512-TpEBSKyMZJEPvYwBPYclC2b+qobKjn1YhVa7aJ1R7RMPy5dJ/PqsrUK5UuUFFybBqoIorru5NTcsyCMWP5T/Fg==} engines: {node: '>= 20'} - '@nomicfoundation/edr-darwin-x64@0.11.3': - resolution: {integrity: sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA==} - engines: {node: '>= 18'} + '@nomicfoundation/edr-darwin-arm64@0.12.0-next.23': + resolution: {integrity: sha512-Amh7mRoDzZyJJ4efqoePqdoZOzharmSOttZuJDlVE5yy07BoE8hL6ZRpa5fNYn0LCqn/KoWs8OHANWxhKDGhvQ==} + engines: {node: '>= 20'} '@nomicfoundation/edr-darwin-x64@0.12.0-next.22': resolution: {integrity: sha512-aK/+m8xUkR4u+czTVGU06nSFVH43AY6XCBoR2YjO8SglAAjCSTWK3WAfVb6FcsriMmKv4PrvoyHLMbMP+fXcGA==} engines: {node: '>= 20'} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.3': - resolution: {integrity: sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ==} - engines: {node: '>= 18'} + '@nomicfoundation/edr-darwin-x64@0.12.0-next.23': + resolution: {integrity: sha512-9wn489FIQm7m0UCD+HhktjWx6vskZzeZD9oDc2k9ZvbBzdXwPp5tiDqUBJ+eQpByAzCDfteAJwRn2lQCE0U+Iw==} + engines: {node: '>= 20'} '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.22': resolution: {integrity: sha512-W5vXMleG14hVzRYGPEwlHLJ6iiQE8Qh63Uj538nAz4YUI6wWSgUOZE7K2Gt1EdujZGnrt7kfDslgJ96n4nKQZw==} engines: {node: '>= 20'} - '@nomicfoundation/edr-linux-arm64-musl@0.11.3': - resolution: {integrity: sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA==} - engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.23': + resolution: {integrity: sha512-nlk5EejSzEUfEngv0Jkhqq3/wINIfF2ED9wAofc22w/V1DV99ASh9l3/e/MIHOQFecIZ9MDqt0Em9/oDyB1Uew==} + engines: {node: '>= 20'} '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.22': resolution: {integrity: sha512-VDp7EB3iY8MH/fFVcgEzLDGYmtS6j2honNc0RNUCFECKPrdsngGrTG8p+YFxyVjq2m5GEsdyKo4e+BKhaUNPdg==} engines: {node: '>= 20'} - '@nomicfoundation/edr-linux-x64-gnu@0.11.3': - resolution: {integrity: sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw==} - engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.23': + resolution: {integrity: sha512-SJuPBp3Rc6vM92UtVTUxZQ/QlLhLfwTftt2XUiYohmGKB3RjGzpgduEFMCA0LEnucUckU6UHrJNFHiDm77C4PQ==} + engines: {node: '>= 20'} '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.22': resolution: {integrity: sha512-XL6oA3ymRSQYyvg6hF1KIax6V/9vlWr5gJ8GPHVVODk1a/YfuEEY1osN5Zmo6aztUkSGKwSuac/3Ax7rfDDiSg==} engines: {node: '>= 20'} - '@nomicfoundation/edr-linux-x64-musl@0.11.3': - resolution: {integrity: sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg==} - engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.23': + resolution: {integrity: sha512-NU+Qs3u7Qt6t3bJFdmmjd5CsvgI2bPPzO31KifM2Ez96/jsXYho5debtTQnimlb5NAqiHTSlxjh/F8ROcptmeQ==} + engines: {node: '>= 20'} '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.22': resolution: {integrity: sha512-hmkRIXxWa9P0PwfXOAO6WUw11GyV5gpxcMunqWBTkwZ4QW/hi/CkXmlLo6VHd6ceCwpUNLhCGndBtrOPrNRi4A==} engines: {node: '>= 20'} - '@nomicfoundation/edr-win32-x64-msvc@0.11.3': - resolution: {integrity: sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung==} - engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.23': + resolution: {integrity: sha512-F78fZA2h6/ssiCSZOovlgIu0dUeI7ItKPsDDF3UUlIibef052GCXmliMinC90jVPbrjUADMd1BUwjfI0Z8OllQ==} + engines: {node: '>= 20'} '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.22': resolution: {integrity: sha512-X7f+7KUMm00trsXAHCHJa+x1fc3QAbk2sBctyOgpET+GLrfCXbxqrccKi7op8f0zTweAVGg1Hsc8SjjC7kwFLw==} engines: {node: '>= 20'} - '@nomicfoundation/edr@0.11.3': - resolution: {integrity: sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g==} - engines: {node: '>= 18'} + '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.23': + resolution: {integrity: sha512-IfJZQJn7d/YyqhmguBIGoCKjE9dKjbu6V6iNEPApfwf5JyyjHYyyfkLU4rf7hygj57bfH4sl1jtQ6r8HnT62lw==} + engines: {node: '>= 20'} '@nomicfoundation/edr@0.12.0-next.22': resolution: {integrity: sha512-JigYWf2stjpDxSndBsxRoobQHK8kz4SAVaHtTIKQLIHbsBwymE8i120Ejne6Jk+Ndc5CsNINXB8/bK6vLPe9jA==} engines: {node: '>= 20'} + '@nomicfoundation/edr@0.12.0-next.23': + resolution: {integrity: sha512-F2/6HZh8Q9RsgkOIkRrckldbhPjIZY7d4mT9LYuW68miwGQ5l7CkAgcz9fRRiurA0+YJhtsbx/EyrD9DmX9BOw==} + engines: {node: '>= 20'} + '@nomicfoundation/ethereumjs-rlp@5.0.4': resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} engines: {node: '>=18'} @@ -7710,8 +7710,8 @@ packages: peerDependencies: hardhat: ^2.0.3 - hardhat@2.26.3: - resolution: {integrity: sha512-gBfjbxCCEaRgMCRgTpjo1CEoJwqNPhyGMMVHYZJxoQ3LLftp2erSVf8ZF6hTQC0r2wst4NcqNmLWqMnHg1quTw==} + hardhat@2.28.6: + resolution: {integrity: sha512-zQze7qe+8ltwHvhX5NQ8sN1N37WWZGw8L63y+2XcPxGwAjc/SMF829z3NS6o1krX0sryhAsVBK/xrwUqlsot4Q==} hasBin: true peerDependencies: ts-node: '*' @@ -11228,24 +11228,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] solidity-comments-linux-arm64-musl@0.0.2: resolution: {integrity: sha512-guCDbHArcjE+JDXYkxx5RZzY1YF6OnAKCo+sTC5fstyW/KGKaQJNPyBNWuwYsQiaEHpvhW1ha537IvlGek8GqA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] solidity-comments-linux-x64-gnu@0.0.2: resolution: {integrity: sha512-zIqLehBK/g7tvrFmQljrfZXfkEeLt2v6wbe+uFu6kH/qAHZa7ybt8Vc0wYcmjo2U0PeBm15d79ee3AkwbIjFdQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] solidity-comments-linux-x64-musl@0.0.2: resolution: {integrity: sha512-R9FeDloVlFGTaVkOlELDVC7+1Tjx5WBPI5L8r0AGOPHK3+jOcRh6sKYpI+VskSPDc3vOO46INkpDgUXrKydlIw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] solidity-comments-win32-arm64-msvc@0.0.2: resolution: {integrity: sha512-QnWJoCQcJj+rnutULOihN9bixOtYWDdF5Rfz9fpHejL1BtNjdLW1om55XNVHGAHPqBxV4aeQQ6OirKnp9zKsug==} @@ -12082,7 +12086,7 @@ packages: uuid@3.3.2: resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@3.4.0: @@ -12092,10 +12096,12 @@ packages: uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true v8-compile-cache-lib@3.0.1: @@ -13695,16 +13701,16 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@defi-wonderland/smock@2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@defi-wonderland/smock@2.4.1(@ethersproject/abi@5.8.0)(@ethersproject/abstract-provider@5.8.0)(@ethersproject/abstract-signer@5.8.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/abstract-provider': 5.8.0 '@ethersproject/abstract-signer': 5.8.0 '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) diff: 5.2.0 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 lodash.isequalwith: 4.4.0 rxjs: 7.8.2 @@ -15247,12 +15253,12 @@ snapshots: '@ethersproject/providers': 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@graphprotocol/common-ts': 2.0.11(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@graphprotocol/contracts': 7.2.1 - '@nomicfoundation/hardhat-network-helpers': 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.1.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: 4.4.3(supports-color@9.4.0) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - hardhat-secure-accounts: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat-secure-accounts: 0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) inquirer: 8.0.0 lodash: 4.17.21 yaml: 1.10.2 @@ -16250,43 +16256,33 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nomicfoundation/edr-darwin-arm64@0.11.3': {} - '@nomicfoundation/edr-darwin-arm64@0.12.0-next.22': {} - '@nomicfoundation/edr-darwin-x64@0.11.3': {} + '@nomicfoundation/edr-darwin-arm64@0.12.0-next.23': {} '@nomicfoundation/edr-darwin-x64@0.12.0-next.22': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.11.3': {} + '@nomicfoundation/edr-darwin-x64@0.12.0-next.23': {} '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.22': {} - '@nomicfoundation/edr-linux-arm64-musl@0.11.3': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.23': {} '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.22': {} - '@nomicfoundation/edr-linux-x64-gnu@0.11.3': {} + '@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.23': {} '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.22': {} - '@nomicfoundation/edr-linux-x64-musl@0.11.3': {} + '@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.23': {} '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.22': {} - '@nomicfoundation/edr-win32-x64-msvc@0.11.3': {} + '@nomicfoundation/edr-linux-x64-musl@0.12.0-next.23': {} '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.22': {} - '@nomicfoundation/edr@0.11.3': - dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.11.3 - '@nomicfoundation/edr-darwin-x64': 0.11.3 - '@nomicfoundation/edr-linux-arm64-gnu': 0.11.3 - '@nomicfoundation/edr-linux-arm64-musl': 0.11.3 - '@nomicfoundation/edr-linux-x64-gnu': 0.11.3 - '@nomicfoundation/edr-linux-x64-musl': 0.11.3 - '@nomicfoundation/edr-win32-x64-msvc': 0.11.3 + '@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.23': {} '@nomicfoundation/edr@0.12.0-next.22': dependencies: @@ -16298,6 +16294,16 @@ snapshots: '@nomicfoundation/edr-linux-x64-musl': 0.12.0-next.22 '@nomicfoundation/edr-win32-x64-msvc': 0.12.0-next.22 + '@nomicfoundation/edr@0.12.0-next.23': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.12.0-next.23 + '@nomicfoundation/edr-darwin-x64': 0.12.0-next.23 + '@nomicfoundation/edr-linux-arm64-gnu': 0.12.0-next.23 + '@nomicfoundation/edr-linux-arm64-musl': 0.12.0-next.23 + '@nomicfoundation/edr-linux-x64-gnu': 0.12.0-next.23 + '@nomicfoundation/edr-linux-x64-musl': 0.12.0-next.23 + '@nomicfoundation/edr-win32-x64-msvc': 0.12.0-next.23 + '@nomicfoundation/ethereumjs-rlp@5.0.4': {} '@nomicfoundation/ethereumjs-util@9.0.4': @@ -16305,26 +16311,26 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@5.3.3)(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@5.3.3)(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 5.3.3 chai-as-promised: 7.1.2(chai@5.3.3) deep-eql: 4.1.4 ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) ordinal: 1.0.3 '@nomicfoundation/hardhat-errors@3.0.6': @@ -16347,20 +16353,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.3(supports-color@9.4.0) ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: debug: 4.4.3(supports-color@9.4.0) ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color @@ -16378,28 +16384,28 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/hardhat-foundry@1.2.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-foundry@1.2.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) picocolors: 1.1.1 - '@nomicfoundation/hardhat-ignition-ethers@0.15.14(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.14(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.13(@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.13(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.12 chalk: 4.1.2 debug: 4.4.3(supports-color@9.4.0) fs-extra: 10.1.0 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) json5: 2.2.3 prompts: 2.4.2 transitivePeerDependencies: @@ -16434,16 +16440,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-network-helpers@1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.1.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@3.0.3(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@3.0.3(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@nomicfoundation/hardhat-errors': 3.0.6 '@nomicfoundation/hardhat-utils': 3.0.6 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color @@ -16455,42 +16461,42 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-toolbox@4.0.0(841324e874603666491d4961f5a3314c)': + '@nomicfoundation/hardhat-toolbox@4.0.0(387217c56543caeacafa191f98890669)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@5.3.3)(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 3.0.3(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@5.3.3)(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 3.0.3(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': 0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/chai': 4.3.20 '@types/mocha': 10.0.10 '@types/node': 20.19.14 chai: 5.3.3 ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.17(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.17(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.3) typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) typescript: 5.9.3 - '@nomicfoundation/hardhat-toolbox@4.0.0(8d521f1e2e60e049232a7f203ff6170d)': + '@nomicfoundation/hardhat-toolbox@4.0.0(c97007b62875fc8ad4d8d85b595e6fa7)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.1.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.1.0(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.1.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': 0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3)) '@types/chai': 4.3.20 '@types/mocha': 9.1.1 '@types/node': 20.19.14 chai: 4.5.0 ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) ts-node: 10.9.2(@types/node@20.19.14)(typescript@5.9.3) typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) typescript: 5.9.3 @@ -16510,13 +16516,13 @@ snapshots: '@nomicfoundation/hardhat-vendored@3.0.0': {} - '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 debug: 4.4.3(supports-color@9.4.0) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -16525,13 +16531,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.1.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 cbor: 8.1.0 debug: 4.4.3(supports-color@9.4.0) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 picocolors: 1.1.1 semver: 6.3.1 @@ -16620,12 +16626,12 @@ snapshots: '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - '@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/address': 5.8.0 @@ -16633,7 +16639,7 @@ snapshots: chalk: 2.4.2 debug: 4.4.3(supports-color@9.4.0) fs-extra: 7.0.1 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash: 4.17.21 semver: 6.3.1 table: 6.9.0 @@ -16641,21 +16647,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@types/sinon-chai': 3.2.12 ethereum-waffle: 3.4.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@types/sinon-chai': 3.2.12 ethereum-waffle: 4.0.10(@ensdomains/ens@0.4.5)(@ensdomains/resolver@0.2.4)(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typescript@5.9.3) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) '@npmcli/agent@2.2.2': dependencies: @@ -16742,17 +16748,17 @@ snapshots: '@openzeppelin/defender-deploy-client-cli': 0.0.1-alpha.10(encoding@0.1.13) '@openzeppelin/upgrades-core': 1.44.1 - '@openzeppelin/hardhat-upgrades@1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@openzeppelin/hardhat-upgrades@1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/defender-base-client': 1.54.6(debug@4.4.3)(encoding@0.1.13) '@openzeppelin/platform-deploy-client': 0.8.0(debug@4.4.3)(encoding@0.1.13) '@openzeppelin/upgrades-core': 1.44.1 chalk: 4.1.2 debug: 4.4.3(supports-color@9.4.0) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) proper-lockfile: 4.1.2 transitivePeerDependencies: - encoding @@ -17540,13 +17546,13 @@ snapshots: transitivePeerDependencies: - debug - '@tenderly/hardhat-integration@1.1.1(@types/node@20.19.14)(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@tenderly/hardhat-integration@1.1.1(@types/node@20.19.14)(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@tenderly/api-client': 1.1.0(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3) axios: 1.12.2(debug@4.4.3) dotenv: 16.6.1 fs-extra: 10.1.0 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) hardhat-deploy: 0.11.45(bufferutil@4.0.9)(utf-8-validate@5.0.10) npm-registry-fetch: 17.1.0 semver: 7.7.2 @@ -17562,14 +17568,14 @@ snapshots: - supports-color - utf-8-validate - '@tenderly/hardhat-tenderly@1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@tenderly/hardhat-tenderly@1.11.0(@types/node@20.19.14)(bufferutil@4.0.9)(encoding@0.1.13)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@ethersproject/bignumber': 5.8.0 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@openzeppelin/hardhat-upgrades': 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@openzeppelin/hardhat-upgrades': 1.28.0(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) '@openzeppelin/upgrades-core': 1.44.1 - '@tenderly/hardhat-integration': 1.1.1(@types/node@20.19.14)(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@tenderly/hardhat-integration': 1.1.1(@types/node@20.19.14)(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) dotenv: 16.6.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -17630,22 +17636,22 @@ snapshots: typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) typescript: 5.9.3 - '@typechain/hardhat@6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))': + '@typechain/hardhat@6.1.6(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))': dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/providers': 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@typechain/ethers-v5': 10.2.1(@ethersproject/abi@5.8.0)(@ethersproject/providers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(typechain@8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3))(typescript@5.9.3) ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) typechain: 8.3.2(patch_hash=b34ed6afcf99760666fdc85ecb2094fdd20ce509f947eb09cef21665a2a6a1d6)(typescript@5.9.3) '@types/abstract-leveldown@7.2.5': {} @@ -18249,7 +18255,7 @@ snapshots: arbos-precompiles@1.0.2(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10): dependencies: - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -22339,17 +22345,17 @@ snapshots: ajv: 6.12.6 har-schema: 2.0.0 - hardhat-abi-exporter@2.11.0(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): + hardhat-abi-exporter@2.11.0(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 delete-empty: 3.0.0 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - hardhat-contract-sizer@2.10.1(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): + hardhat-contract-sizer@2.10.1(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: chalk: 4.1.2 cli-table3: 0.6.5 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) strip-ansi: 6.0.1 hardhat-deploy@0.11.45(bufferutil@4.0.9)(utf-8-validate@5.0.10): @@ -22383,7 +22389,7 @@ snapshots: - supports-color - utf-8-validate - hardhat-deploy@0.7.11(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-deploy@0.7.11(@ethersproject/hardware-wallets@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.8.0 '@ethersproject/abstract-signer': 5.8.0 @@ -22403,7 +22409,7 @@ snapshots: debug: 4.4.3(supports-color@9.4.0) form-data: 3.0.4 fs-extra: 9.1.0 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) match-all: 1.2.7 murmur-128: 0.2.1 qs: 6.14.0 @@ -22425,11 +22431,11 @@ snapshots: transitivePeerDependencies: - supports-color - hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.9)(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -22443,52 +22449,52 @@ snapshots: node-interval-tree: 2.1.2 solidity-comments: 0.0.2 - hardhat-secure-accounts@0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): + hardhat-secure-accounts@0.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: 4.4.3(supports-color@9.4.0) enquirer: 2.4.1 ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 prompt-sync: 4.2.0 transitivePeerDependencies: - supports-color - hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): + hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: - '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: 4.4.3(supports-color@9.4.0) enquirer: 2.4.1 ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 prompt-sync: 4.2.0 transitivePeerDependencies: - supports-color - hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): + hardhat-secure-accounts@1.0.5(@nomicfoundation/hardhat-ethers@3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)))(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: - '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.1.0(ethers@6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)) debug: 4.4.3(supports-color@9.4.0) enquirer: 2.4.1 ethers: 6.16.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 prompt-sync: 4.2.0 transitivePeerDependencies: - supports-color - hardhat-storage-layout@0.1.7(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): + hardhat-storage-layout@0.1.7(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: console-table-printer: 2.14.6 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) - hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10): + hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.3 + '@nomicfoundation/edr': 0.12.0-next.23 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 adm-zip: 0.4.16 @@ -22533,11 +22539,11 @@ snapshots: - supports-color - utf-8-validate - hardhat@2.26.3(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10): + hardhat@2.28.6(bufferutil@4.0.9)(ts-node@8.10.2(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10): dependencies: '@ethereumjs/util': 9.1.0 '@ethersproject/abi': 5.8.0 - '@nomicfoundation/edr': 0.11.3 + '@nomicfoundation/edr': 0.12.0-next.23 '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 adm-zip: 0.4.16 @@ -26780,7 +26786,7 @@ snapshots: solidity-comments-win32-ia32-msvc: 0.0.2 solidity-comments-win32-x64-msvc: 0.0.2 - solidity-coverage@0.8.16(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.16(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 '@solidity-parser/parser': 0.20.2 @@ -26791,7 +26797,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -26803,7 +26809,7 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.17(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.17(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.8.0 '@solidity-parser/parser': 0.20.2 @@ -26814,7 +26820,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) jsonschema: 1.5.0 lodash: 4.17.21 mocha: 10.8.2 @@ -26826,10 +26832,10 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-docgen@0.6.0-beta.36(hardhat@2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): + solidity-docgen@0.6.0-beta.36(hardhat@2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10)): dependencies: handlebars: 4.7.8 - hardhat: 2.26.3(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) + hardhat: 2.28.6(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.14)(typescript@5.9.3))(typescript@5.9.3)(utf-8-validate@5.0.10) solidity-ast: 0.4.61 solium-plugin-security@0.1.1(solium@1.2.5): diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 725f20b89..0a60d1cce 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -44,7 +44,7 @@ catalog: ethers: ^6.16.0 glob: ^11.0.2 globals: ^16.4.0 - hardhat: ^2.26.0 + hardhat: ^2.28.0 hardhat-contract-sizer: ^2.10.0 hardhat-dependency-compiler: ^1.2.1 hardhat-gas-reporter: ^1.0.8