diff --git a/.gitignore b/.gitignore index 74e2350..9603473 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,9 @@ typechain-types cache artifacts +# +FEEDBACK.md +ISSUE.md +./.codex +.codex +history diff --git a/AGENTS b/AGENTS new file mode 100644 index 0000000..085169f --- /dev/null +++ b/AGENTS @@ -0,0 +1,9 @@ +SnapshotEngine is a Solidity/Hardhat codebase for on-chain ERC-20 snapshots. + +Main point: +- Schedule, reschedule, and execute snapshot times. +- Record historical account balances and total supply at snapshot boundaries. +- Expose snapshot state for downstream on-chain features like dividends, rewards, and governance. + +Note: +- `CMTAT/` is a git submodule and should be treated as external code. diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..05f9ec9 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,12 @@ +SnapshotEngine is a Solidity/Hardhat codebase for on-chain ERC-20 snapshots. + +Main point: +- Schedule, reschedule, and execute snapshot times. +- Record historical account balances and total supply at snapshot boundaries. +- Expose snapshot state for downstream on-chain features like dividends, rewards, and governance. + +Note: +- `CMTAT/` is a git submodule and should be treated as external code. + +- Update `CHANGELOG.md` for each new relevant modification. +- After each implemented feature or fix, provide a one-line GitHub commit message for all changes since the last commit. diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f1bbc4..c0d0518 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,29 +2,121 @@ Please follow conventions. +## Semantic Version 2.0.0 + +Given a version number MAJOR.MINOR.PATCH, increment the: + +1. MAJOR version when the new version makes: + - Incompatible proxy **storage** change internally or through the upgrade of an external library (OpenZeppelin) + - A significant change in external APIs (public/external functions) or in the internal architecture +2. MINOR version when the new version adds functionality in a backward compatible manner +3. PATCH version when the new version makes backward compatible bug fixes + +See [https://semver.org](https://semver.org) + +## Type of changes + +- `Added` for new features. +- `Changed` for changes in existing functionality. +- `Deprecated` for soon-to-be removed features. +- `Removed` for now removed features. +- `Fixed` for any bug fixes. +- `Security` in case of vulnerabilities. + +Reference: [keepachangelog.com/en/1.1.0/](https://keepachangelog.com/en/1.1.0/) + +Custom changelog tag: `Dependencies`, `Documentation`, `Testing` + ## Checklist > Before a new release, perform the following tasks -- Code: Update the version name defined in [SnapshotEngine.sol](contracts/SnapshotEngine.sol) +- Code: Update the version name in the `Version` core module, variable VERSION - Run linter > npm run-script lint:all:prettier - Documentation - - Perform a code coverage and update the files in the corresponding directory [./doc/coverage](./doc/coverage) - - Perform an audit with several audit tools (e.g Slither), update the report in the corresponding directory [./doc/audits/](./doc/audits/) + - Perform a code coverage and update the files in the corresponding directory [./doc/general/test/coverage](./doc/general/test/coverage) + - Perform an audit with several audit tools (Aderyn and Slither), update the report in the corresponding directory [./doc/audits/tools](./doc/audits/tools) - Update surya doc by running the 3 scripts in [./doc/script](./doc/script) - Update changelog +## 0.5.0 +- Changed + - Bump `VersionModule.VERSION` and deployment test expectations to `0.5.0`. + +- Documentation + - Add short contract-level NatSpec title/description blocks to the module and base contracts. + - Add a short inheritance explanation for `SnapshotEngine` in the README schema section. + - Add a matching README schema subsection for `SnapshotEngineOwnable2Step`, including inheritance and graph references. + - Add a README `Events` section summarizing the snapshot events emitted by the external-engine and internal CMTAT deployment variants. + - Fix the README table of contents and rename the duplicate `Schema` heading for the function-diagram section to `Function Schemas`. + - Add the current deployed sizes of the main external-engine and local CMTAT internal snapshot deployment contracts to the README. + +- Testing + - Add a compatibility test covering simultaneous use of the external `SnapshotEngine` and the upstream CMTAT mock rule engine on the same token deployment. + +## 0.4.0 + +- Dependencies + - Align integration for `CMTAT v3.3.0-rc1`. + - Update `CMTATBaseRuleEngine` import path (`2_CMTATBaseRuleEngine.sol` -> `3_CMTATBaseRuleEngine.sol`). + - Update version interface usage from `IERC3643Base` to `IERC3643Version`. + - Update OpenZeppelin dependencies to `@openzeppelin/contracts` and `@openzeppelin/contracts-upgradeable` `5.6.1`. + - Replace full `IERC20` dependency in SnapshotEngine modules with a minimal `IERC20SnapshotCompatible` interface (`balanceOf`, `totalSupply`). + +- Changed + - Bump `VersionModule.VERSION` and deployment test expectations to `0.4.0`. + - Switch `SnapshotEngine` from OpenZeppelin `AccessControl` to `AccessControlEnumerable`. + - Align `ISnapshotScheduler` license header and pragma with the local interface conventions used across the repository. + - Remove `CMTATBaseSnapshot` support from local `CMTATUpgradeableInternalSnapshot` and `CMTATStandaloneInternalSnapshot` so these deployment variants only support internal snapshots. + - Keep external `SnapshotEngine` support separate from the local CMTAT deployment variants because combining both paths exceeds the EVM contract size limit. + - Rename the local shared CMTAT snapshot base from `CMTATSnapshotBase` to `CMTATInternalSnapshotBase` to avoid confusion with upstream CMTAT snapshot contracts. + - Rename the local deployment contracts from `CMTATUpgradeableSnapshot` / `CMTATStandaloneSnapshot` to `CMTATUpgradeableInternalSnapshot` / `CMTATStandaloneInternalSnapshot` to avoid colliding with upstream CMTAT contract names. + - Convert snapshot scheduler authorization to a modifier-based gate that delegates to the internal `_authorizeSnapshot()` hook. + +- Documentation + - Clarify and document the `0.3.0` known issue and `0.4.0` resolution for `getNextSnapshots()` arithmetic underflow when no future snapshots remain. + - Document strict snapshot query semantics with exact-time APIs: + - `snapshotExists(time)` + - `snapshotBalanceOfExact(time, tokenHolder)` (reverts if `time` is not scheduled) + - `snapshotTotalSupplyExact(time)` (reverts if `time` is not scheduled) + - Document snapshot materialization observability: + - `SnapshotMaterialized(time, blockNumber)` emitted when `_setCurrentSnapshot()` advances. + - `poke()` can be used by authorized accounts to materialize due snapshots without requiring token transfers. + - Add a second deployment variant using OpenZeppelin `Ownable2Step` (`SnapshotEngineOwnable2Step`) and refactor shared deployment logic into `SnapshotEngineBase` to minimize duplication. + - Add `CMTATStandaloneInternalSnapshot` (standalone/non-proxy deployment) and refactor shared CMTAT+snapshot behavior into `CMTATInternalSnapshotBase` to minimize duplication with `CMTATUpgradeableInternalSnapshot`. + - Update README integration guidance to document the minimal token interface required by SnapshotEngine (`IERC20SnapshotCompatible`). + - Clarify in `README.md` that local `CMTAT*InternalSnapshot` deployment contracts are internal-snapshot-only and that external snapshot-engine-enabled CMTAT deployments should come from the `CMTAT` repository snapshot variants. + - Add a `SnapshotEngine` compatibility table and setup guidance for supported CMTAT target versions. + - Add standalone `v0.4.0` Slither and Aderyn feedback files and document the audit-report summary table in `README.md`. + - Add a standalone `v0.4.0` Nethermind AuditAgent feedback file and an `AI Auditing tool` summary table in `README.md`. + - Add a README warning about overdue snapshot backlog growth potentially causing `poke()` and transfer-hook transactions to run out of gas. + - Add short descriptions to the README schema diagrams for the main scheduling/query flows. + +- Testing + - Add tests for exact snapshot queries (scheduled vs non-scheduled timestamps and parity with legacy queries on scheduled timestamps). + - Add tests for snapshot materialization event emission. + - Add tests for `poke()` access control and idempotent behavior. + - Add coverage for `CMTATInternalSnapshotBase` passthrough overrides: `approve`, `transferFrom`, `decimals`, `name`, and `symbol`. + - Add test coverage for `SnapshotUnschedule(time)` emission in `unscheduleSnapshotNotOptimized`. + - Add a dedicated `SnapshotEngineOwnable2Step` test suite and share common snapshot behavior tests across AccessControl and Ownable variants. + - Add a dedicated `CMTATStandaloneInternalSnapshot` test suite reusing the same shared snapshot behavior suites. + - Refactor admin-authorization assertions into a shared helper to avoid duplicated expectations across test modules. + - Refactor snapshot suite registration and CMTAT init params into shared test helpers to reduce duplication across test entrypoints. ## 0.3.0 - 2025-08-27 +Commit: `b5750a0a6f75e73ab00ace6a2cf3e482b1a64352` + - Add deployment version with snapshot for CMTAT - Better code separation - Create new module ` SnapshotUpdateModule` +- Known issue for this release: + - `getNextSnapshots()` may revert (panic `0x11`) in edge cases once the most-recent-past-snapshot optimization branch is enabled/fixed, due to an underflow in future-snapshot array size computation. ## 0.2.0 - 2025-08-25 diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..05f9ec9 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,12 @@ +SnapshotEngine is a Solidity/Hardhat codebase for on-chain ERC-20 snapshots. + +Main point: +- Schedule, reschedule, and execute snapshot times. +- Record historical account balances and total supply at snapshot boundaries. +- Expose snapshot state for downstream on-chain features like dividends, rewards, and governance. + +Note: +- `CMTAT/` is a git submodule and should be treated as external code. + +- Update `CHANGELOG.md` for each new relevant modification. +- After each implemented feature or fix, provide a one-line GitHub commit message for all changes since the last commit. diff --git a/CMTAT b/CMTAT index 69eecc9..580d477 160000 --- a/CMTAT +++ b/CMTAT @@ -1 +1 @@ -Subproject commit 69eecc9735ce8ada84fd35801888b05747658939 +Subproject commit 580d4776e4cbb857b2da7d83fd79144ae7e47557 diff --git a/README.md b/README.md index d822a4b..5b106da 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,60 @@ > > If you want to use this project, perform your own verification or send an email to [admin@cmta.ch](mailto:admin@cmta.ch). -The **SnapshotEngine** is a smart contract designed to perform on-chain snapshots, making it easier to distribute dividends or other token-based rewards directly on-chain. +The **SnapshotEngine** is a smart contract system designed to perform on-chain snapshots, making it easier to distribute dividends or other token-based rewards directly on-chain. It is intended to work with any standard ERC-20 token (for example, **CMTAT**). If you want to integrate it into another contract—such as one for distributing dividends—you can access balance and state information through the `ISnapshotState` interface, defined in `ISnapshotState.sol`. -The codebase is modular, allowing you to use or extend only the components you need. Thus, instead of using the `SnapshotEngine`as an external contract called by the ERC-20 token, you can integrate the relevant modules directly in the token smart contract. This repository provides an example with CMTAT, see `CMTAT deployment version`. +The codebase is modular, allowing you to use or extend only the components you need. Thus, instead of using the `SnapshotEngine` as an external contract called by the ERC-20 token, you can integrate the relevant modules directly in the token smart contract. This repository provides examples with CMTAT (upgradeable and standalone variants), see `CMTAT deployment version`. -[TOC] +## Repository Notes + +- `CMTAT/` is a git submodule and should be treated as external code. +- Local changes in this repository should not modify code inside the `CMTAT/` submodule. + +## Deployment Variants + +- `SnapshotEngine` (`contracts/deployment/SnapshotEngine.sol`): external engine with AccessControlEnumerable (`SNAPSHOOTER_ROLE`). +- `SnapshotEngineOwnable2Step` (`contracts/deployment/SnapshotEngineOwnable2Step.sol`): external engine with Ownable2Step authorization. +- `CMTATUpgradeableInternalSnapshot` (`contracts/deployment/CMTATUpgradeableInternalSnapshot.sol`): internal snapshot logic integrated in a local CMTAT upgradeable deployment. +- `CMTATStandaloneInternalSnapshot` (`contracts/deployment/CMTATStandaloneInternalSnapshot.sol`): internal snapshot logic integrated in a local CMTAT standalone deployment. + +Current deployed sizes of the main local deployment contracts: + +- `SnapshotEngine`: `8.772 KiB` +- `SnapshotEngineOwnable2Step`: `7.387 KiB` +- `CMTATUpgradeableInternalSnapshot`: `23.963 KiB` +- `CMTATStandaloneInternalSnapshot`: `23.963 KiB` + +## Table of Contents + +- [Repository notes](#repository-notes) +- [Deployment variants](#deployment-variants) +- [Quick start](#quick-start) +- [When to use it](#when-to-use-it) +- [How to include it](#how-to-include-it) +- [CMTAT deployment version](#cmtat-deployment-version) +- [Schema](#schema) +- [Technical](#technical) +- [Access Control](#access-control) +- [Events](#events) +- [Ethereum API](#ethereum-api) +- [Storage management (ERC-7201)](#storage-management-erc-7201) +- [Usage instructions](#usage-instructions) +- [Generate documentation](#generate-documentation) +- [Security](#security) +- [Further reading](#further-reading) +- [Intellectual property](#intellectual-property) + +## Quick Start + +```bash +npm install +npx hardhat compile +npx hardhat test +``` ### When to use it @@ -30,6 +75,13 @@ In short: While it has been designed for the CMTAT, the `SnapshotEngine` can be used with other ERC-20 contracts to perform on-chain snapshots. +For `SnapshotEngine` deployment, the bound token only needs to expose: + +- `balanceOf(address)` +- `totalSupply()` + +This minimal requirement is captured by `IERC20SnapshotCompatible` in `contracts/interface/IERC20SnapshotCompatible.sol`. + To use it, import in your contract the interface `ISnapshotEngine` which declares the function `operateOnTransfer`. This interface can be found in [CMTAT/contracts/interfaces/engine](https://github.com/CMTA/CMTAT/tree/master/contracts/interfaces/engine) @@ -57,39 +109,76 @@ interface ISnapshotEngine { During each ERC-20 transfer, before updating the balances and total supply, your contract must call the function `operateOnTransfer` which is the entrypoint for the SnapshotEngine. +#### How to set it + +For a CMTAT deployment that supports an external snapshot engine, deploy the CMTAT snapshot-enabled variant from the `CMTAT` repository, deploy `SnapshotEngine` or `SnapshotEngineOwnable2Step` with the token address, then call `setSnapshotEngine` on the token to bind the engine. + +The local `CMTATUpgradeableInternalSnapshot` and `CMTATStandaloneInternalSnapshot` contracts in this repository are not used for that flow. They are internal-snapshot-only deployment variants. +#### Compatibility + +| SnapshotEngine version | CMTAT Compatible Versions | +| ---------------------- | ------------------- | +| `v0.5.0` (unaudited) | v3.0.0, v3.1.0, v3.2.0
v.3.3.0 (CMTAT Snapshot + Debt) | +| `v0.4.0` (unaudited) | v3.0.0, v3.1.0, v3.2.0
v.3.3.0 (CMTAT Snapshot + Debt) | +| `v0.3.0` (unaudited) | v3.0.0, v3.1.0, v3.2.0 | +| ``v0.2.0`(unaudited) | v3.0.0-rc7 | ### CMTAT deployment version -This repository also contains a CMTAT deployment version with the required snapshot modules integrated called `CMTATUpgradeableSnapshot`. +#### Internal/integrated snapshots + +This repository also contains CMTAT deployment versions with the required snapshot modules integrated: + +- `CMTATUpgradeableInternalSnapshot` for proxy deployment. + +![surya_inheritance_CMTATUpgradeableInternalSnapshot.sol](./doc/schema/surya_inheritance/surya_inheritance_CMTATUpgradeableInternalSnapshot.sol.png) + +- `CMTATStandaloneInternalSnapshot` for non-proxy deployment (initialized through constructor). -The CMTAT features are included by inheriting from the CMTAT base contract `CMTATBaseRuleEngine` and overriding the internal `update` function (from OpenZeppelin’s ERC20) to call `_snapshotUpdate`. This internal function is responsible for updating balances and total supply whenever a snapshot is detected. +![surya_inheritance_CMTATStandaloneInternalSnapshot.sol](./doc/schema/surya_inheritance/surya_inheritance_CMTATStandaloneInternalSnapshot.sol.png) -For each ERC-20 transfer, the `_update` function is called, and a snapshot is taken if required. Since the snapshot logic is integrated directly into the token, there is no need for an external `SnapshotEngine` contract. -![CMTATUpgradeableSnapshotUML](./doc/schema/UML/CMTATUpgradeableSnapshotUML.png) +- The CMTAT features are included by inheriting from the CMTAT base contract `CMTATBaseRuleEngine` and overriding the internal `update` function (from OpenZeppelin’s ERC20) to call `_snapshotUpdate`. This internal function is responsible for updating balances and total supply whenever a snapshot is detected. +- For each ERC-20 transfer, the `_update` function is called, and a snapshot is materialized when required. Since the snapshot logic is integrated directly into the token, there is no need for an external `SnapshotEngine` contract. +- These local deployment variants intentionally do not include `CMTATBaseSnapshot` / `setSnapshotEngine` support. That combination pushed the deployment bytecode above the EVM smart contract size limit, so the local `CMTAT*Snapshot` contracts are now internal-snapshot-only variants. +#### CMTAT with SnapshotEngine (external) + +If you need a CMTAT token that is wired to an external snapshot engine through `setSnapshotEngine`, use the snapshot-enabled deployment variants provided in the `CMTAT` repository instead of the local `CMTATUpgradeableInternalSnapshot` / `CMTATStandaloneInternalSnapshot` contracts from this repository. ## Schema +### SnapshotEngine + The main contract is `SnapshotEngine` -### Inheritance +#### Inheritance + +`SnapshotEngine` is a thin deployment wrapper. `SnapshotEngineBase` provides the shared snapshot logic (state reads, scheduling, update hooks, versioning, and bound-token checks), `AccessControlEnumerable` provides role-based authorization, and `SnapshotEngine` itself wires the two together by defining `SNAPSHOOTER_ROLE`, granting the initial admin role, and implementing `_authorizeSnapshot()`. ![surya_inheritance_SnapshotEngine.sol](./doc/schema/surya_inheritance/surya_inheritance_SnapshotEngine.sol.png) -### Graph +#### Graph ![surya_graph_SnapshotEngine.sol](./doc/schema/surya_graph/surya_graph_SnapshotEngine.sol.png) +### SnapshotEngineOwnable2Step + +The alternative ownable deployment contract is `SnapshotEngineOwnable2Step` + +#### Inheritance + +`SnapshotEngineOwnable2Step` is also a thin deployment wrapper. `SnapshotEngineBase` provides the shared snapshot logic (state reads, scheduling, update hooks, versioning, and bound-token checks), `Ownable2Step` provides two-step ownership management, and `SnapshotEngineOwnable2Step` wires the two together by setting the initial owner in the constructor and implementing `_authorizeSnapshot()` with `onlyOwner`. +![surya_inheritance_SnapshotEngineOwnable2Step.sol](./doc/schema/surya_inheritance/surya_inheritance_SnapshotEngineOwnable2Step.sol.png) -### UML +#### Graph -![SnapshotEngineUML](./doc/schema/UML/SnapshotEngineUML.png) +![surya_graph_SnapshotEngineOwnable2Step.sol](./doc/schema/surya_graph/surya_graph_SnapshotEngineOwnable2Step.sol.png) @@ -127,51 +216,69 @@ Initially, we use an unordered list of snapshots, but this has a lot of disadvan ### Complexity -| Name | Function | Description | Implemented [yes, no] | Complexity | Best case | Worst case | -| ------------------------------------------------------------ | -------------------------------------- | ------------------------------------------------------------ | --------------------- | ------------------------------------------------------------ | --------- | ----------- | -| Schedule snasphot in the future, after all current snapshots | `scheduleSnapshot` | - | ☑ | O(1) | | | -| Schedule a snapshot at a random place in the future | `scheduleSnapshotNotOptimized` | - | ☑ | O(N) | O(1) | O(N) | -| Schedule snasphot in the past | - | - | ☒ | O(N) | O(1) | O(N) | -| Reschedule a snapshot (in the future) | `_rescheduleSnapshot` | The new time is in the range between the previous snapshot and the next snapshot | ☑ | O(1) | | | -| Reschedule a snapshot (in the future) | - | The new time can be after or before another existent snapshot | ☒ | O(N) | O(1) | O(N) | -| Reschedule a snapshot (in the past) | - | The new time can be in the past | ☒ | - | | | -| Unschedule the last snapshot | `_unscheduleSnapshot` | - | ☑ | O(1) | | | -| Unschedule a random snapshot in the past | `_unscheduleNotOptimized` | - | ☑ | O(N) | O(1) | O(N) | -| Unschedule a random snapshot in the future | `_unscheduleNotOptimized ` | - | ☑ | O(N) | O(1) | O(N) | -| Set the current snapshot | `_setCurrentSnapshot` | - | ☑ | Same as `_findScheduledMostRecentPastSnapshot` | | | -| Update snapshots of the balance of an account | `_updateAccountSnapshot` | - | ☑ | Same as `_updateSnapshot` | | | -| Update snapshots of the total Supply | `_updateTotalSupplySnapshot` | - | ☑ | Same as `_updateSnapshot` | | | -| Get the last snapshot time inside a snapshot ids array | `_lastSnapshot` | - | ☑ | O(1) | | | -| Find a snapshot | `_findScheduledSnapshotIndex` | Find the snapshot index at the specified time | ☑ | O(log2(N))
We use a binary search to find the value at the specified time | | | -| Find the mot recent past snapshot | `_findScheduledMostRecentPastSnapshot` | - | ☑ | O(1)
We only have a O(N) complexity (worst case) if all next scheduled snapshot are situated in the past but no update of the current snapshot has been made. | O(1) | O(N)
| -| Update balance and/or total supply snapshots before the values are modified | `_update`

`transferred` | Call before each transfer. It is very important to have a low complexity because this function is called very often. | ☑ | The complexity depends of th functions `_setCurrentSnapshot` `_updateAccountSnapshot` `_updateTotalSupplySnapshot` | | | -| Get the next scheduled snapshotd | `getNextSnapshots` | - | ☑ | O(N)
Nevertheless, we maintain a pointer on the actual snapshot to avoid loop through past snapshot | | | -| Get all snapshot | `getAllSnapshots` | - | ☑ | O(1)
We directly return the array | | | -| Get the balance of an tokenHolder st the time specified | `snapshotBalanceOf` | Return the number of tokens owned by the given tokenHolder at the time when the snapshot with the given time was created. | ☑ | O(log2(N))
We use a binary search to find the value at the snapshot time | | | -| Get the total supply at the time specified | `snapshotTotalSupply` | - | ☑ | O(log2(N))
We use a binary search to find the value at the snapshot time | | | - -## Schema +> Warning +> If a large backlog of scheduled snapshots becomes overdue before any transfer or `poke()` call materializes them, `_setCurrentSnapshot()` may need to scan too many past timestamps in a single transaction. In that case, token transfers, mints, burns, or `poke()` can run out of gas and revert until the backlog is handled. Avoid scheduling an excessively dense backlog of timestamps, and materialize snapshots regularly. + +| Name | Function | Description | Implemented [yes, no] | Complexity | Best case | Worst case | +| ------------------------------------------------------------ | -------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | --------- | ----------- | +| Schedule snasphot in the future, after all current snapshots | `scheduleSnapshot` | - | | O(1) | | | +| Schedule a snapshot at a random place in the future | `scheduleSnapshotNotOptimized` | - | | O(N) | O(1) | O(N) | +| Schedule snasphot in the past | - | - | | O(N) | O(1) | O(N) | +| Reschedule a snapshot (in the future) | `_rescheduleSnapshot` | The new time is in the range between the previous snapshot and the next snapshot | | O(1) | | | +| Reschedule a snapshot (in the future) | - | The new time can be after or before another existent snapshot | | O(N) | O(1) | O(N) | +| Reschedule a snapshot (in the past) | - | The new time can be in the past | | - | | | +| Unschedule the last snapshot | `_unscheduleSnapshot` | - | | O(1) | | | +| Unschedule a random snapshot in the past | `_unscheduleNotOptimized` | - | | O(N) | O(1) | O(N) | +| Unschedule a random snapshot in the future | `_unscheduleNotOptimized ` | - | | O(N) | O(1) | O(N) | +| Set the current snapshot | `_setCurrentSnapshot` | - | | Same as `_findScheduledMostRecentPastSnapshot` | | | +| Update snapshots of the balance of an account | `_updateAccountSnapshot` | - | | Same as `_updateSnapshot` | | | +| Update snapshots of the total Supply | `_updateTotalSupplySnapshot` | - | | Same as `_updateSnapshot` | | | +| Get the last snapshot time inside a snapshot ids array | `_lastSnapshot` | - | | O(1) | | | +| Find a snapshot | `_findScheduledSnapshotIndex` | Find the snapshot index at the specified time | | O(log2(N))
We use a binary search to find the value at the specified time | | | +| Find the mot recent past snapshot | `_findScheduledMostRecentPastSnapshot` | - | | O(1)
We only have a O(N) complexity (worst case) if all next scheduled snapshot are situated in the past but no update of the current snapshot has been made. | O(1) | O(N)
| +| Update balance and/or total supply snapshots before the values are modified | `_update`

`transferred` | Call before each transfer. It is very important to have a low complexity because this function is called very often. | | The complexity depends of th functions `_setCurrentSnapshot` `_updateAccountSnapshot` `_updateTotalSupplySnapshot` | | | +| Get the next scheduled snapshotd | `getNextSnapshots` | - | | O(N)
Nevertheless, we maintain a pointer on the actual snapshot to avoid loop through past snapshot | | | +| Get all snapshot | `getAllSnapshots` | - | | O(1)
We directly return the array | | | +| Get the balance of an tokenHolder st the time specified | `snapshotBalanceOf` | Return the number of tokens owned by the given tokenHolder at the time when the snapshot with the given time was created. | | O(log2(N))
We use a binary search to find the value at the snapshot time | | | +| Get the total supply at the time specified | `snapshotTotalSupply` | - | | O(log2(N))
We use a binary search to find the value at the snapshot time | | | + +## Function Schemas Here are several schema to explain the main functions ### Get next snapshot +Shows how the engine computes and returns the list of future scheduled snapshot timestamps. + ![SnpashotModule-Schema-getNextSnapshot.drawio](./doc/technical/schema/png/SnpashotModule-Schema-getNextSnapshot.drawio.png) ### Schedule a snapshot +Shows how a new future snapshot timestamp is validated and inserted into the schedule. + ![SnpashotModule-Schema-scheduleSnapshot.drawio](./doc/technical/schema/png/SnpashotModule-Schema-scheduleSnapshot.drawio.png) ### Reschedule a snapshot +Shows how an existing scheduled snapshot is moved to a new valid timestamp. + ![SnpashotModule-Schema-rescheduleSnapshot.drawio](./doc/technical/schema/png/SnpashotModule-Schema-rescheduleSnapshot.drawio.png) ### Unschedule a snapshot +Shows how a scheduled snapshot is removed from the schedule. + ![SnpashotModule-Schema-unscheduleSnapshot.drawio](./doc/technical/schema/png/SnpashotModule-Schema-unscheduleSnapshot.drawio.png) ## Access Control +Two authorization models are available depending on deployment: + +- `SnapshotEngine`: role-based access control via `SNAPSHOOTER_ROLE`. +- `SnapshotEngineOwnable2Step`: owner-only access via `onlyOwner`. + +Integrated CMTAT snapshot deployments use CMTAT role-based access control for snapshot scheduling functions. + #### RBAC Role list Here is the list of roles and their 32 bytes identifier. @@ -183,9 +290,34 @@ Here is the list of roles and their 32 bytes identifier. ### ERC-20 token bound -The ERC-20 bounds to the Snapshot Engine is set at deployment and can not be changed after that. +The ERC-20 token bound to SnapshotEngine is set at deployment and cannot be changed afterward. + +Only the bound token contract can call `operateOnTransfer` in `SnapshotEngine`. + +## Events + +The snapshot-related events are defined once in `ISnapshotBase` and emitted by the shared `SnapshotBase` logic. + +### SnapshotEngine and SnapshotEngineOwnable2Step + +These external engine deployments emit: + +- `SnapshotSchedule(oldTime, newTime)`: emitted when a snapshot is scheduled for the first time or rescheduled. +- `SnapshotUnschedule(time)`: emitted when a scheduled snapshot is canceled. +- `SnapshotMaterialized(time, blockNumber)`: emitted when a scheduled snapshot becomes the current materialized snapshot. + +### CMTATUpgradeableInternalSnapshot and CMTATStandaloneInternalSnapshot -Only the ERC-20 token contract can called the function `operateOnTransfer` defined in the main contract `SnapshotEngine`. +These integrated CMTAT deployments emit the same snapshot events through their inherited snapshot base logic: + +- `SnapshotSchedule(oldTime, newTime)` +- `SnapshotUnschedule(time)` +- `SnapshotMaterialized(time, blockNumber)` + +### Notes + +- The same event names and parameters are used across the external-engine and internal-snapshot deployment variants. +- Additional ERC-20 / CMTAT events may also be emitted by the integrated token deployments through upstream CMTAT modules, but those are outside the SnapshotEngine-specific event set described here. ## Ethereum API @@ -353,19 +485,37 @@ Get the next scheduled snapshots that have not yet been created. **Abstract contract for scheduling, rescheduling, and canceling snapshots.** Provides methods to manage snapshot times (expressed in seconds since epoch) with role-based access control via `SNAPSHOOTER_ROLE`. +![surya_inheritance_SnapshotSchedulerModule.sol](./doc/schema/surya_inheritance/surya_inheritance_SnapshotSchedulerModule.sol.png) + +![SnapshotSchedulerModuleUML](./doc/schema/UML/SnapshotSchedulerModuleUML.png) -![SnapshotSchedulerUML](./doc/schema/UML/SnapshotSchedulerUML.png) ------ #### Functions +##### poke() + +```solidity +function poke() public +``` + +Materializes the latest eligible scheduled snapshot (if any), without requiring an ERC-20 transfer. + +**Details:** + +- Useful when no transfer/mint/burn occurs around a scheduled record date. +- Access is restricted by deployment mode: +`SNAPSHOOTER_ROLE` for `SnapshotEngine`, `onlyOwner` for `SnapshotEngineOwnable2Step`. + +------ + ##### scheduleSnapshot(uint256) ```solidity function scheduleSnapshot(uint256 time) -public onlyRole(SNAPSHOOTER_ROLE) +public ``` Schedules a snapshot at the given time (in seconds since epoch). @@ -387,7 +537,7 @@ Schedules a snapshot at the given time (in seconds since epoch). ```solidity function scheduleSnapshotNotOptimized(uint256 time) -public onlyRole(SNAPSHOOTER_ROLE) +public ``` Schedules a snapshot at the given time (non-optimized version). @@ -409,7 +559,7 @@ Schedules a snapshot at the given time (non-optimized version). ```solidity function rescheduleSnapshot(uint256 oldTime,uint256 newTime) -public onlyRole(SNAPSHOOTER_ROLE) +public ``` Reschedules a snapshot from `oldTime` to `newTime`. @@ -432,7 +582,7 @@ Reschedules a snapshot from `oldTime` to `newTime`. ```solidity function unscheduleLastSnapshot(uint256 time) -public onlyRole(SNAPSHOOTER_ROLE) +public ``` Cancels the creation of the last scheduled snapshot at the given time. @@ -454,7 +604,7 @@ Cancels the creation of the last scheduled snapshot at the given time. ```solidity function unscheduleSnapshotNotOptimized(uint256 time) -public onlyRole(SNAPSHOOTER_ROLE) +public ``` Cancels the creation of a scheduled snapshot at the given time (non-optimized version). @@ -476,7 +626,9 @@ Cancels the creation of a scheduled snapshot at the given time (non-optimized ve **Minimal interface for contracts (e.g. SnapshotEngine or CMTAT) supporting historical balance and total supply queries using snapshots.** Provides read-only methods to retrieve account balances and total token supply at specific timestamps, either individually or in batch. -![SnapshotStateUML](./doc/schema/UML/SnapshotStateUML.png) +![surya_inheritance_SnapshotStateModule.sol](./doc/schema/surya_inheritance/surya_inheritance_SnapshotStateModule.sol.png) + +![SnapshotStateModuleUML](./doc/schema/UML/SnapshotStateModuleUML.png) ------ @@ -486,7 +638,7 @@ Cancels the creation of a scheduled snapshot at the given time (non-optimized ve ```solidity function snapshotBalanceOf(uint256 time,address tokenHolder) -external view returns (uint256 tokenHolderBalance); +public view returns (uint256 tokenHolderBalance); ``` Gets the balance of a specific account at the snapshot corresponding to a given timestamp. @@ -506,12 +658,26 @@ Gets the balance of a specific account at the snapshot corresponding to a given ------ +##### snapshotBalanceOfExact(uint256, address) -> (uint256) + +```solidity +function snapshotBalanceOfExact(uint256 time, address tokenHolder) +public view returns (uint256 tokenHolderBalance); +``` + +Gets the balance at an exact scheduled snapshot timestamp. + +**Details:** + +- Reverts with `SnapshotEngine_SnapshotNotFound` if `time` is not an exact scheduled snapshot. + +------ + ##### snapshotTotalSupply(uint256) -> (uint256) ```solidity function snapshotTotalSupply(uint256 time) -public view override(ISnapshotState) -returns (uint256 totalSupply) +public view returns (uint256 totalSupply) ``` Gets the total token supply at the snapshot corresponding to a given timestamp. @@ -522,6 +688,21 @@ Gets the total token supply at the snapshot corresponding to a given timestamp. | ---- | ------- | ------------------------------------------------ | | time | uint256 | The timestamp identifying the snapshot to query. | +------ + +##### snapshotTotalSupplyExact(uint256) -> (uint256) + +```solidity +function snapshotTotalSupplyExact(uint256 time) +public view returns (uint256 totalSupply); +``` + +Gets the total supply at an exact scheduled snapshot timestamp. + +**Details:** + +- Reverts with `SnapshotEngine_SnapshotNotFound` if `time` is not an exact scheduled snapshot. + **Return Values:** | Name | Type | Description | @@ -534,8 +715,7 @@ Gets the total token supply at the snapshot corresponding to a given timestamp. ```solidity function snapshotInfo(uint256 time, address tokenHolder) -public view override(ISnapshotState) -returns (uint256 tokenHolderBalance, uint256 totalSupply) +public view returns (uint256 tokenHolderBalance, uint256 totalSupply) ``` Retrieves both an account's balance and the total supply at the snapshot for a given timestamp in a single call. @@ -560,8 +740,7 @@ Retrieves both an account's balance and the total supply at the snapshot for a g ```solidity function snapshotInfoBatch(uint256 time, address[] calldata addresses) -public view override(ISnapshotState) -returns (uint256[] memory tokenHolderBalances, uint256 totalSupply) +public view returns (uint256[] memory tokenHolderBalances, uint256 totalSupply) ``` Retrieves balances of multiple accounts and the total supply at a snapshot for a given timestamp in a single call. @@ -586,8 +765,7 @@ Retrieves balances of multiple accounts and the total supply at a snapshot for a ```solidity function snapshotInfoBatch(uint256[] calldata times, address[] calldata addresses) -public view override(ISnapshotState) -returns (uint256[][] memory tokenHolderBalances, uint256[] memory totalSupply) +public view returns (uint256[][] memory tokenHolderBalances, uint256[] memory totalSupply) ``` Retrieves balances of multiple accounts at multiple snapshots, as well as the total supply at each snapshot. @@ -608,13 +786,11 @@ Retrieves balances of multiple accounts at multiple snapshots, as well as the to ### VersionModule -![VersionModuleUML](./doc/schema/UML/VersionModuleUML.png) - - +![surya_inheritance_VersionModule.sol](./doc/schema/surya_inheritance/surya_inheritance_VersionModule.sol.png) ## Storage management (ERC-7201) -While SnapshotEngine can not be deployed with a proxy, modules implement [ERC-7201](https://eips.ethereum.org/EIPS/eip-7201) to allow them to be directly used by a potential CMTAT deployment version. +While SnapshotEngine cannot be deployed with a proxy, modules implement [ERC-7201](https://eips.ethereum.org/EIPS/eip-7201) to allow direct reuse by CMTAT deployment variants. ## Usage instructions @@ -625,23 +801,21 @@ are the latest ones that we tested: - Development - - npm 10.2.5 + - npm 11.11.0 - Hardhat ^2.22.7 - - Node 20.5.0 + - Node v24.14.1 - Compilation - - Solidity [v0.8.30](https://docs.soliditylang.org/en/v0.8.30/) + - Solidity [v0.8.34](https://docs.soliditylang.org/en/v0.8.34/) - - CMTAT [v3.0.0](https://github.com/CMTA/CMTAT/releases/tag/v3.0.0) + - CMTAT [v3.3.0-rc1](https://github.com/CMTA/CMTAT/releases/tag/v3.3.0-rc1) - OpenZeppelin - - OpenZeppelin Contracts (Node.js module) [v5.4.0](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.4.0) - - - OpenZeppelin Contracts Upgradeable (Node.js module) [v5.4.0](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/releases/tag/v5.4.0) (to compile CMTAT) - + - OpenZeppelin Contracts (Node.js module) [v5.6.1](https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v5.6.1) + - OpenZeppelin Contracts Upgradeable (Node.js module) [v5.6.1](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/releases/tag/v5.6.1) (to compile CMTAT) ### Installation @@ -696,7 +870,7 @@ The script calls the plugin [hardhat-contract-sizer](https://www.npmjs.com/packa #### Testing -Tests are written in JavaScript by using [web3js](https://web3js.readthedocs.io/en/v1.10.0/) and run **only** with Hardhat as follows: +Tests are written in JavaScript using Hardhat + Ethers and run **only** with Hardhat as follows: `npx hardhat test` @@ -767,6 +941,21 @@ Please see [SECURITY.md](https://github.com/CMTA/CMTAT/blob/master/SECURITY.md) This project is not audited ! +#### Audit report summary + +| Version | Tool | Report | Feedback | Notes | +| --- | --- | --- | --- | --- | +| `v0.4.0` | Slither | [slither-report.md](./doc/audits/tools/v0.4.0/slither-report.md) | [slither-feedback.md](./doc/audits/tools/v0.4.0/slither-feedback.md) | Raw report plus separate project feedback. | +| `v0.4.0` | Aderyn | [aderyn-report.md](./doc/audits/tools/v0.4.0/aderyn-report.md) | [aderyn-feedback.md](./doc/audits/tools/v0.4.0/aderyn-feedback.md) | Raw report plus separate project feedback. | +| `v0.3.0` | Slither | [slither-report.md](./doc/audits/tools/v0.3.0/slither-report.md) | Integrated in report | Legacy format with inline feedback in the report file. | +| `v0.3.0` | Aderyn | [aderyn-report.md](./doc/audits/tools/v0.3.0/aderyn-report.md) | Integrated in report | Legacy format with inline feedback in the report file. | + +#### AI Auditing tool + +| Version | Tool | Report | Feedback | Notes | +| --- | --- | --- | --- | --- | +| `v0.4.0` | [Nethermind AuditAgent](https://auditagent.nethermind.io/) | [audit_agent_report_v0.4.0.pdf](./doc/audits/tools/v0.4.0/nethermind-audit-agent/audit_agent_report_v0.4.0.pdf) | [audit_agent_feedback_v0.4.0.md](./doc/audits/tools/v0.4.0/nethermind-audit-agent/audit_agent_feedback_v0.4.0.md) | AI-generated scan report with separate project feedback. | + ### Tools #### [Slither](https://github.com/crytic/slither) @@ -796,8 +985,8 @@ You can find a prototype to distribute on-chain dividend based on on-chain snaps - [Taurus - Equity Tokenization: How to Pay Dividend On-Chain Using CMTAT](https://www.taurushq.com/blog/equity-tokenization-how-to-pay-dividend-on-chain-using-cmtat/) - [CMTAT IncomeVault](https://github.com/CMTA/IncomeVault) -Note that this project used snapshots when they were performed directly inside CMTAT, see [CMTAT v2.4.0](https://github.com/CMTA/CMTAT/releases/tag/v2.4.0), not through the `SnapshotEngine` but the principle is similar. +Note that this project used snapshots performed directly inside CMTAT (internal/integrated), see [CMTAT v2.4.0](https://github.com/CMTA/CMTAT/releases/tag/v2.4.0), not through the `SnapshotEngine` but the principle is similar. ## Intellectual property -The code is copyright (c) Capital Market and Technology Association, 2018-2025, and is released under [Mozilla Public License 2.0](./LICENSE.md). +The code is copyright (c) Capital Market and Technology Association, 2018-2026, and is released under [Mozilla Public License 2.0](./LICENSE.md). diff --git a/contracts/CMTATUpgradeableSnapshot.sol b/contracts/CMTATUpgradeableSnapshot.sol deleted file mode 100644 index 2f4c140..0000000 --- a/contracts/CMTATUpgradeableSnapshot.sol +++ /dev/null @@ -1,85 +0,0 @@ -//SPDX-License-Identifier: MPL-2.0 - -pragma solidity ^0.8.20; - -/* ==== OpenZeppelin === */ -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -/* ==== Modules === */ -import {SnapshotSchedulerModule} from "./modules/SnapshotSchedulerModule.sol"; -import {SnapshotUpdateModule} from "./modules/SnapshotUpdateModule.sol"; -/* ==== CMTAT === */ -import {CMTATBaseCommon, ERC20Upgradeable} from "../CMTAT/contracts/modules/0_CMTATBaseCommon.sol"; -import {CMTATBaseRuleEngine} from "../CMTAT/contracts/modules/1_CMTATBaseRuleEngine.sol"; -/* ==== Interfaces and library === */ -import {ISnapshotState} from "./interface/ISnapshotState.sol"; -import {SnapshotStateInternal} from "./library/SnapshotStateInternal.sol"; -contract CMTATUpgradeableSnapshot is SnapshotUpdateModule, SnapshotSchedulerModule, CMTATBaseRuleEngine, SnapshotStateInternal, ISnapshotState{ - /// @custom:oz-upgrades-unsafe-allow constructor - constructor() { - // Disable the possibility to initialize the implementation - _disableInitializers(); - } - - /*////////////////////////////////////////////////////////////// - PUBLIC/EXTERNAL FUNCTIONS - //////////////////////////////////////////////////////////////*/ - - /*////////////////////////////////////////////////////////////// - VIEW FUNCTIONS - //////////////////////////////////////////////////////////////*/ - /** - * @inheritdoc ISnapshotState - */ - function snapshotInfo(uint256 time, address tokenHolder) public view override(ISnapshotState) returns (uint256 tokenHolderBalance, uint256 totalSupply) { - (tokenHolderBalance, totalSupply) = _snapshotInfo(IERC20(IERC20(address(this))), time, tokenHolder); - } - - /** - * @inheritdoc ISnapshotState - */ - function snapshotInfoBatch(uint256 time, address[] calldata addresses) public view override(ISnapshotState) returns (uint256[] memory tokenHolderBalances, uint256 totalSupply) { - (tokenHolderBalances, totalSupply) = _snapshotInfoBatch(IERC20(address(this)), time, addresses); - } - - /** - * @inheritdoc ISnapshotState - */ - function snapshotInfoBatch(uint256[] calldata times, address[] calldata addresses) public view override(ISnapshotState) returns (uint256[][] memory tokenHolderBalances, uint256[] memory totalSupply) { - (tokenHolderBalances, totalSupply) = _snapshotInfoBatch(IERC20(address(this)), times, addresses); - } - - /** - * @inheritdoc ISnapshotState - */ - function snapshotBalanceOf( - uint256 time, - address tokenHolder - ) public view override(ISnapshotState) returns (uint256) { - return _snapshotBalanceOf(IERC20(address(this)), time, tokenHolder); - } - - /** - * @inheritdoc ISnapshotState - */ - function snapshotTotalSupply(uint256 time) public view override(ISnapshotState) returns (uint256 totalSupply) { - return _snapshotTotalSupply(IERC20(address(this)), time); - } - - /*////////////////////////////////////////////////////////////// - ERC-20 ENTRY POINT - //////////////////////////////////////////////////////////////*/ - function _update( - address from, - address to, - uint256 amount - ) internal override(CMTATBaseCommon){ - SnapshotUpdateModule._snapshotUpdate(from, to, balanceOf(from), balanceOf(to), totalSupply()); - CMTATBaseCommon._update(from, to, amount); - - } - - - function _authorizeSnapshot() internal virtual override onlyRole(SNAPSHOOTER_ROLE){ - // Nothing to do - } -} diff --git a/contracts/SnapshotEngine.sol b/contracts/SnapshotEngine.sol deleted file mode 100644 index 17378da..0000000 --- a/contracts/SnapshotEngine.sol +++ /dev/null @@ -1,68 +0,0 @@ -//SPDX-License-Identifier: MPL-2.0 - -pragma solidity ^0.8.20; - -/* ==== OpenZeppelin === */ -import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -/* ==== CMTAT === */ -import {ISnapshotEngine} from "../CMTAT/contracts/interfaces/engine/ISnapshotEngine.sol"; -/* ==== Modules === */ -import {SnapshotSchedulerModule} from "./modules/SnapshotSchedulerModule.sol"; -import {SnapshotUpdateModule} from "./modules/SnapshotUpdateModule.sol"; -import {SnapshotStateModule} from "./modules/SnapshotStateModule.sol"; -import {VersionModule} from "./modules/VersionModule.sol"; -/* ==== Interfaces and library === */ -import {Errors} from "./library/Errors.sol"; -contract SnapshotEngine is SnapshotStateModule, SnapshotUpdateModule, SnapshotSchedulerModule, VersionModule, AccessControl, ISnapshotEngine { - /* ============ State Variables ============ */ - bytes32 public constant SNAPSHOOTER_ROLE = keccak256("SNAPSHOOTER_ROLE"); - /* ==== Modifier === */ - modifier onlyBoundToken() { - if (_msgSender() != address(erc20)) { - revert Errors.SnapshotEngine_UnauthorizedCaller(); - } - _; - } - - /* ============ Constructor ============ */ - constructor(IERC20 erc20_, address admin) { - require(address(erc20_) != address(0), Errors.SnapshotEngine_AddressZeroNotAllowedForERC20()); - require(admin != address(0), Errors.SnapshotEngine_AddressZeroNotAllowedForAdmin()); - erc20 = erc20_; - _grantRole(DEFAULT_ADMIN_ROLE, admin); - } - - /*////////////////////////////////////////////////////////////// - PUBLIC/EXTERNAL FUNCTIONS - //////////////////////////////////////////////////////////////*/ - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole( - bytes32 role, - address account - ) public view virtual override(AccessControl) returns (bool) { - // The Default Admin has all roles - if (AccessControl.hasRole(DEFAULT_ADMIN_ROLE, account)) { - return true; - } else { - return AccessControl.hasRole(role, account); - } - } - - /*////////////////////////////////////////////////////////////// - ERC-20 ENTRY POINT - //////////////////////////////////////////////////////////////*/ - /** - * @inheritdoc ISnapshotEngine - */ - function operateOnTransfer(address from, address to, uint256 balanceFrom, uint256 balanceTo, uint256 totalSupply) public override onlyBoundToken() { - _snapshotUpdate(from, to, balanceFrom, balanceTo, totalSupply); - } - - - function _authorizeSnapshot() internal virtual override onlyRole(SNAPSHOOTER_ROLE){ - // Nothing to do - } -} diff --git a/contracts/base/CMTATInternalSnapshotBase.sol b/contracts/base/CMTATInternalSnapshotBase.sol new file mode 100644 index 0000000..1da1f5c --- /dev/null +++ b/contracts/base/CMTATInternalSnapshotBase.sol @@ -0,0 +1,167 @@ +//SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +/* ==== Modules === */ +import {SnapshotSchedulerModule} from "../modules/SnapshotSchedulerModule.sol"; +import {SnapshotUpdateModule} from "../modules/SnapshotUpdateModule.sol"; +/* ==== CMTAT === */ +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import {CMTATBaseCommon} from "../../CMTAT/contracts/modules/0_CMTATBaseCommon.sol"; +import {CMTATBaseRuleEngine} from "../../CMTAT/contracts/modules/3_CMTATBaseRuleEngine.sol"; +/* ==== Interfaces and library === */ +import {IERC20SnapshotCompatible} from "../interface/IERC20SnapshotCompatible.sol"; +import {ISnapshotState} from "../interface/ISnapshotState.sol"; +import {SnapshotStateInternal} from "../library/SnapshotStateInternal.sol"; + +/** + * @title CMTATInternalSnapshotBase + * @notice Shared base for CMTAT deployments with integrated internal snapshot scheduling, state queries, and update hooks. + */ +abstract contract CMTATInternalSnapshotBase is + SnapshotUpdateModule, + SnapshotSchedulerModule, + CMTATBaseRuleEngine, + SnapshotStateInternal, + ISnapshotState +{ + bytes32 public constant SNAPSHOOTER_ROLE = keccak256("SNAPSHOOTER_ROLE"); + + /*////////////////////////////////////////////////////////////// + VIEW FUNCTIONS + //////////////////////////////////////////////////////////////*/ + /** + * @inheritdoc ISnapshotState + */ + function snapshotExists(uint256 time) public view virtual override(ISnapshotState) returns (bool) { + return _isScheduledSnapshot(time); + } + + /** + * @inheritdoc ISnapshotState + */ + function snapshotInfo(uint256 time, address tokenHolder) public view virtual override(ISnapshotState) returns (uint256 tokenHolderBalance, uint256 totalSupply) { + (tokenHolderBalance, totalSupply) = _snapshotInfo(IERC20SnapshotCompatible(address(this)), time, tokenHolder); + } + + /** + * @inheritdoc ISnapshotState + */ + function snapshotInfoBatch(uint256 time, address[] calldata addresses) public view virtual override(ISnapshotState) returns (uint256[] memory tokenHolderBalances, uint256 totalSupply) { + (tokenHolderBalances, totalSupply) = _snapshotInfoBatch(IERC20SnapshotCompatible(address(this)), time, addresses); + } + + /** + * @inheritdoc ISnapshotState + */ + function snapshotInfoBatch(uint256[] calldata times, address[] calldata addresses) public view virtual override(ISnapshotState) returns (uint256[][] memory tokenHolderBalances, uint256[] memory totalSupply) { + (tokenHolderBalances, totalSupply) = _snapshotInfoBatch(IERC20SnapshotCompatible(address(this)), times, addresses); + } + + /** + * @inheritdoc ISnapshotState + */ + function snapshotBalanceOf( + uint256 time, + address tokenHolder + ) public view virtual override(ISnapshotState) returns (uint256) { + return _snapshotBalanceOf(IERC20SnapshotCompatible(address(this)), time, tokenHolder); + } + + /** + * @inheritdoc ISnapshotState + */ + function snapshotBalanceOfExact( + uint256 time, + address tokenHolder + ) public view virtual override(ISnapshotState) returns (uint256) { + return _snapshotBalanceOfExact(IERC20SnapshotCompatible(address(this)), time, tokenHolder); + } + + /** + * @inheritdoc ISnapshotState + */ + function snapshotTotalSupply(uint256 time) public view virtual override(ISnapshotState) returns (uint256 totalSupply) { + return _snapshotTotalSupply(IERC20SnapshotCompatible(address(this)), time); + } + + /** + * @inheritdoc ISnapshotState + */ + function snapshotTotalSupplyExact(uint256 time) public view virtual override(ISnapshotState) returns (uint256 totalSupply) { + return _snapshotTotalSupplyExact(IERC20SnapshotCompatible(address(this)), time); + } + + /*////////////////////////////////////////////////////////////// + ERC-20 ENTRY POINT + //////////////////////////////////////////////////////////////*/ + function _update( + address from, + address to, + uint256 amount + ) internal virtual override(ERC20Upgradeable) { + SnapshotUpdateModule._snapshotUpdate(from, to, balanceOf(from), balanceOf(to), totalSupply()); + ERC20Upgradeable._update(from, to, amount); + } + + function transfer(address to, uint256 value) + public + virtual + override(CMTATBaseCommon) + returns (bool) + { + return CMTATBaseCommon.transfer(to, value); + } + + function transferFrom(address from, address to, uint256 value) + public + virtual + override(CMTATBaseCommon) + returns (bool) + { + return CMTATBaseCommon.transferFrom(from, to, value); + } + + function approve(address spender, uint256 value) + public + virtual + override(CMTATBaseRuleEngine) + returns (bool) + { + return CMTATBaseRuleEngine.approve(spender, value); + } + + function decimals() + public + view + virtual + override(CMTATBaseCommon) + returns (uint8) + { + return CMTATBaseCommon.decimals(); + } + + function name() + public + view + virtual + override(CMTATBaseCommon) + returns (string memory) + { + return CMTATBaseCommon.name(); + } + + function symbol() + public + view + virtual + override(CMTATBaseCommon) + returns (string memory) + { + return CMTATBaseCommon.symbol(); + } + + function _authorizeSnapshot() internal virtual override onlyRole(SNAPSHOOTER_ROLE) { + // Nothing to do + } +} diff --git a/contracts/base/SnapshotEngineBase.sol b/contracts/base/SnapshotEngineBase.sol new file mode 100644 index 0000000..cf62299 --- /dev/null +++ b/contracts/base/SnapshotEngineBase.sol @@ -0,0 +1,49 @@ +//SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +/* ==== CMTAT === */ +import {ISnapshotEngine} from "../../CMTAT/contracts/interfaces/engine/ISnapshotEngine.sol"; +/* ==== Modules === */ +import {SnapshotSchedulerModule} from "../modules/SnapshotSchedulerModule.sol"; +import {SnapshotUpdateModule} from "../modules/SnapshotUpdateModule.sol"; +import {SnapshotStateModule} from "../modules/SnapshotStateModule.sol"; +import {VersionModule} from "../modules/VersionModule.sol"; +/* ==== Interfaces and library === */ +import {IERC20SnapshotCompatible} from "../interface/IERC20SnapshotCompatible.sol"; +import {Errors} from "../library/Errors.sol"; + +/** + * @title SnapshotEngineBase + * @notice Shared base for external snapshot engine deployments bound to a compatible ERC-20 token. + */ +abstract contract SnapshotEngineBase is SnapshotStateModule, SnapshotUpdateModule, SnapshotSchedulerModule, VersionModule, ISnapshotEngine { + /* ==== Modifier === */ + modifier onlyBoundToken() { + if (msg.sender != address(erc20)) { + revert Errors.SnapshotEngine_UnauthorizedCaller(); + } + _; + } + + constructor(IERC20SnapshotCompatible erc20_) { + require(address(erc20_) != address(0), Errors.SnapshotEngine_AddressZeroNotAllowedForERC20()); + erc20 = erc20_; + } + + /*////////////////////////////////////////////////////////////// + ERC-20 ENTRY POINT + //////////////////////////////////////////////////////////////*/ + /** + * @inheritdoc ISnapshotEngine + */ + function operateOnTransfer( + address from, + address to, + uint256 balanceFrom, + uint256 balanceTo, + uint256 totalSupply + ) public override onlyBoundToken { + _snapshotUpdate(from, to, balanceFrom, balanceTo, totalSupply); + } +} diff --git a/contracts/deployment/CMTATStandaloneInternalSnapshot.sol b/contracts/deployment/CMTATStandaloneInternalSnapshot.sol new file mode 100644 index 0000000..975a64a --- /dev/null +++ b/contracts/deployment/CMTATStandaloneInternalSnapshot.sol @@ -0,0 +1,34 @@ +//SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +import {CMTATInternalSnapshotBase} from "../base/CMTATInternalSnapshotBase.sol"; +import {ICMTATConstructor} from "../../CMTAT/contracts/interfaces/technical/ICMTATConstructor.sol"; + +/** + * @title Local CMTAT deployment with internal snapshots for standalone use +*/ +contract CMTATStandaloneInternalSnapshot is CMTATInternalSnapshotBase { + /** + * @notice Contract version for standalone deployment with snapshot support + * @param admin address of the admin of contract (Access Control) + * @param ERC20Attributes_ ERC20 name, symbol and decimals + * @param extraInformationAttributes_ tokenId, terms, information + * @param engines_ external contract + */ + /// @custom:oz-upgrades-unsafe-allow constructor + constructor( + address admin, + ICMTATConstructor.ERC20Attributes memory ERC20Attributes_, + ICMTATConstructor.ExtraInformationAttributes memory extraInformationAttributes_, + ICMTATConstructor.Engine memory engines_ + ) { + // Initialize the contract to avoid front-running + initialize( + admin, + ERC20Attributes_, + extraInformationAttributes_, + engines_ + ); + } +} diff --git a/contracts/deployment/CMTATUpgradeableInternalSnapshot.sol b/contracts/deployment/CMTATUpgradeableInternalSnapshot.sol new file mode 100644 index 0000000..ce302a8 --- /dev/null +++ b/contracts/deployment/CMTATUpgradeableInternalSnapshot.sol @@ -0,0 +1,13 @@ +//SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +import {CMTATInternalSnapshotBase} from "../base/CMTATInternalSnapshotBase.sol"; + +contract CMTATUpgradeableInternalSnapshot is CMTATInternalSnapshotBase { + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + // Disable the possibility to initialize the implementation + _disableInitializers(); + } +} diff --git a/contracts/deployment/SnapshotEngine.sol b/contracts/deployment/SnapshotEngine.sol new file mode 100644 index 0000000..afc3213 --- /dev/null +++ b/contracts/deployment/SnapshotEngine.sol @@ -0,0 +1,46 @@ +//SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +/* ==== OpenZeppelin === */ +import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; +import {AccessControlEnumerable} from "@openzeppelin/contracts/access/extensions/AccessControlEnumerable.sol"; +import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; +/* ==== Deployment === */ +import {SnapshotEngineBase} from "../base/SnapshotEngineBase.sol"; +/* ==== Interfaces and library === */ +import {IERC20SnapshotCompatible} from "../interface/IERC20SnapshotCompatible.sol"; +import {Errors} from "../library/Errors.sol"; + +contract SnapshotEngine is SnapshotEngineBase, AccessControlEnumerable { + /* ============ State Variables ============ */ + bytes32 public constant SNAPSHOOTER_ROLE = keccak256("SNAPSHOOTER_ROLE"); + + /* ============ Constructor ============ */ + constructor(IERC20SnapshotCompatible erc20_, address admin) SnapshotEngineBase(erc20_) { + require(admin != address(0), Errors.SnapshotEngine_AddressZeroNotAllowedForAdmin()); + _grantRole(DEFAULT_ADMIN_ROLE, admin); + } + + /*////////////////////////////////////////////////////////////// + PUBLIC/EXTERNAL FUNCTIONS + //////////////////////////////////////////////////////////////*/ + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole( + bytes32 role, + address account + ) public view virtual override(AccessControl, IAccessControl) returns (bool) { + // The Default Admin has all roles + if (AccessControl.hasRole(DEFAULT_ADMIN_ROLE, account)) { + return true; + } else { + return AccessControl.hasRole(role, account); + } + } + + function _authorizeSnapshot() internal virtual override onlyRole(SNAPSHOOTER_ROLE) { + // Nothing to do + } +} diff --git a/contracts/deployment/SnapshotEngineOwnable2Step.sol b/contracts/deployment/SnapshotEngineOwnable2Step.sol new file mode 100644 index 0000000..786f44b --- /dev/null +++ b/contracts/deployment/SnapshotEngineOwnable2Step.sol @@ -0,0 +1,21 @@ +//SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +/* ==== OpenZeppelin === */ +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol"; +/* ==== Deployment === */ +import {SnapshotEngineBase} from "../base/SnapshotEngineBase.sol"; +import {IERC20SnapshotCompatible} from "../interface/IERC20SnapshotCompatible.sol"; + +contract SnapshotEngineOwnable2Step is SnapshotEngineBase, Ownable2Step { + /* ============ Constructor ============ */ + constructor(IERC20SnapshotCompatible erc20_, address admin) SnapshotEngineBase(erc20_) Ownable(admin) { + // Nothing to do + } + + function _authorizeSnapshot() internal virtual override onlyOwner { + // Nothing to do + } +} diff --git a/contracts/interface/IERC20SnapshotCompatible.sol b/contracts/interface/IERC20SnapshotCompatible.sol new file mode 100644 index 0000000..a3b9540 --- /dev/null +++ b/contracts/interface/IERC20SnapshotCompatible.sol @@ -0,0 +1,13 @@ +//SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +/** + * @title IERC20SnapshotCompatible + * @notice Minimal token interface required by SnapshotEngine state queries. + */ +interface IERC20SnapshotCompatible { + function balanceOf(address account) external view returns (uint256); + + function totalSupply() external view returns (uint256); +} diff --git a/contracts/interface/ISnapshotBase.sol b/contracts/interface/ISnapshotBase.sol index f52e718..e2c5e4e 100644 --- a/contracts/interface/ISnapshotBase.sol +++ b/contracts/interface/ISnapshotBase.sol @@ -19,6 +19,13 @@ interface ISnapshotBase { */ event SnapshotUnschedule(uint256 indexed time); + /** + * @notice Emitted when a scheduled snapshot becomes the current materialized snapshot. + * @param time The snapshot timestamp that was materialized. + * @param blockNumber The block number at which the materialization occurred. + */ + event SnapshotMaterialized(uint256 indexed time, uint256 indexed blockNumber); + /* ============ Erros ============ */ /** * @notice Thrown when attempting to schedule a snapshot at a time earlier than the current block timestamp. diff --git a/contracts/interface/ISnapshotScheduler.sol b/contracts/interface/ISnapshotScheduler.sol index 7764b7d..7f33141 100644 --- a/contracts/interface/ISnapshotScheduler.sol +++ b/contracts/interface/ISnapshotScheduler.sol @@ -1,9 +1,16 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +//SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; /// @title ISnapshotScheduler /// @notice Interface for scheduling, rescheduling, and canceling snapshots interface ISnapshotScheduler { + /** + * @notice Materialize the latest eligible scheduled snapshot (if any). + * @dev Access restricted to accounts with SNAPSHOOTER_ROLE. + */ + function poke() external; + /** * @notice Schedule a snapshot at the given time specified as a number of seconds since epoch. * @dev The time cannot be before the latest scheduled but not yet created snapshot. @@ -44,4 +51,4 @@ interface ISnapshotScheduler { * @param time The scheduled time of the snapshot to cancel. */ function unscheduleSnapshotNotOptimized(uint256 time) external; -} \ No newline at end of file +} diff --git a/contracts/interface/ISnapshotState.sol b/contracts/interface/ISnapshotState.sol index b503a67..3b69fa0 100644 --- a/contracts/interface/ISnapshotState.sol +++ b/contracts/interface/ISnapshotState.sol @@ -7,6 +7,12 @@ pragma solidity ^0.8.20; * @notice Minimal interface for a contract (e.g. SnapshotEngine or CMTAT) that supports querying historical balances and total supply using snapshots. */ interface ISnapshotState { + /** + * @notice Returns true if `time` is an exact scheduled snapshot timestamp. + * @param time The timestamp to check. + */ + function snapshotExists(uint256 time) external view returns (bool); + /** * @notice Get the balance of a specific tokenHolder at the snapshot corresponding to a given timestamp. * @param time The timestamp identifying the snapshot to query. @@ -14,6 +20,14 @@ interface ISnapshotState { * @return tokenHolderBalance The recorded balance at the snapshot, or the current balance if no snapshot exists for that timestamp. */ function snapshotBalanceOf(uint256 time,address tokenHolder) external view returns (uint256 tokenHolderBalance); + + /** + * @notice Get the balance of a specific tokenHolder at an exact scheduled snapshot timestamp. + * @dev Reverts if `time` is not an exact scheduled snapshot timestamp. + * @param time The exact snapshot timestamp to query. + * @param tokenHolder The address whose balance is being requested. + */ + function snapshotBalanceOfExact(uint256 time,address tokenHolder) external view returns (uint256 tokenHolderBalance); /** * @notice Get the total token supply at the snapshot corresponding to a given timestamp. @@ -22,6 +36,13 @@ interface ISnapshotState { */ function snapshotTotalSupply(uint256 time) external view returns (uint256 totalSupply); + /** + * @notice Get the total token supply at an exact scheduled snapshot timestamp. + * @dev Reverts if `time` is not an exact scheduled snapshot timestamp. + * @param time The exact snapshot timestamp to query. + */ + function snapshotTotalSupplyExact(uint256 time) external view returns (uint256 totalSupply); + /** * @notice Retrieve both an account's balance and the total supply at the snapshot for a given timestamp in a single call. * @param time The timestamp identifying the snapshot to query. diff --git a/contracts/library/SnapshotBase.sol b/contracts/library/SnapshotBase.sol index 7035104..eb815d0 100644 --- a/contracts/library/SnapshotBase.sol +++ b/contracts/library/SnapshotBase.sol @@ -83,7 +83,7 @@ abstract contract SnapshotBase is ISnapshotBase { return $._scheduledSnapshots; } else { // There are snapshots situated in the futur - if (indexLowerBound + 1 != $._scheduledSnapshots.length) { + if (indexLowerBound + 1 < $._scheduledSnapshots.length) { // All next snapshots are located after the snapshot specified by indexLowerBound uint256 arraySize = $._scheduledSnapshots.length - indexLowerBound - @@ -248,6 +248,7 @@ abstract contract SnapshotBase is ISnapshotBase { $._scheduledSnapshots = scheduledSnapshotLocal; // pop is only available for storage array $._scheduledSnapshots.pop(); + emit SnapshotUnschedule(time); } @@ -258,13 +259,15 @@ abstract contract SnapshotBase is ISnapshotBase { */ function _setCurrentSnapshot() internal { SnapshotBaseStorage storage $ = _getSnapshotBaseStorage(); + uint256 previousSnapshotTime = $._currentSnapshotTime; ( uint256 scheduleSnapshotTime, uint256 scheduleSnapshotIndex ) = _findScheduledMostRecentPastSnapshot($); - if (scheduleSnapshotTime > 0) { + if (scheduleSnapshotTime > previousSnapshotTime) { $._currentSnapshotTime = scheduleSnapshotTime; $._currentSnapshotIndex = scheduleSnapshotIndex; + emit SnapshotMaterialized(scheduleSnapshotTime, block.number); } } @@ -319,6 +322,24 @@ abstract contract SnapshotBase is ISnapshotBase { return snapshotted ? value : totalSupply; } + /** + * @dev Returns true when `time` is an exact scheduled snapshot timestamp. + */ + function _snapshotExists(uint256 time) internal view returns (bool) { + SnapshotBaseStorage storage $ = _getSnapshotBaseStorage(); + (bool isFound, ) = _findScheduledSnapshotIndex($, time); + return isFound; + } + + /** + * @dev Reverts when `time` is not an exact scheduled snapshot timestamp. + */ + function _requireSnapshotExists(uint256 time) internal view { + if (!_snapshotExists(time)) { + revert SnapshotEngine_SnapshotNotFound(); + } + } + /*////////////////////////////////////////////////////////////// PRIVATE FUNCTIONS @@ -428,7 +449,7 @@ abstract contract SnapshotBase is ISnapshotBase { // no snapshot or the current snapshot already points on the last snapshot if ( currentArraySize == 0 || - (($._currentSnapshotIndex + 1 == currentArraySize) && (time != 0)) + (($._currentSnapshotIndex + 1 == currentArraySize) && ($._currentSnapshotTime != 0)) ) { return (0, currentArraySize); } diff --git a/contracts/library/SnapshotStateInternal.sol b/contracts/library/SnapshotStateInternal.sol index 0fe2d0d..dae037e 100644 --- a/contracts/library/SnapshotStateInternal.sol +++ b/contracts/library/SnapshotStateInternal.sol @@ -3,20 +3,19 @@ pragma solidity ^0.8.20; import {SnapshotBase} from "./SnapshotBase.sol"; -/* ==== OpenZeppelin === */ -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {IERC20SnapshotCompatible} from "../interface/IERC20SnapshotCompatible.sol"; abstract contract SnapshotStateInternal is SnapshotBase { /*////////////////////////////////////////////////////////////// INTERNAL FUNCTIONS //////////////////////////////////////////////////////////////*/ - function _snapshotInfoBatch(IERC20 erc20_, uint256[] calldata times, address[] calldata addresses) internal view returns (uint256[][] memory ownerBalances, uint256[] memory totalSupply) { + function _snapshotInfoBatch(IERC20SnapshotCompatible erc20_, uint256[] calldata times, address[] calldata addresses) internal view returns (uint256[][] memory ownerBalances, uint256[] memory totalSupply) { ownerBalances = new uint256[][](times.length); totalSupply = new uint256[](times.length); for(uint256 iT = 0; iT < times.length; ++iT){ (ownerBalances[iT], totalSupply[iT]) = _snapshotInfoBatch(erc20_, times[iT],addresses); } } - function _snapshotInfoBatch(IERC20 erc20_, uint256 time, address[] calldata addresses) internal view returns (uint256[] memory ownerBalances, uint256 totalSupply) { + function _snapshotInfoBatch(IERC20SnapshotCompatible erc20_, uint256 time, address[] calldata addresses) internal view returns (uint256[] memory ownerBalances, uint256 totalSupply) { ownerBalances = new uint256[](addresses.length); for(uint256 i = 0; i < addresses.length; ++i){ ownerBalances[i] = _snapshotBalanceOf(erc20_, time, addresses[i]); @@ -24,19 +23,37 @@ abstract contract SnapshotStateInternal is SnapshotBase { totalSupply = _snapshotTotalSupply(erc20_, time); } - function _snapshotInfo( IERC20 erc20_, uint256 time, address owner) internal view returns (uint256 ownerBalance, uint256 totalSupply) { + function _snapshotInfo( IERC20SnapshotCompatible erc20_, uint256 time, address owner) internal view returns (uint256 ownerBalance, uint256 totalSupply) { ownerBalance = _snapshotBalanceOf(erc20_, time, owner); totalSupply = _snapshotTotalSupply(erc20_, time); } + function _isScheduledSnapshot(uint256 time) internal view returns (bool) { + return SnapshotBase._snapshotExists(time); + } + function _snapshotBalanceOf( - IERC20 erc20_, + IERC20SnapshotCompatible erc20_, uint256 time, address owner ) internal view returns (uint256) { return SnapshotBase._snapshotBalanceOf(time, owner, erc20_.balanceOf(owner)); } - function _snapshotTotalSupply(IERC20 erc20_, uint256 time) internal view returns (uint256) { + function _snapshotTotalSupply(IERC20SnapshotCompatible erc20_, uint256 time) internal view returns (uint256) { + return SnapshotBase._snapshotTotalSupply(time, erc20_.totalSupply()); + } + + function _snapshotBalanceOfExact( + IERC20SnapshotCompatible erc20_, + uint256 time, + address owner + ) internal view returns (uint256) { + SnapshotBase._requireSnapshotExists(time); + return SnapshotBase._snapshotBalanceOf(time, owner, erc20_.balanceOf(owner)); + } + + function _snapshotTotalSupplyExact(IERC20SnapshotCompatible erc20_, uint256 time) internal view returns (uint256) { + SnapshotBase._requireSnapshotExists(time); return SnapshotBase._snapshotTotalSupply(time, erc20_.totalSupply()); } } diff --git a/contracts/mock/CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol b/contracts/mock/CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol new file mode 100644 index 0000000..6e2060d --- /dev/null +++ b/contracts/mock/CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol @@ -0,0 +1,30 @@ +//SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +import {CMTATStandaloneSnapshot as CMTATStandaloneSnapshotExternal} from "../../CMTAT/contracts/deployment/snapshot/CMTATStandaloneSnapshot.sol"; +import {ICMTATConstructor} from "../../CMTAT/contracts/interfaces/technical/ICMTATConstructor.sol"; + +/** + * @dev Local alias used to test the external SnapshotEngine against the upstream + * CMTAT snapshot-enabled deployment without exposing that deployment as this + * repository's own recommended integration path. + */ +contract CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK is CMTATStandaloneSnapshotExternal { + /// @custom:oz-upgrades-unsafe-allow constructor + constructor( + address forwarderIrrevocable, + address admin, + ICMTATConstructor.ERC20Attributes memory ERC20Attributes_, + ICMTATConstructor.ExtraInformationAttributes memory extraInformationAttributes_, + ICMTATConstructor.Engine memory engines_ + ) + CMTATStandaloneSnapshotExternal( + forwarderIrrevocable, + admin, + ERC20Attributes_, + extraInformationAttributes_, + engines_ + ) + {} +} diff --git a/contracts/mock/CMTAT_RULE_ENGINE_MOCK.sol b/contracts/mock/CMTAT_RULE_ENGINE_MOCK.sol new file mode 100644 index 0000000..83276a5 --- /dev/null +++ b/contracts/mock/CMTAT_RULE_ENGINE_MOCK.sol @@ -0,0 +1,14 @@ +//SPDX-License-Identifier: MPL-2.0 + +pragma solidity ^0.8.20; + +import {RuleEngineMock as CMTATRuleEngineMockExternal} from "../../CMTAT/contracts/mocks/RuleEngine/RuleEngineMock.sol"; + +/** + * @dev Local alias used to test SnapshotEngine compatibility with the upstream + * CMTAT rule engine mock without treating submodule contracts as local + * deployment artifacts. + */ +contract CMTAT_RULE_ENGINE_MOCK is CMTATRuleEngineMockExternal { + constructor(address spender) CMTATRuleEngineMockExternal(spender) {} +} diff --git a/contracts/mock/CMTAT_STANDALONE_MOCK.sol b/contracts/mock/CMTAT_STANDALONE_MOCK.sol index eac405e..9155595 100644 --- a/contracts/mock/CMTAT_STANDALONE_MOCK.sol +++ b/contracts/mock/CMTAT_STANDALONE_MOCK.sol @@ -2,14 +2,14 @@ pragma solidity ^0.8.20; -import {CMTATStandalone} from "../../CMTAT/contracts/deployment/CMTATStandalone.sol"; -import {ICMTATConstructor} from "../../CMTAT/contracts/interfaces/technical/ICMTATConstructor.sol"; +import {CMTATStandardStandalone} from "../../CMTAT/contracts/deployment/CMTATStandardStandalone.sol"; +import {ICMTATConstructor} from "../../CMTAT/contracts/interfaces/technical/ICMTATConstructor.sol"; /** * @dev using to make available CMTAT_STANDALONE in hardhat test */ -contract CMTAT_STANDALONE_MOCK is CMTATStandalone { - /** +contract CMTAT_STANDALONE_MOCK is CMTATStandardStandalone { + /** * @notice Contract version for standalone deployment * @param forwarderIrrevocable address of the forwarder, required for the gasless support * @param admin address of the admin of contract (Access Control) @@ -23,7 +23,15 @@ contract CMTAT_STANDALONE_MOCK is CMTATStandalone { address admin, ICMTATConstructor.ERC20Attributes memory ERC20Attributes_, ICMTATConstructor.ExtraInformationAttributes memory extraInformationModuleAttributes_, - ICMTATConstructor.Engine memory engines_ - ) CMTATStandalone(forwarderIrrevocable, admin, ERC20Attributes_, extraInformationModuleAttributes_, engines_) { + ICMTATConstructor.Engine memory engines_ + ) + CMTATStandardStandalone( + forwarderIrrevocable, + admin, + ERC20Attributes_, + extraInformationModuleAttributes_, + engines_ + ) + { } } diff --git a/contracts/modules/SnapshotSchedulerModule.sol b/contracts/modules/SnapshotSchedulerModule.sol index c475b25..a243373 100644 --- a/contracts/modules/SnapshotSchedulerModule.sol +++ b/contracts/modules/SnapshotSchedulerModule.sol @@ -5,15 +5,34 @@ pragma solidity ^0.8.20; /* ==== Library === */ import {SnapshotBase} from "../library/SnapshotBase.sol"; import {ISnapshotScheduler} from "../interface/ISnapshotScheduler.sol"; + +/** + * @title SnapshotSchedulerModule + * @notice Exposes authorized snapshot scheduling, rescheduling, unscheduling, and materialization entrypoints. + */ abstract contract SnapshotSchedulerModule is SnapshotBase, ISnapshotScheduler { + /*////////////////////////////////////////////////////////////// + MODIFIERS + //////////////////////////////////////////////////////////////*/ + modifier onlySnapshotManager() { + _authorizeSnapshot(); + _; + } + /*////////////////////////////////////////////////////////////// PUBLIC/EXTERNAL FUNCTIONS //////////////////////////////////////////////////////////////*/ /** * @inheritdoc ISnapshotScheduler */ - function scheduleSnapshot(uint256 time) public virtual { - _authorizeSnapshot(); + function poke() public virtual onlySnapshotManager { + SnapshotBase._setCurrentSnapshot(); + } + + /** + * @inheritdoc ISnapshotScheduler + */ + function scheduleSnapshot(uint256 time) public virtual onlySnapshotManager { SnapshotBase._scheduleSnapshot(time); } @@ -22,8 +41,7 @@ abstract contract SnapshotSchedulerModule is SnapshotBase, ISnapshotScheduler { */ function scheduleSnapshotNotOptimized( uint256 time - ) public virtual { - _authorizeSnapshot(); + ) public virtual onlySnapshotManager { SnapshotBase._scheduleSnapshotNotOptimized(time); } @@ -33,8 +51,7 @@ abstract contract SnapshotSchedulerModule is SnapshotBase, ISnapshotScheduler { function rescheduleSnapshot( uint256 oldTime, uint256 newTime - ) public virtual { - _authorizeSnapshot(); + ) public virtual onlySnapshotManager { SnapshotBase._rescheduleSnapshot(oldTime, newTime); } @@ -43,8 +60,7 @@ abstract contract SnapshotSchedulerModule is SnapshotBase, ISnapshotScheduler { */ function unscheduleLastSnapshot( uint256 time - ) public virtual { - _authorizeSnapshot(); + ) public virtual onlySnapshotManager { SnapshotBase._unscheduleLastSnapshot(time); } @@ -53,8 +69,7 @@ abstract contract SnapshotSchedulerModule is SnapshotBase, ISnapshotScheduler { */ function unscheduleSnapshotNotOptimized( uint256 time - ) public virtual { - _authorizeSnapshot(); + ) public virtual onlySnapshotManager { SnapshotBase._unscheduleSnapshotNotOptimized(time); } diff --git a/contracts/modules/SnapshotStateModule.sol b/contracts/modules/SnapshotStateModule.sol index be2ed1b..8917937 100644 --- a/contracts/modules/SnapshotStateModule.sol +++ b/contracts/modules/SnapshotStateModule.sol @@ -1,15 +1,17 @@ //SPDX-License-Identifier: MPL-2.0 pragma solidity ^0.8.20; -/* ==== OpenZeppelin === */ -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /* ==== Interfaces and library === */ +import {IERC20SnapshotCompatible} from "../interface/IERC20SnapshotCompatible.sol"; import {SnapshotStateInternal} from "../library/SnapshotStateInternal.sol"; import {ISnapshotState} from "../interface/ISnapshotState.sol"; - +/** + * @title SnapshotStateModule + * @notice Exposes public snapshot read functions for balances, total supply, and batch snapshot queries. + */ abstract contract SnapshotStateModule is SnapshotStateInternal, ISnapshotState { - IERC20 internal immutable erc20; + IERC20SnapshotCompatible internal immutable erc20; /*////////////////////////////////////////////////////////////// PUBLIC/EXTERNAL FUNCTIONS @@ -18,6 +20,13 @@ abstract contract SnapshotStateModule is SnapshotStateInternal, ISnapshotState /*////////////////////////////////////////////////////////////// VIEW FUNCTIONS //////////////////////////////////////////////////////////////*/ + /** + * @inheritdoc ISnapshotState + */ + function snapshotExists(uint256 time) public view override(ISnapshotState) returns (bool) { + return _isScheduledSnapshot(time); + } + /** * @inheritdoc ISnapshotState */ @@ -49,10 +58,27 @@ abstract contract SnapshotStateModule is SnapshotStateInternal, ISnapshotState return _snapshotBalanceOf(erc20, time, tokenHolder); } + /** + * @inheritdoc ISnapshotState + */ + function snapshotBalanceOfExact( + uint256 time, + address tokenHolder + ) public view override(ISnapshotState) returns (uint256) { + return _snapshotBalanceOfExact(erc20, time, tokenHolder); + } + /** * @inheritdoc ISnapshotState */ function snapshotTotalSupply(uint256 time) public view override(ISnapshotState) returns (uint256 totalSupply) { return _snapshotTotalSupply(erc20, time); } + + /** + * @inheritdoc ISnapshotState + */ + function snapshotTotalSupplyExact(uint256 time) public view override(ISnapshotState) returns (uint256 totalSupply) { + return _snapshotTotalSupplyExact(erc20, time); + } } diff --git a/contracts/modules/SnapshotUpdateModule.sol b/contracts/modules/SnapshotUpdateModule.sol index c9624b7..73f6cff 100644 --- a/contracts/modules/SnapshotUpdateModule.sol +++ b/contracts/modules/SnapshotUpdateModule.sol @@ -3,6 +3,11 @@ pragma solidity ^0.8.20; import {SnapshotBase} from "../library/SnapshotBase.sol"; + +/** + * @title SnapshotUpdateModule + * @notice Updates snapshot state before token balances or total supply are modified. + */ abstract contract SnapshotUpdateModule is SnapshotBase { /** * @dev Update balance and/or total supply snapshots before the values are modified. This is implemented diff --git a/contracts/modules/VersionModule.sol b/contracts/modules/VersionModule.sol index 762fa1e..3364d09 100644 --- a/contracts/modules/VersionModule.sol +++ b/contracts/modules/VersionModule.sol @@ -3,30 +3,34 @@ pragma solidity ^0.8.20; /* ==== CMTAT === */ -import {IERC3643Base} from "../../CMTAT/contracts/interfaces/tokenization/IERC3643Partial.sol"; +import {IERC3643Version} from "../../CMTAT/contracts/interfaces/tokenization/IERC3643Partial.sol"; -abstract contract VersionModule is IERC3643Base { +/** + * @title VersionModule + * @notice Exposes the current SnapshotEngine version string through the ERC-3643 version interface. + */ +abstract contract VersionModule is IERC3643Version { /* ============ State Variables ============ */ /** * @dev * Get the current version of the smart contract */ - string private constant VERSION = "0.3.0"; + string private constant VERSION = "0.5.0"; /* ============ Events ============ */ /*////////////////////////////////////////////////////////////// PUBLIC/EXTERNAL FUNCTIONS //////////////////////////////////////////////////////////////*/ /** - * @inheritdoc IERC3643Base + * @inheritdoc IERC3643Version */ function version() public view virtual - override(IERC3643Base) + override(IERC3643Version) returns (string memory version_) { return VERSION; } -} \ No newline at end of file +} diff --git a/doc/audits/aderyn-report.md b/doc/audits/tools/v0.3.0/aderyn-report.md similarity index 100% rename from doc/audits/aderyn-report.md rename to doc/audits/tools/v0.3.0/aderyn-report.md diff --git a/doc/audits/slither-report.md b/doc/audits/tools/v0.3.0/slither-report.md similarity index 100% rename from doc/audits/slither-report.md rename to doc/audits/tools/v0.3.0/slither-report.md diff --git a/doc/audits/tools/v0.4.0/aderyn-feedback.md b/doc/audits/tools/v0.4.0/aderyn-feedback.md new file mode 100644 index 0000000..64a8d84 --- /dev/null +++ b/doc/audits/tools/v0.4.0/aderyn-feedback.md @@ -0,0 +1,77 @@ +# Aderyn Feedback - v0.4.0 + +This file contains the project feedback for the static-analysis findings reported in [aderyn-report.md](./aderyn-report.md). + +## Summary + +| Severity | Issue | Status | Feedback | +| --- | --- | --- | --- | +| High | `H-1: Arbitrary from Passed to transferFrom` | False positive | The override delegates to the inherited CMTAT/ERC20 allowance-checked implementation. | +| High | `H-2: Contract Name Reused in Different Files` | Acknowledged | `VersionModule` naming overlaps with upstream code in the `CMTAT/` submodule, but this repository does not rely on Truffle-style name resolution. | +| Low | `L-1: Centralization Risk` | Acknowledged | Admin and snapshot operators are trusted roles by design. | +| Low | `L-2: Unsafe ERC20 Operation` | False positive | The code delegates to inherited ERC-20/CMTAT entry points rather than integrating arbitrary third-party tokens. | +| Low | `L-3: Unspecific Solidity Pragma` | Acknowledged | Build compiler version is pinned in project config. | +| Low | `L-4: PUSH0 Opcode` | Acknowledged | The project explicitly targets `evmVersion: prague` in Hardhat config. | +| Low | `L-5: Modifier Invoked Only Once` | Acknowledged | The modifier improves readability of the bound-token authorization rule. | +| Low | `L-6: Empty Block` | Acknowledged | Empty authorization hooks are intentional because access control is enforced via modifiers. | +| Low | `L-7: Unchecked Return` | False positive | `_grantRole` does not return a meaningful value to check. | + +## Detailed Feedback + +### H-1: Arbitrary `from` Passed to `transferFrom` + +- Status: `False positive` +- Finding: + `CMTATInternalSnapshotBase.transferFrom` forwards `(from, to, value)` to `CMTATBaseCommon.transferFrom`. +- Feedback: + This override is only a passthrough to the inherited CMTAT/ERC-20 implementation. Allowance and authorization checks are performed in the parent implementation, so the override does not introduce a new arbitrary-transfer primitive. + +### H-2: Contract Name Reused in Different Files + +- Status: `Acknowledged` +- Finding: + `VersionModule` is also used in the upstream `CMTAT/` codebase. +- Feedback: + `CMTAT/` is an external submodule and the project uses Hardhat artifact resolution by full source path rather than Truffle-style name overwriting. The naming overlap is noted, but it is not a practical issue in the current toolchain. + +### L-1: Centralization Risk + +- Status: `Acknowledged` +- Feedback: + Snapshot administration is intentionally permissioned. Admin and operator roles are trusted actors in this design. + +### L-2: Unsafe ERC20 Operation + +- Status: `False positive` +- Feedback: + The flagged calls are direct dispatches into the inherited CMTAT/ERC-20 implementation, not integrations with arbitrary non-standard external tokens. `SafeERC20` is not relevant to these internal ERC-20 entry points. + +### L-3: Unspecific Solidity Pragma + +- Status: `Acknowledged` +- Feedback: + The repository compiles with a fixed Solidity version in Hardhat. Broader pragmas are kept for compatibility with the modular/library usage model. + +### L-4: PUSH0 Opcode + +- Status: `Acknowledged` +- Feedback: + The project explicitly fixes the target EVM version in Hardhat config, so deployment bytecode expectations are controlled by the build configuration. + +### L-5: Modifier Invoked Only Once + +- Status: `Acknowledged` +- Feedback: + `onlyBoundToken` is used once, but keeping it as a modifier makes the authorization rule clearer than inlining the same guard. + +### L-6: Empty Block + +- Status: `Acknowledged` +- Feedback: + The empty hooks are intentional authorization extension points. The modifier performs the actual access-control check. + +### L-7: Unchecked Return + +- Status: `False positive` +- Feedback: + `_grantRole` does not expose a success/failure return value that should be inspected by the caller, so there is nothing to check here. diff --git a/doc/audits/tools/v0.4.0/aderyn-report.md b/doc/audits/tools/v0.4.0/aderyn-report.md new file mode 100644 index 0000000..21093b2 --- /dev/null +++ b/doc/audits/tools/v0.4.0/aderyn-report.md @@ -0,0 +1,475 @@ +# Aderyn Analysis Report + +This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a static analysis tool built by [Cyfrin](https://cyfrin.io), a blockchain security company. This report is not a substitute for manual audit or security review. It should not be relied upon for any purpose other than to assist in the identification of potential security vulnerabilities. +# Table of Contents + +- [Summary](#summary) + - [Files Summary](#files-summary) + - [Files Details](#files-details) + - [Issue Summary](#issue-summary) +- [High Issues](#high-issues) + - [H-1: Arbitrary `from` Passed to `transferFrom`](#h-1-arbitrary-from-passed-to-transferfrom) + - [H-2: Contract Name Reused in Different Files](#h-2-contract-name-reused-in-different-files) +- [Low Issues](#low-issues) + - [L-1: Centralization Risk](#l-1-centralization-risk) + - [L-2: Unsafe ERC20 Operation](#l-2-unsafe-erc20-operation) + - [L-3: Unspecific Solidity Pragma](#l-3-unspecific-solidity-pragma) + - [L-4: PUSH0 Opcode](#l-4-push0-opcode) + - [L-5: Modifier Invoked Only Once](#l-5-modifier-invoked-only-once) + - [L-6: Empty Block](#l-6-empty-block) + - [L-7: Unchecked Return](#l-7-unchecked-return) + + +# Summary + +## Files Summary + +| Key | Value | +| --- | --- | +| .sol Files | 19 | +| Total nSLOC | 754 | + + +## Files Details + +| Filepath | nSLOC | +| --- | --- | +| contracts/base/CMTATInternalSnapshotBase.sol | 109 | +| contracts/base/SnapshotEngineBase.sol | 29 | +| contracts/deployment/CMTATStandaloneInternalSnapshot.sol | 18 | +| contracts/deployment/CMTATUpgradeableInternalSnapshot.sol | 7 | +| contracts/deployment/SnapshotEngine.sol | 26 | +| contracts/deployment/SnapshotEngineOwnable2Step.sol | 11 | +| contracts/interface/IERC20SnapshotCompatible.sol | 5 | +| contracts/interface/ISnapshotBase.sol | 28 | +| contracts/interface/ISnapshotScheduler.sol | 9 | +| contracts/interface/ISnapshotState.sol | 11 | +| contracts/library/Errors.sol | 6 | +| contracts/library/SnapshotBase.sol | 298 | +| contracts/library/SnapshotStateInternal.sol | 48 | +| contracts/mock/CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol | 20 | +| contracts/mock/CMTAT_STANDALONE_MOCK.sol | 21 | +| contracts/modules/SnapshotSchedulerModule.sol | 37 | +| contracts/modules/SnapshotStateModule.sol | 37 | +| contracts/modules/SnapshotUpdateModule.sol | 20 | +| contracts/modules/VersionModule.sol | 14 | +| **Total** | **754** | + + +## Issue Summary + +| Category | No. of Issues | +| --- | --- | +| High | 2 | +| Low | 7 | + + +# High Issues + +## H-1: Arbitrary `from` Passed to `transferFrom` + +Passing an arbitrary `from` address to `transferFrom` (or `safeTransferFrom`) can lead to loss of funds, because anyone can transfer tokens from the `from` address if an approval is made. + +
1 Found Instances + + +- Found in contracts/base/CMTATInternalSnapshotBase.sol [Line: 118](contracts/base/CMTATInternalSnapshotBase.sol#L118) + + ```solidity + return CMTATBaseCommon.transferFrom(from, to, value); + ``` + +
+ + + +## H-2: Contract Name Reused in Different Files + +When compiling contracts with certain development frameworks (for example: Truffle), having contracts with the same name across different files can lead to one being overwritten. + +
1 Found Instances + + +- Found in contracts/modules/VersionModule.sol [Line: 8](contracts/modules/VersionModule.sol#L8) + + ```solidity + abstract contract VersionModule is IERC3643Version { + ``` + +
+ + + +# Low Issues + +## L-1: Centralization Risk + +Contracts have owners with privileged rights to perform admin tasks and need to be trusted to not perform malicious updates or drain funds. + +
5 Found Instances + + +- Found in contracts/base/CMTATInternalSnapshotBase.sol [Line: 160](contracts/base/CMTATInternalSnapshotBase.sol#L160) + + ```solidity + function _authorizeSnapshot() internal virtual override onlyRole(SNAPSHOOTER_ROLE) { + ``` + +- Found in contracts/deployment/SnapshotEngine.sol [Line: 15](contracts/deployment/SnapshotEngine.sol#L15) + + ```solidity + contract SnapshotEngine is SnapshotEngineBase, AccessControlEnumerable { + ``` + +- Found in contracts/deployment/SnapshotEngine.sol [Line: 43](contracts/deployment/SnapshotEngine.sol#L43) + + ```solidity + function _authorizeSnapshot() internal virtual override onlyRole(SNAPSHOOTER_ROLE) { + ``` + +- Found in contracts/deployment/SnapshotEngineOwnable2Step.sol [Line: 12](contracts/deployment/SnapshotEngineOwnable2Step.sol#L12) + + ```solidity + contract SnapshotEngineOwnable2Step is SnapshotEngineBase, Ownable2Step { + ``` + +- Found in contracts/deployment/SnapshotEngineOwnable2Step.sol [Line: 18](contracts/deployment/SnapshotEngineOwnable2Step.sol#L18) + + ```solidity + function _authorizeSnapshot() internal virtual override onlyOwner { + ``` + +
+ + + +## L-2: Unsafe ERC20 Operation + +ERC20 functions may not behave as expected. For example: return values are not always meaningful. It is recommended to use OpenZeppelin's SafeERC20 library. + +
2 Found Instances + + +- Found in contracts/base/CMTATInternalSnapshotBase.sol [Line: 109](contracts/base/CMTATInternalSnapshotBase.sol#L109) + + ```solidity + return CMTATBaseCommon.transfer(to, value); + ``` + +- Found in contracts/base/CMTATInternalSnapshotBase.sol [Line: 127](contracts/base/CMTATInternalSnapshotBase.sol#L127) + + ```solidity + return CMTATBaseRuleEngine.approve(spender, value); + ``` + +
+ + + +## L-3: Unspecific Solidity Pragma + +Consider using a specific version of Solidity in your contracts instead of a wide version. For example, instead of `pragma solidity ^0.8.0;`, use `pragma solidity 0.8.0;` + +
18 Found Instances + + +- Found in contracts/base/CMTATInternalSnapshotBase.sol [Line: 3](contracts/base/CMTATInternalSnapshotBase.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/base/SnapshotEngineBase.sol [Line: 3](contracts/base/SnapshotEngineBase.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/deployment/CMTATStandaloneInternalSnapshot.sol [Line: 3](contracts/deployment/CMTATStandaloneInternalSnapshot.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/deployment/CMTATUpgradeableInternalSnapshot.sol [Line: 3](contracts/deployment/CMTATUpgradeableInternalSnapshot.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/deployment/SnapshotEngine.sol [Line: 3](contracts/deployment/SnapshotEngine.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/deployment/SnapshotEngineOwnable2Step.sol [Line: 3](contracts/deployment/SnapshotEngineOwnable2Step.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/interface/IERC20SnapshotCompatible.sol [Line: 3](contracts/interface/IERC20SnapshotCompatible.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/interface/ISnapshotBase.sol [Line: 3](contracts/interface/ISnapshotBase.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/interface/ISnapshotScheduler.sol [Line: 2](contracts/interface/ISnapshotScheduler.sol#L2) + + ```solidity + pragma solidity ^0.8.0; + ``` + +- Found in contracts/interface/ISnapshotState.sol [Line: 3](contracts/interface/ISnapshotState.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/library/SnapshotBase.sol [Line: 3](contracts/library/SnapshotBase.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/library/SnapshotStateInternal.sol [Line: 3](contracts/library/SnapshotStateInternal.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/mock/CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol [Line: 3](contracts/mock/CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/mock/CMTAT_STANDALONE_MOCK.sol [Line: 3](contracts/mock/CMTAT_STANDALONE_MOCK.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/modules/SnapshotSchedulerModule.sol [Line: 3](contracts/modules/SnapshotSchedulerModule.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/modules/SnapshotStateModule.sol [Line: 3](contracts/modules/SnapshotStateModule.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/modules/SnapshotUpdateModule.sol [Line: 3](contracts/modules/SnapshotUpdateModule.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/modules/VersionModule.sol [Line: 3](contracts/modules/VersionModule.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +
+ + + +## L-4: PUSH0 Opcode + +Solc compiler version 0.8.20 switches the default target EVM version to Shanghai, which means that the generated bytecode will include PUSH0 opcodes. Be sure to select the appropriate EVM version in case you intend to deploy on a chain other than mainnet like L2 chains that may not support PUSH0, otherwise deployment of your contracts will fail. + +
19 Found Instances + + +- Found in contracts/base/CMTATInternalSnapshotBase.sol [Line: 3](contracts/base/CMTATInternalSnapshotBase.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/base/SnapshotEngineBase.sol [Line: 3](contracts/base/SnapshotEngineBase.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/deployment/CMTATStandaloneInternalSnapshot.sol [Line: 3](contracts/deployment/CMTATStandaloneInternalSnapshot.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/deployment/CMTATUpgradeableInternalSnapshot.sol [Line: 3](contracts/deployment/CMTATUpgradeableInternalSnapshot.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/deployment/SnapshotEngine.sol [Line: 3](contracts/deployment/SnapshotEngine.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/deployment/SnapshotEngineOwnable2Step.sol [Line: 3](contracts/deployment/SnapshotEngineOwnable2Step.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/interface/IERC20SnapshotCompatible.sol [Line: 3](contracts/interface/IERC20SnapshotCompatible.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/interface/ISnapshotBase.sol [Line: 3](contracts/interface/ISnapshotBase.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/interface/ISnapshotScheduler.sol [Line: 2](contracts/interface/ISnapshotScheduler.sol#L2) + + ```solidity + pragma solidity ^0.8.0; + ``` + +- Found in contracts/interface/ISnapshotState.sol [Line: 3](contracts/interface/ISnapshotState.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/library/Errors.sol [Line: 3](contracts/library/Errors.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/library/SnapshotBase.sol [Line: 3](contracts/library/SnapshotBase.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/library/SnapshotStateInternal.sol [Line: 3](contracts/library/SnapshotStateInternal.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/mock/CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol [Line: 3](contracts/mock/CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/mock/CMTAT_STANDALONE_MOCK.sol [Line: 3](contracts/mock/CMTAT_STANDALONE_MOCK.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/modules/SnapshotSchedulerModule.sol [Line: 3](contracts/modules/SnapshotSchedulerModule.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/modules/SnapshotStateModule.sol [Line: 3](contracts/modules/SnapshotStateModule.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/modules/SnapshotUpdateModule.sol [Line: 3](contracts/modules/SnapshotUpdateModule.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +- Found in contracts/modules/VersionModule.sol [Line: 3](contracts/modules/VersionModule.sol#L3) + + ```solidity + pragma solidity ^0.8.20; + ``` + +
+ + + +## L-5: Modifier Invoked Only Once + +Consider removing the modifier or inlining the logic into the calling function. + +
1 Found Instances + + +- Found in contracts/base/SnapshotEngineBase.sol [Line: 18](contracts/base/SnapshotEngineBase.sol#L18) + + ```solidity + modifier onlyBoundToken() { + ``` + +
+ + + +## L-6: Empty Block + +Consider removing empty blocks. + +
3 Found Instances + + +- Found in contracts/base/CMTATInternalSnapshotBase.sol [Line: 160](contracts/base/CMTATInternalSnapshotBase.sol#L160) + + ```solidity + function _authorizeSnapshot() internal virtual override onlyRole(SNAPSHOOTER_ROLE) { + ``` + +- Found in contracts/deployment/SnapshotEngine.sol [Line: 43](contracts/deployment/SnapshotEngine.sol#L43) + + ```solidity + function _authorizeSnapshot() internal virtual override onlyRole(SNAPSHOOTER_ROLE) { + ``` + +- Found in contracts/deployment/SnapshotEngineOwnable2Step.sol [Line: 18](contracts/deployment/SnapshotEngineOwnable2Step.sol#L18) + + ```solidity + function _authorizeSnapshot() internal virtual override onlyOwner { + ``` + +
+ + + +## L-7: Unchecked Return + +Function returns a value but it is ignored. Consider checking the return value. + +
1 Found Instances + + +- Found in contracts/deployment/SnapshotEngine.sol [Line: 22](contracts/deployment/SnapshotEngine.sol#L22) + + ```solidity + _grantRole(DEFAULT_ADMIN_ROLE, admin); + ``` + +
+ + + diff --git a/doc/audits/tools/v0.4.0/nethermind-audit-agent/audit_agent_feedback_v0.4.0.md b/doc/audits/tools/v0.4.0/nethermind-audit-agent/audit_agent_feedback_v0.4.0.md new file mode 100644 index 0000000..a332199 --- /dev/null +++ b/doc/audits/tools/v0.4.0/nethermind-audit-agent/audit_agent_feedback_v0.4.0.md @@ -0,0 +1,27 @@ +# AuditAgent Feedback - v0.4.0 + +This file contains the project feedback for the AI-generated findings reported in [audit_agent_report_v0.4.0.pdf](./audit_agent_report_v0.4.0.pdf). + +## Summary + +| Severity | Finding | Status | Feedback | +| --- | --- | --- | --- | +| Info | Unbounded scan of overdue scheduled snapshots can make transfer hooks and `poke()` run out of gas | Acknowledged | Valid scalability limitation of the current scheduling model; no direct fund loss, but a sufficiently large overdue backlog can make snapshot materialization and transfer hooks fail. | + +## Detailed Feedback + +### Unbounded scan of overdue scheduled snapshots can make transfer hooks and `poke()` run out of gas + +- Status: `Acknowledged` +- Finding: + `SnapshotBase._setCurrentSnapshot()` advances by linearly scanning overdue scheduled snapshots from the current index until the first future timestamp. If too many scheduled snapshots accumulate in the past without being materialized, one later transfer, mint, burn, or `poke()` call may need to process that entire overdue suffix in a single transaction. +- Feedback: + This is a real scalability limitation of the current design rather than a direct loss-of-funds vulnerability. The issue is operational: if an excessively large overdue backlog is allowed to accumulate, snapshot materialization can become too expensive to execute in one transaction, which then also blocks transfer flows that depend on the snapshot hook. + + In practice, the intended mitigation is operational discipline: + + - avoid scheduling an excessively dense backlog of timestamps; + - materialize snapshots regularly via normal token activity or `poke()`; + - avoid using the engine in scenarios where an unbounded number of missed historical timestamps must be processed later in one call. + + If stronger resilience is required, the architectural fix would be to redesign backlog processing so that overdue snapshots can be materialized incrementally across multiple transactions instead of all at once. diff --git a/doc/audits/tools/v0.4.0/nethermind-audit-agent/audit_agent_report_v0.4.0.pdf b/doc/audits/tools/v0.4.0/nethermind-audit-agent/audit_agent_report_v0.4.0.pdf new file mode 100644 index 0000000..a958c37 Binary files /dev/null and b/doc/audits/tools/v0.4.0/nethermind-audit-agent/audit_agent_report_v0.4.0.pdf differ diff --git a/doc/audits/tools/v0.4.0/slither-feedback.md b/doc/audits/tools/v0.4.0/slither-feedback.md new file mode 100644 index 0000000..385f405 --- /dev/null +++ b/doc/audits/tools/v0.4.0/slither-feedback.md @@ -0,0 +1,50 @@ +# Slither Feedback - v0.4.0 + +This file contains the project feedback for the static-analysis findings reported in [slither-report.md](./slither-report.md). + +## Summary + +| Check | Count | Feedback | +| --- | ---: | --- | +| `uninitialized-local` | 1 | Acknowledged as benign default-zero initialization. | +| `calls-loop` | 6 | Acknowledged as acceptable for explicit view batch helpers. | +| `timestamp` | 3 | Acknowledged by design for snapshot scheduling semantics. | +| `assembly` | 1 | Acknowledged as required for ERC-7201 storage access. | +| `naming-convention` | 1 | Acknowledged; follows ERC-7201/OpenZeppelin storage-slot style. | + +## Detailed Feedback + +### `uninitialized-local` + +- Status: `Acknowledged` +- Finding: `SnapshotBase._findScheduledMostRecentPastSnapshot(...)` uses a local variable that Slither reports as uninitialized. +- Feedback: + The variable intentionally relies on Solidity's default zero initialization. In this code path, `0` is the correct sentinel meaning "no scheduled past snapshot found yet". + +### `calls-loop` + +- Status: `Acknowledged` +- Finding: batch snapshot query helpers call `balanceOf` and `totalSupply` while iterating. +- Feedback: + These functions are read-only batch helpers intended to aggregate snapshot state across multiple holders and times. The external calls target the bound token interface and are expected as part of the API design. This does not affect state integrity; the tradeoff is limited to caller-controlled read cost. + +### `timestamp` + +- Status: `Acknowledged` +- Finding: snapshot scheduling and execution compare snapshot times against `block.timestamp`. +- Feedback: + Snapshot scheduling is inherently time-based, so timestamp comparisons are part of the intended model. The engine does not require sub-block precision, and the small timestamp variance tolerated by consensus rules is acceptable for this use case. + +### `assembly` + +- Status: `Acknowledged` +- Finding: inline assembly is used in `SnapshotBase._getSnapshotBaseStorage()`. +- Feedback: + The assembly block is used to implement ERC-7201 namespaced storage access, matching the OpenZeppelin/CMTAT storage layout approach. + +### `naming-convention` + +- Status: `Acknowledged` +- Finding: `SnapshotBaseStorageLocation` is not uppercase. +- Feedback: + The identifier follows the ERC-7201/OpenZeppelin storage-location naming pattern already used in related upstream code, so the project keeps that convention for consistency. diff --git a/doc/audits/tools/v0.4.0/slither-report.md b/doc/audits/tools/v0.4.0/slither-report.md new file mode 100644 index 0000000..2c8e819 --- /dev/null +++ b/doc/audits/tools/v0.4.0/slither-report.md @@ -0,0 +1,123 @@ +**THIS CHECKLIST IS NOT COMPLETE**. Use `--show-ignored-findings` to show all the results. +Summary + - [uninitialized-local](#uninitialized-local) (1 results) (Medium) + - [calls-loop](#calls-loop) (6 results) (Low) + - [timestamp](#timestamp) (3 results) (Low) + - [assembly](#assembly) (1 results) (Informational) + - [naming-convention](#naming-convention) (1 results) (Informational) +## uninitialized-local +Impact: Medium +Confidence: Medium + - [ ] ID-0 +[SnapshotBase._findScheduledMostRecentPastSnapshot(SnapshotBase.SnapshotBaseStorage).mostRecent](contracts/library/SnapshotBase.sol#L457) is a local variable never initialized + +contracts/library/SnapshotBase.sol#L457 + + +## calls-loop +Impact: Low +Confidence: Medium + - [ ] ID-1 +[SnapshotStateInternal._snapshotBalanceOf(IERC20SnapshotCompatible,uint256,address)](contracts/library/SnapshotStateInternal.sol#L35-L41) has external calls inside a loop: [SnapshotBase._snapshotBalanceOf(time,owner,erc20_.balanceOf(owner))](contracts/library/SnapshotStateInternal.sol#L40) + Calls stack containing the loop: + CMTATInternalSnapshotBase.snapshotInfoBatch(uint256,address[]) + SnapshotStateInternal._snapshotInfoBatch(IERC20SnapshotCompatible,uint256,address[]) + +contracts/library/SnapshotStateInternal.sol#L35-L41 + + + - [ ] ID-2 +[SnapshotStateInternal._snapshotBalanceOf(IERC20SnapshotCompatible,uint256,address)](contracts/library/SnapshotStateInternal.sol#L35-L41) has external calls inside a loop: [SnapshotBase._snapshotBalanceOf(time,owner,erc20_.balanceOf(owner))](contracts/library/SnapshotStateInternal.sol#L40) + Calls stack containing the loop: + SnapshotStateModule.snapshotInfoBatch(uint256[],address[]) + SnapshotStateInternal._snapshotInfoBatch(IERC20SnapshotCompatible,uint256[],address[]) + SnapshotStateInternal._snapshotInfoBatch(IERC20SnapshotCompatible,uint256,address[]) + +contracts/library/SnapshotStateInternal.sol#L35-L41 + + + - [ ] ID-3 +[SnapshotStateInternal._snapshotTotalSupply(IERC20SnapshotCompatible,uint256)](contracts/library/SnapshotStateInternal.sol#L42-L44) has external calls inside a loop: [SnapshotBase._snapshotTotalSupply(time,erc20_.totalSupply())](contracts/library/SnapshotStateInternal.sol#L43) + Calls stack containing the loop: + SnapshotStateModule.snapshotInfoBatch(uint256[],address[]) + SnapshotStateInternal._snapshotInfoBatch(IERC20SnapshotCompatible,uint256[],address[]) + SnapshotStateInternal._snapshotInfoBatch(IERC20SnapshotCompatible,uint256,address[]) + +contracts/library/SnapshotStateInternal.sol#L42-L44 + + + - [ ] ID-4 +[SnapshotStateInternal._snapshotBalanceOf(IERC20SnapshotCompatible,uint256,address)](contracts/library/SnapshotStateInternal.sol#L35-L41) has external calls inside a loop: [SnapshotBase._snapshotBalanceOf(time,owner,erc20_.balanceOf(owner))](contracts/library/SnapshotStateInternal.sol#L40) + Calls stack containing the loop: + CMTATInternalSnapshotBase.snapshotInfoBatch(uint256[],address[]) + SnapshotStateInternal._snapshotInfoBatch(IERC20SnapshotCompatible,uint256[],address[]) + SnapshotStateInternal._snapshotInfoBatch(IERC20SnapshotCompatible,uint256,address[]) + +contracts/library/SnapshotStateInternal.sol#L35-L41 + + + - [ ] ID-5 +[SnapshotStateInternal._snapshotTotalSupply(IERC20SnapshotCompatible,uint256)](contracts/library/SnapshotStateInternal.sol#L42-L44) has external calls inside a loop: [SnapshotBase._snapshotTotalSupply(time,erc20_.totalSupply())](contracts/library/SnapshotStateInternal.sol#L43) + Calls stack containing the loop: + CMTATInternalSnapshotBase.snapshotInfoBatch(uint256[],address[]) + SnapshotStateInternal._snapshotInfoBatch(IERC20SnapshotCompatible,uint256[],address[]) + SnapshotStateInternal._snapshotInfoBatch(IERC20SnapshotCompatible,uint256,address[]) + +contracts/library/SnapshotStateInternal.sol#L42-L44 + + + - [ ] ID-6 +[SnapshotStateInternal._snapshotBalanceOf(IERC20SnapshotCompatible,uint256,address)](contracts/library/SnapshotStateInternal.sol#L35-L41) has external calls inside a loop: [SnapshotBase._snapshotBalanceOf(time,owner,erc20_.balanceOf(owner))](contracts/library/SnapshotStateInternal.sol#L40) + Calls stack containing the loop: + SnapshotStateModule.snapshotInfoBatch(uint256,address[]) + SnapshotStateInternal._snapshotInfoBatch(IERC20SnapshotCompatible,uint256,address[]) + +contracts/library/SnapshotStateInternal.sol#L35-L41 + + +## timestamp +Impact: Low +Confidence: Medium + - [ ] ID-7 +[SnapshotBase._findScheduledMostRecentPastSnapshot(SnapshotBase.SnapshotBaseStorage)](contracts/library/SnapshotBase.sol#L443-L470) uses timestamp for comparisons + Dangerous comparisons: + - [$._scheduledSnapshots[i] <= block.timestamp](contracts/library/SnapshotBase.sol#L461) + +contracts/library/SnapshotBase.sol#L443-L470 + + + - [ ] ID-8 +[SnapshotBase._checkTimeSnapshotAlreadyDone(uint256)](contracts/library/SnapshotBase.sol#L492-L496) uses timestamp for comparisons + Dangerous comparisons: + - [time <= block.timestamp](contracts/library/SnapshotBase.sol#L493) + +contracts/library/SnapshotBase.sol#L492-L496 + + + - [ ] ID-9 +[SnapshotBase._checkTimeInThePast(uint256)](contracts/library/SnapshotBase.sol#L484-L491) uses timestamp for comparisons + Dangerous comparisons: + - [time <= block.timestamp](contracts/library/SnapshotBase.sol#L485) + +contracts/library/SnapshotBase.sol#L484-L491 + + +## assembly +Impact: Informational +Confidence: High + - [ ] ID-10 +[SnapshotBase._getSnapshotBaseStorage()](contracts/library/SnapshotBase.sol#L499-L503) uses assembly + - [INLINE ASM](contracts/library/SnapshotBase.sol#L500-L502) + +contracts/library/SnapshotBase.sol#L499-L503 + + +## naming-convention +Impact: Informational +Confidence: High + - [ ] ID-11 +Constant [SnapshotBase.SnapshotBaseStorageLocation](contracts/library/SnapshotBase.sol#L33) is not in UPPER_CASE_WITH_UNDERSCORES + +contracts/library/SnapshotBase.sol#L33 + + diff --git a/doc/schema/UML/CMTATUpgradeableSnapshotUML.png b/doc/schema/UML/CMTATUpgradeableSnapshotUML.png deleted file mode 100644 index 1843674..0000000 Binary files a/doc/schema/UML/CMTATUpgradeableSnapshotUML.png and /dev/null differ diff --git a/doc/schema/UML/SnapshotEngineUML.png b/doc/schema/UML/SnapshotEngineUML.png deleted file mode 100644 index aedb800..0000000 Binary files a/doc/schema/UML/SnapshotEngineUML.png and /dev/null differ diff --git a/doc/schema/UML/SnapshotSchedulerModuleUML.png b/doc/schema/UML/SnapshotSchedulerModuleUML.png new file mode 100644 index 0000000..95b1aa6 Binary files /dev/null and b/doc/schema/UML/SnapshotSchedulerModuleUML.png differ diff --git a/doc/schema/UML/SnapshotSchedulerUML.png b/doc/schema/UML/SnapshotSchedulerUML.png deleted file mode 100644 index eb0eae6..0000000 Binary files a/doc/schema/UML/SnapshotSchedulerUML.png and /dev/null differ diff --git a/doc/schema/UML/SnapshotStateModuleUML.png b/doc/schema/UML/SnapshotStateModuleUML.png new file mode 100644 index 0000000..1ddc6e1 Binary files /dev/null and b/doc/schema/UML/SnapshotStateModuleUML.png differ diff --git a/doc/schema/UML/SnapshotStateUML.png b/doc/schema/UML/SnapshotStateUML.png deleted file mode 100644 index 91f9864..0000000 Binary files a/doc/schema/UML/SnapshotStateUML.png and /dev/null differ diff --git a/doc/schema/UML/SnapshotUpdateUML.png b/doc/schema/UML/SnapshotUpdateUML.png deleted file mode 100644 index e241bca..0000000 Binary files a/doc/schema/UML/SnapshotUpdateUML.png and /dev/null differ diff --git a/doc/schema/UML/VersionModuleUML.png b/doc/schema/UML/VersionModuleUML.png deleted file mode 100644 index 2033136..0000000 Binary files a/doc/schema/UML/VersionModuleUML.png and /dev/null differ diff --git a/doc/schema/surya_graph/surya_graph_CMTATInternalSnapshotBase.sol.png b/doc/schema/surya_graph/surya_graph_CMTATInternalSnapshotBase.sol.png new file mode 100644 index 0000000..cd45360 Binary files /dev/null and b/doc/schema/surya_graph/surya_graph_CMTATInternalSnapshotBase.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_CMTATStandaloneInternalSnapshot.sol.png b/doc/schema/surya_graph/surya_graph_CMTATStandaloneInternalSnapshot.sol.png new file mode 100644 index 0000000..1d86fef Binary files /dev/null and b/doc/schema/surya_graph/surya_graph_CMTATStandaloneInternalSnapshot.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_CMTATUpgradeableInternalSnapshot.sol.png b/doc/schema/surya_graph/surya_graph_CMTATUpgradeableInternalSnapshot.sol.png new file mode 100644 index 0000000..77a4e89 Binary files /dev/null and b/doc/schema/surya_graph/surya_graph_CMTATUpgradeableInternalSnapshot.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_CMTATUpgradeableSnapshot.sol.png b/doc/schema/surya_graph/surya_graph_CMTATUpgradeableSnapshot.sol.png deleted file mode 100644 index 1ccf35a..0000000 Binary files a/doc/schema/surya_graph/surya_graph_CMTATUpgradeableSnapshot.sol.png and /dev/null differ diff --git a/doc/schema/surya_graph/surya_graph_CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol.png b/doc/schema/surya_graph/surya_graph_CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol.png new file mode 100644 index 0000000..c368f6a Binary files /dev/null and b/doc/schema/surya_graph/surya_graph_CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_IERC20SnapshotCompatible.sol.png b/doc/schema/surya_graph/surya_graph_IERC20SnapshotCompatible.sol.png new file mode 100644 index 0000000..fbb7c59 Binary files /dev/null and b/doc/schema/surya_graph/surya_graph_IERC20SnapshotCompatible.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_ISnapshotScheduler.sol.png b/doc/schema/surya_graph/surya_graph_ISnapshotScheduler.sol.png index dd2d25c..1bed0db 100644 Binary files a/doc/schema/surya_graph/surya_graph_ISnapshotScheduler.sol.png and b/doc/schema/surya_graph/surya_graph_ISnapshotScheduler.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_ISnapshotState.sol.png b/doc/schema/surya_graph/surya_graph_ISnapshotState.sol.png index f75fa95..218a4a2 100644 Binary files a/doc/schema/surya_graph/surya_graph_ISnapshotState.sol.png and b/doc/schema/surya_graph/surya_graph_ISnapshotState.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_SnapshotBase.sol.png b/doc/schema/surya_graph/surya_graph_SnapshotBase.sol.png index 84b1af8..e6601ef 100644 Binary files a/doc/schema/surya_graph/surya_graph_SnapshotBase.sol.png and b/doc/schema/surya_graph/surya_graph_SnapshotBase.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_SnapshotEngine.sol.png b/doc/schema/surya_graph/surya_graph_SnapshotEngine.sol.png index b0c576f..e7391b9 100644 Binary files a/doc/schema/surya_graph/surya_graph_SnapshotEngine.sol.png and b/doc/schema/surya_graph/surya_graph_SnapshotEngine.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_SnapshotEngineBase.sol.png b/doc/schema/surya_graph/surya_graph_SnapshotEngineBase.sol.png new file mode 100644 index 0000000..0810495 Binary files /dev/null and b/doc/schema/surya_graph/surya_graph_SnapshotEngineBase.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_SnapshotEngineOwnable2Step.sol.png b/doc/schema/surya_graph/surya_graph_SnapshotEngineOwnable2Step.sol.png new file mode 100644 index 0000000..3f3e3fc Binary files /dev/null and b/doc/schema/surya_graph/surya_graph_SnapshotEngineOwnable2Step.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_SnapshotSchedulerModule.sol.png b/doc/schema/surya_graph/surya_graph_SnapshotSchedulerModule.sol.png index d8ba3a4..fa202f1 100644 Binary files a/doc/schema/surya_graph/surya_graph_SnapshotSchedulerModule.sol.png and b/doc/schema/surya_graph/surya_graph_SnapshotSchedulerModule.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_SnapshotStateInternal.sol.png b/doc/schema/surya_graph/surya_graph_SnapshotStateInternal.sol.png index 5f4fb3f..1102557 100644 Binary files a/doc/schema/surya_graph/surya_graph_SnapshotStateInternal.sol.png and b/doc/schema/surya_graph/surya_graph_SnapshotStateInternal.sol.png differ diff --git a/doc/schema/surya_graph/surya_graph_SnapshotStateModule.sol.png b/doc/schema/surya_graph/surya_graph_SnapshotStateModule.sol.png index 035332b..ba164c2 100644 Binary files a/doc/schema/surya_graph/surya_graph_SnapshotStateModule.sol.png and b/doc/schema/surya_graph/surya_graph_SnapshotStateModule.sol.png differ diff --git a/doc/schema/surya_inheritance/surya_inheritance_CMTATInternalSnapshotBase.sol.png b/doc/schema/surya_inheritance/surya_inheritance_CMTATInternalSnapshotBase.sol.png new file mode 100644 index 0000000..9c9e058 Binary files /dev/null and b/doc/schema/surya_inheritance/surya_inheritance_CMTATInternalSnapshotBase.sol.png differ diff --git a/doc/schema/surya_inheritance/surya_inheritance_CMTATStandaloneInternalSnapshot.sol.png b/doc/schema/surya_inheritance/surya_inheritance_CMTATStandaloneInternalSnapshot.sol.png new file mode 100644 index 0000000..0d76977 Binary files /dev/null and b/doc/schema/surya_inheritance/surya_inheritance_CMTATStandaloneInternalSnapshot.sol.png differ diff --git a/doc/schema/surya_inheritance/surya_inheritance_CMTATUpgradeableInternalSnapshot.sol.png b/doc/schema/surya_inheritance/surya_inheritance_CMTATUpgradeableInternalSnapshot.sol.png new file mode 100644 index 0000000..611f4db Binary files /dev/null and b/doc/schema/surya_inheritance/surya_inheritance_CMTATUpgradeableInternalSnapshot.sol.png differ diff --git a/doc/schema/surya_inheritance/surya_inheritance_CMTATUpgradeableSnapshot.sol.png b/doc/schema/surya_inheritance/surya_inheritance_CMTATUpgradeableSnapshot.sol.png deleted file mode 100644 index 61934f6..0000000 Binary files a/doc/schema/surya_inheritance/surya_inheritance_CMTATUpgradeableSnapshot.sol.png and /dev/null differ diff --git a/doc/schema/surya_inheritance/surya_inheritance_CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol.png b/doc/schema/surya_inheritance/surya_inheritance_CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol.png new file mode 100644 index 0000000..c3b110c Binary files /dev/null and b/doc/schema/surya_inheritance/surya_inheritance_CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol.png differ diff --git a/doc/schema/surya_inheritance/surya_inheritance_CMTAT_STANDALONE_MOCK.sol.png b/doc/schema/surya_inheritance/surya_inheritance_CMTAT_STANDALONE_MOCK.sol.png index 41bbe87..90a1ea3 100644 Binary files a/doc/schema/surya_inheritance/surya_inheritance_CMTAT_STANDALONE_MOCK.sol.png and b/doc/schema/surya_inheritance/surya_inheritance_CMTAT_STANDALONE_MOCK.sol.png differ diff --git a/doc/schema/surya_inheritance/surya_inheritance_IERC20SnapshotCompatible.sol.png b/doc/schema/surya_inheritance/surya_inheritance_IERC20SnapshotCompatible.sol.png new file mode 100644 index 0000000..878c95c Binary files /dev/null and b/doc/schema/surya_inheritance/surya_inheritance_IERC20SnapshotCompatible.sol.png differ diff --git a/doc/schema/surya_inheritance/surya_inheritance_SnapshotEngine.sol.png b/doc/schema/surya_inheritance/surya_inheritance_SnapshotEngine.sol.png index 7b47057..f068810 100644 Binary files a/doc/schema/surya_inheritance/surya_inheritance_SnapshotEngine.sol.png and b/doc/schema/surya_inheritance/surya_inheritance_SnapshotEngine.sol.png differ diff --git a/doc/schema/surya_inheritance/surya_inheritance_SnapshotEngineBase.sol.png b/doc/schema/surya_inheritance/surya_inheritance_SnapshotEngineBase.sol.png new file mode 100644 index 0000000..8fc55a7 Binary files /dev/null and b/doc/schema/surya_inheritance/surya_inheritance_SnapshotEngineBase.sol.png differ diff --git a/doc/schema/surya_inheritance/surya_inheritance_SnapshotEngineOwnable2Step.sol.png b/doc/schema/surya_inheritance/surya_inheritance_SnapshotEngineOwnable2Step.sol.png new file mode 100644 index 0000000..1f09c25 Binary files /dev/null and b/doc/schema/surya_inheritance/surya_inheritance_SnapshotEngineOwnable2Step.sol.png differ diff --git a/doc/schema/surya_inheritance/surya_inheritance_VersionModule.sol.png b/doc/schema/surya_inheritance/surya_inheritance_VersionModule.sol.png index 0617153..a0dbc86 100644 Binary files a/doc/schema/surya_inheritance/surya_inheritance_VersionModule.sol.png and b/doc/schema/surya_inheritance/surya_inheritance_VersionModule.sol.png differ diff --git a/doc/schema/surya_report/surya_report_CMTATUpgradeableSnapshot.sol.md b/doc/schema/surya_report/surya_report_CMTATInternalSnapshotBase.sol.md similarity index 57% rename from doc/schema/surya_report/surya_report_CMTATUpgradeableSnapshot.sol.md rename to doc/schema/surya_report/surya_report_CMTATInternalSnapshotBase.sol.md index fd5b1f7..2920b9e 100644 --- a/doc/schema/surya_report/surya_report_CMTATUpgradeableSnapshot.sol.md +++ b/doc/schema/surya_report/surya_report_CMTATInternalSnapshotBase.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./CMTATUpgradeableSnapshot.sol | 230f0c32c4698a9b1c90ae1b09e462a15910021e | +| ./base/CMTATInternalSnapshotBase.sol | 54658d8be5d36162a7c8b454a3450edfa4c04d8e | ### Contracts Description Table @@ -15,14 +15,22 @@ |:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | |||||| -| **CMTATUpgradeableSnapshot** | Implementation | SnapshotUpdateModule, SnapshotSchedulerModule, CMTATBaseRuleEngine, SnapshotStateInternal, ISnapshotState ||| -| └ | | Public ❗️ | 🛑 |NO❗️ | +| **CMTATInternalSnapshotBase** | Implementation | SnapshotUpdateModule, SnapshotSchedulerModule, CMTATBaseRuleEngine, SnapshotStateInternal, ISnapshotState ||| +| └ | snapshotExists | Public ❗️ | |NO❗️ | | └ | snapshotInfo | Public ❗️ | |NO❗️ | | └ | snapshotInfoBatch | Public ❗️ | |NO❗️ | | └ | snapshotInfoBatch | Public ❗️ | |NO❗️ | | └ | snapshotBalanceOf | Public ❗️ | |NO❗️ | +| └ | snapshotBalanceOfExact | Public ❗️ | |NO❗️ | | └ | snapshotTotalSupply | Public ❗️ | |NO❗️ | +| └ | snapshotTotalSupplyExact | Public ❗️ | |NO❗️ | | └ | _update | Internal 🔒 | 🛑 | | +| └ | transfer | Public ❗️ | 🛑 |NO❗️ | +| └ | transferFrom | Public ❗️ | 🛑 |NO❗️ | +| └ | approve | Public ❗️ | 🛑 |NO❗️ | +| └ | decimals | Public ❗️ | |NO❗️ | +| └ | name | Public ❗️ | |NO❗️ | +| └ | symbol | Public ❗️ | |NO❗️ | | └ | _authorizeSnapshot | Internal 🔒 | 🛑 | onlyRole | diff --git a/doc/schema/surya_report/surya_report_CMTATStandaloneInternalSnapshot.sol.md b/doc/schema/surya_report/surya_report_CMTATStandaloneInternalSnapshot.sol.md new file mode 100644 index 0000000..dfe1333 --- /dev/null +++ b/doc/schema/surya_report/surya_report_CMTATStandaloneInternalSnapshot.sol.md @@ -0,0 +1,27 @@ +## Sūrya's Description Report + +### Files Description Table + + +| File Name | SHA-1 Hash | +|-------------|--------------| +| ./deployment/CMTATStandaloneInternalSnapshot.sol | 1f064883a044fe07b1e1fe58476df960a90f2dc6 | + + +### Contracts Description Table + + +| Contract | Type | Bases | | | +|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| +| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | +|||||| +| **CMTATStandaloneInternalSnapshot** | Implementation | CMTATInternalSnapshotBase ||| +| └ | | Public ❗️ | 🛑 |NO❗️ | + + +### Legend + +| Symbol | Meaning | +|:--------:|-----------| +| 🛑 | Function can modify state | +| 💵 | Function is payable | diff --git a/doc/schema/surya_report/surya_report_CMTATUpgradeableInternalSnapshot.sol.md b/doc/schema/surya_report/surya_report_CMTATUpgradeableInternalSnapshot.sol.md new file mode 100644 index 0000000..e611e15 --- /dev/null +++ b/doc/schema/surya_report/surya_report_CMTATUpgradeableInternalSnapshot.sol.md @@ -0,0 +1,27 @@ +## Sūrya's Description Report + +### Files Description Table + + +| File Name | SHA-1 Hash | +|-------------|--------------| +| ./deployment/CMTATUpgradeableInternalSnapshot.sol | f9a6224c6c9377624c2dff790a56edd8ab14bf66 | + + +### Contracts Description Table + + +| Contract | Type | Bases | | | +|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| +| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | +|||||| +| **CMTATUpgradeableInternalSnapshot** | Implementation | CMTATInternalSnapshotBase ||| +| └ | | Public ❗️ | 🛑 |NO❗️ | + + +### Legend + +| Symbol | Meaning | +|:--------:|-----------| +| 🛑 | Function can modify state | +| 💵 | Function is payable | diff --git a/doc/schema/surya_report/surya_report_CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol.md b/doc/schema/surya_report/surya_report_CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol.md new file mode 100644 index 0000000..a804df6 --- /dev/null +++ b/doc/schema/surya_report/surya_report_CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol.md @@ -0,0 +1,27 @@ +## Sūrya's Description Report + +### Files Description Table + + +| File Name | SHA-1 Hash | +|-------------|--------------| +| ./mock/CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK.sol | a89f6e42f1efb99ec1f05943dbffc50e3abda541 | + + +### Contracts Description Table + + +| Contract | Type | Bases | | | +|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| +| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | +|||||| +| **CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK** | Implementation | CMTATStandaloneSnapshotExternal ||| +| └ | | Public ❗️ | 🛑 | CMTATStandaloneSnapshotExternal | + + +### Legend + +| Symbol | Meaning | +|:--------:|-----------| +| 🛑 | Function can modify state | +| 💵 | Function is payable | diff --git a/doc/schema/surya_report/surya_report_CMTAT_STANDALONE_MOCK.sol.md b/doc/schema/surya_report/surya_report_CMTAT_STANDALONE_MOCK.sol.md index cbfcef5..4928446 100644 --- a/doc/schema/surya_report/surya_report_CMTAT_STANDALONE_MOCK.sol.md +++ b/doc/schema/surya_report/surya_report_CMTAT_STANDALONE_MOCK.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./mock/CMTAT_STANDALONE_MOCK.sol | a73b481eed51a2b5ed9bbed4966ff4b303b5856e | +| ./mock/CMTAT_STANDALONE_MOCK.sol | 660e51640c8b002f5c240852f3c3f89ab5a04680 | ### Contracts Description Table @@ -15,8 +15,8 @@ |:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | |||||| -| **CMTAT_STANDALONE_MOCK** | Implementation | CMTATStandalone ||| -| └ | | Public ❗️ | 🛑 | CMTATStandalone | +| **CMTAT_STANDALONE_MOCK** | Implementation | CMTATStandardStandalone ||| +| └ | | Public ❗️ | 🛑 | CMTATStandardStandalone | ### Legend diff --git a/doc/schema/surya_report/surya_report_IERC20SnapshotCompatible.sol.md b/doc/schema/surya_report/surya_report_IERC20SnapshotCompatible.sol.md new file mode 100644 index 0000000..8c7a517 --- /dev/null +++ b/doc/schema/surya_report/surya_report_IERC20SnapshotCompatible.sol.md @@ -0,0 +1,28 @@ +## Sūrya's Description Report + +### Files Description Table + + +| File Name | SHA-1 Hash | +|-------------|--------------| +| ./interface/IERC20SnapshotCompatible.sol | e274cc030ef5be9b59927f80160d790b2e5c0953 | + + +### Contracts Description Table + + +| Contract | Type | Bases | | | +|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| +| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | +|||||| +| **IERC20SnapshotCompatible** | Interface | ||| +| └ | balanceOf | External ❗️ | |NO❗️ | +| └ | totalSupply | External ❗️ | |NO❗️ | + + +### Legend + +| Symbol | Meaning | +|:--------:|-----------| +| 🛑 | Function can modify state | +| 💵 | Function is payable | diff --git a/doc/schema/surya_report/surya_report_ISnapshotBase.sol.md b/doc/schema/surya_report/surya_report_ISnapshotBase.sol.md index 1bae8e8..a4b7f29 100644 --- a/doc/schema/surya_report/surya_report_ISnapshotBase.sol.md +++ b/doc/schema/surya_report/surya_report_ISnapshotBase.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./interface/ISnapshotBase.sol | a7f684ec3f557a54b93470a43726384d17c711b8 | +| ./interface/ISnapshotBase.sol | a6ec8ee9b8c1b1dde305b1a6903a063438d0435f | ### Contracts Description Table diff --git a/doc/schema/surya_report/surya_report_ISnapshotScheduler.sol.md b/doc/schema/surya_report/surya_report_ISnapshotScheduler.sol.md index 96e2ecc..17f2591 100644 --- a/doc/schema/surya_report/surya_report_ISnapshotScheduler.sol.md +++ b/doc/schema/surya_report/surya_report_ISnapshotScheduler.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./interface/ISnapshotScheduler.sol | 668fe4cff9b78f0a5332b3cee113ec1ebd0248e4 | +| ./interface/ISnapshotScheduler.sol | 773e04367a7970facfa34047911823f97c754675 | ### Contracts Description Table @@ -16,6 +16,7 @@ | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | |||||| | **ISnapshotScheduler** | Interface | ||| +| └ | poke | External ❗️ | 🛑 |NO❗️ | | └ | scheduleSnapshot | External ❗️ | 🛑 |NO❗️ | | └ | scheduleSnapshotNotOptimized | External ❗️ | 🛑 |NO❗️ | | └ | rescheduleSnapshot | External ❗️ | 🛑 |NO❗️ | diff --git a/doc/schema/surya_report/surya_report_ISnapshotState.sol.md b/doc/schema/surya_report/surya_report_ISnapshotState.sol.md index bb7a880..c90edf5 100644 --- a/doc/schema/surya_report/surya_report_ISnapshotState.sol.md +++ b/doc/schema/surya_report/surya_report_ISnapshotState.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./interface/ISnapshotState.sol | f879a0912e76d058d285ceb9c2ca3add9f09ac74 | +| ./interface/ISnapshotState.sol | c5327096413dd45a11187794bae07343d0580593 | ### Contracts Description Table @@ -16,8 +16,11 @@ | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | |||||| | **ISnapshotState** | Interface | ||| +| └ | snapshotExists | External ❗️ | |NO❗️ | | └ | snapshotBalanceOf | External ❗️ | |NO❗️ | +| └ | snapshotBalanceOfExact | External ❗️ | |NO❗️ | | └ | snapshotTotalSupply | External ❗️ | |NO❗️ | +| └ | snapshotTotalSupplyExact | External ❗️ | |NO❗️ | | └ | snapshotInfo | External ❗️ | |NO❗️ | | └ | snapshotInfoBatch | External ❗️ | |NO❗️ | | └ | snapshotInfoBatch | External ❗️ | |NO❗️ | diff --git a/doc/schema/surya_report/surya_report_SnapshotBase.sol.md b/doc/schema/surya_report/surya_report_SnapshotBase.sol.md index d40121e..95b5ab5 100644 --- a/doc/schema/surya_report/surya_report_SnapshotBase.sol.md +++ b/doc/schema/surya_report/surya_report_SnapshotBase.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./library/SnapshotBase.sol | 385c02bea5486ba60c68b22a91cfce159824e31f | +| ./library/SnapshotBase.sol | 6af4125c0ed36eb5dabb74755b2a6aebe5a79594 | ### Contracts Description Table @@ -28,6 +28,8 @@ | └ | _updateTotalSupplySnapshot | Internal 🔒 | 🛑 | | | └ | _snapshotBalanceOf | Internal 🔒 | | | | └ | _snapshotTotalSupply | Internal 🔒 | | | +| └ | _snapshotExists | Internal 🔒 | | | +| └ | _requireSnapshotExists | Internal 🔒 | | | | └ | _updateSnapshot | Private 🔐 | 🛑 | | | └ | _valueAt | Private 🔐 | | | | └ | _lastSnapshot | Private 🔐 | | | diff --git a/doc/schema/surya_report/surya_report_SnapshotEngine.sol.md b/doc/schema/surya_report/surya_report_SnapshotEngine.sol.md index 2097dc9..b1c2549 100644 --- a/doc/schema/surya_report/surya_report_SnapshotEngine.sol.md +++ b/doc/schema/surya_report/surya_report_SnapshotEngine.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./SnapshotEngine.sol | 20863d39f4f943e6da0022c2d77ec6ae2856280c | +| ./deployment/SnapshotEngine.sol | 5b05cce02b9142331d424c194bbe3c7215db03ae | ### Contracts Description Table @@ -15,10 +15,9 @@ |:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | |||||| -| **SnapshotEngine** | Implementation | SnapshotStateModule, SnapshotUpdateModule, SnapshotSchedulerModule, VersionModule, AccessControl, ISnapshotEngine ||| -| └ | | Public ❗️ | 🛑 |NO❗️ | +| **SnapshotEngine** | Implementation | SnapshotEngineBase, AccessControl ||| +| └ | | Public ❗️ | 🛑 | SnapshotEngineBase | | └ | hasRole | Public ❗️ | |NO❗️ | -| └ | operateOnTransfer | Public ❗️ | 🛑 | onlyBoundToken | | └ | _authorizeSnapshot | Internal 🔒 | 🛑 | onlyRole | diff --git a/doc/schema/surya_report/surya_report_SnapshotEngineBase.sol.md b/doc/schema/surya_report/surya_report_SnapshotEngineBase.sol.md new file mode 100644 index 0000000..1f77d6e --- /dev/null +++ b/doc/schema/surya_report/surya_report_SnapshotEngineBase.sol.md @@ -0,0 +1,28 @@ +## Sūrya's Description Report + +### Files Description Table + + +| File Name | SHA-1 Hash | +|-------------|--------------| +| ./base/SnapshotEngineBase.sol | 3885d52adbdbee3fe32dad6d3119ed407fdede70 | + + +### Contracts Description Table + + +| Contract | Type | Bases | | | +|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| +| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | +|||||| +| **SnapshotEngineBase** | Implementation | SnapshotStateModule, SnapshotUpdateModule, SnapshotSchedulerModule, VersionModule, ISnapshotEngine ||| +| └ | | Public ❗️ | 🛑 |NO❗️ | +| └ | operateOnTransfer | Public ❗️ | 🛑 | onlyBoundToken | + + +### Legend + +| Symbol | Meaning | +|:--------:|-----------| +| 🛑 | Function can modify state | +| 💵 | Function is payable | diff --git a/doc/schema/surya_report/surya_report_SnapshotEngineOwnable2Step.sol.md b/doc/schema/surya_report/surya_report_SnapshotEngineOwnable2Step.sol.md new file mode 100644 index 0000000..e8459c5 --- /dev/null +++ b/doc/schema/surya_report/surya_report_SnapshotEngineOwnable2Step.sol.md @@ -0,0 +1,28 @@ +## Sūrya's Description Report + +### Files Description Table + + +| File Name | SHA-1 Hash | +|-------------|--------------| +| ./deployment/SnapshotEngineOwnable2Step.sol | 1a944cac22c3701bb5d8dc93cbf414cffe3c36fc | + + +### Contracts Description Table + + +| Contract | Type | Bases | | | +|:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| +| └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | +|||||| +| **SnapshotEngineOwnable2Step** | Implementation | SnapshotEngineBase, Ownable2Step ||| +| └ | | Public ❗️ | 🛑 | SnapshotEngineBase Ownable | +| └ | _authorizeSnapshot | Internal 🔒 | 🛑 | onlyOwner | + + +### Legend + +| Symbol | Meaning | +|:--------:|-----------| +| 🛑 | Function can modify state | +| 💵 | Function is payable | diff --git a/doc/schema/surya_report/surya_report_SnapshotSchedulerModule.sol.md b/doc/schema/surya_report/surya_report_SnapshotSchedulerModule.sol.md index 0acea08..19db21d 100644 --- a/doc/schema/surya_report/surya_report_SnapshotSchedulerModule.sol.md +++ b/doc/schema/surya_report/surya_report_SnapshotSchedulerModule.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./modules/SnapshotSchedulerModule.sol | 4ffd4db5220b488d1b82b9d10774c3f3a92fdc5c | +| ./modules/SnapshotSchedulerModule.sol | ee8b5e455b46fffa7233c59de1ab435799090124 | ### Contracts Description Table @@ -16,11 +16,12 @@ | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | |||||| | **SnapshotSchedulerModule** | Implementation | SnapshotBase, ISnapshotScheduler ||| -| └ | scheduleSnapshot | Public ❗️ | 🛑 |NO❗️ | -| └ | scheduleSnapshotNotOptimized | Public ❗️ | 🛑 |NO❗️ | -| └ | rescheduleSnapshot | Public ❗️ | 🛑 |NO❗️ | -| └ | unscheduleLastSnapshot | Public ❗️ | 🛑 |NO❗️ | -| └ | unscheduleSnapshotNotOptimized | Public ❗️ | 🛑 |NO❗️ | +| └ | poke | Public ❗️ | 🛑 | onlySnapshotManager | +| └ | scheduleSnapshot | Public ❗️ | 🛑 | onlySnapshotManager | +| └ | scheduleSnapshotNotOptimized | Public ❗️ | 🛑 | onlySnapshotManager | +| └ | rescheduleSnapshot | Public ❗️ | 🛑 | onlySnapshotManager | +| └ | unscheduleLastSnapshot | Public ❗️ | 🛑 | onlySnapshotManager | +| └ | unscheduleSnapshotNotOptimized | Public ❗️ | 🛑 | onlySnapshotManager | | └ | _authorizeSnapshot | Internal 🔒 | 🛑 | | diff --git a/doc/schema/surya_report/surya_report_SnapshotStateInternal.sol.md b/doc/schema/surya_report/surya_report_SnapshotStateInternal.sol.md index 77e79d4..0cbb296 100644 --- a/doc/schema/surya_report/surya_report_SnapshotStateInternal.sol.md +++ b/doc/schema/surya_report/surya_report_SnapshotStateInternal.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./library/SnapshotStateInternal.sol | 354f48fd93145b7eb70fa8585421771c1deab43b | +| ./library/SnapshotStateInternal.sol | 24e8f6b0f169beb77fb60d401e9d894840f52532 | ### Contracts Description Table @@ -19,8 +19,11 @@ | └ | _snapshotInfoBatch | Internal 🔒 | | | | └ | _snapshotInfoBatch | Internal 🔒 | | | | └ | _snapshotInfo | Internal 🔒 | | | +| └ | _isScheduledSnapshot | Internal 🔒 | | | | └ | _snapshotBalanceOf | Internal 🔒 | | | | └ | _snapshotTotalSupply | Internal 🔒 | | | +| └ | _snapshotBalanceOfExact | Internal 🔒 | | | +| └ | _snapshotTotalSupplyExact | Internal 🔒 | | | ### Legend diff --git a/doc/schema/surya_report/surya_report_SnapshotStateModule.sol.md b/doc/schema/surya_report/surya_report_SnapshotStateModule.sol.md index 89da535..965d667 100644 --- a/doc/schema/surya_report/surya_report_SnapshotStateModule.sol.md +++ b/doc/schema/surya_report/surya_report_SnapshotStateModule.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./modules/SnapshotStateModule.sol | c365f368041d1e1c8181f7b17ccda539581392c8 | +| ./modules/SnapshotStateModule.sol | f3ea72348835055ba14ee1d4537a20d785277d65 | ### Contracts Description Table @@ -16,11 +16,14 @@ | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | |||||| | **SnapshotStateModule** | Implementation | SnapshotStateInternal, ISnapshotState ||| +| └ | snapshotExists | Public ❗️ | |NO❗️ | | └ | snapshotInfo | Public ❗️ | |NO❗️ | | └ | snapshotInfoBatch | Public ❗️ | |NO❗️ | | └ | snapshotInfoBatch | Public ❗️ | |NO❗️ | | └ | snapshotBalanceOf | Public ❗️ | |NO❗️ | +| └ | snapshotBalanceOfExact | Public ❗️ | |NO❗️ | | └ | snapshotTotalSupply | Public ❗️ | |NO❗️ | +| └ | snapshotTotalSupplyExact | Public ❗️ | |NO❗️ | ### Legend diff --git a/doc/schema/surya_report/surya_report_SnapshotUpdateModule.sol.md b/doc/schema/surya_report/surya_report_SnapshotUpdateModule.sol.md index 88f81e7..6dc096b 100644 --- a/doc/schema/surya_report/surya_report_SnapshotUpdateModule.sol.md +++ b/doc/schema/surya_report/surya_report_SnapshotUpdateModule.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./modules/SnapshotUpdateModule.sol | b0e4e770bcbed62cc0c493233e24f92a90300772 | +| ./modules/SnapshotUpdateModule.sol | 668787225cdb065546f8dd3d2d2587cd0752438a | ### Contracts Description Table diff --git a/doc/schema/surya_report/surya_report_VersionModule.sol.md b/doc/schema/surya_report/surya_report_VersionModule.sol.md index 15c91c7..e710e33 100644 --- a/doc/schema/surya_report/surya_report_VersionModule.sol.md +++ b/doc/schema/surya_report/surya_report_VersionModule.sol.md @@ -5,7 +5,7 @@ | File Name | SHA-1 Hash | |-------------|--------------| -| ./modules/VersionModule.sol | 2a970df8c7c4fdc6e1221dae435582bb4881b3d9 | +| ./modules/VersionModule.sol | b7ec4f5de6ec271b5e66c718dde087295d1d4342 | ### Contracts Description Table @@ -15,7 +15,7 @@ |:----------:|:-------------------:|:----------------:|:----------------:|:---------------:| | └ | **Function Name** | **Visibility** | **Mutability** | **Modifiers** | |||||| -| **VersionModule** | Implementation | IERC3643Base ||| +| **VersionModule** | Implementation | IERC3643Version ||| | └ | version | Public ❗️ | |NO❗️ | diff --git a/doc/script/convert_links_for_pdf.sh b/doc/script/convert_links_for_pdf.sh new file mode 100755 index 0000000..2f4d392 --- /dev/null +++ b/doc/script/convert_links_for_pdf.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# Script to replace relative markdown links with GitHub links for PDF generation +# Preserves image links (they render in PDF) and external links + +set -e + +if [ -z "$1" ]; then + echo "Usage: $0 [input-file] [output-file]" + echo "" + echo "Example:" + echo " $0 https://github.com/CMTA/CMTAT/blob/v3.0.0" + echo " $0 https://github.com/CMTA/CMTAT/blob/v3.0.0 README.md README_UPDATE.md" + exit 1 +fi + +GITHUB_LINK="${1%/}" # Remove trailing slash if present +INPUT_FILE="${2:-../../README.md}" +OUTPUT_FILE="${3:-README_UPDATE.md}" + +if [ ! -f "$INPUT_FILE" ]; then + echo "Error: Input file '$INPUT_FILE' not found" + exit 1 +fi + +# Create a temporary file +TMP_FILE=$(mktemp) +cp "$INPUT_FILE" "$TMP_FILE" + +# Use a placeholder to avoid sed escaping issues +PLACEHOLDER="__GITHUB_LINK__" + +# Step 1: Convert ALL relative links [text](./...) to placeholder +sed -i -E "s|\[([^]]+)\]\(\./([^)]+)\)|[\1]($PLACEHOLDER/\2)|g" "$TMP_FILE" + +# Step 2: Restore image links back to relative (images render inline in PDF) +for ext in png jpg jpeg gif svg ico webp bmp tiff; do + sed -i -E "s|\[([^]]+)\]\($PLACEHOLDER/([^)]+\.$ext)\)|[\1](./\2)|gi" "$TMP_FILE" +done + +# Step 3: Replace placeholder with actual GitHub link +sed -i "s|$PLACEHOLDER|$GITHUB_LINK|g" "$TMP_FILE" + +mv "$TMP_FILE" "$OUTPUT_FILE" + +echo "Created '$OUTPUT_FILE' with GitHub links pointing to:" +echo " $GITHUB_LINK" diff --git a/specificationSnapshotEngineV0.3.0.pdf b/doc/specification/specificationSnapshotEngineV0.3.0.pdf similarity index 100% rename from specificationSnapshotEngineV0.3.0.pdf rename to doc/specification/specificationSnapshotEngineV0.3.0.pdf diff --git a/hardhat.config.js b/hardhat.config.js index b915056..196de1c 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -1,6 +1,10 @@ /** @type import('hardhat/config').HardhatUserConfig */ //require('@nomiclabs/hardhat-truffle5') -require("hardhat-gas-reporter"); +const deactivateReportGas = process.env.DeactivateReportGas === 'true' || process.env.DeactivateReportGas === '1' +const reportGas = !deactivateReportGas +if (reportGas) { + require('hardhat-gas-reporter') +} require("solidity-coverage") require('solidity-docgen') require("hardhat-contract-sizer"); @@ -8,7 +12,7 @@ require("@nomicfoundation/hardhat-chai-matchers") require('@openzeppelin/hardhat-upgrades') module.exports = { solidity: { - version: '0.8.30', + version: '0.8.34', settings: { optimizer: { enabled: true, @@ -23,5 +27,8 @@ module.exports = { runOnCompile: true, strict: true, //only: [':ERC20$'], + }, + gasReporter: { + enabled: reportGas } -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 2501600..15797e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,8 +7,8 @@ "name": "CMTAT Factory", "license": "MPL", "dependencies": { - "@openzeppelin/contracts": "5.4.0", - "@openzeppelin/contracts-upgradeable": "^5.4.0" + "@openzeppelin/contracts": "5.6.1", + "@openzeppelin/contracts-upgradeable": "5.6.1" }, "devDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.7", @@ -47,8 +47,7 @@ "version": "1.10.1", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@aduh95/viz.js": { "version": "3.7.0", @@ -74,6 +73,7 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", @@ -88,6 +88,7 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", @@ -98,49 +99,12 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dev": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dev": true, - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dev": true, - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-crypto/sha256-js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", @@ -155,6 +119,7 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" } @@ -164,538 +129,292 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dev": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dev": true, - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dev": true, - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.873.0.tgz", - "integrity": "sha512-GAwT2wUZ4sKXepxdUb1kd+JA69nJBTyK6lpAwvavBI+HreQTDwy2tSANj7hkSUkoCfTZxYpOTgR8lkE5ZPX1gQ==", + "version": "3.1064.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.1064.0.tgz", + "integrity": "sha512-yKgtZ27nNDqcq7Kq0mr9XagoAtNX+Hyb0z/ryH1fTQseXPRBxbHyukn8JYY5FwqknkNdMmagwFM8nsCe3CwI7w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.873.0", - "@aws-sdk/credential-provider-node": "3.873.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.873.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.873.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.873.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.873.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.8.0", - "@smithy/eventstream-serde-browser": "^4.0.5", - "@smithy/eventstream-serde-config-resolver": "^4.1.3", - "@smithy/eventstream-serde-node": "^4.0.5", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.18", - "@smithy/middleware-retry": "^4.1.19", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.26", - "@smithy/util-defaults-mode-node": "^4.0.26", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-stream": "^4.2.4", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.7", + "@aws-sdk/core": "^3.974.19", + "@aws-sdk/credential-provider-node": "^3.972.53", + "@aws-sdk/types": "^3.973.12", + "@smithy/core": "^3.24.6", + "@smithy/fetch-http-handler": "^5.4.6", + "@smithy/node-http-handler": "^4.7.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.873.0.tgz", - "integrity": "sha512-EmcrOgFODWe7IsLKFTeSXM9TlQ80/BO1MBISlr7w2ydnOaUYIiPGRRJnDpeIgMaNqT4Rr2cRN2RiMrbFO7gDdA==", + "node_modules/@aws-sdk/core": { + "version": "3.974.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.19.tgz", + "integrity": "sha512-SMNfLCU/41xxfFaC5Slwy8V/f1FRhakvyeeMeDeIxqNF0DzhDlXsXnJDELJYke1EtnJbfzfilW7tvulGfxMY6A==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.873.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.873.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.873.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.873.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.873.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.8.0", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.18", - "@smithy/middleware-retry": "^4.1.19", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.26", - "@smithy/util-defaults-mode-node": "^4.0.26", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.873.0.tgz", - "integrity": "sha512-WrROjp8X1VvmnZ4TBzwM7RF+EB3wRaY9kQJLXw+Aes0/3zRjUXvGIlseobGJMqMEGnM0YekD2F87UaVfot1xeQ==", - "dev": true, - "dependencies": { - "@aws-sdk/types": "3.862.0", - "@aws-sdk/xml-builder": "3.873.0", - "@smithy/core": "^3.8.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/property-provider": "^4.0.5", - "@smithy/protocol-http": "^5.1.3", - "@smithy/signature-v4": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-utf8": "^4.0.0", - "fast-xml-parser": "5.2.5", + "@aws-sdk/types": "^3.973.12", + "@aws-sdk/xml-builder": "^3.972.29", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/core": "^3.24.6", + "@smithy/signature-v4": "^5.4.6", + "@smithy/types": "^4.14.3", + "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.873.0.tgz", - "integrity": "sha512-FWj1yUs45VjCADv80JlGshAttUHBL2xtTAbJcAxkkJZzLRKVkdyrepFWhv/95MvDyzfbT6PgJiWMdW65l/8ooA==", + "version": "3.972.45", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.45.tgz", + "integrity": "sha512-ZPsnLyrpDRmojKrBbJykASyLLVFkjyD+fWATeSuYgaqablijGOzxPxEKyrwUvNg+bgSQ7PkW2FTu65Xco19Gag==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/types": "^4.3.2", + "@aws-sdk/core": "^3.974.19", + "@aws-sdk/types": "^3.973.12", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.873.0.tgz", - "integrity": "sha512-0sIokBlXIsndjZFUfr3Xui8W6kPC4DAeBGAXxGi9qbFZ9PWJjn1vt2COLikKH3q2snchk+AsznREZG8NW6ezSg==", - "dev": true, - "dependencies": { - "@aws-sdk/core": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/property-provider": "^4.0.5", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/util-stream": "^4.2.4", + "version": "3.972.47", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.47.tgz", + "integrity": "sha512-1XdgHDIPbARHuzZXM7ouzIbSUZFU9dTi9k+ryMhiZU4QCam4dvwOyUEFjEHNxAZehCYUIOmsSUZ2un6BIgUkWg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.19", + "@aws-sdk/types": "^3.973.12", + "@smithy/core": "^3.24.6", + "@smithy/fetch-http-handler": "^5.4.6", + "@smithy/node-http-handler": "^4.7.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.873.0.tgz", - "integrity": "sha512-bQdGqh47Sk0+2S3C+N46aNQsZFzcHs7ndxYLARH/avYXf02Nl68p194eYFaAHJSQ1re5IbExU1+pbums7FJ9fA==", - "dev": true, - "dependencies": { - "@aws-sdk/core": "3.873.0", - "@aws-sdk/credential-provider-env": "3.873.0", - "@aws-sdk/credential-provider-http": "3.873.0", - "@aws-sdk/credential-provider-process": "3.873.0", - "@aws-sdk/credential-provider-sso": "3.873.0", - "@aws-sdk/credential-provider-web-identity": "3.873.0", - "@aws-sdk/nested-clients": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@smithy/credential-provider-imds": "^4.0.7", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.873.0.tgz", - "integrity": "sha512-+v/xBEB02k2ExnSDL8+1gD6UizY4Q/HaIJkNSkitFynRiiTQpVOSkCkA0iWxzksMeN8k1IHTE5gzeWpkEjNwbA==", - "dev": true, - "dependencies": { - "@aws-sdk/credential-provider-env": "3.873.0", - "@aws-sdk/credential-provider-http": "3.873.0", - "@aws-sdk/credential-provider-ini": "3.873.0", - "@aws-sdk/credential-provider-process": "3.873.0", - "@aws-sdk/credential-provider-sso": "3.873.0", - "@aws-sdk/credential-provider-web-identity": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@smithy/credential-provider-imds": "^4.0.7", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.873.0.tgz", - "integrity": "sha512-ycFv9WN+UJF7bK/ElBq1ugWA4NMbYS//1K55bPQZb2XUpAM2TWFlEjG7DIyOhLNTdl6+CbHlCdhlKQuDGgmm0A==", + "version": "3.972.51", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.51.tgz", + "integrity": "sha512-f8sRTVyM+9BbzQKPlUP9dVVpgNEu65jFckNAAGzRfCrlaSi5AWUbCKEHIMcIYokv8pWblSKEqHkqKYZtwINnhw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.873.0.tgz", - "integrity": "sha512-SudkAOZmjEEYgUrqlUUjvrtbWJeI54/0Xo87KRxm4kfBtMqSx0TxbplNUAk8Gkg4XQNY0o7jpG8tK7r2Wc2+uw==", - "dev": true, - "dependencies": { - "@aws-sdk/client-sso": "3.873.0", - "@aws-sdk/core": "3.873.0", - "@aws-sdk/token-providers": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", + "@aws-sdk/core": "^3.974.19", + "@aws-sdk/credential-provider-env": "^3.972.45", + "@aws-sdk/credential-provider-http": "^3.972.47", + "@aws-sdk/credential-provider-login": "^3.972.50", + "@aws-sdk/credential-provider-process": "^3.972.45", + "@aws-sdk/credential-provider-sso": "^3.972.50", + "@aws-sdk/credential-provider-web-identity": "^3.972.50", + "@aws-sdk/nested-clients": "^3.997.18", + "@aws-sdk/types": "^3.973.12", + "@smithy/core": "^3.24.6", + "@smithy/credential-provider-imds": "^4.3.7", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.873.0.tgz", - "integrity": "sha512-Gw2H21+VkA6AgwKkBtTtlGZ45qgyRZPSKWs0kUwXVlmGOiPz61t/lBX0vG6I06ZIz2wqeTJ5OA1pWZLqw1j0JQ==", + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.50", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.50.tgz", + "integrity": "sha512-NHHsKoMhw6UylSU0XDnDc87+IQW8tRBTIe6vnOX12GSIlBDtoce6bSzONleIglCyu8d3H9bmTSfk+sIN5yh3WA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.873.0", - "@aws-sdk/nested-clients": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/types": "^4.3.2", + "@aws-sdk/core": "^3.974.19", + "@aws-sdk/nested-clients": "^3.997.18", + "@aws-sdk/types": "^3.973.12", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.873.0.tgz", - "integrity": "sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA==", + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.53", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.53.tgz", + "integrity": "sha512-z/JJ8Qvf2GiTn4bw+x8k7wQjxmPpNsiwZ7ls/h1cZHikrSpS0+65lB+lafnXZlxv1lqH4k6rQwh+2UsycC662g==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", + "@aws-sdk/credential-provider-env": "^3.972.45", + "@aws-sdk/credential-provider-http": "^3.972.47", + "@aws-sdk/credential-provider-ini": "^3.972.51", + "@aws-sdk/credential-provider-process": "^3.972.45", + "@aws-sdk/credential-provider-sso": "^3.972.50", + "@aws-sdk/credential-provider-web-identity": "^3.972.50", + "@aws-sdk/types": "^3.973.12", + "@smithy/core": "^3.24.6", + "@smithy/credential-provider-imds": "^4.3.7", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.873.0.tgz", - "integrity": "sha512-QhNZ8X7pW68kFez9QxUSN65Um0Feo18ZmHxszQZNUhKDsXew/EG9NPQE/HgYcekcon35zHxC4xs+FeNuPurP2g==", + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.45", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.45.tgz", + "integrity": "sha512-QMJXjTGLmHE4Ie03T5H4hHOLfcvMc9DaODO6b5dgte3S8ECf5bBuHUJW4cQREcYZyRkOU8iymqtiBxqF4icxZg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/types": "^4.3.2", + "@aws-sdk/core": "^3.974.19", + "@aws-sdk/types": "^3.973.12", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.873.0.tgz", - "integrity": "sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==", + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.50", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.50.tgz", + "integrity": "sha512-pQ9ww4G53gwHlon1NMz25JhaBo13E9Jv+VVgjh39C/yzvby+xhSnEOb+VDYShKNCh1TbttMF/5CFCHkZrIqOcA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", + "@aws-sdk/core": "^3.974.19", + "@aws-sdk/nested-clients": "^3.997.18", + "@aws-sdk/token-providers": "3.1064.0", + "@aws-sdk/types": "^3.973.12", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.873.0.tgz", - "integrity": "sha512-gHqAMYpWkPhZLwqB3Yj83JKdL2Vsb64sryo8LN2UdpElpS+0fT4yjqSxKTfp7gkhN6TCIxF24HQgbPk5FMYJWw==", + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.50", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.50.tgz", + "integrity": "sha512-9DbaPaT2aMbz18wtSpq9HVBErjBQwxykqTFgG6n8Bn05GN68mITz+G1869ekYx0mVT/BDjETj5czz/3cPgLwxA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.873.0", - "@smithy/core": "^3.8.0", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", + "@aws-sdk/core": "^3.974.19", + "@aws-sdk/nested-clients": "^3.997.18", + "@aws-sdk/types": "^3.973.12", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.873.0.tgz", - "integrity": "sha512-yg8JkRHuH/xO65rtmLOWcd9XQhxX1kAonp2CliXT44eA/23OBds6XoheY44eZeHfCTgutDLTYitvy3k9fQY6ZA==", + "version": "3.997.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.18.tgz", + "integrity": "sha512-xBWrodBvW5SHCZV11UZUJG0pSHkLCEREIBoNbff1C1sacOUCmxJnTCPE80sCGLCtqgXg98I2MQJe2z28tcZSsw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.873.0", - "@aws-sdk/middleware-host-header": "3.873.0", - "@aws-sdk/middleware-logger": "3.873.0", - "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.873.0", - "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.873.0", - "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.873.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.8.0", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.18", - "@smithy/middleware-retry": "^4.1.19", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.26", - "@smithy/util-defaults-mode-node": "^4.0.26", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "^3.974.19", + "@aws-sdk/signature-v4-multi-region": "^3.996.33", + "@aws-sdk/types": "^3.973.12", + "@smithy/core": "^3.24.6", + "@smithy/fetch-http-handler": "^5.4.6", + "@smithy/node-http-handler": "^4.7.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.873.0.tgz", - "integrity": "sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.33", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.33.tgz", + "integrity": "sha512-Hn0RThJEbyOZWV2PV9Z4YD3nitGPxybmyU17dSe9b61WOBcKnqS0WTtM3c1zyZq9WnGiyrfi/i+UBPUk7cM8Ug==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/types": "^4.3.2", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", + "@aws-sdk/types": "^3.973.12", + "@smithy/signature-v4": "^5.4.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.873.0.tgz", - "integrity": "sha512-BWOCeFeV/Ba8fVhtwUw/0Hz4wMm9fjXnMb4Z2a5he/jFlz5mt1/rr6IQ4MyKgzOaz24YrvqsJW2a0VUKOaYDvg==", + "version": "3.1064.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1064.0.tgz", + "integrity": "sha512-sjI+iA4JtgeckBgKwPQF7KzWillRoNDmtpiM0TRa0syiAKFHKUSf84kPXSO3+gA7aMMSxrcxzOM2oPSecaJvEA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.873.0", - "@aws-sdk/nested-clients": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", + "@aws-sdk/core": "^3.974.19", + "@aws-sdk/nested-clients": "^3.997.18", + "@aws-sdk/types": "^3.973.12", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.862.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", - "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", - "dev": true, - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.873.0.tgz", - "integrity": "sha512-YByHrhjxYdjKRf/RQygRK1uh0As1FIi9+jXTcIEX/rBgN8mUByczr2u4QXBzw7ZdbdcOBMOkPnLRjNOWW1MkFg==", + "version": "3.973.12", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.12.tgz", + "integrity": "sha512-43ajd1NF0RMgX5k0hxCNUyEdrtFUsb2aHT2QvpktSC/2Eyb2Jr/JPVqdp0XIoaHWikZJq5tNWSLO6kB5q2eMCA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@smithy/util-endpoints": "^3.0.7", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.873.0.tgz", - "integrity": "sha512-xcVhZF6svjM5Rj89T1WzkjQmrTF6dpR2UvIHPMTnSZoNe6CixejPZ6f0JJ2kAhO8H+dUHwNBlsUgOTIKiK/Syg==", - "dev": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz", - "integrity": "sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==", - "dev": true, - "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/types": "^4.3.2", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.873.0.tgz", - "integrity": "sha512-9MivTP+q9Sis71UxuBaIY3h5jxH0vN3/ZWGxO8ADL19S2OIfknrYSAfzE5fpoKROVBu0bS4VifHOFq4PY1zsxw==", + "version": "3.965.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.7.tgz", + "integrity": "sha512-M0D6oIpohdNHjc7udzTHEQyot0+0iuA36jc2I9Hps+f/GtKi2HO/pyijQnCnNcwZqLB5+rtn81z3eZK/GyjAmA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.873.0", - "@aws-sdk/types": "3.862.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-utf8-browser": { @@ -708,14 +427,26 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.873.0.tgz", - "integrity": "sha512-kLO7k7cGJ6KaHiExSJWojZurF7SnGMDHXRuQunFnEoD0n1yB6Lqy/S/zHiQ7oJnBhPr9q0TW9qFkrsZb1Uc54w==", + "version": "3.972.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.29.tgz", + "integrity": "sha512-fk0niuGFxfi8yIJuMVM4mhwObkiQSuwZFj3tAPrLVx64Pk3BkrEIpqjzHKY4hKoEBUD6Jg/S74Zj9jy+5F3DnQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.2", + "@smithy/types": "^4.14.3", + "fast-xml-parser": "5.7.3", "tslib": "^2.6.2" }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.0.0" } @@ -908,10 +639,11 @@ } }, "node_modules/@babel/cli/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=8.6" @@ -934,12 +666,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -996,13 +729,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -1121,10 +855,11 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1143,27 +878,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1185,10 +922,11 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1241,19 +979,21 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1295,12 +1035,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -1843,15 +1584,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", + "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2387,31 +2129,33 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -2419,13 +2163,14 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2818,10 +2563,21 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3105,10 +2861,11 @@ } }, "node_modules/@ethersproject/bignumber/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/@ethersproject/bytes": { "version": "5.8.0", @@ -3509,10 +3266,11 @@ } }, "node_modules/@ethersproject/signing-key/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/@ethersproject/solidity": { "version": "5.8.0", @@ -3777,7 +3535,6 @@ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", "dev": true, - "peer": true, "dependencies": { "@noble/hashes": "1.3.2" }, @@ -3790,7 +3547,6 @@ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "dev": true, - "peer": true, "engines": { "node": ">= 16" }, @@ -3822,13 +3578,26 @@ } ] }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@nodable/entities": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.1.tgz", + "integrity": "sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==", "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -3858,91 +3627,100 @@ } }, "node_modules/@nomicfoundation/edr": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.11.3.tgz", - "integrity": "sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.12.0-next.23.tgz", + "integrity": "sha512-F2/6HZh8Q9RsgkOIkRrckldbhPjIZY7d4mT9LYuW68miwGQ5l7CkAgcz9fRRiurA0+YJhtsbx/EyrD9DmX9BOw==", "dev": true, + "license": "MIT", "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-darwin-arm64": "0.12.0-next.23", + "@nomicfoundation/edr-darwin-x64": "0.12.0-next.23", + "@nomicfoundation/edr-linux-arm64-gnu": "0.12.0-next.23", + "@nomicfoundation/edr-linux-arm64-musl": "0.12.0-next.23", + "@nomicfoundation/edr-linux-x64-gnu": "0.12.0-next.23", + "@nomicfoundation/edr-linux-x64-musl": "0.12.0-next.23", + "@nomicfoundation/edr-win32-x64-msvc": "0.12.0-next.23" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-darwin-arm64": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.11.3.tgz", - "integrity": "sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.12.0-next.23.tgz", + "integrity": "sha512-Amh7mRoDzZyJJ4efqoePqdoZOzharmSOttZuJDlVE5yy07BoE8hL6ZRpa5fNYn0LCqn/KoWs8OHANWxhKDGhvQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-darwin-x64": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.11.3.tgz", - "integrity": "sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.12.0-next.23.tgz", + "integrity": "sha512-9wn489FIQm7m0UCD+HhktjWx6vskZzeZD9oDc2k9ZvbBzdXwPp5tiDqUBJ+eQpByAzCDfteAJwRn2lQCE0U+Iw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.11.3.tgz", - "integrity": "sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.12.0-next.23.tgz", + "integrity": "sha512-nlk5EejSzEUfEngv0Jkhqq3/wINIfF2ED9wAofc22w/V1DV99ASh9l3/e/MIHOQFecIZ9MDqt0Em9/oDyB1Uew==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-linux-arm64-musl": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.11.3.tgz", - "integrity": "sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.12.0-next.23.tgz", + "integrity": "sha512-SJuPBp3Rc6vM92UtVTUxZQ/QlLhLfwTftt2XUiYohmGKB3RjGzpgduEFMCA0LEnucUckU6UHrJNFHiDm77C4PQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-linux-x64-gnu": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.11.3.tgz", - "integrity": "sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.12.0-next.23.tgz", + "integrity": "sha512-NU+Qs3u7Qt6t3bJFdmmjd5CsvgI2bPPzO31KifM2Ez96/jsXYho5debtTQnimlb5NAqiHTSlxjh/F8ROcptmeQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-linux-x64-musl": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.11.3.tgz", - "integrity": "sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.12.0-next.23.tgz", + "integrity": "sha512-F78fZA2h6/ssiCSZOovlgIu0dUeI7ItKPsDDF3UUlIibef052GCXmliMinC90jVPbrjUADMd1BUwjfI0Z8OllQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/edr-win32-x64-msvc": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.11.3.tgz", - "integrity": "sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung==", + "version": "0.12.0-next.23", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.12.0-next.23.tgz", + "integrity": "sha512-IfJZQJn7d/YyqhmguBIGoCKjE9dKjbu6V6iNEPApfwf5JyyjHYyyfkLU4rf7hygj57bfH4sl1jtQ6r8HnT62lw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 18" + "node": ">= 20" } }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.1.0.tgz", - "integrity": "sha512-GPhBNafh1fCnVD9Y7BYvoLnblnvfcq3j8YDbO1gGe/1nOFWzGmV7gFu5DkwFXF+IpYsS+t96o9qc/mPu3V3Vfw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.1.2.tgz", + "integrity": "sha512-NlUlde/ycXw2bLzA2gWjjbxQaD9xIRbAF30nsoEprAWzH8dXEI1ILZUKZMyux9n9iygEXTzN0SDVjE6zWDZi9g==", "dev": true, + "license": "MIT", "dependencies": { "@types/chai-as-promised": "^7.1.3", "chai-as-promised": "^7.1.1", @@ -3957,10 +3735,11 @@ } }, "node_modules/@nomicfoundation/hardhat-ethers": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.1.0.tgz", - "integrity": "sha512-jx6fw3Ms7QBwFGT2MU6ICG292z0P81u6g54JjSV105+FbTZOF4FJqPksLfDybxkkOeq28eDxbqq7vpxRYyIlxA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.1.3.tgz", + "integrity": "sha512-208JcDeVIl+7Wu3MhFUUtiA8TJ7r2Rn3Wr+lSx9PfsDTKkbsAsWPY6N6wQ4mtzDv0/pB9nIbJhkjoHe1EsgNsA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "debug": "^4.1.1", @@ -3968,14 +3747,15 @@ }, "peerDependencies": { "ethers": "^6.14.0", - "hardhat": "^2.26.0" + "hardhat": "^2.28.0" } }, "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.1.0.tgz", - "integrity": "sha512-ZS+NulZuR99NUHt2VwcgZvgeD6Y63qrbORNRuKO+lTowJxNVsrJ0zbRx1j5De6G3dOno5pVGvuYSq2QVG0qCYg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.1.2.tgz", + "integrity": "sha512-p7HaUVDbLj7ikFivQVNhnfMHUBgiHYMwQWvGn9AriieuopGOELIrwj2KjyM2a6z70zai5YKO264Vwz+3UFJZPQ==", "dev": true, + "license": "MIT", "dependencies": { "ethereumjs-util": "^7.1.4" }, @@ -4091,47 +3871,53 @@ } }, "node_modules/@openzeppelin/contracts": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.4.0.tgz", - "integrity": "sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A==" + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.6.1.tgz", + "integrity": "sha512-Ly6SlsVJ3mj+b18W3R8gNufB7dTICT105fJhodGAGgyC2oqnBAhqSiNDJ8V8DLY05cCz81GLI0CU5vNYA1EC/w==", + "license": "MIT" }, "node_modules/@openzeppelin/contracts-upgradeable": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.4.0.tgz", - "integrity": "sha512-STJKyDzUcYuB35Zub1JpWW58JxvrFFVgQ+Ykdr8A9PGXgtq/obF5uoh07k2XmFyPxfnZdPdBdhkJ/n2YxJ87HQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.6.1.tgz", + "integrity": "sha512-n4a/vfRs114lXyUdYg7pyY8LvFKWvCDF5lEcRRAVxap8g6ZEdLqm+9tmt2zTtRHcNMxTYp9y5t6KBof4tHp7Og==", + "license": "MIT", "peerDependencies": { - "@openzeppelin/contracts": "5.4.0" + "@openzeppelin/contracts": "5.6.1" } }, "node_modules/@openzeppelin/defender-sdk-base-client": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-2.7.0.tgz", - "integrity": "sha512-J5IpvbFfdIJM4IadBcXfhCXVdX2yEpaZtRR1ecq87d8CdkmmEpniYfef/yVlG98yekvu125LaIRg0yXQOt9Bdg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-2.7.1.tgz", + "integrity": "sha512-7gFCteA+V3396A3McgqzmirwmbPXuHJYN896O3AbsHX9XcxInN74C5Zv3tFHld0GmIX/VlaIvILNMhOpdISZjA==", "dev": true, + "license": "MIT", "dependencies": { "@aws-sdk/client-lambda": "^3.563.0", "amazon-cognito-identity-js": "^6.3.6", - "async-retry": "^1.3.3" + "async-retry": "^1.3.3", + "axios": "^1.7.4" } }, "node_modules/@openzeppelin/defender-sdk-deploy-client": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-2.7.0.tgz", - "integrity": "sha512-YOHZmnHmM1y6uSqXWGfk2/5/ae4zZJE6xG92yFEAIOy8vqh1dxznWMsoCcAXRXTCWc8RdCDpFdMfEy4SBTyYtg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-2.7.1.tgz", + "integrity": "sha512-vFkDupn8ATW83KjZlY5U7UdsvSo9YZwOMQoVaHJO3S+Z6h0wa6cTzuQV9C0AKYq524quQkFsQ4AQq5CgsgdEkQ==", "dev": true, + "license": "MIT", "dependencies": { - "@openzeppelin/defender-sdk-base-client": "^2.7.0", + "@openzeppelin/defender-sdk-base-client": "^2.7.1", "axios": "^1.7.4", "lodash": "^4.17.21" } }, "node_modules/@openzeppelin/defender-sdk-network-client": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-2.7.0.tgz", - "integrity": "sha512-4CYWPa9+kSjojE5KS7kRmP161qsBATdp97TCrzyDdGoVahj0GyqgafRL9AAjm0eHZOM1c7EIYEpbvYRtFi8vyA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-2.7.1.tgz", + "integrity": "sha512-AWJKT9YKv9wH3/1AJZCztF3VIsg1sX+v8fjtyFLROqtVAzmhB8WKBRVt9GHAZ+PmsixAKDMOEbH6R1cipTIVHQ==", "dev": true, + "license": "MIT", "dependencies": { - "@openzeppelin/defender-sdk-base-client": "^2.7.0", + "@openzeppelin/defender-sdk-base-client": "^2.7.1", "axios": "^1.7.4", "lodash": "^4.17.21" } @@ -4238,10 +4024,11 @@ } }, "node_modules/@openzeppelin/hardhat-upgrades/node_modules/undici": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", - "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.26.0.tgz", + "integrity": "sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.17" } @@ -4266,10 +4053,11 @@ } }, "node_modules/@openzeppelin/upgrades-core": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.44.1.tgz", - "integrity": "sha512-yqvDj7eC7m5kCDgqCxVFgk9sVo9SXP/fQFaExPousNfAJJbX+20l4fKZp17aXbNTpo1g+2205s6cR9VhFFOCaQ==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.46.0.tgz", + "integrity": "sha512-UFSeO/4r8eeXj0C/HAwV+J4b72sE1HX0aALQFs5S2RBOsfXvKweyjQf35vrK32LQiyHdP6IPShAsEBVvpSEgGQ==", "dev": true, + "license": "MIT", "dependencies": { "@nomicfoundation/slang": "^0.18.3", "bignumber.js": "^9.1.2", @@ -4278,7 +4066,7 @@ "compare-versions": "^6.0.0", "debug": "^4.1.1", "ethereumjs-util": "^7.0.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.5", "minimist": "^1.2.7", "proper-lockfile": "^4.1.1", "solidity-ast": "^0.4.60" @@ -4302,6 +4090,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/@openzeppelin/upgrades-core/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/@openzeppelin/upgrades-core/node_modules/bignumber.js": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", @@ -4312,12 +4110,16 @@ } }, "node_modules/@openzeppelin/upgrades-core/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/@openzeppelin/upgrades-core/node_modules/cbor": { @@ -4376,15 +4178,16 @@ } }, "node_modules/@openzeppelin/upgrades-core/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4411,6 +4214,133 @@ "node": ">=8" } }, + "node_modules/@puppeteer/browsers": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.2.tgz", + "integrity": "sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.3", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.4", + "tar-fs": "^3.1.1", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@puppeteer/browsers/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.3.tgz", + "integrity": "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@puppeteer/browsers/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@puppeteer/browsers/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -4507,754 +4437,202 @@ "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", "dev": true, "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/minimal/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "dev": true, - "dependencies": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "dev": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/tracing/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "dev": true, - "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@smithy/abort-controller": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", - "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", - "dev": true, - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.5.tgz", - "integrity": "sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==", - "dev": true, - "dependencies": { - "@smithy/node-config-provider": "^4.1.4", - "@smithy/types": "^4.3.2", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.8.0.tgz", - "integrity": "sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==", - "dev": true, - "dependencies": { - "@smithy/middleware-serde": "^4.0.9", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-stream": "^4.2.4", - "@smithy/util-utf8": "^4.0.0", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/core/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz", - "integrity": "sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==", - "dev": true, - "dependencies": { - "@smithy/node-config-provider": "^4.1.4", - "@smithy/property-provider": "^4.0.5", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.5.tgz", - "integrity": "sha512-miEUN+nz2UTNoRYRhRqVTJCx7jMeILdAurStT2XoS+mhokkmz1xAPp95DFW9Gxt4iF2VBqpeF9HbTQ3kY1viOA==", - "dev": true, - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.3.2", - "@smithy/util-hex-encoding": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.5.tgz", - "integrity": "sha512-LCUQUVTbM6HFKzImYlSB9w4xafZmpdmZsOh9rIl7riPC3osCgGFVP+wwvYVw6pXda9PPT9TcEZxaq3XE81EdJQ==", - "dev": true, - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.3.tgz", - "integrity": "sha512-yTTzw2jZjn/MbHu1pURbHdpjGbCuMHWncNBpJnQAPxOVnFUAbSIUSwafiphVDjNV93TdBJWmeVAds7yl5QCkcA==", - "dev": true, - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.5.tgz", - "integrity": "sha512-lGS10urI4CNzz6YlTe5EYG0YOpsSp3ra8MXyco4aqSkQDuyZPIw2hcaxDU82OUVtK7UY9hrSvgWtpsW5D4rb4g==", - "dev": true, - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.5.tgz", - "integrity": "sha512-JFnmu4SU36YYw3DIBVao3FsJh4Uw65vVDIqlWT4LzR6gXA0F3KP0IXFKKJrhaVzCBhAuMsrUUaT5I+/4ZhF7aw==", - "dev": true, - "dependencies": { - "@smithy/eventstream-codec": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", - "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", - "dev": true, - "dependencies": { - "@smithy/protocol-http": "^5.1.3", - "@smithy/querystring-builder": "^4.0.5", - "@smithy/types": "^4.3.2", - "@smithy/util-base64": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-node": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.5.tgz", - "integrity": "sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==", - "dev": true, - "dependencies": { - "@smithy/types": "^4.3.2", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.5.tgz", - "integrity": "sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==", - "dev": true, - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", - "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", - "dev": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.5.tgz", - "integrity": "sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==", - "dev": true, - "dependencies": { - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.18.tgz", - "integrity": "sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==", - "dev": true, - "dependencies": { - "@smithy/core": "^3.8.0", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@smithy/util-middleware": "^4.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "4.1.19", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.19.tgz", - "integrity": "sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==", - "dev": true, - "dependencies": { - "@smithy/node-config-provider": "^4.1.4", - "@smithy/protocol-http": "^5.1.3", - "@smithy/service-error-classification": "^4.0.7", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-retry/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", - "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", - "dev": true, - "dependencies": { - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", - "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", - "dev": true, - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", - "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", - "dev": true, - "dependencies": { - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", - "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", - "dev": true, - "dependencies": { - "@smithy/abort-controller": "^4.0.5", - "@smithy/protocol-http": "^5.1.3", - "@smithy/querystring-builder": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", - "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", - "dev": true, - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", - "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", - "dev": true, - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", - "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", - "dev": true, - "dependencies": { - "@smithy/types": "^4.3.2", - "@smithy/util-uri-escape": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", - "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", - "dev": true, - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.7.tgz", - "integrity": "sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==", - "dev": true, - "dependencies": { - "@smithy/types": "^4.3.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", - "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", - "dev": true, - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.3.tgz", - "integrity": "sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==", - "dev": true, - "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-uri-escape": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.10.tgz", - "integrity": "sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==", - "dev": true, - "dependencies": { - "@smithy/core": "^3.8.0", - "@smithy/middleware-endpoint": "^4.1.18", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "@smithy/util-stream": "^4.2.4", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", - "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", - "dev": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", - "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", - "dev": true, - "dependencies": { - "@smithy/querystring-parser": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-base64": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", - "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", - "dev": true, - "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=6" } }, - "node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", - "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", "dev": true, "dependencies": { - "tslib": "^2.6.2" + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=6" } }, - "node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", - "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "node_modules/@sentry/node/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", "dev": true, "dependencies": { - "tslib": "^2.6.2" + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=6" } }, - "node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "node_modules/@sentry/tracing/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", "dev": true, - "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "tslib": "^2.6.2" - }, "engines": { - "node": ">=18.0.0" + "node": ">=6" } }, - "node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", "dev": true, "dependencies": { - "tslib": "^2.6.2" + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=6" } }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.26", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.26.tgz", - "integrity": "sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==", + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, - "dependencies": { - "@smithy/property-provider": "^4.0.5", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, "engines": { - "node": ">=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.26", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.26.tgz", - "integrity": "sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==", + "node_modules/@smithy/core": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.24.6.tgz", + "integrity": "sha512-wBXDRup6UU97VKyaiRo8AssnfStPtG0oAAfpq/bC0a1YYau8pM86YB4kM6ccoVi1mS8l/UHbn9oDM+7uozr/ug==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.1.5", - "@smithy/credential-provider-imds": "^4.0.7", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/property-provider": "^4.0.5", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-endpoints": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.7.tgz", - "integrity": "sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==", + "node_modules/@smithy/credential-provider-imds": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.8.tgz", + "integrity": "sha512-5cAM+KZC02sTqDt6NaLXyu50M/GNMd1eTzDVR8Lb0BBsVtu7RWHo47VPPEEv1vt3Yub6uzr+M5FHC+GtoT0USg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.4", - "@smithy/types": "^4.3.2", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "node_modules/@smithy/fetch-http-handler": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.6.tgz", + "integrity": "sha512-FEwEYJ1jlBKdhe9TPzfghEi1bP55ZeEImlDkEa62bBBYzUcnB6RUCyuiS2mqKt6ZVjUbBgcNhzfIctH+Hevx9g==", "dev": true, + "license": "Apache-2.0", "dependencies": { + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-middleware": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", - "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", + "node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@smithy/util-retry": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.7.tgz", - "integrity": "sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==", + "node_modules/@smithy/node-http-handler": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.7.7.tgz", + "integrity": "sha512-ZAFvHXrEk6K180EVhmZVg8GU5pUH5BSFqRs27JW3j1qEFx9YyYwWFx17x/MHcjALYimGAji7qEOlF1++be+G5A==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.7", - "@smithy/types": "^4.3.2", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-stream": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", - "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", + "node_modules/@smithy/signature-v4": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.4.6.tgz", + "integrity": "sha512-Ojg4B6oIDlIr1R86xCDJt1zJWnYa0VINmqdjfe9qxWjdRivHalZ3iSlQgVqYbW0MdpFOC5XfHEWsnbmdnpIILQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/types": "^4.3.2", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/core": "^3.24.6", + "@smithy/types": "^4.14.3", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "node_modules/@smithy/types": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.3.tgz", + "integrity": "sha512-YupL0ZWmFtJexUN2cHzkvvF/b9pKrtAIfT1o7/oY/Ppu8IYeZ+lDPM5vZdQJaSeA132dJCqojjGC9NhXeF71VQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -5262,31 +4640,32 @@ "node": ">=18.0.0" } }, - "node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@smithy/util-waiter": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.7.tgz", - "integrity": "sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A==", + "node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.5", - "@smithy/types": "^4.3.2", + "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, "node_modules/@solidity-parser/parser": { @@ -5310,6 +4689,13 @@ "node": ">=14.16" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "license": "MIT" + }, "node_modules/@truffle/abi-utils": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-1.0.3.tgz", @@ -5326,10 +4712,11 @@ } }, "node_modules/@truffle/abi-utils/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/@truffle/abi-utils/node_modules/web3-utils": { "version": "1.10.0", @@ -5382,10 +4769,11 @@ } }, "node_modules/@truffle/codec/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/@truffle/codec/node_modules/semver": { "version": "7.7.2", @@ -5896,10 +5284,11 @@ } }, "node_modules/@truffle/contract/node_modules/web3-utils/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/@truffle/debug-utils": { "version": "6.0.57", @@ -5920,10 +5309,11 @@ } }, "node_modules/@truffle/debug-utils/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/@truffle/error": { "version": "0.2.2", @@ -5992,10 +5382,11 @@ } }, "node_modules/@truffle/interface-adapter/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/@truffle/interface-adapter/node_modules/elliptic": { "version": "6.5.4", @@ -6013,10 +5404,11 @@ } }, "node_modules/@truffle/interface-adapter/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "dev": true, + "license": "MIT" }, "node_modules/@truffle/interface-adapter/node_modules/eth-lib": { "version": "0.2.8", @@ -6030,10 +5422,11 @@ } }, "node_modules/@truffle/interface-adapter/node_modules/eth-lib/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "dev": true, + "license": "MIT" }, "node_modules/@truffle/interface-adapter/node_modules/ethers": { "version": "4.0.49", @@ -6053,10 +5446,11 @@ } }, "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "dev": true, + "license": "MIT" }, "node_modules/@truffle/interface-adapter/node_modules/hash.js": { "version": "1.1.3", @@ -6575,17 +5969,12 @@ "@types/node": "*" } }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true - }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" @@ -6656,8 +6045,7 @@ "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "dev": true, - "peer": true + "dev": true }, "node_modules/agent-base": { "version": "6.0.2", @@ -6685,10 +6073,11 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6701,10 +6090,11 @@ } }, "node_modules/amazon-cognito-identity-js": { - "version": "6.3.15", - "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.15.tgz", - "integrity": "sha512-G2mzTlGYHKYh9oZDO0Gk94xVQ4iY9GYWBaYScbDYvz05ps6dqi0IvdNx1Lxi7oA3tjS5X+mUN7/svFJJdOB9YA==", + "version": "6.3.16", + "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.16.tgz", + "integrity": "sha512-HPGSBGD6Q36t99puWh0LnptxO/4icnk2kqIQ9cTJ2tFQo5NMUnWQIgtrTAk8nm+caqUbjDzXzG56GBjI2tS6jQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-js": "1.2.2", "buffer": "4.9.2", @@ -7118,6 +6508,19 @@ "node": ">=0.10.0" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -7209,14 +6612,16 @@ "dev": true }, "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", + "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", "dev": true, + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" } }, "node_modules/axios-debug-log": { @@ -7232,6 +6637,21 @@ "axios": ">=1.0.0" } }, + "node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", @@ -7261,30 +6681,127 @@ "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bare-events": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", + "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.2.tgz", + "integrity": "sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.1.tgz", + "integrity": "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.1.tgz", + "integrity": "sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "node_modules/bare-stream": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.1.tgz", + "integrity": "sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" + "streamx": "^2.25.0", + "teex": "^1.0.1" }, "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "node_modules/bare-url": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz", + "integrity": "sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } }, "node_modules/base": { "version": "0.11.2", @@ -7354,6 +6871,16 @@ } ] }, + "node_modules/basic-ftp": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz", + "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -7419,17 +6946,6 @@ "file-uri-to-path": "1.0.0" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", @@ -7443,29 +6959,31 @@ "dev": true }, "node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "dev": true, + "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -7481,6 +6999,27 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -7500,12 +7039,13 @@ "dev": true }, "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -7514,6 +7054,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -7521,10 +7071,11 @@ "dev": true }, "node_modules/bowser": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz", - "integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==", - "dev": true + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "dev": true, + "license": "MIT" }, "node_modules/boxen": { "version": "5.1.2", @@ -7805,6 +7356,7 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -8262,6 +7814,20 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, + "node_modules/chromium-bidi": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz", + "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -8730,10 +8296,9 @@ "dev": true }, "node_modules/convert-svg-core": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/convert-svg-core/-/convert-svg-core-0.6.4.tgz", - "integrity": "sha512-8mS0n7otc1lljTte4z7nDhihEakKCRq4w5ivMnIGeOZuD/OV/eDZNNEgGLV1ET3p+rMbnrZnX4lAcsf14WzD5w==", - "deprecated": "version 0.6.4 and below are no longer supported", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/convert-svg-core/-/convert-svg-core-0.7.1.tgz", + "integrity": "sha512-qlQlT2pHMCG0NmZsh2yuYNYO9zKbOmHoWPT+ibuvpVjvA7l9aNhHS4debQeZGuR0mA4x/0a38zOTqBkkdYoTXQ==", "dev": true, "funding": [ { @@ -8745,107 +8310,21 @@ "url": "https://www.patreon.com/neocotic" } ], + "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "cheerio": "^1.0.0-rc.11", - "commander": "^9.2.0", - "file-url": "^3.0.0", - "get-stdin": "^8.0.0", - "glob": "^8.0.1", - "lodash.omit": "^4.5.0", - "lodash.pick": "^4.4.0", - "pollock": "^0.2.0", - "puppeteer": "^13.7.0", - "tmp": "^0.2.1" - }, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/convert-svg-core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/convert-svg-core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/convert-svg-core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/convert-svg-core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/convert-svg-core/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/convert-svg-core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/convert-svg-core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "cheerio": "^1.1.0", + "file-url": "^4.0.0", + "puppeteer-core": "^24.10.1", + "tmp": "^0.2.3" }, "engines": { - "node": ">=8" + "node": ">=22" } }, "node_modules/convert-svg-to-png": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/convert-svg-to-png/-/convert-svg-to-png-0.6.4.tgz", - "integrity": "sha512-zHNTuVedkyuhMl+f+HMm2L7+TKDYCKFAqAmDqUr0dN7/xtgYe76PPAydjlFzeLbzEpGtEfhaA15q+ejpLaVo3g==", - "deprecated": "version 0.6.4 and below are no longer supported", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/convert-svg-to-png/-/convert-svg-to-png-0.7.1.tgz", + "integrity": "sha512-XgLC/EmK0/GvdaHpCpEHCHL/ty/TDeezk8+AKWmUfEgUrYiwR9Tqrih9zfVWVzQYvn8mtjLvROv9xRQ7FHBo/Q==", "dev": true, "funding": [ { @@ -8857,14 +8336,12 @@ "url": "https://www.patreon.com/neocotic" } ], + "license": "MIT", "dependencies": { - "convert-svg-core": "^0.6.4" - }, - "bin": { - "convert-svg-to-png": "bin/convert-svg-to-png" + "convert-svg-core": "^0.7.1" }, "engines": { - "node": "^12.20.0 || >=14" + "node": ">=22" } }, "node_modules/cookie": { @@ -8923,6 +8400,82 @@ "node": ">= 0.10" } }, + "node_modules/cosmiconfig": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/coveralls": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", @@ -9081,6 +8634,16 @@ "node": ">=0.10" } }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -9139,10 +8702,11 @@ "dev": true }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -9277,11 +8841,59 @@ "node": ">=0.10.0" } }, - "node_modules/define-property/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "node_modules/define-property/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/degenerator/node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/degenerator/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -9324,16 +8936,18 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", - "dev": true + "version": "0.0.1608973", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1608973.tgz", + "integrity": "sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ==", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.1.tgz", + "integrity": "sha512-Z3u54A8qGyqFOSr2pk0ijYs8mOE9Qz8kTvtKeBI+upoG9j04Sq+oI7W8zAJiQybDcESET8/uIdHzs0p3k4fZlw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -10466,10 +10080,21 @@ } }, "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -10816,10 +10441,11 @@ } }, "node_modules/ethereumjs-util/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { "version": "0.1.3", @@ -10845,9 +10471,9 @@ } }, "node_modules/ethers": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz", - "integrity": "sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz", + "integrity": "sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==", "dev": true, "funding": [ { @@ -10859,7 +10485,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "peer": true, + "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", @@ -10878,7 +10504,6 @@ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "dev": true, - "peer": true, "engines": { "node": ">= 16" }, @@ -10891,7 +10516,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", "dev": true, - "peer": true, "dependencies": { "undici-types": "~6.19.2" } @@ -10900,8 +10524,7 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/ethjs-abi": { "version": "0.2.1", @@ -11014,6 +10637,16 @@ "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", "dev": true }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -11145,39 +10778,40 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -11215,12 +10849,13 @@ "dev": true }, "node_modules/express/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -11295,6 +10930,7 @@ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -11347,6 +10983,13 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -11413,10 +11056,11 @@ } }, "node_modules/fast-glob/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -11436,10 +11080,27 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-xml-builder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" + } + }, "node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", + "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", "dev": true, "funding": [ { @@ -11447,8 +11108,12 @@ "url": "https://github.com/sponsors/NaturalIntelligence" } ], + "license": "MIT", "dependencies": { - "strnum": "^2.1.0" + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.7", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" @@ -11468,6 +11133,7 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, + "license": "MIT", "dependencies": { "pend": "~1.2.0" } @@ -11509,12 +11175,16 @@ "optional": true }, "node_modules/file-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz", - "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/file-url/-/file-url-4.0.0.tgz", + "integrity": "sha512-vRCdScQ6j3Ku6Kd7W1kZk9c++5SqD6Xz5Jotrjr/nkY714M14RFHy/AAVA2WQvpsqVAVgTbDrYyBpU205F0cLw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/filename-regex": { @@ -11684,15 +11354,16 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, "funding": [ { @@ -11700,6 +11371,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -11755,10 +11427,11 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -11812,12 +11485,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -11983,18 +11650,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stdin-promise": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/get-stdin-promise/-/get-stdin-promise-0.1.1.tgz", @@ -12049,6 +11704,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -12156,19 +11826,21 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12417,10 +12089,11 @@ } }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -12470,14 +12143,15 @@ } }, "node_modules/hardhat": { - "version": "2.26.3", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.26.3.tgz", - "integrity": "sha512-gBfjbxCCEaRgMCRgTpjo1CEoJwqNPhyGMMVHYZJxoQ3LLftp2erSVf8ZF6hTQC0r2wst4NcqNmLWqMnHg1quTw==", + "version": "2.28.6", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.28.6.tgz", + "integrity": "sha512-zQze7qe+8ltwHvhX5NQ8sN1N37WWZGw8L63y+2XcPxGwAjc/SMF829z3NS6o1krX0sryhAsVBK/xrwUqlsot4Q==", "dev": true, + "license": "MIT", "dependencies": { "@ethereumjs/util": "^9.1.0", "@ethersproject/abi": "^5.1.2", - "@nomicfoundation/edr": "^0.11.3", + "@nomicfoundation/edr": "0.12.0-next.23", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "adm-zip": "^0.4.16", @@ -13235,6 +12909,30 @@ "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", "dev": true }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/http-response-object": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", @@ -13345,10 +13043,11 @@ } }, "node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", - "dev": true + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.8.tgz", + "integrity": "sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==", + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.1", @@ -13448,6 +13147,16 @@ "fp-ts": "^1.0.0" } }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -14161,10 +13870,11 @@ "dev": true }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -14197,6 +13907,13 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -14354,6 +14071,13 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -14404,10 +14128,11 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" }, "node_modules/lodash.assign": { "version": "4.2.0", @@ -14441,20 +14166,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.omit": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", - "deprecated": "This package is deprecated. Use destructuring assignment syntax instead.", - "dev": true - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "deprecated": "This package is deprecated. Use destructuring assignment syntax instead.", - "dev": true - }, "node_modules/log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", @@ -14914,10 +14625,11 @@ } }, "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.2.tgz", + "integrity": "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==", "dev": true, + "license": "MIT", "dependencies": { "dom-walk": "^0.1.0" } @@ -14935,10 +14647,11 @@ "dev": true }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14974,6 +14687,13 @@ "minipass": "^2.9.0" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -15011,12 +14731,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "node_modules/mkdirp-promise": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", @@ -15115,10 +14829,11 @@ } }, "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -15160,10 +14875,11 @@ } }, "node_modules/mocha/node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -15256,10 +14972,21 @@ } }, "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -15283,10 +15010,11 @@ } }, "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -15334,10 +15062,11 @@ } }, "node_modules/mocha/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -15516,6 +15245,16 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/netmask": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", + "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -15641,9 +15380,9 @@ } }, "node_modules/npm": { - "version": "10.9.3", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.3.tgz", - "integrity": "sha512-6Eh1u5Q+kIVXeA8e7l2c/HpnFFcwrkt37xDMujD5be1gloWa9p6j3Fsv3mByXXmqJHy+2cElRMML8opNT7xIJQ==", + "version": "10.9.8", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.8.tgz", + "integrity": "sha512-fYwb6ODSmHkqrJQQaCxY3M2lPf/mpgC7ik0HSzzIwG5CGtabRp4bNqikatvCoT42b5INQSqudVH0R7yVmC9hVg==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -15715,26 +15454,34 @@ "write-file-atomic" ], "dev": true, + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^8.0.1", + "@npmcli/arborist": "^8.0.5", "@npmcli/config": "^9.0.0", "@npmcli/fs": "^4.0.0", "@npmcli/map-workspaces": "^4.0.2", "@npmcli/package-json": "^6.2.0", - "@npmcli/promise-spawn": "^8.0.2", + "@npmcli/promise-spawn": "^8.0.3", "@npmcli/redact": "^3.2.2", "@npmcli/run-script": "^9.1.0", "@sigstore/tuf": "^3.1.1", "abbrev": "^3.0.1", "archy": "~1.0.0", "cacache": "^19.0.1", - "chalk": "^5.4.1", - "ci-info": "^4.2.0", + "chalk": "^5.6.2", + "ci-info": "^4.4.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^10.4.5", + "glob": "^10.5.0", "graceful-fs": "^4.2.11", "hosted-git-info": "^8.1.0", "ini": "^5.0.0", @@ -15742,46 +15489,46 @@ "is-cidr": "^5.1.1", "json-parse-even-better-errors": "^4.0.0", "libnpmaccess": "^9.0.0", - "libnpmdiff": "^7.0.1", - "libnpmexec": "^9.0.1", - "libnpmfund": "^6.0.1", + "libnpmdiff": "^7.0.5", + "libnpmexec": "^9.0.5", + "libnpmfund": "^6.0.5", "libnpmhook": "^11.0.0", "libnpmorg": "^7.0.0", - "libnpmpack": "^8.0.1", - "libnpmpublish": "^10.0.1", + "libnpmpack": "^8.0.5", + "libnpmpublish": "^10.0.2", "libnpmsearch": "^8.0.0", "libnpmteam": "^7.0.0", "libnpmversion": "^7.0.0", "make-fetch-happen": "^14.0.3", - "minimatch": "^9.0.5", - "minipass": "^7.1.1", + "minimatch": "^9.0.9", + "minipass": "^7.1.3", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^11.2.0", + "node-gyp": "^11.5.0", "nopt": "^8.1.0", - "normalize-package-data": "^7.0.0", + "normalize-package-data": "^7.0.1", "npm-audit-report": "^6.0.0", - "npm-install-checks": "^7.1.1", + "npm-install-checks": "^7.1.2", "npm-package-arg": "^12.0.2", "npm-pick-manifest": "^10.0.0", "npm-profile": "^11.0.1", "npm-registry-fetch": "^18.0.2", "npm-user-validate": "^3.0.0", - "p-map": "^7.0.3", + "p-map": "^7.0.4", "pacote": "^19.0.1", "parse-conflict-json": "^4.0.0", "proc-log": "^5.0.0", "qrcode-terminal": "^0.12.0", "read": "^4.1.0", - "semver": "^7.7.2", + "semver": "^7.7.4", "spdx-expression-parse": "^4.0.0", "ssri": "^12.0.0", "supports-color": "^9.4.0", - "tar": "^6.2.1", + "tar": "^7.5.11", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", - "validate-npm-package-name": "^6.0.1", + "validate-npm-package-name": "^6.0.2", "which": "^5.0.0", "write-file-atomic": "^6.0.0" }, @@ -15832,7 +15579,7 @@ } }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", + "version": "6.2.2", "dev": true, "inBundle": true, "license": "MIT", @@ -15867,12 +15614,12 @@ } }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", + "version": "7.2.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -15916,7 +15663,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "8.0.1", + "version": "8.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -15951,6 +15698,7 @@ "proggy": "^3.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", + "promise-retry": "^2.0.1", "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", "ssri": "^12.0.0", @@ -16062,7 +15810,7 @@ } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote": { - "version": "20.0.0", + "version": "20.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -16083,7 +15831,7 @@ "promise-retry": "^2.0.1", "sigstore": "^3.0.0", "ssri": "^12.0.0", - "tar": "^6.1.11" + "tar": "^7.5.10" }, "bin": { "pacote": "bin/index.js" @@ -16129,7 +15877,7 @@ } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "8.0.2", + "version": "8.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -16188,6 +15936,27 @@ "node": ">=14" } }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { "version": "0.4.3", "dev": true, @@ -16197,14 +15966,45 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/npm/node_modules/@sigstore/tuf": { "version": "3.1.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.4.1", - "tuf-js": "^3.0.1" + "@sigstore/protobuf-specs": "^0.4.1", + "tuf-js": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.1" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -16229,7 +16029,7 @@ } }, "node_modules/npm/node_modules/agent-base": { - "version": "7.1.3", + "version": "7.1.4", "dev": true, "inBundle": true, "license": "MIT", @@ -16247,7 +16047,7 @@ } }, "node_modules/npm/node_modules/ansi-styles": { - "version": "6.2.1", + "version": "6.2.3", "dev": true, "inBundle": true, "license": "MIT", @@ -16259,7 +16059,7 @@ } }, "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", + "version": "2.1.0", "dev": true, "inBundle": true, "license": "ISC" @@ -16336,58 +16136,8 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/cacache/node_modules/chownr": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/cacache/node_modules/mkdirp": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/cacache/node_modules/tar": { - "version": "7.4.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/cacache/node_modules/yallist": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/npm/node_modules/chalk": { - "version": "5.4.1", + "version": "5.6.2", "dev": true, "inBundle": true, "license": "MIT", @@ -16399,16 +16149,16 @@ } }, "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", + "version": "3.0.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/npm/node_modules/ci-info": { - "version": "4.2.0", + "version": "4.4.0", "dev": true, "funding": [ { @@ -16522,7 +16272,7 @@ } }, "node_modules/npm/node_modules/debug": { - "version": "4.4.1", + "version": "4.4.3", "dev": true, "inBundle": true, "license": "MIT", @@ -16539,7 +16289,7 @@ } }, "node_modules/npm/node_modules/diff": { - "version": "5.2.0", + "version": "5.2.2", "dev": true, "inBundle": true, "license": "BSD-3-Clause", @@ -16585,7 +16335,7 @@ "license": "MIT" }, "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.2", + "version": "3.1.3", "dev": true, "inBundle": true, "license": "Apache-2.0" @@ -16599,6 +16349,23 @@ "node": ">= 4.9.1" } }, + "node_modules/npm/node_modules/fdir": { + "version": "6.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/npm/node_modules/foreground-child": { "version": "3.3.1", "dev": true, @@ -16628,7 +16395,7 @@ } }, "node_modules/npm/node_modules/glob": { - "version": "10.4.5", + "version": "10.5.0", "dev": true, "inBundle": true, "license": "ISC", @@ -16759,14 +16526,10 @@ } }, "node_modules/npm/node_modules/ip-address": { - "version": "9.0.5", + "version": "10.1.0", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, "engines": { "node": ">= 12" } @@ -16828,7 +16591,6 @@ "node_modules/npm/node_modules/jsbn": { "version": "1.1.0", "dev": true, - "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/json-parse-even-better-errors": { @@ -16884,31 +16646,31 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "7.0.1", + "version": "7.0.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^8.0.1", + "@npmcli/arborist": "^8.0.5", "@npmcli/installed-package-contents": "^3.0.0", "binary-extensions": "^2.3.0", "diff": "^5.1.0", "minimatch": "^9.0.4", "npm-package-arg": "^12.0.0", "pacote": "^19.0.0", - "tar": "^6.2.1" + "tar": "^7.5.11" }, "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "9.0.1", + "version": "9.0.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^8.0.1", + "@npmcli/arborist": "^8.0.5", "@npmcli/run-script": "^9.0.1", "ci-info": "^4.0.0", "npm-package-arg": "^12.0.0", @@ -16924,12 +16686,12 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "6.0.1", + "version": "6.0.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^8.0.1" + "@npmcli/arborist": "^8.0.5" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -16962,12 +16724,12 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "8.0.1", + "version": "8.0.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^8.0.1", + "@npmcli/arborist": "^8.0.5", "@npmcli/run-script": "^9.0.1", "npm-package-arg": "^12.0.0", "pacote": "^19.0.0" @@ -16977,7 +16739,7 @@ } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "10.0.1", + "version": "10.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -17064,22 +16826,13 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/npm/node_modules/minimatch": { - "version": "9.0.5", + "version": "9.0.9", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -17089,10 +16842,10 @@ } }, "node_modules/npm/node_modules/minipass": { - "version": "7.1.2", + "version": "7.1.3", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -17150,6 +16903,12 @@ "node": ">=8" } }, + "node_modules/npm/node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, "node_modules/npm/node_modules/minipass-pipeline": { "version": "1.2.4", "dev": true, @@ -17174,6 +16933,12 @@ "node": ">=8" } }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, "node_modules/npm/node_modules/minipass-sized": { "version": "1.0.3", "dev": true, @@ -17198,8 +16963,14 @@ "node": ">=8" } }, + "node_modules/npm/node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, "node_modules/npm/node_modules/minizlib": { - "version": "3.0.2", + "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", @@ -17210,18 +16981,6 @@ "node": ">= 18" } }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm/node_modules/ms": { "version": "2.1.3", "dev": true, @@ -17237,8 +16996,17 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/npm/node_modules/negotiator": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/npm/node_modules/node-gyp": { - "version": "11.2.0", + "version": "11.5.0", "dev": true, "inBundle": true, "license": "MIT", @@ -17261,56 +17029,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/chownr": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/mkdirp": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/tar": { - "version": "7.4.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/yallist": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/npm/node_modules/nopt": { "version": "8.1.0", "dev": true, @@ -17327,7 +17045,7 @@ } }, "node_modules/npm/node_modules/normalize-package-data": { - "version": "7.0.0", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -17362,7 +17080,7 @@ } }, "node_modules/npm/node_modules/npm-install-checks": { - "version": "7.1.1", + "version": "7.1.2", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -17466,7 +17184,7 @@ } }, "node_modules/npm/node_modules/p-map": { - "version": "7.0.3", + "version": "7.0.4", "dev": true, "inBundle": true, "license": "MIT", @@ -17484,7 +17202,7 @@ "license": "BlueOak-1.0.0" }, "node_modules/npm/node_modules/pacote": { - "version": "19.0.1", + "version": "19.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -17505,7 +17223,7 @@ "promise-retry": "^2.0.1", "sigstore": "^3.0.0", "ssri": "^12.0.0", - "tar": "^6.1.11" + "tar": "^7.5.10" }, "bin": { "pacote": "bin/index.js" @@ -17553,8 +17271,20 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/npm/node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "7.1.0", + "version": "7.1.1", "dev": true, "inBundle": true, "license": "MIT", @@ -17686,7 +17416,7 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.7.2", + "version": "7.7.4", "dev": true, "inBundle": true, "license": "ISC", @@ -17738,62 +17468,10 @@ "dependencies": { "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "@sigstore/sign": "^3.1.0", - "@sigstore/tuf": "^3.1.0", - "@sigstore/verify": "^2.1.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.4.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.0", - "make-fetch-happen": "^14.0.2", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify": { - "version": "2.1.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^3.1.0", - "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.4.1" + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -17810,12 +17488,12 @@ } }, "node_modules/npm/node_modules/socks": { - "version": "2.8.5", + "version": "2.8.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -17874,7 +17552,7 @@ } }, "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.21", + "version": "3.0.23", "dev": true, "inBundle": true, "license": "CC0-1.0" @@ -17882,7 +17560,6 @@ "node_modules/npm/node_modules/sprintf-js": { "version": "1.1.3", "dev": true, - "inBundle": true, "license": "BSD-3-Clause" }, "node_modules/npm/node_modules/ssri": { @@ -17964,78 +17641,19 @@ } }, "node_modules/npm/node_modules/tar": { - "version": "6.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", + "version": "7.5.11", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, "node_modules/npm/node_modules/text-table": { @@ -18051,13 +17669,13 @@ "license": "MIT" }, "node_modules/npm/node_modules/tinyglobby": { - "version": "0.2.14", + "version": "0.2.15", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -18066,32 +17684,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "dev": true, - "inBundle": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/npm/node_modules/treeverse": { "version": "3.0.0", "dev": true, @@ -18102,14 +17694,14 @@ } }, "node_modules/npm/node_modules/tuf-js": { - "version": "3.0.1", + "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@tufjs/models": "3.0.1", - "debug": "^4.3.6", - "make-fetch-happen": "^14.0.1" + "debug": "^4.4.1", + "make-fetch-happen": "^14.0.3" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -18179,7 +17771,7 @@ } }, "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "6.0.1", + "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -18209,12 +17801,12 @@ } }, "node_modules/npm/node_modules/which/node_modules/isexe": { - "version": "3.1.1", + "version": "3.1.5", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/npm/node_modules/wrap-ansi": { @@ -18268,7 +17860,7 @@ } }, "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", + "version": "6.2.2", "dev": true, "inBundle": true, "license": "MIT", @@ -18303,12 +17895,12 @@ } }, "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", + "version": "7.2.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -18331,10 +17923,13 @@ } }, "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } }, "node_modules/nth-check": { "version": "2.1.1", @@ -18746,6 +18341,64 @@ "node": ">=6" } }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", @@ -18922,6 +18575,22 @@ "node": ">=8" } }, + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -18947,10 +18616,11 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", @@ -19034,7 +18704,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/performance-now": { "version": "2.1.0", @@ -19049,10 +18720,11 @@ "dev": true }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -19099,24 +18771,6 @@ "node": ">= 6" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pollock": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/pollock/-/pollock-0.2.1.tgz", - "integrity": "sha512-2Xy6LImSXm0ANKv9BKSVuCa6Z4ACbK7oUrl9gtUgqLkekL7n9C0mlWsOGYYuGbCG8xT0x3Q4F31C3ZMyVQjwsg==", - "dev": true - }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -19222,6 +18876,7 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -19268,11 +18923,76 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-agent/node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/pseudomap": { "version": "1.0.2", @@ -19321,64 +19041,58 @@ } }, "node_modules/puppeteer": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.7.0.tgz", - "integrity": "sha512-U1uufzBjz3+PkpCxFrWzh4OrMIdIb2ztzCu0YEPfRHjHswcSwHZswnK+WdsOQJsRV8WeTg3jLhJR4D867+fjsA==", - "deprecated": "< 24.9.0 is no longer supported", + "version": "24.43.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.43.1.tgz", + "integrity": "sha512-/FSOViCrqRdb1HDocpsM9Z1giA71gTQPUt3SpHGVRALKAy/rJr1fLFYZW9F23qPxqVxTHQnbh/5B5opJST3kAw==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.981744", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.5.0" + "@puppeteer/browsers": "2.13.2", + "chromium-bidi": "14.0.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1608973", + "puppeteer-core": "24.43.1", + "typed-query-selector": "^2.12.2" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" }, "engines": { - "node": ">=10.18.1" + "node": ">=18" } }, - "node_modules/puppeteer/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/puppeteer-core": { + "version": "24.43.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.43.1.tgz", + "integrity": "sha512-T5ScUMAsmhdNbgDR41AGESYeS6V9MSgetkSnVhhW+gXvzC42VesKCn5ld87gAZDJ6vLHL9GkRvY9WtQWSnwFbw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "ms": "2.1.2" + "@puppeteer/browsers": "2.13.2", + "chromium-bidi": "14.0.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1608973", + "typed-query-selector": "^2.12.2", + "webdriver-bidi-protocol": "0.4.1", + "ws": "^8.20.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=18" } }, - "node_modules/puppeteer/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/puppeteer/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "node_modules/puppeteer-core/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -19406,10 +19120,11 @@ ] }, "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", + "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.6" } @@ -19511,18 +19226,40 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/raw-body/node_modules/iconv-lite": { @@ -19537,6 +19274,16 @@ "node": ">=0.10.0" } }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -20414,10 +20161,11 @@ } }, "node_modules/rlp/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/rsvp": { "version": "3.6.2", @@ -21188,10 +20936,11 @@ } }, "node_modules/sloc/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -21211,6 +20960,17 @@ "node": ">=8.10.0" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/snake-case": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", @@ -21347,6 +21107,46 @@ "node": ">=0.10.0" } }, + "node_modules/socks": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/sol-digger": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/sol-digger/-/sol-digger-0.0.2.tgz", @@ -21360,23 +21160,25 @@ "dev": true }, "node_modules/sol2uml": { - "version": "2.5.22", - "resolved": "https://registry.npmjs.org/sol2uml/-/sol2uml-2.5.22.tgz", - "integrity": "sha512-0Hy2dNwVUKUCRnqkl82oGlW2ygngvFwonSRiqUTA8K6Li0E8ly6tU1jzwfx4863cinwpskOwXCnghP+g3A96Ug==", + "version": "2.5.26", + "resolved": "https://registry.npmjs.org/sol2uml/-/sol2uml-2.5.26.tgz", + "integrity": "sha512-lq7ktw4yLDcgF8em5NXaCyKJmd6qgDIxSG/onWT4CGLQeWufauBnGHuTRf/yYY1DCPmpF9PENQ5hcRPSAIqRcg==", "dev": true, + "license": "MIT", "dependencies": { "@aduh95/viz.js": "^3.7.0", "@solidity-parser/parser": "^0.20.1", - "axios": "^1.10.0", + "axios": "^1.13.6", "axios-debug-log": "^1.0.0", "cli-color": "^2.0.4", "commander": "^12.1.0", - "convert-svg-to-png": "^0.6.4", + "convert-svg-to-png": "^0.7.1", "debug": "^4.4.1", "diff-match-patch": "^1.0.5", - "ethers": "^5.8.0", + "ethers": "^6.16.0", "js-graph-algorithms": "^1.0.18", - "klaw": "^4.1.0" + "klaw": "^4.1.0", + "puppeteer": "^24.37.5" }, "bin": { "sol2uml": "lib/sol2uml.js" @@ -21397,59 +21199,12 @@ "node": ">=18" } }, - "node_modules/sol2uml/node_modules/ethers": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", - "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "5.8.0", - "@ethersproject/abstract-provider": "5.8.0", - "@ethersproject/abstract-signer": "5.8.0", - "@ethersproject/address": "5.8.0", - "@ethersproject/base64": "5.8.0", - "@ethersproject/basex": "5.8.0", - "@ethersproject/bignumber": "5.8.0", - "@ethersproject/bytes": "5.8.0", - "@ethersproject/constants": "5.8.0", - "@ethersproject/contracts": "5.8.0", - "@ethersproject/hash": "5.8.0", - "@ethersproject/hdnode": "5.8.0", - "@ethersproject/json-wallets": "5.8.0", - "@ethersproject/keccak256": "5.8.0", - "@ethersproject/logger": "5.8.0", - "@ethersproject/networks": "5.8.0", - "@ethersproject/pbkdf2": "5.8.0", - "@ethersproject/properties": "5.8.0", - "@ethersproject/providers": "5.8.0", - "@ethersproject/random": "5.8.0", - "@ethersproject/rlp": "5.8.0", - "@ethersproject/sha2": "5.8.0", - "@ethersproject/signing-key": "5.8.0", - "@ethersproject/solidity": "5.8.0", - "@ethersproject/strings": "5.8.0", - "@ethersproject/transactions": "5.8.0", - "@ethersproject/units": "5.8.0", - "@ethersproject/wallet": "5.8.0", - "@ethersproject/web": "5.8.0", - "@ethersproject/wordlists": "5.8.0" - } - }, "node_modules/solc": { - "version": "0.8.30", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.30.tgz", - "integrity": "sha512-9Srk/gndtBmoUbg4CE6ypAzPQlElv8ntbnl6SigUBAzgXKn35v87sj04uZeoZWjtDkdzT0qKFcIo/wl63UMxdw==", + "version": "0.8.35", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.35.tgz", + "integrity": "sha512-OaP/4zyoKRo2CjqZDxbtkeRlEo6MxP4FLCxntw1Agf9OSoecmwYKoFBSB34UcSKBFBucrTh3Mb0nRoJou62ibw==", "dev": true, + "license": "MIT", "dependencies": { "command-exists": "^1.2.8", "commander": "^8.1.0", @@ -21543,10 +21298,11 @@ } }, "node_modules/solidity-coverage": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.16.tgz", - "integrity": "sha512-qKqgm8TPpcnCK0HCDLJrjbOA2tQNEJY4dHX/LSSQ9iwYFS973MwjtgYn2Iv3vfCEQJTj5xtm4cuUMzlJsJSMbg==", + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.17.tgz", + "integrity": "sha512-5P8vnB6qVX9tt1MfuONtCTEaEGO/O4WuEidPHIAJjx4sktHHKhO3rFvnE0q8L30nWJPTrcqGQMT7jpE29B2qow==", "dev": true, + "license": "ISC", "dependencies": { "@ethersproject/abi": "^5.0.9", "@solidity-parser/parser": "^0.20.1", @@ -22331,6 +22087,18 @@ "node": ">= 0.4" } }, + "node_modules/streamx": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.27.0.tgz", + "integrity": "sha512-WZ189TKnHoAokYHvwzaAQMpd55cgUmFIcJFzBSgGcb886jau5DL+XdDhTWV4ps3FLvk+OORp0dLRTPsLZ21CSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, "node_modules/strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -22483,16 +22251,17 @@ } }, "node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz", + "integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" } - ] + ], + "license": "MIT" }, "node_modules/supports-color": { "version": "5.5.0", @@ -22789,31 +22558,41 @@ } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", + "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", "dev": true, + "license": "MIT", "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", + "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", "dev": true, + "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" } }, "node_modules/temp": { @@ -22832,6 +22611,16 @@ "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on.", "dev": true }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -22883,12 +22672,6 @@ "node": ">= 0.12" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "node_modules/timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -22938,10 +22721,11 @@ } }, "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.14" } @@ -23240,6 +23024,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-query-selector": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.2.tgz", + "integrity": "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==", + "dev": true, + "license": "MIT" + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -23292,21 +23083,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, "node_modules/undici": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.15.0.tgz", - "integrity": "sha512-7oZJCPvvMvTd0OlqWsIxTuItTpJBpU1tcbVl24FMn3xt3+VSunwUasmfPJRE57oNO1KsZ4PgA1xTdAX4hq8NyQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.2.tgz", + "integrity": "sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==", "dev": true, + "license": "MIT", "engines": { "node": ">=20.18.1" } @@ -23696,10 +23478,11 @@ } }, "node_modules/web3-core-helpers/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-core-helpers/node_modules/web3-utils": { "version": "1.10.0", @@ -23736,10 +23519,11 @@ } }, "node_modules/web3-core-method/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-core-method/node_modules/web3-core-helpers": { "version": "1.10.4", @@ -23808,10 +23592,11 @@ } }, "node_modules/web3-core-requestmanager/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-core-requestmanager/node_modules/web3-core-helpers": { "version": "1.10.4", @@ -23853,10 +23638,11 @@ } }, "node_modules/web3-core-subscriptions/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-core-subscriptions/node_modules/web3-core-helpers": { "version": "1.10.4", @@ -23900,10 +23686,11 @@ } }, "node_modules/web3-core/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-core/node_modules/web3-core-helpers": { "version": "1.10.4", @@ -23968,10 +23755,11 @@ } }, "node_modules/web3-eth-abi/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-eth-abi/node_modules/web3-utils": { "version": "1.10.0", @@ -24152,10 +23940,11 @@ } }, "node_modules/web3-eth-accounts/node_modules/web3-eth-iban/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-eth-contract": { "version": "1.10.4", @@ -24177,10 +23966,11 @@ } }, "node_modules/web3-eth-contract/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-eth-contract/node_modules/web3-core-helpers": { "version": "1.10.4", @@ -24253,10 +24043,11 @@ } }, "node_modules/web3-eth-ens/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-eth-ens/node_modules/web3-core-helpers": { "version": "1.10.4", @@ -24323,10 +24114,11 @@ } }, "node_modules/web3-eth-iban/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-eth-iban/node_modules/web3-utils": { "version": "1.10.0", @@ -24370,10 +24162,11 @@ "dev": true }, "node_modules/web3-eth-personal/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-eth-personal/node_modules/web3-core-helpers": { "version": "1.10.4", @@ -24402,10 +24195,11 @@ } }, "node_modules/web3-eth/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-eth/node_modules/web3-core-helpers": { "version": "1.10.4", @@ -24476,10 +24270,11 @@ } }, "node_modules/web3-providers-http/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-providers-http/node_modules/cross-fetch": { "version": "4.1.0", @@ -24550,10 +24345,11 @@ } }, "node_modules/web3-providers-ipc/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-providers-ipc/node_modules/web3-core-helpers": { "version": "1.10.4", @@ -24596,10 +24392,11 @@ } }, "node_modules/web3-providers-ws/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-providers-ws/node_modules/web3-core-helpers": { "version": "1.10.4", @@ -24740,10 +24537,11 @@ } }, "node_modules/web3-utils/node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", + "dev": true, + "license": "MIT" }, "node_modules/web3-utils/node_modules/ethereum-cryptography": { "version": "2.2.1", @@ -24757,6 +24555,13 @@ "@scure/bip39": "1.3.0" } }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz", + "integrity": "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -25132,7 +24937,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -25185,6 +24989,22 @@ "xhr-request": "^1.1.0" } }, + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", @@ -25331,6 +25151,7 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -25347,6 +25168,16 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index ba65bb4..196ce31 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "surya": "^0.4.11" }, "dependencies": { - "@openzeppelin/contracts": "5.4.0", - "@openzeppelin/contracts-upgradeable": "^5.4.0" + "@openzeppelin/contracts": "5.6.1", + "@openzeppelin/contracts-upgradeable": "5.6.1" } } diff --git a/test/CMTATInternalSnapshotBase.behavior.js b/test/CMTATInternalSnapshotBase.behavior.js new file mode 100644 index 0000000..f44f0a5 --- /dev/null +++ b/test/CMTATInternalSnapshotBase.behavior.js @@ -0,0 +1,31 @@ +const { expect } = require('chai') + +function registerCmtatInternalSnapshotBasePassThroughSuites () { + describe('CMTATInternalSnapshotBase pass-through overrides', function () { + it('forwards approve() to the CMTAT base implementation', async function () { + await this.cmtat.connect(this.address1).approve(this.address2, 7) + + expect(await this.cmtat.allowance(this.address1, this.address2)).to.equal(7) + }) + + it('forwards transferFrom() to the CMTAT base implementation', async function () { + await this.cmtat.connect(this.admin).mint(this.address1, 10) + await this.cmtat.connect(this.address1).approve(this.address2, 4) + await this.cmtat.connect(this.address2).transferFrom(this.address1, this.address3, 3) + + expect(await this.cmtat.balanceOf(this.address1)).to.equal(7) + expect(await this.cmtat.balanceOf(this.address3)).to.equal(3) + expect(await this.cmtat.allowance(this.address1, this.address2)).to.equal(1) + }) + + it('forwards metadata accessors to the CMTAT base implementation', async function () { + expect(await this.cmtat.decimals()).to.equal(0) + expect(await this.cmtat.name()).to.equal('Security Token') + expect(await this.cmtat.symbol()).to.equal('ST') + }) + }) +} + +module.exports = { + registerCmtatInternalSnapshotBasePassThroughSuites +} diff --git a/test/CMTATSnapshot.test.js b/test/CMTATSnapshot.test.js index dfbe9a4..69902dc 100644 --- a/test/CMTATSnapshot.test.js +++ b/test/CMTATSnapshot.test.js @@ -1,49 +1,24 @@ -const ERC20SnapshotModuleCommonRescheduling = require('./ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonRescheduling') -const ERC20SnapshotModuleCommonScheduling = require('./ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonScheduling') -const ERC20SnapshotModuleCommonUnschedule = require('./ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonUnschedule') -const ERC20SnapshotModuleCommonGetNextSnapshot = require('./ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonGetNextSnapshot') -const ERC20SnapshotModuleMultiplePlannedTest = require('./ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleMultiplePlannedTest') -const ERC20SnapshotModuleOnePlannedSnapshotTest = require('./ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleOnePlannedSnapshotTest') -const ERC20SnapshotModuleZeroPlannedSnapshotTest = require('./ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleZeroPlannedSnapshot') -const { ethers, upgrades } = require("hardhat"); -const { ZeroAddress, keccak256, toUtf8Bytes } = require("ethers"); const { - fixture, - loadFixture -} = require('../CMTAT/test/deploymentUtils') -const { zeroAddress } = require('ethereumjs-util') -describe('CMTAT Snapshot Upgradeable', function () { + registerCmtatInternalSnapshotBasePassThroughSuites +} = require('./CMTATInternalSnapshotBase.behavior') +const { + registerSnapshotCommonSuites +} = require('./ERC20SnapshotModuleCommon/registerSnapshotCommonSuites') +const { ethers, upgrades } = require('hardhat') +const { fixture, loadFixture } = require('../CMTAT/test/deploymentUtils') +const { buildCmtatInitParams } = require('./helpers/cmtatInitParams') +describe('CMTAT Internal Snapshot Upgradeable', function () { beforeEach(async function () { - const ruleEngine = ZeroAddress; - const snapshotEngine = ZeroAddress; - const documentEngine = ZeroAddress; - const ERC20Attributes = { - name: "Security Token", - symbol: "ST", - decimalsIrrevocable: 0 // Compliant with CMTAT spec but can be different - }; - - const terms = { - name: "Token Terms v1", - uri: "https://cmta.ch/standards/cmta-token-cmtat", - documentHash: keccak256(toUtf8Bytes("terms-v1")) - }; - - const extraInformationAttributes = { - tokenId: "1234567890", // ISIN or identifier - terms: terms, - information: "CMTAT smart contract" - }; - - const engines = { - ruleEngine: ruleEngine, - snapshotEngine: snapshotEngine, - documentEngine: documentEngine - }; + this.snapshotAdminMode = 'access-control' + const { + ERC20Attributes, + extraInformationAttributes, + engines + } = buildCmtatInitParams() Object.assign(this, await loadFixture(fixture)) const ETHERS_CMTAT_PROXY_FACTORY = await ethers.getContractFactory( - 'CMTATUpgradeableSnapshot' + 'CMTATUpgradeableInternalSnapshot' ) this.cmtat = await upgrades.deployProxy( ETHERS_CMTAT_PROXY_FACTORY, @@ -61,11 +36,6 @@ describe('CMTAT Snapshot Upgradeable', function () { ) this.transferEngineMock = this.cmtat }) - ERC20SnapshotModuleMultiplePlannedTest() - ERC20SnapshotModuleOnePlannedSnapshotTest() - ERC20SnapshotModuleZeroPlannedSnapshotTest() - ERC20SnapshotModuleCommonRescheduling() - ERC20SnapshotModuleCommonScheduling() - ERC20SnapshotModuleCommonUnschedule() - ERC20SnapshotModuleCommonGetNextSnapshot() + registerSnapshotCommonSuites() + registerCmtatInternalSnapshotBasePassThroughSuites() }) diff --git a/test/CMTATStandaloneSnapshot.test.js b/test/CMTATStandaloneSnapshot.test.js new file mode 100644 index 0000000..1602675 --- /dev/null +++ b/test/CMTATStandaloneSnapshot.test.js @@ -0,0 +1,39 @@ +const { ethers } = require('hardhat') +const { + registerCmtatInternalSnapshotBasePassThroughSuites +} = require('./CMTATInternalSnapshotBase.behavior') +const { + registerSnapshotCommonSuites +} = require('./ERC20SnapshotModuleCommon/registerSnapshotCommonSuites') +const { + deployCMTATStandaloneWithParameter, + fixture, + loadFixture +} = require('../CMTAT/test/deploymentUtils') +const { buildCmtatInitParams } = require('./helpers/cmtatInitParams') + +describe('SnapshotEngine CMTAT Standalone', function () { + beforeEach(async function () { + this.snapshotAdminMode = 'access-control' + const { + ERC20Attributes, + extraInformationAttributes, + engines + } = buildCmtatInitParams() + + Object.assign(this, await loadFixture(fixture)) + this.cmtat = await ethers.deployContract( + 'CMTATStandaloneInternalSnapshot', + [ + this.admin.address, + ERC20Attributes, + extraInformationAttributes, + engines + ] + ) + this.transferEngineMock = this.cmtat + }) + + registerSnapshotCommonSuites() + registerCmtatInternalSnapshotBasePassThroughSuites() +}) diff --git a/test/ERC20SnapshotModule.test.js b/test/ERC20SnapshotModule.test.js index 6f86463..07a1463 100644 --- a/test/ERC20SnapshotModule.test.js +++ b/test/ERC20SnapshotModule.test.js @@ -1,32 +1,69 @@ -const ERC20SnapshotModuleCommonRescheduling = require('./ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonRescheduling') -const ERC20SnapshotModuleCommonScheduling = require('./ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonScheduling') -const ERC20SnapshotModuleCommonUnschedule = require('./ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonUnschedule') -const ERC20SnapshotModuleCommonGetNextSnapshot = require('./ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonGetNextSnapshot') -const ERC20SnapshotModuleMultiplePlannedTest = require('./ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleMultiplePlannedTest') -const ERC20SnapshotModuleOnePlannedSnapshotTest = require('./ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleOnePlannedSnapshotTest') -const ERC20SnapshotModuleZeroPlannedSnapshotTest = require('./ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleZeroPlannedSnapshot') +const { time } = require('@nomicfoundation/hardhat-network-helpers') +const { expect } = require('chai') +const { + registerSnapshotCommonSuites +} = require('./ERC20SnapshotModuleCommon/registerSnapshotCommonSuites') const { - deployCMTATStandalone, fixture, loadFixture } = require('../CMTAT/test/deploymentUtils') +const { + checkSnapshot +} = require('./ERC20SnapshotModuleCommon/ERC20SnapshotModuleUtils/ERC20SnapshotModuleUtils') +const { deployExternalSnapshotCmtat } = require('./helpers/deployExternalSnapshotCmtat') describe('Standard - ERC20SnapshotModule', function () { beforeEach(async function () { Object.assign(this, await loadFixture(fixture)) - this.cmtat = await deployCMTATStandalone( + this.snapshotAdminMode = 'access-control' + this.cmtat = await deployExternalSnapshotCmtat( this._.address, - this.admin.address, - this.deployerAddress.address + this.admin.address ) - this.transferEngineMock = await ethers.deployContract('SnapshotEngine', [ - this.cmtat.target, this.admin]) - this.cmtat.connect(this.admin).setSnapshotEngine(this.transferEngineMock) + this.transferEngineMock = await ethers.deployContract('SnapshotEngine', [ + this.cmtat.target, this.admin + ]) + await this.cmtat.connect(this.admin).setSnapshotEngine(this.transferEngineMock) + }) + + context('Compatibility with RuleEngineMock', function () { + it('supports using the CMTAT mock rule engine together with the external snapshot engine', async function () { + const ADDRESSES = [this.address1, this.address2] + const INITIAL_BALANCE_1 = '31' + const INITIAL_BALANCE_2 = '32' + const TRANSFER_AMOUNT = '5' + + await this.cmtat.connect(this.admin).mint(this.address1, INITIAL_BALANCE_1) + await this.cmtat.connect(this.admin).mint(this.address2, INITIAL_BALANCE_2) + + this.ruleEngineMock = await ethers.deployContract('CMTAT_RULE_ENGINE_MOCK', [this.admin]) + await this.cmtat.connect(this.admin).setRuleEngine(this.ruleEngineMock) + + expect(await this.cmtat.ruleEngine()).to.equal(this.ruleEngineMock.target) + + const currentTime = await time.latest() + const snapshotTime = currentTime + time.duration.seconds(3) + await this.transferEngineMock.connect(this.admin).scheduleSnapshot(snapshotTime) + await time.increase(time.duration.seconds(10)) + + await this.cmtat.connect(this.address1).transfer(this.address2, TRANSFER_AMOUNT) + + await checkSnapshot.call( + this, + snapshotTime, + '63', + ADDRESSES, + [INITIAL_BALANCE_1, INITIAL_BALANCE_2] + ) + await checkSnapshot.call( + this, + await time.latest(), + '63', + ADDRESSES, + ['26', '37'] + ) + expect((await this.transferEngineMock.getNextSnapshots()).length).to.equal(0) + }) }) - ERC20SnapshotModuleMultiplePlannedTest() - ERC20SnapshotModuleOnePlannedSnapshotTest() - ERC20SnapshotModuleZeroPlannedSnapshotTest() - ERC20SnapshotModuleCommonRescheduling() - ERC20SnapshotModuleCommonScheduling() - ERC20SnapshotModuleCommonUnschedule() - ERC20SnapshotModuleCommonGetNextSnapshot() + + registerSnapshotCommonSuites() }) diff --git a/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonExact.js b/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonExact.js new file mode 100644 index 0000000..f8d50ca --- /dev/null +++ b/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonExact.js @@ -0,0 +1,55 @@ +const { time } = require('@nomicfoundation/hardhat-network-helpers') +const { expect } = require('chai') + +function ERC20SnapshotModuleCommonExact () { + context('Exact snapshot queries', function () { + beforeEach(async function () { + this.currentTime = await time.latest() + // Keep enough margin to avoid same-block "scheduled in the past" edge cases. + this.snapshotTime = this.currentTime + time.duration.seconds(30) + this.nonScheduledTime = this.currentTime + time.duration.seconds(31) + }) + + it('snapshotExists returns true only for exact scheduled times', async function () { + await this.transferEngineMock.connect(this.admin).scheduleSnapshot(this.snapshotTime) + + expect(await this.transferEngineMock.snapshotExists(this.snapshotTime)).to.equal(true) + expect(await this.transferEngineMock.snapshotExists(this.nonScheduledTime)).to.equal(false) + }) + + it('exact queries revert for non-scheduled timestamps', async function () { + await this.transferEngineMock.connect(this.admin).scheduleSnapshot(this.snapshotTime) + + await expect( + this.transferEngineMock.snapshotBalanceOfExact(this.nonScheduledTime, this.address1) + ).to.be.revertedWithCustomError( + this.transferEngineMock, + 'SnapshotEngine_SnapshotNotFound' + ) + + await expect( + this.transferEngineMock.snapshotTotalSupplyExact(this.nonScheduledTime) + ).to.be.revertedWithCustomError( + this.transferEngineMock, + 'SnapshotEngine_SnapshotNotFound' + ) + }) + + it('exact queries match legacy queries for scheduled timestamps', async function () { + await this.cmtat.connect(this.admin).mint(this.address1, 100) + await this.transferEngineMock.connect(this.admin).scheduleSnapshot(this.snapshotTime) + await time.increase(time.duration.seconds(10)) + await this.cmtat.connect(this.admin).mint(this.address1, 50) + + const legacyBalance = await this.transferEngineMock.snapshotBalanceOf(this.snapshotTime, this.address1) + const exactBalance = await this.transferEngineMock.snapshotBalanceOfExact(this.snapshotTime, this.address1) + expect(exactBalance).to.equal(legacyBalance) + + const legacyTotalSupply = await this.transferEngineMock.snapshotTotalSupply(this.snapshotTime) + const exactTotalSupply = await this.transferEngineMock.snapshotTotalSupplyExact(this.snapshotTime) + expect(exactTotalSupply).to.equal(legacyTotalSupply) + }) + }) +} + +module.exports = ERC20SnapshotModuleCommonExact diff --git a/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonMaterialized.js b/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonMaterialized.js new file mode 100644 index 0000000..ff207d3 --- /dev/null +++ b/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonMaterialized.js @@ -0,0 +1,48 @@ +const { time } = require('@nomicfoundation/hardhat-network-helpers') +const { anyValue } = require('@nomicfoundation/hardhat-chai-matchers/withArgs') +const { expect } = require('chai') +const { + expectUnauthorizedSnapshotAdmin +} = require('./ERC20SnapshotModuleUtils/authorization') + +function ERC20SnapshotModuleCommonMaterialized () { + context('Snapshot materialization', function () { + beforeEach(async function () { + this.currentTime = await time.latest() + this.snapshotTime = this.currentTime + time.duration.seconds(3) + }) + + it('emits SnapshotMaterialized when a due snapshot is materialized by token activity', async function () { + await this.transferEngineMock.connect(this.admin).scheduleSnapshot(this.snapshotTime) + await time.increase(time.duration.seconds(10)) + + const logs = await this.cmtat.connect(this.admin).mint(this.address1, 1) + await expect(logs) + .to.emit(this.transferEngineMock, 'SnapshotMaterialized') + .withArgs(this.snapshotTime, anyValue) + }) + + it('poke is access controlled', async function () { + await expectUnauthorizedSnapshotAdmin( + this, + this.transferEngineMock.connect(this.address1).poke(), + this.address1 + ) + }) + + it('poke materializes once and does not emit repeatedly for same snapshot', async function () { + await this.transferEngineMock.connect(this.admin).scheduleSnapshot(this.snapshotTime) + await time.increase(time.duration.seconds(10)) + + const firstPoke = await this.transferEngineMock.connect(this.admin).poke() + await expect(firstPoke) + .to.emit(this.transferEngineMock, 'SnapshotMaterialized') + .withArgs(this.snapshotTime, anyValue) + + const secondPoke = await this.transferEngineMock.connect(this.admin).poke() + await expect(secondPoke).to.not.emit(this.transferEngineMock, 'SnapshotMaterialized') + }) + }) +} + +module.exports = ERC20SnapshotModuleCommonMaterialized diff --git a/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonRescheduling.js b/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonRescheduling.js index 768a487..026f688 100644 --- a/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonRescheduling.js +++ b/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonRescheduling.js @@ -1,6 +1,8 @@ const { time } = require('@nomicfoundation/hardhat-network-helpers') const { expect } = require('chai') -const { SNAPSHOOTER_ROLE } = require('../utils') +const { + expectUnauthorizedSnapshotAdmin +} = require('./ERC20SnapshotModuleUtils/authorization') const { checkArraySnapshot } = require('./ERC20SnapshotModuleUtils/ERC20SnapshotModuleUtils') @@ -132,16 +134,13 @@ function ERC20SnapshotModuleCommonRescheduling () { it('reverts when calling from non-owner', async function () { // Act - await expect( + await expectUnauthorizedSnapshotAdmin( + this, this.transferEngineMock .connect(this.address1) - .rescheduleSnapshot(this.snapshotTime, this.newSnapshotTime) + .rescheduleSnapshot(this.snapshotTime, this.newSnapshotTime), + this.address1 ) - .to.be.revertedWithCustomError( - this.transferEngineMock, - 'AccessControlUnauthorizedAccount' - ) - .withArgs(this.address1.address, SNAPSHOOTER_ROLE) }) it('reverts when trying to reschedule a snapshot in the past', async function () { diff --git a/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonScheduling.js b/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonScheduling.js index e047f3e..08b5dee 100644 --- a/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonScheduling.js +++ b/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonScheduling.js @@ -1,6 +1,8 @@ const { time } = require('@nomicfoundation/hardhat-network-helpers') const { expect } = require('chai') -const { SNAPSHOOTER_ROLE } = require('../utils') +const { + expectUnauthorizedSnapshotAdmin +} = require('./ERC20SnapshotModuleUtils/authorization') const { checkArraySnapshot } = require('./ERC20SnapshotModuleUtils/ERC20SnapshotModuleUtils') @@ -29,14 +31,11 @@ function ERC20SnapshotModuleCommonScheduling () { it('reverts when calling from non-admin', async function () { const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(60) - await expect( - this.transferEngineMock.connect(this.address1).scheduleSnapshot(SNAPSHOT_TIME) + await expectUnauthorizedSnapshotAdmin( + this, + this.transferEngineMock.connect(this.address1).scheduleSnapshot(SNAPSHOT_TIME), + this.address1 ) - .to.be.revertedWithCustomError( - this.transferEngineMock, - 'AccessControlUnauthorizedAccount' - ) - .withArgs(this.address1.address, SNAPSHOOTER_ROLE) }) it('reverts when trying to schedule a snapshot before the last snapshot', async function () { @@ -165,16 +164,13 @@ function ERC20SnapshotModuleCommonScheduling () { it('reverts when calling from non-admin', async function () { const SNAPSHOT_TIME = this.currentTime + time.duration.seconds(60) - await expect( + await expectUnauthorizedSnapshotAdmin( + this, this.transferEngineMock .connect(this.address1) - .scheduleSnapshotNotOptimized(SNAPSHOT_TIME) + .scheduleSnapshotNotOptimized(SNAPSHOT_TIME), + this.address1 ) - .to.be.revertedWithCustomError( - this.transferEngineMock, - 'AccessControlUnauthorizedAccount' - ) - .withArgs(this.address1.address, SNAPSHOOTER_ROLE) }) it('reverts when trying to schedule a snapshot in the past', async function () { diff --git a/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonUnschedule.js b/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonUnschedule.js index f968027..4e05f7f 100644 --- a/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonUnschedule.js +++ b/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleCommonUnschedule.js @@ -1,6 +1,8 @@ const { time } = require('@nomicfoundation/hardhat-network-helpers') const { expect } = require('chai') -const { SNAPSHOOTER_ROLE } = require('../utils') +const { + expectUnauthorizedSnapshotAdmin +} = require('./ERC20SnapshotModuleUtils/authorization') const { checkArraySnapshot } = require('./ERC20SnapshotModuleUtils/ERC20SnapshotModuleUtils') @@ -25,9 +27,12 @@ function ERC20SnapshotModuleCommonUnschedule () { let snapshots = await this.transferEngineMock.getNextSnapshots() expect(snapshots.length).to.equal(1) expect(snapshots[0]).to.equal(SNAPSHOT_TIME) - await this.transferEngineMock + this.logs = await this.transferEngineMock .connect(this.admin) .unscheduleSnapshotNotOptimized(SNAPSHOT_TIME) + await expect(this.logs) + .to.emit(this.transferEngineMock, 'SnapshotUnschedule') + .withArgs(SNAPSHOT_TIME) snapshots = await this.transferEngineMock.getNextSnapshots() expect(snapshots.length).to.equal(0) }) @@ -91,7 +96,7 @@ function ERC20SnapshotModuleCommonUnschedule () { checkArraySnapshot(snapshots, [ this.snapshotTime1, this.snapshotTime2, - this.RANDOM_SNAPSHOT, + RANDOM_SNAPSHOT, this.snapshotTime3, this.snapshotTime4, this.snapshotTime5 @@ -147,16 +152,13 @@ function ERC20SnapshotModuleCommonUnschedule () { expect(snapshots.length).to.equal(1) expect(snapshots[0]).to.equal(SNAPSHOT_TIME) // Act - await expect( + await expectUnauthorizedSnapshotAdmin( + this, this.transferEngineMock .connect(this.address1) - .unscheduleSnapshotNotOptimized(SNAPSHOT_TIME) + .unscheduleSnapshotNotOptimized(SNAPSHOT_TIME), + this.address1 ) - .to.be.revertedWithCustomError( - this.transferEngineMock, - 'AccessControlUnauthorizedAccount' - ) - .withArgs(this.address1.address, SNAPSHOOTER_ROLE) // Assert snapshots = await this.transferEngineMock.getNextSnapshots() expect(snapshots.length).to.equal(1) @@ -182,16 +184,13 @@ function ERC20SnapshotModuleCommonUnschedule () { }) it('reverts when calling from non-admin', async function () { - await expect( + await expectUnauthorizedSnapshotAdmin( + this, this.transferEngineMock .connect(this.address1) - .unscheduleLastSnapshot(this.snapshotTime) + .unscheduleLastSnapshot(this.snapshotTime), + this.address1 ) - .to.be.revertedWithCustomError( - this.transferEngineMock, - 'AccessControlUnauthorizedAccount' - ) - .withArgs(this.address1.address, SNAPSHOOTER_ROLE) }) it('reverts if no snapshot is scheduled', async function () { diff --git a/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleUtils/authorization.js b/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleUtils/authorization.js new file mode 100644 index 0000000..1e802d7 --- /dev/null +++ b/test/ERC20SnapshotModuleCommon/ERC20SnapshotModuleUtils/authorization.js @@ -0,0 +1,27 @@ +const { expect } = require('chai') +const { SNAPSHOOTER_ROLE } = require('../../utils') + +async function expectUnauthorizedSnapshotAdmin (context, callPromise, caller) { + const mode = context.snapshotAdminMode || 'access-control' + + if (mode === 'ownable-2step') { + await expect(callPromise) + .to.be.revertedWithCustomError( + context.transferEngineMock, + 'OwnableUnauthorizedAccount' + ) + .withArgs(caller.address) + return + } + + await expect(callPromise) + .to.be.revertedWithCustomError( + context.transferEngineMock, + 'AccessControlUnauthorizedAccount' + ) + .withArgs(caller.address, SNAPSHOOTER_ROLE) +} + +module.exports = { + expectUnauthorizedSnapshotAdmin +} diff --git a/test/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleMultiplePlannedTest.js b/test/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleMultiplePlannedTest.js index 07b497e..c556340 100644 --- a/test/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleMultiplePlannedTest.js +++ b/test/ERC20SnapshotModuleCommon/global/ERC20SnapshotModuleMultiplePlannedTest.js @@ -384,7 +384,7 @@ function ERC20SnapshotModuleMultiplePlannedTest () { [ADDRESS1_INITIAL_MINT, ADDRESS2_INITIAL_MINT, ADDRESS3_INITIAL_MINT] ) // Values at the time of the first snapshot - checkSnapshot.call( + await checkSnapshot.call( this, this.snapshotTime1, TOTAL_SUPPLY_INITIAL_MINT, diff --git a/test/ERC20SnapshotModuleCommon/registerSnapshotCommonSuites.js b/test/ERC20SnapshotModuleCommon/registerSnapshotCommonSuites.js new file mode 100644 index 0000000..b808bda --- /dev/null +++ b/test/ERC20SnapshotModuleCommon/registerSnapshotCommonSuites.js @@ -0,0 +1,25 @@ +const ERC20SnapshotModuleCommonRescheduling = require('./ERC20SnapshotModuleCommonRescheduling') +const ERC20SnapshotModuleCommonScheduling = require('./ERC20SnapshotModuleCommonScheduling') +const ERC20SnapshotModuleCommonUnschedule = require('./ERC20SnapshotModuleCommonUnschedule') +const ERC20SnapshotModuleCommonGetNextSnapshot = require('./ERC20SnapshotModuleCommonGetNextSnapshot') +const ERC20SnapshotModuleCommonExact = require('./ERC20SnapshotModuleCommonExact') +const ERC20SnapshotModuleCommonMaterialized = require('./ERC20SnapshotModuleCommonMaterialized') +const ERC20SnapshotModuleMultiplePlannedTest = require('./global/ERC20SnapshotModuleMultiplePlannedTest') +const ERC20SnapshotModuleOnePlannedSnapshotTest = require('./global/ERC20SnapshotModuleOnePlannedSnapshotTest') +const ERC20SnapshotModuleZeroPlannedSnapshotTest = require('./global/ERC20SnapshotModuleZeroPlannedSnapshot') + +function registerSnapshotCommonSuites () { + ERC20SnapshotModuleMultiplePlannedTest() + ERC20SnapshotModuleOnePlannedSnapshotTest() + ERC20SnapshotModuleZeroPlannedSnapshotTest() + ERC20SnapshotModuleCommonRescheduling() + ERC20SnapshotModuleCommonScheduling() + ERC20SnapshotModuleCommonUnschedule() + ERC20SnapshotModuleCommonGetNextSnapshot() + ERC20SnapshotModuleCommonExact() + ERC20SnapshotModuleCommonMaterialized() +} + +module.exports = { + registerSnapshotCommonSuites +} diff --git a/test/ERC20SnapshotModuleOwnable2Step.test.js b/test/ERC20SnapshotModuleOwnable2Step.test.js new file mode 100644 index 0000000..02f6e2c --- /dev/null +++ b/test/ERC20SnapshotModuleOwnable2Step.test.js @@ -0,0 +1,25 @@ +const { + registerSnapshotCommonSuites +} = require('./ERC20SnapshotModuleCommon/registerSnapshotCommonSuites') +const { + fixture, + loadFixture +} = require('../CMTAT/test/deploymentUtils') +const { deployExternalSnapshotCmtat } = require('./helpers/deployExternalSnapshotCmtat') + +describe('Standard - ERC20SnapshotModule Ownable2Step', function () { + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)) + this.snapshotAdminMode = 'ownable-2step' + this.cmtat = await deployExternalSnapshotCmtat( + this._.address, + this.admin.address + ) + this.transferEngineMock = await ethers.deployContract('SnapshotEngineOwnable2Step', [ + this.cmtat.target, this.admin + ]) + await this.cmtat.connect(this.admin).setSnapshotEngine(this.transferEngineMock) + }) + + registerSnapshotCommonSuites() +}) diff --git a/test/SnapshotEngineDeploy.test.js b/test/SnapshotEngineDeploy.test.js index b21f6ad..8c2627d 100644 --- a/test/SnapshotEngineDeploy.test.js +++ b/test/SnapshotEngineDeploy.test.js @@ -1,43 +1,42 @@ const { ZERO_ADDRESS } = require('./utils.js') const { expect } = require('chai') -const { - deployCMTATStandalone, - fixture, - loadFixture -} = require('../CMTAT/test/deploymentUtils.js') +const { fixture, loadFixture } = require('../CMTAT/test/deploymentUtils.js') +const { deployExternalSnapshotCmtat } = require('./helpers/deployExternalSnapshotCmtat') describe('Deploy Snapshot Engine', function () { beforeEach(async function () { Object.assign(this, await loadFixture(fixture)) - this.cmtat = await deployCMTATStandalone( + this.cmtat = await deployExternalSnapshotCmtat( this._.address, - this.admin.address, - this.deployerAddress.address + this.admin.address ) - this.transferEngineCustomError = await ethers.deployContract('SnapshotEngine', [ - this.cmtat.target, this.admin]) - this.cmtat.connect(this.admin).setSnapshotEngine(this.transferEngineMock) + this.transferEngineCustomError = await ethers.deployContract( + 'SnapshotEngine', + [this.cmtat.target, this.admin] + ) + await this.cmtat.connect(this.admin).setSnapshotEngine(this.transferEngineCustomError) }) - context('Access Control', function () { it('testCannotTransferIfNotTokenBound', async function () { // Act this.transferEngineMock = await ethers.deployContract('SnapshotEngine', [ - this.cmtat.target, this.admin]) + this.cmtat.target, this.admin + ]) await expect( - this.transferEngineMock.operateOnTransfer(this.admin, this.admin, 1,1,1) - ).to.be.revertedWithCustomError( - this.transferEngineCustomError, - 'SnapshotEngine_UnauthorizedCaller' - ) + this.transferEngineMock.operateOnTransfer(this.admin, this.admin, 1, 1, 1) + ).to.be.revertedWithCustomError( + this.transferEngineCustomError, + 'SnapshotEngine_UnauthorizedCaller' + ) }) }) context('SnapshotEngineDeployment', function () { it('testHasTheRightVersion', async function () { this.transferEngineMock = await ethers.deployContract('SnapshotEngine', [ - this.cmtat.target, this.admin]) - expect(await this.transferEngineMock.version()).to.equal("0.3.0") + this.cmtat.target, this.admin + ]) + expect(await this.transferEngineMock.version()).to.equal('0.5.0') }) it('testCannotDeployIfERC20IsZero', async function () { diff --git a/test/helpers/cmtatInitParams.js b/test/helpers/cmtatInitParams.js new file mode 100644 index 0000000..980152b --- /dev/null +++ b/test/helpers/cmtatInitParams.js @@ -0,0 +1,41 @@ +const { ZeroAddress, keccak256, toUtf8Bytes } = require('ethers') + +function buildCmtatInitParams () { + const ruleEngine = ZeroAddress + const snapshotEngine = ZeroAddress + const documentEngine = ZeroAddress + + const ERC20Attributes = { + name: 'Security Token', + symbol: 'ST', + decimalsIrrevocable: 0 + } + + const terms = { + name: 'Token Terms v1', + uri: 'https://cmta.ch/standards/cmta-token-cmtat', + documentHash: keccak256(toUtf8Bytes('terms-v1')) + } + + const extraInformationAttributes = { + tokenId: '1234567890', + terms, + information: 'CMTAT smart contract' + } + + const engines = { + ruleEngine, + snapshotEngine, + documentEngine + } + + return { + ERC20Attributes, + extraInformationAttributes, + engines + } +} + +module.exports = { + buildCmtatInitParams +} diff --git a/test/helpers/deployExternalSnapshotCmtat.js b/test/helpers/deployExternalSnapshotCmtat.js new file mode 100644 index 0000000..71dd19a --- /dev/null +++ b/test/helpers/deployExternalSnapshotCmtat.js @@ -0,0 +1,22 @@ +const { ethers } = require('hardhat') +const { buildCmtatInitParams } = require('./cmtatInitParams') + +async function deployExternalSnapshotCmtat (forwarder, admin) { + const { + ERC20Attributes, + extraInformationAttributes, + engines + } = buildCmtatInitParams() + + return ethers.deployContract('CMTAT_EXTERNAL_SNAPSHOT_STANDALONE_MOCK', [ + forwarder, + admin, + ERC20Attributes, + extraInformationAttributes, + engines + ]) +} + +module.exports = { + deployExternalSnapshotCmtat +}